From 1104dbe1b1e7798fb1d39f38567de3d97fbef539 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 Mar 2017 23:50:20 +0100 Subject: [PATCH 001/777] Added padding to code box. --- Forms/CodeForm.cs | 3 ++ ReClass.NET.csproj | 1 + Util/Extension.RichTextBox.cs | 62 +++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 Util/Extension.RichTextBox.cs diff --git a/Forms/CodeForm.cs b/Forms/CodeForm.cs index e4ade3f2..1beb1ce2 100644 --- a/Forms/CodeForm.cs +++ b/Forms/CodeForm.cs @@ -11,6 +11,7 @@ using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.UI; +using ReClassNET.Util; using ReClassNET.Util.Rtf; namespace ReClassNET.Forms @@ -24,6 +25,8 @@ public CodeForm(ICodeGenerator generator, IEnumerable classes, ILogge InitializeComponent(); + codeRichTextBox.SetInnerPadding(5, 5, 5, 5); + var code = generator.GenerateCode(classes, logger); var buffer = new StringBuilder(code.Length * 2); diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 4777260c..34ae2126 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -251,6 +251,7 @@ + Form diff --git a/Util/Extension.RichTextBox.cs b/Util/Extension.RichTextBox.cs new file mode 100644 index 00000000..e833d7fa --- /dev/null +++ b/Util/Extension.RichTextBox.cs @@ -0,0 +1,62 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace ReClassNET.Util +{ + public static class RichTextBoxExtension + { + public static void SetInnerPadding(this TextBoxBase textBox, int left, int top, int right, int bottom) + { + var rect = textBox.GetFormattingRect(); + + var newRect = new Rectangle(left, top, rect.Width - left - right, rect.Height - top - bottom); + textBox.SetFormattingRect(newRect); + } + + [StructLayout(LayoutKind.Sequential)] + private struct RECT + { + public readonly int Left; + public readonly int Top; + public readonly int Right; + public readonly int Bottom; + + private RECT(int left, int top, int right, int bottom) + { + Left = left; + Top = top; + Right = right; + Bottom = bottom; + } + + public RECT(Rectangle r) + : this(r.Left, r.Top, r.Right, r.Bottom) + { + } + } + + [DllImport(@"User32.dll", CharSet = CharSet.Auto)] + private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, ref RECT rect); + + [DllImport(@"user32.dll", CharSet = CharSet.Auto)] + private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam); + + private const int EmGetrect = 0xB2; + private const int EmSetrect = 0xB3; + + private static void SetFormattingRect(this TextBoxBase textbox, Rectangle rect) + { + var rc = new RECT(rect); + SendMessage(textbox.Handle, EmSetrect, 0, ref rc); + } + + private static Rectangle GetFormattingRect(this TextBoxBase textbox) + { + var rect = new Rectangle(); + SendMessage(textbox.Handle, EmGetrect, (IntPtr)0, ref rect); + return rect; + } + } +} From efe5366813432be50cc081e56d4dfc582cbadff6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 Mar 2017 20:31:50 +0100 Subject: [PATCH 002/777] Fixed function node not getting generated. --- CodeGenerator/CppCodeGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeGenerator/CppCodeGenerator.cs b/CodeGenerator/CppCodeGenerator.cs index 0e0781e8..8e7108fc 100644 --- a/CodeGenerator/CppCodeGenerator.cs +++ b/CodeGenerator/CppCodeGenerator.cs @@ -51,7 +51,7 @@ public string GenerateCode(IEnumerable classes, ILogger logger) sb.AppendLine( string.Join( Environment.NewLine + Environment.NewLine, - OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => + OrderByInheritance(classNodes).Select(c => { var csb = new StringBuilder(); csb.Append($"class {c.Name}"); From c3d426dda9965d0ae983d3a296b8fb2e20f4ec36 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 Mar 2017 21:17:51 +0100 Subject: [PATCH 003/777] Revert last commit. --- CodeGenerator/CppCodeGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeGenerator/CppCodeGenerator.cs b/CodeGenerator/CppCodeGenerator.cs index 8e7108fc..0e0781e8 100644 --- a/CodeGenerator/CppCodeGenerator.cs +++ b/CodeGenerator/CppCodeGenerator.cs @@ -51,7 +51,7 @@ public string GenerateCode(IEnumerable classes, ILogger logger) sb.AppendLine( string.Join( Environment.NewLine + Environment.NewLine, - OrderByInheritance(classNodes).Select(c => + OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => { var csb = new StringBuilder(); csb.Append($"class {c.Name}"); From ed15b2ab23fed649952c372c9818a6fe17a22d6b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 6 Mar 2017 18:31:16 +0100 Subject: [PATCH 004/777] Add explanation. --- CodeGenerator/CppCodeGenerator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/CodeGenerator/CppCodeGenerator.cs b/CodeGenerator/CppCodeGenerator.cs index 0e0781e8..de21d625 100644 --- a/CodeGenerator/CppCodeGenerator.cs +++ b/CodeGenerator/CppCodeGenerator.cs @@ -51,6 +51,7 @@ public string GenerateCode(IEnumerable classes, ILogger logger) sb.AppendLine( string.Join( Environment.NewLine + Environment.NewLine, + // Skip class which contains FunctionNodes because these are not data classes. OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => { var csb = new StringBuilder(); From 7567fcd91e874bec0e75d8153fe23cc177cfeb13 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 6 Mar 2017 22:32:47 +0100 Subject: [PATCH 005/777] Added basic horizontal scrolling. --- DataExchange/ReClassFile.cs | 5 +- Nodes/BaseArrayNode.cs | 21 +- Nodes/BaseFunctionNode.cs | 9 +- Nodes/BaseFunctionPtrNode.cs | 17 +- Nodes/BaseHexNode.cs | 14 +- Nodes/BaseMatrixNode.cs | 23 ++- Nodes/BaseNode.cs | 24 +-- Nodes/BaseNumericNode.cs | 10 +- Nodes/BaseTextNode.cs | 11 +- Nodes/BaseTextPtrNode.cs | 11 +- Nodes/BitFieldNode.cs | 12 +- Nodes/BoolNode.cs | 13 +- Nodes/ClassInstanceArrayNode.cs | 9 +- Nodes/ClassInstanceNode.cs | 22 +- Nodes/ClassNode.cs | 34 +-- Nodes/ClassPtrArrayNode.cs | 7 +- Nodes/ClassPtrNode.cs | 19 +- Nodes/DoubleNode.cs | 5 +- Nodes/FloatNode.cs | 5 +- Nodes/FunctionNode.Tokenizer.cs | 353 ++++++++++++++++++++++++++++++++ Nodes/FunctionNode.cs | 31 +-- Nodes/FunctionPtrNode.cs | 5 +- Nodes/Hex16Node.cs | 5 +- Nodes/Hex32Node.cs | 3 +- Nodes/Hex64Node.cs | 3 +- Nodes/Hex8Node.cs | 5 +- Nodes/Int16Node.cs | 5 +- Nodes/Int32Node.cs | 5 +- Nodes/Int64Node.cs | 5 +- Nodes/Int8Node.cs | 5 +- Nodes/Matrix3x3Node.cs | 17 +- Nodes/Matrix3x4Node.cs | 17 +- Nodes/Matrix4x4Node.cs | 20 +- Nodes/UInt16Node.cs | 5 +- Nodes/UInt32Node.cs | 5 +- Nodes/UInt64Node.cs | 5 +- Nodes/UInt8Node.cs | 5 +- Nodes/UTF16TextNode.cs | 5 +- Nodes/UTF16TextPtrNode.cs | 3 +- Nodes/UTF32TextNode.cs | 5 +- Nodes/UTF32TextPtrNode.cs | 3 +- Nodes/UTF8TextNode.cs | 5 +- Nodes/UTF8TextPtrNode.cs | 3 +- Nodes/VMethodNode.cs | 3 +- Nodes/VTableNode.cs | 19 +- Nodes/Vector2Node.cs | 5 +- Nodes/Vector3Node.cs | 5 +- Nodes/Vector4Node.cs | 5 +- UI/MemoryPreviewToolTip.cs | 4 +- UI/MemoryViewControl.cs | 31 ++- 50 files changed, 658 insertions(+), 208 deletions(-) create mode 100644 Nodes/FunctionNode.Tokenizer.cs diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index 3355c8c3..f23f016f 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Drawing; using System.Linq; using System.Xml.Linq; using ReClassNET.Logger; @@ -295,12 +296,12 @@ public override int MemorySize get { throw new NotImplementedException(); } } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { throw new NotImplementedException(); } - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { throw new NotImplementedException(); } diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 2a19cea9..bed9bc6f 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -10,7 +11,7 @@ public abstract class BaseArrayNode : BaseReferenceNode public int CurrentIndex { get; set; } public int Count { get; set; } = 1; - protected int Draw(ViewInfo view, int x, int y, string type, HotSpotType exchange) + protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchange) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -46,25 +47,27 @@ protected int Draw(ViewInfo view, int x, int y, string type, HotSpotType exchang x = AddIcon(view, x + 2, y, Icons.Change, 4, exchange); x += view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); y += view.Font.Height; if (levelsOpen[view.Level]) { - y = DrawChild(view, tx, y); + var childSize = DrawChild(view, tx, y); + x = Math.Max(x, childSize.Width); + y = childSize.Height; } - return y; + return new Size(x, y); } - protected abstract int DrawChild(ViewInfo view, int x, int y); + protected abstract Size DrawChild(ViewInfo view, int x, int y); - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -72,7 +75,7 @@ public override int CalculateHeight(ViewInfo view) { h += CalculateChildHeight(view); } - return h; + return new Size(0, h); } protected abstract int CalculateChildHeight(ViewInfo view); @@ -124,7 +127,7 @@ public override void Update(HotSpot spot) [ContractClassFor(typeof(BaseArrayNode))] internal abstract class BaseArrayNodeContract : BaseArrayNode { - protected override int DrawChild(ViewInfo view, int x, int y) + protected override Size DrawChild(ViewInfo view, int x, int y) { Contract.Requires(view != null); diff --git a/Nodes/BaseFunctionNode.cs b/Nodes/BaseFunctionNode.cs index de5f91cf..a25d19f1 100644 --- a/Nodes/BaseFunctionNode.cs +++ b/Nodes/BaseFunctionNode.cs @@ -20,11 +20,12 @@ protected class FunctionNodeInstruction protected IntPtr address = IntPtr.Zero; protected readonly List instructions = new List(); - protected int DrawInstructions(ViewInfo view, int tx, int y) + protected Size DrawInstructions(ViewInfo view, int tx, int y) { Contract.Requires(view != null); var minWidth = 26 * view.Font.Width; + var maxWidth = 0; foreach (var instruction in instructions) { @@ -42,11 +43,13 @@ protected int DrawInstructions(ViewInfo view, int tx, int y) view.Context.FillRectangle(brush, x, y, 1, view.Font.Height); x += 6; - AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, instruction.Instruction); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, instruction.Instruction); + + maxWidth = Math.Max(x, maxWidth); } } - return y; + return new Size(maxWidth, y); } protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out int memorySize) diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index a4f99ee8..5c388fc6 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using System.Linq; using ReClassNET.Memory; using ReClassNET.UI; @@ -21,7 +22,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) return string.Join("\n", instructions.Select(i => i.Instruction)); } - protected int Draw(ViewInfo view, int x, int y, string type, string name) + protected Size Draw(ViewInfo view, int x, int y, string type, string name) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -62,7 +63,7 @@ protected int Draw(ViewInfo view, int x, int y, string type, string name) var symbol = symbols?.GetSymbolString(value, module); if (!string.IsNullOrEmpty(symbol)) { - AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol); + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol); } } } @@ -73,17 +74,19 @@ protected int Draw(ViewInfo view, int x, int y, string type, string name) DisassembleRemoteCode(view.Memory, ptr); - y = DrawInstructions(view, tx, y); + var instructionSize = DrawInstructions(view, tx, y); + x = Math.Max(x, instructionSize.Width); + y = instructionSize.Height; } - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -91,7 +94,7 @@ public override int CalculateHeight(ViewInfo view) { h += instructions.Count * view.Font.Height; } - return h; + return new Size(0, h); } private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index add1deaa..c1c902b7 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Drawing; using System.Globalization; using ReClassNET.UI; using ReClassNET.Util; @@ -23,10 +24,9 @@ protected BaseHexNode() buffer = new byte[MemorySize]; } - protected int Draw(ViewInfo view, int x, int y, string text, int length) + protected Size Draw(ViewInfo view, int x, int y, string text, int length) { Contract.Requires(view != null); - Contract.Requires(text != null); if (IsHidden) { @@ -40,7 +40,7 @@ protected int Draw(ViewInfo view, int x, int y, string text, int length) x += TextPadding + 16; x = AddAddressOffset(view, x, y); - if (view.Settings.ShowNodeText) + if (!string.IsNullOrEmpty(text)) { x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text); } @@ -80,14 +80,14 @@ protected int Draw(ViewInfo view, int x, int y, string text, int length) x = AddText(view, x, y, color, i, $"{buffer[i]:X02}") + view.Font.Width; } - AddComment(view, x, y); + x = AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden ? HiddenSize : new Size(0, view.Font.Height); } /// Updates the node from the given spot. Sets the value of the selected byte. diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 47be744b..d68e5d06 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -1,4 +1,5 @@ using System.Diagnostics.Contracts; +using System.Drawing; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -10,9 +11,9 @@ protected BaseMatrixNode() levelsOpen.DefaultValue = true; } - protected delegate void DrawMatrixValues(int x, ref int y); + protected delegate void DrawMatrixValues(int x, ref int maxX, ref int y); - protected int DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatrixValues drawValues) + protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatrixValues drawValues) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -41,18 +42,18 @@ protected int DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatri x += view.Font.Width; - AddComment(view, x, y); + x += AddComment(view, x, y); if (levelsOpen[view.Level]) { - drawValues(tx, ref y); + drawValues(tx, ref x, ref y); } - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } protected delegate void DrawVectorValues(ref int x, ref int y); - protected int DrawVectorType(ViewInfo view, int x, int y, string type, DrawVectorValues drawValues) + protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVectorValues drawValues) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -83,16 +84,16 @@ protected int DrawVectorType(ViewInfo view, int x, int y, string type, DrawVecto x += view.Font.Width; - AddComment(view, x, y); + x += AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -100,7 +101,7 @@ public override int CalculateHeight(ViewInfo view) { h += CalculateValuesHeight(view); } - return h; + return new Size(0, h); } protected abstract int CalculateValuesHeight(ViewInfo view); diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 83913ad0..73e545fb 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -20,7 +20,7 @@ public abstract class BaseNode internal static readonly List NodeInfoReader = new List(); protected static readonly int TextPadding = Icons.Dimensions; - protected const int HiddenHeight = 1; + protected static readonly Size HiddenSize = new Size(0, 1); private static int NodeIndex = 0; @@ -123,17 +123,17 @@ public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. - public abstract int Draw(ViewInfo view, int x, int y); + /// The size the node occupies. + public abstract Size Draw(ViewInfo view, int x, int y); /// - /// Calculates the height of the node if drawn. + /// Calculates the size of the node if drawn. /// This method is used to determine if a node outside the visible area should be drawn. - /// The returned height must be equal to the height which gets added by the method. + /// The returned size must be equal to the size which is returned by the method. /// /// The view information. - /// The calculated height. - public abstract int CalculateHeight(ViewInfo view); + /// The calculated size. + public abstract Size CalculateSize(ViewInfo view); /// Updates the node from the given . Sets the and of the node. /// The spot. @@ -388,8 +388,8 @@ protected virtual int AddComment(ViewInfo view, int x, int y) /// The view information. /// The x coordinate. /// The y coordinate. - /// The new y coordinate after drawing the line. - protected int DrawHidden(ViewInfo view, int x, int y) + /// The size of the drawing. + protected Size DrawHidden(ViewInfo view, int x, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); @@ -399,7 +399,7 @@ protected int DrawHidden(ViewInfo view, int x, int y) view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); } - return y + HiddenHeight; + return new Size(0, y + HiddenSize.Height); } } @@ -416,14 +416,14 @@ public override int MemorySize } } - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { Contract.Requires(view != null); throw new NotImplementedException(); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { Contract.Requires(view != null); diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 1cbf866d..52fee26e 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -14,7 +14,7 @@ public abstract class BaseNumericNode : BaseNode /// The type of the node. /// The value of the node. /// The height the node occupies. - protected int DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value) + protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value) { Contract.Requires(view != null); Contract.Requires(icon != null); @@ -40,14 +40,14 @@ protected int DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, 0, value) + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden ? HiddenSize : new Size(0, view.Font.Height); } } } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index 98e13836..0977ac3c 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using ReClassNET.UI; using ReClassNET.Util; @@ -21,7 +22,7 @@ public override void CopyFromNode(BaseNode node) Length = node.MemorySize / CharacterSize; } - protected int DrawText(ViewInfo view, int x, int y, string type, int length, string text) + protected Size DrawText(ViewInfo view, int x, int y, string type, int length, string text) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -50,14 +51,14 @@ protected int DrawText(ViewInfo view, int x, int y, string type, int length, str x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text.LimitLength(150)); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden ? HiddenSize : new Size(0, view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index 9c92a757..032ecd26 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -16,7 +17,7 @@ public abstract class BaseTextPtrNode : BaseNode /// The name of the type. /// The text. /// The height the node occupies. - public int DrawText(ViewInfo view, int x, int y, string type, string text) + public Size DrawText(ViewInfo view, int x, int y, string type, string text) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -42,14 +43,14 @@ public int DrawText(ViewInfo view, int x, int y, string type, string text) x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden ? HiddenSize : new Size(0, view.Font.Height); } } } diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index 4f085e2e..c261d0b8 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -94,7 +94,7 @@ private string ConvertValueToBitString(MemoryBuffer memory) /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) { @@ -125,7 +125,7 @@ public override int Draw(ViewInfo view, int x, int y) x += view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); if (levelsOpen[view.Level]) { @@ -146,14 +146,14 @@ public override int Draw(ViewInfo view, int x, int y) y += 2; } - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -161,7 +161,7 @@ public override int CalculateHeight(ViewInfo view) { h += view.Font.Height + 2; } - return h; + return new Size(0, h); } /// Updates the node from the given spot. Sets the value of the selected bit. diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index 553f1fe0..b4be4a72 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class BoolNode : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height th node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) { @@ -34,14 +35,14 @@ public override int Draw(ViewInfo view, int x, int y) var value = view.Memory.ReadByte(Offset); x = AddText(view, x, y, view.Settings.ValueColor, 0, value == 0 ? "false" : "true") + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden ? HiddenSize : new Size(0, view.Font.Height); } /// Updates the node from the given spot and sets the value. diff --git a/Nodes/ClassInstanceArrayNode.cs b/Nodes/ClassInstanceArrayNode.cs index 7d20786e..d02a34cb 100644 --- a/Nodes/ClassInstanceArrayNode.cs +++ b/Nodes/ClassInstanceArrayNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; using ReClassNET.Util; namespace ReClassNET.Nodes @@ -21,12 +22,12 @@ public override void Intialize() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "Array", HotSpotType.ChangeType); } - protected override int DrawChild(ViewInfo view, int x, int y) + protected override Size DrawChild(ViewInfo view, int x, int y) { var v = view.Clone(); v.Address = view.Address.Add(Offset) + InnerNode.MemorySize * CurrentIndex; @@ -38,7 +39,7 @@ protected override int DrawChild(ViewInfo view, int x, int y) protected override int CalculateChildHeight(ViewInfo view) { - return InnerNode.CalculateHeight(view); + return InnerNode.CalculateSize(view).Height; } } } diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index 8ba87963..561ea2e5 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -1,4 +1,6 @@ -using ReClassNET.UI; +using System; +using System.Drawing; +using ReClassNET.UI; using ReClassNET.Util; namespace ReClassNET.Nodes @@ -21,7 +23,7 @@ public override void Intialize() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) { @@ -44,7 +46,7 @@ public override int Draw(ViewInfo view, int x, int y) x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType); x += view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); y += view.Font.Height; @@ -55,25 +57,27 @@ public override int Draw(ViewInfo view, int x, int y) v.Memory = view.Memory.Clone(); v.Memory.Offset = Offset.ToInt32(); - y = InnerNode.Draw(v, tx, y); + var innerSize = InnerNode.Draw(v, tx, y); + x = Math.Max(x, innerSize.Width); + y = innerSize.Height; } - return y; + return new Size(x, y); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; if (levelsOpen[view.Level]) { - h += InnerNode.CalculateHeight(view); + h += InnerNode.CalculateSize(view).Height; } - return h; + return new Size(0, h); } } } diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index cf85ba4a..9d92b092 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -91,7 +91,7 @@ public override void ClearSelection() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { AddSelection(view, 0, y, view.Font.Height); x = AddOpenClose(view, x, y); @@ -104,7 +104,7 @@ public override int Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Class") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"[{MemorySize}]") + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); y += view.Font.Height; @@ -117,36 +117,42 @@ public override int Draw(ViewInfo view, int x, int y) // If the node is in the visible area draw it. if (view.ClientArea.Contains(tx, y)) { - y = node.Draw(nv, tx, y); + var innerSize = node.Draw(nv, tx, y); + x = Math.Max(x, innerSize.Width); + y = innerSize.Height; } else { - // Otherwise calculate the height... - var height = node.CalculateHeight(nv); + // Otherwise calculate the size... + var calculatedSize = node.CalculateSize(nv); // and check if the nodes area overlaps with the visible area... - if (new Rectangle(tx, y, view.ClientArea.Width, height).IntersectsWith(view.ClientArea)) + if (new Rectangle(tx, y, view.ClientArea.Width, calculatedSize.Height).IntersectsWith(view.ClientArea) + || new Rectangle(tx, y, calculatedSize.Width, view.ClientArea.Height).IntersectsWith(view.ClientArea)) { // then draw the node... - y = node.Draw(nv, tx, y); + var innerSize = node.Draw(nv, tx, y); + x = Math.Max(x, innerSize.Width); + y = innerSize.Height; } else { - // or skip drawing and just add the height. - y += height; + // or skip drawing and just use calculated width and height. + x = Math.Max(x, calculatedSize.Width); + y += calculatedSize.Height; } } } } - return y; + return new Size(x, y); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -154,9 +160,9 @@ public override int CalculateHeight(ViewInfo view) { var nv = view.Clone(); nv.Level++; - h += Nodes.Sum(n => n.CalculateHeight(nv)); + h += Nodes.Sum(n => n.CalculateSize(nv).Height); } - return h; + return new Size(0, h); } public override void Update(HotSpot spot) diff --git a/Nodes/ClassPtrArrayNode.cs b/Nodes/ClassPtrArrayNode.cs index 33223575..b7362441 100644 --- a/Nodes/ClassPtrArrayNode.cs +++ b/Nodes/ClassPtrArrayNode.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; @@ -26,12 +27,12 @@ public override void Intialize() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "PtrArray", HotSpotType.ChangeType); } - protected override int DrawChild(ViewInfo view, int x, int y) + protected override Size DrawChild(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset + IntPtr.Size * CurrentIndex); @@ -48,7 +49,7 @@ protected override int DrawChild(ViewInfo view, int x, int y) protected override int CalculateChildHeight(ViewInfo view) { - return InnerNode.CalculateHeight(view); + return InnerNode.CalculateSize(view).Height; } } } diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index 4050f935..771c40e6 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; @@ -26,7 +27,7 @@ public override void Intialize() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) { @@ -49,7 +50,7 @@ public override int Draw(ViewInfo view, int x, int y) x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType); x += view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); y += view.Font.Height; @@ -65,25 +66,27 @@ public override int Draw(ViewInfo view, int x, int y) v.Address = ptr; v.Memory = memory; - y = InnerNode.Draw(v, tx, y); + var innerSize = InnerNode.Draw(v, tx, y); + x = Math.Max(x, innerSize.Width); + y = innerSize.Height; } - return y; + return new Size(x, y); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; if (levelsOpen[view.Level]) { - h += InnerNode.CalculateHeight(view); + h += InnerNode.CalculateSize(view).Height; } - return h; + return new Size(0, h); } } } diff --git a/Nodes/DoubleNode.cs b/Nodes/DoubleNode.cs index 37b38309..d5bf8ea6 100644 --- a/Nodes/DoubleNode.cs +++ b/Nodes/DoubleNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class DoubleNode : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Double, "Double", view.Memory.ReadObject(Offset).ToString("0.000")); } diff --git a/Nodes/FloatNode.cs b/Nodes/FloatNode.cs index 2ba889a2..a49e6c97 100644 --- a/Nodes/FloatNode.cs +++ b/Nodes/FloatNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class FloatNode : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Float, "Float", view.Memory.ReadObject(Offset).ToString("0.000")); } diff --git a/Nodes/FunctionNode.Tokenizer.cs b/Nodes/FunctionNode.Tokenizer.cs new file mode 100644 index 00000000..27f7a3bc --- /dev/null +++ b/Nodes/FunctionNode.Tokenizer.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Linq; +using ReClassNET.Memory; +using ReClassNET.UI; +using ReClassNET.Util; + +namespace ReClassNET.Nodes +{ + public class FunctionNode : BaseNode + { + private IntPtr address = IntPtr.Zero; + private readonly List instructions = new List(); + private readonly List> instructions2 = new List>(); + + public string Signature { get; set; } = "void function()"; + + public ClassNode BelongsToClass { get; set; } + + private int memorySize = IntPtr.Size; + /// Size of the node in bytes. + public override int MemorySize => memorySize; + + public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + { + DisassembleRemoteCode(memory, spot.Address); + + return string.Join("\n", instructions); + } + + public override int Draw(ViewInfo view, int x, int y) + { + Contract.Requires(view != null); + + if (IsHidden) + { + return DrawHidden(view, x, y); + } + + AddSelection(view, x, y, view.Font.Height); + AddDelete(view, x, y); + AddTypeDrop(view, x, y); + + x += TextPadding; + + x = AddIcon(view, x, y, Icons.Function, -1, HotSpotType.None); + + var tx = x; + + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Function") + view.Font.Width; + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + + x = AddOpenClose(view, x, y) + view.Font.Width; + + x = AddComment(view, x, y); + + var ptr = view.Address.Add(Offset); + + DisassembleRemoteCode(view.Memory, ptr); + + if (levelsOpen[view.Level]) + { + y += view.Font.Height; + x = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, 0, Signature); + + y += view.Font.Height; + x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); + x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeType); + + var minWidth = 26 * view.Font.Width; + + var addressColor = Color.FromArgb(128, 128, 128); + + y += 4; + foreach (var line in instructions2) + { + y += view.Font.Height; + + //AddText(view, tx, y, view.Settings.NameColor, HotSpot.ReadOnlyId, line); + x = AddText(view, tx, y, view.Settings.AddressColor, HotSpot.ReadOnlyId, line.Item1) + 15; + x = Math.Max(AddText(view, x, y, view.Settings.HexColor, HotSpot.ReadOnlyId, line.Item2), x + minWidth) + 6; + + /*foreach (var token in new AssemblerTokenizer().Read(line.Item3)) + { + var color = Color.Black; + if (token.TokenType == TokenType.Keyword) + { + if (AssemblerTokenizer.IsKeyword(token.Value)) + { + color = Color.Navy; + } + else if (AssemblerTokenizer.IsRegister(token.Value)) + { + color = Color.Green; + } + } + else if (token.TokenType == TokenType.Bracket) + { + color = Color.Purple; + } + else if (token.TokenType == TokenType.Operation) + { + color = Color.Red; + } + + x = AddText(view, x, y, color, HotSpot.NoneId, token.Value) + 5; + }*/ + AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, line.Item3); + + } + y += 4; + } + + return y + view.Font.Height; + } + + public override int CalculateHeight(ViewInfo view) + { + if (IsHidden) + { + return HiddenHeight; + } + + var h = view.Font.Height; + if (levelsOpen[view.Level]) + { + h += instructions.Count() * view.Font.Height; + } + return h; + } + + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0) // Signature + { + Signature = spot.Text; + } + } + + private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) + { + Contract.Requires(memory != null); + + if (this.address != address) + { + instructions.Clear(); + + this.address = address; + + if (!address.IsNull() && memory.Process.IsValid) + { + memorySize = 0; + + var disassembler = new Disassembler(memory.Process.CoreFunctions); + foreach (var instruction in disassembler.RemoteDisassembleFunction(memory.Process, address, 8192)) + { + memorySize += instruction.Length; + + instructions.Add($"{instruction.Address.ToString(Constants.StringHexFormat)} {instruction.Instruction}"); + instructions2.Add(Tuple.Create(instruction.Address.ToString(Constants.StringHexFormat), Utils.BytesToString(instruction.Data, instruction.Length), instruction.Instruction)); + } + + ParentNode?.ChildHasChanged(this); + } + } + } + } + + enum TokenType + { + Number, + Keyword, + Operation, + Bracket, + Register, + Text + } + + class Token + { + /// The type of the token. + public TokenType TokenType { get; } + + /// The value of the token. + public string Value { get; } + + public Token(TokenType type, string value) + { + Contract.Requires(value != null); + + TokenType = type; + Value = value; + } + + public override string ToString() + { + return $"{TokenType} {Value}"; + } + } + + class AssemblerTokenizer + { + public List Read(string instruction) + { + Contract.Requires(instruction != null); + + var tokens = new List(); + + var characters = instruction.ToCharArray(); + for (var i = 0; i < characters.Length; ++i) + { + if (IsPartOfKeyword(characters[i], true)) + { + var buffer = characters[i].ToString(); + while (++i < characters.Length && IsPartOfKeyword(characters[i], false)) + { + buffer += characters[i]; + } + + if (IsRegister(buffer)) + { + tokens.Add(new Token(TokenType.Register, buffer)); + } + else if (IsKeyword(buffer)) + { + tokens.Add(new Token(TokenType.Keyword, buffer)); + } + else + { + tokens.Add(new Token(TokenType.Text, buffer)); + } + + if (i == characters.Length) + { + continue; + } + } + + if (IsPartOfNumber(characters[i], true)) + { + var buffer = characters[i].ToString(); + while (++i < characters.Length && IsPartOfNumber(characters[i], false)) + { + buffer += characters[i]; + } + + tokens.Add(new Token(TokenType.Number, buffer)); + + if (i == characters.Length) + { + continue; + } + } + + switch (characters[i]) + { + case ' ': + continue; + case ',': + case ':': + tokens.Add(new Token(TokenType.Text, characters[i].ToString())); + break; + case '+': + case '-': + case '*': + case '/': + tokens.Add(new Token(TokenType.Operation, characters[i].ToString())); + break; + case '[': + case ']': + tokens.Add(new Token(TokenType.Bracket, characters[i].ToString())); + break; + default: + throw new Exception($"Invalid token '{characters[i]}' detected at position {i}."); + } + } + + return tokens; + } + + private bool IsPartOfKeyword(char character, bool isFirstCharacter) + { + return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (!isFirstCharacter && (character >= '0' && character <= '9')); + } + + private bool IsPartOfNumber(char character, bool isFirstCharacter) + { + return (character >= '0' && character <= '9') || (character >= 'a' && character <= 'f') || (character >= 'A' && character <= 'F') || (!isFirstCharacter && (character == 'x' || character == 'X')); + } + + private static HashSet Registers = new HashSet + { + "rax", "eax", "ax", "al", "ah", + "rbx", "ebx", "bx", "bl", "bh", + "rcx", "ecx", "cx", "cl", "ch", + "rdx", "edx", "dx", "dl", "dh", + "rsi", "esi", "si", "sil", + "rdi", "edi", "di", "dil", + "rbp", "ebp", "bp", "bpl", + "rsp", "esp", "sp", "spl", + "r8", "r8d", "r8w", "r8b", + "r9", "r9d", "r9w", "r9b", + "r10", "r10d", "r10w", "r10b", + "r11", "r11d", "r11w", "r11b", + "r12", "r12d", "r12w", "r12b", + "r13", "r13d", "r13w", "r13b", + "r14", "r14d", "r14w", "r14b", + "r15", "r15d", "r15w", "r15b", + "xmm0", "ymm0", + "xmm1", "ymm1", + "xmm2", "ymm2", + "xmm3", "ymm3", + "xmm4", "ymm4", + "xmm5", "ymm5", + "xmm6", "ymm6", + "xmm7", "ymm7", + "xmm8", "ymm8", + "xmm9", "ymm9", + "xmm10", "ymm10", + "xmm11", "ymm11", + "xmm12", "ymm12", + "xmm13", "ymm13", + "xmm14", "ymm14", + "xmm15", "ymm15" + }; + + public static bool IsRegister(string text) + { + return Registers.Contains(text); + } + + private static HashSet Keywords = new HashSet + { + "ret", "retn", + "call", + "jl", "ja", "jb", "jbe", "je", "jz", "js", "jne", "jnz", "jns", "jae", "jmp", + "push", "pop" + }; + + public static bool IsKeyword(string text) + { + return Keywords.Contains(text); + } + } +} diff --git a/Nodes/FunctionNode.cs b/Nodes/FunctionNode.cs index 53cd9e6c..33b348d2 100644 --- a/Nodes/FunctionNode.cs +++ b/Nodes/FunctionNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using System.Linq; using ReClassNET.Memory; using ReClassNET.UI; @@ -24,7 +25,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) return string.Join("\n", instructions.Select(i => i.Instruction)); } - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { Contract.Requires(view != null); @@ -50,7 +51,7 @@ public override int Draw(ViewInfo view, int x, int y) x = AddOpenClose(view, x, y) + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); var ptr = view.Address.Add(Offset); @@ -59,25 +60,29 @@ public override int Draw(ViewInfo view, int x, int y) if (levelsOpen[view.Level]) { y += view.Font.Height; - x = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; - AddText(view, x, y, view.Settings.ValueColor, 0, Signature); + var x2 = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; + x2 = AddText(view, x2, y, view.Settings.ValueColor, 0, Signature); + x = Math.Max(x, x2); y += view.Font.Height; - x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); - AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeType); - - y = DrawInstructions(view, tx, y + 4) + 4; + x2 = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); + x2 = AddText(view, x2, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); + x2 = AddIcon(view, x2, y, Icons.Change, 1, HotSpotType.ChangeType); + x = Math.Max(x, x2); + + var instructionSize = DrawInstructions(view, tx, y + 4); + x = Math.Max(x, instructionSize.Width); + y = instructionSize.Height + 4; } - return y + view.Font.Height; + return new Size(x, y + view.Font.Height); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; @@ -85,7 +90,7 @@ public override int CalculateHeight(ViewInfo view) { h += instructions.Count * view.Font.Height; } - return h; + return new Size(0, h); } public override void Update(HotSpot spot) diff --git a/Nodes/FunctionPtrNode.cs b/Nodes/FunctionPtrNode.cs index c4b3bcbd..95b5cbf7 100644 --- a/Nodes/FunctionPtrNode.cs +++ b/Nodes/FunctionPtrNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -9,7 +10,7 @@ public class FunctionPtrNode : BaseFunctionPtrNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "FunctionPtr", Name); } diff --git a/Nodes/Hex16Node.cs b/Nodes/Hex16Node.cs index 0e6cd408..284d2448 100644 --- a/Nodes/Hex16Node.cs +++ b/Nodes/Hex16Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.Memory; +using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -24,7 +25,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 2) + " " : null, 2); } diff --git a/Nodes/Hex32Node.cs b/Nodes/Hex32Node.cs index 9bc08767..1d66cb33 100644 --- a/Nodes/Hex32Node.cs +++ b/Nodes/Hex32Node.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; @@ -34,7 +35,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 4) + " " : null, 4); } diff --git a/Nodes/Hex64Node.cs b/Nodes/Hex64Node.cs index 8c055340..c353c460 100644 --- a/Nodes/Hex64Node.cs +++ b/Nodes/Hex64Node.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; @@ -34,7 +35,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 8) + " " : null, 8); } diff --git a/Nodes/Hex8Node.cs b/Nodes/Hex8Node.cs index 08a6fe9c..a2a7bee7 100644 --- a/Nodes/Hex8Node.cs +++ b/Nodes/Hex8Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.Memory; +using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -24,7 +25,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 1) + " " : null, 1); } diff --git a/Nodes/Int16Node.cs b/Nodes/Int16Node.cs index c11a3ddc..0fb2e483 100644 --- a/Nodes/Int16Node.cs +++ b/Nodes/Int16Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class Int16Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int16", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/Int32Node.cs b/Nodes/Int32Node.cs index 2db94bc8..086f543f 100644 --- a/Nodes/Int32Node.cs +++ b/Nodes/Int32Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class Int32Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int32", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/Int64Node.cs b/Nodes/Int64Node.cs index 7b92a61b..5054b79c 100644 --- a/Nodes/Int64Node.cs +++ b/Nodes/Int64Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class Int64Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int64", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/Int8Node.cs b/Nodes/Int8Node.cs index 2bf32eba..57d18894 100644 --- a/Nodes/Int8Node.cs +++ b/Nodes/Int8Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class Int8Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height th node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int8", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/Matrix3x3Node.cs b/Nodes/Matrix3x3Node.cs index 44f7fc80..380e0bce 100644 --- a/Nodes/Matrix3x3Node.cs +++ b/Nodes/Matrix3x3Node.cs @@ -1,5 +1,7 @@ -using System.Runtime.InteropServices; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; +using System; namespace ReClassNET.Nodes { @@ -36,9 +38,9 @@ struct Matrix3x3Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (3x3)", (int defaultX, ref int y) => + return DrawMatrixType(view, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => { var value = view.Memory.ReadObject(Offset); @@ -50,7 +52,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value._12,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -60,7 +63,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 4, $"{value._22,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 5, $"{value._23,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -70,7 +74,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._32,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 8, $"{value._33,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); }); } diff --git a/Nodes/Matrix3x4Node.cs b/Nodes/Matrix3x4Node.cs index 51480c8f..4cd28841 100644 --- a/Nodes/Matrix3x4Node.cs +++ b/Nodes/Matrix3x4Node.cs @@ -1,4 +1,6 @@ -using System.Runtime.InteropServices; +using System; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -42,9 +44,9 @@ struct Matrix3x4Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (3x4)", (int defaultX, ref int y) => + return DrawMatrixType(view, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => { var value = view.Memory.ReadObject(Offset); @@ -58,7 +60,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -70,7 +73,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 6, $"{value._23,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -82,7 +86,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 10, $"{value._33,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); }); } diff --git a/Nodes/Matrix4x4Node.cs b/Nodes/Matrix4x4Node.cs index 3e391dbe..69b002c2 100644 --- a/Nodes/Matrix4x4Node.cs +++ b/Nodes/Matrix4x4Node.cs @@ -1,4 +1,6 @@ -using System.Runtime.InteropServices; +using System; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -50,9 +52,9 @@ struct Matrix4x4Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (4x4)", (int defaultX, ref int y) => + return DrawMatrixType(view, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => { var value = view.Memory.ReadObject(Offset); @@ -66,7 +68,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -78,7 +81,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 6, $"{value._23,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -90,7 +94,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 10, $"{value._33,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); y += view.Font.Height; x = defaultX; @@ -102,7 +107,8 @@ public override int Draw(ViewInfo view, int x2, int y2) x = AddText(view, x, y, view.Settings.ValueColor, 14, $"{value._43,14:0.000}"); x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); x = AddText(view, x, y, view.Settings.ValueColor, 15, $"{value._44,14:0.000}"); - AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + maxX = Math.Max(x, maxX); }); } diff --git a/Nodes/UInt16Node.cs b/Nodes/UInt16Node.cs index 9e821977..e593aeac 100644 --- a/Nodes/UInt16Node.cs +++ b/Nodes/UInt16Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class UInt16Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/UInt32Node.cs b/Nodes/UInt32Node.cs index 82f026a3..3fdf8152 100644 --- a/Nodes/UInt32Node.cs +++ b/Nodes/UInt32Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class UInt32Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/UInt64Node.cs b/Nodes/UInt64Node.cs index f6f8b1cd..a8a92a26 100644 --- a/Nodes/UInt64Node.cs +++ b/Nodes/UInt64Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class UInt64Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", view.Memory.ReadObject(Offset).ToString()); } diff --git a/Nodes/UInt8Node.cs b/Nodes/UInt8Node.cs index fd9ed1a9..73eaceb5 100644 --- a/Nodes/UInt8Node.cs +++ b/Nodes/UInt8Node.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -12,7 +13,7 @@ public class UInt8Node : BaseNumericNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", view.Memory.ReadByte(Offset).ToString()); } diff --git a/Nodes/UTF16TextNode.cs b/Nodes/UTF16TextNode.cs index 6afe1235..9b81781f 100644 --- a/Nodes/UTF16TextNode.cs +++ b/Nodes/UTF16TextNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -11,7 +12,7 @@ public class UTF16TextNode : BaseTextNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUTF16String(Offset, MemorySize)); } diff --git a/Nodes/UTF16TextPtrNode.cs b/Nodes/UTF16TextPtrNode.cs index 1771016b..2bc52828 100644 --- a/Nodes/UTF16TextPtrNode.cs +++ b/Nodes/UTF16TextPtrNode.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Text; using ReClassNET.UI; @@ -11,7 +12,7 @@ public class UTF16TextPtrNode : BaseTextPtrNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); var str = view.Memory.Process.ReadRemoteString(Encoding.Unicode, ptr, 128); diff --git a/Nodes/UTF32TextNode.cs b/Nodes/UTF32TextNode.cs index 3b93dea4..f860f29a 100644 --- a/Nodes/UTF32TextNode.cs +++ b/Nodes/UTF32TextNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -11,7 +12,7 @@ public class UTF32TextNode : BaseTextNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUTF32String(Offset, MemorySize)); } diff --git a/Nodes/UTF32TextPtrNode.cs b/Nodes/UTF32TextPtrNode.cs index 84a8b68a..f04d3ad8 100644 --- a/Nodes/UTF32TextPtrNode.cs +++ b/Nodes/UTF32TextPtrNode.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Text; using ReClassNET.UI; @@ -11,7 +12,7 @@ public class UTF32TextPtrNode : BaseTextPtrNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); var str = view.Memory.Process.ReadRemoteString(Encoding.UTF32, ptr, 256); diff --git a/Nodes/UTF8TextNode.cs b/Nodes/UTF8TextNode.cs index 3e314f92..26f13ef9 100644 --- a/Nodes/UTF8TextNode.cs +++ b/Nodes/UTF8TextNode.cs @@ -1,4 +1,5 @@ -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.UI; namespace ReClassNET.Nodes { @@ -11,7 +12,7 @@ public class UTF8TextNode : BaseTextNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUTF8String(Offset, MemorySize)); } diff --git a/Nodes/UTF8TextPtrNode.cs b/Nodes/UTF8TextPtrNode.cs index d0685335..d87e84db 100644 --- a/Nodes/UTF8TextPtrNode.cs +++ b/Nodes/UTF8TextPtrNode.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Text; using ReClassNET.UI; @@ -11,7 +12,7 @@ public class UTF8TextPtrNode : BaseTextPtrNode /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); var str = view.Memory.Process.ReadRemoteString(Encoding.UTF8, ptr, 64); diff --git a/Nodes/VMethodNode.cs b/Nodes/VMethodNode.cs index 8f95df91..5c2603c5 100644 --- a/Nodes/VMethodNode.cs +++ b/Nodes/VMethodNode.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -20,7 +21,7 @@ public VMethodNode() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, $"({Offset.ToInt32() / IntPtr.Size})", MethodName); } diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index fc09886f..89454479 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.Linq; using ReClassNET.Memory; using ReClassNET.UI; @@ -33,7 +34,7 @@ public override void ClearSelection() /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x, int y) + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) { @@ -53,7 +54,7 @@ public override int Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.VTableColor, HotSpot.NoneId, $"VTable[{nodes.Count}]") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - AddComment(view, x, y); + x = AddComment(view, x, y); y += view.Font.Height; @@ -71,26 +72,28 @@ public override int Draw(ViewInfo view, int x, int y) foreach (var node in nodes) { - y = node.Draw(v, tx, y); + var innerSize = node.Draw(v, tx, y); + x = Math.Max(x, innerSize.Width); + y = innerSize.Height; } } - return y; + return new Size(x, y); } - public override int CalculateHeight(ViewInfo view) + public override Size CalculateSize(ViewInfo view) { if (IsHidden) { - return HiddenHeight; + return HiddenSize; } var h = view.Font.Height; if (levelsOpen[view.Level]) { - h += nodes.Sum(n => n.CalculateHeight(view)); + h += nodes.Sum(n => n.CalculateSize(view).Height); } - return h; + return new Size(0, h); } public override bool ReplaceChildNode(int index, Type nodeType, ref List createdNodes) => false; diff --git a/Nodes/Vector2Node.cs b/Nodes/Vector2Node.cs index be2593aa..149d28e7 100644 --- a/Nodes/Vector2Node.cs +++ b/Nodes/Vector2Node.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -22,7 +23,7 @@ struct Vector2Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector2", (ref int x, ref int y) => { diff --git a/Nodes/Vector3Node.cs b/Nodes/Vector3Node.cs index 03da54e8..e4da7e27 100644 --- a/Nodes/Vector3Node.cs +++ b/Nodes/Vector3Node.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -24,7 +25,7 @@ struct Vector3Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector3", (ref int x, ref int y) => { diff --git a/Nodes/Vector4Node.cs b/Nodes/Vector4Node.cs index 361780c5..8897479c 100644 --- a/Nodes/Vector4Node.cs +++ b/Nodes/Vector4Node.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System.Drawing; +using System.Runtime.InteropServices; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -26,7 +27,7 @@ struct Vector4Data /// The x coordinate. /// The y coordinate. /// The height the node occupies. - public override int Draw(ViewInfo view, int x2, int y2) + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector4", (ref int x, ref int y) => { diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewToolTip.cs index 20625567..a42909f9 100644 --- a/UI/MemoryPreviewToolTip.cs +++ b/UI/MemoryPreviewToolTip.cs @@ -61,7 +61,7 @@ public MemoryPreviewToolTip() private void OnPopup(object sender, PopupEventArgs e) { size.Width = ToolTipWidth; - size.Height = nodes.Select(n => n.CalculateHeight(viewInfo)).Sum() + ToolTipPadding; + size.Height = nodes.Sum(n => n.CalculateSize(viewInfo).Height) + ToolTipPadding; e.ToolTipSize = size; @@ -89,7 +89,7 @@ private void OnDraw(object sender, DrawToolTipEventArgs e) int y = 2; foreach (var node in nodes) { - y = node.Draw(viewInfo, x, y); + y = node.Draw(viewInfo, x, y).Height; } } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 5f929569..24d9114d 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -95,8 +95,9 @@ protected override void OnLoad(EventArgs e) VerticalScroll.Enabled = true; VerticalScroll.Visible = true; VerticalScroll.SmallChange = 10; - HorizontalScroll.Enabled = false; - HorizontalScroll.Visible = false; + HorizontalScroll.Enabled = true; + HorizontalScroll.Visible = true; + HorizontalScroll.SmallChange = 100; } internal void RegisterNodeType(Type type, string name, Image icon) @@ -169,13 +170,17 @@ protected override void OnPaint(PaintEventArgs e) HotSpots = hotSpots }; + var scrollX = HorizontalScroll.Value; var scrollY = VerticalScroll.Value * font.Height; - int maxY; + + Size drawnSize; try { BaseHexNode.CurrentHighlightTime = DateTime.Now; - maxY = ClassNode.Draw(view, 0, -scrollY) + scrollY; + drawnSize = ClassNode.Draw(view, -scrollX, -scrollY); + drawnSize.Width += scrollX + 50; + drawnSize.Height += scrollY; } catch { @@ -187,12 +192,12 @@ protected override void OnPaint(PaintEventArgs e) e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); }*/ - if (maxY > ClientSize.Height) + if (drawnSize.Height > ClientSize.Height) { VerticalScroll.Enabled = true; VerticalScroll.LargeChange = ClientSize.Height / font.Height; - VerticalScroll.Maximum = (maxY - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; + VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; } else { @@ -200,6 +205,20 @@ protected override void OnPaint(PaintEventArgs e) VerticalScroll.Value = 0; } + + if (drawnSize.Width > ClientSize.Width) + { + HorizontalScroll.Enabled = true; + + HorizontalScroll.LargeChange = ClientSize.Width; + HorizontalScroll.Maximum = (drawnSize.Width - ClientSize.Width) + HorizontalScroll.LargeChange; + } + else + { + HorizontalScroll.Enabled = false; + + HorizontalScroll.Value = 0; + } } private void OnSelectionChanged() From 139a2cdcd30c77152e8fb8abc2ac043ba27d2ae5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 7 Mar 2017 09:54:33 +0100 Subject: [PATCH 006/777] Renamed member. --- Nodes/BaseNode.cs | 2 +- UI/MemoryViewControl.cs | 2 +- UI/ViewInfo.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 73e545fb..96eb6d0b 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -356,7 +356,7 @@ protected void AddTypeDrop(ViewInfo view, int x, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (view.MultiSelected || (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0)) + if (view.MultipleNodesSelected || (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0)) { return; } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 24d9114d..ffeb8de3 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -166,7 +166,7 @@ protected override void OnPaint(PaintEventArgs e) ClientArea = ClientRectangle, Level = 0, Memory = Memory, - MultiSelected = selectedNodes.Count > 1, + MultipleNodesSelected = selectedNodes.Count > 1, HotSpots = hotSpots }; diff --git a/UI/ViewInfo.cs b/UI/ViewInfo.cs index 11dc5cba..64d6ea5a 100644 --- a/UI/ViewInfo.cs +++ b/UI/ViewInfo.cs @@ -19,7 +19,7 @@ public class ViewInfo public List Classes { get; set; } public IntPtr Address { get; set; } public int Level { get; set; } - public bool MultiSelected { get; set; } + public bool MultipleNodesSelected { get; set; } public ViewInfo Clone() { @@ -34,7 +34,7 @@ public ViewInfo Clone() Classes = Classes, Address = Address, Level = Level, - MultiSelected = MultiSelected + MultipleNodesSelected = MultipleNodesSelected }; } } From d3006014c1fc4e2114e9e3501457827ad20c7103 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 7 Mar 2017 10:02:29 +0100 Subject: [PATCH 007/777] Fixed unneeded exception. --- Settings.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Settings.cs b/Settings.cs index 171c8630..35ff40e2 100644 --- a/Settings.cs +++ b/Settings.cs @@ -16,15 +16,20 @@ public static Settings Load(string filename) try { - using (var sr = new StreamReader(filename)) + if (File.Exists(filename)) { - return (Settings)new XmlSerializer(typeof(Settings)).Deserialize(sr); + using (var sr = new StreamReader(filename)) + { + return (Settings)new XmlSerializer(typeof(Settings)).Deserialize(sr); + } } } catch { - return new Settings(); + } + + return new Settings(); } public static void Save(Settings settings, string filename) From d696d9e536eb15fd29650b32b50b6da9994f19d5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 7 Mar 2017 10:03:24 +0100 Subject: [PATCH 008/777] Fixed text drawn above icons. --- Nodes/BaseArrayNode.cs | 5 +++-- Nodes/BaseFunctionPtrNode.cs | 5 +++-- Nodes/BaseHexNode.cs | 5 +++-- Nodes/BaseMatrixNode.cs | 10 ++++++---- Nodes/BaseNode.cs | 18 ++++++++---------- Nodes/BaseNumericNode.cs | 5 +++-- Nodes/BaseTextNode.cs | 5 +++-- Nodes/BaseTextPtrNode.cs | 5 +++-- Nodes/BitFieldNode.cs | 5 +++-- Nodes/BoolNode.cs | 5 +++-- Nodes/ClassInstanceNode.cs | 5 +++-- Nodes/ClassPtrNode.cs | 5 +++-- Nodes/FunctionNode.cs | 5 +++-- Nodes/VTableNode.cs | 5 +++-- 14 files changed, 50 insertions(+), 38 deletions(-) diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index bed9bc6f..e3fb1866 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -22,8 +22,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = AddOpenClose(view, x, y); x = AddIcon(view, x, y, Icons.Array, -1, HotSpotType.None); @@ -58,6 +56,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan y = childSize.Height; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y); } diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index 5c388fc6..f3d86b45 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -34,8 +34,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; @@ -79,6 +77,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) y = instructionSize.Height; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index c1c902b7..827be045 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -34,8 +34,6 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding + 16; x = AddAddressOffset(view, x, y); @@ -82,6 +80,9 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index d68e5d06..67211ad0 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -25,8 +25,6 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; @@ -49,6 +47,9 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr drawValues(tx, ref x, ref y); } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } @@ -65,8 +66,6 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; @@ -86,6 +85,9 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect x += AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 96eb6d0b..35502e5a 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -327,43 +327,41 @@ protected int AddOpenClose(ViewInfo view, int x, int y) return AddIcon(view, x, y, levelsOpen[view.Level] ? Icons.OpenCloseOpen : Icons.OpenCloseClosed, 0, HotSpotType.OpenClose); } - /// Draws a delete icon if the node is selected. + /// Draws a type drop icon if the node is selected. /// The view information. - /// The x coordinate. /// The y coordinate. - protected void AddDelete(ViewInfo view, int x, int y) + protected void AddTypeDrop(ViewInfo view, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0) + if (view.MultipleNodesSelected || (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0)) { return; } if (IsSelected) { - AddIcon(view, view.ClientArea.Right - Icons.Dimensions, y, Icons.Delete, 0, HotSpotType.Delete); + AddIcon(view, 0, y, Icons.DropArrow, 0, HotSpotType.Drop); } } - /// Draws a type drop icon if the node is selected. + /// Draws a delete icon if the node is selected. /// The view information. - /// The x coordinate. /// The y coordinate. - protected void AddTypeDrop(ViewInfo view, int x, int y) + protected void AddDelete(ViewInfo view, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (view.MultipleNodesSelected || (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0)) + if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0) { return; } if (IsSelected) { - AddIcon(view, 0, y, Icons.DropArrow, 0, HotSpotType.Drop); + AddIcon(view, view.ClientArea.Right - Icons.Dimensions, y, Icons.Delete, 0, HotSpotType.Delete); } } diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 52fee26e..9f915e72 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -27,8 +27,6 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = x + TextPadding; @@ -42,6 +40,9 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index 0977ac3c..a1aad8cc 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -34,8 +34,6 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; x = AddIcon(view, x, y, Icons.Text, HotSpot.NoneId, HotSpotType.None); @@ -53,6 +51,9 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index 032ecd26..50d30708 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -29,8 +29,6 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; x = AddIcon(view, x, y, Icons.Text, HotSpot.NoneId, HotSpotType.None); @@ -45,6 +43,9 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index c261d0b8..5c444384 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -102,8 +102,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding + 16; @@ -146,6 +144,9 @@ public override Size Draw(ViewInfo view, int x, int y) y += 2; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index b4be4a72..b20b15ad 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -21,8 +21,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = x + TextPadding + 16; @@ -37,6 +35,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index 561ea2e5..bf0250df 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -31,8 +31,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = AddOpenClose(view, x, y); x = AddIcon(view, x, y, Icons.Class, -1, HotSpotType.None); @@ -62,6 +60,9 @@ public override Size Draw(ViewInfo view, int x, int y) y = innerSize.Height; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y); } diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index 771c40e6..880916b2 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -35,8 +35,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = AddOpenClose(view, x, y); x = AddIcon(view, x, y, Icons.Pointer, -1, HotSpotType.None); @@ -71,6 +69,9 @@ public override Size Draw(ViewInfo view, int x, int y) y = innerSize.Height; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y); } diff --git a/Nodes/FunctionNode.cs b/Nodes/FunctionNode.cs index 33b348d2..879db57e 100644 --- a/Nodes/FunctionNode.cs +++ b/Nodes/FunctionNode.cs @@ -35,8 +35,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x += TextPadding; @@ -75,6 +73,9 @@ public override Size Draw(ViewInfo view, int x, int y) y = instructionSize.Height + 4; } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y + view.Font.Height); } diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index 89454479..bec1fab3 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -42,8 +42,6 @@ public override Size Draw(ViewInfo view, int x, int y) } AddSelection(view, x, y, view.Font.Height); - AddDelete(view, x, y); - AddTypeDrop(view, x, y); x = AddOpenClose(view, x, y); x = AddIcon(view, x, y, Icons.VTable, -1, HotSpotType.None); @@ -78,6 +76,9 @@ public override Size Draw(ViewInfo view, int x, int y) } } + AddTypeDrop(view, y); + AddDelete(view, y); + return new Size(x, y); } From e2d0acfd57dbe84867edd5a15f6f2d8f6076c3fe Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 Mar 2017 15:09:10 +0100 Subject: [PATCH 009/777] Changed the Draw method to return the size of the node. --- Nodes/BaseArrayNode.cs | 14 ++++-- Nodes/BaseFunctionNode.cs | 6 ++- Nodes/BaseFunctionPtrNode.cs | 13 ++++-- Nodes/BaseHexNode.cs | 6 ++- Nodes/BaseMatrixNode.cs | 16 ++++--- Nodes/BaseNode.cs | 48 ++++++++++++++++++++- Nodes/BaseNumericNode.cs | 10 +++-- Nodes/BaseTextNode.cs | 6 ++- Nodes/BaseTextPtrNode.cs | 8 ++-- Nodes/BitFieldNode.cs | 11 +++-- Nodes/BoolNode.cs | 10 +++-- Nodes/ClassInstanceArrayNode.cs | 2 +- Nodes/ClassInstanceNode.cs | 21 +++++---- Nodes/ClassNode.cs | 39 +++++++++++------ Nodes/ClassPtrArrayNode.cs | 2 +- Nodes/ClassPtrNode.cs | 25 ++++++----- Nodes/DoubleNode.cs | 2 +- Nodes/FloatNode.cs | 2 +- Nodes/FunctionNode.cs | 35 ++++++++------- Nodes/FunctionPtrNode.cs | 2 +- Nodes/Hex16Node.cs | 2 +- Nodes/Hex32Node.cs | 2 +- Nodes/Hex64Node.cs | 2 +- Nodes/Hex8Node.cs | 2 +- Nodes/Int16Node.cs | 2 +- Nodes/Int32Node.cs | 2 +- Nodes/Int64Node.cs | 2 +- Nodes/Int8Node.cs | 2 +- Nodes/Matrix3x3Node.cs | 2 +- Nodes/Matrix3x4Node.cs | 2 +- Nodes/Matrix4x4Node.cs | 2 +- Nodes/UInt16Node.cs | 2 +- Nodes/UInt32Node.cs | 2 +- Nodes/UInt64Node.cs | 2 +- Nodes/UInt8Node.cs | 2 +- Nodes/UTF16TextNode.cs | 2 +- Nodes/UTF16TextPtrNode.cs | 2 +- Nodes/UTF32TextNode.cs | 2 +- Nodes/UTF32TextPtrNode.cs | 2 +- Nodes/UTF8TextNode.cs | 2 +- Nodes/UTF8TextPtrNode.cs | 2 +- Nodes/VMethodNode.cs | 2 +- Nodes/VTableNode.cs | 22 ++++++---- Nodes/Vector2Node.cs | 2 +- Nodes/Vector3Node.cs | 2 +- Nodes/Vector4Node.cs | 2 +- UI/MemoryViewControl.cs | 76 ++++++++++++++++----------------- 47 files changed, 268 insertions(+), 158 deletions(-) diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index e3fb1866..8261fc2c 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -21,6 +21,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x = AddOpenClose(view, x, y); @@ -49,17 +52,20 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan y += view.Font.Height; + var size = new Size(x - origX, y - origY); + if (levelsOpen[view.Level]) { var childSize = DrawChild(view, tx, y); - x = Math.Max(x, childSize.Width); - y = childSize.Height; + + size.Width = Math.Max(size.Width, childSize.Width + tx - origX); + size.Height += childSize.Height; } AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y); + return size; } protected abstract Size DrawChild(ViewInfo view, int x, int y); @@ -76,7 +82,7 @@ public override Size CalculateSize(ViewInfo view) { h += CalculateChildHeight(view); } - return new Size(0, h); + return new Size(500, h); } protected abstract int CalculateChildHeight(ViewInfo view); diff --git a/Nodes/BaseFunctionNode.cs b/Nodes/BaseFunctionNode.cs index a25d19f1..02c83f20 100644 --- a/Nodes/BaseFunctionNode.cs +++ b/Nodes/BaseFunctionNode.cs @@ -24,6 +24,8 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) { Contract.Requires(view != null); + var origY = y; + var minWidth = 26 * view.Font.Width; var maxWidth = 0; @@ -45,11 +47,11 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, instruction.Instruction); - maxWidth = Math.Max(x, maxWidth); + maxWidth = Math.Max(x - tx, maxWidth); } } - return new Size(maxWidth, y); + return new Size(maxWidth, y - origY); } protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out int memorySize) diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index f3d86b45..c94a731d 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -33,6 +33,8 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -66,6 +68,8 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) } } + var size = new Size(x - origX, view.Font.Height); + if (levelsOpen[view.Level]) { var ptr = view.Memory.ReadObject(Offset); @@ -73,14 +77,15 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) DisassembleRemoteCode(view.Memory, ptr); var instructionSize = DrawInstructions(view, tx, y); - x = Math.Max(x, instructionSize.Width); - y = instructionSize.Height; + + size.Width = Math.Max(size.Width, instructionSize.Width + tx - origX); + size.Height += instructionSize.Height; } AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return size; } public override Size CalculateSize(ViewInfo view) @@ -95,7 +100,7 @@ public override Size CalculateSize(ViewInfo view) { h += instructions.Count * view.Font.Height; } - return new Size(0, h); + return new Size(500, h); } private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index 827be045..62344063 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -33,6 +33,8 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); x += TextPadding + 16; @@ -83,12 +85,12 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, view.Font.Height); } public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(0, view.Font.Height); + return IsHidden ? HiddenSize : new Size(500/*CalculateWidth(view, true, false, true, 9 + MemorySize * 3)*/, view.Font.Height); } /// Updates the node from the given spot. Sets the value of the selected byte. diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 67211ad0..4295b46a 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -24,6 +24,9 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -40,7 +43,7 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr x += view.Font.Width; - x += AddComment(view, x, y); + x = AddComment(view, x, y); if (levelsOpen[view.Level]) { @@ -50,7 +53,7 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, y - origY + view.Font.Height); } protected delegate void DrawVectorValues(ref int x, ref int y); @@ -65,6 +68,9 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -83,12 +89,12 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect x += view.Font.Width; - x += AddComment(view, x, y); + x = AddComment(view, x, y); AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, y - origY + view.Font.Height); } public override Size CalculateSize(ViewInfo view) @@ -103,7 +109,7 @@ public override Size CalculateSize(ViewInfo view) { h += CalculateValuesHeight(view); } - return new Size(0, h); + return new Size(500, h); } protected abstract int CalculateValuesHeight(ViewInfo view); diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 35502e5a..895c64b0 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -123,7 +123,7 @@ public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The size the node occupies. + /// The pixel size the node occupies. public abstract Size Draw(ViewInfo view, int x, int y); /// @@ -135,6 +135,50 @@ public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The calculated size. public abstract Size CalculateSize(ViewInfo view); + protected int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) + { + Contract.Requires(view != null); + Contract.Requires(addCharacters >= 0); + + var width = 0; + + width += TextPadding; + width += Icons.Dimensions; + + if (addAddressOffset) + { + if (view.Settings.ShowNodeOffset) + { + addCharacters += 4; + width += view.Font.Width; + } + if (view.Settings.ShowNodeAddress) + { +#if WIN64 + addCharacters += 16; +#else + addCharacters += 8; +#endif + width += view.Font.Width; + } + } + + if (addName) + { + addCharacters += Name.Length; + } + + if (addComment) + { + addCharacters += 2 + Comment.Length; + width += view.Font.Width; + } + + width += addCharacters * view.Font.Width; + + return width; + } + /// Updates the node from the given . Sets the and of the node. /// The spot. public virtual void Update(HotSpot spot) @@ -397,7 +441,7 @@ protected Size DrawHidden(ViewInfo view, int x, int y) view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); } - return new Size(0, y + HiddenSize.Height); + return new Size(0, HiddenSize.Height); } } diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 9f915e72..2dd7351d 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -13,7 +13,7 @@ public abstract class BaseNumericNode : BaseNode /// The icon of the node. /// The type of the node. /// The value of the node. - /// The height the node occupies. + /// The pixel size the node occupies. protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value) { Contract.Requires(view != null); @@ -26,9 +26,11 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); - x = x + TextPadding; + x += TextPadding; x = AddIcon(view, x, y, icon, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); @@ -43,12 +45,12 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, view.Font.Height); } public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(0, view.Font.Height); + return IsHidden ? HiddenSize : new Size(500, view.Font.Height); } } } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index a1aad8cc..dda82c8d 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -33,6 +33,8 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -54,12 +56,12 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, view.Font.Height); } public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(0, view.Font.Height); + return IsHidden ? HiddenSize : new Size(500, view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index 50d30708..b5b2a8b1 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -16,7 +16,7 @@ public abstract class BaseTextPtrNode : BaseNode /// The y coordinate. /// The name of the type. /// The text. - /// The height the node occupies. + /// The pixel size the node occupies. public Size DrawText(ViewInfo view, int x, int y, string type, string text) { Contract.Requires(view != null); @@ -28,6 +28,8 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -46,12 +48,12 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, view.Font.Height); } public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(0, view.Font.Height); + return IsHidden ? HiddenSize : new Size(500, view.Font.Height); } } } diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index 5c444384..597326a8 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -93,7 +93,7 @@ private string ConvertValueToBitString(MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) @@ -101,9 +101,12 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); - x += TextPadding + 16; + x += TextPadding + Icons.Dimensions; x = AddAddressOffset(view, x, y); @@ -147,7 +150,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, y - origY + view.Font.Height); } public override Size CalculateSize(ViewInfo view) @@ -162,7 +165,7 @@ public override Size CalculateSize(ViewInfo view) { h += view.Font.Height + 2; } - return new Size(0, h); + return new Size(500, h); } /// Updates the node from the given spot. Sets the value of the selected bit. diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index b20b15ad..8522ddc7 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -12,7 +12,7 @@ public class BoolNode : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height th node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) @@ -20,9 +20,11 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); - x = x + TextPadding + 16; + x += TextPadding + Icons.Dimensions; x = AddAddressOffset(view, x, y); @@ -38,12 +40,12 @@ public override Size Draw(ViewInfo view, int x, int y) AddTypeDrop(view, y); AddDelete(view, y); - return new Size(x, y + view.Font.Height); + return new Size(x - origX, view.Font.Height); } public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(0, view.Font.Height); + return IsHidden ? HiddenSize : new Size(500/*CalculateWidth(view, true, true, true, 13)*/, view.Font.Height); } /// Updates the node from the given spot and sets the value. diff --git a/Nodes/ClassInstanceArrayNode.cs b/Nodes/ClassInstanceArrayNode.cs index d02a34cb..3fe9e19f 100644 --- a/Nodes/ClassInstanceArrayNode.cs +++ b/Nodes/ClassInstanceArrayNode.cs @@ -21,7 +21,7 @@ public override void Intialize() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "Array", HotSpotType.ChangeType); diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index bf0250df..e5facb55 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -22,7 +22,7 @@ public override void Intialize() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) @@ -30,6 +30,9 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x = AddOpenClose(view, x, y); @@ -46,8 +49,13 @@ public override Size Draw(ViewInfo view, int x, int y) x += view.Font.Width; x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + y += view.Font.Height; + var size = new Size(x - origX, y - origY); + if (levelsOpen[view.Level]) { var v = view.Clone(); @@ -56,14 +64,11 @@ public override Size Draw(ViewInfo view, int x, int y) v.Memory.Offset = Offset.ToInt32(); var innerSize = InnerNode.Draw(v, tx, y); - x = Math.Max(x, innerSize.Width); - y = innerSize.Height; + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; } - AddTypeDrop(view, y); - AddDelete(view, y); - - return new Size(x, y); + return size; } public override Size CalculateSize(ViewInfo view) @@ -78,7 +83,7 @@ public override Size CalculateSize(ViewInfo view) { h += InnerNode.CalculateSize(view).Height; } - return new Size(0, h); + return new Size(500, h); } } } diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index 9d92b092..f1afc2ea 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -90,10 +90,14 @@ public override void ClearSelection() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { AddSelection(view, 0, y, view.Font.Height); + + var origX = x; + var origY = y; + x = AddOpenClose(view, x, y); var tx = x; @@ -108,44 +112,53 @@ public override Size Draw(ViewInfo view, int x, int y) y += view.Font.Height; + var size = new Size(x - origX, y - origY); + if (levelsOpen[view.Level]) { var nv = view.Clone(); nv.Level++; foreach (var node in Nodes) { - // If the node is in the visible area draw it. + // Draw the node if it is in the visible area. if (view.ClientArea.Contains(tx, y)) { var innerSize = node.Draw(nv, tx, y); - x = Math.Max(x, innerSize.Width); - y = innerSize.Height; + + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; + + y += innerSize.Height; } else { // Otherwise calculate the size... var calculatedSize = node.CalculateSize(nv); - // and check if the nodes area overlaps with the visible area... - if (new Rectangle(tx, y, view.ClientArea.Width, calculatedSize.Height).IntersectsWith(view.ClientArea) - || new Rectangle(tx, y, calculatedSize.Width, view.ClientArea.Height).IntersectsWith(view.ClientArea)) + // and check if the node area overlaps with the visible area... + if (new Rectangle(tx, y, calculatedSize.Width, calculatedSize.Height).IntersectsWith(view.ClientArea)) { // then draw the node... var innerSize = node.Draw(nv, tx, y); - x = Math.Max(x, innerSize.Width); - y = innerSize.Height; + + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; + + y += innerSize.Height; } else { - // or skip drawing and just use calculated width and height. - x = Math.Max(x, calculatedSize.Width); + // or skip drawing and just use the calculated width and height. + size.Width = Math.Max(size.Width, calculatedSize.Width); + size.Height += calculatedSize.Height; + y += calculatedSize.Height; } } } } - return new Size(x, y); + return size; } public override Size CalculateSize(ViewInfo view) @@ -162,7 +175,7 @@ public override Size CalculateSize(ViewInfo view) nv.Level++; h += Nodes.Sum(n => n.CalculateSize(nv).Height); } - return new Size(0, h); + return new Size(500, h); } public override void Update(HotSpot spot) diff --git a/Nodes/ClassPtrArrayNode.cs b/Nodes/ClassPtrArrayNode.cs index b7362441..49a3bee7 100644 --- a/Nodes/ClassPtrArrayNode.cs +++ b/Nodes/ClassPtrArrayNode.cs @@ -26,7 +26,7 @@ public override void Intialize() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "PtrArray", HotSpotType.ChangeType); diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index 880916b2..e52db9a9 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -26,7 +26,7 @@ public override void Intialize() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) @@ -34,6 +34,9 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x = AddOpenClose(view, x, y); @@ -45,13 +48,17 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>"); - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType); + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; - x += view.Font.Width; x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + y += view.Font.Height; + var size = new Size(x - origX, y - origY); + if (levelsOpen[view.Level]) { var ptr = view.Memory.ReadObject(Offset); @@ -65,14 +72,12 @@ public override Size Draw(ViewInfo view, int x, int y) v.Memory = memory; var innerSize = InnerNode.Draw(v, tx, y); - x = Math.Max(x, innerSize.Width); - y = innerSize.Height; - } - AddTypeDrop(view, y); - AddDelete(view, y); + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; + } - return new Size(x, y); + return size; } public override Size CalculateSize(ViewInfo view) @@ -87,7 +92,7 @@ public override Size CalculateSize(ViewInfo view) { h += InnerNode.CalculateSize(view).Height; } - return new Size(0, h); + return new Size(500, h); } } } diff --git a/Nodes/DoubleNode.cs b/Nodes/DoubleNode.cs index d5bf8ea6..cc9392b4 100644 --- a/Nodes/DoubleNode.cs +++ b/Nodes/DoubleNode.cs @@ -12,7 +12,7 @@ public class DoubleNode : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Double, "Double", view.Memory.ReadObject(Offset).ToString("0.000")); diff --git a/Nodes/FloatNode.cs b/Nodes/FloatNode.cs index a49e6c97..e412c95a 100644 --- a/Nodes/FloatNode.cs +++ b/Nodes/FloatNode.cs @@ -12,7 +12,7 @@ public class FloatNode : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Float, "Float", view.Memory.ReadObject(Offset).ToString("0.000")); diff --git a/Nodes/FunctionNode.cs b/Nodes/FunctionNode.cs index 879db57e..22954184 100644 --- a/Nodes/FunctionNode.cs +++ b/Nodes/FunctionNode.cs @@ -34,6 +34,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + AddSelection(view, x, y, view.Font.Height); x += TextPadding; @@ -51,32 +53,35 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - var ptr = view.Address.Add(Offset); + AddTypeDrop(view, y); + AddDelete(view, y); + + var size = new Size(x - origX, view.Font.Height); + var ptr = view.Address.Add(Offset); DisassembleRemoteCode(view.Memory, ptr); if (levelsOpen[view.Level]) { y += view.Font.Height; - var x2 = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; - x2 = AddText(view, x2, y, view.Settings.ValueColor, 0, Signature); - x = Math.Max(x, x2); + x = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, 0, Signature); + size.Width = Math.Max(size.Width, x - origX); + size.Height += view.Font.Height; y += view.Font.Height; - x2 = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); - x2 = AddText(view, x2, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); - x2 = AddIcon(view, x2, y, Icons.Change, 1, HotSpotType.ChangeType); - x = Math.Max(x, x2); + x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); + x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeType); + size.Width = Math.Max(size.Width, x - origX); + size.Height += view.Font.Height; var instructionSize = DrawInstructions(view, tx, y + 4); - x = Math.Max(x, instructionSize.Width); - y = instructionSize.Height + 4; + size.Width = Math.Max(size.Width, instructionSize.Width + tx - origX); + size.Height += instructionSize.Height + 4; } - AddTypeDrop(view, y); - AddDelete(view, y); - - return new Size(x, y + view.Font.Height); + return size; } public override Size CalculateSize(ViewInfo view) @@ -91,7 +96,7 @@ public override Size CalculateSize(ViewInfo view) { h += instructions.Count * view.Font.Height; } - return new Size(0, h); + return new Size(500, h); } public override void Update(HotSpot spot) diff --git a/Nodes/FunctionPtrNode.cs b/Nodes/FunctionPtrNode.cs index 95b5cbf7..1ab2f3c8 100644 --- a/Nodes/FunctionPtrNode.cs +++ b/Nodes/FunctionPtrNode.cs @@ -9,7 +9,7 @@ public class FunctionPtrNode : BaseFunctionPtrNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "FunctionPtr", Name); diff --git a/Nodes/Hex16Node.cs b/Nodes/Hex16Node.cs index 284d2448..7fbf8afe 100644 --- a/Nodes/Hex16Node.cs +++ b/Nodes/Hex16Node.cs @@ -24,7 +24,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 2) + " " : null, 2); diff --git a/Nodes/Hex32Node.cs b/Nodes/Hex32Node.cs index 1d66cb33..d26510b0 100644 --- a/Nodes/Hex32Node.cs +++ b/Nodes/Hex32Node.cs @@ -34,7 +34,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 4) + " " : null, 4); diff --git a/Nodes/Hex64Node.cs b/Nodes/Hex64Node.cs index c353c460..a86400f9 100644 --- a/Nodes/Hex64Node.cs +++ b/Nodes/Hex64Node.cs @@ -34,7 +34,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 8) + " " : null, 8); diff --git a/Nodes/Hex8Node.cs b/Nodes/Hex8Node.cs index a2a7bee7..75923024 100644 --- a/Nodes/Hex8Node.cs +++ b/Nodes/Hex8Node.cs @@ -24,7 +24,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 1) + " " : null, 1); diff --git a/Nodes/Int16Node.cs b/Nodes/Int16Node.cs index 0fb2e483..89e106b5 100644 --- a/Nodes/Int16Node.cs +++ b/Nodes/Int16Node.cs @@ -12,7 +12,7 @@ public class Int16Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int16", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/Int32Node.cs b/Nodes/Int32Node.cs index 086f543f..58e181ff 100644 --- a/Nodes/Int32Node.cs +++ b/Nodes/Int32Node.cs @@ -12,7 +12,7 @@ public class Int32Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int32", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/Int64Node.cs b/Nodes/Int64Node.cs index 5054b79c..22761b8a 100644 --- a/Nodes/Int64Node.cs +++ b/Nodes/Int64Node.cs @@ -12,7 +12,7 @@ public class Int64Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int64", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/Int8Node.cs b/Nodes/Int8Node.cs index 57d18894..6f795da5 100644 --- a/Nodes/Int8Node.cs +++ b/Nodes/Int8Node.cs @@ -12,7 +12,7 @@ public class Int8Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height th node occupies. + /// The size th node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Signed, "Int8", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/Matrix3x3Node.cs b/Nodes/Matrix3x3Node.cs index 380e0bce..3516637e 100644 --- a/Nodes/Matrix3x3Node.cs +++ b/Nodes/Matrix3x3Node.cs @@ -37,7 +37,7 @@ struct Matrix3x3Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => diff --git a/Nodes/Matrix3x4Node.cs b/Nodes/Matrix3x4Node.cs index 4cd28841..663c0ebd 100644 --- a/Nodes/Matrix3x4Node.cs +++ b/Nodes/Matrix3x4Node.cs @@ -43,7 +43,7 @@ struct Matrix3x4Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => diff --git a/Nodes/Matrix4x4Node.cs b/Nodes/Matrix4x4Node.cs index 69b002c2..6a51965a 100644 --- a/Nodes/Matrix4x4Node.cs +++ b/Nodes/Matrix4x4Node.cs @@ -51,7 +51,7 @@ struct Matrix4x4Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => diff --git a/Nodes/UInt16Node.cs b/Nodes/UInt16Node.cs index e593aeac..a362883d 100644 --- a/Nodes/UInt16Node.cs +++ b/Nodes/UInt16Node.cs @@ -12,7 +12,7 @@ public class UInt16Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/UInt32Node.cs b/Nodes/UInt32Node.cs index 3fdf8152..de98ab22 100644 --- a/Nodes/UInt32Node.cs +++ b/Nodes/UInt32Node.cs @@ -12,7 +12,7 @@ public class UInt32Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/UInt64Node.cs b/Nodes/UInt64Node.cs index a8a92a26..2c7c6d68 100644 --- a/Nodes/UInt64Node.cs +++ b/Nodes/UInt64Node.cs @@ -12,7 +12,7 @@ public class UInt64Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", view.Memory.ReadObject(Offset).ToString()); diff --git a/Nodes/UInt8Node.cs b/Nodes/UInt8Node.cs index 73eaceb5..72e9684e 100644 --- a/Nodes/UInt8Node.cs +++ b/Nodes/UInt8Node.cs @@ -12,7 +12,7 @@ public class UInt8Node : BaseNumericNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", view.Memory.ReadByte(Offset).ToString()); diff --git a/Nodes/UTF16TextNode.cs b/Nodes/UTF16TextNode.cs index 9b81781f..8b69d452 100644 --- a/Nodes/UTF16TextNode.cs +++ b/Nodes/UTF16TextNode.cs @@ -11,7 +11,7 @@ public class UTF16TextNode : BaseTextNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUTF16String(Offset, MemorySize)); diff --git a/Nodes/UTF16TextPtrNode.cs b/Nodes/UTF16TextPtrNode.cs index 2bc52828..8192222d 100644 --- a/Nodes/UTF16TextPtrNode.cs +++ b/Nodes/UTF16TextPtrNode.cs @@ -11,7 +11,7 @@ public class UTF16TextPtrNode : BaseTextPtrNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); diff --git a/Nodes/UTF32TextNode.cs b/Nodes/UTF32TextNode.cs index f860f29a..de174317 100644 --- a/Nodes/UTF32TextNode.cs +++ b/Nodes/UTF32TextNode.cs @@ -11,7 +11,7 @@ public class UTF32TextNode : BaseTextNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUTF32String(Offset, MemorySize)); diff --git a/Nodes/UTF32TextPtrNode.cs b/Nodes/UTF32TextPtrNode.cs index f04d3ad8..b0356002 100644 --- a/Nodes/UTF32TextPtrNode.cs +++ b/Nodes/UTF32TextPtrNode.cs @@ -11,7 +11,7 @@ public class UTF32TextPtrNode : BaseTextPtrNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); diff --git a/Nodes/UTF8TextNode.cs b/Nodes/UTF8TextNode.cs index 26f13ef9..33db64b4 100644 --- a/Nodes/UTF8TextNode.cs +++ b/Nodes/UTF8TextNode.cs @@ -11,7 +11,7 @@ public class UTF8TextNode : BaseTextNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUTF8String(Offset, MemorySize)); diff --git a/Nodes/UTF8TextPtrNode.cs b/Nodes/UTF8TextPtrNode.cs index d87e84db..e271a9f6 100644 --- a/Nodes/UTF8TextPtrNode.cs +++ b/Nodes/UTF8TextPtrNode.cs @@ -11,7 +11,7 @@ public class UTF8TextPtrNode : BaseTextPtrNode /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { var ptr = view.Memory.ReadObject(Offset); diff --git a/Nodes/VMethodNode.cs b/Nodes/VMethodNode.cs index 5c2603c5..aaf17416 100644 --- a/Nodes/VMethodNode.cs +++ b/Nodes/VMethodNode.cs @@ -20,7 +20,7 @@ public VMethodNode() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, $"({Offset.ToInt32() / IntPtr.Size})", MethodName); diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index bec1fab3..afbf9c58 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -33,7 +33,7 @@ public override void ClearSelection() /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) @@ -41,6 +41,9 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + var origX = x; + var origY = y; + AddSelection(view, x, y, view.Font.Height); x = AddOpenClose(view, x, y); @@ -54,8 +57,13 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + y += view.Font.Height; + var size = new Size(x - origX, y - origY); + if (levelsOpen[view.Level]) { var ptr = view.Memory.ReadObject(Offset); @@ -71,15 +79,13 @@ public override Size Draw(ViewInfo view, int x, int y) foreach (var node in nodes) { var innerSize = node.Draw(v, tx, y); - x = Math.Max(x, innerSize.Width); - y = innerSize.Height; + + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; } } - AddTypeDrop(view, y); - AddDelete(view, y); - - return new Size(x, y); + return size; } public override Size CalculateSize(ViewInfo view) @@ -94,7 +100,7 @@ public override Size CalculateSize(ViewInfo view) { h += nodes.Sum(n => n.CalculateSize(view).Height); } - return new Size(0, h); + return new Size(500, h); } public override bool ReplaceChildNode(int index, Type nodeType, ref List createdNodes) => false; diff --git a/Nodes/Vector2Node.cs b/Nodes/Vector2Node.cs index 149d28e7..008df968 100644 --- a/Nodes/Vector2Node.cs +++ b/Nodes/Vector2Node.cs @@ -22,7 +22,7 @@ struct Vector2Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector2", (ref int x, ref int y) => diff --git a/Nodes/Vector3Node.cs b/Nodes/Vector3Node.cs index e4da7e27..9b08170c 100644 --- a/Nodes/Vector3Node.cs +++ b/Nodes/Vector3Node.cs @@ -24,7 +24,7 @@ struct Vector3Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector3", (ref int x, ref int y) => diff --git a/Nodes/Vector4Node.cs b/Nodes/Vector4Node.cs index 8897479c..f547f4fc 100644 --- a/Nodes/Vector4Node.cs +++ b/Nodes/Vector4Node.cs @@ -26,7 +26,7 @@ struct Vector4Data /// The view information. /// The x coordinate. /// The y coordinate. - /// The height the node occupies. + /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector4", (ref int x, ref int y) => diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index ffeb8de3..a19393cc 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; @@ -157,6 +158,8 @@ protected override void OnPaint(PaintEventArgs e) Memory.Size = ClassNode.MemorySize; Memory.Update(ClassNode.Offset); + BaseHexNode.CurrentHighlightTime = DateTime.Now; + var view = new ViewInfo { Settings = Program.Settings, @@ -170,54 +173,51 @@ protected override void OnPaint(PaintEventArgs e) HotSpots = hotSpots }; - var scrollX = HorizontalScroll.Value; - var scrollY = VerticalScroll.Value * font.Height; - - Size drawnSize; try { - BaseHexNode.CurrentHighlightTime = DateTime.Now; - - drawnSize = ClassNode.Draw(view, -scrollX, -scrollY); - drawnSize.Width += scrollX + 50; - drawnSize.Height += scrollY; - } - catch - { - return; - } + var drawnSize = ClassNode.Draw( + view, + -HorizontalScroll.Value, + -VerticalScroll.Value * font.Height + ); + drawnSize.Width += 50; + + /*foreach (var spot in hotSpots.Where(h => h.Type == HotSpotType.Select)) + { + e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); + }*/ - /*foreach (var spot in hotSpots.Where(h => h.Type == HotSpotType.Select)) - { - e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); - }*/ + if (drawnSize.Height > ClientSize.Height) + { + VerticalScroll.Enabled = true; - if (drawnSize.Height > ClientSize.Height) - { - VerticalScroll.Enabled = true; + VerticalScroll.LargeChange = ClientSize.Height / font.Height; + VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; + } + else + { + VerticalScroll.Enabled = false; - VerticalScroll.LargeChange = ClientSize.Height / font.Height; - VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; - } - else - { - VerticalScroll.Enabled = false; + VerticalScroll.Value = 0; + } - VerticalScroll.Value = 0; - } + if (drawnSize.Width > ClientSize.Width) + { + HorizontalScroll.Enabled = true; - if (drawnSize.Width > ClientSize.Width) - { - HorizontalScroll.Enabled = true; + HorizontalScroll.LargeChange = ClientSize.Width; + HorizontalScroll.Maximum = (drawnSize.Width - ClientSize.Width) + HorizontalScroll.LargeChange; + } + else + { + HorizontalScroll.Enabled = false; - HorizontalScroll.LargeChange = ClientSize.Width; - HorizontalScroll.Maximum = (drawnSize.Width - ClientSize.Width) + HorizontalScroll.LargeChange; + HorizontalScroll.Value = 0; + } } - else + catch (Exception ex) { - HorizontalScroll.Enabled = false; - - HorizontalScroll.Value = 0; + Debug.Assert(false); } } From 2d69c563b10139b140889fd19b756fe0d0ad6eea Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 14 Mar 2017 09:45:48 +0100 Subject: [PATCH 010/777] Added repaint on resize. --- UI/MemoryViewControl.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index a19393cc..6f196759 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -696,6 +696,13 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) #region Event Handler + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + + Invalidate(); + } + private void repaintTimer_Tick(object sender, EventArgs e) { if (DesignMode) From d6d42b185d9169764f76a8bb5cff93f8b5184bb7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 16 Mar 2017 15:48:32 +0100 Subject: [PATCH 011/777] Added experimental width calculation. Doesn't work 100% because it can only use default sizes. If possible long values like strings or RTTI information is displayed, the calculation will miss this data. --- Nodes/BaseArrayNode.cs | 15 ++++++++------- Nodes/BaseFunctionNode.cs | 27 +++++++++++++++++++++++---- Nodes/BaseFunctionPtrNode.cs | 8 +++++--- Nodes/BaseHexCommentNode.cs | 11 +++++++++++ Nodes/BaseHexNode.cs | 2 +- Nodes/BaseMatrixNode.cs | 9 +++++---- Nodes/BaseNode.cs | 2 +- Nodes/BaseNumericNode.cs | 2 +- Nodes/BaseTextNode.cs | 2 +- Nodes/BaseTextPtrNode.cs | 2 +- Nodes/BitFieldNode.cs | 6 +++--- Nodes/BoolNode.cs | 2 +- Nodes/ClassInstanceArrayNode.cs | 5 ----- Nodes/ClassInstanceNode.cs | 15 ++++++++------- Nodes/ClassNode.cs | 21 ++++++++++++--------- Nodes/ClassPtrArrayNode.cs | 7 +------ Nodes/ClassPtrNode.cs | 11 +++++++---- Nodes/Matrix3x3Node.cs | 4 ++-- Nodes/Matrix3x4Node.cs | 4 ++-- Nodes/Matrix4x4Node.cs | 4 ++-- Nodes/Vector2Node.cs | 4 ++-- Nodes/Vector3Node.cs | 4 ++-- Nodes/Vector4Node.cs | 4 ++-- Util/Extension.Size.cs | 12 ++++++++++++ Util/Util.cs | 6 ++++++ 25 files changed, 119 insertions(+), 70 deletions(-) create mode 100644 Util/Extension.Size.cs diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 8261fc2c..77277812 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -42,9 +43,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "("); x = AddText(view, x, y, view.Settings.IndexColor, 1, CurrentIndex.ToString()); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, ")"); - x = AddIcon(view, x, y, Icons.RightArrow, 3, HotSpotType.Click); + x = AddIcon(view, x, y, Icons.RightArrow, 3, HotSpotType.Click) + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name} Size={MemorySize}>"); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name} Size={MemorySize}>") + view.Font.Width; x = AddIcon(view, x + 2, y, Icons.Change, 4, exchange); x += view.Font.Width; @@ -77,16 +78,16 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 14 + 5 + 7 + InnerNode.Name.Length + 3) + 3 * Icons.Dimensions, view.Font.Height); if (levelsOpen[view.Level]) { - h += CalculateChildHeight(view); + var childOffset = Icons.Dimensions * 2; + + size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); } - return new Size(500, h); + return size; } - protected abstract int CalculateChildHeight(ViewInfo view); - public override void Update(HotSpot spot) { base.Update(spot); diff --git a/Nodes/BaseFunctionNode.cs b/Nodes/BaseFunctionNode.cs index 02c83f20..7fe87863 100644 --- a/Nodes/BaseFunctionNode.cs +++ b/Nodes/BaseFunctionNode.cs @@ -29,12 +29,12 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) var minWidth = 26 * view.Font.Width; var maxWidth = 0; - foreach (var instruction in instructions) + using (var brush = new SolidBrush(view.Settings.HiddenColor)) { - y += view.Font.Height; - - using (var brush = new SolidBrush(view.Settings.HiddenColor)) + foreach (var instruction in instructions) { + y += view.Font.Height; + var x = AddText(view, tx, y, view.Settings.AddressColor, HotSpot.ReadOnlyId, instruction.Address) + 6; view.Context.FillRectangle(brush, x, y, 1, view.Font.Height); @@ -54,6 +54,25 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) return new Size(maxWidth, y - origY); } + protected Size CalculateInstructionsSize(ViewInfo view) + { + var width = 0; + + // Address +#if WIN64 + width += 16 * view.Font.Width; +#else + width += 8 * view.Font.Width; +#endif + + // Spacer + width += 26; + + width += (26 /* Bytes */ + 15 /* Instruction Text */) * view.Font.Width; + + return new Size(width, instructions.Count * view.Font.Height); + } + protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out int memorySize) { Contract.Requires(memory != null); diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index c94a731d..eb5c8331 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -95,12 +95,14 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 10) + Icons.Dimensions, view.Font.Height); if (levelsOpen[view.Level]) { - h += instructions.Count * view.Font.Height; + var instructionOffset = Icons.Dimensions * 2; + + size = Utils.AggregateNodeSizes(size, CalculateInstructionsSize(view).Extend(instructionOffset, 0)); } - return new Size(500, h); + return size; } private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) diff --git a/Nodes/BaseHexCommentNode.cs b/Nodes/BaseHexCommentNode.cs index d1bdd6b9..ce979d2f 100644 --- a/Nodes/BaseHexCommentNode.cs +++ b/Nodes/BaseHexCommentNode.cs @@ -88,5 +88,16 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu return x; } + + protected override int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) + { + if (view.Settings.ShowCommentFloat) addCharacters += 5; + if (view.Settings.ShowCommentInteger) addCharacters += 7; + + // There may be special info about pointers etc. + addCharacters += 5; + + return base.CalculateWidth(view, addAddressOffset, addName, addComment, addCharacters); + } } } diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index 62344063..7b64de7d 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -90,7 +90,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(500/*CalculateWidth(view, true, false, true, 9 + MemorySize * 3)*/, view.Font.Height); + return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, false, true, 9 + MemorySize * 3), view.Font.Height); } /// Updates the node from the given spot. Sets the value of the selected byte. diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 4295b46a..64023f31 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -1,6 +1,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -104,15 +105,15 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 0), view.Font.Height); if (levelsOpen[view.Level]) { - h += CalculateValuesHeight(view); + size = Utils.AggregateNodeSizes(size, CalculateValuesSize(view)); } - return new Size(500, h); + return size; } - protected abstract int CalculateValuesHeight(ViewInfo view); + protected abstract Size CalculateValuesSize(ViewInfo view); public void Update(HotSpot spot, int max) { diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 895c64b0..919efc6f 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -135,7 +135,7 @@ public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The calculated size. public abstract Size CalculateSize(ViewInfo view); - protected int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) + protected virtual int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) { Contract.Requires(view != null); Contract.Requires(addCharacters >= 0); diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 2dd7351d..75d47fab 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -50,7 +50,7 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(500, view.Font.Height); + return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 15), view.Font.Height); } } } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index dda82c8d..b4098d55 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -61,7 +61,7 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(500, view.Font.Height); + return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 6 + 5 + 100), view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index b5b2a8b1..1a6adef8 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -53,7 +53,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(500, view.Font.Height); + return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 6 + 5 + 100), view.Font.Height); } } } diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index 597326a8..f84971da 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -160,12 +160,12 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 10 + Bits), view.Font.Height); if (levelsOpen[view.Level]) { - h += view.Font.Height + 2; + size.Height += view.Font.Height + 2; } - return new Size(500, h); + return size; } /// Updates the node from the given spot. Sets the value of the selected bit. diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index 8522ddc7..67c77881 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -45,7 +45,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override Size CalculateSize(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(500/*CalculateWidth(view, true, true, true, 13)*/, view.Font.Height); + return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 13), view.Font.Height); } /// Updates the node from the given spot and sets the value. diff --git a/Nodes/ClassInstanceArrayNode.cs b/Nodes/ClassInstanceArrayNode.cs index 3fe9e19f..5c0c1f9d 100644 --- a/Nodes/ClassInstanceArrayNode.cs +++ b/Nodes/ClassInstanceArrayNode.cs @@ -36,10 +36,5 @@ protected override Size DrawChild(ViewInfo view, int x, int y) return InnerNode.Draw(v, x, y); } - - protected override int CalculateChildHeight(ViewInfo view) - { - return InnerNode.CalculateSize(view).Height; - } } } diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index e5facb55..307b30a2 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -42,11 +42,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Instance") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>"); - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType); + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; - x += view.Font.Width; x = AddComment(view, x, y); AddTypeDrop(view, y); @@ -78,12 +77,14 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 11 + InnerNode.Name.Length) + Icons.Dimensions, view.Font.Height); if (levelsOpen[view.Level]) { - h += InnerNode.CalculateSize(view).Height; + var childOffset = Icons.Dimensions * 2; + + size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); } - return new Size(500, h); + return size; } } } diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index f1afc2ea..2d82a3d4 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -6,6 +6,7 @@ using ReClassNET.AddressParser; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -116,6 +117,8 @@ public override Size Draw(ViewInfo view, int x, int y) if (levelsOpen[view.Level]) { + var childOffset = tx - origX; + var nv = view.Clone(); nv.Level++; foreach (var node in Nodes) @@ -125,8 +128,7 @@ public override Size Draw(ViewInfo view, int x, int y) { var innerSize = node.Draw(nv, tx, y); - size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); - size.Height += innerSize.Height; + size = Utils.AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); y += innerSize.Height; } @@ -141,16 +143,14 @@ public override Size Draw(ViewInfo view, int x, int y) // then draw the node... var innerSize = node.Draw(nv, tx, y); - size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); - size.Height += innerSize.Height; + size = Utils.AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); y += innerSize.Height; } else { // or skip drawing and just use the calculated width and height. - size.Width = Math.Max(size.Width, calculatedSize.Width); - size.Height += calculatedSize.Height; + size = Utils.AggregateNodeSizes(size, calculatedSize); y += calculatedSize.Height; } @@ -168,14 +168,17 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var childOffset = Icons.Dimensions * 2; + + var size = new Size(CalculateWidth(view, false, true, true, AddressFormula.Length + 6 + 10), view.Font.Height); if (levelsOpen[view.Level]) { var nv = view.Clone(); nv.Level++; - h += Nodes.Sum(n => n.CalculateSize(nv).Height); + + size = Nodes.Aggregate(size, (s, n) => Utils.AggregateNodeSizes(s, n.CalculateSize(nv).Extend(childOffset, 0))); } - return new Size(500, h); + return size; } public override void Update(HotSpot spot) diff --git a/Nodes/ClassPtrArrayNode.cs b/Nodes/ClassPtrArrayNode.cs index 49a3bee7..131b80c1 100644 --- a/Nodes/ClassPtrArrayNode.cs +++ b/Nodes/ClassPtrArrayNode.cs @@ -12,7 +12,7 @@ public class ClassPtrArrayNode : BaseArrayNode /// Size of the node in bytes. public override int MemorySize => IntPtr.Size * Count; - public override bool PerformCycleCheck => true; + public override bool PerformCycleCheck => false; public override void Intialize() { @@ -46,10 +46,5 @@ protected override Size DrawChild(ViewInfo view, int x, int y) return InnerNode.Draw(v, x, y); } - - protected override int CalculateChildHeight(ViewInfo view) - { - return InnerNode.CalculateSize(view).Height; - } } } diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index e52db9a9..7e2c14b4 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -2,6 +2,7 @@ using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -47,7 +48,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>"); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; x = AddComment(view, x, y); @@ -87,12 +88,14 @@ public override Size CalculateSize(ViewInfo view) return HiddenSize; } - var h = view.Font.Height; + var size = new Size(CalculateWidth(view, true, true, true, 11 + InnerNode.Name.Length) + Icons.Dimensions, view.Font.Height); if (levelsOpen[view.Level]) { - h += InnerNode.CalculateSize(view).Height; + var childOffset = Icons.Dimensions * 2; + + size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); } - return new Size(500, h); + return size; } } } diff --git a/Nodes/Matrix3x3Node.cs b/Nodes/Matrix3x3Node.cs index 3516637e..a10b2384 100644 --- a/Nodes/Matrix3x3Node.cs +++ b/Nodes/Matrix3x3Node.cs @@ -79,9 +79,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 3 * view.Font.Height; + return new Size(46 * view.Font.Width, 3 * view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/Matrix3x4Node.cs b/Nodes/Matrix3x4Node.cs index 663c0ebd..657ec732 100644 --- a/Nodes/Matrix3x4Node.cs +++ b/Nodes/Matrix3x4Node.cs @@ -91,9 +91,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 3 * view.Font.Height; + return new Size(61 * view.Font.Width, 3 * view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/Matrix4x4Node.cs b/Nodes/Matrix4x4Node.cs index 6a51965a..469f1efd 100644 --- a/Nodes/Matrix4x4Node.cs +++ b/Nodes/Matrix4x4Node.cs @@ -112,9 +112,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 4 * view.Font.Height; + return new Size(61 * view.Font.Width, 4 * view.Font.Height); } public override void Update(HotSpot spot) diff --git a/Nodes/Vector2Node.cs b/Nodes/Vector2Node.cs index 008df968..39b69ed9 100644 --- a/Nodes/Vector2Node.cs +++ b/Nodes/Vector2Node.cs @@ -37,9 +37,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 0; + return new Size(13 * view.Font.Width, 0); } public override void Update(HotSpot spot) diff --git a/Nodes/Vector3Node.cs b/Nodes/Vector3Node.cs index 9b08170c..6c0583fd 100644 --- a/Nodes/Vector3Node.cs +++ b/Nodes/Vector3Node.cs @@ -41,9 +41,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 0; + return new Size(20 * view.Font.Width, 0); } public override void Update(HotSpot spot) diff --git a/Nodes/Vector4Node.cs b/Nodes/Vector4Node.cs index f547f4fc..7ef4fe36 100644 --- a/Nodes/Vector4Node.cs +++ b/Nodes/Vector4Node.cs @@ -45,9 +45,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override Size CalculateValuesSize(ViewInfo view) { - return 0; + return new Size(25 * view.Font.Width, 0); } public override void Update(HotSpot spot) diff --git a/Util/Extension.Size.cs b/Util/Extension.Size.cs new file mode 100644 index 00000000..1adc1d21 --- /dev/null +++ b/Util/Extension.Size.cs @@ -0,0 +1,12 @@ +using System.Drawing; + +namespace ReClassNET.Util +{ + public static class SizeExtension + { + public static Size Extend(this Size size, int width, int height) + { + return new Size(size.Width + width, size.Height + height); + } + } +} diff --git a/Util/Util.cs b/Util/Util.cs index 415762ef..88083c9d 100644 --- a/Util/Util.cs +++ b/Util/Util.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Drawing; namespace ReClassNET.Util { @@ -43,5 +44,10 @@ public static T Max(T item1, T item2, Func keySelector, IComparer } return item2; } + + public static Size AggregateNodeSizes(Size baseSize, Size newSize) + { + return new Size(Math.Max(baseSize.Width, newSize.Width), baseSize.Height + newSize.Height); + } } } From 462036e1c94ce14fc8d3690507ef945b677a579e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 16 Mar 2017 15:50:59 +0100 Subject: [PATCH 012/777] GDI rendering matches the calculated width better. --- Nodes/BaseNode.cs | 5 +++-- ReClass.NET.csproj | 2 ++ Util/Extension.Graphics.cs | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 Util/Extension.Graphics.cs diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 919efc6f..e7a010d7 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -265,10 +265,11 @@ protected int AddText(ViewInfo view, int x, int y, Color color, int hitId, strin AddHotSpot(view, rect, text, hitId, HotSpotType.Edit); } - using (var brush = new SolidBrush(color)) + view.Context.DrawStringEx(text, view.Font.Font, color, x, y); + /*using (var brush = new SolidBrush(color)) { view.Context.DrawString(text, view.Font.Font, brush, x, y); - } + }*/ } return x + width; diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 34ae2126..835e52f8 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -251,7 +251,9 @@ + + Form diff --git a/Util/Extension.Graphics.cs b/Util/Extension.Graphics.cs new file mode 100644 index 00000000..01a5ced1 --- /dev/null +++ b/Util/Extension.Graphics.cs @@ -0,0 +1,23 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace ReClassNET.Util +{ + public static class GraphicsExtension + { + /// + /// Use GDI to render normal text because GDI+ doesn't work nicely with long texts and the custom width calculation. + /// But GDI is simple, there is no custom rendering (rotation, scale, ...). So the BitFieldNode uses GDI+ for rendering. + /// + /// The graphics context. + /// The text to render. + /// The font to use. + /// The color to use. + /// The x coordinate. + /// The y coordinate. + public static void DrawStringEx(this Graphics g, string text, Font font, Color color, int x, int y) + { + TextRenderer.DrawText(g, text, font, new Point(x, y), color); + } + } +} From 0793d5a9f1cf5314b5e1bfb8c8ee5321bdea59dc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 25 Mar 2017 00:16:53 +0100 Subject: [PATCH 013/777] Use "static" width calculation. TODO: Revert Node.CalculateSize to old CalculateHeight. --- Nodes/ClassNode.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index 2d82a3d4..b085cb51 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -136,9 +136,10 @@ public override Size Draw(ViewInfo view, int x, int y) { // Otherwise calculate the size... var calculatedSize = node.CalculateSize(nv); + calculatedSize.Width = 0; // and check if the node area overlaps with the visible area... - if (new Rectangle(tx, y, calculatedSize.Width, calculatedSize.Height).IntersectsWith(view.ClientArea)) + if (new Rectangle(tx, y, 9999999, calculatedSize.Height).IntersectsWith(view.ClientArea)) { // then draw the node... var innerSize = node.Draw(nv, tx, y); From dfdcfe09e563310f07459d098e279491917a41cc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 3 Apr 2017 00:17:24 +0200 Subject: [PATCH 014/777] Reimplemented BaseNode.CalculateDrawnHeight() --- DataExchange/ReClassFile.cs | 2 +- Nodes/BaseArrayNode.cs | 12 ++++---- Nodes/BaseFunctionNode.cs | 19 ------------ Nodes/BaseFunctionPtrNode.cs | 12 ++++---- Nodes/BaseHexCommentNode.cs | 11 ------- Nodes/BaseHexNode.cs | 4 +-- Nodes/BaseMatrixNode.cs | 12 ++++---- Nodes/BaseNode.cs | 58 +++++------------------------------- Nodes/BaseNumericNode.cs | 4 +-- Nodes/BaseTextNode.cs | 4 +-- Nodes/BaseTextPtrNode.cs | 4 +-- Nodes/BitFieldNode.cs | 10 +++---- Nodes/BoolNode.cs | 4 +-- Nodes/ClassInstanceNode.cs | 12 ++++---- Nodes/ClassNode.cs | 26 +++++++--------- Nodes/ClassPtrNode.cs | 12 ++++---- Nodes/FunctionNode.cs | 10 +++---- Nodes/Matrix3x3Node.cs | 4 +-- Nodes/Matrix3x4Node.cs | 4 +-- Nodes/Matrix4x4Node.cs | 4 +-- Nodes/VTableNode.cs | 10 +++---- Nodes/Vector2Node.cs | 4 +-- Nodes/Vector3Node.cs | 4 +-- Nodes/Vector4Node.cs | 4 +-- UI/MemoryPreviewToolTip.cs | 2 +- 25 files changed, 83 insertions(+), 169 deletions(-) diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index f23f016f..4fe07fad 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -296,7 +296,7 @@ public override int MemorySize get { throw new NotImplementedException(); } } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { throw new NotImplementedException(); } diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 77277812..9b0544eb 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -71,21 +71,19 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan protected abstract Size DrawChild(ViewInfo view, int x, int y); - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 14 + 5 + 7 + InnerNode.Name.Length + 3) + 3 * Icons.Dimensions, view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - var childOffset = Icons.Dimensions * 2; - - size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); + height += InnerNode.CalculateDrawnHeight(view); } - return size; + return height; } public override void Update(HotSpot spot) diff --git a/Nodes/BaseFunctionNode.cs b/Nodes/BaseFunctionNode.cs index 7fe87863..a0f5924f 100644 --- a/Nodes/BaseFunctionNode.cs +++ b/Nodes/BaseFunctionNode.cs @@ -54,25 +54,6 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) return new Size(maxWidth, y - origY); } - protected Size CalculateInstructionsSize(ViewInfo view) - { - var width = 0; - - // Address -#if WIN64 - width += 16 * view.Font.Width; -#else - width += 8 * view.Font.Width; -#endif - - // Spacer - width += 26; - - width += (26 /* Bytes */ + 15 /* Instruction Text */) * view.Font.Width; - - return new Size(width, instructions.Count * view.Font.Height); - } - protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out int memorySize) { Contract.Requires(memory != null); diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index eb5c8331..3567c1ff 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -88,21 +88,19 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 10) + Icons.Dimensions, view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - var instructionOffset = Icons.Dimensions * 2; - - size = Utils.AggregateNodeSizes(size, CalculateInstructionsSize(view).Extend(instructionOffset, 0)); + height += instructions.Count * view.Font.Height; } - return size; + return height; } private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) diff --git a/Nodes/BaseHexCommentNode.cs b/Nodes/BaseHexCommentNode.cs index ce979d2f..d1bdd6b9 100644 --- a/Nodes/BaseHexCommentNode.cs +++ b/Nodes/BaseHexCommentNode.cs @@ -88,16 +88,5 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu return x; } - - protected override int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) - { - if (view.Settings.ShowCommentFloat) addCharacters += 5; - if (view.Settings.ShowCommentInteger) addCharacters += 7; - - // There may be special info about pointers etc. - addCharacters += 5; - - return base.CalculateWidth(view, addAddressOffset, addName, addComment, addCharacters); - } } } diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index 7b64de7d..1dc62435 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -88,9 +88,9 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) return new Size(x - origX, view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, false, true, 9 + MemorySize * 3), view.Font.Height); + return IsHidden ? HiddenHeight : view.Font.Height; } /// Updates the node from the given spot. Sets the value of the selected byte. diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 64023f31..1b12e3b8 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -98,22 +98,22 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect return new Size(x - origX, y - origY + view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 0), view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - size = Utils.AggregateNodeSizes(size, CalculateValuesSize(view)); + height += CalculateValuesHeight(view); } - return size; + return height; } - protected abstract Size CalculateValuesSize(ViewInfo view); + protected abstract int CalculateValuesHeight(ViewInfo view); public void Update(HotSpot spot, int max) { diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index e7a010d7..1aecb431 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -20,7 +20,7 @@ public abstract class BaseNode internal static readonly List NodeInfoReader = new List(); protected static readonly int TextPadding = Icons.Dimensions; - protected static readonly Size HiddenSize = new Size(0, 1); + protected static readonly int HiddenHeight = 1; private static int NodeIndex = 0; @@ -127,57 +127,13 @@ public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) public abstract Size Draw(ViewInfo view, int x, int y); /// - /// Calculates the size of the node if drawn. + /// Calculates the height of the node if drawn. /// This method is used to determine if a node outside the visible area should be drawn. - /// The returned size must be equal to the size which is returned by the method. + /// The returned height must be equal to the height which is returned by the method. /// /// The view information. - /// The calculated size. - public abstract Size CalculateSize(ViewInfo view); - - protected virtual int CalculateWidth(ViewInfo view, bool addAddressOffset, bool addName, bool addComment, int addCharacters) - { - Contract.Requires(view != null); - Contract.Requires(addCharacters >= 0); - - var width = 0; - - width += TextPadding; - width += Icons.Dimensions; - - if (addAddressOffset) - { - if (view.Settings.ShowNodeOffset) - { - addCharacters += 4; - width += view.Font.Width; - } - if (view.Settings.ShowNodeAddress) - { -#if WIN64 - addCharacters += 16; -#else - addCharacters += 8; -#endif - width += view.Font.Width; - } - } - - if (addName) - { - addCharacters += Name.Length; - } - - if (addComment) - { - addCharacters += 2 + Comment.Length; - width += view.Font.Width; - } - - width += addCharacters * view.Font.Width; - - return width; - } + /// The calculated height. + public abstract int CalculateDrawnHeight(ViewInfo view); /// Updates the node from the given . Sets the and of the node. /// The spot. @@ -442,7 +398,7 @@ protected Size DrawHidden(ViewInfo view, int x, int y) view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); } - return new Size(0, HiddenSize.Height); + return new Size(0, HiddenHeight); } } @@ -466,7 +422,7 @@ public override Size Draw(ViewInfo view, int x, int y) throw new NotImplementedException(); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { Contract.Requires(view != null); diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 75d47fab..14a1e3ff 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -48,9 +48,9 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, return new Size(x - origX, view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 15), view.Font.Height); + return IsHidden ? HiddenHeight : view.Font.Height; } } } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index b4098d55..e34cddd0 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -59,9 +59,9 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st return new Size(x - origX, view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 6 + 5 + 100), view.Font.Height); + return IsHidden ? HiddenHeight : view.Font.Height; } public override void Update(HotSpot spot) diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index 1a6adef8..cdbeab14 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -51,9 +51,9 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) return new Size(x - origX, view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 6 + 5 + 100), view.Font.Height); + return IsHidden ? HiddenHeight : view.Font.Height; } } } diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index f84971da..7a92d48d 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -153,19 +153,19 @@ public override Size Draw(ViewInfo view, int x, int y) return new Size(x - origX, y - origY + view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 10 + Bits), view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - size.Height += view.Font.Height + 2; + height += view.Font.Height + 2; } - return size; + return height; } /// Updates the node from the given spot. Sets the value of the selected bit. diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index 67c77881..4875e2d4 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -43,9 +43,9 @@ public override Size Draw(ViewInfo view, int x, int y) return new Size(x - origX, view.Font.Height); } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenSize : new Size(CalculateWidth(view, true, true, true, 13), view.Font.Height); + return IsHidden ? HiddenHeight : view.Font.Height; } /// Updates the node from the given spot and sets the value. diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index 307b30a2..6c5a12f8 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -70,21 +70,19 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 11 + InnerNode.Name.Length) + Icons.Dimensions, view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - var childOffset = Icons.Dimensions * 2; - - size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); + height += InnerNode.CalculateDrawnHeight(view); } - return size; + return height; } } } diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index b085cb51..0a591df9 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -134,12 +134,11 @@ public override Size Draw(ViewInfo view, int x, int y) } else { - // Otherwise calculate the size... - var calculatedSize = node.CalculateSize(nv); - calculatedSize.Width = 0; + // Otherwise calculate the height... + var calculatedHeight = node.CalculateDrawnHeight(nv); // and check if the node area overlaps with the visible area... - if (new Rectangle(tx, y, 9999999, calculatedSize.Height).IntersectsWith(view.ClientArea)) + if (new Rectangle(tx, y, 9999999, calculatedHeight).IntersectsWith(view.ClientArea)) { // then draw the node... var innerSize = node.Draw(nv, tx, y); @@ -150,10 +149,10 @@ public override Size Draw(ViewInfo view, int x, int y) } else { - // or skip drawing and just use the calculated width and height. - size = Utils.AggregateNodeSizes(size, calculatedSize); + // or skip drawing and just use the calculated height. + size = Utils.AggregateNodeSizes(size, new Size(0, calculatedHeight)); - y += calculatedSize.Height; + y += calculatedHeight; } } } @@ -162,24 +161,21 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var childOffset = Icons.Dimensions * 2; - - var size = new Size(CalculateWidth(view, false, true, true, AddressFormula.Length + 6 + 10), view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { var nv = view.Clone(); nv.Level++; - - size = Nodes.Aggregate(size, (s, n) => Utils.AggregateNodeSizes(s, n.CalculateSize(nv).Extend(childOffset, 0))); + height += Nodes.Sum(n => n.CalculateDrawnHeight(nv)); } - return size; + return height; } public override void Update(HotSpot spot) diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index 7e2c14b4..0e7076a9 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -81,21 +81,19 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var size = new Size(CalculateWidth(view, true, true, true, 11 + InnerNode.Name.Length) + Icons.Dimensions, view.Font.Height); + var height = view.Font.Height; if (levelsOpen[view.Level]) { - var childOffset = Icons.Dimensions * 2; - - size = Utils.AggregateNodeSizes(size, InnerNode.CalculateSize(view).Extend(childOffset, 0)); + height += InnerNode.CalculateDrawnHeight(view); } - return size; + return height; } } } diff --git a/Nodes/FunctionNode.cs b/Nodes/FunctionNode.cs index 22954184..98931c9c 100644 --- a/Nodes/FunctionNode.cs +++ b/Nodes/FunctionNode.cs @@ -84,19 +84,19 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var h = view.Font.Height; + var height = view.Font.Height; if (levelsOpen[view.Level]) { - h += instructions.Count * view.Font.Height; + height += instructions.Count * view.Font.Height; } - return new Size(500, h); + return height; } public override void Update(HotSpot spot) diff --git a/Nodes/Matrix3x3Node.cs b/Nodes/Matrix3x3Node.cs index a10b2384..3516637e 100644 --- a/Nodes/Matrix3x3Node.cs +++ b/Nodes/Matrix3x3Node.cs @@ -79,9 +79,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(46 * view.Font.Width, 3 * view.Font.Height); + return 3 * view.Font.Height; } public override void Update(HotSpot spot) diff --git a/Nodes/Matrix3x4Node.cs b/Nodes/Matrix3x4Node.cs index 657ec732..663c0ebd 100644 --- a/Nodes/Matrix3x4Node.cs +++ b/Nodes/Matrix3x4Node.cs @@ -91,9 +91,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(61 * view.Font.Width, 3 * view.Font.Height); + return 3 * view.Font.Height; } public override void Update(HotSpot spot) diff --git a/Nodes/Matrix4x4Node.cs b/Nodes/Matrix4x4Node.cs index 469f1efd..6a51965a 100644 --- a/Nodes/Matrix4x4Node.cs +++ b/Nodes/Matrix4x4Node.cs @@ -112,9 +112,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(61 * view.Font.Width, 4 * view.Font.Height); + return 4 * view.Font.Height; } public override void Update(HotSpot spot) diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index afbf9c58..673b3102 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -88,19 +88,19 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override Size CalculateSize(ViewInfo view) + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden) { - return HiddenSize; + return HiddenHeight; } - var h = view.Font.Height; + var height = view.Font.Height; if (levelsOpen[view.Level]) { - h += nodes.Sum(n => n.CalculateSize(view).Height); + height += nodes.Sum(n => n.CalculateDrawnHeight(view)); } - return new Size(500, h); + return height; } public override bool ReplaceChildNode(int index, Type nodeType, ref List createdNodes) => false; diff --git a/Nodes/Vector2Node.cs b/Nodes/Vector2Node.cs index 39b69ed9..008df968 100644 --- a/Nodes/Vector2Node.cs +++ b/Nodes/Vector2Node.cs @@ -37,9 +37,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(13 * view.Font.Width, 0); + return 0; } public override void Update(HotSpot spot) diff --git a/Nodes/Vector3Node.cs b/Nodes/Vector3Node.cs index 6c0583fd..9b08170c 100644 --- a/Nodes/Vector3Node.cs +++ b/Nodes/Vector3Node.cs @@ -41,9 +41,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(20 * view.Font.Width, 0); + return 0; } public override void Update(HotSpot spot) diff --git a/Nodes/Vector4Node.cs b/Nodes/Vector4Node.cs index 7ef4fe36..f547f4fc 100644 --- a/Nodes/Vector4Node.cs +++ b/Nodes/Vector4Node.cs @@ -45,9 +45,9 @@ public override Size Draw(ViewInfo view, int x2, int y2) }); } - protected override Size CalculateValuesSize(ViewInfo view) + protected override int CalculateValuesHeight(ViewInfo view) { - return new Size(25 * view.Font.Width, 0); + return 0; } public override void Update(HotSpot spot) diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewToolTip.cs index a42909f9..7cbc0832 100644 --- a/UI/MemoryPreviewToolTip.cs +++ b/UI/MemoryPreviewToolTip.cs @@ -61,7 +61,7 @@ public MemoryPreviewToolTip() private void OnPopup(object sender, PopupEventArgs e) { size.Width = ToolTipWidth; - size.Height = nodes.Sum(n => n.CalculateSize(viewInfo).Height) + ToolTipPadding; + size.Height = nodes.Sum(n => n.CalculateDrawnHeight(viewInfo)) + ToolTipPadding; e.ToolTipSize = size; From 6568f6849a3d90199e46dd1094f59e152a133ffa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 17 Apr 2017 23:24:12 +0200 Subject: [PATCH 015/777] VS2017 update. --- NativeCore/ReClassNET_Plugin.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index c326ab91..a12c7ad6 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -252,7 +252,7 @@ struct DebugRegister7 inline void MultiByteToUnicode(const char* src, RC_UnicodeChar* dst, int size) { -#if _MSC_VER == 1900 +#if _MSC_VER >= 1900 // VS Bug: https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t auto temp = std::wstring_convert, int16_t>{}.from_bytes(src); From 53a10f50acfb6f13b383117f850bff50f7fd9df3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 18 Apr 2017 14:15:51 +0200 Subject: [PATCH 016/777] Fixed string reading with wrong offset. --- Memory/MemoryBuffer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index d8922b63..1fdc3edc 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -215,7 +215,7 @@ private string ReadString(Encoding encoding, int offset, int length) length = data.Length - Offset - offset; } - var sb = new StringBuilder(encoding.GetString(data, offset, length)); + var sb = new StringBuilder(encoding.GetString(data, Offset + offset, length)); for (var i = 0; i < sb.Length; ++i) { if (!sb[i].IsPrintable()) From f1527332fc5e87e7d9d204cd518023b3caf3cce9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 18 Apr 2017 14:53:10 +0200 Subject: [PATCH 017/777] Fixed wrong formula parsing. --- AddressParser/AstBuilder.cs | 2 +- AddressParser/Token.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AddressParser/AstBuilder.cs b/AddressParser/AstBuilder.cs index 957242da..bf26011e 100644 --- a/AddressParser/AstBuilder.cs +++ b/AddressParser/AstBuilder.cs @@ -103,7 +103,7 @@ private void PopOperations(bool untillLeftBracket) if (operatorStack.Count > 0 && operatorStack.Peek().TokenType == TokenType.LeftBracket) { operatorStack.Pop(); - operatorStack.Push(new Token(TokenType.ReadPointer, '\r')); + resultStack.Push(ConvertOperation(new Token(TokenType.ReadPointer, '\r'))); } else { diff --git a/AddressParser/Token.cs b/AddressParser/Token.cs index 873e37d2..16e4a3e4 100644 --- a/AddressParser/Token.cs +++ b/AddressParser/Token.cs @@ -4,7 +4,7 @@ namespace ReClassNET.AddressParser { - enum TokenType + internal enum TokenType { Offset, ModuleOffset, @@ -14,7 +14,7 @@ enum TokenType ReadPointer } - class Token + internal class Token { /// The type of the token. public TokenType TokenType { get; } From b2a412ffce5c8bd4089754dc945b4df5d74335b7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 18 Apr 2017 14:53:43 +0200 Subject: [PATCH 018/777] What to do with read errors? --- Memory/MemoryBuffer.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index 1fdc3edc..c9697445 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -88,7 +88,11 @@ public void Update(IntPtr address, bool setHistory) hasHistory = true; } - Process.ReadRemoteMemoryIntoBuffer(address, ref data); + if (!Process.ReadRemoteMemoryIntoBuffer(address, ref data)) + { + // What to do with failed reads? Set all bytes to zero? + data.FillWithZero(); + } } public byte ReadByte(IntPtr offset) From aa6b313a37f53ae80ecbd42689c86b8ec9aeb1f2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 25 Apr 2017 21:38:44 +0200 Subject: [PATCH 019/777] Added ContainsValidData. Added invalid memory indicator. --- Memory/MemoryBuffer.cs | 14 ++++++++++---- Nodes/BaseArrayNode.cs | 2 ++ Nodes/BaseFunctionPtrNode.cs | 2 ++ Nodes/BaseHexNode.cs | 2 ++ Nodes/BaseMatrixNode.cs | 4 ++++ Nodes/BaseNode.cs | 11 +++++++++++ Nodes/BaseNumericNode.cs | 2 ++ Nodes/BaseTextNode.cs | 2 ++ Nodes/BaseTextPtrNode.cs | 2 ++ Nodes/BitFieldNode.cs | 2 ++ Nodes/BoolNode.cs | 2 ++ Nodes/ClassInstanceNode.cs | 2 ++ Nodes/ClassPtrNode.cs | 2 ++ Nodes/FunctionNode.cs | 2 ++ Nodes/VTableNode.cs | 2 ++ 15 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index c9697445..4bb4c25f 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -8,12 +8,12 @@ namespace ReClassNET.Memory { public class MemoryBuffer { - public RemoteProcess Process { get; set; } - private byte[] data; private byte[] historyData; private bool hasHistory; + public RemoteProcess Process { get; set; } + public int Size { get @@ -34,6 +34,8 @@ public int Size public int Offset { get; set; } + public bool ContainsValidData { get; private set; } + [ContractInvariantMethod] private void ObjectInvariants() { @@ -48,6 +50,8 @@ public MemoryBuffer() data = new byte[0]; historyData = new byte[0]; + + ContainsValidData = true; } public MemoryBuffer(MemoryBuffer other) @@ -59,6 +63,8 @@ public MemoryBuffer(MemoryBuffer other) data = other.data; historyData = other.historyData; hasHistory = other.hasHistory; + + ContainsValidData = other.ContainsValidData; } public MemoryBuffer Clone() @@ -88,9 +94,9 @@ public void Update(IntPtr address, bool setHistory) hasHistory = true; } - if (!Process.ReadRemoteMemoryIntoBuffer(address, ref data)) + ContainsValidData = Process.ReadRemoteMemoryIntoBuffer(address, ref data); + if (!ContainsValidData) { - // What to do with failed reads? Set all bytes to zero? data.FillWithZero(); } } diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 9b0544eb..79d539a9 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -22,6 +22,8 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index 3567c1ff..677210f0 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -33,6 +33,8 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index 1dc62435..2dd70a74 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -33,6 +33,8 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 1b12e3b8..8ee08529 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -25,6 +25,8 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; @@ -69,6 +71,8 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 1aecb431..448705fa 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -400,6 +400,17 @@ protected Size DrawHidden(ViewInfo view, int x, int y) return new Size(0, HiddenHeight); } + + /// Draws an error indicator if the used memory buffer is not valid. + /// The view information. + /// The y coordinate. + protected void DrawInvalidMemoryIndicator(ViewInfo view, int y) + { + if (!view.Memory.ContainsValidData) + { + view.Context.DrawImage(Properties.Resources.B16x16_Error, 2, y); + } + } } [ContractClassFor(typeof(BaseNode))] diff --git a/Nodes/BaseNumericNode.cs b/Nodes/BaseNumericNode.cs index 14a1e3ff..1bdb0dfe 100644 --- a/Nodes/BaseNumericNode.cs +++ b/Nodes/BaseNumericNode.cs @@ -26,6 +26,8 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index e34cddd0..1683c69c 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -33,6 +33,8 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/BaseTextPtrNode.cs b/Nodes/BaseTextPtrNode.cs index cdbeab14..7c6f1470 100644 --- a/Nodes/BaseTextPtrNode.cs +++ b/Nodes/BaseTextPtrNode.cs @@ -28,6 +28,8 @@ public Size DrawText(ViewInfo view, int x, int y, string type, string text) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/BitFieldNode.cs b/Nodes/BitFieldNode.cs index 7a92d48d..d137395e 100644 --- a/Nodes/BitFieldNode.cs +++ b/Nodes/BitFieldNode.cs @@ -101,6 +101,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index 4875e2d4..469dd4fd 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -20,6 +20,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/ClassInstanceNode.cs b/Nodes/ClassInstanceNode.cs index 6c5a12f8..6c661c28 100644 --- a/Nodes/ClassInstanceNode.cs +++ b/Nodes/ClassInstanceNode.cs @@ -30,6 +30,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index 0e7076a9..d5584612 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -35,6 +35,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; diff --git a/Nodes/FunctionNode.cs b/Nodes/FunctionNode.cs index 98931c9c..877958d3 100644 --- a/Nodes/FunctionNode.cs +++ b/Nodes/FunctionNode.cs @@ -34,6 +34,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; AddSelection(view, x, y, view.Font.Height); diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index 673b3102..fe22793b 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -41,6 +41,8 @@ public override Size Draw(ViewInfo view, int x, int y) return DrawHidden(view, x, y); } + DrawInvalidMemoryIndicator(view, y); + var origX = x; var origY = y; From 524655c51ca13a5ad27dc9a2b9d04579bf8bd302 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 27 Apr 2017 13:39:09 +0200 Subject: [PATCH 020/777] Fixed loading of ReClass file with a ClassPtrArrayNode. --- DataExchange/ReClassFile.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index 4fe07fad..6e781543 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -28,6 +28,10 @@ public ReClassFile(ReClassNetProject project) public void Load(string filePath, ILogger logger) { var document = XDocument.Load(filePath); + if (document.Root == null) + { + return; + } Type[] typeMap = null; @@ -256,7 +260,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { int count; TryGetAttributeValue(element, "Size", out count, logger); - classInstanceArrayNode.Count = count / IntPtr.Size; + classPtrArrayNode.Count = count / IntPtr.Size; } var textNode = node as BaseTextNode; if (textNode != null) From a422b871cf118fdfcc157d8e9c43ac9ffebfc96c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 27 Apr 2017 13:56:41 +0200 Subject: [PATCH 021/777] Various small changes. --- CodeGenerator/ICodeGenerator.cs | 8 +------- DataExchange/ReClass2007File.cs | 2 +- DataExchange/ReClassFile.cs | 5 +---- DataExchange/ReClassNetFile.Read.cs | 9 +++++++-- DataExchange/ReClassNetFile.Write.cs | 12 +++++------- DataExchange/ReClassQtFile.cs | 4 ++++ Debugger/IBreakpoint.cs | 8 +------- Debugger/RemoteDebugger.cs | 8 ++++---- Forms/PluginForm.cs | 2 -- Memory/UnionDataType.cs | 4 ++-- Nodes/BaseArrayNode.cs | 1 - Nodes/BaseContainerNode.cs | 4 ++++ Nodes/BaseMatrixNode.cs | 1 - Nodes/BitFieldNode.cs | 2 +- Nodes/ClassNode.cs | 2 +- Nodes/ClassPtrNode.cs | 1 - Properties/AssemblyInfo.cs | 1 - Symbols/SymbolReader.cs | 2 +- Symbols/SymbolStore.cs | 6 +++++- UI/BannerBox.cs | 6 +++--- UI/ClassNodeView.cs | 2 +- UI/ColorBox.cs | 6 +++--- UI/MemoryPreviewToolTip.cs | 8 ++++---- UI/MemoryViewControl.cs | 22 +++++++++++----------- UI/ScrollableCustomControl.cs | 6 +++--- UI/SettingsCheckBox.cs | 4 ++-- UI/SettingsTextBox.cs | 4 ++-- Util/Extension.RichTextBox.cs | 4 ++-- 28 files changed, 69 insertions(+), 75 deletions(-) diff --git a/CodeGenerator/ICodeGenerator.cs b/CodeGenerator/ICodeGenerator.cs index a45f76cc..9cd6ade1 100644 --- a/CodeGenerator/ICodeGenerator.cs +++ b/CodeGenerator/ICodeGenerator.cs @@ -22,13 +22,7 @@ public interface ICodeGenerator [ContractClassFor(typeof(ICodeGenerator))] internal abstract class ICodeGeneratorContract : ICodeGenerator { - public Language Language - { - get - { - throw new NotImplementedException(); - } - } + public Language Language => throw new NotImplementedException(); public string GenerateCode(IEnumerable classes, ILogger logger) { diff --git a/DataExchange/ReClass2007File.cs b/DataExchange/ReClass2007File.cs index 218f6707..9904a58e 100644 --- a/DataExchange/ReClass2007File.cs +++ b/DataExchange/ReClass2007File.cs @@ -47,7 +47,7 @@ public ReClass2007File(ReClassNetProject project) public void Load(string filePath, ILogger logger) { - using (var connection = new SQLiteConnection($@"Data Source={filePath}")) + using (var connection = new SQLiteConnection($"Data Source={filePath}")) { connection.Open(); diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index 6e781543..ba85a26c 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -295,10 +295,7 @@ private static void TryGetAttributeValue(XElement element, string attribute, out /// Dummy node to represent the ReClass Custom node. private class CustomNode : BaseNode { - public override int MemorySize - { - get { throw new NotImplementedException(); } - } + public override int MemorySize => throw new NotImplementedException(); public override int CalculateDrawnHeight(ViewInfo view) { diff --git a/DataExchange/ReClassNetFile.Read.cs b/DataExchange/ReClassNetFile.Read.cs index d2ff4273..f4c46a6e 100644 --- a/DataExchange/ReClassNetFile.Read.cs +++ b/DataExchange/ReClassNetFile.Read.cs @@ -36,8 +36,13 @@ public void Load(Stream input, ILogger logger) using (var entryStream = dataEntry.Open()) { var document = XDocument.Load(entryStream); + if (document.Root == null) + { + logger.Log(LogLevel.Error, "File has not the correct format."); + return; + } - var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; var platform = document.Root.Attribute(XmlTypeAttribute)?.Value; if (platform != Constants.Platform) { @@ -101,7 +106,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } Type nodeType; - if (!BuildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value, out nodeType)) + if (!BuildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out nodeType)) { logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(XmlTypeAttribute)?.Value}"); logger.Log(LogLevel.Warning, element.ToString()); diff --git a/DataExchange/ReClassNetFile.Write.cs b/DataExchange/ReClassNetFile.Write.cs index a1354bd2..15c373b2 100644 --- a/DataExchange/ReClassNetFile.Write.cs +++ b/DataExchange/ReClassNetFile.Write.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; using System.IO.Compression; @@ -142,8 +141,7 @@ public static void WriteNodes(Stream output, IEnumerable nodes, ILogge using (var project = new ReClassNetProject()) { - Action recursiveAddReferences = null; - recursiveAddReferences = delegate (BaseReferenceNode referenceNode) + void RecursiveAddReferences(BaseReferenceNode referenceNode) { if (project.ContainsClass(referenceNode.InnerNode.Uuid)) { @@ -154,9 +152,9 @@ public static void WriteNodes(Stream output, IEnumerable nodes, ILogge foreach (var reference in referenceNode.InnerNode.Nodes.OfType()) { - recursiveAddReferences(reference); + RecursiveAddReferences(reference); } - }; + } var serialisationClass = new ClassNode(false) { @@ -178,7 +176,7 @@ public static void WriteNodes(Stream output, IEnumerable nodes, ILogge var referenceNode = node as BaseReferenceNode; if (referenceNode != null) { - recursiveAddReferences(referenceNode); + RecursiveAddReferences(referenceNode); } serialisationClass.AddNode(node); diff --git a/DataExchange/ReClassQtFile.cs b/DataExchange/ReClassQtFile.cs index 8be440f3..92927a85 100644 --- a/DataExchange/ReClassQtFile.cs +++ b/DataExchange/ReClassQtFile.cs @@ -26,6 +26,10 @@ public ReClassQtFile(ReClassNetProject project) public void Load(string filePath, ILogger logger) { var document = XDocument.Load(filePath); + if (document.Root == null) + { + return; + } var classes = new List>(); diff --git a/Debugger/IBreakpoint.cs b/Debugger/IBreakpoint.cs index ce990017..497a7722 100644 --- a/Debugger/IBreakpoint.cs +++ b/Debugger/IBreakpoint.cs @@ -19,13 +19,7 @@ public interface IBreakpoint [ContractClassFor(typeof(IBreakpoint))] internal abstract class IBreakpointContract : IBreakpoint { - public IntPtr Address - { - get - { - throw new NotImplementedException(); - } - } + public IntPtr Address => throw new NotImplementedException(); public void Handler(ref DebugEvent evt) { diff --git a/Debugger/RemoteDebugger.cs b/Debugger/RemoteDebugger.cs index d84fa73a..8d031fde 100644 --- a/Debugger/RemoteDebugger.cs +++ b/Debugger/RemoteDebugger.cs @@ -87,12 +87,12 @@ public void FindCodeByBreakpoint(IntPtr address, int size, HardwareBreakpointTri } }; - BreakpointHandler handler = delegate (IBreakpoint bp, ref DebugEvent evt) + void HandleBreakpoint(IBreakpoint bp, ref DebugEvent evt) { fcf.AddRecord(evt.ExceptionInfo); - }; + } - var breakpoint = new HardwareBreakpoint(breakpointList[0].Address, register, trigger, (HardwareBreakpointSize)breakpointList[0].Size, handler); + var breakpoint = new HardwareBreakpoint(breakpointList[0].Address, register, trigger, (HardwareBreakpointSize)breakpointList[0].Size, HandleBreakpoint); try { AddBreakpoint(breakpoint); @@ -117,7 +117,7 @@ public void FindCodeByBreakpoint(IntPtr address, int size, HardwareBreakpointTri break; } - breakpoint = new HardwareBreakpoint(split.Address, register, trigger, (HardwareBreakpointSize)split.Size, handler); + breakpoint = new HardwareBreakpoint(split.Address, register, trigger, (HardwareBreakpointSize)split.Size, HandleBreakpoint); AddBreakpoint(breakpoint); localBreakpoints.Add(breakpoint); } diff --git a/Forms/PluginForm.cs b/Forms/PluginForm.cs index 77a785f5..24f3558e 100644 --- a/Forms/PluginForm.cs +++ b/Forms/PluginForm.cs @@ -12,7 +12,6 @@ namespace ReClassNET.Forms { public partial class PluginForm : IconForm { - private readonly PluginManager pluginManager; private readonly CoreFunctionsManager coreFunctions; private class PluginInfoRow @@ -39,7 +38,6 @@ internal PluginForm(PluginManager pluginManager, CoreFunctionsManager coreFuncti Contract.Requires(pluginManager != null); Contract.Requires(coreFunctions != null); - this.pluginManager = pluginManager; this.coreFunctions = coreFunctions; InitializeComponent(); diff --git a/Memory/UnionDataType.cs b/Memory/UnionDataType.cs index f8dd6bf8..806490a6 100644 --- a/Memory/UnionDataType.cs +++ b/Memory/UnionDataType.cs @@ -29,12 +29,12 @@ struct UInt32FloatData [FieldOffset(0)] public int IntValue; - public IntPtr IntPtr => unchecked((IntPtr)IntValue); + public IntPtr IntPtr => (IntPtr)IntValue; [FieldOffset(0)] public uint UIntValue; - public UIntPtr UIntPtr => unchecked((UIntPtr)UIntValue); + public UIntPtr UIntPtr => (UIntPtr)UIntValue; [FieldOffset(0)] public float FloatValue; diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 79d539a9..61c56f91 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -2,7 +2,6 @@ using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { diff --git a/Nodes/BaseContainerNode.cs b/Nodes/BaseContainerNode.cs index 5aed49e2..4000fa18 100644 --- a/Nodes/BaseContainerNode.cs +++ b/Nodes/BaseContainerNode.cs @@ -76,6 +76,10 @@ public virtual bool ReplaceChildNode(int index, Type nodeType, ref ListPossible values: 64, 32, 16, 8 public int Bits { - get { return bits; } + get => bits; set { Contract.Ensures(bits > 0); diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index 0a591df9..c24440ee 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -28,7 +28,7 @@ public class ClassNode : BaseContainerNode private NodeUuid uuid; public NodeUuid Uuid { - get { return uuid; } + get => uuid; set { Contract.Requires(value != null); diff --git a/Nodes/ClassPtrNode.cs b/Nodes/ClassPtrNode.cs index d5584612..dc64fd2d 100644 --- a/Nodes/ClassPtrNode.cs +++ b/Nodes/ClassPtrNode.cs @@ -2,7 +2,6 @@ using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 148acb51..8d5ac55d 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Allgemeine Informationen über eine Assembly werden über die folgenden diff --git a/Symbols/SymbolReader.cs b/Symbols/SymbolReader.cs index 3c1a4f7d..1184c718 100644 --- a/Symbols/SymbolReader.cs +++ b/Symbols/SymbolReader.cs @@ -97,7 +97,7 @@ public string GetSymbolString(IntPtr address, Module module) using (var symbol = new ComDisposableWrapper(diaSymbol)) { var sb = new StringBuilder(); - ReadSymbol(diaSymbol, sb); + ReadSymbol(symbol.Interface, sb); return sb.ToString(); } } diff --git a/Symbols/SymbolStore.cs b/Symbols/SymbolStore.cs index f00e1645..5088d65c 100644 --- a/Symbols/SymbolStore.cs +++ b/Symbols/SymbolStore.cs @@ -189,7 +189,11 @@ public void LoadSymbolsFromPDB(string path) return; } - var moduleName = Path.GetFileName(path).ToLower(); + var moduleName = Path.GetFileName(path)?.ToLower(); + if (string.IsNullOrEmpty(moduleName)) + { + return; + } bool createNew; lock (symbolReaders) diff --git a/UI/BannerBox.cs b/UI/BannerBox.cs index b0c238a7..78bae320 100644 --- a/UI/BannerBox.cs +++ b/UI/BannerBox.cs @@ -16,11 +16,11 @@ public class BannerBox : Control, ISupportInitialize private Image image; - public Image Icon { get { return icon; } set { icon = value; UpdateBanner(); } } + public Image Icon { get => icon; set { icon = value; UpdateBanner(); } } - public string Title { get { return title; } set { title = value ?? string.Empty; UpdateBanner(); } } + public string Title { get => title; set { title = value ?? string.Empty; UpdateBanner(); } } - public override string Text { get { return text; } set { text = value ?? string.Empty; UpdateBanner(); } } + public override string Text { get => text; set { text = value ?? string.Empty; UpdateBanner(); } } public BannerBox() { diff --git a/UI/ClassNodeView.cs b/UI/ClassNodeView.cs index 7cc9d5a6..fc99d7a4 100644 --- a/UI/ClassNodeView.cs +++ b/UI/ClassNodeView.cs @@ -128,7 +128,7 @@ private void RebuildClassHierarchy(HashSet seen) [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ReClassNetProject Project { - get { return project; } + get => project; set { Contract.Requires(value != null); diff --git a/UI/ColorBox.cs b/UI/ColorBox.cs index 61a9d813..feab5c1e 100644 --- a/UI/ColorBox.cs +++ b/UI/ColorBox.cs @@ -19,7 +19,7 @@ public partial class ColorBox : UserControl, ISettingsBindable private Color color; public Color Color { - get { return color; } + get => color; set { // Normalize the color because Color.Red != Color.FromArgb(255, 0, 0) @@ -44,14 +44,14 @@ public Color Color [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string SettingName { - get { return property?.Name; } + get => property?.Name; set { property = typeof(Settings).GetProperty(value); ReadSetting(); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Settings Source { - get { return source; } + get => source; set { source = value; ReadSetting(); } } diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewToolTip.cs index 7cbc0832..bc798885 100644 --- a/UI/MemoryPreviewToolTip.cs +++ b/UI/MemoryPreviewToolTip.cs @@ -18,16 +18,16 @@ public class MemoryPreviewToolTip : ToolTip [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public FontEx Font { - get { return viewInfo.Font; } - set { viewInfo.Font = value; } + get => viewInfo.Font; + set => viewInfo.Font = value; } [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public MemoryBuffer Memory { - get { return viewInfo.Memory; } - set { viewInfo.Memory = value; } + get => viewInfo.Memory; + set => viewInfo.Memory = value; } private readonly List nodes; diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 6f196759..fa862583 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -32,7 +32,7 @@ partial class MemoryViewControl : ScrollableCustomControl [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ReClassNetProject Project { - get { return project; } + get => project; set { Contract.Requires(value != null); @@ -45,7 +45,7 @@ public ReClassNetProject Project [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public ClassNode ClassNode { - get { return classNode; } + get => classNode; set { ClearSelection(); @@ -215,7 +215,7 @@ protected override void OnPaint(PaintEventArgs e) HorizontalScroll.Value = 0; } } - catch (Exception ex) + catch (Exception) { Debug.Assert(false); } @@ -376,7 +376,7 @@ protected override void OnMouseClick(MouseEventArgs e) Name = "None" }; - EventHandler handler = (sender2, e2) => + void ChangeTypeHandler(object sender2, EventArgs e2) { var selectedClassNode = (sender2 as TypeToolStripMenuItem)?.Tag as ClassNode; if (selectedClassNode == null) @@ -390,7 +390,7 @@ protected override void OnMouseClick(MouseEventArgs e) } functionNode.BelongsToClass = selectedClassNode; - }; + } items = noneClass.Yield() .Concat(project.Classes.OrderBy(c => c.Name)) @@ -401,7 +401,7 @@ protected override void OnMouseClick(MouseEventArgs e) Text = c.Name, Tag = c }; - b.Click += handler; + b.Click += ChangeTypeHandler; return b; }); } @@ -409,7 +409,7 @@ protected override void OnMouseClick(MouseEventArgs e) var refNode = hitObject as BaseReferenceNode; if (refNode != null) { - EventHandler handler = (sender2, e2) => + void ChangeInnerNodeHandler(object sender2, EventArgs e2) { var selectedClassNode = (sender2 as TypeToolStripMenuItem)?.Tag as ClassNode; if (selectedClassNode == null) @@ -421,7 +421,7 @@ protected override void OnMouseClick(MouseEventArgs e) { refNode.ChangeInnerNode(selectedClassNode); } - }; + } items = project.Classes .OrderBy(c => c.Name) @@ -432,7 +432,7 @@ protected override void OnMouseClick(MouseEventArgs e) Text = c.Name, Tag = c }; - b.Click += handler; + b.Click += ChangeInnerNodeHandler; return b; }); } @@ -865,7 +865,7 @@ public void AddBytes(int length) var hotspot = selectedNodes.FirstOrDefault(); if (hotspot != null) { - (hotspot.Node.ParentNode ?? hotspot.Node as ClassNode).AddBytes(length); + (hotspot.Node.ParentNode ?? hotspot.Node as ClassNode)?.AddBytes(length); } Invalidate(); @@ -878,7 +878,7 @@ public void InsertBytes(int length) var hotspot = selectedNodes.FirstOrDefault(); if (hotspot != null) { - (hotspot.Node.ParentNode ?? hotspot.Node as ClassNode).InsertBytes(hotspot.Node, length); + (hotspot.Node.ParentNode ?? hotspot.Node as ClassNode)?.InsertBytes(hotspot.Node, length); Invalidate(); } diff --git a/UI/ScrollableCustomControl.cs b/UI/ScrollableCustomControl.cs index 766d88fc..4fa500e1 100644 --- a/UI/ScrollableCustomControl.cs +++ b/UI/ScrollableCustomControl.cs @@ -19,7 +19,7 @@ protected override void OnMouseWheel(MouseEventArgs e) const int WHEEL_DELTA = 120; - var scrollProperties = VerticalScroll.Enabled ? (ScrollProperties)VerticalScroll : (ScrollProperties)HorizontalScroll; + var scrollProperties = VerticalScroll.Enabled ? VerticalScroll : (ScrollProperties)HorizontalScroll; var wheelDelta = e.Delta; while (Math.Abs(wheelDelta) >= WHEEL_DELTA) @@ -153,7 +153,7 @@ public void DoScroll(ScrollOrientation orientation, int amount) return; } - var scrollProperties = orientation == ScrollOrientation.VerticalScroll ? (ScrollProperties)VerticalScroll : (ScrollProperties)HorizontalScroll; + var scrollProperties = orientation == ScrollOrientation.VerticalScroll ? VerticalScroll : (ScrollProperties)HorizontalScroll; SetValue(ScrollEventType.ThumbPosition, scrollProperties, scrollProperties.Value + amount); } @@ -193,7 +193,7 @@ protected override void WndProc(ref Message msg) break; } - ProcessMessage(ref msg, msg.Msg == WM_VSCROLL ? (ScrollProperties)VerticalScroll : (ScrollProperties)HorizontalScroll); + ProcessMessage(ref msg, msg.Msg == WM_VSCROLL ? VerticalScroll : (ScrollProperties)HorizontalScroll); return; } diff --git a/UI/SettingsCheckBox.cs b/UI/SettingsCheckBox.cs index a60e9a35..20a87fc5 100644 --- a/UI/SettingsCheckBox.cs +++ b/UI/SettingsCheckBox.cs @@ -13,14 +13,14 @@ class SettingsCheckBox : CheckBox, ISettingsBindable [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string SettingName { - get { return property?.Name; } + get => property?.Name; set { property = typeof(Settings).GetProperty(value); ReadSetting(); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Settings Source { - get { return source; } + get => source; set { source = value; ReadSetting(); } } diff --git a/UI/SettingsTextBox.cs b/UI/SettingsTextBox.cs index bf4e13be..5f245d65 100644 --- a/UI/SettingsTextBox.cs +++ b/UI/SettingsTextBox.cs @@ -13,14 +13,14 @@ class SettingsTextBox : TextBox, ISettingsBindable [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string SettingName { - get { return property?.Name; } + get => property?.Name; set { property = typeof(Settings).GetProperty(value); ReadSetting(); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Settings Source { - get { return source; } + get => source; set { source = value; ReadSetting(); } } diff --git a/Util/Extension.RichTextBox.cs b/Util/Extension.RichTextBox.cs index e833d7fa..8fcb2998 100644 --- a/Util/Extension.RichTextBox.cs +++ b/Util/Extension.RichTextBox.cs @@ -37,10 +37,10 @@ public RECT(Rectangle r) } } - [DllImport(@"User32.dll", CharSet = CharSet.Auto)] + [DllImport("User32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, ref RECT rect); - [DllImport(@"user32.dll", CharSet = CharSet.Auto)] + [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam); private const int EmGetrect = 0xB2; From 8026ab94b4296243681682996f402fd372660dfb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 10 May 2017 19:04:58 +0200 Subject: [PATCH 022/777] Fixed rendering of virtual function nodes. --- Nodes/VTableNode.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index fe22793b..bc0bf051 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -84,6 +84,8 @@ public override Size Draw(ViewInfo view, int x, int y) size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); size.Height += innerSize.Height; + + y += innerSize.Height; } } From 6ff0b66ca698f073114f7666686c54ceed6e67be Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 10 May 2017 19:05:14 +0200 Subject: [PATCH 023/777] Fixed rendering of the memory preview. --- UI/MemoryPreviewToolTip.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewToolTip.cs index bc798885..48275a8f 100644 --- a/UI/MemoryPreviewToolTip.cs +++ b/UI/MemoryPreviewToolTip.cs @@ -89,7 +89,7 @@ private void OnDraw(object sender, DrawToolTipEventArgs e) int y = 2; foreach (var node in nodes) { - y = node.Draw(viewInfo, x, y).Height; + y += node.Draw(viewInfo, x, y).Height; } } From f5ab8c47e35fce73e91e7e96add8582f7521bd9e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 22 May 2017 22:13:31 +0200 Subject: [PATCH 024/777] Use LINQ. --- DataExchange/ReClass2007File.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/DataExchange/ReClass2007File.cs b/DataExchange/ReClass2007File.cs index 9904a58e..a0b4c240 100644 --- a/DataExchange/ReClass2007File.cs +++ b/DataExchange/ReClass2007File.cs @@ -77,12 +77,9 @@ public void Load(string filePath, ILogger logger) }) .ForEach(vtableNode.AddNode); - foreach (var method in vtableNode.Nodes) + foreach (var method in vtableNode.Nodes.Where(m => m.Name == "void function()")) { - if (method.Name == "void function()") - { - method.Name = string.Empty; - } + method.Name = string.Empty; } vtables.Add(id, vtableNode); From eaf3e03c22198ebc8761be7d19bba59968d5afb9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 22 May 2017 22:14:30 +0200 Subject: [PATCH 025/777] Use C# 7. --- DataExchange/ReClassFile.cs | 74 ++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index ba85a26c..cb92ab02 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -236,45 +236,43 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C referenceNode.ChangeInnerNode(innerClassNode); } - var vtableNode = node as VTableNode; - if (vtableNode != null) - { - element - .Elements("Function") - .Select(e => new VMethodNode - { - Name = e.Attribute("Name")?.Value ?? string.Empty, - Comment = e.Attribute("Comments")?.Value ?? string.Empty - }) - .ForEach(vtableNode.AddNode); - } - var classInstanceArrayNode = node as ClassInstanceArrayNode; - if (classInstanceArrayNode != null) - { - int count; - TryGetAttributeValue(element, "Total", out count, logger); - classInstanceArrayNode.Count = count; - } - var classPtrArrayNode = node as ClassPtrArrayNode; - if (classPtrArrayNode != null) - { - int count; - TryGetAttributeValue(element, "Size", out count, logger); - classPtrArrayNode.Count = count / IntPtr.Size; - } - var textNode = node as BaseTextNode; - if (textNode != null) - { - int length; - TryGetAttributeValue(element, "Size", out length, logger); - textNode.Length = textNode is UTF16TextNode ? length / 2 : length; - } - var bitFieldNode = node as BitFieldNode; - if (bitFieldNode != null) + + switch (node) { - int bits; - TryGetAttributeValue(element, "Size", out bits, logger); - bitFieldNode.Bits = bits * 8; + case VTableNode vtableNode: + element + .Elements("Function") + .Select(e => new VMethodNode + { + Name = e.Attribute("Name")?.Value ?? string.Empty, + Comment = e.Attribute("Comments")?.Value ?? string.Empty + }) + .ForEach(vtableNode.AddNode); + break; + case ClassInstanceArrayNode classInstanceArrayNode: + { + TryGetAttributeValue(element, "Total", out var count, logger); + classInstanceArrayNode.Count = count; + break; + } + case ClassPtrArrayNode classPtrArrayNode: + { + TryGetAttributeValue(element, "Size", out var count, logger); + classPtrArrayNode.Count = count / IntPtr.Size; + break; + } + case BaseTextNode textNode: + { + TryGetAttributeValue(element, "Size", out var length, logger); + textNode.Length = textNode is UTF16TextNode ? length / 2 : length; + break; + } + case BitFieldNode bitFieldNode: + { + TryGetAttributeValue(element, "Size", out var bits, logger); + bitFieldNode.Bits = bits * 8; + break; + } } yield return node; From 5111490cc763de61185ae58cd655120458333d98 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 May 2017 16:51:57 +0200 Subject: [PATCH 026/777] More code refactoring. --- DataExchange/ReClass2007File.cs | 3 +- DataExchange/ReClassNetFile.Read.cs | 92 +++++++++++++--------------- DataExchange/ReClassNetFile.Write.cs | 65 ++++++++++---------- DataExchange/ReClassQtFile.cs | 3 +- 4 files changed, 79 insertions(+), 84 deletions(-) diff --git a/DataExchange/ReClass2007File.cs b/DataExchange/ReClass2007File.cs index a0b4c240..ad7a292a 100644 --- a/DataExchange/ReClass2007File.cs +++ b/DataExchange/ReClass2007File.cs @@ -15,8 +15,7 @@ class ReClass2007File : IReClassImport public const string FormatName = "ReClass 2007 File"; public const string FileExtension = ".rdc"; - private static readonly Type[] TypeMap = new Type[] - { + private static readonly Type[] TypeMap = { null, typeof(ClassInstanceNode), typeof(ClassNode), diff --git a/DataExchange/ReClassNetFile.Read.cs b/DataExchange/ReClassNetFile.Read.cs index f4c46a6e..5a0d5861 100644 --- a/DataExchange/ReClassNetFile.Read.cs +++ b/DataExchange/ReClassNetFile.Read.cs @@ -105,8 +105,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - Type nodeType; - if (!BuildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out nodeType)) + if (!BuildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType)) { logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(XmlTypeAttribute)?.Value}"); logger.Log(LogLevel.Warning, element.ToString()); @@ -147,48 +146,49 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C referenceNode.ChangeInnerNode(innerClassNode); } - var vtableNode = node as VTableNode; - if (vtableNode != null) - { - element - .Elements(XmlMethodElement) - .Select(e => new VMethodNode - { - Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, - Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty - }) - .ForEach(vtableNode.AddNode); - } - var arrayNode = node as BaseArrayNode; - if (arrayNode != null) - { - int count; - TryGetAttributeValue(element, XmlCountAttribute, out count, logger); - arrayNode.Count = count; - } - var textNode = node as BaseTextNode; - if (textNode != null) - { - int length; - TryGetAttributeValue(element, XmlLengthAttribute, out length, logger); - textNode.Length = length; - } - var bitFieldNode = node as BitFieldNode; - if (bitFieldNode != null) - { - int bits; - TryGetAttributeValue(element, XmlBitsAttribute, out bits, logger); - bitFieldNode.Bits = bits; - } - var functionNode = node as FunctionNode; - if (functionNode != null) - { - functionNode.Signature = element.Attribute(XmlSignatureAttribute)?.Value ?? string.Empty; - var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); - if (project.ContainsClass(reference)) + switch (node) + { + case VTableNode vtableNode: { - functionNode.BelongsToClass = project.GetClassByUuid(reference); + element + .Elements(XmlMethodElement) + .Select(e => new VMethodNode + { + Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, + Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty + }) + .ForEach(vtableNode.AddNode); + break; + } + case BaseArrayNode arrayNode: + { + TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); + arrayNode.Count = count; + break; + } + case BaseTextNode textNode: + { + TryGetAttributeValue(element, XmlLengthAttribute, out var length, logger); + textNode.Length = length; + break; + } + case BitFieldNode bitFieldNode: + { + TryGetAttributeValue(element, XmlBitsAttribute, out var bits, logger); + bitFieldNode.Bits = bits; + break; + } + case FunctionNode functionNode: + { + functionNode.Signature = element.Attribute(XmlSignatureAttribute)?.Value ?? string.Empty; + + var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); + if (project.ContainsClass(reference)) + { + functionNode.BelongsToClass = project.GetClassByUuid(reference); + } + break; } } @@ -233,13 +233,7 @@ public static Tuple, List> ReadNodes(Stream input, ReC { if (templateProject != null) { - foreach (var classNode in project.Classes.Where(c => c != serialisationClassNode)) - { - if (!templateProject.ContainsClass(classNode.Uuid)) - { - classes.Add(classNode); - } - } + classes.AddRange(project.Classes.Where(c => c != serialisationClassNode).Where(classNode => !templateProject.ContainsClass(classNode.Uuid))); } nodes.AddRange(serialisationClassNode.Nodes); diff --git a/DataExchange/ReClassNetFile.Write.cs b/DataExchange/ReClassNetFile.Write.cs index 15c373b2..d87a63a4 100644 --- a/DataExchange/ReClassNetFile.Write.cs +++ b/DataExchange/ReClassNetFile.Write.cs @@ -75,8 +75,7 @@ private IEnumerable CreateNodeElements(IEnumerable nodes, IL continue; } - string typeString; - if (!BuildInTypeToStringMap.TryGetValue(node.GetType(), out typeString)) + if (!BuildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString)) { logger.Log(LogLevel.Error, $"Skipping node with unknown type: {node.Name}"); logger.Log(LogLevel.Warning, node.GetType().ToString()); @@ -96,36 +95,40 @@ private IEnumerable CreateNodeElements(IEnumerable nodes, IL { element.SetAttributeValue(XmlReferenceAttribute, referenceNode.InnerNode.Uuid.ToBase64String()); } - var vtableNode = node as VTableNode; - if (vtableNode != null) - { - element.Add(vtableNode.Nodes.Select(n => new XElement( - XmlMethodElement, - new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), - new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty) - ))); - } - var arrayNode = node as BaseArrayNode; - if (arrayNode != null) - { - element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); - } - var textNode = node as BaseTextNode; - if (textNode != null) - { - element.SetAttributeValue(XmlLengthAttribute, textNode.Length); - } - var bitFieldNode = node as BitFieldNode; - if (bitFieldNode != null) - { - element.SetAttributeValue(XmlBitsAttribute, bitFieldNode.Bits); - } - var functionNode = node as FunctionNode; - if (functionNode != null) + + switch (node) { - var uuid = functionNode.BelongsToClass == null ? NodeUuid.Zero : functionNode.BelongsToClass.Uuid; - element.SetAttributeValue(XmlReferenceAttribute, uuid.ToBase64String()); - element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); + case VTableNode vtableNode: + { + element.Add(vtableNode.Nodes.Select(n => new XElement( + XmlMethodElement, + new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), + new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty) + ))); + break; + } + case BaseArrayNode arrayNode: + { + element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); + break; + } + case BaseTextNode textNode: + { + element.SetAttributeValue(XmlLengthAttribute, textNode.Length); + break; + } + case BitFieldNode bitFieldNode: + { + element.SetAttributeValue(XmlBitsAttribute, bitFieldNode.Bits); + break; + } + case FunctionNode functionNode: + { + var uuid = functionNode.BelongsToClass == null ? NodeUuid.Zero : functionNode.BelongsToClass.Uuid; + element.SetAttributeValue(XmlReferenceAttribute, uuid.ToBase64String()); + element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); + break; + } } yield return element; diff --git a/DataExchange/ReClassQtFile.cs b/DataExchange/ReClassQtFile.cs index 92927a85..2e78ddf8 100644 --- a/DataExchange/ReClassQtFile.cs +++ b/DataExchange/ReClassQtFile.cs @@ -82,8 +82,7 @@ private string ParseAddressString(XElement element) return address; } - private readonly Type[] typeMap = new Type[] - { + private readonly Type[] typeMap = { null, null, typeof(ClassPtrNode), From 19d15ffb3d29cc9ba8f643fcc3dbfdeda075d03b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 May 2017 17:06:07 +0200 Subject: [PATCH 027/777] Added out variable declaration. --- AddressParser/TokenReader.cs | 3 +-- CodeGenerator/CSharpCodeGenerator.cs | 3 +-- CodeGenerator/CppCodeGenerator.cs | 3 +-- Core/CoreFunctionsManager.cs | 3 +-- DataExchange/ReClass2007File.cs | 3 +-- DataExchange/ReClassFile.cs | 6 ++---- DataExchange/ReClassNetFile.Read.cs | 3 +-- DataExchange/ReClassQtFile.cs | 3 +-- Memory/Disassembler.cs | 3 +-- Memory/RemoteProcess.cs | 3 +-- Native/NativeMethods.Windows.cs | 3 +-- Nodes/BaseArrayNode.cs | 3 +-- Nodes/BaseFunctionPtrNode.cs | 3 +-- Nodes/BaseHexNode.cs | 6 ++---- Nodes/BaseMatrixNode.cs | 3 +-- Nodes/BaseTextNode.cs | 3 +-- Nodes/BoolNode.cs | 3 +-- Nodes/DoubleNode.cs | 3 +-- Nodes/FloatNode.cs | 3 +-- UI/MemoryViewControl.cs | 3 +-- 20 files changed, 22 insertions(+), 44 deletions(-) diff --git a/AddressParser/TokenReader.cs b/AddressParser/TokenReader.cs index 5cd6e5d0..34a8f9b3 100644 --- a/AddressParser/TokenReader.cs +++ b/AddressParser/TokenReader.cs @@ -68,8 +68,7 @@ public List Read(string formula) buffer = buffer.Substring(2); } - long offsetValue; - if (long.TryParse(buffer, NumberStyles.HexNumber, null, out offsetValue)) + if (long.TryParse(buffer, NumberStyles.HexNumber, null, out var offsetValue)) { #if WIN64 var address = (IntPtr)offsetValue; diff --git a/CodeGenerator/CSharpCodeGenerator.cs b/CodeGenerator/CSharpCodeGenerator.cs index b3b2b0db..9dd8c88b 100644 --- a/CodeGenerator/CSharpCodeGenerator.cs +++ b/CodeGenerator/CSharpCodeGenerator.cs @@ -111,8 +111,7 @@ private IEnumerable YieldMemberDefinitions(IEnumerable YieldMemberDefinitions(IEnumerable ReadNodeRows(IEnumerable rows, ClassNode var reference = Convert.ToInt32(row["ref"]); if (!classes.ContainsKey(reference)) { - VTableNode vtableNode; - if (!vtables.TryGetValue(reference, out vtableNode)) + if (!vtables.TryGetValue(reference, out var vtableNode)) { logger.Log(LogLevel.Error, $"Skipping node with unknown reference: {row["ref"]}"); logger.Log(LogLevel.Warning, string.Join(",", row.ItemArray)); diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index cb92ab02..82da7314 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -138,8 +138,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { Type nodeType = null; - int typeVal; - if (int.TryParse(element.Attribute("Type")?.Value, out typeVal)) + if (int.TryParse(element.Attribute("Type")?.Value, out var typeVal)) { if (typeVal >= 0 && typeVal < typeMap.Length) { @@ -169,8 +168,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C // Convert the Custom node into normal hex nodes. if (node is CustomNode) { - int size; - int.TryParse(element.Attribute("Size")?.Value, out size); + int.TryParse(element.Attribute("Size")?.Value, out var size); while (size != 0) { diff --git a/DataExchange/ReClassNetFile.Read.cs b/DataExchange/ReClassNetFile.Read.cs index 5a0d5861..5ed7403e 100644 --- a/DataExchange/ReClassNetFile.Read.cs +++ b/DataExchange/ReClassNetFile.Read.cs @@ -96,8 +96,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C var converter = CustomNodeConvert.GetReadConverter(element); if (converter != null) { - BaseNode customNode; - if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out customNode)) + if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out var customNode)) { yield return customNode; } diff --git a/DataExchange/ReClassQtFile.cs b/DataExchange/ReClassQtFile.cs index 2e78ddf8..525a8100 100644 --- a/DataExchange/ReClassQtFile.cs +++ b/DataExchange/ReClassQtFile.cs @@ -118,8 +118,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { Type nodeType = null; - int typeVal; - if (int.TryParse(element.Attribute("Type")?.Value, out typeVal)) + if (int.TryParse(element.Attribute("Type")?.Value, out var typeVal)) { if (typeVal >= 0 && typeVal < typeMap.Length) { diff --git a/Memory/Disassembler.cs b/Memory/Disassembler.cs index 308714f4..c5c7ee7b 100644 --- a/Memory/Disassembler.cs +++ b/Memory/Disassembler.cs @@ -59,8 +59,7 @@ public IEnumerable DisassembleCode(IntPtr address, int while (eip.CompareTo(end) == -1) { - InstructionData instruction; - var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, out instruction); + var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, out var instruction); if (!res) { break; diff --git a/Memory/RemoteProcess.cs b/Memory/RemoteProcess.cs index 212e6238..6b9c231a 100644 --- a/Memory/RemoteProcess.cs +++ b/Memory/RemoteProcess.cs @@ -283,8 +283,7 @@ public string ReadRemoteRuntimeTypeInformation(IntPtr address) { if (address.MayBeValid()) { - string rtti; - if (!rttiCache.TryGetValue(address, out rtti)) + if (!rttiCache.TryGetValue(address, out var rtti)) { var objectLocatorPtr = ReadRemoteObject(address - IntPtr.Size); if (objectLocatorPtr.MayBeValid()) diff --git a/Native/NativeMethods.Windows.cs b/Native/NativeMethods.Windows.cs index 903297d0..4694b5f0 100644 --- a/Native/NativeMethods.Windows.cs +++ b/Native/NativeMethods.Windows.cs @@ -115,8 +115,7 @@ public Icon GetIconForFile(string path) public void EnableDebugPrivileges() { - IntPtr token; - if (OpenProcessToken(System.Diagnostics.Process.GetCurrentProcess().Handle, TokenAccessLevels.AllAccess, out token)) + if (OpenProcessToken(System.Diagnostics.Process.GetCurrentProcess().Handle, TokenAccessLevels.AllAccess, out var token)) { var privileges = new TOKEN_PRIVILEGES { diff --git a/Nodes/BaseArrayNode.cs b/Nodes/BaseArrayNode.cs index 61c56f91..2c82fb93 100644 --- a/Nodes/BaseArrayNode.cs +++ b/Nodes/BaseArrayNode.cs @@ -93,8 +93,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - int value; - if (int.TryParse(spot.Text, out value)) + if (int.TryParse(spot.Text, out var value)) { if (spot.Id == 0) { diff --git a/Nodes/BaseFunctionPtrNode.cs b/Nodes/BaseFunctionPtrNode.cs index 677210f0..7651b6fb 100644 --- a/Nodes/BaseFunctionPtrNode.cs +++ b/Nodes/BaseFunctionPtrNode.cs @@ -117,8 +117,7 @@ private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) if (!address.IsNull() && memory.Process.IsValid) { - int unused; - DisassembleRemoteCode(memory, address, out unused); + DisassembleRemoteCode(memory, address, out _); } } } diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index 2dd70a74..e0402236 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -56,8 +56,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) HighlightTimer.RemoveWhere(kv => kv.Value.Value < CurrentHighlightTime); - ValueTypeWrapper until; - if (HighlightTimer.TryGetValue(address, out until)) + if (HighlightTimer.TryGetValue(address, out var until)) { if (until.Value >= CurrentHighlightTime) { @@ -106,8 +105,7 @@ public void Update(HotSpot spot, int maxId) if (spot.Id >= 0 && spot.Id < maxId) { - byte val; - if (byte.TryParse(spot.Text, NumberStyles.HexNumber, null, out val)) + if (byte.TryParse(spot.Text, NumberStyles.HexNumber, null, out var val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address + spot.Id, val); } diff --git a/Nodes/BaseMatrixNode.cs b/Nodes/BaseMatrixNode.cs index 93808926..6057bc59 100644 --- a/Nodes/BaseMatrixNode.cs +++ b/Nodes/BaseMatrixNode.cs @@ -126,8 +126,7 @@ public void Update(HotSpot spot, int max) if (spot.Id >= 0 && spot.Id < max) { - float val; - if (float.TryParse(spot.Text, out val)) + if (float.TryParse(spot.Text, out var val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/Nodes/BaseTextNode.cs b/Nodes/BaseTextNode.cs index 1683c69c..015e75e0 100644 --- a/Nodes/BaseTextNode.cs +++ b/Nodes/BaseTextNode.cs @@ -72,8 +72,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - int val; - if (int.TryParse(spot.Text, out val) && val > 0) + if (int.TryParse(spot.Text, out var val) && val > 0) { Length = val; diff --git a/Nodes/BoolNode.cs b/Nodes/BoolNode.cs index 469dd4fd..d1555a7e 100644 --- a/Nodes/BoolNode.cs +++ b/Nodes/BoolNode.cs @@ -58,8 +58,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - bool val; - if (bool.TryParse(spot.Text, out val)) + if (bool.TryParse(spot.Text, out var val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, (byte)(val ? 1 : 0)); } diff --git a/Nodes/DoubleNode.cs b/Nodes/DoubleNode.cs index cc9392b4..14753afc 100644 --- a/Nodes/DoubleNode.cs +++ b/Nodes/DoubleNode.cs @@ -26,8 +26,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - double val; - if (double.TryParse(spot.Text, out val)) + if (double.TryParse(spot.Text, out var val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/Nodes/FloatNode.cs b/Nodes/FloatNode.cs index e412c95a..c96fd8a3 100644 --- a/Nodes/FloatNode.cs +++ b/Nodes/FloatNode.cs @@ -26,8 +26,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - float val; - if (float.TryParse(spot.Text, out val)) + if (float.TryParse(spot.Text, out var val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index fa862583..cb1c4dad 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -503,8 +503,7 @@ protected override void OnMouseHover(EventArgs e) { if (spot.Rect.Contains(toolTipPosition)) { - IntPtr previewAddress; - if (spot.Node.UseMemoryPreviewToolTip(spot, spot.Memory, out previewAddress)) + if (spot.Node.UseMemoryPreviewToolTip(spot, spot.Memory, out var previewAddress)) { memoryPreviewToolTip.UpdateMemory(spot.Memory.Process, previewAddress); From b6e877c9626267054c7d54bb449e4902d2e0dadb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 31 May 2017 22:40:49 +0200 Subject: [PATCH 028/777] Use static MainForm. --- Forms/FoundCodeForm.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Forms/FoundCodeForm.cs b/Forms/FoundCodeForm.cs index 8029fe84..37289efb 100644 --- a/Forms/FoundCodeForm.cs +++ b/Forms/FoundCodeForm.cs @@ -162,8 +162,7 @@ private void createFunctionButton_Click(object sender, EventArgs e) Comment = info.Instructions[2].Instruction }); - var mainForm = Application.OpenForms[0] as MainForm; - mainForm.ClassView.SelectedClass = node; + Program.MainForm.ClassView.SelectedClass = node; } private void stopButton_Click(object sender, EventArgs e) From 0d510e9fbc0ced468a7f719cbae2c23b776cb023 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 18 Aug 2017 23:27:19 +0200 Subject: [PATCH 029/777] Fixed nested list. --- README.md | 36 ++++++++++++++++++------------------ ReClass.NET.csproj | 1 + 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index f9981636..09c22bf8 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,19 @@ This is a port of ReClass to the .NET platform with additional features. - Support for x86 / x64 - File import from ReClass 2007-2016 and ReClass QT - Memory Nodes - - Hex 8 / 16 / 32 / 64 - - Int 8 / 16 / 32 / 64 - - UInt 8 / 16 / 32 / 64 - - Bool - - Bits ![](https://abload.de/img/bitsnhlql.jpg) - - Float / Double - - Vector 2 / 3 / 4 - - Matrix 3x3 / 3x4 / 4x4 - - UTF8/16/32 Text and pointer to text - - Class Arrays and array of pointers to classes - - VTable - - Function Pointer - - Function + - Hex 8 / 16 / 32 / 64 + - Int 8 / 16 / 32 / 64 + - UInt 8 / 16 / 32 / 64 + - Bool + - Bits ![](https://abload.de/img/bitsnhlql.jpg) + - Float / Double + - Vector 2 / 3 / 4 + - Matrix 3x3 / 3x4 / 4x4 + - UTF8/16/32 Text and pointer to text + - Class Arrays and array of pointers to classes + - VTable + - Function Pointer + - Function - Automatic Node Dissection - Highlight changed memory - Pointer Preview @@ -35,11 +35,11 @@ This is a port of ReClass to the .NET platform with additional features. - Linux Support (tested on Ubuntu) - Debugger with "Find out what writes/accesses this address" support - Plugin Support - - Plugins can be written in different languages (example: C++, C++/CLI, C#) - - Plugins can provide custom methods to access an other process (example: use a driver) - - Plugins can interact with the ReClass.NET windows - - Plugins can provide node infos which will be displayed (example: class informations for Frostbite games) - - Plugins can implement custom nodes with load/save and code generation support + - Plugins can be written in different languages (example: C++, C++/CLI, C#) + - Plugins can provide custom methods to access an other process (example: use a driver) + - Plugins can interact with the ReClass.NET windows + - Plugins can provide node infos which will be displayed (example: class informations for Frostbite games) + - Plugins can implement custom nodes with load/save and code generation support ## Plugins - [Sample Plugins](https://github.com/KN4CK3R/ReClass.NET-SamplePlugin) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 835e52f8..3161d942 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -445,6 +445,7 @@ + From db218e46b04a06ba2f1386de46d42c4d472958a2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 26 Aug 2017 12:59:14 +0200 Subject: [PATCH 030/777] Move to VS2017. --- NativeCore/Windows/NativeCore.vcxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 31b6281a..30553458 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -22,32 +22,32 @@ {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} Win32Proj NativeCore - 8.1 + 10.0.14393.0 DynamicLibrary true - v140 + v141 MultiByte DynamicLibrary false - v140 + v141 true MultiByte DynamicLibrary true - v140 + v141 MultiByte DynamicLibrary false - v140 + v141 true MultiByte From 3d48a3838b744cce1d03956770db18a764d27604 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 26 Aug 2017 13:08:14 +0200 Subject: [PATCH 031/777] Use equivalent AddBytes. --- Nodes/VTableNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nodes/VTableNode.cs b/Nodes/VTableNode.cs index bc0bf051..9a690f99 100644 --- a/Nodes/VTableNode.cs +++ b/Nodes/VTableNode.cs @@ -16,7 +16,7 @@ public class VTableNode : BaseContainerNode public override void Intialize() { - InsertBytes(0, 10 * IntPtr.Size); + AddBytes(10 * IntPtr.Size); } public override void ClearSelection() From b59ae9b1a0ff119c8b13b124cc24006f697d1ff8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 28 Aug 2017 18:27:55 +0200 Subject: [PATCH 032/777] Fixed MemoryBuffer.HasChanged regression. --- Memory/MemoryBuffer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index 4bb4c25f..3a146133 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -98,6 +98,8 @@ public void Update(IntPtr address, bool setHistory) if (!ContainsValidData) { data.FillWithZero(); + + hasHistory = false; } } @@ -270,7 +272,7 @@ public bool HasChanged(IntPtr offset, int length) public bool HasChanged(int offset, int length) { - if (hasHistory) + if (!hasHistory) { return false; } From 46d7a09288eca898bd3b81935d5935522ed7493d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 28 Aug 2017 19:09:56 +0200 Subject: [PATCH 033/777] Added new MemoryPreviewPopUp which can be resized. --- UI/MemoryPreviewToolTip.cs | 228 +++++++++++++++++++++++-------- UI/MemoryViewControl.Designer.cs | 7 - UI/MemoryViewControl.cs | 33 ++++- UI/MemoryViewControl.resx | 3 - 4 files changed, 203 insertions(+), 68 deletions(-) diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewToolTip.cs index 48275a8f..c09224df 100644 --- a/UI/MemoryPreviewToolTip.cs +++ b/UI/MemoryPreviewToolTip.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; using System.Windows.Forms; @@ -9,94 +10,213 @@ namespace ReClassNET.UI { - public class MemoryPreviewToolTip : ToolTip + [ToolboxItem(false)] + public class MemoryPreviewPopUp : ToolStripDropDown { private const int ToolTipWidth = 1000 + ToolTipPadding; private const int ToolTipPadding = 4; - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public FontEx Font + /// Panel for the memory preview. + private class MemoryPreviewPanel : Panel { - get => viewInfo.Font; - set => viewInfo.Font = value; - } + private const int MinNodeCount = 10; - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public MemoryBuffer Memory - { - get => viewInfo.Memory; - set => viewInfo.Memory = value; - } + public ViewInfo ViewInfo => viewInfo; - private readonly List nodes; + private readonly ViewInfo viewInfo; + private readonly List nodes; - private readonly ViewInfo viewInfo; + public MemoryPreviewPanel(FontEx font) + { + Contract.Requires(font != null); - private Size size; + DoubleBuffered = true; - public MemoryPreviewToolTip() - { - OwnerDraw = true; + nodes = new List(); + + viewInfo = new ViewInfo + { + Font = font, + + Memory = new MemoryBuffer(), + HotSpots = new List(), + Classes = new List() + }; + + SetNodeCount(MinNodeCount); + + CalculateSize(); + } + + /// Sets the absolute number of nodes and resizes the underlaying memory buffer. + /// Number of nodes. + private void SetNodeCount(int count) + { + BaseHexNode CreateNode(int index) + { #if WIN64 - nodes = new List(Enumerable.Range(0, 10).Select(i => new Hex64Node { Offset = (IntPtr)(i * 8) })); + return new Hex64Node { Offset = (IntPtr)(index * 8) }; #else - nodes = new List(Enumerable.Range(0, 10).Select(i => new Hex32Node { Offset = (IntPtr)(i * 4) })); + return new Hex32Node { Offset = (IntPtr)(index * 4) }; #endif + } + + if (nodes.Count < count) + { + nodes.AddRange(Enumerable.Range(nodes.Count, count - nodes.Count).Select(CreateNode)); + } + else if (nodes.Count > count && count >= MinNodeCount) + { + nodes.RemoveRange(count, nodes.Count - count); + } + + viewInfo.Memory.Size = nodes.Select(n => n.MemorySize).Sum(); + } - viewInfo = new ViewInfo + /// Changes the number of nodes with the provided delta. + /// The change delta. + public void ChangeNodeCount(int delta) { - Memory = new MemoryBuffer { Size = nodes.Select(n => n.MemorySize).Sum() }, + SetNodeCount(nodes.Count + delta); - HotSpots = new List(), - Classes = new List() - }; + CalculateSize(); + } - Popup += OnPopup; - Draw += OnDraw; - } + /// Resets the settings of the panel to the defaults. + public void Reset() + { + SetNodeCount(MinNodeCount); - private void OnPopup(object sender, PopupEventArgs e) - { - size.Width = ToolTipWidth; - size.Height = nodes.Sum(n => n.CalculateDrawnHeight(viewInfo)) + ToolTipPadding; + CalculateSize(); + } - e.ToolTipSize = size; + /// Calculates the size of the panel. + private void CalculateSize() + { + var size = new Size( + ToolTipWidth, + nodes.Sum(n => n.CalculateDrawnHeight(viewInfo)) + ToolTipPadding + ); - viewInfo.ClientArea = new Rectangle(ToolTipPadding / 2, ToolTipPadding / 2, size.Width - ToolTipPadding, size.Height - ToolTipPadding); + viewInfo.ClientArea = new Rectangle(ToolTipPadding / 2, ToolTipPadding / 2, size.Width - ToolTipPadding, size.Height - ToolTipPadding); + + Size = MinimumSize = MaximumSize = size; + } + + protected override void OnPaint(PaintEventArgs e) + { + viewInfo.HotSpots.Clear(); + + // Some settings are not usefull for the preview. + viewInfo.Settings = Program.Settings.Clone(); + viewInfo.Settings.ShowNodeAddress = false; + + viewInfo.Context = e.Graphics; + + e.Graphics.FillRectangle(Brushes.White, Bounds); + using (var pen = new Pen(Brushes.Black, 1)) + { + e.Graphics.DrawRectangle(pen, new Rectangle(Bounds.X, Bounds.Y, Bounds.Width - 1, Bounds.Height - 1)); + } + + int x = -24; + int y = 2; + foreach (var node in nodes) + { + y += node.Draw(viewInfo, x, y).Height; + } + } } - private void OnDraw(object sender, DrawToolTipEventArgs e) + private readonly MemoryPreviewPanel panel; + + private IntPtr memoryAddress; + + protected override CreateParams CreateParams { - viewInfo.HotSpots.Clear(); + get + { + const int WS_EX_NOACTIVATE = 0x08000000; - // Some settings are not usefull for the preview. - viewInfo.Settings = Program.Settings.Clone(); - viewInfo.Settings.ShowNodeAddress = false; - viewInfo.Settings.HighlightChangedValues = false; + var cp = base.CreateParams; + cp.ExStyle |= WS_EX_NOACTIVATE; + return cp; + } + } - viewInfo.Context = e.Graphics; + public MemoryPreviewPopUp(FontEx font) + { + Contract.Requires(font != null); + + AutoSize = false; + AutoClose = false; + DoubleBuffered = true; + ResizeRedraw = true; + TabStop = false; - e.Graphics.FillRectangle(Brushes.White, e.Bounds); - using (var pen = new Pen(Brushes.Black, 1)) + panel = new MemoryPreviewPanel(font) { - e.Graphics.DrawRectangle(pen, new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1)); - } + Location = Point.Empty + }; + + var host = new ToolStripControlHost(panel); + Padding = Margin = host.Padding = host.Margin = Padding.Empty; + MinimumSize = panel.MinimumSize; + panel.MinimumSize = panel.Size; + MaximumSize = panel.MaximumSize; + panel.MaximumSize = panel.Size; + Size = panel.Size; + + panel.SizeChanged += (s, e) => Size = MinimumSize = MaximumSize = panel.Size; + + Items.Add(host); + } + + protected override void OnClosed(ToolStripDropDownClosedEventArgs e) + { + panel.Reset(); + + base.OnClosed(e); + } - int x = -24; - int y = 2; - foreach (var node in nodes) + internal void HandleMouseWheelEvent(MouseEventArgs e) + { + if (e.Delta != 0) { - y += node.Draw(viewInfo, x, y).Height; + panel.ChangeNodeCount(e.Delta < 0 ? 1 : -1); + + UpdateMemory(); + + Invalidate(); + + if (e is HandledMouseEventArgs he) + { + he.Handled = true; + } } } - public void UpdateMemory(RemoteProcess process, IntPtr address) + /// Initializes the memory buffer. + /// The process to use. + /// The address to read from. + public void InitializeMemory(RemoteProcess process, IntPtr address) { - viewInfo.Memory.Process = process; - viewInfo.Memory.Update(address); + Contract.Requires(process != null); + + memoryAddress = address; + + var memory = panel.ViewInfo.Memory; + memory.Process = process; + memory.Update(address); + } + + /// Updates the memory buffer to get current data. + public void UpdateMemory() + { + panel.ViewInfo.Memory.Update(memoryAddress); + + panel.Invalidate(); } } } diff --git a/UI/MemoryViewControl.Designer.cs b/UI/MemoryViewControl.Designer.cs index 34a28847..4588fa0a 100644 --- a/UI/MemoryViewControl.Designer.cs +++ b/UI/MemoryViewControl.Designer.cs @@ -105,7 +105,6 @@ private void InitializeComponent() this.repaintTimer = new System.Windows.Forms.Timer(this.components); this.editBox = new ReClassNET.UI.HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.memoryPreviewToolTip = new ReClassNET.UI.MemoryPreviewToolTip(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -791,11 +790,6 @@ private void InitializeComponent() // this.nodeInfoToolTip.ShowAlways = true; // - // memoryPreviewToolTip - // - this.memoryPreviewToolTip.OwnerDraw = true; - this.memoryPreviewToolTip.ShowAlways = true; - // // MemoryViewControl // this.Controls.Add(this.editBox); @@ -883,7 +877,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; private UI.TypeToolStripMenuItem boolToolStripMenuItem; private UI.TypeToolStripMenuItem functionToolStripMenuItem; - private MemoryPreviewToolTip memoryPreviewToolTip; private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index cb1c4dad..8c9094c1 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -74,6 +74,8 @@ public ClassNode ClassNode /// The context menu of a node. public ContextMenuStrip NodeContextMenu => selectedNodeContextMenuStrip; + private readonly MemoryPreviewPopUp memoryPreviewPopUp; + public MemoryViewControl() { InitializeComponent(); @@ -86,7 +88,8 @@ public MemoryViewControl() }; editBox.Font = font; - memoryPreviewToolTip.Font = font; + + memoryPreviewPopUp = new MemoryPreviewPopUp(font); } protected override void OnLoad(EventArgs e) @@ -154,6 +157,10 @@ protected override void OnPaint(PaintEventArgs e) } ClassNode.UpdateAddress(Memory); + if (memoryPreviewPopUp.Visible) + { + memoryPreviewPopUp.UpdateMemory(); + } Memory.Size = ClassNode.MemorySize; Memory.Update(ClassNode.Offset); @@ -505,9 +512,9 @@ protected override void OnMouseHover(EventArgs e) { if (spot.Node.UseMemoryPreviewToolTip(spot, spot.Memory, out var previewAddress)) { - memoryPreviewToolTip.UpdateMemory(spot.Memory.Process, previewAddress); + memoryPreviewPopUp.InitializeMemory(spot.Memory.Process, previewAddress); - memoryPreviewToolTip.Show("<>", this, toolTipPosition.OffsetEx(16, 16)); + memoryPreviewPopUp.Show(this, toolTipPosition.OffsetEx(16, 16)); } else { @@ -535,12 +542,30 @@ protected override void OnMouseMove(MouseEventArgs e) toolTipPosition = e.Location; nodeInfoToolTip.Hide(this); - memoryPreviewToolTip.Hide(this); + + if (memoryPreviewPopUp.Visible) + { + memoryPreviewPopUp.Close(); + + Invalidate(); + } ResetMouseEventArgs(); } } + protected override void OnMouseWheel(MouseEventArgs e) + { + if (memoryPreviewPopUp.Visible) + { + memoryPreviewPopUp.HandleMouseWheelEvent(e); + } + else + { + base.OnMouseWheel(e); + } + } + protected override void OnScroll(ScrollEventArgs e) { Contract.Requires(e != null); diff --git a/UI/MemoryViewControl.resx b/UI/MemoryViewControl.resx index ecc3de10..0d4e9955 100644 --- a/UI/MemoryViewControl.resx +++ b/UI/MemoryViewControl.resx @@ -126,9 +126,6 @@ 364, 17 - - 506, 17 - 65 From d8f1af915537c996f499be66d9c076a6e0c91d6e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 28 Aug 2017 19:11:16 +0200 Subject: [PATCH 034/777] Renamed file. Fixes #14. --- ReClass.NET.csproj | 2 +- UI/{MemoryPreviewToolTip.cs => MemoryPreviewPopUp.cs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename UI/{MemoryPreviewToolTip.cs => MemoryPreviewPopUp.cs} (100%) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 3161d942..59fac37b 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -243,7 +243,7 @@ LogForm.cs - + Component diff --git a/UI/MemoryPreviewToolTip.cs b/UI/MemoryPreviewPopUp.cs similarity index 100% rename from UI/MemoryPreviewToolTip.cs rename to UI/MemoryPreviewPopUp.cs From 7bf58ed43b6fc72fa57318438fbf3a21c1bbc8d4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 28 Aug 2017 19:17:19 +0200 Subject: [PATCH 035/777] Fixed MemoryBuffer.HasChanged if buffer was resized. --- Memory/MemoryBuffer.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index 3a146133..9125ae91 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -10,24 +10,24 @@ public class MemoryBuffer { private byte[] data; private byte[] historyData; + private bool hasHistory; public RemoteProcess Process { get; set; } public int Size { - get - { - return data.Length; - } + get => data.Length; set { if (value != data.Length) { data = new byte[value]; historyData = new byte[value]; - + hasHistory = false; + + ContainsValidData = false; } } } @@ -50,8 +50,6 @@ public MemoryBuffer() data = new byte[0]; historyData = new byte[0]; - - ContainsValidData = true; } public MemoryBuffer(MemoryBuffer other) @@ -91,7 +89,7 @@ public void Update(IntPtr address, bool setHistory) { Array.Copy(data, historyData, data.Length); - hasHistory = true; + hasHistory = ContainsValidData; } ContainsValidData = Process.ReadRemoteMemoryIntoBuffer(address, ref data); From d6d2dc6fbf1ad2ee3fd233cb4d28be17698901fe Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 28 Aug 2017 19:24:05 +0200 Subject: [PATCH 036/777] Follow naming convention. --- CodeGenerator/CSharpCodeGenerator.cs | 6 +++--- CodeGenerator/CppCodeGenerator.cs | 12 ++++++------ DataExchange/ReClass2007File.cs | 2 +- DataExchange/ReClassFile.cs | 14 +++++++------- DataExchange/ReClassNetFile.cs | 12 ++++++------ Forms/MainForm.Designer.cs | 8 ++++---- Memory/MemoryBuffer.cs | 12 ++++++------ Memory/NodeDissector.cs | 8 ++++---- Nodes/Hex16Node.cs | 2 +- Nodes/Hex32Node.cs | 2 +- Nodes/Hex64Node.cs | 2 +- Nodes/Hex8Node.cs | 2 +- Nodes/UTF16TextNode.cs | 4 ++-- Nodes/UTF16TextPtrNode.cs | 2 +- Nodes/UTF32TextNode.cs | 4 ++-- Nodes/UTF32TextPtrNode.cs | 2 +- Nodes/UTF8TextNode.cs | 4 ++-- Nodes/UTF8TextPtrNode.cs | 2 +- UI/MemoryViewControl.Designer.cs | 8 ++++---- 19 files changed, 54 insertions(+), 54 deletions(-) diff --git a/CodeGenerator/CSharpCodeGenerator.cs b/CodeGenerator/CSharpCodeGenerator.cs index 9dd8c88b..81c9758b 100644 --- a/CodeGenerator/CSharpCodeGenerator.cs +++ b/CodeGenerator/CSharpCodeGenerator.cs @@ -26,9 +26,9 @@ class CSharpCodeGenerator : ICodeGenerator [typeof(UInt64Node)] = "ulong", [typeof(FunctionPtrNode)] = "IntPtr", - [typeof(UTF8TextPtrNode)] = "IntPtr", - [typeof(UTF16TextPtrNode)] = "IntPtr", - [typeof(UTF32TextPtrNode)] = "IntPtr", + [typeof(Utf8TextPtrNode)] = "IntPtr", + [typeof(Utf16TextPtrNode)] = "IntPtr", + [typeof(Utf32TextPtrNode)] = "IntPtr", [typeof(ClassPtrNode)] = "IntPtr", [typeof(VTableNode)] = "IntPtr" }; diff --git a/CodeGenerator/CppCodeGenerator.cs b/CodeGenerator/CppCodeGenerator.cs index ceb74214..1cb53f81 100644 --- a/CodeGenerator/CppCodeGenerator.cs +++ b/CodeGenerator/CppCodeGenerator.cs @@ -28,12 +28,12 @@ class CppCodeGenerator : ICodeGenerator [typeof(UInt16Node)] = Program.Settings.TypeUInt16, [typeof(UInt32Node)] = Program.Settings.TypeUInt32, [typeof(UInt64Node)] = Program.Settings.TypeUInt64, - [typeof(UTF8TextNode)] = Program.Settings.TypeUTF8Text, - [typeof(UTF8TextPtrNode)] = Program.Settings.TypeUTF8TextPtr, - [typeof(UTF16TextNode)] = Program.Settings.TypeUTF16Text, - [typeof(UTF16TextPtrNode)] = Program.Settings.TypeUTF16TextPtr, - [typeof(UTF32TextNode)] = Program.Settings.TypeUTF32Text, - [typeof(UTF32TextPtrNode)] = Program.Settings.TypeUTF32PtrText, + [typeof(Utf8TextNode)] = Program.Settings.TypeUTF8Text, + [typeof(Utf8TextPtrNode)] = Program.Settings.TypeUTF8TextPtr, + [typeof(Utf16TextNode)] = Program.Settings.TypeUTF16Text, + [typeof(Utf16TextPtrNode)] = Program.Settings.TypeUTF16TextPtr, + [typeof(Utf32TextNode)] = Program.Settings.TypeUTF32Text, + [typeof(Utf32TextPtrNode)] = Program.Settings.TypeUTF32PtrText, [typeof(Vector2Node)] = Program.Settings.TypeVector2, [typeof(Vector3Node)] = Program.Settings.TypeVector3, [typeof(Vector4Node)] = Program.Settings.TypeVector4 diff --git a/DataExchange/ReClass2007File.cs b/DataExchange/ReClass2007File.cs index 4c3c6988..12275d25 100644 --- a/DataExchange/ReClass2007File.cs +++ b/DataExchange/ReClass2007File.cs @@ -31,7 +31,7 @@ class ReClass2007File : IReClassImport typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node), - typeof(UTF8TextNode), + typeof(Utf8TextNode), typeof(FunctionPtrNode) }; diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClassFile.cs index 82da7314..3e3a7fbe 100644 --- a/DataExchange/ReClassFile.cs +++ b/DataExchange/ReClassFile.cs @@ -262,7 +262,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C case BaseTextNode textNode: { TryGetAttributeValue(element, "Size", out var length, logger); - textNode.Length = textNode is UTF16TextNode ? length / 2 : length; + textNode.Length = textNode is Utf16TextNode ? length / 2 : length; break; } case BitFieldNode bitFieldNode: @@ -323,7 +323,7 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node), - typeof(UTF8TextNode), + typeof(Utf8TextNode), typeof(FunctionPtrNode), typeof(CustomNode), typeof(Vector2Node), @@ -337,7 +337,7 @@ public override Size Draw(ViewInfo view, int x, int y) null, typeof(Int64Node), typeof(DoubleNode), - typeof(UTF16TextNode), + typeof(Utf16TextNode), typeof(ClassPtrArrayNode) }; @@ -365,8 +365,8 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node), - typeof(UTF8TextNode), - typeof(UTF16TextNode), + typeof(Utf8TextNode), + typeof(Utf16TextNode), typeof(FunctionPtrNode), typeof(CustomNode), typeof(Vector2Node), @@ -376,8 +376,8 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(VTableNode), typeof(ClassInstanceArrayNode), null, - typeof(UTF8TextPtrNode), - typeof(UTF16TextPtrNode), + typeof(Utf8TextPtrNode), + typeof(Utf16TextPtrNode), typeof(BitFieldNode), typeof(UInt64Node), typeof(FunctionNode) diff --git a/DataExchange/ReClassNetFile.cs b/DataExchange/ReClassNetFile.cs index 969e7b30..614d1dfc 100644 --- a/DataExchange/ReClassNetFile.cs +++ b/DataExchange/ReClassNetFile.cs @@ -70,12 +70,12 @@ public ReClassNetFile(ReClassNetProject project) typeof(UInt16Node), typeof(UInt32Node), typeof(UInt64Node), - typeof(UTF8TextNode), - typeof(UTF8TextPtrNode), - typeof(UTF16TextNode), - typeof(UTF16TextPtrNode), - typeof(UTF32TextNode), - typeof(UTF32TextPtrNode), + typeof(Utf8TextNode), + typeof(Utf8TextPtrNode), + typeof(Utf16TextNode), + typeof(Utf16TextPtrNode), + typeof(Utf32TextNode), + typeof(Utf32TextPtrNode), typeof(Vector2Node), typeof(Vector3Node), typeof(Vector4Node), diff --git a/Forms/MainForm.Designer.cs b/Forms/MainForm.Designer.cs index acb036e4..d17bcf9f 100644 --- a/Forms/MainForm.Designer.cs +++ b/Forms/MainForm.Designer.cs @@ -764,7 +764,7 @@ private void InitializeComponent() this.utf8TextToolStripButton.Name = "utf8TextToolStripButton"; this.utf8TextToolStripButton.Size = new System.Drawing.Size(23, 22); this.utf8TextToolStripButton.ToolTipText = "UTF8 Text"; - this.utf8TextToolStripButton.Value = typeof(ReClassNET.Nodes.UTF8TextNode); + this.utf8TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.utf8TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); // // utf8TextPtrToolStripButton @@ -775,7 +775,7 @@ private void InitializeComponent() this.utf8TextPtrToolStripButton.Name = "utf8TextPtrToolStripButton"; this.utf8TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); this.utf8TextPtrToolStripButton.ToolTipText = "Pointer to UTF8 text"; - this.utf8TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.UTF8TextPtrNode); + this.utf8TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.utf8TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); // // utf16TextToolStripButton @@ -786,7 +786,7 @@ private void InitializeComponent() this.utf16TextToolStripButton.Name = "utf16TextToolStripButton"; this.utf16TextToolStripButton.Size = new System.Drawing.Size(23, 22); this.utf16TextToolStripButton.ToolTipText = "UTF16 / Unicode Text"; - this.utf16TextToolStripButton.Value = typeof(ReClassNET.Nodes.UTF16TextNode); + this.utf16TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.utf16TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); // // utf16TextPtrToolStripButton @@ -797,7 +797,7 @@ private void InitializeComponent() this.utf16TextPtrToolStripButton.Name = "utf16TextPtrToolStripButton"; this.utf16TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); this.utf16TextPtrToolStripButton.ToolTipText = "Pointer to UTF16 / Unicode text"; - this.utf16TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.UTF16TextPtrNode); + this.utf16TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.utf16TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); // // toolStripSeparator14 diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index 9125ae91..ffc4a18d 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -179,16 +179,16 @@ public T ReadObject(int offset) where T : struct return (T)obj; } - public string ReadPrintableASCIIString(IntPtr offset, int length) + public string ReadPrintableAsciiString(IntPtr offset, int length) { Contract.Requires(offset.ToInt32() >= 0); Contract.Requires(length >= 0); Contract.Ensures(Contract.Result() != null); - return ReadPrintableASCIIString(offset.ToInt32(), length); + return ReadPrintableAsciiString(offset.ToInt32(), length); } - public string ReadPrintableASCIIString(int offset, int length) + public string ReadPrintableAsciiString(int offset, int length) { Contract.Requires(offset >= 0); Contract.Requires(length >= 0); @@ -236,7 +236,7 @@ private string ReadString(Encoding encoding, int offset, int length) return sb.ToString(); } - public string ReadUTF8String(IntPtr offset, int length) + public string ReadUtf8String(IntPtr offset, int length) { Contract.Requires(offset.ToInt32() >= 0); Contract.Requires(length >= 0); @@ -245,7 +245,7 @@ public string ReadUTF8String(IntPtr offset, int length) return ReadString(Encoding.UTF8, offset.ToInt32(), length); } - public string ReadUTF16String(IntPtr offset, int length) + public string ReadUtf16String(IntPtr offset, int length) { Contract.Requires(offset.ToInt32() >= 0); Contract.Requires(length >= 0); @@ -254,7 +254,7 @@ public string ReadUTF16String(IntPtr offset, int length) return ReadString(Encoding.Unicode, offset.ToInt32(), length); } - public string ReadUTF32String(IntPtr offset, int length) + public string ReadUtf32String(IntPtr offset, int length) { Contract.Requires(offset.ToInt32() >= 0); Contract.Requires(length >= 0); diff --git a/Memory/NodeDissector.cs b/Memory/NodeDissector.cs index a149aca9..7c10eb75 100644 --- a/Memory/NodeDissector.cs +++ b/Memory/NodeDissector.cs @@ -46,11 +46,11 @@ public static Type GuessType(BaseHexNode node, MemoryBuffer memory) var raw = memory.ReadBytes(offset, node.MemorySize); if (raw.InterpretAsUTF8().IsLikelyPrintableData() >= 0.75f) { - return typeof(UTF8TextNode); + return typeof(Utf8TextNode); } else if (raw.InterpretAsUTF16().IsLikelyPrintableData() >= 0.75f) { - return typeof(UTF16TextNode); + return typeof(Utf16TextNode); } if (is8ByteAligned) @@ -142,11 +142,11 @@ private static Type GuessPointerType(IntPtr address, MemoryBuffer memory) var data = memory.Process.ReadRemoteMemory(address, IntPtr.Size * 2); if (data.Take(IntPtr.Size).InterpretAsUTF8().IsLikelyPrintableData() >= 07.5f) { - return typeof(UTF8TextPtrNode); + return typeof(Utf8TextPtrNode); } else if (data.InterpretAsUTF16().IsLikelyPrintableData() >= 0.75f) { - return typeof(UTF16TextPtrNode); + return typeof(Utf16TextPtrNode); } // Now it could be a pointer to something else but we can't tell. :( diff --git a/Nodes/Hex16Node.cs b/Nodes/Hex16Node.cs index 7fbf8afe..a93d13f5 100644 --- a/Nodes/Hex16Node.cs +++ b/Nodes/Hex16Node.cs @@ -27,7 +27,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 2) + " " : null, 2); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 2) + " " : null, 2); } public override void Update(HotSpot spot) diff --git a/Nodes/Hex32Node.cs b/Nodes/Hex32Node.cs index d26510b0..14ddb840 100644 --- a/Nodes/Hex32Node.cs +++ b/Nodes/Hex32Node.cs @@ -37,7 +37,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 4) + " " : null, 4); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 4) + " " : null, 4); } public override void Update(HotSpot spot) diff --git a/Nodes/Hex64Node.cs b/Nodes/Hex64Node.cs index a86400f9..ab297773 100644 --- a/Nodes/Hex64Node.cs +++ b/Nodes/Hex64Node.cs @@ -37,7 +37,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 8) + " " : null, 8); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 8) + " " : null, 8); } public override void Update(HotSpot spot) diff --git a/Nodes/Hex8Node.cs b/Nodes/Hex8Node.cs index 75923024..fe4df019 100644 --- a/Nodes/Hex8Node.cs +++ b/Nodes/Hex8Node.cs @@ -27,7 +27,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableASCIIString(Offset, 1) + " " : null, 1); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 1) + " " : null, 1); } public override void Update(HotSpot spot) diff --git a/Nodes/UTF16TextNode.cs b/Nodes/UTF16TextNode.cs index 8b69d452..11f19682 100644 --- a/Nodes/UTF16TextNode.cs +++ b/Nodes/UTF16TextNode.cs @@ -3,7 +3,7 @@ namespace ReClassNET.Nodes { - public class UTF16TextNode : BaseTextNode + public class Utf16TextNode : BaseTextNode { public override int CharacterSize => 2; @@ -14,7 +14,7 @@ public class UTF16TextNode : BaseTextNode /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUTF16String(Offset, MemorySize)); + return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUtf16String(Offset, MemorySize)); } } } diff --git a/Nodes/UTF16TextPtrNode.cs b/Nodes/UTF16TextPtrNode.cs index 8192222d..072a7545 100644 --- a/Nodes/UTF16TextPtrNode.cs +++ b/Nodes/UTF16TextPtrNode.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Nodes { - public class UTF16TextPtrNode : BaseTextPtrNode + public class Utf16TextPtrNode : BaseTextPtrNode { /// Draws this node. /// The view information. diff --git a/Nodes/UTF32TextNode.cs b/Nodes/UTF32TextNode.cs index de174317..5f8d0309 100644 --- a/Nodes/UTF32TextNode.cs +++ b/Nodes/UTF32TextNode.cs @@ -3,7 +3,7 @@ namespace ReClassNET.Nodes { - public class UTF32TextNode : BaseTextNode + public class Utf32TextNode : BaseTextNode { public override int CharacterSize => 4; @@ -14,7 +14,7 @@ public class UTF32TextNode : BaseTextNode /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUTF32String(Offset, MemorySize)); + return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUtf32String(Offset, MemorySize)); } } } diff --git a/Nodes/UTF32TextPtrNode.cs b/Nodes/UTF32TextPtrNode.cs index b0356002..ce3a7880 100644 --- a/Nodes/UTF32TextPtrNode.cs +++ b/Nodes/UTF32TextPtrNode.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Nodes { - public class UTF32TextPtrNode : BaseTextPtrNode + public class Utf32TextPtrNode : BaseTextPtrNode { /// Draws this node. /// The view information. diff --git a/Nodes/UTF8TextNode.cs b/Nodes/UTF8TextNode.cs index 33db64b4..46baafd8 100644 --- a/Nodes/UTF8TextNode.cs +++ b/Nodes/UTF8TextNode.cs @@ -3,7 +3,7 @@ namespace ReClassNET.Nodes { - public class UTF8TextNode : BaseTextNode + public class Utf8TextNode : BaseTextNode { public override int CharacterSize => 1; @@ -14,7 +14,7 @@ public class UTF8TextNode : BaseTextNode /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUTF8String(Offset, MemorySize)); + return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUtf8String(Offset, MemorySize)); } } } diff --git a/Nodes/UTF8TextPtrNode.cs b/Nodes/UTF8TextPtrNode.cs index e271a9f6..ee97bf13 100644 --- a/Nodes/UTF8TextPtrNode.cs +++ b/Nodes/UTF8TextPtrNode.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Nodes { - public class UTF8TextPtrNode : BaseTextPtrNode + public class Utf8TextPtrNode : BaseTextPtrNode { /// Draws this node. /// The view information. diff --git a/UI/MemoryViewControl.Designer.cs b/UI/MemoryViewControl.Designer.cs index 4588fa0a..3f406c44 100644 --- a/UI/MemoryViewControl.Designer.cs +++ b/UI/MemoryViewControl.Designer.cs @@ -420,7 +420,7 @@ private void InitializeComponent() this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; - this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UTF8TextNode); + this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); // // uTF8TextPointerToolStripMenuItem @@ -429,7 +429,7 @@ private void InitializeComponent() this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; - this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UTF8TextPtrNode); + this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); // // uTF16TextToolStripMenuItem @@ -438,7 +438,7 @@ private void InitializeComponent() this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; - this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UTF16TextNode); + this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); // // uTF16TextPointerToolStripMenuItem @@ -447,7 +447,7 @@ private void InitializeComponent() this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; - this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UTF16TextPtrNode); + this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); // // toolStripSeparator9 From 0eb3157470489428eaa880a32887f0d04fa9148f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 29 Aug 2017 23:52:03 +0200 Subject: [PATCH 037/777] Initial implementation of the MemorySearcher. --- MemorySearcher/IPatternMatcher.cs | 11 ++ MemorySearcher/Searcher.cs | 35 ++++++ MemorySearcher/SimplePatternMatcher.Naive.cs | 52 +++++++++ .../SimplePatternMatcher.RabinKarp.cs | 81 ++++++++++++++ .../SimplePatternMatcher.Strategy.cs | 34 ++++++ MemorySearcher/SimplePatternMatcher.cs | 102 ++++++++++++++++++ .../WildcardPatternMatcher.PatternByte.cs | 81 ++++++++++++++ MemorySearcher/WildcardPatternMatcher.cs | 91 ++++++++++++++++ ReClass.NET.csproj | 13 ++- 9 files changed, 496 insertions(+), 4 deletions(-) create mode 100644 MemorySearcher/IPatternMatcher.cs create mode 100644 MemorySearcher/Searcher.cs create mode 100644 MemorySearcher/SimplePatternMatcher.Naive.cs create mode 100644 MemorySearcher/SimplePatternMatcher.RabinKarp.cs create mode 100644 MemorySearcher/SimplePatternMatcher.Strategy.cs create mode 100644 MemorySearcher/SimplePatternMatcher.cs create mode 100644 MemorySearcher/WildcardPatternMatcher.PatternByte.cs create mode 100644 MemorySearcher/WildcardPatternMatcher.cs diff --git a/MemorySearcher/IPatternMatcher.cs b/MemorySearcher/IPatternMatcher.cs new file mode 100644 index 00000000..f0fa3236 --- /dev/null +++ b/MemorySearcher/IPatternMatcher.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace ReClassNET.MemorySearcher +{ + public interface IPatternMatcher + { + IEnumerable SearchMatches(IList data); + + IEnumerable SearchMatches(IList data, int index, int count); + } +} diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs new file mode 100644 index 00000000..5dce3a13 --- /dev/null +++ b/MemorySearcher/Searcher.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ReClassNET.Memory; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher +{ + public class Searcher + { + private readonly RemoteProcess process; + + public Searcher(RemoteProcess process) + { + Contract.Requires(process != null); + + this.process = process; + } + + private IEnumerable GetSearchableBuffers() + { + // exclude range + // exclude read only + + return process.Sections.Select(s => { var b = new MemoryBuffer { Size = s.Size.ToInt32() }; b.Update(s.Start); return b; }); + } + + public void Search(IPatternMatcher matcher) + { + /*var foundMatches = GetSearchableBuffers().AsParallel().SelectMany(mb => matcher.SearchMatches(mb.RawData)).ToList();*/ + } + } +} diff --git a/MemorySearcher/SimplePatternMatcher.Naive.cs b/MemorySearcher/SimplePatternMatcher.Naive.cs new file mode 100644 index 00000000..6937cfed --- /dev/null +++ b/MemorySearcher/SimplePatternMatcher.Naive.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher +{ + public partial class SimplePatternMatcher + { + private class NaiveMatchStrategy : IMatchStrategy + { + private readonly byte[] pattern; + + public int PatternLength => pattern.Length; + + public NaiveMatchStrategy(byte[] pattern) + { + Contract.Requires(pattern != null); + + this.pattern = pattern; + } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + if (count < PatternLength) + { + yield break; + } + + var endIndex = index + count - PatternLength + 1; + + for (var i = index; i < endIndex; ++i) + { + var found = true; + for (var j = 0; j < PatternLength; ++j) + { + if (data[i + j] != pattern[j]) + { + found = false; + + break; + } + } + + if (found) + { + yield return i - index; + } + } + } + } + } +} diff --git a/MemorySearcher/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/SimplePatternMatcher.RabinKarp.cs new file mode 100644 index 00000000..5cf4fb5d --- /dev/null +++ b/MemorySearcher/SimplePatternMatcher.RabinKarp.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher +{ + public partial class SimplePatternMatcher + { + private class RabinKarpMatchStrategy : IMatchStrategy + { + private const uint PrimeBase = 37; + + private readonly byte[] pattern; + + private readonly uint power; + private readonly uint patternHash; + + public int PatternLength => pattern.Length; + + public RabinKarpMatchStrategy(byte[] pattern) + { + Contract.Requires(pattern != null); + + this.pattern = pattern; + + power = 1; + for (var i = 0; i < pattern.Length; i++) + { + power *= PrimeBase; + } + + patternHash = CalculateHash(pattern, 0, pattern.Length); + } + + private static uint CalculateHash(IList data, int index, int count) + { + Contract.Requires(data != null); + Contract.Requires(index >= 0); + Contract.Requires(count >= 0); + Contract.Requires(data.Count - index >= count); + + uint hash = 0; + for (var i = index; i < index + count; ++i) + { + hash = hash * PrimeBase + data[i]; + } + return hash; + } + + private uint UpdateHash(uint hash, byte outByte, byte inByte) + { + unchecked + { + hash = PrimeBase * hash + inByte - power * outByte; + } + return hash; + } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + if (count < PatternLength) + { + yield break; + } + + var dataHash = CalculateHash(data, index, PatternLength); + + var endIndex = index + count - PatternLength; + + for (var i = index; i < endIndex; ++i) + { + if (dataHash == patternHash) + { + yield return i - index; + } + + dataHash = UpdateHash(dataHash, data[i], data[i + PatternLength]); + } + } + } + } +} diff --git a/MemorySearcher/SimplePatternMatcher.Strategy.cs b/MemorySearcher/SimplePatternMatcher.Strategy.cs new file mode 100644 index 00000000..2cb09886 --- /dev/null +++ b/MemorySearcher/SimplePatternMatcher.Strategy.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher +{ + public partial class SimplePatternMatcher + { + [ContractClass(typeof(IMatchStrategyContract))] + private interface IMatchStrategy + { + int PatternLength { get; } + + IEnumerable SearchMatches(IList data, int index, int count); + } + + [ContractClassFor(typeof(IMatchStrategy))] + internal abstract class IMatchStrategyContract : IMatchStrategy + { + public int PatternLength { get { throw new NotImplementedException(); } } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + Contract.Requires(data != null); + Contract.Requires(index >= 0); + Contract.Requires(count >= 0); + Contract.Requires(data.Count - index >= count); + Contract.Ensures(Contract.Result>() != null); + + throw new NotImplementedException(); + } + } + } +} diff --git a/MemorySearcher/SimplePatternMatcher.cs b/MemorySearcher/SimplePatternMatcher.cs new file mode 100644 index 00000000..9c53c37e --- /dev/null +++ b/MemorySearcher/SimplePatternMatcher.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace ReClassNET.MemorySearcher +{ + public partial class SimplePatternMatcher : IPatternMatcher + { + private readonly IMatchStrategy strategy; + + #region Construction + + public SimplePatternMatcher(byte[] pattern) + { + Contract.Requires(pattern != null); + + strategy = ChooseStrategy(pattern); + } + + public SimplePatternMatcher(byte value) + : this(new[] { value }) + { + + } + + public SimplePatternMatcher(short value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(ushort value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(int value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(uint value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(long value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(ulong value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(float value) + : this(BitConverter.GetBytes(value)) + { + + } + + public SimplePatternMatcher(double value) + : this(BitConverter.GetBytes(value)) + { + + } + + #endregion + + private static IMatchStrategy ChooseStrategy(byte[] pattern) + { + Contract.Requires(pattern != null); + Contract.Ensures(Contract.Result() != null); + + if (pattern.Length <= 5) + { + return new NaiveMatchStrategy(pattern); + } + else + { + return new RabinKarpMatchStrategy(pattern); + } + } + + public IEnumerable SearchMatches(IList data) + { + return SearchMatches(data, 0, data.Count); + } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + return strategy.SearchMatches(data, index, count); + } + } +} diff --git a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs new file mode 100644 index 00000000..68918305 --- /dev/null +++ b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs @@ -0,0 +1,81 @@ +using System.Diagnostics.Contracts; +using System.IO; + +namespace ReClassNET.MemorySearcher +{ + public partial class WildcardPatternMatcher + { + private struct PatternByte + { + private struct Nibble + { + public int Value; + public bool IsWildcard; + } + + private Nibble Nibble1; + private Nibble Nibble2; + + private static bool IsHexValue(char c) + { + return ('0' <= c && c <= '9') + || ('A' <= c && c <= 'F') + || ('a' <= c && c <= 'f'); + } + + private static int HexToInt(char c) + { + if ('0' <= c && c <= '9') + return c - '0'; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + return c - 'a' + 10; + } + + public bool TryRead(StringReader sr) + { + Contract.Requires(sr != null); + + var temp = sr.ReadSkipWhitespaces(); + if (temp == -1 || (!IsHexValue((char)temp) && (char)temp != '?')) + { + return false; + } + + Nibble1.Value = HexToInt((char)temp) & 0xF; + Nibble1.IsWildcard = (char)temp == '?'; + + temp = sr.Read(); + if (temp == -1 || char.IsWhiteSpace((char)temp) || (char)temp == '?') + { + Nibble2.IsWildcard = true; + + return true; + } + + if (!IsHexValue((char)temp)) + { + return false; + } + Nibble2.Value = HexToInt((char)temp) & 0xF; + Nibble2.IsWildcard = false; + + return true; + } + + public bool Equals(byte b) + { + var matched = 0; + if (Nibble1.IsWildcard || ((b >> 4) & 0xF) == Nibble1.Value) + { + ++matched; + } + if (Nibble2.IsWildcard || (b & 0xF) == Nibble2.Value) + { + ++matched; + } + return matched == 2; + } + } + } +} diff --git a/MemorySearcher/WildcardPatternMatcher.cs b/MemorySearcher/WildcardPatternMatcher.cs new file mode 100644 index 00000000..4c392a3e --- /dev/null +++ b/MemorySearcher/WildcardPatternMatcher.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReClassNET.MemorySearcher +{ + public static class StringReaderExtension + { + public static int ReadSkipWhitespaces(this StringReader sr) + { + while (true) + { + var i = sr.Read(); + if (i == -1) + { + return i; + } + + if (!char.IsWhiteSpace((char)i)) + { + return i; + } + } + } + } + + public partial class WildcardPatternMatcher : IPatternMatcher + { + private readonly List pattern; + + public WildcardPatternMatcher(string value) + { + Contract.Requires(value != null); + + pattern = new List(); + + using (var sr = new StringReader(value)) + { + var pb = new PatternByte(); + while (pb.TryRead(sr)) + { + pattern.Add(pb); + } + + // Check if we are not at the end of the stream + if (sr.Peek() != -1) + { + throw new ArgumentException(); + } + } + } + + public IEnumerable SearchMatches(IList data) + { + return SearchMatches(data, 0, data.Count); + } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + if (count < pattern.Count) + { + yield break; + } + + var endIndex = index + count - pattern.Count + 1; + + for (var i = index; i < endIndex; ++i) + { + var found = true; + for (var j = 0; j < pattern.Count; ++j) + { + if (!pattern[j].Equals(data[i + j])) + { + found = false; + + break; + } + } + + if (found) + { + yield return i - index; + } + } + } + } +} diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 59fac37b..79c26e35 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -171,6 +171,14 @@ InputBytesForm.cs + + + + + + + + @@ -243,9 +251,7 @@ LogForm.cs - - Component - + MemoryViewControl.cs @@ -445,7 +451,6 @@ - From c65900199e84dfc87d896d551af34da407a4e86c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 2 Sep 2017 00:30:41 +0200 Subject: [PATCH 038/777] Added ContractClass. --- MemorySearcher/IPatternMatcher.cs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/MemorySearcher/IPatternMatcher.cs b/MemorySearcher/IPatternMatcher.cs index f0fa3236..d1478194 100644 --- a/MemorySearcher/IPatternMatcher.cs +++ b/MemorySearcher/IPatternMatcher.cs @@ -1,11 +1,37 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; namespace ReClassNET.MemorySearcher { + [ContractClass(typeof(PatternMatcherContract))] public interface IPatternMatcher { IEnumerable SearchMatches(IList data); IEnumerable SearchMatches(IList data, int index, int count); } + + [ContractClassFor(typeof(IPatternMatcher))] + internal abstract class PatternMatcherContract : IPatternMatcher + { + public IEnumerable SearchMatches(IList data) + { + Contract.Requires(data != null); + Contract.Ensures(Contract.Result>() != null); + + throw new NotImplementedException(); + } + + public IEnumerable SearchMatches(IList data, int index, int count) + { + Contract.Requires(data != null); + Contract.Requires(index >= 0); + Contract.Requires(count >= 0); + Contract.Requires(data.Count - index >= count); + Contract.Ensures(Contract.Result>() != null); + + throw new NotImplementedException(); + } + } } From 59f81ed685eb24877df5fd7d629e30ae344c3758 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 2 Sep 2017 00:31:40 +0200 Subject: [PATCH 039/777] Moved extension to own file. --- .../WildcardPatternMatcher.PatternByte.cs | 1 + MemorySearcher/WildcardPatternMatcher.cs | 23 ------------------ Util/Extension.StringReader.cs | 24 +++++++++++++++++++ 3 files changed, 25 insertions(+), 23 deletions(-) create mode 100644 Util/Extension.StringReader.cs diff --git a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs index 68918305..c07bdba8 100644 --- a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs +++ b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs @@ -1,5 +1,6 @@ using System.Diagnostics.Contracts; using System.IO; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher { diff --git a/MemorySearcher/WildcardPatternMatcher.cs b/MemorySearcher/WildcardPatternMatcher.cs index 4c392a3e..cc2b58ae 100644 --- a/MemorySearcher/WildcardPatternMatcher.cs +++ b/MemorySearcher/WildcardPatternMatcher.cs @@ -2,32 +2,9 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ReClassNET.MemorySearcher { - public static class StringReaderExtension - { - public static int ReadSkipWhitespaces(this StringReader sr) - { - while (true) - { - var i = sr.Read(); - if (i == -1) - { - return i; - } - - if (!char.IsWhiteSpace((char)i)) - { - return i; - } - } - } - } - public partial class WildcardPatternMatcher : IPatternMatcher { private readonly List pattern; diff --git a/Util/Extension.StringReader.cs b/Util/Extension.StringReader.cs new file mode 100644 index 00000000..17c3e255 --- /dev/null +++ b/Util/Extension.StringReader.cs @@ -0,0 +1,24 @@ +using System.IO; + +namespace ReClassNET.Util +{ + public static class StringReaderExtension + { + public static int ReadSkipWhitespaces(this StringReader sr) + { + while (true) + { + var i = sr.Read(); + if (i == -1) + { + return i; + } + + if (!char.IsWhiteSpace((char)i)) + { + return i; + } + } + } + } +} From 8ad69a7b282cda7419ab9609f29d663319412540 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 2 Sep 2017 00:32:29 +0200 Subject: [PATCH 040/777] Removed unneed usings. --- MemorySearcher/Searcher.cs | 7 ++----- MemorySearcher/SimplePatternMatcher.Naive.cs | 3 +-- MemorySearcher/SimplePatternMatcher.Strategy.cs | 6 +++--- MemorySearcher/SimplePatternMatcher.cs | 1 - ReClass.NET.csproj | 5 ++++- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index 5dce3a13..96fd8462 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System.Diagnostics.Contracts; using System.Linq; -using System.Text; -using System.Threading.Tasks; using ReClassNET.Memory; -using System.Diagnostics.Contracts; namespace ReClassNET.MemorySearcher { diff --git a/MemorySearcher/SimplePatternMatcher.Naive.cs b/MemorySearcher/SimplePatternMatcher.Naive.cs index 6937cfed..37f90539 100644 --- a/MemorySearcher/SimplePatternMatcher.Naive.cs +++ b/MemorySearcher/SimplePatternMatcher.Naive.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics.Contracts; namespace ReClassNET.MemorySearcher diff --git a/MemorySearcher/SimplePatternMatcher.Strategy.cs b/MemorySearcher/SimplePatternMatcher.Strategy.cs index 2cb09886..7beee4b2 100644 --- a/MemorySearcher/SimplePatternMatcher.Strategy.cs +++ b/MemorySearcher/SimplePatternMatcher.Strategy.cs @@ -6,7 +6,7 @@ namespace ReClassNET.MemorySearcher { public partial class SimplePatternMatcher { - [ContractClass(typeof(IMatchStrategyContract))] + [ContractClass(typeof(MatchStrategyContract))] private interface IMatchStrategy { int PatternLength { get; } @@ -15,9 +15,9 @@ private interface IMatchStrategy } [ContractClassFor(typeof(IMatchStrategy))] - internal abstract class IMatchStrategyContract : IMatchStrategy + internal abstract class MatchStrategyContract : IMatchStrategy { - public int PatternLength { get { throw new NotImplementedException(); } } + public int PatternLength => throw new NotImplementedException(); public IEnumerable SearchMatches(IList data, int index, int count) { diff --git a/MemorySearcher/SimplePatternMatcher.cs b/MemorySearcher/SimplePatternMatcher.cs index 9c53c37e..0b42e9e2 100644 --- a/MemorySearcher/SimplePatternMatcher.cs +++ b/MemorySearcher/SimplePatternMatcher.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using System.Text; namespace ReClassNET.MemorySearcher { diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 79c26e35..c2d4451d 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -251,7 +251,9 @@ LogForm.cs - + + Component + MemoryViewControl.cs @@ -260,6 +262,7 @@ + Form From d3d3926b5b2e6cf53c6c24fa4530232e65aeb676 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 2 Sep 2017 00:52:18 +0200 Subject: [PATCH 041/777] Added EnumerateProcessData.Name. --- Core/CoreFunctionsManager.cs | 2 +- Core/DataExchange.cs | 3 +++ Memory/ProcessInfo.cs | 5 +++-- NativeCore/ReClassNET_Plugin.hpp | 20 +++++++++++++++++++- NativeCore/Unix/EnumerateProcesses.cpp | 4 +++- NativeCore/Windows/EnumerateProcesses.cpp | 14 +++++++++----- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/Core/CoreFunctionsManager.cs b/Core/CoreFunctionsManager.cs index e1f0a63a..21d6b794 100644 --- a/Core/CoreFunctionsManager.cs +++ b/Core/CoreFunctionsManager.cs @@ -92,7 +92,7 @@ public void EnumerateProcesses(Action callbackProcess) { var c = callbackProcess == null ? null : (EnumerateProcessCallback)delegate (ref EnumerateProcessData data) { - callbackProcess(new ProcessInfo(data.Id, data.Path)); + callbackProcess(new ProcessInfo(data.Id, data.Name, data.Path)); }; currentFunctions.EnumerateProcesses(c); diff --git a/Core/DataExchange.cs b/Core/DataExchange.cs index fb18558d..1c7b21d5 100644 --- a/Core/DataExchange.cs +++ b/Core/DataExchange.cs @@ -23,6 +23,9 @@ public struct EnumerateProcessData { public IntPtr Id; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string Name; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string Path; }; diff --git a/Memory/ProcessInfo.cs b/Memory/ProcessInfo.cs index 67b792da..97159f6d 100644 --- a/Memory/ProcessInfo.cs +++ b/Memory/ProcessInfo.cs @@ -9,12 +9,13 @@ public class ProcessInfo public string Name { get; } public string Path { get; } - public ProcessInfo(IntPtr id, string path) + public ProcessInfo(IntPtr id, string name, string path) { + Contract.Requires(name != null); Contract.Requires(path != null); Id = id; - Name = System.IO.Path.GetFileName(path); + Name = name; Path = path; } } diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index a12c7ad6..6cb62260 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -115,7 +115,8 @@ enum class HardwareBreakpointSize struct EnumerateProcessData { RC_Size Id; - RC_UnicodeChar ModulePath[PATH_MAXIMUM_LENGTH]; + RC_UnicodeChar Name[PATH_MAXIMUM_LENGTH]; + RC_UnicodeChar Path[PATH_MAXIMUM_LENGTH]; }; struct InstructionData @@ -262,3 +263,20 @@ inline void MultiByteToUnicode(const char* src, RC_UnicodeChar* dst, int size) std::memcpy(dst, temp.c_str(), std::min(static_cast(temp.length()), size) * sizeof(char16_t)); } + +inline char16_t* str16cpy(char16_t* destination, const char16_t* source, size_t n) +{ + char16_t* temp = destination; + while (n > 0 && *source != 0) + { + *temp++ = *source++; + --n; + } + while (n > 0) + { + *temp++ = 0; + --n; + } + while ((*temp++ = *source++) != 0); + return destination; +} diff --git a/NativeCore/Unix/EnumerateProcesses.cpp b/NativeCore/Unix/EnumerateProcesses.cpp index 4d2e999c..ed53f7c0 100644 --- a/NativeCore/Unix/EnumerateProcesses.cpp +++ b/NativeCore/Unix/EnumerateProcesses.cpp @@ -122,7 +122,9 @@ extern "C" void EnumerateProcesses(EnumerateProcessCallback callbackProcess) { EnumerateProcessData data = {}; data.Id = parse_type(name); - MultiByteToUnicode(linkPath.c_str(), data.ModulePath, PATH_MAXIMUM_LENGTH); + MultiByteToUnicode(linkPath.c_str(), data.Path, PATH_MAXIMUM_LENGTH); + const auto name = fs::path(data.Path).filename().u16string(); + str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH)); callbackProcess(&data); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index fcda9703..561d6661 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -1,6 +1,8 @@ #include #include -#include +#include +#include +namespace fs = std::experimental::filesystem; #include "NativeCore.hpp" @@ -49,7 +51,7 @@ void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess) return; } - auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (handle != INVALID_HANDLE_VALUE) { PROCESSENTRY32W pe32 = {}; @@ -58,10 +60,10 @@ void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess) { do { - auto process = OpenRemoteProcess(reinterpret_cast(pe32.th32ProcessID), ProcessAccess::Read); + const auto process = OpenRemoteProcess(reinterpret_cast(pe32.th32ProcessID), ProcessAccess::Read); if (IsProcessValid(process)) { - auto platform = GetProcessPlatform(process); + const auto platform = GetProcessPlatform(process); #ifdef RECLASSNET64 if (platform == Platform::X64) #else @@ -70,7 +72,9 @@ void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess) { EnumerateProcessData data; data.Id = pe32.th32ProcessID; - GetModuleFileNameExW(process, nullptr, reinterpret_cast(data.ModulePath), PATH_MAXIMUM_LENGTH); + GetModuleFileNameExW(process, nullptr, reinterpret_cast(data.Path), PATH_MAXIMUM_LENGTH); + const auto name = fs::path(data.Path).filename().u16string(); + str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH)); callbackProcess(&data); } From 6880b7d5c6b643b4517d5b6339cf580ac3a4327f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 2 Sep 2017 00:58:07 +0200 Subject: [PATCH 042/777] Initialize EnumerateProcessData. --- NativeCore/ReClassNET_Plugin.hpp | 1 - NativeCore/Unix/EnumerateProcesses.cpp | 2 +- NativeCore/Windows/EnumerateProcesses.cpp | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 6cb62260..4fc93e48 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -277,6 +277,5 @@ inline char16_t* str16cpy(char16_t* destination, const char16_t* source, size_t *temp++ = 0; --n; } - while ((*temp++ = *source++) != 0); return destination; } diff --git a/NativeCore/Unix/EnumerateProcesses.cpp b/NativeCore/Unix/EnumerateProcesses.cpp index ed53f7c0..84cdcfe2 100644 --- a/NativeCore/Unix/EnumerateProcesses.cpp +++ b/NativeCore/Unix/EnumerateProcesses.cpp @@ -124,7 +124,7 @@ extern "C" void EnumerateProcesses(EnumerateProcessCallback callbackProcess) data.Id = parse_type(name); MultiByteToUnicode(linkPath.c_str(), data.Path, PATH_MAXIMUM_LENGTH); const auto name = fs::path(data.Path).filename().u16string(); - str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH)); + str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH - 1)); callbackProcess(&data); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index 561d6661..0128a473 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -70,11 +70,11 @@ void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess) if (platform == Platform::X86) #endif { - EnumerateProcessData data; + EnumerateProcessData data = { }; data.Id = pe32.th32ProcessID; GetModuleFileNameExW(process, nullptr, reinterpret_cast(data.Path), PATH_MAXIMUM_LENGTH); const auto name = fs::path(data.Path).filename().u16string(); - str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH)); + str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH - 1)); callbackProcess(&data); } From 5f346253250605f51f1650d09d1043bda1c7b5a6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 3 Sep 2017 17:36:46 +0200 Subject: [PATCH 043/777] Added second constructor for size initialization and allow direct memory access. --- Memory/MemoryBuffer.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index ffc4a18d..dd8c68af 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -15,6 +15,8 @@ public class MemoryBuffer public RemoteProcess Process { get; set; } + public byte[] RawData => data; + public int Size { get => data.Length; @@ -44,12 +46,20 @@ private void ObjectInvariants() } public MemoryBuffer() + : this(0) + { + Contract.Ensures(data != null); + Contract.Ensures(historyData != null); + } + + public MemoryBuffer(int size) { + Contract.Requires(size >= 0); Contract.Ensures(data != null); Contract.Ensures(historyData != null); - data = new byte[0]; - historyData = new byte[0]; + data = new byte[size]; + historyData = new byte[size]; } public MemoryBuffer(MemoryBuffer other) From 4f842ddc7bd7cc10564b9fc0eb885b7f6ad1b464 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 3 Sep 2017 17:40:34 +0200 Subject: [PATCH 044/777] Added CopyOnWrite section protection. --- Memory/Section.cs | 5 +-- NativeCore/ReClassNET_Plugin.hpp | 5 +-- .../EnumerateRemoteSectionsAndModules.cpp | 36 +++++-------------- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/Memory/Section.cs b/Memory/Section.cs index 7d0f7c56..80054b94 100644 --- a/Memory/Section.cs +++ b/Memory/Section.cs @@ -17,9 +17,10 @@ public enum SectionProtection Read = 1, Write = 2, - Execute = 4, + CopyOnWrite = 4, + Execute = 8, - Guard = 8 + Guard = 16 } public enum SectionType diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index a12c7ad6..da9ddebd 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -32,9 +32,10 @@ enum class SectionProtection Read = 1, Write = 2, - Execute = 4, + CopyOnWrite = 4, + Execute = 8, - Guard = 8 + Guard = 16 }; inline SectionProtection operator|(SectionProtection lhs, SectionProtection rhs) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 61eba91a..3db367c8 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -25,33 +25,15 @@ void __stdcall EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRe section.BaseAddress = memInfo.BaseAddress; section.Size = memInfo.RegionSize; - switch (memInfo.Protect & 0xFF) - { - case PAGE_EXECUTE: - section.Protection = SectionProtection::Execute; - break; - case PAGE_EXECUTE_READ: - section.Protection = SectionProtection::Execute | SectionProtection::Read; - break; - case PAGE_EXECUTE_READWRITE: - case PAGE_EXECUTE_WRITECOPY: - section.Protection = SectionProtection::Execute | SectionProtection::Read | SectionProtection::Write; - break; - case PAGE_NOACCESS: - section.Protection = SectionProtection::NoAccess; - break; - case PAGE_READONLY: - section.Protection = SectionProtection::Read; - break; - case PAGE_READWRITE: - case PAGE_WRITECOPY: - section.Protection = SectionProtection::Read | SectionProtection::Write; - break; - } - if ((memInfo.Protect & PAGE_GUARD) == PAGE_GUARD) - { - section.Protection |= SectionProtection::Guard; - } + section.Protection = SectionProtection::NoAccess; + if ((memInfo.Protect & PAGE_EXECUTE) == PAGE_EXECUTE) section.Protection |= SectionProtection::Execute; + if ((memInfo.Protect & PAGE_EXECUTE_READ) == PAGE_EXECUTE_READ) section.Protection |= SectionProtection::Execute | SectionProtection::Read; + if ((memInfo.Protect & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::Write; + if ((memInfo.Protect & PAGE_EXECUTE_WRITECOPY) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::CopyOnWrite; + if ((memInfo.Protect & PAGE_READONLY) == PAGE_READONLY) section.Protection |= SectionProtection::Read; + if ((memInfo.Protect & PAGE_READWRITE) == PAGE_READWRITE) section.Protection |= SectionProtection::Read | SectionProtection::Write; + if ((memInfo.Protect & PAGE_WRITECOPY) == PAGE_WRITECOPY) section.Protection |= SectionProtection::Read | SectionProtection::CopyOnWrite; + if ((memInfo.Protect & PAGE_GUARD) == PAGE_GUARD) section.Protection |= SectionProtection::Guard; switch (memInfo.Type) { From 0e6dd21dec6965d42e85f0bbc0370971afa3ede9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 3 Sep 2017 17:40:53 +0200 Subject: [PATCH 045/777] Added SearchSettings. --- MemorySearcher/SearchSettings.cs | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 MemorySearcher/SearchSettings.cs diff --git a/MemorySearcher/SearchSettings.cs b/MemorySearcher/SearchSettings.cs new file mode 100644 index 00000000..6cb349f3 --- /dev/null +++ b/MemorySearcher/SearchSettings.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReClassNET.MemorySearcher +{ + public enum SettingState + { + Yes, + No, + Indeterminate + } + + public class SearchSettings + { + public IntPtr StartAddress { get; set; } = IntPtr.Zero; + public IntPtr StopAddress { get; set; } = +#if WIN64 + (IntPtr)long.MaxValue; +#else + (IntPtr)int.MaxValue; +#endif + public SettingState SearchOnlyWritableMemory { get; set; } = SettingState.Yes; + public SettingState SearchOnlyExecutableMemory { get; set; } = SettingState.Indeterminate; + public SettingState SearchOnlyCopyOnWriteMemory { get; set; } = SettingState.No; + public bool SearchMemPrivate { get; set; } = true; + public bool SearchMemImage { get; set; } = true; + public bool SearchMemMapped { get; set; } = false; + public bool FastScan { get; set; } = true; + public int Alignment { get; set; } = IntPtr.Size; + + public static SearchSettings Default => new SearchSettings(); + } +} From 683ddddc5a91a7e61782fa5fe47f4ffca50c50c3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Sep 2017 00:36:52 +0200 Subject: [PATCH 046/777] Added step size. --- MemorySearcher/SimplePatternMatcher.Naive.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/MemorySearcher/SimplePatternMatcher.Naive.cs b/MemorySearcher/SimplePatternMatcher.Naive.cs index 37f90539..a50ef1fa 100644 --- a/MemorySearcher/SimplePatternMatcher.Naive.cs +++ b/MemorySearcher/SimplePatternMatcher.Naive.cs @@ -8,6 +8,7 @@ public partial class SimplePatternMatcher private class NaiveMatchStrategy : IMatchStrategy { private readonly byte[] pattern; + private readonly int stepSize; public int PatternLength => pattern.Length; @@ -18,6 +19,14 @@ public NaiveMatchStrategy(byte[] pattern) this.pattern = pattern; } + public NaiveMatchStrategy(byte[] pattern, int stepSize) + { + Contract.Requires(pattern != null); + + this.pattern = pattern; + this.stepSize = stepSize; + } + public IEnumerable SearchMatches(IList data, int index, int count) { if (count < PatternLength) @@ -27,7 +36,7 @@ public IEnumerable SearchMatches(IList data, int index, int count) var endIndex = index + count - PatternLength + 1; - for (var i = index; i < endIndex; ++i) + for (var i = index; i < endIndex; i += stepSize) { var found = true; for (var j = 0; j < PatternLength; ++j) From 895d41c288ea73156f78f395f4a620fd1f74d281 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Sep 2017 00:37:07 +0200 Subject: [PATCH 047/777] Changed member names. --- .../WildcardPatternMatcher.PatternByte.cs | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs index c07bdba8..5ffa2e1f 100644 --- a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs +++ b/MemorySearcher/WildcardPatternMatcher.PatternByte.cs @@ -14,22 +14,20 @@ private struct Nibble public bool IsWildcard; } - private Nibble Nibble1; - private Nibble Nibble2; + private Nibble nibble1; + private Nibble nibble2; private static bool IsHexValue(char c) { - return ('0' <= c && c <= '9') - || ('A' <= c && c <= 'F') - || ('a' <= c && c <= 'f'); + return '0' <= c && c <= '9' + || 'A' <= c && c <= 'F' + || 'a' <= c && c <= 'f'; } private static int HexToInt(char c) { - if ('0' <= c && c <= '9') - return c - '0'; - if ('A' <= c && c <= 'F') - return c - 'A' + 10; + if ('0' <= c && c <= '9') return c - '0'; + if ('A' <= c && c <= 'F') return c - 'A' + 10; return c - 'a' + 10; } @@ -43,13 +41,13 @@ public bool TryRead(StringReader sr) return false; } - Nibble1.Value = HexToInt((char)temp) & 0xF; - Nibble1.IsWildcard = (char)temp == '?'; + nibble1.Value = HexToInt((char)temp) & 0xF; + nibble1.IsWildcard = (char)temp == '?'; temp = sr.Read(); if (temp == -1 || char.IsWhiteSpace((char)temp) || (char)temp == '?') { - Nibble2.IsWildcard = true; + nibble2.IsWildcard = true; return true; } @@ -58,8 +56,8 @@ public bool TryRead(StringReader sr) { return false; } - Nibble2.Value = HexToInt((char)temp) & 0xF; - Nibble2.IsWildcard = false; + nibble2.Value = HexToInt((char)temp) & 0xF; + nibble2.IsWildcard = false; return true; } @@ -67,11 +65,11 @@ public bool TryRead(StringReader sr) public bool Equals(byte b) { var matched = 0; - if (Nibble1.IsWildcard || ((b >> 4) & 0xF) == Nibble1.Value) + if (nibble1.IsWildcard || ((b >> 4) & 0xF) == nibble1.Value) { ++matched; } - if (Nibble2.IsWildcard || (b & 0xF) == Nibble2.Value) + if (nibble2.IsWildcard || (b & 0xF) == nibble2.Value) { ++matched; } From 941fbb42f469c13547b298aa4681f30ba0688faf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Sep 2017 00:40:52 +0200 Subject: [PATCH 048/777] Moved algorithmns. --- .../{ => Algorithm}/IPatternMatcher.cs | 0 .../SimplePatternMatcher.Naive.cs | 0 .../SimplePatternMatcher.RabinKarp.cs | 0 .../SimplePatternMatcher.Strategy.cs | 0 .../{ => Algorithm}/SimplePatternMatcher.cs | 0 .../WildcardPatternMatcher.PatternByte.cs | 0 .../{ => Algorithm}/WildcardPatternMatcher.cs | 0 ReClass.NET.csproj | 18 +++++++++++------- 8 files changed, 11 insertions(+), 7 deletions(-) rename MemorySearcher/{ => Algorithm}/IPatternMatcher.cs (100%) rename MemorySearcher/{ => Algorithm}/SimplePatternMatcher.Naive.cs (100%) rename MemorySearcher/{ => Algorithm}/SimplePatternMatcher.RabinKarp.cs (100%) rename MemorySearcher/{ => Algorithm}/SimplePatternMatcher.Strategy.cs (100%) rename MemorySearcher/{ => Algorithm}/SimplePatternMatcher.cs (100%) rename MemorySearcher/{ => Algorithm}/WildcardPatternMatcher.PatternByte.cs (100%) rename MemorySearcher/{ => Algorithm}/WildcardPatternMatcher.cs (100%) diff --git a/MemorySearcher/IPatternMatcher.cs b/MemorySearcher/Algorithm/IPatternMatcher.cs similarity index 100% rename from MemorySearcher/IPatternMatcher.cs rename to MemorySearcher/Algorithm/IPatternMatcher.cs diff --git a/MemorySearcher/SimplePatternMatcher.Naive.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs similarity index 100% rename from MemorySearcher/SimplePatternMatcher.Naive.cs rename to MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs diff --git a/MemorySearcher/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs similarity index 100% rename from MemorySearcher/SimplePatternMatcher.RabinKarp.cs rename to MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs diff --git a/MemorySearcher/SimplePatternMatcher.Strategy.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs similarity index 100% rename from MemorySearcher/SimplePatternMatcher.Strategy.cs rename to MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs diff --git a/MemorySearcher/SimplePatternMatcher.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.cs similarity index 100% rename from MemorySearcher/SimplePatternMatcher.cs rename to MemorySearcher/Algorithm/SimplePatternMatcher.cs diff --git a/MemorySearcher/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs similarity index 100% rename from MemorySearcher/WildcardPatternMatcher.PatternByte.cs rename to MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs diff --git a/MemorySearcher/WildcardPatternMatcher.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs similarity index 100% rename from MemorySearcher/WildcardPatternMatcher.cs rename to MemorySearcher/Algorithm/WildcardPatternMatcher.cs diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index c2d4451d..49f5a6f3 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -171,14 +171,15 @@ InputBytesForm.cs - + - - - - - - + + + + + + + @@ -404,6 +405,9 @@ InputBytesForm.cs + + MemorySearcherForm.cs + ClassNodeView.cs Designer From 537a9443775f4c8c1cb3733267452e1690e51877 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Sep 2017 00:44:22 +0200 Subject: [PATCH 049/777] Moved into correct namespace. --- MemorySearcher/Algorithm/IPatternMatcher.cs | 2 +- .../Algorithm/SimplePatternMatcher.Naive.cs | 2 +- .../Algorithm/SimplePatternMatcher.RabinKarp.cs | 2 +- .../Algorithm/SimplePatternMatcher.Strategy.cs | 2 +- MemorySearcher/Algorithm/SimplePatternMatcher.cs | 12 ++++++------ .../Algorithm/WildcardPatternMatcher.PatternByte.cs | 2 +- MemorySearcher/Algorithm/WildcardPatternMatcher.cs | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/MemorySearcher/Algorithm/IPatternMatcher.cs b/MemorySearcher/Algorithm/IPatternMatcher.cs index d1478194..49fee6aa 100644 --- a/MemorySearcher/Algorithm/IPatternMatcher.cs +++ b/MemorySearcher/Algorithm/IPatternMatcher.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { [ContractClass(typeof(PatternMatcherContract))] public interface IPatternMatcher diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs index a50ef1fa..bbccdcec 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class SimplePatternMatcher { diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs index 5cf4fb5d..38faa42a 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class SimplePatternMatcher { diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs index 7beee4b2..de848596 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class SimplePatternMatcher { diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.cs index 0b42e9e2..109f3200 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.cs @@ -2,11 +2,11 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class SimplePatternMatcher : IPatternMatcher { - private readonly IMatchStrategy strategy; + private readonly SimplePatternMatcher.IMatchStrategy strategy; #region Construction @@ -73,18 +73,18 @@ public SimplePatternMatcher(double value) #endregion - private static IMatchStrategy ChooseStrategy(byte[] pattern) + private static SimplePatternMatcher.IMatchStrategy ChooseStrategy(byte[] pattern) { Contract.Requires(pattern != null); - Contract.Ensures(Contract.Result() != null); + Contract.Ensures(Contract.Result() != null); if (pattern.Length <= 5) { - return new NaiveMatchStrategy(pattern); + return new SimplePatternMatcher.NaiveMatchStrategy(pattern); } else { - return new RabinKarpMatchStrategy(pattern); + return new SimplePatternMatcher.RabinKarpMatchStrategy(pattern); } } diff --git a/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs index 5ffa2e1f..57112564 100644 --- a/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs +++ b/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs @@ -2,7 +2,7 @@ using System.IO; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class WildcardPatternMatcher { diff --git a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs index cc2b58ae..a7a25b5e 100644 --- a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs +++ b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs @@ -3,7 +3,7 @@ using System.Diagnostics.Contracts; using System.IO; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Algorithm { public partial class WildcardPatternMatcher : IPatternMatcher { From 11d0183952abab9ec7f3f3e12c10b2d86c0eeb8e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Sep 2017 12:52:02 +0200 Subject: [PATCH 050/777] Removed PatternLength property. --- .../Algorithm/SimplePatternMatcher.Naive.cs | 9 ++++----- .../Algorithm/SimplePatternMatcher.RabinKarp.cs | 11 +++++------ .../Algorithm/SimplePatternMatcher.Strategy.cs | 4 ---- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs index bbccdcec..f5ad739d 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs @@ -10,8 +10,6 @@ private class NaiveMatchStrategy : IMatchStrategy private readonly byte[] pattern; private readonly int stepSize; - public int PatternLength => pattern.Length; - public NaiveMatchStrategy(byte[] pattern) { Contract.Requires(pattern != null); @@ -29,17 +27,18 @@ public NaiveMatchStrategy(byte[] pattern, int stepSize) public IEnumerable SearchMatches(IList data, int index, int count) { - if (count < PatternLength) + var patternLength = pattern.Length; + if (count < patternLength) { yield break; } - var endIndex = index + count - PatternLength + 1; + var endIndex = index + count - patternLength + 1; for (var i = index; i < endIndex; i += stepSize) { var found = true; - for (var j = 0; j < PatternLength; ++j) + for (var j = 0; j < patternLength; ++j) { if (data[i + j] != pattern[j]) { diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs index 38faa42a..83710206 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs @@ -14,8 +14,6 @@ private class RabinKarpMatchStrategy : IMatchStrategy private readonly uint power; private readonly uint patternHash; - public int PatternLength => pattern.Length; - public RabinKarpMatchStrategy(byte[] pattern) { Contract.Requires(pattern != null); @@ -57,14 +55,15 @@ private uint UpdateHash(uint hash, byte outByte, byte inByte) public IEnumerable SearchMatches(IList data, int index, int count) { - if (count < PatternLength) + var patternLength = pattern.Length; + if (count < patternLength) { yield break; } - var dataHash = CalculateHash(data, index, PatternLength); + var dataHash = CalculateHash(data, index, patternLength); - var endIndex = index + count - PatternLength; + var endIndex = index + count - patternLength; for (var i = index; i < endIndex; ++i) { @@ -73,7 +72,7 @@ public IEnumerable SearchMatches(IList data, int index, int count) yield return i - index; } - dataHash = UpdateHash(dataHash, data[i], data[i + PatternLength]); + dataHash = UpdateHash(dataHash, data[i], data[i + patternLength]); } } } diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs index de848596..0ce8e1b9 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs @@ -9,16 +9,12 @@ public partial class SimplePatternMatcher [ContractClass(typeof(MatchStrategyContract))] private interface IMatchStrategy { - int PatternLength { get; } - IEnumerable SearchMatches(IList data, int index, int count); } [ContractClassFor(typeof(IMatchStrategy))] internal abstract class MatchStrategyContract : IMatchStrategy { - public int PatternLength => throw new NotImplementedException(); - public IEnumerable SearchMatches(IList data, int index, int count) { Contract.Requires(data != null); From 9f70bbea0fe5547e2418c51736c9057c5beecd14 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Sep 2017 13:06:55 +0200 Subject: [PATCH 051/777] Use Marshal.PtrToStructure(). --- Memory/MemoryBuffer.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index dd8c68af..0424a8d6 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -179,14 +179,10 @@ public T ReadObject(int offset) where T : struct } var handle = GCHandle.Alloc(data, GCHandleType.Pinned); - var obj = Marshal.PtrToStructure(handle.AddrOfPinnedObject() + Offset + offset, typeof(T)); + var obj = Marshal.PtrToStructure(handle.AddrOfPinnedObject() + Offset + offset); handle.Free(); - if (obj == null) - { - return default(T); - } - return (T)obj; + return obj; } public string ReadPrintableAsciiString(IntPtr offset, int length) From 3f5fead07b014ecbdde4eb2b80c7c80d360f3b88 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Sep 2017 13:09:17 +0200 Subject: [PATCH 052/777] Changed method signature. --- MemorySearcher/Algorithm/IPatternMatcher.cs | 10 +++++----- MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs | 2 +- .../Algorithm/SimplePatternMatcher.RabinKarp.cs | 2 +- .../Algorithm/SimplePatternMatcher.Strategy.cs | 6 +++--- MemorySearcher/Algorithm/SimplePatternMatcher.cs | 8 ++++---- MemorySearcher/Algorithm/WildcardPatternMatcher.cs | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/MemorySearcher/Algorithm/IPatternMatcher.cs b/MemorySearcher/Algorithm/IPatternMatcher.cs index 49fee6aa..9cdee4c4 100644 --- a/MemorySearcher/Algorithm/IPatternMatcher.cs +++ b/MemorySearcher/Algorithm/IPatternMatcher.cs @@ -7,15 +7,15 @@ namespace ReClassNET.MemorySearcher.Algorithm [ContractClass(typeof(PatternMatcherContract))] public interface IPatternMatcher { - IEnumerable SearchMatches(IList data); + IEnumerable SearchMatches(byte[] data); - IEnumerable SearchMatches(IList data, int index, int count); + IEnumerable SearchMatches(byte[] data, int index, int count); } [ContractClassFor(typeof(IPatternMatcher))] internal abstract class PatternMatcherContract : IPatternMatcher { - public IEnumerable SearchMatches(IList data) + public IEnumerable SearchMatches(byte[] data) { Contract.Requires(data != null); Contract.Ensures(Contract.Result>() != null); @@ -23,12 +23,12 @@ public IEnumerable SearchMatches(IList data) throw new NotImplementedException(); } - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { Contract.Requires(data != null); Contract.Requires(index >= 0); Contract.Requires(count >= 0); - Contract.Requires(data.Count - index >= count); + Contract.Requires(data.Length - index >= count); Contract.Ensures(Contract.Result>() != null); throw new NotImplementedException(); diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs index f5ad739d..f801e82d 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs @@ -25,7 +25,7 @@ public NaiveMatchStrategy(byte[] pattern, int stepSize) this.stepSize = stepSize; } - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { var patternLength = pattern.Length; if (count < patternLength) diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs index 83710206..db854560 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs @@ -53,7 +53,7 @@ private uint UpdateHash(uint hash, byte outByte, byte inByte) return hash; } - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { var patternLength = pattern.Length; if (count < patternLength) diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs index 0ce8e1b9..55eb0734 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs @@ -9,18 +9,18 @@ public partial class SimplePatternMatcher [ContractClass(typeof(MatchStrategyContract))] private interface IMatchStrategy { - IEnumerable SearchMatches(IList data, int index, int count); + IEnumerable SearchMatches(byte[] data, int index, int count); } [ContractClassFor(typeof(IMatchStrategy))] internal abstract class MatchStrategyContract : IMatchStrategy { - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { Contract.Requires(data != null); Contract.Requires(index >= 0); Contract.Requires(count >= 0); - Contract.Requires(data.Count - index >= count); + Contract.Requires(data.Length - index >= count); Contract.Ensures(Contract.Result>() != null); throw new NotImplementedException(); diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.cs index 109f3200..40054f21 100644 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.cs +++ b/MemorySearcher/Algorithm/SimplePatternMatcher.cs @@ -6,7 +6,7 @@ namespace ReClassNET.MemorySearcher.Algorithm { public partial class SimplePatternMatcher : IPatternMatcher { - private readonly SimplePatternMatcher.IMatchStrategy strategy; + private readonly IMatchStrategy strategy; #region Construction @@ -88,12 +88,12 @@ private static SimplePatternMatcher.IMatchStrategy ChooseStrategy(byte[] pattern } } - public IEnumerable SearchMatches(IList data) + public IEnumerable SearchMatches(byte[] data) { - return SearchMatches(data, 0, data.Count); + return SearchMatches(data, 0, data.Length); } - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { return strategy.SearchMatches(data, index, count); } diff --git a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs index a7a25b5e..a88434f4 100644 --- a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs +++ b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs @@ -31,12 +31,12 @@ public WildcardPatternMatcher(string value) } } - public IEnumerable SearchMatches(IList data) + public IEnumerable SearchMatches(byte[] data) { - return SearchMatches(data, 0, data.Count); + return SearchMatches(data, 0, data.Length); } - public IEnumerable SearchMatches(IList data, int index, int count) + public IEnumerable SearchMatches(byte[] data, int index, int count) { if (count < pattern.Count) { From 06502ae9095c36bd5feb1c42b88481aedbc98dc5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 9 Sep 2017 19:51:22 +0200 Subject: [PATCH 053/777] Implemented GetSearchableSections() and added reporting. --- MemorySearcher/Searcher.cs | 85 ++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index 96fd8462..d08c0804 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -1,7 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using ReClassNET.Memory; +using ReClassNET.MemorySearcher.Algorithm; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher { @@ -16,17 +21,83 @@ public Searcher(RemoteProcess process) this.process = process; } - private IEnumerable GetSearchableBuffers() + private ICollection
GetSearchableSections(SearchSettings settings) { - // exclude range - // exclude read only + Contract.Requires(settings != null); - return process.Sections.Select(s => { var b = new MemoryBuffer { Size = s.Size.ToInt32() }; b.Update(s.Start); return b; }); + return process.Sections + .Where(s => !s.Protection.HasFlag(SectionProtection.Guard)) + .Where(s => s.Start.InRange(settings.StartAddress, settings.StopAddress)) + .Where(s => + { + switch (s.Type) + { + case SectionType.Private: return settings.SearchMemPrivate; + case SectionType.Image: return settings.SearchMemImage; + case SectionType.Mapped: return settings.SearchMemMapped; + default: return false; + } + }) + .Where(s => + { + var isWritable = s.Protection.HasFlag(SectionProtection.Write); + switch (settings.SearchWritableMemory) + { + case SettingState.Yes: return isWritable; + case SettingState.No: return !isWritable; + default: return true; + } + }) + .Where(s => + { + var isExecutable = s.Protection.HasFlag(SectionProtection.Execute); + switch (settings.SearchExecutableMemory) + { + case SettingState.Yes: return isExecutable; + case SettingState.No: return !isExecutable; + default: return true; + } + }) + .Where(s => + { + var isCopyOnWrite = s.Protection.HasFlag(SectionProtection.CopyOnWrite); + switch (settings.SearchCopyOnWriteMemory) + { + case SettingState.Yes: return isCopyOnWrite; + case SettingState.No: return !isCopyOnWrite; + default: return true; + } + }) + .ToList(); } - public void Search(IPatternMatcher matcher) + public IList Search(SearchSettings settings, IPatternMatcher matcher, CancellationToken ct, IProgress progress) { - /*var foundMatches = GetSearchableBuffers().AsParallel().SelectMany(mb => matcher.SearchMatches(mb.RawData)).ToList();*/ + Contract.Requires(settings != null); + Contract.Requires(matcher != null); + + var sections = GetSearchableSections(settings); + + progress?.Report(0); + + var counter = 0; + + return sections + .AsParallel() + .WithCancellation(ct) + .Select(s => + { + var buffer = new MemoryBuffer(s.Size.ToInt32()) { Process = process }; + buffer.Update(s.Start, false); + return new { StartAddress = s.Start, Buffer = buffer }; + }) + .SelectMany(i => + { + var result = matcher.SearchMatches(i.Buffer.RawData).Select(offset => i.StartAddress + offset).ToList(); + progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); + return result; + }) + .ToList(); } } } From 6fa5674a0900131a6581a4a67a60640fbe3dfc10 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 9 Sep 2017 23:56:36 +0200 Subject: [PATCH 054/777] Added memory value comparer. --- MemorySearcher/BytePattern.cs | 140 ++++++++++++++++++ .../Comparer/ArrayOfBytesMemoryComparer.cs | 55 +++++++ MemorySearcher/Comparer/ByteMemoryComparer.cs | 97 ++++++++++++ .../Comparer/DoubleMemoryComparer.cs | 114 ++++++++++++++ .../Comparer/FloatMemoryComparer.cs | 114 ++++++++++++++ MemorySearcher/Comparer/IMemoryComparer.cs | 12 ++ .../Comparer/IntegerMemoryComparer.cs | 97 ++++++++++++ MemorySearcher/Comparer/LongMemoryComparer.cs | 97 ++++++++++++ .../Comparer/ShortMemoryComparer.cs | 97 ++++++++++++ .../Comparer/StringMemoryComparer.cs | 38 +++++ MemorySearcher/InvalidCompareTypeException.cs | 13 ++ MemorySearcher/SearchCompareType.cs | 38 +++++ MemorySearcher/SearchResult.cs | 98 ++++++++++++ MemorySearcher/SearchRoundMode.cs | 9 ++ MemorySearcher/SearchSettings.cs | 18 +-- MemorySearcher/SearchValueType.cs | 24 +++ 16 files changed, 1050 insertions(+), 11 deletions(-) create mode 100644 MemorySearcher/BytePattern.cs create mode 100644 MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/ByteMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/DoubleMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/FloatMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/IMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/IntegerMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/LongMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/ShortMemoryComparer.cs create mode 100644 MemorySearcher/Comparer/StringMemoryComparer.cs create mode 100644 MemorySearcher/InvalidCompareTypeException.cs create mode 100644 MemorySearcher/SearchCompareType.cs create mode 100644 MemorySearcher/SearchResult.cs create mode 100644 MemorySearcher/SearchRoundMode.cs create mode 100644 MemorySearcher/SearchValueType.cs diff --git a/MemorySearcher/BytePattern.cs b/MemorySearcher/BytePattern.cs new file mode 100644 index 00000000..75b116dd --- /dev/null +++ b/MemorySearcher/BytePattern.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.IO; +using System.Linq; +using ReClassNET.Util; + +namespace ReClassNET.MemorySearcher +{ + public class BytePattern + { + private struct PatternByte + { + private struct Nibble + { + public int Value; + public bool IsWildcard; + } + + private Nibble nibble1; + private Nibble nibble2; + + public bool HasWildcard => nibble1.IsWildcard || nibble2.IsWildcard; + + public byte ByteValue => !HasWildcard ? (byte)(nibble1.Value << 4 + nibble2.Value) : throw new InvalidOperationException(); + + private static bool IsHexValue(char c) + { + return '0' <= c && c <= '9' + || 'A' <= c && c <= 'F' + || 'a' <= c && c <= 'f'; + } + + private static int HexToInt(char c) + { + if ('0' <= c && c <= '9') return c - '0'; + if ('A' <= c && c <= 'F') return c - 'A' + 10; + return c - 'a' + 10; + } + + public bool TryRead(StringReader sr) + { + Contract.Requires(sr != null); + + var temp = sr.ReadSkipWhitespaces(); + if (temp == -1 || !IsHexValue((char)temp) && (char)temp != '?') + { + return false; + } + + nibble1.Value = HexToInt((char)temp) & 0xF; + nibble1.IsWildcard = (char)temp == '?'; + + temp = sr.Read(); + if (temp == -1 || char.IsWhiteSpace((char)temp) || (char)temp == '?') + { + nibble2.IsWildcard = true; + + return true; + } + + if (!IsHexValue((char)temp)) + { + return false; + } + nibble2.Value = HexToInt((char)temp) & 0xF; + nibble2.IsWildcard = false; + + return true; + } + + public bool Equals(byte b) + { + var matched = 0; + if (nibble1.IsWildcard || ((b >> 4) & 0xF) == nibble1.Value) + { + ++matched; + } + if (nibble2.IsWildcard || (b & 0xF) == nibble2.Value) + { + ++matched; + } + return matched == 2; + } + } + + private readonly List pattern = new List(); + + public int Length => pattern.Count; + + public bool HasWildcards => pattern.Any(pb => pb.HasWildcard); + + public static BytePattern Parse(string value) + { + Contract.Requires(!string.IsNullOrEmpty(value)); + + var pattern = new BytePattern(); + + using (var sr = new StringReader(value)) + { + var pb = new PatternByte(); + while (pb.TryRead(sr)) + { + pattern.pattern.Add(pb); + } + + // Check if we are not at the end of the stream + if (sr.Peek() != -1) + { + throw new ArgumentException(); + } + } + + return pattern; + } + + public bool Equals(byte[] data, int index) + { + for (var j = 0; j < pattern.Count; ++j) + { + if (!pattern[j].Equals(data[index + j])) + { + return false; + } + } + + return true; + } + + public byte[] ToByteArray() + { + if (HasWildcards) + { + throw new InvalidOperationException(); + } + + return pattern.Select(pb => pb.ByteValue).ToArray(); + } + } +} diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs new file mode 100644 index 00000000..c742ba23 --- /dev/null +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -0,0 +1,55 @@ +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class ArrayOfBytesMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Equal; + public BytePattern Value { get; } + public int ValueSize => Value.Length; + + private readonly byte[] pattern; + + public ArrayOfBytesMemoryComparer(BytePattern value) + { + Contract.Requires(value != null); + + Value = value; + + if (!value.HasWildcards) + { + pattern = value.ToByteArray(); + } + } + + public bool Compare(byte[] data, int index) + { + if (pattern != null) + { + for (var i = 0; i < pattern.Length; ++i) + { + if (data[index + i] != pattern[i]) + { + return false; + } + } + + return true; + } + else + { + return Value.Equals(data, index); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is ArrayOfBytesSearchResult); +#endif + + return Compare(data, index); + } + } +} diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemorySearcher/Comparer/ByteMemoryComparer.cs new file mode 100644 index 00000000..e2e6a059 --- /dev/null +++ b/MemorySearcher/Comparer/ByteMemoryComparer.cs @@ -0,0 +1,97 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class ByteMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public byte Value1 { get; } + public byte Value2 { get; } + public int ValueSize => sizeof(byte); + + public ByteMemoryComparer(SearchCompareType compareType, byte value1, byte value2) + { + CompareType = compareType; + Value1 = value1; + Value2 = value2; + } + + public bool Compare(byte[] data, int index) + { + var value = data[index]; + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is ByteSearchResult); +#endif + + return Compare(data, index, (ByteSearchResult)other); + } + + public bool Compare(byte[] data, int index, ByteSearchResult other) + { + var value = data[index]; + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs new file mode 100644 index 00000000..453681a0 --- /dev/null +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -0,0 +1,114 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class DoubleMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchRoundMode RoundType { get; } = SearchRoundMode.Normal; + public double Value1 { get; } + public double Value2 { get; } + public int ValueSize => sizeof(double); + + public DoubleMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, double value1, double value2) + { + CompareType = compareType; + RoundType = roundType; + Value1 = value1; + Value2 = value2; + } + + private bool CheckRoundedEquality(double value) + { + switch (RoundType) + { + case SearchRoundMode.Strict: + return Math.Abs(value - Value1) < 0.05f; + case SearchRoundMode.Normal: + return Math.Abs(value - Value1) < 0.5f; + case SearchRoundMode.Truncate: + return (int)value == (int)Value1; + default: + throw new ArgumentOutOfRangeException(); + } + } + + public bool Compare(byte[] data, int index) + { + var value = BitConverter.ToDouble(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is DoubleSearchResult); +#endif + + return Compare(data, index, (DoubleSearchResult)other); + } + + public bool Compare(byte[] data, int index, DoubleSearchResult other) + { + var value = BitConverter.ToDouble(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs new file mode 100644 index 00000000..73aa7b80 --- /dev/null +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -0,0 +1,114 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class FloatMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchRoundMode RoundType { get; } = SearchRoundMode.Normal; + public float Value1 { get; } + public float Value2 { get; } + public int ValueSize => sizeof(float); + + public FloatMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, float value1, float value2) + { + CompareType = compareType; + RoundType = roundType; + Value1 = value1; + Value2 = value2; + } + + private bool CheckRoundedEquality(float value) + { + switch (RoundType) + { + case SearchRoundMode.Strict: + return Math.Abs(value - Value1) < 0.05f; + case SearchRoundMode.Normal: + return Math.Abs(value - Value1) < 0.5f; + case SearchRoundMode.Truncate: + return (int)value == (int)Value1; + default: + throw new ArgumentOutOfRangeException(); + } + } + + public bool Compare(byte[] data, int index) + { + var value = BitConverter.ToSingle(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is FloatSearchResult); +#endif + + return Compare(data, index, (FloatSearchResult)other); + } + + public bool Compare(byte[] data, int index, FloatSearchResult other) + { + var value = BitConverter.ToSingle(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/IMemoryComparer.cs b/MemorySearcher/Comparer/IMemoryComparer.cs new file mode 100644 index 00000000..e48b7a4b --- /dev/null +++ b/MemorySearcher/Comparer/IMemoryComparer.cs @@ -0,0 +1,12 @@ +namespace ReClassNET.MemorySearcher.Comparer +{ + public interface IMemoryComparer + { + SearchCompareType CompareType { get; } + int ValueSize { get; } + + bool Compare(byte[] data, int index); + + bool Compare(byte[] data, int index, SearchResult other); + } +} diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemorySearcher/Comparer/IntegerMemoryComparer.cs new file mode 100644 index 00000000..728ed98c --- /dev/null +++ b/MemorySearcher/Comparer/IntegerMemoryComparer.cs @@ -0,0 +1,97 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class IntegerMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public int Value1 { get; } + public int Value2 { get; } + public int ValueSize => sizeof(int); + + public IntegerMemoryComparer(SearchCompareType compareType, int value1, int value2) + { + CompareType = compareType; + Value1 = value1; + Value2 = value2; + } + + public bool Compare(byte[] data, int index) + { + var value = BitConverter.ToInt32(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is IntegerSearchResult); +#endif + + return Compare(data, index, (IntegerSearchResult)other); + } + + public bool Compare(byte[] data, int index, IntegerSearchResult other) + { + var value = BitConverter.ToInt32(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemorySearcher/Comparer/LongMemoryComparer.cs new file mode 100644 index 00000000..34f1e946 --- /dev/null +++ b/MemorySearcher/Comparer/LongMemoryComparer.cs @@ -0,0 +1,97 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class LongMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public long Value1 { get; } + public long Value2 { get; } + public int ValueSize => sizeof(long); + + public LongMemoryComparer(SearchCompareType compareType, long value1, long value2) + { + CompareType = compareType; + Value1 = value1; + Value2 = value2; + } + + public bool Compare(byte[] data, int index) + { + var value = BitConverter.ToInt64(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is LongSearchResult); +#endif + + return Compare(data, index, (LongSearchResult)other); + } + + public bool Compare(byte[] data, int index, LongSearchResult other) + { + var value = BitConverter.ToInt64(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemorySearcher/Comparer/ShortMemoryComparer.cs new file mode 100644 index 00000000..022e41e9 --- /dev/null +++ b/MemorySearcher/Comparer/ShortMemoryComparer.cs @@ -0,0 +1,97 @@ +using System; +using System.Diagnostics; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class ShortMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public short Value1 { get; } + public short Value2 { get; } + public int ValueSize => sizeof(short); + + public ShortMemoryComparer(SearchCompareType compareType, short value1, short value2) + { + CompareType = compareType; + Value1 = value1; + Value2 = value2; + } + + public bool Compare(byte[] data, int index) + { + var value = BitConverter.ToInt16(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is ShortSearchResult); +#endif + + return Compare(data, index, (ShortSearchResult)other); + } + + public bool Compare(byte[] data, int index, ShortSearchResult other) + { + var value = BitConverter.ToInt16(data, index); + + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != other.Value; + case SearchCompareType.NotChanged: + return value == other.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > other.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= other.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < other.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= other.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + } +} diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs new file mode 100644 index 00000000..e2f93814 --- /dev/null +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -0,0 +1,38 @@ +using System; +using System.Diagnostics; +using System.Text; + +namespace ReClassNET.MemorySearcher.Comparer +{ + public class StringMemoryComparer : IMemoryComparer + { + public SearchCompareType CompareType { get; set; } = SearchCompareType.Equal; + public bool CaseSensitive { get; } = true; + public Encoding Encoding { get; } = Encoding.UTF8; + public string Value { get; } + public int ValueSize => Value.Length * Encoding.GetMaxByteCount(1); + + public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) + { + Value = value; + Encoding = encoding; + CaseSensitive = caseSensitive; + } + + public bool Compare(byte[] data, int index) + { + var value = Encoding.GetString(data, index, Value.Length); + + return Value.Equals(value, CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase); + } + + public bool Compare(byte[] data, int index, SearchResult other) + { +#if DEBUG + Debug.Assert(other is StringSearchResult); +#endif + + return Compare(data, index); + } + } +} diff --git a/MemorySearcher/InvalidCompareTypeException.cs b/MemorySearcher/InvalidCompareTypeException.cs new file mode 100644 index 00000000..f9c8a031 --- /dev/null +++ b/MemorySearcher/InvalidCompareTypeException.cs @@ -0,0 +1,13 @@ +using System; + +namespace ReClassNET.MemorySearcher +{ + public class InvalidCompareTypeException : Exception + { + public InvalidCompareTypeException(SearchCompareType type) + : base($"{type} is not valid in the current state.") + { + + } + } +} diff --git a/MemorySearcher/SearchCompareType.cs b/MemorySearcher/SearchCompareType.cs new file mode 100644 index 00000000..d7c1f06f --- /dev/null +++ b/MemorySearcher/SearchCompareType.cs @@ -0,0 +1,38 @@ +using System.ComponentModel; + +namespace ReClassNET.MemorySearcher +{ + public enum SearchCompareType + { + [Description("Is Equal")] + Equal, + [Description("Is Not Equal")] + NotEqual, + [Description("Has Changed")] + Changed, + [Description("Has Not Changed")] + NotChanged, + [Description("Is Greater Than")] + GreaterThan, + [Description("Is Greater Than Or Equal")] + GreaterThanOrEqual, + [Description("Has Increased")] + Increased, + [Description("Has Increased Or Is Equal")] + IncreasedOrEqual, + [Description("Is Less Than")] + LessThan, + [Description("Is Less Than Or Equal")] + LessThanOrEqual, + [Description("Has Decreased")] + Decreased, + [Description("Has Decreased Or Is Equal")] + DecreasedOrEqual, + [Description("Is Between")] + Between, + [Description("Is Between Or Equal")] + BetweenOrEqual, + [Description("Unknown Initial Value")] + Unknown + } +} diff --git a/MemorySearcher/SearchResult.cs b/MemorySearcher/SearchResult.cs new file mode 100644 index 00000000..5a7cbeb1 --- /dev/null +++ b/MemorySearcher/SearchResult.cs @@ -0,0 +1,98 @@ +using System; + +namespace ReClassNET.MemorySearcher +{ + public abstract class SearchResult + { + public IntPtr Address { get; } + + protected SearchResult(IntPtr address) + { + Address = address; + } + } + + public class ByteSearchResult : SearchResult + { + public byte Value { get; } + + public ByteSearchResult(IntPtr address, byte value) + : base(address) + { + Value = value; + } + } + + public class ShortSearchResult : SearchResult + { + public short Value { get; } + + public ShortSearchResult(IntPtr address, short value) + : base(address) + { + Value = value; + } + } + + public class IntegerSearchResult : SearchResult + { + public int Value { get; } + + public IntegerSearchResult(IntPtr address, int value) + : base(address) + { + Value = value; + } + } + + public class LongSearchResult : SearchResult + { + public long Value { get; } + + public LongSearchResult(IntPtr address, long value) + : base(address) + { + Value = value; + } + } + + public class FloatSearchResult : SearchResult + { + public float Value { get; } + + public FloatSearchResult(IntPtr address, float value) + : base(address) + { + Value = value; + } + } + + public class DoubleSearchResult : SearchResult + { + public double Value { get; } + + public DoubleSearchResult(IntPtr address, double value) + : base(address) + { + Value = value; + } + } + + public class ArrayOfBytesSearchResult : SearchResult + { + public ArrayOfBytesSearchResult(IntPtr address) + : base(address) + { + + } + } + + public class StringSearchResult : SearchResult + { + public StringSearchResult(IntPtr address) + : base(address) + { + + } + } +} diff --git a/MemorySearcher/SearchRoundMode.cs b/MemorySearcher/SearchRoundMode.cs new file mode 100644 index 00000000..759926c2 --- /dev/null +++ b/MemorySearcher/SearchRoundMode.cs @@ -0,0 +1,9 @@ +namespace ReClassNET.MemorySearcher +{ + public enum SearchRoundMode + { + Strict, + Normal, + Truncate + } +} diff --git a/MemorySearcher/SearchSettings.cs b/MemorySearcher/SearchSettings.cs index 6cb349f3..fa0a51df 100644 --- a/MemorySearcher/SearchSettings.cs +++ b/MemorySearcher/SearchSettings.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using ReClassNET.MemorySearcher.Comparer; namespace ReClassNET.MemorySearcher { @@ -17,20 +14,19 @@ public class SearchSettings { public IntPtr StartAddress { get; set; } = IntPtr.Zero; public IntPtr StopAddress { get; set; } = -#if WIN64 +#if RECLASSNET64 (IntPtr)long.MaxValue; #else (IntPtr)int.MaxValue; #endif - public SettingState SearchOnlyWritableMemory { get; set; } = SettingState.Yes; - public SettingState SearchOnlyExecutableMemory { get; set; } = SettingState.Indeterminate; - public SettingState SearchOnlyCopyOnWriteMemory { get; set; } = SettingState.No; + public SettingState SearchWritableMemory { get; set; } = SettingState.Yes; + public SettingState SearchExecutableMemory { get; set; } = SettingState.Indeterminate; + public SettingState SearchCopyOnWriteMemory { get; set; } = SettingState.No; public bool SearchMemPrivate { get; set; } = true; public bool SearchMemImage { get; set; } = true; public bool SearchMemMapped { get; set; } = false; public bool FastScan { get; set; } = true; - public int Alignment { get; set; } = IntPtr.Size; - - public static SearchSettings Default => new SearchSettings(); + public int FastScanAlignment { get; set; } = 1; + public IMemoryComparer Comparer { get; set; } } } diff --git a/MemorySearcher/SearchValueType.cs b/MemorySearcher/SearchValueType.cs new file mode 100644 index 00000000..5d2ed0d3 --- /dev/null +++ b/MemorySearcher/SearchValueType.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; + +namespace ReClassNET.MemorySearcher +{ + public enum SearchValueType + { + [Description("Byte")] + Byte, + [Description("Short (2 Bytes)")] + Short, + [Description("Integer (4 Bytes)")] + Integer, + [Description("Long (8 Bytes)")] + Long, + [Description("Float (4 Bytes)")] + Float, + [Description("Double (8 Bytes)")] + Double, + [Description("Array of Bytes")] + ArrayOfBytes, + [Description("String")] + String + } +} From 991814f0c2efa499dad71f286c8e7c0a4bba87b8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Sep 2017 00:00:07 +0200 Subject: [PATCH 055/777] Added MemorySearchForm, DualValueControl and EnumDescriptionDisplay. --- Forms/MemorySearchForm.Designer.cs | 539 +++++++++++++++++++++++++++++ Forms/MemorySearchForm.cs | 212 ++++++++++++ Forms/MemorySearchForm.resx | 138 ++++++++ UI/DualValueControl.Designer.cs | 119 +++++++ UI/DualValueControl.cs | 63 ++++ UI/DualValueControl.resx | 120 +++++++ UI/EnumDescriptionDisplay.cs | 69 ++++ 7 files changed, 1260 insertions(+) create mode 100644 Forms/MemorySearchForm.Designer.cs create mode 100644 Forms/MemorySearchForm.cs create mode 100644 Forms/MemorySearchForm.resx create mode 100644 UI/DualValueControl.Designer.cs create mode 100644 UI/DualValueControl.cs create mode 100644 UI/DualValueControl.resx create mode 100644 UI/EnumDescriptionDisplay.cs diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs new file mode 100644 index 00000000..e1c8b7c0 --- /dev/null +++ b/Forms/MemorySearchForm.Designer.cs @@ -0,0 +1,539 @@ +namespace ReClassNET.Forms +{ + partial class MemorySearchForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.filterGroupBox = new System.Windows.Forms.GroupBox(); + this.valueTypeComboBox = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.scanTypeComboBox = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.isHexCheckBox = new System.Windows.Forms.CheckBox(); + this.valueDualValueControl = new ReClassNET.UI.DualValueControl(); + this.scanOptionsGroupBox = new System.Windows.Forms.GroupBox(); + this.fastScanAlignmentTextBox = new System.Windows.Forms.TextBox(); + this.fastScanCheckBox = new System.Windows.Forms.CheckBox(); + this.scanCopyOnWriteCheckBox = new System.Windows.Forms.CheckBox(); + this.scanExecutableCheckBox = new System.Windows.Forms.CheckBox(); + this.scanWritableCheckBox = new System.Windows.Forms.CheckBox(); + this.endAddressTextBox = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.startAddressTextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.floatingOptionsGroupBox = new System.Windows.Forms.GroupBox(); + this.roundTruncateRadioButton = new System.Windows.Forms.RadioButton(); + this.roundLooseRadioButton = new System.Windows.Forms.RadioButton(); + this.roundStrictRadioButton = new System.Windows.Forms.RadioButton(); + this.stringOptionsGroupBox = new System.Windows.Forms.GroupBox(); + this.caseSensitiveCheckBox = new System.Windows.Forms.CheckBox(); + this.encodingUtf32RadioButton = new System.Windows.Forms.RadioButton(); + this.encodingUtf16RadioButton = new System.Windows.Forms.RadioButton(); + this.encodingUtf8RadioButton = new System.Windows.Forms.RadioButton(); + this.firstScanButton = new System.Windows.Forms.Button(); + this.nextScanButton = new System.Windows.Forms.Button(); + this.scanProgressBar = new System.Windows.Forms.ProgressBar(); + this.resultDataGridView = new System.Windows.Forms.DataGridView(); + this.resultAddressColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultPreviousValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultCountLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.filterGroupBox.SuspendLayout(); + this.scanOptionsGroupBox.SuspendLayout(); + this.flowLayoutPanel1.SuspendLayout(); + this.floatingOptionsGroupBox.SuspendLayout(); + this.stringOptionsGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).BeginInit(); + this.SuspendLayout(); + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Magnifier; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(611, 48); + this.bannerBox.TabIndex = 7; + this.bannerBox.Text = "Search the process memory for specific values."; + this.bannerBox.Title = "Memory Searcher"; + // + // filterGroupBox + // + this.filterGroupBox.Controls.Add(this.valueTypeComboBox); + this.filterGroupBox.Controls.Add(this.label3); + this.filterGroupBox.Controls.Add(this.scanTypeComboBox); + this.filterGroupBox.Controls.Add(this.label1); + this.filterGroupBox.Controls.Add(this.isHexCheckBox); + this.filterGroupBox.Controls.Add(this.valueDualValueControl); + this.filterGroupBox.Location = new System.Drawing.Point(3, 3); + this.filterGroupBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 1); + this.filterGroupBox.Name = "filterGroupBox"; + this.filterGroupBox.Size = new System.Drawing.Size(308, 103); + this.filterGroupBox.TabIndex = 8; + this.filterGroupBox.TabStop = false; + this.filterGroupBox.Text = "Filter"; + // + // valueTypeComboBox + // + this.valueTypeComboBox.DisplayMember = "Description"; + this.valueTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.valueTypeComboBox.FormattingEnabled = true; + this.valueTypeComboBox.Location = new System.Drawing.Point(72, 74); + this.valueTypeComboBox.Name = "valueTypeComboBox"; + this.valueTypeComboBox.Size = new System.Drawing.Size(224, 21); + this.valueTypeComboBox.TabIndex = 8; + this.valueTypeComboBox.ValueMember = "Value"; + this.valueTypeComboBox.SelectionChangeCommitted += new System.EventHandler(this.valueTypeComboBox_SelectionChangeCommitted); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 77); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(64, 13); + this.label3.TabIndex = 7; + this.label3.Text = "Value Type:"; + // + // scanTypeComboBox + // + this.scanTypeComboBox.DisplayMember = "Description"; + this.scanTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.scanTypeComboBox.FormattingEnabled = true; + this.scanTypeComboBox.Location = new System.Drawing.Point(72, 50); + this.scanTypeComboBox.Name = "scanTypeComboBox"; + this.scanTypeComboBox.Size = new System.Drawing.Size(224, 21); + this.scanTypeComboBox.TabIndex = 5; + this.scanTypeComboBox.ValueMember = "Value"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(3, 53); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Scan Type:"; + // + // isHexCheckBox + // + this.isHexCheckBox.AutoSize = true; + this.isHexCheckBox.Location = new System.Drawing.Point(6, 28); + this.isHexCheckBox.Name = "isHexCheckBox"; + this.isHexCheckBox.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + this.isHexCheckBox.Size = new System.Drawing.Size(56, 17); + this.isHexCheckBox.TabIndex = 3; + this.isHexCheckBox.Text = "Is Hex"; + this.isHexCheckBox.UseVisualStyleBackColor = true; + // + // valueDualValueControl + // + this.valueDualValueControl.Location = new System.Drawing.Point(72, 12); + this.valueDualValueControl.Name = "valueDualValueControl"; + this.valueDualValueControl.ShowSecondInputField = false; + this.valueDualValueControl.Size = new System.Drawing.Size(224, 40); + this.valueDualValueControl.TabIndex = 2; + this.valueDualValueControl.Value1 = ""; + this.valueDualValueControl.Value2 = ""; + // + // scanOptionsGroupBox + // + this.scanOptionsGroupBox.Controls.Add(this.fastScanAlignmentTextBox); + this.scanOptionsGroupBox.Controls.Add(this.fastScanCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanCopyOnWriteCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanExecutableCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanWritableCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.endAddressTextBox); + this.scanOptionsGroupBox.Controls.Add(this.label4); + this.scanOptionsGroupBox.Controls.Add(this.startAddressTextBox); + this.scanOptionsGroupBox.Controls.Add(this.label2); + this.scanOptionsGroupBox.Location = new System.Drawing.Point(3, 239); + this.scanOptionsGroupBox.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3); + this.scanOptionsGroupBox.Name = "scanOptionsGroupBox"; + this.scanOptionsGroupBox.Size = new System.Drawing.Size(308, 120); + this.scanOptionsGroupBox.TabIndex = 9; + this.scanOptionsGroupBox.TabStop = false; + this.scanOptionsGroupBox.Text = "Scan Options"; + // + // fastScanAlignmentTextBox + // + this.fastScanAlignmentTextBox.Location = new System.Drawing.Point(133, 91); + this.fastScanAlignmentTextBox.Name = "fastScanAlignmentTextBox"; + this.fastScanAlignmentTextBox.Size = new System.Drawing.Size(26, 20); + this.fastScanAlignmentTextBox.TabIndex = 9; + // + // fastScanCheckBox + // + this.fastScanCheckBox.AutoSize = true; + this.fastScanCheckBox.Checked = true; + this.fastScanCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.fastScanCheckBox.Location = new System.Drawing.Point(9, 93); + this.fastScanCheckBox.Name = "fastScanCheckBox"; + this.fastScanCheckBox.Size = new System.Drawing.Size(129, 17); + this.fastScanCheckBox.TabIndex = 8; + this.fastScanCheckBox.Text = "Fast Scan, Alignment:"; + this.fastScanCheckBox.UseVisualStyleBackColor = true; + // + // scanCopyOnWriteCheckBox + // + this.scanCopyOnWriteCheckBox.AutoSize = true; + this.scanCopyOnWriteCheckBox.Location = new System.Drawing.Point(189, 68); + this.scanCopyOnWriteCheckBox.Name = "scanCopyOnWriteCheckBox"; + this.scanCopyOnWriteCheckBox.Size = new System.Drawing.Size(95, 17); + this.scanCopyOnWriteCheckBox.TabIndex = 7; + this.scanCopyOnWriteCheckBox.Text = "Copy On Write"; + this.scanCopyOnWriteCheckBox.ThreeState = true; + this.scanCopyOnWriteCheckBox.UseVisualStyleBackColor = true; + // + // scanExecutableCheckBox + // + this.scanExecutableCheckBox.AutoSize = true; + this.scanExecutableCheckBox.Checked = true; + this.scanExecutableCheckBox.CheckState = System.Windows.Forms.CheckState.Indeterminate; + this.scanExecutableCheckBox.Location = new System.Drawing.Point(91, 68); + this.scanExecutableCheckBox.Name = "scanExecutableCheckBox"; + this.scanExecutableCheckBox.Size = new System.Drawing.Size(79, 17); + this.scanExecutableCheckBox.TabIndex = 6; + this.scanExecutableCheckBox.Text = "Executable"; + this.scanExecutableCheckBox.ThreeState = true; + this.scanExecutableCheckBox.UseVisualStyleBackColor = true; + // + // scanWritableCheckBox + // + this.scanWritableCheckBox.AutoSize = true; + this.scanWritableCheckBox.Checked = true; + this.scanWritableCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.scanWritableCheckBox.Location = new System.Drawing.Point(9, 68); + this.scanWritableCheckBox.Name = "scanWritableCheckBox"; + this.scanWritableCheckBox.Size = new System.Drawing.Size(65, 17); + this.scanWritableCheckBox.TabIndex = 5; + this.scanWritableCheckBox.Text = "Writable"; + this.scanWritableCheckBox.ThreeState = true; + this.scanWritableCheckBox.UseVisualStyleBackColor = true; + // + // endAddressTextBox + // + this.endAddressTextBox.Location = new System.Drawing.Point(66, 42); + this.endAddressTextBox.Name = "endAddressTextBox"; + this.endAddressTextBox.Size = new System.Drawing.Size(218, 20); + this.endAddressTextBox.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(6, 45); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(32, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Stop:"; + // + // startAddressTextBox + // + this.startAddressTextBox.Location = new System.Drawing.Point(66, 19); + this.startAddressTextBox.Name = "startAddressTextBox"; + this.startAddressTextBox.Size = new System.Drawing.Size(218, 20); + this.startAddressTextBox.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(32, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Start:"; + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.flowLayoutPanel1.Controls.Add(this.filterGroupBox); + this.flowLayoutPanel1.Controls.Add(this.floatingOptionsGroupBox); + this.flowLayoutPanel1.Controls.Add(this.stringOptionsGroupBox); + this.flowLayoutPanel1.Controls.Add(this.scanOptionsGroupBox); + this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel1.Location = new System.Drawing.Point(291, 80); + this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(317, 294); + this.flowLayoutPanel1.TabIndex = 9; + this.flowLayoutPanel1.WrapContents = false; + // + // floatingOptionsGroupBox + // + this.floatingOptionsGroupBox.Controls.Add(this.roundTruncateRadioButton); + this.floatingOptionsGroupBox.Controls.Add(this.roundLooseRadioButton); + this.floatingOptionsGroupBox.Controls.Add(this.roundStrictRadioButton); + this.floatingOptionsGroupBox.Location = new System.Drawing.Point(3, 107); + this.floatingOptionsGroupBox.Margin = new System.Windows.Forms.Padding(3, 0, 3, 1); + this.floatingOptionsGroupBox.Name = "floatingOptionsGroupBox"; + this.floatingOptionsGroupBox.Size = new System.Drawing.Size(308, 64); + this.floatingOptionsGroupBox.TabIndex = 9; + this.floatingOptionsGroupBox.TabStop = false; + this.floatingOptionsGroupBox.Visible = false; + // + // roundTruncateRadioButton + // + this.roundTruncateRadioButton.AutoSize = true; + this.roundTruncateRadioButton.Location = new System.Drawing.Point(72, 42); + this.roundTruncateRadioButton.Name = "roundTruncateRadioButton"; + this.roundTruncateRadioButton.Size = new System.Drawing.Size(68, 17); + this.roundTruncateRadioButton.TabIndex = 2; + this.roundTruncateRadioButton.Text = "Truncate"; + this.roundTruncateRadioButton.UseVisualStyleBackColor = true; + // + // roundLooseRadioButton + // + this.roundLooseRadioButton.AutoSize = true; + this.roundLooseRadioButton.Checked = true; + this.roundLooseRadioButton.Location = new System.Drawing.Point(72, 26); + this.roundLooseRadioButton.Name = "roundLooseRadioButton"; + this.roundLooseRadioButton.Size = new System.Drawing.Size(103, 17); + this.roundLooseRadioButton.TabIndex = 1; + this.roundLooseRadioButton.TabStop = true; + this.roundLooseRadioButton.Text = "Rounded (loose)"; + this.roundLooseRadioButton.UseVisualStyleBackColor = true; + // + // roundStrictRadioButton + // + this.roundStrictRadioButton.AutoSize = true; + this.roundStrictRadioButton.Location = new System.Drawing.Point(72, 10); + this.roundStrictRadioButton.Name = "roundStrictRadioButton"; + this.roundStrictRadioButton.Size = new System.Drawing.Size(100, 17); + this.roundStrictRadioButton.TabIndex = 0; + this.roundStrictRadioButton.Text = "Rounded (strict)"; + this.roundStrictRadioButton.UseVisualStyleBackColor = true; + // + // stringOptionsGroupBox + // + this.stringOptionsGroupBox.Controls.Add(this.caseSensitiveCheckBox); + this.stringOptionsGroupBox.Controls.Add(this.encodingUtf32RadioButton); + this.stringOptionsGroupBox.Controls.Add(this.encodingUtf16RadioButton); + this.stringOptionsGroupBox.Controls.Add(this.encodingUtf8RadioButton); + this.stringOptionsGroupBox.Location = new System.Drawing.Point(3, 172); + this.stringOptionsGroupBox.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3); + this.stringOptionsGroupBox.Name = "stringOptionsGroupBox"; + this.stringOptionsGroupBox.Size = new System.Drawing.Size(308, 64); + this.stringOptionsGroupBox.TabIndex = 10; + this.stringOptionsGroupBox.TabStop = false; + this.stringOptionsGroupBox.Visible = false; + // + // caseSensitiveCheckBox + // + this.caseSensitiveCheckBox.AutoSize = true; + this.caseSensitiveCheckBox.Checked = true; + this.caseSensitiveCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.caseSensitiveCheckBox.Location = new System.Drawing.Point(164, 10); + this.caseSensitiveCheckBox.Name = "caseSensitiveCheckBox"; + this.caseSensitiveCheckBox.Size = new System.Drawing.Size(94, 17); + this.caseSensitiveCheckBox.TabIndex = 3; + this.caseSensitiveCheckBox.Text = "Case sensitive"; + this.caseSensitiveCheckBox.UseVisualStyleBackColor = true; + // + // encodingUtf32RadioButton + // + this.encodingUtf32RadioButton.AutoSize = true; + this.encodingUtf32RadioButton.Location = new System.Drawing.Point(72, 42); + this.encodingUtf32RadioButton.Name = "encodingUtf32RadioButton"; + this.encodingUtf32RadioButton.Size = new System.Drawing.Size(61, 17); + this.encodingUtf32RadioButton.TabIndex = 2; + this.encodingUtf32RadioButton.Text = "UTF-32"; + this.encodingUtf32RadioButton.UseVisualStyleBackColor = true; + // + // encodingUtf16RadioButton + // + this.encodingUtf16RadioButton.AutoSize = true; + this.encodingUtf16RadioButton.Location = new System.Drawing.Point(72, 26); + this.encodingUtf16RadioButton.Name = "encodingUtf16RadioButton"; + this.encodingUtf16RadioButton.Size = new System.Drawing.Size(61, 17); + this.encodingUtf16RadioButton.TabIndex = 1; + this.encodingUtf16RadioButton.Text = "UTF-16"; + this.encodingUtf16RadioButton.UseVisualStyleBackColor = true; + // + // encodingUtf8RadioButton + // + this.encodingUtf8RadioButton.AutoSize = true; + this.encodingUtf8RadioButton.Checked = true; + this.encodingUtf8RadioButton.Location = new System.Drawing.Point(72, 10); + this.encodingUtf8RadioButton.Name = "encodingUtf8RadioButton"; + this.encodingUtf8RadioButton.Size = new System.Drawing.Size(55, 17); + this.encodingUtf8RadioButton.TabIndex = 0; + this.encodingUtf8RadioButton.TabStop = true; + this.encodingUtf8RadioButton.Text = "UTF-8"; + this.encodingUtf8RadioButton.UseVisualStyleBackColor = true; + // + // firstScanButton + // + this.firstScanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.firstScanButton.Location = new System.Drawing.Point(291, 54); + this.firstScanButton.Name = "firstScanButton"; + this.firstScanButton.Size = new System.Drawing.Size(75, 23); + this.firstScanButton.TabIndex = 11; + this.firstScanButton.Text = "First Scan"; + this.firstScanButton.UseVisualStyleBackColor = true; + this.firstScanButton.Click += new System.EventHandler(this.firstScanButton_Click); + // + // nextScanButton + // + this.nextScanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.nextScanButton.Enabled = false; + this.nextScanButton.Location = new System.Drawing.Point(372, 54); + this.nextScanButton.Name = "nextScanButton"; + this.nextScanButton.Size = new System.Drawing.Size(75, 23); + this.nextScanButton.TabIndex = 12; + this.nextScanButton.Text = "Next Scan"; + this.nextScanButton.UseVisualStyleBackColor = true; + // + // scanProgressBar + // + this.scanProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.scanProgressBar.Location = new System.Drawing.Point(453, 54); + this.scanProgressBar.Name = "scanProgressBar"; + this.scanProgressBar.Size = new System.Drawing.Size(149, 23); + this.scanProgressBar.TabIndex = 13; + // + // resultDataGridView + // + this.resultDataGridView.AllowUserToAddRows = false; + this.resultDataGridView.AllowUserToDeleteRows = false; + this.resultDataGridView.AllowUserToResizeRows = false; + this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.resultAddressColumn, + this.resultValueColumn, + this.resultPreviousValueColumn}); + this.resultDataGridView.Location = new System.Drawing.Point(11, 70); + this.resultDataGridView.Name = "resultDataGridView"; + this.resultDataGridView.ReadOnly = true; + this.resultDataGridView.RowHeadersVisible = false; + this.resultDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.resultDataGridView.Size = new System.Drawing.Size(267, 302); + this.resultDataGridView.TabIndex = 14; + // + // resultAddressColumn + // + this.resultAddressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.resultAddressColumn.HeaderText = "Address"; + this.resultAddressColumn.Name = "resultAddressColumn"; + this.resultAddressColumn.ReadOnly = true; + // + // resultValueColumn + // + this.resultValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultValueColumn.HeaderText = "Value"; + this.resultValueColumn.Name = "resultValueColumn"; + this.resultValueColumn.ReadOnly = true; + this.resultValueColumn.Width = 59; + // + // resultPreviousValueColumn + // + this.resultPreviousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultPreviousValueColumn.HeaderText = "Previous"; + this.resultPreviousValueColumn.Name = "resultPreviousValueColumn"; + this.resultPreviousValueColumn.ReadOnly = true; + this.resultPreviousValueColumn.Width = 73; + // + // resultCountLabel + // + this.resultCountLabel.AutoSize = true; + this.resultCountLabel.Location = new System.Drawing.Point(8, 54); + this.resultCountLabel.Name = "resultCountLabel"; + this.resultCountLabel.Size = new System.Drawing.Size(19, 13); + this.resultCountLabel.TabIndex = 15; + this.resultCountLabel.Text = "<>"; + // + // MemorySearcherForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(611, 590); + this.Controls.Add(this.resultCountLabel); + this.Controls.Add(this.resultDataGridView); + this.Controls.Add(this.scanProgressBar); + this.Controls.Add(this.nextScanButton); + this.Controls.Add(this.firstScanButton); + this.Controls.Add(this.flowLayoutPanel1); + this.Controls.Add(this.bannerBox); + this.Name = "MemorySearcherForm"; + this.Text = "ReClass.NET - Memory Searcher"; + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.filterGroupBox.ResumeLayout(false); + this.filterGroupBox.PerformLayout(); + this.scanOptionsGroupBox.ResumeLayout(false); + this.scanOptionsGroupBox.PerformLayout(); + this.flowLayoutPanel1.ResumeLayout(false); + this.floatingOptionsGroupBox.ResumeLayout(false); + this.floatingOptionsGroupBox.PerformLayout(); + this.stringOptionsGroupBox.ResumeLayout(false); + this.stringOptionsGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private UI.BannerBox bannerBox; + private System.Windows.Forms.GroupBox filterGroupBox; + private UI.DualValueControl valueDualValueControl; + private System.Windows.Forms.CheckBox isHexCheckBox; + private System.Windows.Forms.ComboBox scanTypeComboBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox valueTypeComboBox; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox scanOptionsGroupBox; + private System.Windows.Forms.TextBox fastScanAlignmentTextBox; + private System.Windows.Forms.CheckBox fastScanCheckBox; + private System.Windows.Forms.CheckBox scanCopyOnWriteCheckBox; + private System.Windows.Forms.CheckBox scanExecutableCheckBox; + private System.Windows.Forms.CheckBox scanWritableCheckBox; + private System.Windows.Forms.TextBox endAddressTextBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox startAddressTextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.GroupBox floatingOptionsGroupBox; + private System.Windows.Forms.RadioButton roundTruncateRadioButton; + private System.Windows.Forms.RadioButton roundLooseRadioButton; + private System.Windows.Forms.RadioButton roundStrictRadioButton; + private System.Windows.Forms.GroupBox stringOptionsGroupBox; + private System.Windows.Forms.CheckBox caseSensitiveCheckBox; + private System.Windows.Forms.RadioButton encodingUtf32RadioButton; + private System.Windows.Forms.RadioButton encodingUtf16RadioButton; + private System.Windows.Forms.RadioButton encodingUtf8RadioButton; + private System.Windows.Forms.Button firstScanButton; + private System.Windows.Forms.Button nextScanButton; + private System.Windows.Forms.ProgressBar scanProgressBar; + private System.Windows.Forms.DataGridView resultDataGridView; + private System.Windows.Forms.DataGridViewTextBoxColumn resultAddressColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn resultValueColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn resultPreviousValueColumn; + private System.Windows.Forms.Label resultCountLabel; + } +} \ No newline at end of file diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs new file mode 100644 index 00000000..5260a6d3 --- /dev/null +++ b/Forms/MemorySearchForm.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ReClassNET.MemorySearcher; +using ReClassNET.MemorySearcher.Comparer; +using ReClassNET.UI; + +namespace ReClassNET.Forms +{ + public partial class MemorySearchForm : IconForm + { + private const int MaxVisibleResults = 1000; + + private bool isFirstScan; + + private SearchCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + private SearchValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + + public MemorySearchForm() + { + InitializeComponent(); + + startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); + endAddressTextBox.Text = +#if WIN64 + long.MaxValue.ToString(Constants.StringHexFormat); +#else + int.MaxValue.ToString(Constants.StringHexFormat); +#endif + + valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); + OnValueTypeChanged(); + + Reset(); + } + + private void SetResultCount(int count) + { + resultCountLabel.Text = count > MaxVisibleResults ? $"Found: {count} (only {MaxVisibleResults} shown)" : $"Found: {count}"; + } + + private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) + { + OnValueTypeChanged(); + } + + private void OnValueTypeChanged() + { + var valueType = SelectedValueType; + if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + { + scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(SearchCompareType.Equal); + } + else + { + scanTypeComboBox.DataSource = isFirstScan + ? EnumDescriptionDisplay.CreateExclude( + SearchCompareType.Changed, SearchCompareType.NotChanged, SearchCompareType.Decreased, SearchCompareType.DecreasedOrEqual, + SearchCompareType.Increased, SearchCompareType.IncreasedOrEqual + ) + : EnumDescriptionDisplay.CreateExclude(SearchCompareType.Unknown); + } + } + + private void Reset() + { + SetResultCount(0); + resultDataGridView.DataSource = null; + + nextScanButton.Enabled = false; + + isFirstScan = true; + } + + private void firstScanButton_Click(object sender, EventArgs e) + { + OnStartFirstScan(); + } + + private void OnStartFirstScan() + { + if (isFirstScan) + { + var settings = CreateSearchSettings(); + + nextScanButton.Enabled = true; + isFirstScan = false; + } + else + { + Reset(); + } + } + + private void ParseInput(out long value1, out long value2, bool isHex) + { + value1 = value2 = 0; + + long.TryParse(valueDualValueControl.Value1, isHex ? NumberStyles.HexNumber : NumberStyles.Integer, null, out value1); + long.TryParse(valueDualValueControl.Value2, isHex ? NumberStyles.HexNumber : NumberStyles.Integer, null, out value2); + } + + private void ParseInput(out double value1, out double value2) + { + value1 = value2 = 0; + + double.TryParse(valueDualValueControl.Value1, out value1); + double.TryParse(valueDualValueControl.Value2, out value2); + } + + private SearchSettings CreateSearchSettings() + { + var valueType = SelectedValueType; + var compareType = SelectedCompareType; + + var settings = new SearchSettings(); + + if (valueType == SearchValueType.Byte || valueType == SearchValueType.Short || valueType == SearchValueType.Integer || valueType == SearchValueType.Long) + { + ParseInput(out var value1, out var value2, isHexCheckBox.Checked); + + switch (valueType) + { + case SearchValueType.Byte: + settings.Comparer = new ByteMemoryComparer(compareType, (byte)value1, (byte)value2); + break; + case SearchValueType.Short: + settings.Comparer = new ShortMemoryComparer(compareType, (short)value1, (short)value2); + break; + case SearchValueType.Integer: + settings.Comparer = new IntegerMemoryComparer(compareType, (int)value1, (int)value2); + break; + case SearchValueType.Long: + settings.Comparer = new LongMemoryComparer(compareType, value1, value2); + break; + } + } + else if (valueType == SearchValueType.Float || valueType == SearchValueType.Double) + { + ParseInput(out var value1, out var value2); + + var roundMode = roundStrictRadioButton.Checked ? SearchRoundMode.Strict : roundLooseRadioButton.Checked ? SearchRoundMode.Normal : SearchRoundMode.Truncate; + + switch (valueType) + { + case SearchValueType.Float: + settings.Comparer = new FloatMemoryComparer(compareType, roundMode, (float)value1, (float)value2); + break; + case SearchValueType.Double: + settings.Comparer = new DoubleMemoryComparer(compareType, roundMode, value1, value2); + break; + } + } + else if (valueType == SearchValueType.ArrayOfBytes) + { + var pattern = BytePattern.Parse(valueDualValueControl.Value1); + + settings.Comparer = new ArrayOfBytesMemoryComparer(pattern); + } + else if (valueType == SearchValueType.String) + { + var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; + + settings.Comparer = new StringMemoryComparer(valueDualValueControl.Value1, encoding, caseSensitiveCheckBox.Checked); + } + + if (settings.Comparer == null) + { + throw new Exception(); + } + + long.TryParse(startAddressTextBox.Text, NumberStyles.HexNumber, null, out var startAddressVar); + long.TryParse(endAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); +#if WIN64 + settings.StartAddress = unchecked((IntPtr)startAddressVar); + settings.StopAddress = unchecked((IntPtr)endAddressVar); +#else + settings.StartAddress = unchecked((IntPtr)(int)startAddressVar); + settings.StopAddress = unchecked((IntPtr)(int)endAddressVar); +#endif + settings.FastScan = fastScanCheckBox.Checked; + int.TryParse(fastScanAlignmentTextBox.Text, out var alignment); + settings.FastScanAlignment = Math.Max(1, alignment); + + settings.SearchWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); + settings.SearchExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); + settings.SearchCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); + + return settings; + } + + private static SettingState CheckStateToSettingState(CheckState state) + { + switch (state) + { + case CheckState.Checked: + return SettingState.Yes; + case CheckState.Unchecked: + return SettingState.No; + default: + return SettingState.Indeterminate; + } + } + } +} diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx new file mode 100644 index 00000000..08444b0f --- /dev/null +++ b/Forms/MemorySearchForm.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/UI/DualValueControl.Designer.cs b/UI/DualValueControl.Designer.cs new file mode 100644 index 00000000..8f00216e --- /dev/null +++ b/UI/DualValueControl.Designer.cs @@ -0,0 +1,119 @@ +namespace ReClassNET.UI +{ + partial class DualValueControl + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.value1TextBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.value2TextBox = new System.Windows.Forms.TextBox(); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(37, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Value:"; + // + // value1TextBox + // + this.value1TextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.value1TextBox.Location = new System.Drawing.Point(0, 13); + this.value1TextBox.Margin = new System.Windows.Forms.Padding(0); + this.value1TextBox.Name = "value1TextBox"; + this.value1TextBox.Size = new System.Drawing.Size(255, 20); + this.value1TextBox.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(255, 0); + this.label2.Margin = new System.Windows.Forms.Padding(0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(1, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Value 2:"; + // + // value2TextBox + // + this.value2TextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.value2TextBox.Location = new System.Drawing.Point(255, 13); + this.value2TextBox.Margin = new System.Windows.Forms.Padding(0); + this.value2TextBox.Name = "value2TextBox"; + this.value2TextBox.Size = new System.Drawing.Size(1, 20); + this.value2TextBox.TabIndex = 3; + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 0F)); + this.tableLayoutPanel.Controls.Add(this.label1, 0, 0); + this.tableLayoutPanel.Controls.Add(this.value2TextBox, 1, 1); + this.tableLayoutPanel.Controls.Add(this.value1TextBox, 0, 1); + this.tableLayoutPanel.Controls.Add(this.label2, 1, 0); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(0); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 2; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel.Size = new System.Drawing.Size(255, 34); + this.tableLayoutPanel.TabIndex = 4; + // + // DualValueControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tableLayoutPanel); + this.Name = "DualValueControl"; + this.Size = new System.Drawing.Size(255, 34); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox value1TextBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox value2TextBox; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + } +} diff --git a/UI/DualValueControl.cs b/UI/DualValueControl.cs new file mode 100644 index 00000000..8601f819 --- /dev/null +++ b/UI/DualValueControl.cs @@ -0,0 +1,63 @@ +using System.ComponentModel; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace ReClassNET.UI +{ + [Designer(typeof(DualValueControlDesigner))] + public partial class DualValueControl : UserControl + { + public bool ShowSecondInputField + { + get => tableLayoutPanel.ColumnStyles[0].Width <= 99; + set + { + if (value) + { + tableLayoutPanel.ColumnStyles[1].SizeType = SizeType.Percent; + tableLayoutPanel.ColumnStyles[1].Width = 50; + tableLayoutPanel.ColumnStyles[0].Width = 50; + } + else + { + tableLayoutPanel.ColumnStyles[1].SizeType = SizeType.Absolute; + tableLayoutPanel.ColumnStyles[1].Width = 0; + tableLayoutPanel.ColumnStyles[0].Width = 100; + value2TextBox.Text = null; + } + } + } + + public string Value1 + { + get => value1TextBox.Text; + set => value1TextBox.Text = value; + } + + public string Value2 + { + get => value2TextBox.Text; + set => value2TextBox.Text = value; + } + + public DualValueControl() + { + InitializeComponent(); + } + + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, width, 40, specified); + } + } + + internal class DualValueControlDesigner : ControlDesigner + { + DualValueControlDesigner() + { + AutoResizeHandles = true; + } + + public override SelectionRules SelectionRules => SelectionRules.LeftSizeable | SelectionRules.RightSizeable | SelectionRules.Moveable; + } +} diff --git a/UI/DualValueControl.resx b/UI/DualValueControl.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/UI/DualValueControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/UI/EnumDescriptionDisplay.cs b/UI/EnumDescriptionDisplay.cs new file mode 100644 index 00000000..26e52c3f --- /dev/null +++ b/UI/EnumDescriptionDisplay.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Reflection; +using ReClassNET.Util; + +namespace ReClassNET.UI +{ + internal class EnumDescriptionDisplay where TEnum : struct + { + public TEnum Value { get; internal set; } + public string Description { get; internal set; } + + public static List> Create() + { + Contract.Ensures(Contract.Result>>() != null); + + return CreateExact(Enum.GetValues(typeof(TEnum)).Cast()); + } + + public static List> CreateExact(TEnum item1, params TEnum[] include) + { + Contract.Ensures(Contract.Result>>() != null); + + return CreateExact(item1.Yield().Concat(include)); + } + + public static List> CreateExact(IEnumerable include) + { + Contract.Requires(include != null); + Contract.Ensures(Contract.Result>>() != null); + + return include + .Select(value => new EnumDescriptionDisplay + { + Description = value.GetType().GetField(value.ToString()).GetCustomAttribute()?.Description ?? value.ToString(), + Value = value + }) + .OrderBy(item => item.Value) + .ToList(); + } + + public static List> CreateExclude(TEnum item1, params TEnum[] exclude) + { + Contract.Ensures(Contract.Result>>() != null); + + return CreateExclude(item1.Yield().Concat(exclude)); + } + + public static List> CreateExclude(IEnumerable exclude) + { + Contract.Requires(exclude != null); + Contract.Ensures(Contract.Result>>() != null); + + return Enum.GetValues(typeof(TEnum)) + .Cast() + .Except(exclude) + .Select(value => new EnumDescriptionDisplay + { + Description = value.GetType().GetField(value.ToString()).GetCustomAttribute()?.Description ?? value.ToString(), + Value = value + }) + .OrderBy(item => item.Value) + .ToList(); + } + } +} From f0b4e299ba55a8aec39d7a1cdb4dbdd3f5195dd4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Sep 2017 00:05:46 +0200 Subject: [PATCH 056/777] Removed setters. --- MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs | 2 +- MemorySearcher/Comparer/ByteMemoryComparer.cs | 2 +- MemorySearcher/Comparer/DoubleMemoryComparer.cs | 4 ++-- MemorySearcher/Comparer/FloatMemoryComparer.cs | 4 ++-- MemorySearcher/Comparer/IntegerMemoryComparer.cs | 2 +- MemorySearcher/Comparer/LongMemoryComparer.cs | 2 +- MemorySearcher/Comparer/ShortMemoryComparer.cs | 2 +- MemorySearcher/Comparer/StringMemoryComparer.cs | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs index c742ba23..9411baf1 100644 --- a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ArrayOfBytesMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Equal; + public SearchCompareType CompareType => SearchCompareType.Equal; public BytePattern Value { get; } public int ValueSize => Value.Length; diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemorySearcher/Comparer/ByteMemoryComparer.cs index e2e6a059..91cb94b0 100644 --- a/MemorySearcher/Comparer/ByteMemoryComparer.cs +++ b/MemorySearcher/Comparer/ByteMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ByteMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchCompareType CompareType { get; } public byte Value1 { get; } public byte Value2 { get; } public int ValueSize => sizeof(byte); diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs index 453681a0..4c5cfb7e 100644 --- a/MemorySearcher/Comparer/DoubleMemoryComparer.cs +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -5,8 +5,8 @@ namespace ReClassNET.MemorySearcher.Comparer { public class DoubleMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; - public SearchRoundMode RoundType { get; } = SearchRoundMode.Normal; + public SearchCompareType CompareType { get; } + public SearchRoundMode RoundType { get; } public double Value1 { get; } public double Value2 { get; } public int ValueSize => sizeof(double); diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs index 73aa7b80..098db0ac 100644 --- a/MemorySearcher/Comparer/FloatMemoryComparer.cs +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -5,8 +5,8 @@ namespace ReClassNET.MemorySearcher.Comparer { public class FloatMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; - public SearchRoundMode RoundType { get; } = SearchRoundMode.Normal; + public SearchCompareType CompareType { get; } + public SearchRoundMode RoundType { get; } public float Value1 { get; } public float Value2 { get; } public int ValueSize => sizeof(float); diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemorySearcher/Comparer/IntegerMemoryComparer.cs index 728ed98c..2bf55a0d 100644 --- a/MemorySearcher/Comparer/IntegerMemoryComparer.cs +++ b/MemorySearcher/Comparer/IntegerMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class IntegerMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchCompareType CompareType { get; } public int Value1 { get; } public int Value2 { get; } public int ValueSize => sizeof(int); diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemorySearcher/Comparer/LongMemoryComparer.cs index 34f1e946..220df7aa 100644 --- a/MemorySearcher/Comparer/LongMemoryComparer.cs +++ b/MemorySearcher/Comparer/LongMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class LongMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchCompareType CompareType { get; } public long Value1 { get; } public long Value2 { get; } public int ValueSize => sizeof(long); diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemorySearcher/Comparer/ShortMemoryComparer.cs index 022e41e9..1502f537 100644 --- a/MemorySearcher/Comparer/ShortMemoryComparer.cs +++ b/MemorySearcher/Comparer/ShortMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ShortMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Unknown; + public SearchCompareType CompareType { get; } public short Value1 { get; } public short Value2 { get; } public int ValueSize => sizeof(short); diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index e2f93814..00706c6f 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -6,9 +6,9 @@ namespace ReClassNET.MemorySearcher.Comparer { public class StringMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; set; } = SearchCompareType.Equal; + public SearchCompareType CompareType => SearchCompareType.Equal; public bool CaseSensitive { get; } = true; - public Encoding Encoding { get; } = Encoding.UTF8; + public Encoding Encoding { get; } public string Value { get; } public int ValueSize => Value.Length * Encoding.GetMaxByteCount(1); From 0fd18edde36d43dd178d0406f91dc82564067f37 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Sep 2017 14:39:59 +0200 Subject: [PATCH 057/777] Added result output. --- .../Comparer/ArrayOfBytesMemoryComparer.cs | 20 ++- MemorySearcher/Comparer/ByteMemoryComparer.cs | 142 +++++++++++------- .../Comparer/DoubleMemoryComparer.cs | 142 +++++++++++------- .../Comparer/FloatMemoryComparer.cs | 142 +++++++++++------- MemorySearcher/Comparer/IMemoryComparer.cs | 4 +- .../Comparer/IntegerMemoryComparer.cs | 142 +++++++++++------- MemorySearcher/Comparer/LongMemoryComparer.cs | 142 +++++++++++------- .../Comparer/ShortMemoryComparer.cs | 142 +++++++++++------- .../Comparer/StringMemoryComparer.cs | 19 ++- 9 files changed, 538 insertions(+), 357 deletions(-) diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs index 9411baf1..1ff3192b 100644 --- a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -23,8 +23,10 @@ public ArrayOfBytesMemoryComparer(BytePattern value) } } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + if (pattern != null) { for (var i = 0; i < pattern.Length; ++i) @@ -34,22 +36,24 @@ public bool Compare(byte[] data, int index) return false; } } - - return true; } - else + else if (!Value.Equals(data, index)) { - return Value.Equals(data, index); + return false; } + + result = new ArrayOfBytesSearchResult(); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is ArrayOfBytesSearchResult); + Debug.Assert(previous is ArrayOfBytesSearchResult); #endif - return Compare(data, index); + return Compare(data, index, out result); } } } diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemorySearcher/Comparer/ByteMemoryComparer.cs index 91cb94b0..3a4d3a86 100644 --- a/MemorySearcher/Comparer/ByteMemoryComparer.cs +++ b/MemorySearcher/Comparer/ByteMemoryComparer.cs @@ -17,81 +17,109 @@ public ByteMemoryComparer(SearchCompareType compareType, byte value1, byte value Value2 = value2; } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = data[index]; - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new ByteSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is ByteSearchResult); + Debug.Assert(previous is ByteSearchResult); #endif - return Compare(data, index, (ByteSearchResult)other); + return Compare(data, index, (ByteSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, ByteSearchResult other) + public bool Compare(byte[] data, int index, ByteSearchResult previous, out SearchResult result) { + result = null; + var value = data[index]; - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new ByteSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs index 4c5cfb7e..b39ca599 100644 --- a/MemorySearcher/Comparer/DoubleMemoryComparer.cs +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -34,81 +34,109 @@ private bool CheckRoundedEquality(double value) } } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = BitConverter.ToDouble(data, index); - switch (CompareType) + bool IsMatch() { - case SearchCompareType.Equal: - return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: - return !CheckRoundedEquality(value); - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } } + + if (!IsMatch()) + { + return false; + } + + result = new DoubleSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is DoubleSearchResult); + Debug.Assert(previous is DoubleSearchResult); #endif - return Compare(data, index, (DoubleSearchResult)other); + return Compare(data, index, (DoubleSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, DoubleSearchResult other) + public bool Compare(byte[] data, int index, DoubleSearchResult previous, out SearchResult result) { + result = null; + var value = BitConverter.ToDouble(data, index); - switch (CompareType) + bool IsMatch() { - case SearchCompareType.Equal: - return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: - return !CheckRoundedEquality(value); - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } } + + if (!IsMatch()) + { + return false; + } + + result = new DoubleSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs index 098db0ac..4ae93bc4 100644 --- a/MemorySearcher/Comparer/FloatMemoryComparer.cs +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -34,81 +34,109 @@ private bool CheckRoundedEquality(float value) } } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = BitConverter.ToSingle(data, index); - switch (CompareType) + bool IsMatch() { - case SearchCompareType.Equal: - return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: - return !CheckRoundedEquality(value); - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } } + + if (!IsMatch()) + { + return false; + } + + result = new FloatSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is FloatSearchResult); + Debug.Assert(previous is FloatSearchResult); #endif - return Compare(data, index, (FloatSearchResult)other); + return Compare(data, index, (FloatSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, FloatSearchResult other) + public bool Compare(byte[] data, int index, FloatSearchResult previous, out SearchResult result) { + result = null; + var value = BitConverter.ToSingle(data, index); - switch (CompareType) + bool IsMatch() { - case SearchCompareType.Equal: - return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: - return !CheckRoundedEquality(value); - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + switch (CompareType) + { + case SearchCompareType.Equal: + return CheckRoundedEquality(value); + case SearchCompareType.NotEqual: + return !CheckRoundedEquality(value); + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } } + + if (!IsMatch()) + { + return false; + } + + result = new FloatSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/IMemoryComparer.cs b/MemorySearcher/Comparer/IMemoryComparer.cs index e48b7a4b..a23d95fc 100644 --- a/MemorySearcher/Comparer/IMemoryComparer.cs +++ b/MemorySearcher/Comparer/IMemoryComparer.cs @@ -5,8 +5,8 @@ public interface IMemoryComparer SearchCompareType CompareType { get; } int ValueSize { get; } - bool Compare(byte[] data, int index); + bool Compare(byte[] data, int index, out SearchResult result); - bool Compare(byte[] data, int index, SearchResult other); + bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result); } } diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemorySearcher/Comparer/IntegerMemoryComparer.cs index 2bf55a0d..a8a9a83a 100644 --- a/MemorySearcher/Comparer/IntegerMemoryComparer.cs +++ b/MemorySearcher/Comparer/IntegerMemoryComparer.cs @@ -17,81 +17,109 @@ public IntegerMemoryComparer(SearchCompareType compareType, int value1, int valu Value2 = value2; } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = BitConverter.ToInt32(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new IntegerSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is IntegerSearchResult); + Debug.Assert(previous is IntegerSearchResult); #endif - return Compare(data, index, (IntegerSearchResult)other); + return Compare(data, index, (IntegerSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, IntegerSearchResult other) + public bool Compare(byte[] data, int index, IntegerSearchResult previous, out SearchResult result) { + result = null; + var value = BitConverter.ToInt32(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new IntegerSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemorySearcher/Comparer/LongMemoryComparer.cs index 220df7aa..ffe5d747 100644 --- a/MemorySearcher/Comparer/LongMemoryComparer.cs +++ b/MemorySearcher/Comparer/LongMemoryComparer.cs @@ -17,81 +17,109 @@ public LongMemoryComparer(SearchCompareType compareType, long value1, long value Value2 = value2; } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = BitConverter.ToInt64(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new LongSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is LongSearchResult); + Debug.Assert(previous is LongSearchResult); #endif - return Compare(data, index, (LongSearchResult)other); + return Compare(data, index, (LongSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, LongSearchResult other) + public bool Compare(byte[] data, int index, LongSearchResult previous, out SearchResult result) { + result = null; + var value = BitConverter.ToInt64(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new LongSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemorySearcher/Comparer/ShortMemoryComparer.cs index 1502f537..d5cdafda 100644 --- a/MemorySearcher/Comparer/ShortMemoryComparer.cs +++ b/MemorySearcher/Comparer/ShortMemoryComparer.cs @@ -17,81 +17,109 @@ public ShortMemoryComparer(SearchCompareType compareType, short value1, short va Value2 = value2; } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = BitConverter.ToInt16(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case SearchCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new ShortSearchResult(value); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is ShortSearchResult); + Debug.Assert(previous is ShortSearchResult); #endif - return Compare(data, index, (ShortSearchResult)other); + return Compare(data, index, (ShortSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, ShortSearchResult other) + public bool Compare(byte[] data, int index, ShortSearchResult previous, out SearchResult result) { + result = null; + var value = BitConverter.ToInt16(data, index); - switch (CompareType) + bool IsMatch() + { + switch (CompareType) + { + case SearchCompareType.Equal: + return value == Value1; + case SearchCompareType.NotEqual: + return value != Value1; + case SearchCompareType.Changed: + return value != previous.Value; + case SearchCompareType.NotChanged: + return value == previous.Value; + case SearchCompareType.GreaterThan: + return value > Value1; + case SearchCompareType.GreaterThanOrEqual: + return value >= Value1; + case SearchCompareType.Increased: + return value > previous.Value; + case SearchCompareType.IncreasedOrEqual: + return value >= previous.Value; + case SearchCompareType.LessThan: + return value < Value1; + case SearchCompareType.LessThanOrEqual: + return value <= Value1; + case SearchCompareType.Decreased: + return value < previous.Value; + case SearchCompareType.DecreasedOrEqual: + return value <= previous.Value; + case SearchCompareType.Between: + return Value1 < value && value < Value2; + case SearchCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + default: + throw new InvalidCompareTypeException(CompareType); + } + } + + if (!IsMatch()) { - case SearchCompareType.Equal: - return value == Value1; - case SearchCompareType.NotEqual: - return value != Value1; - case SearchCompareType.Changed: - return value != other.Value; - case SearchCompareType.NotChanged: - return value == other.Value; - case SearchCompareType.GreaterThan: - return value > Value1; - case SearchCompareType.GreaterThanOrEqual: - return value >= Value1; - case SearchCompareType.Increased: - return value > other.Value; - case SearchCompareType.IncreasedOrEqual: - return value >= other.Value; - case SearchCompareType.LessThan: - return value < Value1; - case SearchCompareType.LessThanOrEqual: - return value <= Value1; - case SearchCompareType.Decreased: - return value < other.Value; - case SearchCompareType.DecreasedOrEqual: - return value <= other.Value; - case SearchCompareType.Between: - return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); + return false; } + + result = new ShortSearchResult(value); + + return true; } } } diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index 00706c6f..ca55ac49 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -19,20 +19,29 @@ public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) CaseSensitive = caseSensitive; } - public bool Compare(byte[] data, int index) + public bool Compare(byte[] data, int index, out SearchResult result) { + result = null; + var value = Encoding.GetString(data, index, Value.Length); - return Value.Equals(value, CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase); + if (!Value.Equals(value, CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase)) + { + return false; + } + + result = new StringSearchResult(); + + return true; } - public bool Compare(byte[] data, int index, SearchResult other) + public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) { #if DEBUG - Debug.Assert(other is StringSearchResult); + Debug.Assert(previous is StringSearchResult); #endif - return Compare(data, index); + return Compare(data, index, out result); } } } From 0e9493b6b5e32fc1180c18887e6370edc9bc774a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Sep 2017 14:41:13 +0200 Subject: [PATCH 058/777] Removed obligatory constructor. --- MemorySearcher/SearchResult.cs | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/MemorySearcher/SearchResult.cs b/MemorySearcher/SearchResult.cs index 5a7cbeb1..8fe6c475 100644 --- a/MemorySearcher/SearchResult.cs +++ b/MemorySearcher/SearchResult.cs @@ -4,20 +4,14 @@ namespace ReClassNET.MemorySearcher { public abstract class SearchResult { - public IntPtr Address { get; } - - protected SearchResult(IntPtr address) - { - Address = address; - } + public IntPtr Address { get; set; } } public class ByteSearchResult : SearchResult { public byte Value { get; } - public ByteSearchResult(IntPtr address, byte value) - : base(address) + public ByteSearchResult(byte value) { Value = value; } @@ -27,8 +21,7 @@ public class ShortSearchResult : SearchResult { public short Value { get; } - public ShortSearchResult(IntPtr address, short value) - : base(address) + public ShortSearchResult(short value) { Value = value; } @@ -38,8 +31,7 @@ public class IntegerSearchResult : SearchResult { public int Value { get; } - public IntegerSearchResult(IntPtr address, int value) - : base(address) + public IntegerSearchResult(int value) { Value = value; } @@ -49,8 +41,7 @@ public class LongSearchResult : SearchResult { public long Value { get; } - public LongSearchResult(IntPtr address, long value) - : base(address) + public LongSearchResult(long value) { Value = value; } @@ -60,8 +51,7 @@ public class FloatSearchResult : SearchResult { public float Value { get; } - public FloatSearchResult(IntPtr address, float value) - : base(address) + public FloatSearchResult(float value) { Value = value; } @@ -71,8 +61,7 @@ public class DoubleSearchResult : SearchResult { public double Value { get; } - public DoubleSearchResult(IntPtr address, double value) - : base(address) + public DoubleSearchResult(double value) { Value = value; } @@ -80,19 +69,11 @@ public DoubleSearchResult(IntPtr address, double value) public class ArrayOfBytesSearchResult : SearchResult { - public ArrayOfBytesSearchResult(IntPtr address) - : base(address) - { - } } public class StringSearchResult : SearchResult { - public StringSearchResult(IntPtr address) - : base(address) - { - } } } From b4421b5081635a9c302781042b2af6a7aea18393 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Sep 2017 14:57:36 +0200 Subject: [PATCH 059/777] Added SearcherWorker. --- MemorySearcher/Searcher.cs | 53 ++++++++++++++++++++------------ MemorySearcher/SearcherWorker.cs | 53 ++++++++++++++++++++++++++++++++ ReClass.NET.csproj | 51 ++++++++++++++++++++++-------- 3 files changed, 124 insertions(+), 33 deletions(-) create mode 100644 MemorySearcher/SearcherWorker.cs diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index d08c0804..ffc2981f 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -5,7 +5,6 @@ using System.Threading; using System.Threading.Tasks; using ReClassNET.Memory; -using ReClassNET.MemorySearcher.Algorithm; using ReClassNET.Util; namespace ReClassNET.MemorySearcher @@ -21,7 +20,7 @@ public Searcher(RemoteProcess process) this.process = process; } - private ICollection
GetSearchableSections(SearchSettings settings) + private IList
GetSearchableSections(SearchSettings settings) { Contract.Requires(settings != null); @@ -71,10 +70,9 @@ private ICollection
GetSearchableSections(SearchSettings settings) .ToList(); } - public IList Search(SearchSettings settings, IPatternMatcher matcher, CancellationToken ct, IProgress progress) + public Task FirstScan(SearchSettings settings, CancellationToken ct, IProgress progress) { Contract.Requires(settings != null); - Contract.Requires(matcher != null); var sections = GetSearchableSections(settings); @@ -82,22 +80,37 @@ public IList Search(SearchSettings settings, IPatternMatcher matcher, Ca var counter = 0; - return sections - .AsParallel() - .WithCancellation(ct) - .Select(s => - { - var buffer = new MemoryBuffer(s.Size.ToInt32()) { Process = process }; - buffer.Update(s.Start, false); - return new { StartAddress = s.Start, Buffer = buffer }; - }) - .SelectMany(i => - { - var result = matcher.SearchMatches(i.Buffer.RawData).Select(offset => i.StartAddress + offset).ToList(); - progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); - return result; - }) - .ToList(); + return Task.Run(() => + { + var result = Parallel.ForEach( + sections, + new ParallelOptions { CancellationToken = ct}, + () => new SearcherWorker(settings), + (s, state, _, w) => + { + var buffer = new MemoryBuffer(s.Size.ToInt32()) { Process = process }; + buffer.Update(s.Start, false); + + w.Search(s.Start, buffer.RawData); + + progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); + + return w; + }, + w => w.Finish() + ); + return result.IsCompleted; + }, ct); + } + + public Task NextScan(SearchSettings settings, CancellationToken ct, IProgress progress) + { + Contract.Requires(settings != null); + + return Task.Run(() => + { + + }, ct); } } } diff --git a/MemorySearcher/SearcherWorker.cs b/MemorySearcher/SearcherWorker.cs new file mode 100644 index 00000000..bc6ef562 --- /dev/null +++ b/MemorySearcher/SearcherWorker.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ReClassNET.MemorySearcher +{ + internal class SearcherWorker + { + private static int InstanceCounter = 0; + + private const int MaxResultCount = 200000; + + private readonly int id; + + private readonly SearchSettings settings; + private readonly List results = new List(2000); + + public SearcherWorker(SearchSettings settings) + { + Contract.Requires(settings != null); + + this.settings = settings; + + id = Interlocked.Increment(ref InstanceCounter); + } + + public void Search(IntPtr address, byte[] data) + { + var endIndex = data.Length - settings.Comparer.ValueSize; + + var comparer = settings.Comparer; + + for (var i = 0; i < endIndex; i += settings.FastScanAlignment) + { + if (comparer.Compare(data, i, out var result)) + { + result.Address = address + i; + + results.Add(result); + } + } + } + + public void Finish() + { + + } + } +} diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 49f5a6f3..a7c636ee 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -22,7 +22,7 @@ full false bin\x86\Debug\ - TRACE;DEBUG;WIN32 + TRACE;DEBUG;WIN32;RECLASSNET32 prompt 4 false @@ -75,7 +75,7 @@ pdbonly true bin\x86\Release\ - TRACE;WIN32;RELEASE + TRACE;WIN32;RECLASSNET32;RELEASE prompt 4 @@ -85,7 +85,7 @@ full false bin\x64\Debug\ - TRACE;DEBUG;WIN64 + TRACE;DEBUG;WIN64;RECLASSNET64 prompt 4 false @@ -95,7 +95,7 @@ pdbonly true bin\x64\Release\ - TRACE;WIN64;RELEASE + TRACE;WIN64;RECLASSNET64;RELEASE prompt 4 @@ -171,15 +171,30 @@ InputBytesForm.cs - + + Form + + + MemorySearchForm.cs + + + + + + + + + + + + + + + + + - - - - - - @@ -251,6 +266,13 @@ LogForm.cs + + UserControl + + + DualValueControl.cs + + Component @@ -405,8 +427,8 @@ InputBytesForm.cs - - MemorySearcherForm.cs + + MemorySearchForm.cs ClassNodeView.cs @@ -422,6 +444,9 @@ ColorBox.cs + + DualValueControl.cs + MemoryViewControl.cs From 250fdac49981d4151c68cce492aad06bd5bef9a6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 11:28:43 +0200 Subject: [PATCH 060/777] Added SearchResultStore. Implemented first and second scan. --- Forms/MemorySearchForm.Designer.cs | 12 +- Forms/MemorySearchForm.cs | 258 +++++++++++++++++++-------- Forms/MemorySearchForm.resx | 9 - MemorySearcher/SearchContext.cs | 32 ++++ MemorySearcher/SearchResultBlock.cs | 21 +++ MemorySearcher/SearchResultStore.cs | 49 +++++ MemorySearcher/SearchSettings.cs | 3 +- MemorySearcher/Searcher.cs | 131 ++++++++++++-- MemorySearcher/SearcherWorker.cs | 51 ++++-- ReClass.NET.csproj | 5 + Util/Extension.BinaryReaderWriter.cs | 31 ++++ Util/Extension.Linq.cs | 51 +++++- Util/IntPtrComparer.cs | 15 ++ 13 files changed, 543 insertions(+), 125 deletions(-) create mode 100644 MemorySearcher/SearchContext.cs create mode 100644 MemorySearcher/SearchResultBlock.cs create mode 100644 MemorySearcher/SearchResultStore.cs create mode 100644 Util/Extension.BinaryReaderWriter.cs create mode 100644 Util/IntPtrComparer.cs diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index e1c8b7c0..a4891c49 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -408,6 +408,7 @@ private void InitializeComponent() this.nextScanButton.TabIndex = 12; this.nextScanButton.Text = "Next Scan"; this.nextScanButton.UseVisualStyleBackColor = true; + this.nextScanButton.Click += new System.EventHandler(this.nextScanButton_Click); // // scanProgressBar // @@ -422,6 +423,8 @@ private void InitializeComponent() this.resultDataGridView.AllowUserToAddRows = false; this.resultDataGridView.AllowUserToDeleteRows = false; this.resultDataGridView.AllowUserToResizeRows = false; + this.resultDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.resultAddressColumn, @@ -438,6 +441,7 @@ private void InitializeComponent() // resultAddressColumn // this.resultAddressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.resultAddressColumn.DataPropertyName = "address"; this.resultAddressColumn.HeaderText = "Address"; this.resultAddressColumn.Name = "resultAddressColumn"; this.resultAddressColumn.ReadOnly = true; @@ -445,6 +449,7 @@ private void InitializeComponent() // resultValueColumn // this.resultValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultValueColumn.DataPropertyName = "value"; this.resultValueColumn.HeaderText = "Value"; this.resultValueColumn.Name = "resultValueColumn"; this.resultValueColumn.ReadOnly = true; @@ -453,6 +458,7 @@ private void InitializeComponent() // resultPreviousValueColumn // this.resultPreviousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultPreviousValueColumn.DataPropertyName = "previous"; this.resultPreviousValueColumn.HeaderText = "Previous"; this.resultPreviousValueColumn.Name = "resultPreviousValueColumn"; this.resultPreviousValueColumn.ReadOnly = true; @@ -467,7 +473,7 @@ private void InitializeComponent() this.resultCountLabel.TabIndex = 15; this.resultCountLabel.Text = "<>"; // - // MemorySearcherForm + // MemorySearchForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; @@ -479,7 +485,7 @@ private void InitializeComponent() this.Controls.Add(this.firstScanButton); this.Controls.Add(this.flowLayoutPanel1); this.Controls.Add(this.bannerBox); - this.Name = "MemorySearcherForm"; + this.Name = "MemorySearchForm"; this.Text = "ReClass.NET - Memory Searcher"; ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); this.filterGroupBox.ResumeLayout(false); @@ -531,9 +537,9 @@ private void InitializeComponent() private System.Windows.Forms.Button nextScanButton; private System.Windows.Forms.ProgressBar scanProgressBar; private System.Windows.Forms.DataGridView resultDataGridView; + private System.Windows.Forms.Label resultCountLabel; private System.Windows.Forms.DataGridViewTextBoxColumn resultAddressColumn; private System.Windows.Forms.DataGridViewTextBoxColumn resultValueColumn; private System.Windows.Forms.DataGridViewTextBoxColumn resultPreviousValueColumn; - private System.Windows.Forms.Label resultCountLabel; } } \ No newline at end of file diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 5260a6d3..75bbd5f2 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -2,12 +2,15 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; +using System.Diagnostics.Contracts; using System.Drawing; using System.Globalization; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using ReClassNET.Memory; using ReClassNET.MemorySearcher; using ReClassNET.MemorySearcher.Comparer; using ReClassNET.UI; @@ -18,15 +21,25 @@ public partial class MemorySearchForm : IconForm { private const int MaxVisibleResults = 1000; + private readonly RemoteProcess process; + private bool isFirstScan; + private Searcher searcher; + private SearchCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); private SearchValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); - public MemorySearchForm() + public MemorySearchForm(RemoteProcess process) { + Contract.Requires(process != null); + + this.process = process; + InitializeComponent(); + resultDataGridView.AutoGenerateColumns = false; + startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); endAddressTextBox.Text = #if WIN64 @@ -46,6 +59,55 @@ private void SetResultCount(int count) resultCountLabel.Text = count > MaxVisibleResults ? $"Found: {count} (only {MaxVisibleResults} shown)" : $"Found: {count}"; } + private void ShowResults() + { + Contract.Requires(searcher != null); + + SetResultCount(searcher.TotalResultCount); + + var dt = new DataTable(); + var addressColumn = dt.Columns.Add("address", typeof(string)); + var valueColumn = dt.Columns.Add("value", typeof(string)); + var previousColumn = dt.Columns.Add("previous", typeof(string)); + var dataColumn = dt.Columns.Add("data", typeof(SearchResult)); + + foreach (var result in searcher.GetResults().Take(MaxVisibleResults)) + { + var row = dt.NewRow(); + row[addressColumn] = result.Address.ToString(Constants.StringHexFormat); + row[valueColumn] = row[previousColumn] = FormatResultValue(result, false); + row[dataColumn] = result; + dt.Rows.Add(row); + } + + resultDataGridView.DataSource = dt; + } + + private static string FormatResultValue(SearchResult result, bool showAsHex) + { + switch (result) + { + case ByteSearchResult sr: + return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); + case ShortSearchResult sr: + return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); + case IntegerSearchResult sr: + return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); + case LongSearchResult sr: + return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); + case FloatSearchResult sr: + return sr.Value.ToString(CultureInfo.InvariantCulture); + case DoubleSearchResult sr: + return sr.Value.ToString(CultureInfo.InvariantCulture); + case ArrayOfBytesSearchResult sr: + return "[...]"; + case StringSearchResult sr: + return "[...]"; + default: + throw new InvalidOperationException(); + } + } + private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) { OnValueTypeChanged(); @@ -67,6 +129,24 @@ private void OnValueTypeChanged() ) : EnumDescriptionDisplay.CreateExclude(SearchCompareType.Unknown); } + + int alignment = 1; + switch (valueType) + { + case SearchValueType.Short: + alignment = 2; + break; + case SearchValueType.Integer: + case SearchValueType.Long: + case SearchValueType.Float: + case SearchValueType.Double: + alignment = 4; + break; + } + fastScanAlignmentTextBox.Text = alignment.ToString(); + + floatingOptionsGroupBox.Visible = valueType == SearchValueType.Float || valueType == SearchValueType.Double; + stringOptionsGroupBox.Visible = valueType == SearchValueType.String; } private void Reset() @@ -75,22 +155,49 @@ private void Reset() resultDataGridView.DataSource = null; nextScanButton.Enabled = false; + valueTypeComboBox.Enabled = true; + + floatingOptionsGroupBox.Enabled = true; + stringOptionsGroupBox.Enabled = true; + scanOptionsGroupBox.Enabled = true; isFirstScan = true; } - private void firstScanButton_Click(object sender, EventArgs e) + private async void firstScanButton_Click(object sender, EventArgs e) + { + await OnStartFirstScan(); + } + + private async void nextScanButton_Click(object sender, EventArgs e) { - OnStartFirstScan(); + await OnStartSecondScan(); } - private void OnStartFirstScan() + private async Task OnStartFirstScan() { if (isFirstScan) { var settings = CreateSearchSettings(); + var comparer = CreateComparer(settings); + searcher = new Searcher(process, settings); + + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); + + if (completed) + { + ShowResults(); + } + scanProgressBar.Value = 0; nextScanButton.Enabled = true; + valueTypeComboBox.Enabled = false; + + floatingOptionsGroupBox.Enabled = false; + stringOptionsGroupBox.Enabled = false; + scanOptionsGroupBox.Enabled = false; + isFirstScan = false; } else @@ -99,114 +206,117 @@ private void OnStartFirstScan() } } - private void ParseInput(out long value1, out long value2, bool isHex) + private async Task OnStartSecondScan() { - value1 = value2 = 0; + if (!isFirstScan) + { + var comparer = CreateComparer(searcher.Settings); + + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); - long.TryParse(valueDualValueControl.Value1, isHex ? NumberStyles.HexNumber : NumberStyles.Integer, null, out value1); - long.TryParse(valueDualValueControl.Value2, isHex ? NumberStyles.HexNumber : NumberStyles.Integer, null, out value2); + if (completed) + { + ShowResults(); + } + + scanProgressBar.Value = 0; + } } - private void ParseInput(out double value1, out double value2) + private SearchSettings CreateSearchSettings() { - value1 = value2 = 0; + var settings = new SearchSettings + { + ValueType = SelectedValueType + }; - double.TryParse(valueDualValueControl.Value1, out value1); - double.TryParse(valueDualValueControl.Value2, out value2); + long.TryParse(startAddressTextBox.Text, NumberStyles.HexNumber, null, out var startAddressVar); + long.TryParse(endAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); +#if RECLASSNET64 + settings.StartAddress = unchecked((IntPtr)startAddressVar); + settings.StopAddress = unchecked((IntPtr)endAddressVar); +#else + settings.StartAddress = unchecked((IntPtr)(int)startAddressVar); + settings.StopAddress = unchecked((IntPtr)(int)endAddressVar); +#endif + settings.FastScan = fastScanCheckBox.Checked; + int.TryParse(fastScanAlignmentTextBox.Text, out var alignment); + settings.FastScanAlignment = Math.Max(1, alignment); + + SettingState CheckStateToSettingState(CheckState state) + { + switch (state) + { + case CheckState.Checked: + return SettingState.Yes; + case CheckState.Unchecked: + return SettingState.No; + default: + return SettingState.Indeterminate; + } + } + + settings.SearchWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); + settings.SearchExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); + settings.SearchCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); + + return settings; } - private SearchSettings CreateSearchSettings() + private IMemoryComparer CreateComparer(SearchSettings settings) { - var valueType = SelectedValueType; - var compareType = SelectedCompareType; + Contract.Requires(settings != null); - var settings = new SearchSettings(); + var compareType = SelectedCompareType; - if (valueType == SearchValueType.Byte || valueType == SearchValueType.Short || valueType == SearchValueType.Integer || valueType == SearchValueType.Long) + if (settings.ValueType == SearchValueType.Byte || settings.ValueType == SearchValueType.Short || settings.ValueType == SearchValueType.Integer || settings.ValueType == SearchValueType.Long) { - ParseInput(out var value1, out var value2, isHexCheckBox.Checked); + var numberStyle = isHexCheckBox.Checked ? NumberStyles.HexNumber : NumberStyles.Integer; + long.TryParse(valueDualValueControl.Value1, numberStyle, null, out var value1); + long.TryParse(valueDualValueControl.Value2, numberStyle, null, out var value2); - switch (valueType) + switch (settings.ValueType) { case SearchValueType.Byte: - settings.Comparer = new ByteMemoryComparer(compareType, (byte)value1, (byte)value2); - break; + return new ByteMemoryComparer(compareType, (byte)value1, (byte)value2); case SearchValueType.Short: - settings.Comparer = new ShortMemoryComparer(compareType, (short)value1, (short)value2); - break; + return new ShortMemoryComparer(compareType, (short)value1, (short)value2); case SearchValueType.Integer: - settings.Comparer = new IntegerMemoryComparer(compareType, (int)value1, (int)value2); - break; + return new IntegerMemoryComparer(compareType, (int)value1, (int)value2); case SearchValueType.Long: - settings.Comparer = new LongMemoryComparer(compareType, value1, value2); - break; + return new LongMemoryComparer(compareType, value1, value2); } } - else if (valueType == SearchValueType.Float || valueType == SearchValueType.Double) + else if (settings.ValueType == SearchValueType.Float || settings.ValueType == SearchValueType.Double) { - ParseInput(out var value1, out var value2); + double.TryParse(valueDualValueControl.Value1, out var value1); + double.TryParse(valueDualValueControl.Value2, out var value2); var roundMode = roundStrictRadioButton.Checked ? SearchRoundMode.Strict : roundLooseRadioButton.Checked ? SearchRoundMode.Normal : SearchRoundMode.Truncate; - switch (valueType) + switch (settings.ValueType) { case SearchValueType.Float: - settings.Comparer = new FloatMemoryComparer(compareType, roundMode, (float)value1, (float)value2); - break; + return new FloatMemoryComparer(compareType, roundMode, (float)value1, (float)value2); case SearchValueType.Double: - settings.Comparer = new DoubleMemoryComparer(compareType, roundMode, value1, value2); - break; + return new DoubleMemoryComparer(compareType, roundMode, value1, value2); } } - else if (valueType == SearchValueType.ArrayOfBytes) + else if (settings.ValueType == SearchValueType.ArrayOfBytes) { var pattern = BytePattern.Parse(valueDualValueControl.Value1); - settings.Comparer = new ArrayOfBytesMemoryComparer(pattern); + return new ArrayOfBytesMemoryComparer(pattern); } - else if (valueType == SearchValueType.String) + else if (settings.ValueType == SearchValueType.String) { var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; - settings.Comparer = new StringMemoryComparer(valueDualValueControl.Value1, encoding, caseSensitiveCheckBox.Checked); - } - - if (settings.Comparer == null) - { - throw new Exception(); + return new StringMemoryComparer(valueDualValueControl.Value1, encoding, caseSensitiveCheckBox.Checked); } - long.TryParse(startAddressTextBox.Text, NumberStyles.HexNumber, null, out var startAddressVar); - long.TryParse(endAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); -#if WIN64 - settings.StartAddress = unchecked((IntPtr)startAddressVar); - settings.StopAddress = unchecked((IntPtr)endAddressVar); -#else - settings.StartAddress = unchecked((IntPtr)(int)startAddressVar); - settings.StopAddress = unchecked((IntPtr)(int)endAddressVar); -#endif - settings.FastScan = fastScanCheckBox.Checked; - int.TryParse(fastScanAlignmentTextBox.Text, out var alignment); - settings.FastScanAlignment = Math.Max(1, alignment); - - settings.SearchWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); - settings.SearchExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); - settings.SearchCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); - - return settings; - } - - private static SettingState CheckStateToSettingState(CheckState state) - { - switch (state) - { - case CheckState.Checked: - return SettingState.Yes; - case CheckState.Unchecked: - return SettingState.No; - default: - return SettingState.Indeterminate; - } + throw new Exception(); } } } diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx index 08444b0f..13352fd0 100644 --- a/Forms/MemorySearchForm.resx +++ b/Forms/MemorySearchForm.resx @@ -126,13 +126,4 @@ True - - True - - - True - - - True - \ No newline at end of file diff --git a/MemorySearcher/SearchContext.cs b/MemorySearcher/SearchContext.cs new file mode 100644 index 00000000..a1ac2a17 --- /dev/null +++ b/MemorySearcher/SearchContext.cs @@ -0,0 +1,32 @@ +using System.Diagnostics.Contracts; +using ReClassNET.MemorySearcher.Comparer; + +namespace ReClassNET.MemorySearcher +{ + internal class SearchContext + { + public byte[] Buffer { get; private set; } + public SearcherWorker Worker { get; } + + public SearchContext(SearchSettings settings, IMemoryComparer comparer, int bufferSize) + { + Contract.Requires(settings != null); + Contract.Requires(comparer != null); + Contract.Requires(bufferSize >= 0); + + EnsureBufferSize(bufferSize); + + Worker = new SearcherWorker(settings, comparer); + } + + public void EnsureBufferSize(int size) + { + Contract.Requires(size >= 0); + + if (Buffer == null || Buffer.Length < size) + { + Buffer = new byte[size]; + } + } + } +} diff --git a/MemorySearcher/SearchResultBlock.cs b/MemorySearcher/SearchResultBlock.cs new file mode 100644 index 00000000..90b955a6 --- /dev/null +++ b/MemorySearcher/SearchResultBlock.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using ReClassNET.Util; + +namespace ReClassNET.MemorySearcher +{ + internal class SearchResultBlock + { + public IntPtr Start { get; } + public IntPtr End { get; } + public int Size => End.Sub(Start).ToInt32(); + public IReadOnlyList Results { get; } + + public SearchResultBlock(IntPtr start, IntPtr end, IReadOnlyList results) + { + Start = start; + End = end; + Results = results; + } + } +} diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/SearchResultStore.cs new file mode 100644 index 00000000..a2eada10 --- /dev/null +++ b/MemorySearcher/SearchResultStore.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemorySearcher +{ + internal class SearchResultStore + { + private const int MaximumResultsCount = 10000000; + + private readonly List store = new List(); + + private readonly string storePath; + + public int TotalResultCount { get; private set; } + + public SearchResultStore() + { + this.storePath = storePath; + } + + public IReadOnlyList GetResultBlocks() + { + return store; + } + + public void AddBlock(SearchResultBlock block) + { + Contract.Requires(block != null); + + lock (store) + { + TotalResultCount += block.Results.Count; + + store.Add(block); + + if (TotalResultCount > MaximumResultsCount) + { + TransferResults(); + } + } + } + + private void TransferResults() + { + + } + } +} diff --git a/MemorySearcher/SearchSettings.cs b/MemorySearcher/SearchSettings.cs index fa0a51df..bbe25eed 100644 --- a/MemorySearcher/SearchSettings.cs +++ b/MemorySearcher/SearchSettings.cs @@ -1,5 +1,4 @@ using System; -using ReClassNET.MemorySearcher.Comparer; namespace ReClassNET.MemorySearcher { @@ -27,6 +26,6 @@ public class SearchSettings public bool SearchMemMapped { get; set; } = false; public bool FastScan { get; set; } = true; public int FastScanAlignment { get; set; } = 1; - public IMemoryComparer Comparer { get; set; } + public SearchValueType ValueType { get; set; } = SearchValueType.Byte; } } diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index ffc2981f..cbe06d0f 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Threading.Tasks; using ReClassNET.Memory; +using ReClassNET.MemorySearcher.Comparer; using ReClassNET.Util; namespace ReClassNET.MemorySearcher @@ -12,17 +13,36 @@ namespace ReClassNET.MemorySearcher public class Searcher { private readonly RemoteProcess process; + private readonly SearchSettings settings; + private SearchResultStore store; - public Searcher(RemoteProcess process) + public SearchSettings Settings => settings; + + public int TotalResultCount => store.TotalResultCount; + + private bool isFirstScan; + + public Searcher(RemoteProcess process, SearchSettings settings) { Contract.Requires(process != null); + Contract.Requires(settings != null); this.process = process; + this.settings = settings; + + isFirstScan = true; } - private IList
GetSearchableSections(SearchSettings settings) + public IEnumerable GetResults() { - Contract.Requires(settings != null); + Contract.Ensures(Contract.Result>() != null); + + return store.GetResultBlocks().SelectMany(kv => kv.Results); + } + + private IList
GetSearchableSections() + { + Contract.Ensures(Contract.Result>() != null); return process.Sections .Where(s => !s.Protection.HasFlag(SectionProtection.Guard)) @@ -70,11 +90,21 @@ private IList
GetSearchableSections(SearchSettings settings) .ToList(); } - public Task FirstScan(SearchSettings settings, CancellationToken ct, IProgress progress) + public Task Search(IMemoryComparer comparer, CancellationToken ct, IProgress progress) { - Contract.Requires(settings != null); + return isFirstScan ? FirstScan(comparer, ct, progress) : NextScan(comparer, ct, progress); + } + + private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IProgress progress) + { + Contract.Requires(comparer != null); + Contract.Ensures(Contract.Result>() != null); + + store = new SearchResultStore(); - var sections = GetSearchableSections(settings); + var sections = GetSearchableSections(); + + var maxSectionSize = (int)sections.Average(s => s.Size.ToInt32()); progress?.Report(0); @@ -85,31 +115,98 @@ public Task FirstScan(SearchSettings settings, CancellationToken ct, IProg var result = Parallel.ForEach( sections, new ParallelOptions { CancellationToken = ct}, - () => new SearcherWorker(settings), - (s, state, _, w) => + () => new SearchContext(settings, comparer, maxSectionSize), + (s, state, _, context) => { - var buffer = new MemoryBuffer(s.Size.ToInt32()) { Process = process }; - buffer.Update(s.Start, false); - - w.Search(s.Start, buffer.RawData); + var size = s.Size.ToInt32(); + context.EnsureBufferSize(size); + var buffer = context.Buffer; + if (process.ReadRemoteMemoryIntoBuffer(s.Start, ref buffer, 0, size)) + { + var results = context.Worker.Search(buffer, size) + .Select(r => { r.Address = r.Address.Add(s.Start); return r; }) + .ToList(); + if (results.Count > 0) + { + var block = new SearchResultBlock( + results.Min(r => r.Address, IntPtrComparer.Instance), + results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, + results + ); + store.AddBlock(block); + } + } progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); - return w; + return context; }, - w => w.Finish() + w => { } ); - return result.IsCompleted; + + if (result.IsCompleted) + { + isFirstScan = false; + + return true; + } + + return false; }, ct); } - public Task NextScan(SearchSettings settings, CancellationToken ct, IProgress progress) + private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IProgress progress) { - Contract.Requires(settings != null); + Contract.Requires(comparer != null); + Contract.Ensures(Contract.Result>() != null); + + var localStore = new SearchResultStore(); + + progress?.Report(0); + + var counter = 0; return Task.Run(() => { + var result = Parallel.ForEach( + store.GetResultBlocks(), + new ParallelOptions { CancellationToken = ct }, + () => new SearchContext(settings, comparer, 0), + (b, state, _, context) => + { + context.EnsureBufferSize(b.Size); + var buffer = context.Buffer; + if (process.ReadRemoteMemoryIntoBuffer(b.Start, ref buffer, 0, b.Size)) + { + var results = context.Worker.Search(buffer, buffer.Length, b.Results.Select(r => { r.Address = r.Address.Sub(b.Start); return r; })) + .Select(r => { r.Address = r.Address.Add(b.Start); return r; }) + .ToList(); + if (results.Count > 0) + { + var block = new SearchResultBlock( + results.Min(r => r.Address, IntPtrComparer.Instance), + results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, + results + ); + localStore.AddBlock(block); + } + } + + //progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); + + return context; + }, + w => { } + ); + + if (result.IsCompleted) + { + store = localStore; + + return true; + } + return false; }, ct); } } diff --git a/MemorySearcher/SearcherWorker.cs b/MemorySearcher/SearcherWorker.cs index bc6ef562..264509fa 100644 --- a/MemorySearcher/SearcherWorker.cs +++ b/MemorySearcher/SearcherWorker.cs @@ -1,46 +1,59 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; +using ReClassNET.MemorySearcher.Comparer; namespace ReClassNET.MemorySearcher { internal class SearcherWorker { - private static int InstanceCounter = 0; - - private const int MaxResultCount = 200000; - - private readonly int id; - private readonly SearchSettings settings; - private readonly List results = new List(2000); + private readonly IMemoryComparer comparer; - public SearcherWorker(SearchSettings settings) + public SearcherWorker(SearchSettings settings, IMemoryComparer comparer) { Contract.Requires(settings != null); + Contract.Requires(comparer != null); this.settings = settings; - - id = Interlocked.Increment(ref InstanceCounter); + this.comparer = comparer; } - public void Search(IntPtr address, byte[] data) + public IEnumerable Search(byte[] data, int count) { - var endIndex = data.Length - settings.Comparer.ValueSize; + Contract.Requires(data != null); - var comparer = settings.Comparer; + var endIndex = count - comparer.ValueSize; for (var i = 0; i < endIndex; i += settings.FastScanAlignment) { if (comparer.Compare(data, i, out var result)) { - result.Address = address + i; + result.Address = (IntPtr)i; + + yield return result; + } + } + } + + public IEnumerable Search(byte[] data, int count, IEnumerable results) + { + Contract.Requires(data != null); + Contract.Requires(results != null); + + var endIndex = count - comparer.ValueSize; + + foreach (var previous in results) + { + var offset = previous.Address.ToInt32(); + if (offset + comparer.ValueSize < count) + { + if (comparer.Compare(data, offset, previous, out var result)) + { + result.Address = previous.Address; - results.Add(result); + yield return result; + } } } } diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index a7c636ee..409ccc7b 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -188,7 +188,10 @@ + + + @@ -281,6 +284,7 @@ MemoryViewControl.cs + @@ -408,6 +412,7 @@ + diff --git a/Util/Extension.BinaryReaderWriter.cs b/Util/Extension.BinaryReaderWriter.cs new file mode 100644 index 00000000..4a36ca94 --- /dev/null +++ b/Util/Extension.BinaryReaderWriter.cs @@ -0,0 +1,31 @@ +using System; +using System.Diagnostics.Contracts; +using System.IO; + +namespace ReClassNET.Util +{ + public static class BinaryReaderWriterExtension + { + public static IntPtr ReadIntPtr(this BinaryReader br) + { + Contract.Requires(br != null); + +#if RECLASSNET64 + return (IntPtr)br.ReadInt64(); +#else + return (IntPtr)br.ReadInt32(); +#endif + } + + public static void Write(this BinaryWriter bw, IntPtr value) + { + Contract.Requires(bw != null); + +#if RECLASSNET64 + bw.Write(value.ToInt64()); +#else + bw.Write(value.ToInt32()); +#endif + } + } +} diff --git a/Util/Extension.Linq.cs b/Util/Extension.Linq.cs index 4657831b..d1bba8f9 100644 --- a/Util/Extension.Linq.cs +++ b/Util/Extension.Linq.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace ReClassNET.Util { @@ -13,5 +14,53 @@ public static string Join(this IEnumerable source, string separator) { return string.Join(separator, source); } + + public static TResult Max(this IEnumerable source, Func selector, IComparer comparer) + { + comparer = comparer ?? Comparer.Default; + + using (var it = source.GetEnumerator()) + { + if (!it.MoveNext()) + { + throw new InvalidOperationException(); + } + + var max = selector(it.Current); + while (it.MoveNext()) + { + var current = selector(it.Current); + if (comparer.Compare(current, max) > 0) + { + max = current; + } + } + return max; + } + } + + public static TResult Min(this IEnumerable source, Func selector, IComparer comparer) + { + comparer = comparer ?? Comparer.Default; + + using (var it = source.GetEnumerator()) + { + if (!it.MoveNext()) + { + throw new InvalidOperationException(); + } + + var min = selector(it.Current); + while (it.MoveNext()) + { + var current = selector(it.Current); + if (comparer.Compare(current, min) < 0) + { + min = current; + } + } + return min; + } + } } } diff --git a/Util/IntPtrComparer.cs b/Util/IntPtrComparer.cs new file mode 100644 index 00000000..3400e39d --- /dev/null +++ b/Util/IntPtrComparer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace ReClassNET.Util +{ + public class IntPtrComparer : IComparer + { + public static IntPtrComparer Instance { get; } = new IntPtrComparer(); + + public int Compare(IntPtr x, IntPtr y) + { + return x.ToInt64().CompareTo(y.ToInt64()); + } + } +} From 8c2c5e454ec1d2716a314b315673ee2f1a731473 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 11:29:47 +0200 Subject: [PATCH 061/777] Changed class name. --- MemorySearcher/SearchContext.cs | 4 ++-- MemorySearcher/{SearcherWorker.cs => SearchWorker.cs} | 4 ++-- ReClass.NET.csproj | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename MemorySearcher/{SearcherWorker.cs => SearchWorker.cs} (92%) diff --git a/MemorySearcher/SearchContext.cs b/MemorySearcher/SearchContext.cs index a1ac2a17..cdf8e0e4 100644 --- a/MemorySearcher/SearchContext.cs +++ b/MemorySearcher/SearchContext.cs @@ -6,7 +6,7 @@ namespace ReClassNET.MemorySearcher internal class SearchContext { public byte[] Buffer { get; private set; } - public SearcherWorker Worker { get; } + public SearchWorker Worker { get; } public SearchContext(SearchSettings settings, IMemoryComparer comparer, int bufferSize) { @@ -16,7 +16,7 @@ public SearchContext(SearchSettings settings, IMemoryComparer comparer, int buff EnsureBufferSize(bufferSize); - Worker = new SearcherWorker(settings, comparer); + Worker = new SearchWorker(settings, comparer); } public void EnsureBufferSize(int size) diff --git a/MemorySearcher/SearcherWorker.cs b/MemorySearcher/SearchWorker.cs similarity index 92% rename from MemorySearcher/SearcherWorker.cs rename to MemorySearcher/SearchWorker.cs index 264509fa..dbbfa033 100644 --- a/MemorySearcher/SearcherWorker.cs +++ b/MemorySearcher/SearchWorker.cs @@ -5,12 +5,12 @@ namespace ReClassNET.MemorySearcher { - internal class SearcherWorker + internal class SearchWorker { private readonly SearchSettings settings; private readonly IMemoryComparer comparer; - public SearcherWorker(SearchSettings settings, IMemoryComparer comparer) + public SearchWorker(SearchSettings settings, IMemoryComparer comparer) { Contract.Requires(settings != null); Contract.Requires(comparer != null); diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 409ccc7b..9b73cd7c 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -189,7 +189,7 @@ - + From 61d0cc3f2d9fb43eca0df3d3597a2ba5fc5a1b9c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 14:41:22 +0200 Subject: [PATCH 062/777] Implemented file storage for results. --- MemorySearcher/SearchResultStore.cs | 192 ++++++++++++++++++++++++++-- MemorySearcher/Searcher.cs | 24 +++- 2 files changed, 202 insertions(+), 14 deletions(-) diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/SearchResultStore.cs index a2eada10..00c673ac 100644 --- a/MemorySearcher/SearchResultStore.cs +++ b/MemorySearcher/SearchResultStore.cs @@ -1,27 +1,67 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.IO; +using System.Text; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher { - internal class SearchResultStore + internal class SearchResultStore : IDisposable { - private const int MaximumResultsCount = 10000000; + private enum StorageMode + { + Memory, + File + } + + private const int MaximumMemoryResultsCount = 10000000; private readonly List store = new List(); private readonly string storePath; + private FileStream fileStream; + + private StorageMode mode = StorageMode.Memory; + + private readonly SearchValueType valueType = SearchValueType.Byte; public int TotalResultCount { get; private set; } - public SearchResultStore() + public SearchResultStore(string storePath) + { + this.storePath = Path.Combine(storePath, $"ReClass.NET_MemorySearcher_{Guid.NewGuid()}.tmp"); + } + + public void Dispose() + { + Finish(); + + try + { + if (File.Exists(storePath)) + { + File.Delete(storePath); + } + } + catch + { + // ignored + } + } + + public void Finish() { - this.storePath = storePath; + if (mode == StorageMode.File) + { + fileStream?.Dispose(); + fileStream = null; + } } - public IReadOnlyList GetResultBlocks() + public IEnumerable GetResultBlocks() { - return store; + return mode == StorageMode.Memory ? store : ReadBlocksFromFile(); } public void AddBlock(SearchResultBlock block) @@ -32,18 +72,148 @@ public void AddBlock(SearchResultBlock block) { TotalResultCount += block.Results.Count; - store.Add(block); + if (mode == StorageMode.Memory) + { + if (TotalResultCount > MaximumMemoryResultsCount) + { + mode = StorageMode.File; + + fileStream = File.OpenWrite(storePath); + + foreach (var b in store) + { + AppendBlockToFile(b); + } + store.Clear(); + store.TrimExcess(); + + AppendBlockToFile(block); + } + } + else + { + AppendBlockToFile(block); + } + } + } + + private void AppendBlockToFile(SearchResultBlock block) + { + Contract.Requires(block != null); + + using (var bw = new BinaryWriter(fileStream, Encoding.ASCII, true)) + { + bw.Write(block.Start); + bw.Write(block.End); + bw.Write(block.Results.Count); + + foreach (var result in block.Results) + { + WriteSearchResult(bw, result); + } + } + } - if (TotalResultCount > MaximumResultsCount) + private IEnumerable ReadBlocksFromFile() + { + using (var stream = File.OpenRead(storePath)) + { + using (var br = new BinaryReader(stream)) { - TransferResults(); + var length = stream.Length; + + while (stream.Position < length) + { + var start = br.ReadIntPtr(); + var end = br.ReadIntPtr(); + + var resultCount = br.ReadInt32(); + + var results = new List(resultCount); + for (var i = 0; i < resultCount; ++i) + { + results.Add(ReadSearchResult(br)); + } + + yield return new SearchResultBlock(start, end, results); + } } } } - private void TransferResults() + private SearchResult ReadSearchResult(BinaryReader br) + { + var address = br.ReadIntPtr(); + + SearchResult result; + switch (valueType) + { + case SearchValueType.Byte: + result = new ByteSearchResult(br.ReadByte()); + break; + case SearchValueType.Short: + result = new ShortSearchResult(br.ReadInt16()); + break; + case SearchValueType.Integer: + result = new IntegerSearchResult(br.ReadInt32()); + break; + case SearchValueType.Long: + result = new LongSearchResult(br.ReadInt64()); + break; + case SearchValueType.Float: + result = new FloatSearchResult(br.ReadSingle()); + break; + case SearchValueType.Double: + result = new DoubleSearchResult(br.ReadDouble()); + break; + case SearchValueType.ArrayOfBytes: + result = new ArrayOfBytesSearchResult(); + break; + case SearchValueType.String: + result = new StringSearchResult(); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + result.Address = address; + + return result; + } + + private static void WriteSearchResult(BinaryWriter bw, SearchResult result) { - + bw.Write(result.Address); + + switch (result) + { + case ByteSearchResult byteSearchResult: + bw.Write(byteSearchResult.Value); + break; + case ShortSearchResult shortSearchResult: + bw.Write(shortSearchResult.Value); + break; + case IntegerSearchResult integerSearchResult: + bw.Write(integerSearchResult.Value); + break; + case LongSearchResult longSearchResult: + bw.Write(longSearchResult.Value); + break; + case FloatSearchResult floatSearchResult: + bw.Write(floatSearchResult.Value); + break; + case DoubleSearchResult doubleSearchResult: + bw.Write(doubleSearchResult.Value); + break; + case ArrayOfBytesSearchResult arrayOfBytesSearchResult: + + break; + case StringSearchResult stringSearchResult: + + break; + default: + throw new ArgumentOutOfRangeException(nameof(result)); + } } } } diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index cbe06d0f..c3b2b0a9 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -10,7 +11,7 @@ namespace ReClassNET.MemorySearcher { - public class Searcher + public class Searcher : IDisposable { private readonly RemoteProcess process; private readonly SearchSettings settings; @@ -33,6 +34,12 @@ public Searcher(RemoteProcess process, SearchSettings settings) isFirstScan = true; } + public void Dispose() + { + store?.Dispose(); + store = null; + } + public IEnumerable GetResults() { Contract.Ensures(Contract.Result>() != null); @@ -40,6 +47,11 @@ public IEnumerable GetResults() return store.GetResultBlocks().SelectMany(kv => kv.Results); } + private static SearchResultStore CreateStore() + { + return new SearchResultStore(Path.GetTempPath()); + } + private IList
GetSearchableSections() { Contract.Ensures(Contract.Result>() != null); @@ -100,7 +112,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); - store = new SearchResultStore(); + store = CreateStore(); var sections = GetSearchableSections(); @@ -144,6 +156,8 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr w => { } ); + store.Finish(); + if (result.IsCompleted) { isFirstScan = false; @@ -160,7 +174,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); - var localStore = new SearchResultStore(); + var localStore = CreateStore(); progress?.Report(0); @@ -199,8 +213,12 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro w => { } ); + localStore.Finish(); + if (result.IsCompleted) { + store.Dispose(); + store = localStore; return true; From 2aecb9984dbbf2bc88da715212b68e029bba50c8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 14:42:01 +0200 Subject: [PATCH 063/777] Refactored code. --- Forms/MemorySearchForm.Designer.cs | 1 + Forms/MemorySearchForm.cs | 60 ++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index a4891c49..a94049ee 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -487,6 +487,7 @@ private void InitializeComponent() this.Controls.Add(this.bannerBox); this.Name = "MemorySearchForm"; this.Text = "ReClass.NET - Memory Searcher"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MemorySearchForm_FormClosing); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); this.filterGroupBox.ResumeLayout(false); this.filterGroupBox.PerformLayout(); diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 75bbd5f2..283848c9 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -14,12 +14,13 @@ using ReClassNET.MemorySearcher; using ReClassNET.MemorySearcher.Comparer; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Forms { public partial class MemorySearchForm : IconForm { - private const int MaxVisibleResults = 1000; + private const int MaxVisibleResults = 10000; private readonly RemoteProcess process; @@ -42,7 +43,7 @@ public MemorySearchForm(RemoteProcess process) startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); endAddressTextBox.Text = -#if WIN64 +#if RECLASSNET64 long.MaxValue.ToString(Constants.StringHexFormat); #else int.MaxValue.ToString(Constants.StringHexFormat); @@ -71,7 +72,7 @@ private void ShowResults() var previousColumn = dt.Columns.Add("previous", typeof(string)); var dataColumn = dt.Columns.Add("data", typeof(SearchResult)); - foreach (var result in searcher.GetResults().Take(MaxVisibleResults)) + foreach (var result in searcher.GetResults().Take(MaxVisibleResults).OrderBy(r => r.Address, IntPtrComparer.Instance)) { var row = dt.NewRow(); row[addressColumn] = result.Address.ToString(Constants.StringHexFormat); @@ -115,20 +116,9 @@ private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs private void OnValueTypeChanged() { + SetValidCompareTypes(); + var valueType = SelectedValueType; - if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) - { - scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(SearchCompareType.Equal); - } - else - { - scanTypeComboBox.DataSource = isFirstScan - ? EnumDescriptionDisplay.CreateExclude( - SearchCompareType.Changed, SearchCompareType.NotChanged, SearchCompareType.Decreased, SearchCompareType.DecreasedOrEqual, - SearchCompareType.Increased, SearchCompareType.IncreasedOrEqual - ) - : EnumDescriptionDisplay.CreateExclude(SearchCompareType.Unknown); - } int alignment = 1; switch (valueType) @@ -149,8 +139,29 @@ private void OnValueTypeChanged() stringOptionsGroupBox.Visible = valueType == SearchValueType.String; } + private void SetValidCompareTypes() + { + var valueType = SelectedValueType; + if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + { + scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(SearchCompareType.Equal); + } + else + { + scanTypeComboBox.DataSource = isFirstScan + ? EnumDescriptionDisplay.CreateExclude( + SearchCompareType.Changed, SearchCompareType.NotChanged, SearchCompareType.Decreased, SearchCompareType.DecreasedOrEqual, + SearchCompareType.Increased, SearchCompareType.IncreasedOrEqual + ) + : EnumDescriptionDisplay.CreateExclude(SearchCompareType.Unknown); + } + } + private void Reset() { + searcher?.Dispose(); + searcher = null; + SetResultCount(0); resultDataGridView.DataSource = null; @@ -162,6 +173,8 @@ private void Reset() scanOptionsGroupBox.Enabled = true; isFirstScan = true; + + SetValidCompareTypes(); } private async void firstScanButton_Click(object sender, EventArgs e) @@ -178,6 +191,8 @@ private async Task OnStartFirstScan() { if (isFirstScan) { + firstScanButton.Enabled = false; + var settings = CreateSearchSettings(); var comparer = CreateComparer(settings); searcher = new Searcher(process, settings); @@ -191,6 +206,7 @@ private async Task OnStartFirstScan() } scanProgressBar.Value = 0; + firstScanButton.Enabled = true; nextScanButton.Enabled = true; valueTypeComboBox.Enabled = false; @@ -199,6 +215,8 @@ private async Task OnStartFirstScan() scanOptionsGroupBox.Enabled = false; isFirstScan = false; + + SetValidCompareTypes(); } else { @@ -210,6 +228,9 @@ private async Task OnStartSecondScan() { if (!isFirstScan) { + firstScanButton.Enabled = false; + nextScanButton.Enabled = false; + var comparer = CreateComparer(searcher.Settings); var report = new Progress(i => scanProgressBar.Value = i); @@ -221,6 +242,8 @@ private async Task OnStartSecondScan() } scanProgressBar.Value = 0; + firstScanButton.Enabled = true; + nextScanButton.Enabled = true; } } @@ -318,5 +341,10 @@ private IMemoryComparer CreateComparer(SearchSettings settings) throw new Exception(); } + + private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) + { + searcher?.Dispose(); + } } } From 8b0f679d1f7a5fb9666b828820bfd5ff837d1d93 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 15:18:40 +0200 Subject: [PATCH 064/777] Fixed in memory store. --- MemorySearcher/SearchResultStore.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/SearchResultStore.cs index 00c673ac..9a6d4f4f 100644 --- a/MemorySearcher/SearchResultStore.cs +++ b/MemorySearcher/SearchResultStore.cs @@ -28,8 +28,9 @@ private enum StorageMode public int TotalResultCount { get; private set; } - public SearchResultStore(string storePath) + public SearchResultStore(SearchValueType valueType, string storePath) { + this.valueType = valueType; this.storePath = Path.Combine(storePath, $"ReClass.NET_MemorySearcher_{Guid.NewGuid()}.tmp"); } @@ -89,6 +90,10 @@ public void AddBlock(SearchResultBlock block) AppendBlockToFile(block); } + else + { + store.Add(block); + } } else { From 1905207347233d346448ff0e5d4934953f78d11b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 15:19:26 +0200 Subject: [PATCH 065/777] Added NextScan progress report. --- MemorySearcher/Searcher.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Searcher.cs index c3b2b0a9..b628a654 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Searcher.cs @@ -47,9 +47,9 @@ public IEnumerable GetResults() return store.GetResultBlocks().SelectMany(kv => kv.Results); } - private static SearchResultStore CreateStore() + private SearchResultStore CreateStore() { - return new SearchResultStore(Path.GetTempPath()); + return new SearchResultStore(Settings.ValueType, Path.GetTempPath()); } private IList
GetSearchableSections() @@ -116,18 +116,19 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr var sections = GetSearchableSections(); - var maxSectionSize = (int)sections.Average(s => s.Size.ToInt32()); + var initialBufferSize = (int)sections.Average(s => s.Size.ToInt32()); progress?.Report(0); var counter = 0; + var totalSectionCount = (float)sections.Count; return Task.Run(() => { var result = Parallel.ForEach( sections, new ParallelOptions { CancellationToken = ct}, - () => new SearchContext(settings, comparer, maxSectionSize), + () => new SearchContext(settings, comparer, initialBufferSize), (s, state, _, context) => { var size = s.Size.ToInt32(); @@ -149,7 +150,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr } } - progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); + progress?.Report((int)(Interlocked.Increment(ref counter) / totalSectionCount * 100)); return context; }, @@ -179,6 +180,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro progress?.Report(0); var counter = 0; + var totalResultCount = (float)store.TotalResultCount; return Task.Run(() => { @@ -206,7 +208,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro } } - //progress?.Report((int)(Interlocked.Increment(ref counter) / (float)sections.Count * 100)); + progress?.Report((int)(Interlocked.Add(ref counter, b.Results.Count) / totalResultCount * 100)); return context; }, From 2bf8581099cf724dedd382fbbc395ccadd82706b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Sep 2017 23:24:05 +0200 Subject: [PATCH 066/777] Removed Algorithm. --- MemorySearcher/Algorithm/IPatternMatcher.cs | 37 ------- .../Algorithm/SimplePatternMatcher.Naive.cs | 59 ---------- .../SimplePatternMatcher.RabinKarp.cs | 80 -------------- .../SimplePatternMatcher.Strategy.cs | 30 ------ .../Algorithm/SimplePatternMatcher.cs | 101 ------------------ .../WildcardPatternMatcher.PatternByte.cs | 80 -------------- .../Algorithm/WildcardPatternMatcher.cs | 68 ------------ 7 files changed, 455 deletions(-) delete mode 100644 MemorySearcher/Algorithm/IPatternMatcher.cs delete mode 100644 MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs delete mode 100644 MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs delete mode 100644 MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs delete mode 100644 MemorySearcher/Algorithm/SimplePatternMatcher.cs delete mode 100644 MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs delete mode 100644 MemorySearcher/Algorithm/WildcardPatternMatcher.cs diff --git a/MemorySearcher/Algorithm/IPatternMatcher.cs b/MemorySearcher/Algorithm/IPatternMatcher.cs deleted file mode 100644 index 9cdee4c4..00000000 --- a/MemorySearcher/Algorithm/IPatternMatcher.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - [ContractClass(typeof(PatternMatcherContract))] - public interface IPatternMatcher - { - IEnumerable SearchMatches(byte[] data); - - IEnumerable SearchMatches(byte[] data, int index, int count); - } - - [ContractClassFor(typeof(IPatternMatcher))] - internal abstract class PatternMatcherContract : IPatternMatcher - { - public IEnumerable SearchMatches(byte[] data) - { - Contract.Requires(data != null); - Contract.Ensures(Contract.Result>() != null); - - throw new NotImplementedException(); - } - - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - Contract.Requires(data != null); - Contract.Requires(index >= 0); - Contract.Requires(count >= 0); - Contract.Requires(data.Length - index >= count); - Contract.Ensures(Contract.Result>() != null); - - throw new NotImplementedException(); - } - } -} diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs deleted file mode 100644 index f801e82d..00000000 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Naive.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics.Contracts; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class SimplePatternMatcher - { - private class NaiveMatchStrategy : IMatchStrategy - { - private readonly byte[] pattern; - private readonly int stepSize; - - public NaiveMatchStrategy(byte[] pattern) - { - Contract.Requires(pattern != null); - - this.pattern = pattern; - } - - public NaiveMatchStrategy(byte[] pattern, int stepSize) - { - Contract.Requires(pattern != null); - - this.pattern = pattern; - this.stepSize = stepSize; - } - - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - var patternLength = pattern.Length; - if (count < patternLength) - { - yield break; - } - - var endIndex = index + count - patternLength + 1; - - for (var i = index; i < endIndex; i += stepSize) - { - var found = true; - for (var j = 0; j < patternLength; ++j) - { - if (data[i + j] != pattern[j]) - { - found = false; - - break; - } - } - - if (found) - { - yield return i - index; - } - } - } - } - } -} diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs deleted file mode 100644 index db854560..00000000 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.RabinKarp.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics.Contracts; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class SimplePatternMatcher - { - private class RabinKarpMatchStrategy : IMatchStrategy - { - private const uint PrimeBase = 37; - - private readonly byte[] pattern; - - private readonly uint power; - private readonly uint patternHash; - - public RabinKarpMatchStrategy(byte[] pattern) - { - Contract.Requires(pattern != null); - - this.pattern = pattern; - - power = 1; - for (var i = 0; i < pattern.Length; i++) - { - power *= PrimeBase; - } - - patternHash = CalculateHash(pattern, 0, pattern.Length); - } - - private static uint CalculateHash(IList data, int index, int count) - { - Contract.Requires(data != null); - Contract.Requires(index >= 0); - Contract.Requires(count >= 0); - Contract.Requires(data.Count - index >= count); - - uint hash = 0; - for (var i = index; i < index + count; ++i) - { - hash = hash * PrimeBase + data[i]; - } - return hash; - } - - private uint UpdateHash(uint hash, byte outByte, byte inByte) - { - unchecked - { - hash = PrimeBase * hash + inByte - power * outByte; - } - return hash; - } - - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - var patternLength = pattern.Length; - if (count < patternLength) - { - yield break; - } - - var dataHash = CalculateHash(data, index, patternLength); - - var endIndex = index + count - patternLength; - - for (var i = index; i < endIndex; ++i) - { - if (dataHash == patternHash) - { - yield return i - index; - } - - dataHash = UpdateHash(dataHash, data[i], data[i + patternLength]); - } - } - } - } -} diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs deleted file mode 100644 index 55eb0734..00000000 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.Strategy.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class SimplePatternMatcher - { - [ContractClass(typeof(MatchStrategyContract))] - private interface IMatchStrategy - { - IEnumerable SearchMatches(byte[] data, int index, int count); - } - - [ContractClassFor(typeof(IMatchStrategy))] - internal abstract class MatchStrategyContract : IMatchStrategy - { - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - Contract.Requires(data != null); - Contract.Requires(index >= 0); - Contract.Requires(count >= 0); - Contract.Requires(data.Length - index >= count); - Contract.Ensures(Contract.Result>() != null); - - throw new NotImplementedException(); - } - } - } -} diff --git a/MemorySearcher/Algorithm/SimplePatternMatcher.cs b/MemorySearcher/Algorithm/SimplePatternMatcher.cs deleted file mode 100644 index 40054f21..00000000 --- a/MemorySearcher/Algorithm/SimplePatternMatcher.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class SimplePatternMatcher : IPatternMatcher - { - private readonly IMatchStrategy strategy; - - #region Construction - - public SimplePatternMatcher(byte[] pattern) - { - Contract.Requires(pattern != null); - - strategy = ChooseStrategy(pattern); - } - - public SimplePatternMatcher(byte value) - : this(new[] { value }) - { - - } - - public SimplePatternMatcher(short value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(ushort value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(int value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(uint value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(long value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(ulong value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(float value) - : this(BitConverter.GetBytes(value)) - { - - } - - public SimplePatternMatcher(double value) - : this(BitConverter.GetBytes(value)) - { - - } - - #endregion - - private static SimplePatternMatcher.IMatchStrategy ChooseStrategy(byte[] pattern) - { - Contract.Requires(pattern != null); - Contract.Ensures(Contract.Result() != null); - - if (pattern.Length <= 5) - { - return new SimplePatternMatcher.NaiveMatchStrategy(pattern); - } - else - { - return new SimplePatternMatcher.RabinKarpMatchStrategy(pattern); - } - } - - public IEnumerable SearchMatches(byte[] data) - { - return SearchMatches(data, 0, data.Length); - } - - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - return strategy.SearchMatches(data, index, count); - } - } -} diff --git a/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs deleted file mode 100644 index 57112564..00000000 --- a/MemorySearcher/Algorithm/WildcardPatternMatcher.PatternByte.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Diagnostics.Contracts; -using System.IO; -using ReClassNET.Util; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class WildcardPatternMatcher - { - private struct PatternByte - { - private struct Nibble - { - public int Value; - public bool IsWildcard; - } - - private Nibble nibble1; - private Nibble nibble2; - - private static bool IsHexValue(char c) - { - return '0' <= c && c <= '9' - || 'A' <= c && c <= 'F' - || 'a' <= c && c <= 'f'; - } - - private static int HexToInt(char c) - { - if ('0' <= c && c <= '9') return c - '0'; - if ('A' <= c && c <= 'F') return c - 'A' + 10; - return c - 'a' + 10; - } - - public bool TryRead(StringReader sr) - { - Contract.Requires(sr != null); - - var temp = sr.ReadSkipWhitespaces(); - if (temp == -1 || (!IsHexValue((char)temp) && (char)temp != '?')) - { - return false; - } - - nibble1.Value = HexToInt((char)temp) & 0xF; - nibble1.IsWildcard = (char)temp == '?'; - - temp = sr.Read(); - if (temp == -1 || char.IsWhiteSpace((char)temp) || (char)temp == '?') - { - nibble2.IsWildcard = true; - - return true; - } - - if (!IsHexValue((char)temp)) - { - return false; - } - nibble2.Value = HexToInt((char)temp) & 0xF; - nibble2.IsWildcard = false; - - return true; - } - - public bool Equals(byte b) - { - var matched = 0; - if (nibble1.IsWildcard || ((b >> 4) & 0xF) == nibble1.Value) - { - ++matched; - } - if (nibble2.IsWildcard || (b & 0xF) == nibble2.Value) - { - ++matched; - } - return matched == 2; - } - } - } -} diff --git a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs b/MemorySearcher/Algorithm/WildcardPatternMatcher.cs deleted file mode 100644 index a88434f4..00000000 --- a/MemorySearcher/Algorithm/WildcardPatternMatcher.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; -using System.IO; - -namespace ReClassNET.MemorySearcher.Algorithm -{ - public partial class WildcardPatternMatcher : IPatternMatcher - { - private readonly List pattern; - - public WildcardPatternMatcher(string value) - { - Contract.Requires(value != null); - - pattern = new List(); - - using (var sr = new StringReader(value)) - { - var pb = new PatternByte(); - while (pb.TryRead(sr)) - { - pattern.Add(pb); - } - - // Check if we are not at the end of the stream - if (sr.Peek() != -1) - { - throw new ArgumentException(); - } - } - } - - public IEnumerable SearchMatches(byte[] data) - { - return SearchMatches(data, 0, data.Length); - } - - public IEnumerable SearchMatches(byte[] data, int index, int count) - { - if (count < pattern.Count) - { - yield break; - } - - var endIndex = index + count - pattern.Count + 1; - - for (var i = index; i < endIndex; ++i) - { - var found = true; - for (var j = 0; j < pattern.Count; ++j) - { - if (!pattern[j].Equals(data[i + j])) - { - found = false; - - break; - } - } - - if (found) - { - yield return i - index; - } - } - } - } -} From 04dafd05122c9faecc9b32f87fe2b4114e592ad5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 13 Sep 2017 22:32:58 +0200 Subject: [PATCH 067/777] Added MemorySearchResultControl. --- Forms/MemorySearchForm.Designer.cs | 77 +++------ Forms/MemorySearchForm.cs | 55 ++----- Forms/MemorySearchForm.resx | 10 +- Program.cs | 10 ++ ReClass.NET.csproj | 10 ++ UI/MemorySearchResultControl.Designer.cs | 116 ++++++++++++++ UI/MemorySearchResultControl.cs | 190 +++++++++++++++++++++++ UI/MemorySearchResultControl.resx | 132 ++++++++++++++++ UI/MemoryViewControl.cs | 7 +- Util/Extension.DataGridView.cs | 19 +++ 10 files changed, 511 insertions(+), 115 deletions(-) create mode 100644 UI/MemorySearchResultControl.Designer.cs create mode 100644 UI/MemorySearchResultControl.cs create mode 100644 UI/MemorySearchResultControl.resx create mode 100644 Util/Extension.DataGridView.cs diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index a94049ee..7f8fe4e9 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -28,6 +28,7 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.bannerBox = new ReClassNET.UI.BannerBox(); this.filterGroupBox = new System.Windows.Forms.GroupBox(); this.valueTypeComboBox = new System.Windows.Forms.ComboBox(); @@ -59,18 +60,15 @@ private void InitializeComponent() this.firstScanButton = new System.Windows.Forms.Button(); this.nextScanButton = new System.Windows.Forms.Button(); this.scanProgressBar = new System.Windows.Forms.ProgressBar(); - this.resultDataGridView = new System.Windows.Forms.DataGridView(); - this.resultAddressColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.resultValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.resultPreviousValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.resultCountLabel = new System.Windows.Forms.Label(); + this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); + this.memorySearchResultControl1 = new ReClassNET.UI.MemorySearchResultControl(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); this.floatingOptionsGroupBox.SuspendLayout(); this.stringOptionsGroupBox.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).BeginInit(); this.SuspendLayout(); // // bannerBox @@ -418,52 +416,6 @@ private void InitializeComponent() this.scanProgressBar.Size = new System.Drawing.Size(149, 23); this.scanProgressBar.TabIndex = 13; // - // resultDataGridView - // - this.resultDataGridView.AllowUserToAddRows = false; - this.resultDataGridView.AllowUserToDeleteRows = false; - this.resultDataGridView.AllowUserToResizeRows = false; - this.resultDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.resultAddressColumn, - this.resultValueColumn, - this.resultPreviousValueColumn}); - this.resultDataGridView.Location = new System.Drawing.Point(11, 70); - this.resultDataGridView.Name = "resultDataGridView"; - this.resultDataGridView.ReadOnly = true; - this.resultDataGridView.RowHeadersVisible = false; - this.resultDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.resultDataGridView.Size = new System.Drawing.Size(267, 302); - this.resultDataGridView.TabIndex = 14; - // - // resultAddressColumn - // - this.resultAddressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.resultAddressColumn.DataPropertyName = "address"; - this.resultAddressColumn.HeaderText = "Address"; - this.resultAddressColumn.Name = "resultAddressColumn"; - this.resultAddressColumn.ReadOnly = true; - // - // resultValueColumn - // - this.resultValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.resultValueColumn.DataPropertyName = "value"; - this.resultValueColumn.HeaderText = "Value"; - this.resultValueColumn.Name = "resultValueColumn"; - this.resultValueColumn.ReadOnly = true; - this.resultValueColumn.Width = 59; - // - // resultPreviousValueColumn - // - this.resultPreviousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.resultPreviousValueColumn.DataPropertyName = "previous"; - this.resultPreviousValueColumn.HeaderText = "Previous"; - this.resultPreviousValueColumn.Name = "resultPreviousValueColumn"; - this.resultPreviousValueColumn.ReadOnly = true; - this.resultPreviousValueColumn.Width = 73; - // // resultCountLabel // this.resultCountLabel.AutoSize = true; @@ -473,13 +425,27 @@ private void InitializeComponent() this.resultCountLabel.TabIndex = 15; this.resultCountLabel.Text = "<>"; // + // updateValuesTimer + // + this.updateValuesTimer.Enabled = true; + this.updateValuesTimer.Tick += new System.EventHandler(this.updateValuesTimer_Tick); + // + // memorySearchResultControl1 + // + this.memorySearchResultControl1.Location = new System.Drawing.Point(11, 70); + this.memorySearchResultControl1.Name = "memorySearchResultControl1"; + this.memorySearchResultControl1.ShowDescriptionColumn = false; + this.memorySearchResultControl1.ShowValuesHexadecimal = false; + this.memorySearchResultControl1.Size = new System.Drawing.Size(267, 302); + this.memorySearchResultControl1.TabIndex = 16; + // // MemorySearchForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(611, 590); + this.Controls.Add(this.memorySearchResultControl1); this.Controls.Add(this.resultCountLabel); - this.Controls.Add(this.resultDataGridView); this.Controls.Add(this.scanProgressBar); this.Controls.Add(this.nextScanButton); this.Controls.Add(this.firstScanButton); @@ -498,7 +464,6 @@ private void InitializeComponent() this.floatingOptionsGroupBox.PerformLayout(); this.stringOptionsGroupBox.ResumeLayout(false); this.stringOptionsGroupBox.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -537,10 +502,8 @@ private void InitializeComponent() private System.Windows.Forms.Button firstScanButton; private System.Windows.Forms.Button nextScanButton; private System.Windows.Forms.ProgressBar scanProgressBar; - private System.Windows.Forms.DataGridView resultDataGridView; private System.Windows.Forms.Label resultCountLabel; - private System.Windows.Forms.DataGridViewTextBoxColumn resultAddressColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn resultValueColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn resultPreviousValueColumn; + private System.Windows.Forms.Timer updateValuesTimer; + private UI.MemorySearchResultControl memorySearchResultControl1; } } \ No newline at end of file diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 283848c9..eaac4750 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -39,8 +39,6 @@ public MemorySearchForm(RemoteProcess process) InitializeComponent(); - resultDataGridView.AutoGenerateColumns = false; - startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); endAddressTextBox.Text = #if RECLASSNET64 @@ -66,47 +64,11 @@ private void ShowResults() SetResultCount(searcher.TotalResultCount); - var dt = new DataTable(); - var addressColumn = dt.Columns.Add("address", typeof(string)); - var valueColumn = dt.Columns.Add("value", typeof(string)); - var previousColumn = dt.Columns.Add("previous", typeof(string)); - var dataColumn = dt.Columns.Add("data", typeof(SearchResult)); - - foreach (var result in searcher.GetResults().Take(MaxVisibleResults).OrderBy(r => r.Address, IntPtrComparer.Instance)) - { - var row = dt.NewRow(); - row[addressColumn] = result.Address.ToString(Constants.StringHexFormat); - row[valueColumn] = row[previousColumn] = FormatResultValue(result, false); - row[dataColumn] = result; - dt.Rows.Add(row); - } - - resultDataGridView.DataSource = dt; - } - - private static string FormatResultValue(SearchResult result, bool showAsHex) - { - switch (result) - { - case ByteSearchResult sr: - return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); - case ShortSearchResult sr: - return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); - case IntegerSearchResult sr: - return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); - case LongSearchResult sr: - return showAsHex ? sr.Value.ToString("X") : sr.Value.ToString(); - case FloatSearchResult sr: - return sr.Value.ToString(CultureInfo.InvariantCulture); - case DoubleSearchResult sr: - return sr.Value.ToString(CultureInfo.InvariantCulture); - case ArrayOfBytesSearchResult sr: - return "[...]"; - case StringSearchResult sr: - return "[...]"; - default: - throw new InvalidOperationException(); - } + memorySearchResultControl1.SetSearchResults( + searcher.GetResults() + .Take(MaxVisibleResults) + .OrderBy(r => r.Address, IntPtrComparer.Instance) + ); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -163,7 +125,7 @@ private void Reset() searcher = null; SetResultCount(0); - resultDataGridView.DataSource = null; + memorySearchResultControl1.SetSearchResults(null); nextScanButton.Enabled = false; valueTypeComboBox.Enabled = true; @@ -346,5 +308,10 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) { searcher?.Dispose(); } + + private void updateValuesTimer_Tick(object sender, EventArgs e) + { + memorySearchResultControl1.UpdateValues(process); + } } } diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx index 13352fd0..68ca2f4b 100644 --- a/Forms/MemorySearchForm.resx +++ b/Forms/MemorySearchForm.resx @@ -117,13 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - True - - - True + + 17, 17 \ No newline at end of file diff --git a/Program.cs b/Program.cs index 0c6571f7..cc0d326b 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Globalization; using System.Windows.Forms; using Microsoft.SqlServer.MessageBox; @@ -22,6 +23,8 @@ static class Program public static bool DesignMode { get; private set; } = true; + public static FontEx MonoSpaceFont { get; private set; } + [STAThread] static void Main() { @@ -36,6 +39,13 @@ static void Main() } + MonoSpaceFont = new FontEx + { + Font = new Font("Courier New", DpiUtil.ScaleIntX(13), GraphicsUnit.Pixel), + Width = DpiUtil.ScaleIntX(8), + Height = DpiUtil.ScaleIntY(16) + }; + NativeMethods.EnableDebugPrivileges(); Application.EnableVisualStyles(); diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 9b73cd7c..1acffe3f 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -280,11 +280,18 @@ Component + + UserControl + + + MemorySearchResultControl.cs + MemoryViewControl.cs + @@ -452,6 +459,9 @@ DualValueControl.cs + + MemorySearchResultControl.cs + MemoryViewControl.cs diff --git a/UI/MemorySearchResultControl.Designer.cs b/UI/MemorySearchResultControl.Designer.cs new file mode 100644 index 00000000..26a8dc24 --- /dev/null +++ b/UI/MemorySearchResultControl.Designer.cs @@ -0,0 +1,116 @@ +namespace ReClassNET.UI +{ + partial class MemorySearchResultControl + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.resultDataGridView = new System.Windows.Forms.DataGridView(); + this.descriptionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultAddressColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.resultPreviousValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).BeginInit(); + this.SuspendLayout(); + // + // resultDataGridView + // + this.resultDataGridView.AllowUserToAddRows = false; + this.resultDataGridView.AllowUserToDeleteRows = false; + this.resultDataGridView.AllowUserToResizeRows = false; + this.resultDataGridView.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical; + this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.descriptionColumn, + this.resultAddressColumn, + this.resultValueColumn, + this.resultPreviousValueColumn}); + this.resultDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; + this.resultDataGridView.Location = new System.Drawing.Point(0, 0); + this.resultDataGridView.MultiSelect = false; + this.resultDataGridView.Name = "resultDataGridView"; + this.resultDataGridView.ReadOnly = true; + this.resultDataGridView.RowHeadersVisible = false; + this.resultDataGridView.RowTemplate.Height = 19; + this.resultDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.resultDataGridView.Size = new System.Drawing.Size(290, 327); + this.resultDataGridView.TabIndex = 15; + // + // descriptionColumn + // + this.descriptionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.descriptionColumn.DataPropertyName = "Description"; + this.descriptionColumn.HeaderText = "Description"; + this.descriptionColumn.Name = "descriptionColumn"; + this.descriptionColumn.ReadOnly = true; + // + // resultAddressColumn + // + this.resultAddressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.resultAddressColumn.DataPropertyName = "Address"; + this.resultAddressColumn.HeaderText = "Address"; + this.resultAddressColumn.Name = "resultAddressColumn"; + this.resultAddressColumn.ReadOnly = true; + // + // resultValueColumn + // + this.resultValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultValueColumn.DataPropertyName = "Value"; + this.resultValueColumn.HeaderText = "Value"; + this.resultValueColumn.Name = "resultValueColumn"; + this.resultValueColumn.ReadOnly = true; + this.resultValueColumn.Width = 59; + // + // resultPreviousValueColumn + // + this.resultPreviousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.resultPreviousValueColumn.DataPropertyName = "Previous"; + this.resultPreviousValueColumn.HeaderText = "Previous"; + this.resultPreviousValueColumn.Name = "resultPreviousValueColumn"; + this.resultPreviousValueColumn.ReadOnly = true; + this.resultPreviousValueColumn.Width = 73; + // + // MemorySearchResultControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.resultDataGridView); + this.Name = "MemorySearchResultControl"; + this.Size = new System.Drawing.Size(290, 327); + ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView resultDataGridView; + private System.Windows.Forms.DataGridViewTextBoxColumn descriptionColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn resultAddressColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn resultValueColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn resultPreviousValueColumn; + } +} diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs new file mode 100644 index 00000000..83f67a97 --- /dev/null +++ b/UI/MemorySearchResultControl.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; +using ReClassNET.Memory; +using ReClassNET.MemorySearcher; +using ReClassNET.Util; + +namespace ReClassNET.UI +{ + public partial class MemorySearchResultControl : UserControl + { + private class ResultData// : INotifyPropertyChanged + { + public string Description { get; set; } = string.Empty; + public string Address => Result.Address.ToString(Constants.StringHexFormat); + public string ValueType => Result.ValueType.ToString(); + public string Value { get; private set; } + public string Previous { get; } + + public bool ShowValueHexadecimal { get; set; } + + public SearchResult Result { get; } + + public event PropertyChangedEventHandler PropertyChanged; + + public ResultData(SearchResult result) + { + Contract.Requires(result != null); + + Result = result; + Previous = Value = FormatValue(); + } + + private void NotifyPropertyChanged(string propertyName = null) + { + if (propertyName != null) + { + var propertyChanged = PropertyChanged; + propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + + public void UpdateValue(RemoteProcess process) + { + Contract.Requires(process != null); + + var address = Result.Address; + + switch (Result.ValueType) + { + case SearchValueType.Byte: + Value = FormatValue(process.ReadRemoteMemory(address, 1)[0], ShowValueHexadecimal); + break; + case SearchValueType.Short: + Value = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(address, 2), 0), ShowValueHexadecimal); + break; + case SearchValueType.Integer: + Value = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(address, 4), 0), ShowValueHexadecimal); + break; + case SearchValueType.Long: + Value = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(address, 8), 0), ShowValueHexadecimal); + break; + case SearchValueType.Float: + Value = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(address, 4), 0)); + break; + case SearchValueType.Double: + Value = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(address, 8), 0)); + break; + case SearchValueType.ArrayOfBytes: + case SearchValueType.String: + return; + } + + NotifyPropertyChanged(nameof(Value)); + } + + private string FormatValue() + { + Contract.Requires(Result != null); + + switch (Result.ValueType) + { + case SearchValueType.Byte: + return FormatValue(((ByteSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Short: + return FormatValue(((ShortSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Integer: + return FormatValue(((IntegerSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Long: + return FormatValue(((LongSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Float: + return FormatValue(((FloatSearchResult)Result).Value); + case SearchValueType.Double: + return FormatValue(((DoubleSearchResult)Result).Value); + case SearchValueType.ArrayOfBytes: + return FormatValue((byte[])null); + case SearchValueType.String: + return FormatValue(((StringSearchResult)Result).Value); + default: + throw new InvalidOperationException(); + } + } + + private static string FormatValue(byte value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(byte[] value) => "[...]"; + private static string FormatValue(string value) => $"\"{value}\""; + } + + public bool ShowDescriptionColumn + { + get => descriptionColumn.Visible; + set => descriptionColumn.Visible = value; + } + + public bool ShowValuesHexadecimal { get; set; } + + private readonly BindingList bindings; + + public MemorySearchResultControl() + { + InitializeComponent(); + + bindings = new BindingList + { + AllowNew = true, + AllowEdit = true, + RaiseListChangedEvents = true + }; + + if (!Program.DesignMode) + { + resultDataGridView.DefaultCellStyle.Font = Program.MonoSpaceFont.Font; + } + + resultDataGridView.AutoGenerateColumns = false; + resultDataGridView.DataSource = bindings; + } + + public void SetSearchResults(IEnumerable results) + { + Contract.Requires(results != null); + + bindings.Clear(); + + if (results == null) + { + return; + } + + bindings.RaiseListChangedEvents = false; + + foreach (var result in results.Select(r => new ResultData(r))) + { + bindings.Add(result); + } + + bindings.RaiseListChangedEvents = true; + bindings.ResetBindings(); + } + + public void UpdateValues(RemoteProcess process) + { + Contract.Requires(process != null); + + //bindings.RaiseListChangedEvents = false; + + foreach (var row in resultDataGridView.GetVisibleRows()) + { + if (row.DataBoundItem is ResultData result) + { + result.UpdateValue(process); + + bindings.ResetItem(row.Index); + } + } + + //bindings.RaiseListChangedEvents = true; + } + } +} diff --git a/UI/MemorySearchResultControl.resx b/UI/MemorySearchResultControl.resx new file mode 100644 index 00000000..9262d940 --- /dev/null +++ b/UI/MemorySearchResultControl.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 8c9094c1..679ddbd4 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -80,12 +80,7 @@ public MemoryViewControl() { InitializeComponent(); - font = new FontEx - { - Font = new Font("Courier New", DpiUtil.ScaleIntX(13), GraphicsUnit.Pixel), - Width = DpiUtil.ScaleIntX(8), - Height = DpiUtil.ScaleIntY(16) - }; + font = Program.MonoSpaceFont; editBox.Font = font; diff --git a/Util/Extension.DataGridView.cs b/Util/Extension.DataGridView.cs new file mode 100644 index 00000000..da5375c4 --- /dev/null +++ b/Util/Extension.DataGridView.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ReClassNET.Util +{ + public static class DataGridViewExtension + { + public static IEnumerable GetVisibleRows(this DataGridView dgv) + { + var visibleRowsCount = dgv.DisplayedRowCount(true); + var firstVisibleRowIndex = dgv.FirstDisplayedCell?.RowIndex ?? 0; + var lastVisibleRowIndex = firstVisibleRowIndex + visibleRowsCount - 1; + for (var i = firstVisibleRowIndex; i <= lastVisibleRowIndex; i++) + { + yield return dgv.Rows[i]; + } + } + } +} From 8e93bb641bdd5c781daba6b653ba8ee8382e71b7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 13 Sep 2017 22:33:54 +0200 Subject: [PATCH 068/777] Added ValueType and StringSearchResult Value. --- .../Comparer/StringMemoryComparer.cs | 2 +- MemorySearcher/SearchResult.cs | 23 ++++++++++++++++++- MemorySearcher/SearchResultStore.cs | 4 ++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index ca55ac49..e5d2455c 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -30,7 +30,7 @@ public bool Compare(byte[] data, int index, out SearchResult result) return false; } - result = new StringSearchResult(); + result = new StringSearchResult(value); return true; } diff --git a/MemorySearcher/SearchResult.cs b/MemorySearcher/SearchResult.cs index 8fe6c475..083d85ef 100644 --- a/MemorySearcher/SearchResult.cs +++ b/MemorySearcher/SearchResult.cs @@ -4,11 +4,15 @@ namespace ReClassNET.MemorySearcher { public abstract class SearchResult { + public abstract SearchValueType ValueType { get; } + public IntPtr Address { get; set; } } public class ByteSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Byte; + public byte Value { get; } public ByteSearchResult(byte value) @@ -19,6 +23,8 @@ public ByteSearchResult(byte value) public class ShortSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Short; + public short Value { get; } public ShortSearchResult(short value) @@ -29,6 +35,8 @@ public ShortSearchResult(short value) public class IntegerSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Integer; + public int Value { get; } public IntegerSearchResult(int value) @@ -39,6 +47,8 @@ public IntegerSearchResult(int value) public class LongSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Long; + public long Value { get; } public LongSearchResult(long value) @@ -49,6 +59,8 @@ public LongSearchResult(long value) public class FloatSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Float; + public float Value { get; } public FloatSearchResult(float value) @@ -59,6 +71,8 @@ public FloatSearchResult(float value) public class DoubleSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.Double; + public double Value { get; } public DoubleSearchResult(double value) @@ -69,11 +83,18 @@ public DoubleSearchResult(double value) public class ArrayOfBytesSearchResult : SearchResult { - + public override SearchValueType ValueType => SearchValueType.ArrayOfBytes; } public class StringSearchResult : SearchResult { + public override SearchValueType ValueType => SearchValueType.String; + + public string Value { get; } + public StringSearchResult(string value) + { + Value = value; + } } } diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/SearchResultStore.cs index 9a6d4f4f..e274132a 100644 --- a/MemorySearcher/SearchResultStore.cs +++ b/MemorySearcher/SearchResultStore.cs @@ -175,7 +175,7 @@ private SearchResult ReadSearchResult(BinaryReader br) result = new ArrayOfBytesSearchResult(); break; case SearchValueType.String: - result = new StringSearchResult(); + result = new StringSearchResult(br.ReadString()); break; default: throw new ArgumentOutOfRangeException(); @@ -214,7 +214,7 @@ private static void WriteSearchResult(BinaryWriter bw, SearchResult result) break; case StringSearchResult stringSearchResult: - + bw.Write(stringSearchResult.Value); break; default: throw new ArgumentOutOfRangeException(nameof(result)); From f06b733ecada1157e2f9d84bf4c5407b152b1f7b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Sep 2017 16:42:44 +0200 Subject: [PATCH 069/777] Added floating point compare with the number of significant digits. --- Forms/MemorySearchForm.Designer.cs | 44 +++-- Forms/MemorySearchForm.cs | 153 ++++++++++++------ .../Comparer/DoubleMemoryComparer.cs | 23 ++- .../Comparer/FloatMemoryComparer.cs | 21 ++- 4 files changed, 174 insertions(+), 67 deletions(-) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index 7f8fe4e9..b3f5e6c7 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -62,7 +62,8 @@ private void InitializeComponent() this.scanProgressBar = new System.Windows.Forms.ProgressBar(); this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); - this.memorySearchResultControl1 = new ReClassNET.UI.MemorySearchResultControl(); + this.memorySearchResultControl = new ReClassNET.UI.MemorySearchResultControl(); + this.memorySearchResultControl2 = new ReClassNET.UI.MemorySearchResultControl(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -430,21 +431,41 @@ private void InitializeComponent() this.updateValuesTimer.Enabled = true; this.updateValuesTimer.Tick += new System.EventHandler(this.updateValuesTimer_Tick); // - // memorySearchResultControl1 - // - this.memorySearchResultControl1.Location = new System.Drawing.Point(11, 70); - this.memorySearchResultControl1.Name = "memorySearchResultControl1"; - this.memorySearchResultControl1.ShowDescriptionColumn = false; - this.memorySearchResultControl1.ShowValuesHexadecimal = false; - this.memorySearchResultControl1.Size = new System.Drawing.Size(267, 302); - this.memorySearchResultControl1.TabIndex = 16; + // memorySearchResultControl + // + this.memorySearchResultControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.memorySearchResultControl.Location = new System.Drawing.Point(11, 70); + this.memorySearchResultControl.Name = "memorySearchResultControl"; + this.memorySearchResultControl.ShowAddressColumn = true; + this.memorySearchResultControl.ShowDescriptionColumn = false; + this.memorySearchResultControl.ShowPreviousValueColumn = true; + this.memorySearchResultControl.ShowValueColumn = true; + this.memorySearchResultControl.ShowValuesHexadecimal = false; + this.memorySearchResultControl.ShowValueTypeColumn = false; + this.memorySearchResultControl.Size = new System.Drawing.Size(267, 302); + this.memorySearchResultControl.TabIndex = 16; + // + // memorySearchResultControl2 + // + this.memorySearchResultControl2.Location = new System.Drawing.Point(12, 387); + this.memorySearchResultControl2.Name = "memorySearchResultControl2"; + this.memorySearchResultControl2.ShowAddressColumn = true; + this.memorySearchResultControl2.ShowDescriptionColumn = true; + this.memorySearchResultControl2.ShowPreviousValueColumn = false; + this.memorySearchResultControl2.ShowValueColumn = true; + this.memorySearchResultControl2.ShowValuesHexadecimal = false; + this.memorySearchResultControl2.ShowValueTypeColumn = true; + this.memorySearchResultControl2.Size = new System.Drawing.Size(590, 191); + this.memorySearchResultControl2.TabIndex = 17; // // MemorySearchForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(611, 590); - this.Controls.Add(this.memorySearchResultControl1); + this.Controls.Add(this.memorySearchResultControl2); + this.Controls.Add(this.memorySearchResultControl); this.Controls.Add(this.resultCountLabel); this.Controls.Add(this.scanProgressBar); this.Controls.Add(this.nextScanButton); @@ -504,6 +525,7 @@ private void InitializeComponent() private System.Windows.Forms.ProgressBar scanProgressBar; private System.Windows.Forms.Label resultCountLabel; private System.Windows.Forms.Timer updateValuesTimer; - private UI.MemorySearchResultControl memorySearchResultControl1; + private UI.MemorySearchResultControl memorySearchResultControl; + private UI.MemorySearchResultControl memorySearchResultControl2; } } \ No newline at end of file diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index eaac4750..4decd937 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -53,6 +53,50 @@ public MemorySearchForm(RemoteProcess process) Reset(); } + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + + #region Event Handler + + private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) + { + searcher?.Dispose(); + } + + private void updateValuesTimer_Tick(object sender, EventArgs e) + { + memorySearchResultControl.UpdateValues(process); + memorySearchResultControl2.UpdateValues(process); + } + + private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) + { + OnValueTypeChanged(); + } + + private async void firstScanButton_Click(object sender, EventArgs e) + { + await OnStartFirstScan(); + } + + private async void nextScanButton_Click(object sender, EventArgs e) + { + await OnStartSecondScan(); + } + + #endregion + private void SetResultCount(int count) { resultCountLabel.Text = count > MaxVisibleResults ? $"Found: {count} (only {MaxVisibleResults} shown)" : $"Found: {count}"; @@ -64,18 +108,13 @@ private void ShowResults() SetResultCount(searcher.TotalResultCount); - memorySearchResultControl1.SetSearchResults( + memorySearchResultControl.SetSearchResults( searcher.GetResults() .Take(MaxVisibleResults) .OrderBy(r => r.Address, IntPtrComparer.Instance) ); } - private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) - { - OnValueTypeChanged(); - } - private void OnValueTypeChanged() { SetValidCompareTypes(); @@ -125,7 +164,7 @@ private void Reset() searcher = null; SetResultCount(0); - memorySearchResultControl1.SetSearchResults(null); + memorySearchResultControl.SetSearchResults(null); nextScanButton.Enabled = false; valueTypeComboBox.Enabled = true; @@ -139,16 +178,6 @@ private void Reset() SetValidCompareTypes(); } - private async void firstScanButton_Click(object sender, EventArgs e) - { - await OnStartFirstScan(); - } - - private async void nextScanButton_Click(object sender, EventArgs e) - { - await OnStartSecondScan(); - } - private async Task OnStartFirstScan() { if (isFirstScan) @@ -165,25 +194,26 @@ private async Task OnStartFirstScan() if (completed) { ShowResults(); - } - scanProgressBar.Value = 0; - firstScanButton.Enabled = true; - nextScanButton.Enabled = true; - valueTypeComboBox.Enabled = false; + firstScanButton.Enabled = true; + nextScanButton.Enabled = true; + valueTypeComboBox.Enabled = false; - floatingOptionsGroupBox.Enabled = false; - stringOptionsGroupBox.Enabled = false; - scanOptionsGroupBox.Enabled = false; + floatingOptionsGroupBox.Enabled = false; + stringOptionsGroupBox.Enabled = false; + scanOptionsGroupBox.Enabled = false; - isFirstScan = false; + isFirstScan = false; - SetValidCompareTypes(); - } - else - { - Reset(); + SetValidCompareTypes(); + } + + scanProgressBar.Value = 0; + + return; } + + Reset(); } private async Task OnStartSecondScan() @@ -275,17 +305,60 @@ private IMemoryComparer CreateComparer(SearchSettings settings) } else if (settings.ValueType == SearchValueType.Float || settings.ValueType == SearchValueType.Double) { - double.TryParse(valueDualValueControl.Value1, out var value1); - double.TryParse(valueDualValueControl.Value2, out var value2); + NumberFormatInfo GuessNumberFormat(string input) + { + Contract.Requires(input != null); + Contract.Ensures(Contract.Result() != null); + + if (input.Contains(",") && !input.Contains(".")) + { + return new NumberFormatInfo + { + NumberDecimalSeparator = ",", + NumberGroupSeparator = "." + }; + } + return new NumberFormatInfo + { + NumberDecimalSeparator = ".", + NumberGroupSeparator = "," + }; + } + + int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) + { + Contract.Requires(input != null); + Contract.Requires(numberFormat != null); + + var digits = 0; + + var decimalIndex = input.IndexOf(numberFormat.NumberDecimalSeparator, StringComparison.Ordinal); + if (decimalIndex != -1) + { + digits = input.Length - 1 - decimalIndex; + } + + return digits; + } + + var nf1 = GuessNumberFormat(valueDualValueControl.Value1); + double.TryParse(valueDualValueControl.Value1, NumberStyles.Float, nf1, out var value1); + var nf2 = GuessNumberFormat(valueDualValueControl.Value2); + double.TryParse(valueDualValueControl.Value2, NumberStyles.Float, nf2, out var value2); + + var significantDigits = Math.Max( + CalculateSignificantDigits(valueDualValueControl.Value1, nf1), + CalculateSignificantDigits(valueDualValueControl.Value2, nf2) + ); var roundMode = roundStrictRadioButton.Checked ? SearchRoundMode.Strict : roundLooseRadioButton.Checked ? SearchRoundMode.Normal : SearchRoundMode.Truncate; switch (settings.ValueType) { case SearchValueType.Float: - return new FloatMemoryComparer(compareType, roundMode, (float)value1, (float)value2); + return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2); case SearchValueType.Double: - return new DoubleMemoryComparer(compareType, roundMode, value1, value2); + return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2); } } else if (settings.ValueType == SearchValueType.ArrayOfBytes) @@ -303,15 +376,5 @@ private IMemoryComparer CreateComparer(SearchSettings settings) throw new Exception(); } - - private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) - { - searcher?.Dispose(); - } - - private void updateValuesTimer_Tick(object sender, EventArgs e) - { - memorySearchResultControl1.UpdateValues(process); - } } } diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs index b39ca599..cf55ea7c 100644 --- a/MemorySearcher/Comparer/DoubleMemoryComparer.cs +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher.Comparer { @@ -11,12 +12,22 @@ public class DoubleMemoryComparer : IMemoryComparer public double Value2 { get; } public int ValueSize => sizeof(double); - public DoubleMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, double value1, double value2) + private readonly int significantDigits; + private readonly double minValue; + private readonly double maxValue; + + public DoubleMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, int significantDigits, double value1, double value2) { CompareType = compareType; RoundType = roundType; - Value1 = value1; - Value2 = value2; + this.significantDigits = significantDigits; + Value1 = Math.Round(value1, significantDigits, MidpointRounding.AwayFromZero); + Value2 = Math.Round(value2, significantDigits, MidpointRounding.AwayFromZero); + + var factor = (int)Math.Pow(10.0, significantDigits); + + minValue = value1 - 1.0 / factor; + maxValue = value1 + 1.0 / factor; } private bool CheckRoundedEquality(double value) @@ -24,11 +35,11 @@ private bool CheckRoundedEquality(double value) switch (RoundType) { case SearchRoundMode.Strict: - return Math.Abs(value - Value1) < 0.05f; + return Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); case SearchRoundMode.Normal: - return Math.Abs(value - Value1) < 0.5f; + return minValue < value && value < maxValue; case SearchRoundMode.Truncate: - return (int)value == (int)Value1; + return (long)value == (long)Value1; default: throw new ArgumentOutOfRangeException(); } diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs index 4ae93bc4..2682a31c 100644 --- a/MemorySearcher/Comparer/FloatMemoryComparer.cs +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher.Comparer { @@ -11,12 +12,22 @@ public class FloatMemoryComparer : IMemoryComparer public float Value2 { get; } public int ValueSize => sizeof(float); - public FloatMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, float value1, float value2) + private readonly int significantDigits; + private readonly float minValue; + private readonly float maxValue; + + public FloatMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, int significantDigits, float value1, float value2) { CompareType = compareType; RoundType = roundType; - Value1 = value1; - Value2 = value2; + this.significantDigits = significantDigits; + Value1 = (float)Math.Round(value1, significantDigits, MidpointRounding.AwayFromZero); + Value2 = (float)Math.Round(value2, significantDigits, MidpointRounding.AwayFromZero); + + var factor = (int)Math.Pow(10.0, significantDigits); + + minValue = value1 - 1.0f / factor; + maxValue = value1 + 1.0f / factor; } private bool CheckRoundedEquality(float value) @@ -24,9 +35,9 @@ private bool CheckRoundedEquality(float value) switch (RoundType) { case SearchRoundMode.Strict: - return Math.Abs(value - Value1) < 0.05f; + return Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); case SearchRoundMode.Normal: - return Math.Abs(value - Value1) < 0.5f; + return minValue < value && value < maxValue; case SearchRoundMode.Truncate: return (int)value == (int)Value1; default: From f2d0e2d11131bd17cbd92e2e8c518073aedb7b02 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Sep 2017 16:43:27 +0200 Subject: [PATCH 070/777] Moved ResultData to own file. --- ReClass.NET.csproj | 3 + UI/MemorySearchResultControl.Designer.cs | 68 ++++++----- UI/MemorySearchResultControl.ResultData.cs | 114 ++++++++++++++++++ UI/MemorySearchResultControl.cs | 127 ++++----------------- UI/MemorySearchResultControl.resx | 9 +- 5 files changed, 183 insertions(+), 138 deletions(-) create mode 100644 UI/MemorySearchResultControl.ResultData.cs diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 1acffe3f..fb0ec94f 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -286,6 +286,9 @@ MemorySearchResultControl.cs + + MemorySearchResultControl.cs + MemoryViewControl.cs diff --git a/UI/MemorySearchResultControl.Designer.cs b/UI/MemorySearchResultControl.Designer.cs index 26a8dc24..1fb98223 100644 --- a/UI/MemorySearchResultControl.Designer.cs +++ b/UI/MemorySearchResultControl.Designer.cs @@ -30,9 +30,10 @@ private void InitializeComponent() { this.resultDataGridView = new System.Windows.Forms.DataGridView(); this.descriptionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.resultAddressColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.resultValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.resultPreviousValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.addressColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.valueTypeColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.valueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.previousValueColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).BeginInit(); this.SuspendLayout(); // @@ -45,9 +46,10 @@ private void InitializeComponent() this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.descriptionColumn, - this.resultAddressColumn, - this.resultValueColumn, - this.resultPreviousValueColumn}); + this.addressColumn, + this.valueTypeColumn, + this.valueColumn, + this.previousValueColumn}); this.resultDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; this.resultDataGridView.Location = new System.Drawing.Point(0, 0); this.resultDataGridView.MultiSelect = false; @@ -67,31 +69,38 @@ private void InitializeComponent() this.descriptionColumn.Name = "descriptionColumn"; this.descriptionColumn.ReadOnly = true; // - // resultAddressColumn + // addressColumn // - this.resultAddressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.resultAddressColumn.DataPropertyName = "Address"; - this.resultAddressColumn.HeaderText = "Address"; - this.resultAddressColumn.Name = "resultAddressColumn"; - this.resultAddressColumn.ReadOnly = true; + this.addressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.addressColumn.DataPropertyName = "Address"; + this.addressColumn.HeaderText = "Address"; + this.addressColumn.Name = "addressColumn"; + this.addressColumn.ReadOnly = true; // - // resultValueColumn + // valueTypeColumn // - this.resultValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.resultValueColumn.DataPropertyName = "Value"; - this.resultValueColumn.HeaderText = "Value"; - this.resultValueColumn.Name = "resultValueColumn"; - this.resultValueColumn.ReadOnly = true; - this.resultValueColumn.Width = 59; + this.valueTypeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; + this.valueTypeColumn.DataPropertyName = "ValueType"; + this.valueTypeColumn.HeaderText = "Value Type"; + this.valueTypeColumn.Name = "valueTypeColumn"; + this.valueTypeColumn.ReadOnly = true; + this.valueTypeColumn.Width = 86; // - // resultPreviousValueColumn + // valueColumn // - this.resultPreviousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.resultPreviousValueColumn.DataPropertyName = "Previous"; - this.resultPreviousValueColumn.HeaderText = "Previous"; - this.resultPreviousValueColumn.Name = "resultPreviousValueColumn"; - this.resultPreviousValueColumn.ReadOnly = true; - this.resultPreviousValueColumn.Width = 73; + this.valueColumn.DataPropertyName = "Value"; + this.valueColumn.HeaderText = "Value"; + this.valueColumn.Name = "valueColumn"; + this.valueColumn.ReadOnly = true; + this.valueColumn.Width = 59; + // + // previousValueColumn + // + this.previousValueColumn.DataPropertyName = "Previous"; + this.previousValueColumn.HeaderText = "Previous"; + this.previousValueColumn.Name = "previousValueColumn"; + this.previousValueColumn.ReadOnly = true; + this.previousValueColumn.Width = 73; // // MemorySearchResultControl // @@ -109,8 +118,9 @@ private void InitializeComponent() private System.Windows.Forms.DataGridView resultDataGridView; private System.Windows.Forms.DataGridViewTextBoxColumn descriptionColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn resultAddressColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn resultValueColumn; - private System.Windows.Forms.DataGridViewTextBoxColumn resultPreviousValueColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn addressColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn valueTypeColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn valueColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn previousValueColumn; } } diff --git a/UI/MemorySearchResultControl.ResultData.cs b/UI/MemorySearchResultControl.ResultData.cs new file mode 100644 index 00000000..aa61b200 --- /dev/null +++ b/UI/MemorySearchResultControl.ResultData.cs @@ -0,0 +1,114 @@ +using System; +using System.ComponentModel; +using System.Diagnostics.Contracts; +using System.Globalization; +using ReClassNET.Memory; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.UI +{ + public partial class MemorySearchResultControl + { + private class ResultData : INotifyPropertyChanged + { + public string Description { get; set; } = string.Empty; + public string Address => Result.Address.ToString(Constants.StringHexFormat); + public string ValueType => Result.ValueType.ToString(); + public string Value { get; private set; } + public string Previous { get; } + + public bool ShowValueHexadecimal { get; set; } + + public SearchResult Result { get; } + + public event PropertyChangedEventHandler PropertyChanged; + + public ResultData(SearchResult result) + { + Contract.Requires(result != null); + + Result = result; + Previous = Value = FormatValue(); + } + + private void NotifyPropertyChanged(string propertyName = null) + { + if (propertyName != null) + { + var propertyChanged = PropertyChanged; + propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + + public void UpdateValue(RemoteProcess process) + { + Contract.Requires(process != null); + + var address = Result.Address; + + switch (Result.ValueType) + { + case SearchValueType.Byte: + Value = FormatValue(process.ReadRemoteMemory(address, 1)[0], ShowValueHexadecimal); + break; + case SearchValueType.Short: + Value = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(address, 2), 0), ShowValueHexadecimal); + break; + case SearchValueType.Integer: + Value = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(address, 4), 0), ShowValueHexadecimal); + break; + case SearchValueType.Long: + Value = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(address, 8), 0), ShowValueHexadecimal); + break; + case SearchValueType.Float: + Value = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(address, 4), 0)); + break; + case SearchValueType.Double: + Value = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(address, 8), 0)); + break; + case SearchValueType.ArrayOfBytes: + case SearchValueType.String: + return; + } + + NotifyPropertyChanged(nameof(Value)); + } + + private string FormatValue() + { + Contract.Requires(Result != null); + + switch (Result.ValueType) + { + case SearchValueType.Byte: + return FormatValue(((ByteSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Short: + return FormatValue(((ShortSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Integer: + return FormatValue(((IntegerSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Long: + return FormatValue(((LongSearchResult)Result).Value, ShowValueHexadecimal); + case SearchValueType.Float: + return FormatValue(((FloatSearchResult)Result).Value); + case SearchValueType.Double: + return FormatValue(((DoubleSearchResult)Result).Value); + case SearchValueType.ArrayOfBytes: + return FormatValue((byte[])null); + case SearchValueType.String: + return FormatValue(((StringSearchResult)Result).Value); + default: + throw new InvalidOperationException(); + } + } + + private static string FormatValue(byte value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(byte[] value) => "[...]"; + private static string FormatValue(string value) => $"\"{value}\""; + } + } +} diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs index 83f67a97..09095090 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemorySearchResultControl.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Diagnostics.Contracts; using System.Globalization; using System.Linq; @@ -14,112 +13,34 @@ namespace ReClassNET.UI { public partial class MemorySearchResultControl : UserControl { - private class ResultData// : INotifyPropertyChanged + public bool ShowDescriptionColumn { - public string Description { get; set; } = string.Empty; - public string Address => Result.Address.ToString(Constants.StringHexFormat); - public string ValueType => Result.ValueType.ToString(); - public string Value { get; private set; } - public string Previous { get; } - - public bool ShowValueHexadecimal { get; set; } - - public SearchResult Result { get; } - - public event PropertyChangedEventHandler PropertyChanged; - - public ResultData(SearchResult result) - { - Contract.Requires(result != null); - - Result = result; - Previous = Value = FormatValue(); - } - - private void NotifyPropertyChanged(string propertyName = null) - { - if (propertyName != null) - { - var propertyChanged = PropertyChanged; - propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - } - - public void UpdateValue(RemoteProcess process) - { - Contract.Requires(process != null); - - var address = Result.Address; - - switch (Result.ValueType) - { - case SearchValueType.Byte: - Value = FormatValue(process.ReadRemoteMemory(address, 1)[0], ShowValueHexadecimal); - break; - case SearchValueType.Short: - Value = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(address, 2), 0), ShowValueHexadecimal); - break; - case SearchValueType.Integer: - Value = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(address, 4), 0), ShowValueHexadecimal); - break; - case SearchValueType.Long: - Value = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(address, 8), 0), ShowValueHexadecimal); - break; - case SearchValueType.Float: - Value = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(address, 4), 0)); - break; - case SearchValueType.Double: - Value = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(address, 8), 0)); - break; - case SearchValueType.ArrayOfBytes: - case SearchValueType.String: - return; - } - - NotifyPropertyChanged(nameof(Value)); - } + get => descriptionColumn.Visible; + set => descriptionColumn.Visible = value; + } - private string FormatValue() - { - Contract.Requires(Result != null); + public bool ShowAddressColumn + { + get => addressColumn.Visible; + set => addressColumn.Visible = value; + } - switch (Result.ValueType) - { - case SearchValueType.Byte: - return FormatValue(((ByteSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Short: - return FormatValue(((ShortSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Integer: - return FormatValue(((IntegerSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Long: - return FormatValue(((LongSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Float: - return FormatValue(((FloatSearchResult)Result).Value); - case SearchValueType.Double: - return FormatValue(((DoubleSearchResult)Result).Value); - case SearchValueType.ArrayOfBytes: - return FormatValue((byte[])null); - case SearchValueType.String: - return FormatValue(((StringSearchResult)Result).Value); - default: - throw new InvalidOperationException(); - } - } + public bool ShowValueTypeColumn + { + get => valueTypeColumn.Visible; + set => valueTypeColumn.Visible = value; + } - private static string FormatValue(byte value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(byte[] value) => "[...]"; - private static string FormatValue(string value) => $"\"{value}\""; + public bool ShowValueColumn + { + get => valueColumn.Visible; + set => valueColumn.Visible = value; } - public bool ShowDescriptionColumn + public bool ShowPreviousValueColumn { - get => descriptionColumn.Visible; - set => descriptionColumn.Visible = value; + get => previousValueColumn.Visible; + set => previousValueColumn.Visible = value; } public bool ShowValuesHexadecimal { get; set; } @@ -172,19 +93,13 @@ public void UpdateValues(RemoteProcess process) { Contract.Requires(process != null); - //bindings.RaiseListChangedEvents = false; - foreach (var row in resultDataGridView.GetVisibleRows()) { if (row.DataBoundItem is ResultData result) { result.UpdateValue(process); - - bindings.ResetItem(row.Index); } } - - //bindings.RaiseListChangedEvents = true; } } } diff --git a/UI/MemorySearchResultControl.resx b/UI/MemorySearchResultControl.resx index 9262d940..29991de7 100644 --- a/UI/MemorySearchResultControl.resx +++ b/UI/MemorySearchResultControl.resx @@ -120,13 +120,16 @@ True - + True - + True - + + True + + True \ No newline at end of file From f8efe7c0daf8ebf05ae2b658fdaf6f51a25f0be1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Sep 2017 16:53:47 +0200 Subject: [PATCH 071/777] Refactored extension methods. --- Memory/NodeDissector.cs | 12 +- Nodes/BaseHexCommentNode.cs | 4 +- ReClass.NET.csproj | 3 + Util/Extension.FloatingPoint.cs | 59 +++++ Util/Extension.IntPtr.cs | 119 +++++++++ Util/Extension.Linq.cs | 181 +++++++++++++ Util/Extension.String.cs | 88 +++++++ Util/Extensions.cs | 437 +------------------------------- 8 files changed, 459 insertions(+), 444 deletions(-) create mode 100644 Util/Extension.FloatingPoint.cs create mode 100644 Util/Extension.IntPtr.cs create mode 100644 Util/Extension.String.cs diff --git a/Memory/NodeDissector.cs b/Memory/NodeDissector.cs index 7c10eb75..ef6f183d 100644 --- a/Memory/NodeDissector.cs +++ b/Memory/NodeDissector.cs @@ -44,18 +44,18 @@ public static Type GuessType(BaseHexNode node, MemoryBuffer memory) var data32 = memory.ReadObject(offset); var raw = memory.ReadBytes(offset, node.MemorySize); - if (raw.InterpretAsUTF8().IsLikelyPrintableData() >= 0.75f) + if (raw.InterpretAsUtf8().IsLikelyPrintableData() >= 0.75f) { return typeof(Utf8TextNode); } - else if (raw.InterpretAsUTF16().IsLikelyPrintableData() >= 0.75f) + if (raw.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) { return typeof(Utf16TextNode); } if (is8ByteAligned) { -#if WIN64 +#if RECLASSNET64 var pointerType = GuessPointerType(data64.IntPtr, memory); if (pointerType != null) { @@ -65,7 +65,7 @@ public static Type GuessType(BaseHexNode node, MemoryBuffer memory) } { -#if WIN32 +#if RECLASSNET32 var pointerType = GuessPointerType(data32.IntPtr, memory); if (pointerType != null) { @@ -140,11 +140,11 @@ private static Type GuessPointerType(IntPtr address, MemoryBuffer memory) // Check if it is a string. var data = memory.Process.ReadRemoteMemory(address, IntPtr.Size * 2); - if (data.Take(IntPtr.Size).InterpretAsUTF8().IsLikelyPrintableData() >= 07.5f) + if (data.Take(IntPtr.Size).InterpretAsUtf8().IsLikelyPrintableData() >= 07.5f) { return typeof(Utf8TextPtrNode); } - else if (data.InterpretAsUTF16().IsLikelyPrintableData() >= 0.75f) + if (data.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) { return typeof(Utf16TextPtrNode); } diff --git a/Nodes/BaseHexCommentNode.cs b/Nodes/BaseHexCommentNode.cs index d1bdd6b9..ddaa5931 100644 --- a/Nodes/BaseHexCommentNode.cs +++ b/Nodes/BaseHexCommentNode.cs @@ -61,12 +61,12 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu var data = view.Memory.Process.ReadRemoteMemory(ivalue, 64); // First check if it could be an UTF8 string and if not try UTF16. - if (data.Take(IntPtr.Size).InterpretAsUTF8().IsPrintableData()) + if (data.Take(IntPtr.Size).InterpretAsUtf8().IsPrintableData()) { var text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"'{text}'") + view.Font.Width; } - else if(data.Take(IntPtr.Size * 2).InterpretAsUTF16().IsPrintableData()) + else if(data.Take(IntPtr.Size * 2).InterpretAsUtf16().IsPrintableData()) { var text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"L'{text}'") + view.Font.Width; diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index fb0ec94f..b2909466 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -296,9 +296,12 @@ + + + diff --git a/Util/Extension.FloatingPoint.cs b/Util/Extension.FloatingPoint.cs new file mode 100644 index 00000000..9cd86f2c --- /dev/null +++ b/Util/Extension.FloatingPoint.cs @@ -0,0 +1,59 @@ +using System; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace ReClassNET.Util +{ + public static class FloatingPointExtension + { + [Pure] + [DebuggerStepThrough] + public static bool IsNearlyEqual(this float val, float other) + { + return IsNearlyEqual(val, other, float.Epsilon); + } + + [Pure] + [DebuggerStepThrough] + public static bool IsNearlyEqual(this float val, float other, float epsilon) + { + if (val == other) + { + return true; + } + + var diff = Math.Abs(val - other); + if (val == 0.0f || other == 0.0f || diff < float.Epsilon) + { + return diff < epsilon; + } + + return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; + } + + [Pure] + [DebuggerStepThrough] + public static bool IsNearlyEqual(this double val, double other) + { + return IsNearlyEqual(val, other, double.Epsilon); + } + + [Pure] + [DebuggerStepThrough] + public static bool IsNearlyEqual(this double val, double other, double epsilon) + { + if (val == other) + { + return true; + } + + var diff = Math.Abs(val - other); + if (val == 0.0 || other == 0.0 || diff < double.Epsilon) + { + return diff < epsilon; + } + + return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; + } + } +} diff --git a/Util/Extension.IntPtr.cs b/Util/Extension.IntPtr.cs new file mode 100644 index 00000000..b6f7459b --- /dev/null +++ b/Util/Extension.IntPtr.cs @@ -0,0 +1,119 @@ +using System; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace ReClassNET.Util +{ + public static class IntPtrExtension + { + [Pure] + [DebuggerStepThrough] + public static bool IsNull(this IntPtr ptr) + { + return ptr == IntPtr.Zero; + } + + [Pure] + [DebuggerStepThrough] + public static bool MayBeValid(this IntPtr ptr) + { +#if RECLASSNET64 + return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((long)0x00FF000000000000)); +#else + return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((int)0xFFFFF000)); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static IntPtr Add(this IntPtr lhs, IntPtr rhs) + { +#if RECLASSNET64 + return new IntPtr(lhs.ToInt64() + rhs.ToInt64()); +#else + return new IntPtr(lhs.ToInt32() + rhs.ToInt32()); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static IntPtr Sub(this IntPtr lhs, IntPtr rhs) + { +#if RECLASSNET64 + return new IntPtr(lhs.ToInt64() - rhs.ToInt64()); +#else + return new IntPtr(lhs.ToInt32() - rhs.ToInt32()); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static IntPtr Mul(this IntPtr lhs, IntPtr rhs) + { +#if RECLASSNET64 + return new IntPtr(lhs.ToInt64() * rhs.ToInt64()); +#else + return new IntPtr(lhs.ToInt32() * rhs.ToInt32()); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static IntPtr Div(this IntPtr lhs, IntPtr rhs) + { + Contract.Requires(!rhs.IsNull()); + +#if RECLASSNET64 + return new IntPtr(lhs.ToInt64() / rhs.ToInt64()); +#else + return new IntPtr(lhs.ToInt32() / rhs.ToInt32()); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static int Mod(this IntPtr lhs, int mod) + { +#if RECLASSNET64 + return (int)(lhs.ToInt64() % mod); +#else + return lhs.ToInt32() % mod; +#endif + } + + [Pure] + [DebuggerStepThrough] + public static bool InRange(this IntPtr address, IntPtr start, IntPtr end) + { +#if RECLASSNET64 + var val = (ulong)address.ToInt64(); + return (ulong)start.ToInt64() <= val && val <= (ulong)end.ToInt64(); +#else + var val = (uint)address.ToInt32(); + return (uint)start.ToInt32() <= val && val <= (uint)end.ToInt32(); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static int CompareTo(this IntPtr lhs, IntPtr rhs) + { +#if RECLASSNET64 + return ((ulong)lhs.ToInt64()).CompareTo((ulong)rhs.ToInt64()); +#else + return ((uint)lhs.ToInt32()).CompareTo((uint)rhs.ToInt32()); +#endif + } + + [Pure] + [DebuggerStepThrough] + public static int CompareToRange(this IntPtr address, IntPtr start, IntPtr end) + { + if (InRange(address, start, end)) + { + return 0; + } + return CompareTo(address, start); + } + } +} diff --git a/Util/Extension.Linq.cs b/Util/Extension.Linq.cs index d1bba8f9..856f365a 100644 --- a/Util/Extension.Linq.cs +++ b/Util/Extension.Linq.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Linq; namespace ReClassNET.Util { @@ -62,5 +65,183 @@ public static TResult Min(this IEnumerable source, Fu return min; } } + + [DebuggerStepThrough] + public static bool None(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + + return !source.Any(predicate); + } + + [DebuggerStepThrough] + public static IEnumerable WhereNot(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + + return source.Where(item => predicate(item) == false); + } + + [DebuggerStepThrough] + public static int FindIndex(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + Contract.Ensures(Contract.Result() >= -1); + + int retVal = 0; + foreach (var item in source) + { + if (predicate(item)) + { + return retVal; + } + ++retVal; + } + return -1; + } + + [DebuggerStepThrough] + public static void ForEach(this IEnumerable source, Action func) + { + Contract.Requires(source != null); + Contract.Requires(func != null); + + foreach (var item in source) + { + func(item); + } + } + + [DebuggerStepThrough] + public static IEnumerable Yield(this TSource item) + { + Contract.Ensures(Contract.Result>() != null); + + yield return item; + } + + [DebuggerStepThrough] + public static IEnumerable Traverse(this IEnumerable source, Func> childSelector) + { + Contract.Requires(source != null); + Contract.Requires(childSelector != null); + Contract.Ensures(Contract.Result>() != null); + + var stack = new Stack(source); + while (stack.Any()) + { + var next = stack.Pop(); + + yield return next; + + foreach (var child in childSelector(next)) + { + stack.Push(child); + } + } + } + + [DebuggerStepThrough] + public static IEnumerable SkipUntil(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + Contract.Ensures(Contract.Result>() != null); + + using (var iterator = source.GetEnumerator()) + { + while (iterator.MoveNext()) + { + if (predicate(iterator.Current)) + { + break; + } + } + while (iterator.MoveNext()) + { + yield return iterator.Current; + } + } + } + + [DebuggerStepThrough] + public static IEnumerable TakeUntil(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + Contract.Ensures(Contract.Result>() != null); + + foreach (var item in source) + { + yield return item; + + if (predicate(item)) + { + yield break; + } + } + } + + [DebuggerStepThrough] + public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) + { + Contract.Requires(source != null); + Contract.Requires(keySelector != null); + Contract.Ensures(Contract.Result>() != null); + + var knownKeys = new HashSet(); + foreach (var element in source) + { + if (knownKeys.Add(keySelector(element))) + { + yield return element; + } + } + } + + [DebuggerStepThrough] + public static bool SequenceEqualsEx(this IEnumerable first, IEnumerable second) + { + Contract.Requires(first != null); + Contract.Requires(second != null); + + return SequenceEqualsEx(first, second, EqualityComparer.Default); + } + + [DebuggerStepThrough] + public static bool SequenceEqualsEx(this IEnumerable first, IEnumerable second, IEqualityComparer comparer) + { + Contract.Requires(first != null); + Contract.Requires(second != null); + Contract.Requires(comparer != null); + + var counter = new Dictionary(comparer); + foreach (var element in first) + { + if (counter.ContainsKey(element)) + { + counter[element]++; + } + else + { + counter.Add(element, 1); + } + } + foreach (var element in second) + { + if (counter.ContainsKey(element)) + { + counter[element]--; + } + else + { + return false; + } + } + return counter.Values.All(c => c == 0); + } } } diff --git a/Util/Extension.String.cs b/Util/Extension.String.cs new file mode 100644 index 00000000..f87c45e2 --- /dev/null +++ b/Util/Extension.String.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Linq; + +namespace ReClassNET.Util +{ + public static class StringExtension + { + [Pure] + [DebuggerStepThrough] + public static bool IsPrintable(this char c) + { + return ' ' <= c && c <= '~'; + } + + [DebuggerStepThrough] + public static IEnumerable InterpretAsUtf8(this IEnumerable source) + { + Contract.Requires(source != null); + + return source.Select(b => (char)b); + } + + [DebuggerStepThrough] + public static IEnumerable InterpretAsUtf16(this IEnumerable source) + { + Contract.Requires(source != null); + + var bytes = source.ToArray(); + var chars = new char[bytes.Length / 2]; + Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); + return chars; + } + + [DebuggerStepThrough] + public static bool IsPrintableData(this IEnumerable source) + { + Contract.Requires(source != null); + + return IsLikelyPrintableData(source) >= 1.0f; + } + + [DebuggerStepThrough] + public static float IsLikelyPrintableData(this IEnumerable source) + { + Contract.Requires(source != null); + + bool doCountValid = true; + int countValid = 0; + int countAll = 0; + + foreach (var c in source) + { + countAll++; + + if (doCountValid) + { + if (c.IsPrintable()) + { + countValid++; + } + else + { + doCountValid = false; + } + } + } + + return countValid / (float)countAll; + } + + [Pure] + [DebuggerStepThrough] + public static string LimitLength(this string s, int length) + { + Contract.Requires(s != null); + Contract.Ensures(Contract.Result() != null); + + if (s.Length <= length) + { + return s; + } + return s.Substring(0, length); + } + } +} diff --git a/Util/Extensions.cs b/Util/Extensions.cs index 79ac3f6a..32553f49 100644 --- a/Util/Extensions.cs +++ b/Util/Extensions.cs @@ -48,8 +48,7 @@ public static IEnumerable Descendants(this BaseNode root) var node = nodes.Pop(); yield return node; - var classNode = node as ClassNode; - if (classNode != null) + if (node is ClassNode classNode) { foreach (var child in classNode.Nodes) { @@ -59,259 +58,6 @@ public static IEnumerable Descendants(this BaseNode root) } } - #region Pointer - - [Pure] - [DebuggerStepThrough] - public static bool IsNull(this IntPtr ptr) - { - return ptr == IntPtr.Zero; - } - - [Pure] - [DebuggerStepThrough] - public static bool MayBeValid(this IntPtr ptr) - { -#if WIN64 - return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((long)0x00FF000000000000)); -#else - return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((int)0xFFFFF000)); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static IntPtr Add(this IntPtr lhs, IntPtr rhs) - { -#if WIN64 - return new IntPtr(lhs.ToInt64() + rhs.ToInt64()); -#else - return new IntPtr(lhs.ToInt32() + rhs.ToInt32()); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static IntPtr Sub(this IntPtr lhs, IntPtr rhs) - { -#if WIN64 - return new IntPtr(lhs.ToInt64() - rhs.ToInt64()); -#else - return new IntPtr(lhs.ToInt32() - rhs.ToInt32()); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static IntPtr Mul(this IntPtr lhs, IntPtr rhs) - { -#if WIN64 - return new IntPtr(lhs.ToInt64() * rhs.ToInt64()); -#else - return new IntPtr(lhs.ToInt32() * rhs.ToInt32()); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static IntPtr Div(this IntPtr lhs, IntPtr rhs) - { - Contract.Requires(!rhs.IsNull()); - -#if WIN64 - return new IntPtr(lhs.ToInt64() / rhs.ToInt64()); -#else - return new IntPtr(lhs.ToInt32() / rhs.ToInt32()); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static int Mod(this IntPtr lhs, int mod) - { -#if WIN64 - return (int)(lhs.ToInt64() % mod); -#else - return lhs.ToInt32() % mod; -#endif - } - - [Pure] - [DebuggerStepThrough] - public static bool InRange(this IntPtr address, IntPtr start, IntPtr end) - { -#if WIN64 - var val = (ulong)address.ToInt64(); - return (ulong)start.ToInt64() <= val && val <= (ulong)end.ToInt64(); -#else - var val = (uint)address.ToInt32(); - return (uint)start.ToInt32() <= val && val <= (uint)end.ToInt32(); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static int CompareTo(this IntPtr lhs, IntPtr rhs) - { -#if WIN64 - return ((ulong)lhs.ToInt64()).CompareTo((ulong)rhs.ToInt64()); -#else - return ((uint)lhs.ToInt32()).CompareTo((uint)rhs.ToInt32()); -#endif - } - - [Pure] - [DebuggerStepThrough] - public static int CompareToRange(this IntPtr address, IntPtr start, IntPtr end) - { - if (InRange(address, start, end)) - { - return 0; - } - return CompareTo(address, start); - } - - #endregion - - #region String - - [Pure] - [DebuggerStepThrough] - public static bool IsPrintable(this char c) - { - return ' ' <= c && c <= '~'; - } - - [DebuggerStepThrough] - public static IEnumerable InterpretAsUTF8(this IEnumerable source) - { - Contract.Requires(source != null); - - return source.Select(b => (char)b); - } - - [DebuggerStepThrough] - public static IEnumerable InterpretAsUTF16(this IEnumerable source) - { - Contract.Requires(source != null); - - var bytes = source.ToArray(); - var chars = new char[bytes.Length / 2]; - Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); - return chars; - } - - [DebuggerStepThrough] - public static bool IsPrintableData(this IEnumerable source) - { - Contract.Requires(source != null); - - return IsLikelyPrintableData(source) >= 1.0f; - } - - [DebuggerStepThrough] - public static float IsLikelyPrintableData(this IEnumerable source) - { - Contract.Requires(source != null); - - bool doCountValid = true; - int countValid = 0; - int countAll = 0; - - foreach (var c in source) - { - countAll++; - - if (doCountValid) - { - if (c.IsPrintable()) - { - countValid++; - } - else - { - doCountValid = false; - } - } - } - - return countValid / (float)countAll; - } - - [Pure] - [DebuggerStepThrough] - public static string LimitLength(this string s, int length) - { - Contract.Requires(s != null); - Contract.Ensures(Contract.Result() != null); - - if (s.Length <= length) - { - return s; - } - return s.Substring(0, length); - } - - #endregion - - #region Floating Point - - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this float val, float other) - { - return IsNearlyEqual(val, other, float.Epsilon); - } - - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this float val, float other, float epsilon) - { - var diff = Math.Abs(val - other); - - if (val == other) - { - return true; - } - else if (val == 0.0f || other == 0.0f || diff < float.Epsilon) - { - return diff < epsilon; - } - else - { - return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; - } - } - - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this double val, double other) - { - return IsNearlyEqual(val, other, double.Epsilon); - } - - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this double val, double other, double epsilon) - { - var diff = Math.Abs(val - other); - - if (val == other) - { - return true; - } - else if (val == 0.0 || other == 0.0 || diff < double.Epsilon) - { - return diff < epsilon; - } - else - { - return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; - } - } - - #endregion - #region List [DebuggerStepThrough] @@ -345,186 +91,5 @@ public static T BinaryFind(this IList source, Func comparer) } #endregion - - #region Linq - - [DebuggerStepThrough] - public static bool None(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - - return !source.Any(predicate); - } - - [DebuggerStepThrough] - public static IEnumerable WhereNot(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - - return source.Where(item => predicate(item) == false); - } - - [DebuggerStepThrough] - public static int FindIndex(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - Contract.Ensures(Contract.Result() >= -1); - - int retVal = 0; - foreach (var item in source) - { - if (predicate(item)) - { - return retVal; - } - ++retVal; - } - return -1; - } - - [DebuggerStepThrough] - public static void ForEach(this IEnumerable source, Action func) - { - Contract.Requires(source != null); - Contract.Requires(func != null); - - foreach (var item in source) - { - func(item); - } - } - - [DebuggerStepThrough] - public static IEnumerable Yield(this TSource item) - { - Contract.Ensures(Contract.Result>() != null); - - yield return item; - } - - [DebuggerStepThrough] - public static IEnumerable Traverse(this IEnumerable source, Func> childSelector) - { - Contract.Requires(source != null); - Contract.Requires(childSelector != null); - Contract.Ensures(Contract.Result>() != null); - - var stack = new Stack(source); - while (stack.Any()) - { - var next = stack.Pop(); - - yield return next; - - foreach (var child in childSelector(next)) - { - stack.Push(child); - } - } - } - - [DebuggerStepThrough] - public static IEnumerable SkipUntil(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - Contract.Ensures(Contract.Result>() != null); - - using (var iterator = source.GetEnumerator()) - { - while (iterator.MoveNext()) - { - if (predicate(iterator.Current)) - { - break; - } - } - while (iterator.MoveNext()) - { - yield return iterator.Current; - } - } - } - - [DebuggerStepThrough] - public static IEnumerable TakeUntil(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - Contract.Ensures(Contract.Result>() != null); - - foreach (var item in source) - { - yield return item; - if (predicate(item)) - { - yield break; - } - } - } - - [DebuggerStepThrough] - public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) - { - Contract.Requires(source != null); - Contract.Requires(keySelector != null); - Contract.Ensures(Contract.Result>() != null); - - var knownKeys = new HashSet(); - foreach (var element in source) - { - if (knownKeys.Add(keySelector(element))) - { - yield return element; - } - } - } - - [DebuggerStepThrough] - public static bool SequenceEqualsEx(this IEnumerable first, IEnumerable second) - { - Contract.Requires(first != null); - Contract.Requires(second != null); - - return SequenceEqualsEx(first, second, EqualityComparer.Default); - } - - [DebuggerStepThrough] - public static bool SequenceEqualsEx(this IEnumerable first, IEnumerable second, IEqualityComparer comparer) - { - Contract.Requires(first != null); - Contract.Requires(second != null); - Contract.Requires(comparer != null); - - var counter = new Dictionary(comparer); - foreach (var element in first) - { - if (counter.ContainsKey(element)) - { - counter[element]++; - } - else - { - counter.Add(element, 1); - } - } - foreach (var element in second) - { - if (counter.ContainsKey(element)) - { - counter[element]--; - } - else - { - return false; - } - } - return counter.Values.All(c => c == 0); - } - - #endregion } } From da545b7819621b1014fcad6222202b74db23b575 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Sep 2017 23:48:23 +0200 Subject: [PATCH 072/777] Fixed designer exception. --- UI/MemorySearchResultControl.cs | 11 ++++++----- UI/MemoryViewControl.cs | 5 +++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs index 09095090..0bfb843f 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemorySearchResultControl.cs @@ -51,6 +51,11 @@ public MemorySearchResultControl() { InitializeComponent(); + if (Program.DesignMode) + { + return; + } + bindings = new BindingList { AllowNew = true, @@ -58,12 +63,8 @@ public MemorySearchResultControl() RaiseListChangedEvents = true }; - if (!Program.DesignMode) - { - resultDataGridView.DefaultCellStyle.Font = Program.MonoSpaceFont.Font; - } - resultDataGridView.AutoGenerateColumns = false; + resultDataGridView.DefaultCellStyle.Font = Program.MonoSpaceFont.Font; resultDataGridView.DataSource = bindings; } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 679ddbd4..29e93e88 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -80,6 +80,11 @@ public MemoryViewControl() { InitializeComponent(); + if (Program.DesignMode) + { + return; + } + font = Program.MonoSpaceFont; editBox.Font = font; From e9cf80d2207549e020b7fb6a64a97f7b87bc6344 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 00:06:36 +0200 Subject: [PATCH 073/777] Added grid hiding. --- Forms/MainForm.Designer.cs | 13 +- Forms/MainForm.cs | 45 ++-- Forms/MainForm.resx | 271 +--------------------- Properties/Resources.Designer.cs | 14 +- Properties/Resources.resx | 3 + ReClass.NET.csproj | 4 +- Resources/Images/B16x16_Eye.png | Bin 0 -> 691 bytes UI/CustomToolStripProfessionalRenderer.cs | 16 +- 8 files changed, 79 insertions(+), 287 deletions(-) create mode 100644 Resources/Images/B16x16_Eye.png diff --git a/Forms/MainForm.Designer.cs b/Forms/MainForm.Designer.cs index d17bcf9f..fa6d73a3 100644 --- a/Forms/MainForm.Designer.cs +++ b/Forms/MainForm.Designer.cs @@ -123,6 +123,7 @@ private void InitializeComponent() this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.processToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.processInformationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.memorySearcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.loadSymbolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadSymbolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -1056,6 +1057,7 @@ private void InitializeComponent() // this.processToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.processInformationsToolStripMenuItem, + this.memorySearcherToolStripMenuItem, this.toolStripSeparator17, this.loadSymbolToolStripMenuItem, this.loadSymbolsToolStripMenuItem, @@ -1069,12 +1071,20 @@ private void InitializeComponent() // // processInformationsToolStripMenuItem // - this.processInformationsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; + this.processInformationsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; this.processInformationsToolStripMenuItem.Name = "processInformationsToolStripMenuItem"; this.processInformationsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.processInformationsToolStripMenuItem.Text = "Process Informations"; this.processInformationsToolStripMenuItem.Click += new System.EventHandler(this.memoryViewerToolStripMenuItem_Click); // + // memorySearcherToolStripMenuItem + // + this.memorySearcherToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.memorySearcherToolStripMenuItem.Name = "memorySearcherToolStripMenuItem"; + this.memorySearcherToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.memorySearcherToolStripMenuItem.Text = "Memory Searcher"; + this.memorySearcherToolStripMenuItem.Click += new System.EventHandler(this.memorySearcherToolStripMenuItem_Click); + // // toolStripSeparator17 // this.toolStripSeparator17.Name = "toolStripSeparator17"; @@ -1323,6 +1333,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem detachToolStripMenuItem; private UI.TypeToolStripButton boolToolStripButton; private UI.TypeToolStripButton fnTypeToolStripButton; + private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; } } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 92c0ac31..f1d22ce5 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -49,13 +49,13 @@ public MainForm(CoreFunctionsManager coreFunctions) InitializeComponent(); - mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true); - toolStrip.Renderer = new CustomToolStripProfessionalRenderer(false); + mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); + toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); remoteProcess = new RemoteProcess(coreFunctions); remoteProcess.ProcessAttached += (sender) => { - var text = $"{sender.UnderlayingProcess.Name} (PID: {sender.UnderlayingProcess.Id.ToString()})"; + var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; Text = $"{Constants.ApplicationName} - {text}"; processInfoToolStripStatusLabel.Text = text; @@ -295,24 +295,9 @@ private void memoryViewerToolStripMenuItem_Click(object sender, EventArgs e) new ProcessInfoForm(remoteProcess, classesView).Show(); } - private void ControlRemoteProcessToolStripMenuItem_Click(object sender, EventArgs e) + private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) { - if (!remoteProcess.IsValid) - { - return; - } - - var action = ControlRemoteProcessAction.Terminate; - if (sender == resumeProcessToolStripMenuItem) - { - action = ControlRemoteProcessAction.Resume; - } - else if (sender == suspendProcessToolStripMenuItem) - { - action = ControlRemoteProcessAction.Suspend; - } - - remoteProcess.ControlRemoteProcess(action); + new MemorySearchForm(remoteProcess).Show(); } private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) @@ -340,6 +325,26 @@ private void loadSymbolsToolStripMenuItem_Click(object sender, EventArgs e) LoadAllSymbolsForCurrentProcess(); } + private void ControlRemoteProcessToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!remoteProcess.IsValid) + { + return; + } + + var action = ControlRemoteProcessAction.Terminate; + if (sender == resumeProcessToolStripMenuItem) + { + action = ControlRemoteProcessAction.Resume; + } + else if (sender == suspendProcessToolStripMenuItem) + { + action = ControlRemoteProcessAction.Suspend; + } + + remoteProcess.ControlRemoteProcess(action); + } + private void cleanUnusedClassesToolStripMenuItem_Click(object sender, EventArgs e) { currentProject.RemoveUnusedClasses(); diff --git a/Forms/MainForm.resx b/Forms/MainForm.resx index 638a48bf..8fe54edd 100644 --- a/Forms/MainForm.resx +++ b/Forms/MainForm.resx @@ -177,266 +177,17 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAOjBpVFh0WE1MOmNvbS5h - ZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3pr - YzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhN - UCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4KICAg - PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt - bnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6 - eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0i - aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0 - dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAg - eG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxu - czpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAg - IHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxu - czpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRv - clRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAg - ICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE2LTEwLTA4VDE2OjUwOjQyKzAyOjAwPC94bXA6Q3JlYXRl - RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNi0xMC0wOFQxNjo1MDo0MiswMjowMDwv - eG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTYtMTAtMDhUMTY6NTA6 - NDIrMDI6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlk - Ojg1MzJkMjM5LTcwZjgtMzc0Ny05OTg1LTY4OTBjYzBjMTdkNTwveG1wTU06SW5zdGFuY2VJRD4KICAg - ICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjc1MWJkZTA5LThkNjYt - MTFlNi1hMTM0LWU5YjI3OTU0YzcwODwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9y - aWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjIzYjk1Yjc2LTFlMTgtYmQ0Mi04MDk3LTRlN2JkZWQwYzQw - NzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAg - ICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3Vy - Y2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4K - ICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDoyM2I5NWI3Ni0xZTE4LWJk - NDItODA5Ny00ZTdiZGVkMGM0MDc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxz - dEV2dDp3aGVuPjIwMTYtMTAtMDhUMTY6NTA6NDIrMDI6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAg - ICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dz - KTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAg - ICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RF - dnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0 - YW5jZUlEPnhtcC5paWQ6ODUzMmQyMzktNzBmOC0zNzQ3LTk5ODUtNjg5MGNjMGMxN2Q1PC9zdEV2dDpp - bnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE2LTEwLTA4VDE2OjUwOjQy - KzAyOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5B - ZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAg - ICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAg - IDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9yeT4K - ICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHBob3Rvc2hv - cDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQ - cm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHRp - ZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRp - b24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlv - bj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25V - bml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhp - ZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTY8L2V4aWY6UGl4ZWxY - RGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTY8L2V4aWY6UGl4ZWxZRGlt - ZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg - ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVu - ZD0idyI/PrRM3i8AAAJMSURBVDhPlZHrS5NhGMb9SxKrLxVhBU3DyIygA4lW0pcyzGSJgZl0lE4ytGxU - mBge5pdYSQc1rTYUCx1YlLrcKZfm1qbNZam5uVPT/XrfVzKGaXXD9Tzw3M/147qfJwaYV4vOyp/U+NLM - g9Z3qJ++ocfiEK7+9iwALFYRQapHHWzcdZT7LZ3iUTRg3GTgRWUt+opy9DXVWDUa8ZJUEcEdnolQqW6l - rcs8B2nuEFtzAFtzIxZlKSNV5YyUl/G+6BTtRw7TcvoMs6I5HCEYmqXirhbZ7px5SYBxsxFTiYJJdR1+ - TRNTDfdw3VZizMvhYUoy8tSLyPJteP0zTE6HJcgvkAQw1NXy6boC72M1Pm0TnsZ6XBVKLAXHaduxDdXe - DDy+GSY8YcYmw7i+hSSAOIYE6L51A/uls4yrKoUUKr7W3cFeepme3GxatydTFrcC2Qk76+RGVmd2YncH - owH66ioMx7JxFJ/Hee0KQ8VFGPNz0R1I40nCeqr2pOOe+MHIWBD7aIABpz8a0K95jmZ/Or2HMjDIs+jO - OohuXyraLYnUrIwjM/mkkMBGvJBgjZDAZPdFA8SloaCQ+k0yyaTdnEDThrVUL4/lZmISDneIwc8B+h1+ - TLZpege8CwGi+p5pKElK4eqyWC6sSiBvZyFpijG2nhuVfiFebpDe4LVlEYAoseGeCDEszGtzBfkwHMAi - RO4b9NFt9fLK4kFnmFoa4PwSYkgwW50BIbIP/eA0b/u9dJk9dPZN0d77fWnAR2Fecf+bFgWIjX/VAsD/ - i5ifMJftCPEu7d0AAAAASUVORK5CYII= + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDAAACwwBP0AiyAAAAkxJREFUOE+VketLk2EY + xv1LEqsvFWEFTcPIjKADiVbSlzLMZImBmXSUTjK0bFSYGB7ml1hJBzWtNhQLHViUutwpl+bWps1lqbm5 + U9P9et9XMoZpdcP1PPDcz/Xjup8nBphXi87Kn9T40syD1neon76hx+IQrv72LAAsVhFBqkcdbNx1lPst + neJRNGDcZOBFZS36inL0NdVYNRrxklQRwR2eiVCpbqWtyzwHae4QW3MAW3MjFmUpI1XljJSX8b7oFO1H + DtNy+gyzojkcIRiapeKuFtnunHlJgHGzEVOJgkl1HX5NE1MN93DdVmLMy+FhSjLy1IvI8m14/TNMTocl + yC+QBDDU1fLpugLvYzU+bROexnpcFUosBcdp27EN1d4MPL4ZJjxhxibDuL6FJIA4hgTovnUD+6WzjKsq + hRQqvtbdwV56mZ7cbFq3J1MWtwLZCTvr5EZWZ3ZidwejAfrqKgzHsnEUn8d57QpDxUUY83PRHUjjScJ6 + qvak4574wchYEPtogAGnPxrQr3mOZn86vYcyMMiz6M46iG5fKtotidSsjCMz+aSQwEa8kGCNkMBk90UD + xKWhoJD6TTLJpN2cQNOGtVQvj+VmYhIOd4jBzwH6HX5Mtml6B7wLAaL6nmkoSUrh6rJYLqxKIG9nIWmK + MbaeG5V+IV5ukN7gtWURgCix4Z4IMSzMa3MF+TAcwCJE7hv00W318sriQWeYWhrg/BJiSDBbnQEhsg/9 + 4DRv+710mT109k3R3vt9acBHYV5x/5sWBYiNf9UCwP+LmJ8wl+0I8S7t3QAAAABJRU5ErkJggg== diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 3862dadb..8297585a 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace ReClassNET.Properties { // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -780,6 +780,16 @@ internal static System.Drawing.Bitmap B16x16_Exchange_Button { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Eye { + get { + object obj = ResourceManager.GetObject("B16x16_Eye", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1221,7 +1231,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2016/12/15 20:00:57 + /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/14 21:59:08 /// ähnelt. /// internal static string BuildDate { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 512d41b9..47fd8aca 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -472,4 +472,7 @@ ..\Resources\Images\B16x16_Find_Write.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index b2909466..ccf32c87 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -857,7 +857,9 @@ - + + + diff --git a/Resources/Images/B16x16_Eye.png b/Resources/Images/B16x16_Eye.png new file mode 100644 index 0000000000000000000000000000000000000000..2098c724ca55aa042ed727f608e1d8a121300055 GIT binary patch literal 691 zcmV;k0!;mhP)Ku4zAXUrnCuJYLSU((jQ1v1{Ki~q}0nwQV$_0MW8(tR0x6e6j?-} zfe1zvrp1;fWFe%6lC0XU<{zzXZtFI)&dlvPB^31LL+5fhmwV6man8BlC6rRE#5kt%NWi>W&F!XJq;H2A@bppv%vuOX4iK4_2 zysxiB+m&kgyIK&Q=|}fy6s|pIk$oWuiRI1(CmIj0~X9=f|*r9+DNvD0=`o_Y@Wuz6LCtijIEzyrq6UmfGfZD2ybi2yCDn z8?OYYyXnMWE1g|X>G{?GO{;uH zGpgFmSlu#4b#g2T$ z1;JFA!E~Upl0)A@m=5^RH#BkEbJw``@!pOx(cxkQceX=~gpqr0(8lsNH SystemColors.Control; From 3fd4f83db8b341c56f85c4c150ff1c0af1ad57a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 00:47:50 +0200 Subject: [PATCH 074/777] Hide panel background. --- UI/CustomToolStripProfessionalRenderer.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UI/CustomToolStripProfessionalRenderer.cs b/UI/CustomToolStripProfessionalRenderer.cs index fea239d3..64ac3e44 100644 --- a/UI/CustomToolStripProfessionalRenderer.cs +++ b/UI/CustomToolStripProfessionalRenderer.cs @@ -30,6 +30,11 @@ protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) base.OnRenderToolStripBorder(e); } } + + protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) + { + //base.OnRenderToolStripPanelBackground(e); + } } internal class CustomProfessionalColorTable : ProfessionalColorTable From 39e1ca926188fcf26978c972b6abb240ad6ee2e9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 00:48:07 +0200 Subject: [PATCH 075/777] Fixed image path. --- ReClass.NET.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index ccf32c87..4f35051e 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -858,7 +858,7 @@ - + From 1e62004f86bcdb42c6ae5034e50ecfccead2cd6f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 12:36:07 +0200 Subject: [PATCH 076/777] Moved files. --- .../{ => ReClass}/CustomNodeConverter.cs | 0 DataExchange/{ => ReClass}/IReClassExport.cs | 0 DataExchange/{ => ReClass}/IReClassImport.cs | 0 DataExchange/{ => ReClass}/ReClass2007File.cs | 0 .../{ => ReClass}/ReClassClipboard.cs | 0 DataExchange/{ => ReClass}/ReClassFile.cs | 0 .../{ => ReClass}/ReClassNetFile.Read.cs | 0 .../{ => ReClass}/ReClassNetFile.Write.cs | 0 DataExchange/{ => ReClass}/ReClassNetFile.cs | 0 DataExchange/{ => ReClass}/ReClassQtFile.cs | 0 ReClass.NET.csproj | 23 +++++++++++-------- 11 files changed, 13 insertions(+), 10 deletions(-) rename DataExchange/{ => ReClass}/CustomNodeConverter.cs (100%) rename DataExchange/{ => ReClass}/IReClassExport.cs (100%) rename DataExchange/{ => ReClass}/IReClassImport.cs (100%) rename DataExchange/{ => ReClass}/ReClass2007File.cs (100%) rename DataExchange/{ => ReClass}/ReClassClipboard.cs (100%) rename DataExchange/{ => ReClass}/ReClassFile.cs (100%) rename DataExchange/{ => ReClass}/ReClassNetFile.Read.cs (100%) rename DataExchange/{ => ReClass}/ReClassNetFile.Write.cs (100%) rename DataExchange/{ => ReClass}/ReClassNetFile.cs (100%) rename DataExchange/{ => ReClass}/ReClassQtFile.cs (100%) diff --git a/DataExchange/CustomNodeConverter.cs b/DataExchange/ReClass/CustomNodeConverter.cs similarity index 100% rename from DataExchange/CustomNodeConverter.cs rename to DataExchange/ReClass/CustomNodeConverter.cs diff --git a/DataExchange/IReClassExport.cs b/DataExchange/ReClass/IReClassExport.cs similarity index 100% rename from DataExchange/IReClassExport.cs rename to DataExchange/ReClass/IReClassExport.cs diff --git a/DataExchange/IReClassImport.cs b/DataExchange/ReClass/IReClassImport.cs similarity index 100% rename from DataExchange/IReClassImport.cs rename to DataExchange/ReClass/IReClassImport.cs diff --git a/DataExchange/ReClass2007File.cs b/DataExchange/ReClass/ReClass2007File.cs similarity index 100% rename from DataExchange/ReClass2007File.cs rename to DataExchange/ReClass/ReClass2007File.cs diff --git a/DataExchange/ReClassClipboard.cs b/DataExchange/ReClass/ReClassClipboard.cs similarity index 100% rename from DataExchange/ReClassClipboard.cs rename to DataExchange/ReClass/ReClassClipboard.cs diff --git a/DataExchange/ReClassFile.cs b/DataExchange/ReClass/ReClassFile.cs similarity index 100% rename from DataExchange/ReClassFile.cs rename to DataExchange/ReClass/ReClassFile.cs diff --git a/DataExchange/ReClassNetFile.Read.cs b/DataExchange/ReClass/ReClassNetFile.Read.cs similarity index 100% rename from DataExchange/ReClassNetFile.Read.cs rename to DataExchange/ReClass/ReClassNetFile.Read.cs diff --git a/DataExchange/ReClassNetFile.Write.cs b/DataExchange/ReClass/ReClassNetFile.Write.cs similarity index 100% rename from DataExchange/ReClassNetFile.Write.cs rename to DataExchange/ReClass/ReClassNetFile.Write.cs diff --git a/DataExchange/ReClassNetFile.cs b/DataExchange/ReClass/ReClassNetFile.cs similarity index 100% rename from DataExchange/ReClassNetFile.cs rename to DataExchange/ReClass/ReClassNetFile.cs diff --git a/DataExchange/ReClassQtFile.cs b/DataExchange/ReClass/ReClassQtFile.cs similarity index 100% rename from DataExchange/ReClassQtFile.cs rename to DataExchange/ReClass/ReClassQtFile.cs diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 4f35051e..df1231aa 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -148,9 +148,9 @@ - - - + + + @@ -226,10 +226,10 @@ - - - - + + + + Form @@ -329,9 +329,9 @@ MainForm.cs - - - + + + @@ -860,6 +860,9 @@ + + + From 0ed7d17b85cedbc33dccddfe0e3daf69608f4022 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 12:55:16 +0200 Subject: [PATCH 077/777] Moved to correct namespace. --- DataExchange/ReClass/CustomNodeConverter.cs | 6 +-- DataExchange/ReClass/IReClassExport.cs | 6 +-- DataExchange/ReClass/IReClassImport.cs | 6 +-- DataExchange/ReClass/ReClass2007File.cs | 19 ++++---- DataExchange/ReClass/ReClassClipboard.cs | 5 +-- DataExchange/ReClass/ReClassFile.cs | 47 ++++++++++---------- DataExchange/ReClass/ReClassNetFile.Read.cs | 9 ++-- DataExchange/ReClass/ReClassNetFile.Write.cs | 20 ++++----- DataExchange/ReClass/ReClassNetFile.cs | 7 +-- DataExchange/ReClass/ReClassQtFile.cs | 7 ++- Forms/MainForm.cs | 2 +- Plugins/DefaultPluginHost.cs | 2 +- Plugins/IPluginHost.cs | 6 +-- 13 files changed, 68 insertions(+), 74 deletions(-) diff --git a/DataExchange/ReClass/CustomNodeConverter.cs b/DataExchange/ReClass/CustomNodeConverter.cs index 13786b7e..fe55c58f 100644 --- a/DataExchange/ReClass/CustomNodeConverter.cs +++ b/DataExchange/ReClass/CustomNodeConverter.cs @@ -6,9 +6,9 @@ using ReClassNET.Logger; using ReClassNET.Nodes; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { - [ContractClass(typeof(ICustomNodeConverterContract))] + [ContractClass(typeof(CustomNodeConverterContract))] public interface ICustomNodeConverter { /// Determine if the instance can handle the xml element. @@ -38,7 +38,7 @@ public interface ICustomNodeConverter } [ContractClassFor(typeof(ICustomNodeConverter))] - internal abstract class ICustomNodeConverterContract : ICustomNodeConverter + internal abstract class CustomNodeConverterContract : ICustomNodeConverter { public bool CanHandleElement(XElement element) { diff --git a/DataExchange/ReClass/IReClassExport.cs b/DataExchange/ReClass/IReClassExport.cs index f06c6ab2..d169251e 100644 --- a/DataExchange/ReClass/IReClassExport.cs +++ b/DataExchange/ReClass/IReClassExport.cs @@ -2,9 +2,9 @@ using System.IO; using ReClassNET.Logger; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { - [ContractClass(typeof(IReClassExportContract))] + [ContractClass(typeof(ReClassExportContract))] public interface IReClassExport { void Save(string filePath, ILogger logger); @@ -13,7 +13,7 @@ public interface IReClassExport } [ContractClassFor(typeof(IReClassExport))] - internal abstract class IReClassExportContract : IReClassExport + internal abstract class ReClassExportContract : IReClassExport { public void Save(string filePath, ILogger logger) { diff --git a/DataExchange/ReClass/IReClassImport.cs b/DataExchange/ReClass/IReClassImport.cs index 32f9a131..802dbc8a 100644 --- a/DataExchange/ReClass/IReClassImport.cs +++ b/DataExchange/ReClass/IReClassImport.cs @@ -2,16 +2,16 @@ using System.Diagnostics.Contracts; using ReClassNET.Logger; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { - [ContractClass(typeof(IReClassImportContract))] + [ContractClass(typeof(ReClassImportContract))] public interface IReClassImport { void Load(string filePath, ILogger logger); } [ContractClassFor(typeof(IReClassImport))] - internal abstract class IReClassImportContract : IReClassImport + internal abstract class ReClassImportContract : IReClassImport { public void Load(string filePath, ILogger logger) { diff --git a/DataExchange/ReClass/ReClass2007File.cs b/DataExchange/ReClass/ReClass2007File.cs index 12275d25..77ef0c2e 100644 --- a/DataExchange/ReClass/ReClass2007File.cs +++ b/DataExchange/ReClass/ReClass2007File.cs @@ -8,14 +8,15 @@ using ReClassNET.Nodes; using ReClassNET.Util; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { - class ReClass2007File : IReClassImport + public class ReClass2007File : IReClassImport { public const string FormatName = "ReClass 2007 File"; public const string FileExtension = ".rdc"; - private static readonly Type[] TypeMap = { + private static readonly Type[] typeMap = + { null, typeof(ClassInstanceNode), typeof(ClassNode), @@ -120,10 +121,10 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode { Type nodeType = null; - int typeVal = Convert.ToInt32(row["type"]); - if (typeVal >= 0 && typeVal < TypeMap.Length) + var typeVal = Convert.ToInt32(row["type"]); + if (typeVal >= 0 && typeVal < typeMap.Length) { - nodeType = TypeMap[typeVal]; + nodeType = typeMap[typeVal]; } if (nodeType == null) @@ -145,8 +146,7 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode node.Name = Convert.ToString(row["variable"]); node.Comment = Convert.ToString(row["comment"]); - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { var reference = Convert.ToInt32(row["ref"]); if (!classes.ContainsKey(reference)) @@ -174,8 +174,7 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode referenceNode.ChangeInnerNode(innerClassNode); } - var textNode = node as BaseTextNode; - if (textNode != null) + if (node is BaseTextNode textNode) { textNode.Length = Math.Max(IntPtr.Size, Convert.ToInt32(row["length"])); } diff --git a/DataExchange/ReClass/ReClassClipboard.cs b/DataExchange/ReClass/ReClassClipboard.cs index d154229e..2ac42690 100644 --- a/DataExchange/ReClass/ReClassClipboard.cs +++ b/DataExchange/ReClass/ReClassClipboard.cs @@ -6,7 +6,7 @@ using ReClassNET.Logger; using ReClassNET.Nodes; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { public class ReClassClipboard { @@ -47,8 +47,7 @@ public static Tuple, List> Paste(ReClassNetProject tem if (ContainsNodes) { - var data = Clipboard.GetData(ClipboardFormat) as byte[]; - if (data != null) + if (Clipboard.GetData(ClipboardFormat) is byte[] data) { using (var ms = new MemoryStream(data)) { diff --git a/DataExchange/ReClass/ReClassFile.cs b/DataExchange/ReClass/ReClassFile.cs index 3e3a7fbe..1fc61cdb 100644 --- a/DataExchange/ReClass/ReClassFile.cs +++ b/DataExchange/ReClass/ReClassFile.cs @@ -9,9 +9,9 @@ using ReClassNET.UI; using ReClassNET.Util; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { - class ReClassFile : IReClassImport + public class ReClassFile : IReClassImport { public const string FormatName = "ReClass File"; public const string FileExtension = ".reclass"; @@ -35,28 +35,25 @@ public void Load(string filePath, ILogger logger) Type[] typeMap = null; - var versionComment = document.Root.FirstNode as XComment; - if (versionComment != null) + if (document.Root.FirstNode is XComment versionComment) { switch (versionComment.Value.Substring(0, 12).ToLower()) { case "reclass 2011": case "reclass 2013": - typeMap = TypeMap2013; + typeMap = typeMap2013; break; case "reclass 2015": case "reclass 2016": - typeMap = TypeMap2016; + typeMap = typeMap2016; break; - } - } - - if (typeMap == null) - { - logger.Log(LogLevel.Warning, $"Unknown file version: {versionComment?.Value}"); - logger.Log(LogLevel.Warning, "Defaulting to ReClass 2016."); + default: + logger.Log(LogLevel.Warning, $"Unknown file version: {versionComment.Value}"); + logger.Log(LogLevel.Warning, "Defaulting to ReClass 2016."); - typeMap = TypeMap2016; + typeMap = typeMap2016; + break; + } } var classes = new List>(); @@ -92,19 +89,22 @@ public void Load(string filePath, ILogger logger) /// Parse ReClass address string and transform it into a ReClass.NET formula. /// The address string. /// A string. - private string TransformAddressString(string address) + private static string TransformAddressString(string address) { Contract.Requires(address != null); - var parts = address.Split('+').Select(s => s.Trim().ToLower().Replace("\"", string.Empty)).Where(s => s != string.Empty).ToArray(); + var parts = address.Split('+') + .Select(s => s.Trim().ToLower().Replace("\"", string.Empty)) + .Where(s => s != string.Empty) + .ToArray(); - for (int i = 0; i < parts.Length; ++i) + for (var i = 0; i < parts.Length; ++i) { var part = parts[i]; - bool isModule = part.Contains(".exe") || part.Contains(".dll"); + var isModule = part.Contains(".exe") || part.Contains(".dll"); - bool isPointer = false; + var isPointer = false; if (part.StartsWith("*")) { isPointer = true; @@ -173,7 +173,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C while (size != 0) { BaseNode paddingNode; -#if WIN64 +#if RECLASSNET64 if (size >= 8) { paddingNode = new Hex64Node(); @@ -203,8 +203,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { string reference; if (referenceNode is ClassInstanceArrayNode) @@ -306,7 +305,7 @@ public override Size Draw(ViewInfo view, int x, int y) #region ReClass 2011 / ReClass 2013 - private static readonly Type[] TypeMap2013 = new Type[] + private static readonly Type[] typeMap2013 = new Type[] { null, typeof(ClassInstanceNode), @@ -345,7 +344,7 @@ public override Size Draw(ViewInfo view, int x, int y) #region ReClass 2015 / ReClass 2016 - private static readonly Type[] TypeMap2016 = new Type[] + private static readonly Type[] typeMap2016 = new Type[] { null, typeof(ClassInstanceNode), diff --git a/DataExchange/ReClass/ReClassNetFile.Read.cs b/DataExchange/ReClass/ReClassNetFile.Read.cs index 5ed7403e..d90a27b0 100644 --- a/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -9,7 +9,7 @@ using ReClassNET.Nodes; using ReClassNET.Util; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { public partial class ReClassNetFile { @@ -36,7 +36,7 @@ public void Load(Stream input, ILogger logger) using (var entryStream = dataEntry.Open()) { var document = XDocument.Load(entryStream); - if (document.Root == null) + if (document.Root?.Element(XmlClassesElement) == null) { logger.Log(LogLevel.Error, "File has not the correct format."); return; @@ -104,7 +104,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - if (!BuildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType)) + if (!buildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType)) { logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(XmlTypeAttribute)?.Value}"); logger.Log(LogLevel.Warning, element.ToString()); @@ -123,8 +123,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty; node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty; - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); if (!project.ContainsClass(reference)) diff --git a/DataExchange/ReClass/ReClassNetFile.Write.cs b/DataExchange/ReClass/ReClassNetFile.Write.cs index d87a63a4..cd93c30b 100644 --- a/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -7,7 +7,7 @@ using ReClassNET.Logger; using ReClassNET.Nodes; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { public partial class ReClassNetFile { @@ -27,7 +27,8 @@ public void Save(Stream output, ILogger logger) using (var entryStream = dataEntry.Open()) { var document = new XDocument( - new XComment("ReClass.NET by KN4CK3R"), + new XComment($"{Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"), + new XComment($"Website: {Constants.HomepageUrl}"), new XElement( XmlRootElement, new XAttribute(XmlVersionAttribute, Version1), @@ -41,7 +42,7 @@ public void Save(Stream output, ILogger logger) } } - private IEnumerable CreateClassElements(IEnumerable classes, ILogger logger) + private static IEnumerable CreateClassElements(IEnumerable classes, ILogger logger) { Contract.Requires(classes != null); Contract.Requires(Contract.ForAll(classes, c => c != null)); @@ -58,7 +59,7 @@ private IEnumerable CreateClassElements(IEnumerable classes )); } - private IEnumerable CreateNodeElements(IEnumerable nodes, ILogger logger) + private static IEnumerable CreateNodeElements(IEnumerable nodes, ILogger logger) { Contract.Requires(nodes != null); Contract.Requires(Contract.ForAll(nodes, n => n != null)); @@ -75,7 +76,7 @@ private IEnumerable CreateNodeElements(IEnumerable nodes, IL continue; } - if (!BuildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString)) + if (!buildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString)) { logger.Log(LogLevel.Error, $"Skipping node with unknown type: {node.Name}"); logger.Log(LogLevel.Warning, node.GetType().ToString()); @@ -90,8 +91,7 @@ private IEnumerable CreateNodeElements(IEnumerable nodes, IL new XAttribute(XmlTypeAttribute, typeString) ); - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { element.SetAttributeValue(XmlReferenceAttribute, referenceNode.InnerNode.Uuid.ToBase64String()); } @@ -168,16 +168,14 @@ void RecursiveAddReferences(BaseReferenceNode referenceNode) foreach (var node in nodes) { - var classNode = node as ClassNode; - if (classNode != null) + if (node is ClassNode classNode) { project.AddClass(classNode); continue; } - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { RecursiveAddReferences(referenceNode); } diff --git a/DataExchange/ReClass/ReClassNetFile.cs b/DataExchange/ReClass/ReClassNetFile.cs index 614d1dfc..29732c2a 100644 --- a/DataExchange/ReClass/ReClassNetFile.cs +++ b/DataExchange/ReClass/ReClassNetFile.cs @@ -4,7 +4,7 @@ using System.Linq; using ReClassNET.Nodes; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { public partial class ReClassNetFile : IReClassImport, IReClassExport { @@ -43,7 +43,7 @@ public ReClassNetFile(ReClassNetProject project) this.project = project; } - private static readonly Dictionary BuildInStringToTypeMap = new[] + private static readonly Dictionary buildInStringToTypeMap = new[] { typeof(BoolNode), typeof(BitFieldNode), @@ -81,6 +81,7 @@ public ReClassNetFile(ReClassNetProject project) typeof(Vector4Node), typeof(VTableNode) }.ToDictionary(t => t.Name, t => t); - private static readonly Dictionary BuildInTypeToStringMap = BuildInStringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key); + + private static readonly Dictionary buildInTypeToStringMap = buildInStringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key); } } diff --git a/DataExchange/ReClass/ReClassQtFile.cs b/DataExchange/ReClass/ReClassQtFile.cs index 525a8100..f87e1341 100644 --- a/DataExchange/ReClass/ReClassQtFile.cs +++ b/DataExchange/ReClass/ReClassQtFile.cs @@ -7,7 +7,7 @@ using ReClassNET.Nodes; using ReClassNET.Util; -namespace ReClassNET.DataExchange +namespace ReClassNET.DataExchange.ReClass { class ReClassQtFile : IReClassImport { @@ -64,7 +64,7 @@ public void Load(string filePath, ILogger logger) /// Parse a ReClassQT address string and transform it into a ReClass.NET formula. /// The class element. /// A string with an address formula. - private string ParseAddressString(XElement element) + private static string ParseAddressString(XElement element) { Contract.Requires(element != null); @@ -145,8 +145,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute("Name")?.Value ?? string.Empty; node.Comment = element.Attribute("Comments")?.Value ?? string.Empty; - var referenceNode = node as BaseReferenceNode; - if (referenceNode != null) + if (node is BaseReferenceNode referenceNode) { var pointToClassId = element.Attribute("PointToClass")?.Value; if (pointToClassId == null || !classes.ContainsKey(pointToClassId)) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index f1d22ce5..d8dc76bd 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -9,7 +9,7 @@ using System.Windows.Forms; using ReClassNET.CodeGenerator; using ReClassNET.Core; -using ReClassNET.DataExchange; +using ReClassNET.DataExchange.ReClass; using ReClassNET.Logger; using ReClassNET.Memory; using ReClassNET.Nodes; diff --git a/Plugins/DefaultPluginHost.cs b/Plugins/DefaultPluginHost.cs index 29132697..aeac6bce 100644 --- a/Plugins/DefaultPluginHost.cs +++ b/Plugins/DefaultPluginHost.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.Resources; using ReClassNET.CodeGenerator; -using ReClassNET.DataExchange; +using ReClassNET.DataExchange.ReClass; using ReClassNET.Forms; using ReClassNET.Logger; using ReClassNET.Memory; diff --git a/Plugins/IPluginHost.cs b/Plugins/IPluginHost.cs index 730cb17e..927d044a 100644 --- a/Plugins/IPluginHost.cs +++ b/Plugins/IPluginHost.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.Resources; using ReClassNET.CodeGenerator; -using ReClassNET.DataExchange; +using ReClassNET.DataExchange.ReClass; using ReClassNET.Forms; using ReClassNET.Logger; using ReClassNET.Memory; @@ -11,7 +11,7 @@ namespace ReClassNET.Plugins { - [ContractClass(typeof(IPluginHostContract))] + [ContractClass(typeof(PluginHostContract))] public interface IPluginHost { /// Gets the main window of ReClass.NET. @@ -53,7 +53,7 @@ public interface IPluginHost } [ContractClassFor(typeof(IPluginHost))] - internal abstract class IPluginHostContract : IPluginHost + internal abstract class PluginHostContract : IPluginHost { public ILogger Logger { From 79ae0ab3a6c03866e535321f3f01582f49ec0c45 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 21:36:49 +0200 Subject: [PATCH 078/777] Added ToolStrip. Extracted GuessNumberFormat. --- Forms/MemorySearchForm.Designer.cs | 149 ++++++++++++++++++++++++----- Forms/MemorySearchForm.cs | 40 ++++---- Forms/MemorySearchForm.resx | 14 ++- Util/Util.cs | 21 ++++ 4 files changed, 177 insertions(+), 47 deletions(-) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index b3f5e6c7..ef964ecd 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -63,13 +63,23 @@ private void InitializeComponent() this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); this.memorySearchResultControl = new ReClassNET.UI.MemorySearchResultControl(); - this.memorySearchResultControl2 = new ReClassNET.UI.MemorySearchResultControl(); + this.addressListMemorySearchResultControl = new ReClassNET.UI.MemorySearchResultControl(); + this.toolStripPanel = new System.Windows.Forms.ToolStripPanel(); + this.menuToolStrip = new System.Windows.Forms.ToolStrip(); + this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveAsAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); this.floatingOptionsGroupBox.SuspendLayout(); this.stringOptionsGroupBox.SuspendLayout(); + this.toolStripPanel.SuspendLayout(); + this.menuToolStrip.SuspendLayout(); this.SuspendLayout(); // // bannerBox @@ -78,7 +88,7 @@ private void InitializeComponent() this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Magnifier; this.bannerBox.Location = new System.Drawing.Point(0, 0); this.bannerBox.Name = "bannerBox"; - this.bannerBox.Size = new System.Drawing.Size(611, 48); + this.bannerBox.Size = new System.Drawing.Size(612, 48); this.bannerBox.TabIndex = 7; this.bannerBox.Text = "Search the process memory for specific values."; this.bannerBox.Title = "Memory Searcher"; @@ -276,7 +286,7 @@ private void InitializeComponent() this.flowLayoutPanel1.Controls.Add(this.stringOptionsGroupBox); this.flowLayoutPanel1.Controls.Add(this.scanOptionsGroupBox); this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanel1.Location = new System.Drawing.Point(291, 80); + this.flowLayoutPanel1.Location = new System.Drawing.Point(292, 80); this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); this.flowLayoutPanel1.Name = "flowLayoutPanel1"; this.flowLayoutPanel1.Size = new System.Drawing.Size(317, 294); @@ -304,6 +314,7 @@ private void InitializeComponent() this.roundTruncateRadioButton.Size = new System.Drawing.Size(68, 17); this.roundTruncateRadioButton.TabIndex = 2; this.roundTruncateRadioButton.Text = "Truncate"; + this.infoToolTip.SetToolTip(this.roundTruncateRadioButton, "123.45 == 123.99"); this.roundTruncateRadioButton.UseVisualStyleBackColor = true; // // roundLooseRadioButton @@ -316,6 +327,7 @@ private void InitializeComponent() this.roundLooseRadioButton.TabIndex = 1; this.roundLooseRadioButton.TabStop = true; this.roundLooseRadioButton.Text = "Rounded (loose)"; + this.infoToolTip.SetToolTip(this.roundLooseRadioButton, "123.44 <= x <= 123.46"); this.roundLooseRadioButton.UseVisualStyleBackColor = true; // // roundStrictRadioButton @@ -326,6 +338,7 @@ private void InitializeComponent() this.roundStrictRadioButton.Size = new System.Drawing.Size(100, 17); this.roundStrictRadioButton.TabIndex = 0; this.roundStrictRadioButton.Text = "Rounded (strict)"; + this.infoToolTip.SetToolTip(this.roundStrictRadioButton, "123.45 == 123.454319"); this.roundStrictRadioButton.UseVisualStyleBackColor = true; // // stringOptionsGroupBox @@ -352,6 +365,7 @@ private void InitializeComponent() this.caseSensitiveCheckBox.Size = new System.Drawing.Size(94, 17); this.caseSensitiveCheckBox.TabIndex = 3; this.caseSensitiveCheckBox.Text = "Case sensitive"; + this.infoToolTip.SetToolTip(this.caseSensitiveCheckBox, "ASD == asd"); this.caseSensitiveCheckBox.UseVisualStyleBackColor = true; // // encodingUtf32RadioButton @@ -389,7 +403,7 @@ private void InitializeComponent() // firstScanButton // this.firstScanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.firstScanButton.Location = new System.Drawing.Point(291, 54); + this.firstScanButton.Location = new System.Drawing.Point(292, 54); this.firstScanButton.Name = "firstScanButton"; this.firstScanButton.Size = new System.Drawing.Size(75, 23); this.firstScanButton.TabIndex = 11; @@ -401,7 +415,7 @@ private void InitializeComponent() // this.nextScanButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.nextScanButton.Enabled = false; - this.nextScanButton.Location = new System.Drawing.Point(372, 54); + this.nextScanButton.Location = new System.Drawing.Point(373, 54); this.nextScanButton.Name = "nextScanButton"; this.nextScanButton.Size = new System.Drawing.Size(75, 23); this.nextScanButton.TabIndex = 12; @@ -412,7 +426,7 @@ private void InitializeComponent() // scanProgressBar // this.scanProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.scanProgressBar.Location = new System.Drawing.Point(453, 54); + this.scanProgressBar.Location = new System.Drawing.Point(454, 54); this.scanProgressBar.Name = "scanProgressBar"; this.scanProgressBar.Size = new System.Drawing.Size(149, 23); this.scanProgressBar.TabIndex = 13; @@ -420,7 +434,7 @@ private void InitializeComponent() // resultCountLabel // this.resultCountLabel.AutoSize = true; - this.resultCountLabel.Location = new System.Drawing.Point(8, 54); + this.resultCountLabel.Location = new System.Drawing.Point(8, 59); this.resultCountLabel.Name = "resultCountLabel"; this.resultCountLabel.Size = new System.Drawing.Size(19, 13); this.resultCountLabel.TabIndex = 15; @@ -429,13 +443,14 @@ private void InitializeComponent() // updateValuesTimer // this.updateValuesTimer.Enabled = true; + this.updateValuesTimer.Interval = 1000; this.updateValuesTimer.Tick += new System.EventHandler(this.updateValuesTimer_Tick); // // memorySearchResultControl // this.memorySearchResultControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.memorySearchResultControl.Location = new System.Drawing.Point(11, 70); + this.memorySearchResultControl.Location = new System.Drawing.Point(11, 80); this.memorySearchResultControl.Name = "memorySearchResultControl"; this.memorySearchResultControl.ShowAddressColumn = true; this.memorySearchResultControl.ShowDescriptionColumn = false; @@ -443,28 +458,103 @@ private void InitializeComponent() this.memorySearchResultControl.ShowValueColumn = true; this.memorySearchResultControl.ShowValuesHexadecimal = false; this.memorySearchResultControl.ShowValueTypeColumn = false; - this.memorySearchResultControl.Size = new System.Drawing.Size(267, 302); + this.memorySearchResultControl.Size = new System.Drawing.Size(268, 292); this.memorySearchResultControl.TabIndex = 16; + this.memorySearchResultControl.ResultDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // - // memorySearchResultControl2 + // addressListMemorySearchResultControl // - this.memorySearchResultControl2.Location = new System.Drawing.Point(12, 387); - this.memorySearchResultControl2.Name = "memorySearchResultControl2"; - this.memorySearchResultControl2.ShowAddressColumn = true; - this.memorySearchResultControl2.ShowDescriptionColumn = true; - this.memorySearchResultControl2.ShowPreviousValueColumn = false; - this.memorySearchResultControl2.ShowValueColumn = true; - this.memorySearchResultControl2.ShowValuesHexadecimal = false; - this.memorySearchResultControl2.ShowValueTypeColumn = true; - this.memorySearchResultControl2.Size = new System.Drawing.Size(590, 191); - this.memorySearchResultControl2.TabIndex = 17; + this.addressListMemorySearchResultControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.addressListMemorySearchResultControl.Location = new System.Drawing.Point(11, 402); + this.addressListMemorySearchResultControl.Name = "addressListMemorySearchResultControl"; + this.addressListMemorySearchResultControl.ShowAddressColumn = true; + this.addressListMemorySearchResultControl.ShowDescriptionColumn = true; + this.addressListMemorySearchResultControl.ShowPreviousValueColumn = false; + this.addressListMemorySearchResultControl.ShowValueColumn = true; + this.addressListMemorySearchResultControl.ShowValuesHexadecimal = false; + this.addressListMemorySearchResultControl.ShowValueTypeColumn = true; + this.addressListMemorySearchResultControl.Size = new System.Drawing.Size(592, 169); + this.addressListMemorySearchResultControl.TabIndex = 17; + // + // toolStripPanel + // + this.toolStripPanel.Controls.Add(this.menuToolStrip); + this.toolStripPanel.Location = new System.Drawing.Point(-4, 375); + this.toolStripPanel.Name = "toolStripPanel"; + this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal; + this.toolStripPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.toolStripPanel.RowMargin = new System.Windows.Forms.Padding(0); + this.toolStripPanel.Size = new System.Drawing.Size(591, 25); + // + // menuToolStrip + // + this.menuToolStrip.Dock = System.Windows.Forms.DockStyle.None; + this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openAddressFileToolStripButton, + this.saveAddressFileToolStripButton, + this.saveAsAddressFileToolStripButton, + this.toolStripSeparator1, + this.clearAddressListToolStripButton}); + this.menuToolStrip.Location = new System.Drawing.Point(3, 0); + this.menuToolStrip.Name = "menuToolStrip"; + this.menuToolStrip.Size = new System.Drawing.Size(110, 25); + this.menuToolStrip.TabIndex = 0; + // + // openAddressFileToolStripButton + // + this.openAddressFileToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openAddressFileToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; + this.openAddressFileToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openAddressFileToolStripButton.Name = "openAddressFileToolStripButton"; + this.openAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openAddressFileToolStripButton.ToolTipText = "Open..."; + // + // saveAddressFileToolStripButton + // + this.saveAddressFileToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveAddressFileToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save; + this.saveAddressFileToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveAddressFileToolStripButton.Name = "saveAddressFileToolStripButton"; + this.saveAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveAddressFileToolStripButton.ToolTipText = "Save"; + // + // saveAsAddressFileToolStripButton + // + this.saveAsAddressFileToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveAsAddressFileToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; + this.saveAsAddressFileToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveAsAddressFileToolStripButton.Name = "saveAsAddressFileToolStripButton"; + this.saveAsAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveAsAddressFileToolStripButton.ToolTipText = "Save as..."; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // clearAddressListToolStripButton + // + this.clearAddressListToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.clearAddressListToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Quit; + this.clearAddressListToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.clearAddressListToolStripButton.Name = "clearAddressListToolStripButton"; + this.clearAddressListToolStripButton.Size = new System.Drawing.Size(23, 22); + this.clearAddressListToolStripButton.ToolTipText = "Clear"; + this.clearAddressListToolStripButton.Click += new System.EventHandler(this.clearAddressListToolStripButton_Click); + // + // infoToolTip + // + this.infoToolTip.AutomaticDelay = 100; // // MemorySearchForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(611, 590); - this.Controls.Add(this.memorySearchResultControl2); + this.ClientSize = new System.Drawing.Size(612, 583); + this.Controls.Add(this.toolStripPanel); + this.Controls.Add(this.addressListMemorySearchResultControl); this.Controls.Add(this.memorySearchResultControl); this.Controls.Add(this.resultCountLabel); this.Controls.Add(this.scanProgressBar); @@ -472,6 +562,7 @@ private void InitializeComponent() this.Controls.Add(this.firstScanButton); this.Controls.Add(this.flowLayoutPanel1); this.Controls.Add(this.bannerBox); + this.MinimumSize = new System.Drawing.Size(628, 622); this.Name = "MemorySearchForm"; this.Text = "ReClass.NET - Memory Searcher"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MemorySearchForm_FormClosing); @@ -485,6 +576,10 @@ private void InitializeComponent() this.floatingOptionsGroupBox.PerformLayout(); this.stringOptionsGroupBox.ResumeLayout(false); this.stringOptionsGroupBox.PerformLayout(); + this.toolStripPanel.ResumeLayout(false); + this.toolStripPanel.PerformLayout(); + this.menuToolStrip.ResumeLayout(false); + this.menuToolStrip.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -526,6 +621,14 @@ private void InitializeComponent() private System.Windows.Forms.Label resultCountLabel; private System.Windows.Forms.Timer updateValuesTimer; private UI.MemorySearchResultControl memorySearchResultControl; - private UI.MemorySearchResultControl memorySearchResultControl2; + private UI.MemorySearchResultControl addressListMemorySearchResultControl; + private System.Windows.Forms.ToolStripPanel toolStripPanel; + private System.Windows.Forms.ToolStrip menuToolStrip; + private System.Windows.Forms.ToolStripButton openAddressFileToolStripButton; + private System.Windows.Forms.ToolStripButton saveAddressFileToolStripButton; + private System.Windows.Forms.ToolStripButton saveAsAddressFileToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton clearAddressListToolStripButton; + private System.Windows.Forms.ToolTip infoToolTip; } } \ No newline at end of file diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 4decd937..b1074e5b 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -39,6 +39,10 @@ public MemorySearchForm(RemoteProcess process) InitializeComponent(); + toolStripPanel.RenderMode = ToolStripRenderMode.Professional; + toolStripPanel.Renderer = new CustomToolStripProfessionalRenderer(true, false); + menuToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); + startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); endAddressTextBox.Text = #if RECLASSNET64 @@ -77,7 +81,7 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) private void updateValuesTimer_Tick(object sender, EventArgs e) { memorySearchResultControl.UpdateValues(process); - memorySearchResultControl2.UpdateValues(process); + addressListMemorySearchResultControl.UpdateValues(process); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -305,26 +309,6 @@ private IMemoryComparer CreateComparer(SearchSettings settings) } else if (settings.ValueType == SearchValueType.Float || settings.ValueType == SearchValueType.Double) { - NumberFormatInfo GuessNumberFormat(string input) - { - Contract.Requires(input != null); - Contract.Ensures(Contract.Result() != null); - - if (input.Contains(",") && !input.Contains(".")) - { - return new NumberFormatInfo - { - NumberDecimalSeparator = ",", - NumberGroupSeparator = "." - }; - } - return new NumberFormatInfo - { - NumberDecimalSeparator = ".", - NumberGroupSeparator = "," - }; - } - int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) { Contract.Requires(input != null); @@ -341,9 +325,9 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) return digits; } - var nf1 = GuessNumberFormat(valueDualValueControl.Value1); + var nf1 = Utils.GuessNumberFormat(valueDualValueControl.Value1); double.TryParse(valueDualValueControl.Value1, NumberStyles.Float, nf1, out var value1); - var nf2 = GuessNumberFormat(valueDualValueControl.Value2); + var nf2 = Utils.GuessNumberFormat(valueDualValueControl.Value2); double.TryParse(valueDualValueControl.Value2, NumberStyles.Float, nf2, out var value2); var significantDigits = Math.Max( @@ -376,5 +360,15 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) throw new Exception(); } + + private void clearAddressListToolStripButton_Click(object sender, EventArgs e) + { + addressListMemorySearchResultControl.Clear(); + } + + private void memorySearchResultControl_ResultDoubleClick(object sender, SearchResult result) + { + addressListMemorySearchResultControl.AddSearchResult(result); + } } } diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx index 68ca2f4b..dfb94ff6 100644 --- a/Forms/MemorySearchForm.resx +++ b/Forms/MemorySearchForm.resx @@ -117,7 +117,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 304, 6 + - 17, 17 + 15, 6 + + + 172, 6 + + + 172, 6 + + + 42 \ No newline at end of file diff --git a/Util/Util.cs b/Util/Util.cs index 88083c9d..856e7f3b 100644 --- a/Util/Util.cs +++ b/Util/Util.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; +using System.Globalization; namespace ReClassNET.Util { @@ -49,5 +50,25 @@ public static Size AggregateNodeSizes(Size baseSize, Size newSize) { return new Size(Math.Max(baseSize.Width, newSize.Width), baseSize.Height + newSize.Height); } + + public static NumberFormatInfo GuessNumberFormat(string input) + { + Contract.Requires(input != null); + Contract.Ensures(Contract.Result() != null); + + if (input.Contains(",") && !input.Contains(".")) + { + return new NumberFormatInfo + { + NumberDecimalSeparator = ",", + NumberGroupSeparator = "." + }; + } + return new NumberFormatInfo + { + NumberDecimalSeparator = ".", + NumberGroupSeparator = "," + }; + } } } From a7c58562c88f1ed31bea49baf6134e9139285075 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 21:37:27 +0200 Subject: [PATCH 079/777] Removed import. --- UI/MemoryViewControl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 29e93e88..a66714c9 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -6,7 +6,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; -using ReClassNET.DataExchange; +using ReClassNET.DataExchange.ReClass; using ReClassNET.Debugger; using ReClassNET.Memory; using ReClassNET.Nodes; From 35afbf30384c6d4c446cd9d59e5b4d15a590fa2c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Sep 2017 22:18:09 +0200 Subject: [PATCH 080/777] Added MemoryRecord. --- Forms/MemorySearchForm.Designer.cs | 2 +- Forms/MemorySearchForm.cs | 13 +- MemorySearcher/MemoryRecord.cs | 183 +++++++++++++++++++++ ReClass.NET.csproj | 8 +- UI/MemorySearchResultControl.Designer.cs | 7 +- UI/MemorySearchResultControl.ResultData.cs | 114 ------------- UI/MemorySearchResultControl.cs | 49 ++++-- 7 files changed, 231 insertions(+), 145 deletions(-) create mode 100644 MemorySearcher/MemoryRecord.cs delete mode 100644 UI/MemorySearchResultControl.ResultData.cs diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index ef964ecd..24625600 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -460,7 +460,7 @@ private void InitializeComponent() this.memorySearchResultControl.ShowValueTypeColumn = false; this.memorySearchResultControl.Size = new System.Drawing.Size(268, 292); this.memorySearchResultControl.TabIndex = 16; - this.memorySearchResultControl.ResultDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); + this.memorySearchResultControl.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // // addressListMemorySearchResultControl // diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index b1074e5b..f1a3543d 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -80,8 +80,8 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) private void updateValuesTimer_Tick(object sender, EventArgs e) { - memorySearchResultControl.UpdateValues(process); - addressListMemorySearchResultControl.UpdateValues(process); + memorySearchResultControl.RefreshValues(); + addressListMemorySearchResultControl.RefreshValues(); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -112,10 +112,11 @@ private void ShowResults() SetResultCount(searcher.TotalResultCount); - memorySearchResultControl.SetSearchResults( + memorySearchResultControl.SetRecords( searcher.GetResults() .Take(MaxVisibleResults) .OrderBy(r => r.Address, IntPtrComparer.Instance) + .Select(r => new MemoryRecord(r, process)) ); } @@ -168,7 +169,7 @@ private void Reset() searcher = null; SetResultCount(0); - memorySearchResultControl.SetSearchResults(null); + memorySearchResultControl.SetRecords(null); nextScanButton.Enabled = false; valueTypeComboBox.Enabled = true; @@ -366,9 +367,9 @@ private void clearAddressListToolStripButton_Click(object sender, EventArgs e) addressListMemorySearchResultControl.Clear(); } - private void memorySearchResultControl_ResultDoubleClick(object sender, SearchResult result) + private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) { - addressListMemorySearchResultControl.AddSearchResult(result); + addressListMemorySearchResultControl.AddRecord(record); } } } diff --git a/MemorySearcher/MemoryRecord.cs b/MemorySearcher/MemoryRecord.cs new file mode 100644 index 00000000..44670c1b --- /dev/null +++ b/MemorySearcher/MemoryRecord.cs @@ -0,0 +1,183 @@ +using System; +using System.ComponentModel; +using System.Diagnostics.Contracts; +using System.Globalization; +using ReClassNET.Memory; +using ReClassNET.Util; + +namespace ReClassNET.MemorySearcher +{ + public class MemoryRecord + { + private readonly RemoteProcess process; + + private IntPtr address; + private SearchValueType valueType; + + public IntPtr Address + { + get => HasScanResultAttached ? Result.Address : address; + set { if (!HasScanResultAttached) { address = value; } } + } + public string AddressStr => Result.Address.ToString(Constants.StringHexFormat); + public string Description { get; set; } = string.Empty; + public SearchValueType ValueType + { + get => HasScanResultAttached ? Result.ValueType : valueType; + set { if (!HasScanResultAttached) { valueType = value; } } + } + + public string ValueStr { get; private set; } + public string PreviousValueStr { get; } + + public bool ShowValueHexadecimal { get; set; } + + public bool HasScanResultAttached => Result != null; + + public SearchResult Result { get; } + + public event PropertyChangedEventHandler PropertyChanged; + + public MemoryRecord(RemoteProcess process) + { + Contract.Requires(process != null); + + this.process = process; + } + + public MemoryRecord(SearchResult result, RemoteProcess process) + : this(process) + { + Contract.Requires(result != null); + Contract.Requires(process != null); + + Result = result; + + switch (ValueType) + { + case SearchValueType.Byte: + ValueStr = FormatValue(((ByteSearchResult)result).Value, false); + break; + case SearchValueType.Short: + ValueStr = FormatValue(((ShortSearchResult)result).Value, false); + break; + case SearchValueType.Integer: + ValueStr = FormatValue(((IntegerSearchResult)result).Value, false); + break; + case SearchValueType.Long: + ValueStr = FormatValue(((LongSearchResult)result).Value, false); + break; + case SearchValueType.Float: + ValueStr = FormatValue(((FloatSearchResult)result).Value); + break; + case SearchValueType.Double: + ValueStr = FormatValue(((DoubleSearchResult)result).Value); + break; + case SearchValueType.ArrayOfBytes: + ValueStr = FormatValue((byte[])null); + break; + case SearchValueType.String: + ValueStr = FormatValue(((StringSearchResult)result).Value); + break; + default: + throw new InvalidOperationException(); + } + + PreviousValueStr = ValueStr; + } + + private void NotifyPropertyChanged(string propertyName) + { + var propertyChanged = PropertyChanged; + propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public void RefreshValue() + { + switch (ValueType) + { + case SearchValueType.Byte: + ValueStr = FormatValue(process.ReadRemoteMemory(Address, 1)[0], ShowValueHexadecimal); + break; + case SearchValueType.Short: + ValueStr = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(Address, 2), 0), ShowValueHexadecimal); + break; + case SearchValueType.Integer: + ValueStr = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(Address, 4), 0), ShowValueHexadecimal); + break; + case SearchValueType.Long: + ValueStr = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(Address, 8), 0), ShowValueHexadecimal); + break; + case SearchValueType.Float: + ValueStr = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(Address, 4), 0)); + break; + case SearchValueType.Double: + ValueStr = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(Address, 8), 0)); + break; + case SearchValueType.ArrayOfBytes: + case SearchValueType.String: + return; + } + + NotifyPropertyChanged(nameof(ValueStr)); + } + + public void SetValue(string input, bool isHex) + { + byte[] data = null; + + if (ValueType == SearchValueType.Byte || ValueType == SearchValueType.Short || ValueType == SearchValueType.Integer || ValueType == SearchValueType.Long) + { + var numberStyle = isHex ? NumberStyles.HexNumber : NumberStyles.Integer; + long.TryParse(input, numberStyle, null, out var value); + + switch (ValueType) + { + case SearchValueType.Byte: + data = BitConverter.GetBytes((byte)value); + break; + case SearchValueType.Short: + data = BitConverter.GetBytes((short)value); + break; + case SearchValueType.Integer: + data = BitConverter.GetBytes((int)value); + break; + case SearchValueType.Long: + data = BitConverter.GetBytes(value); + break; + } + } + else if (ValueType == SearchValueType.Float || ValueType == SearchValueType.Double) + { + var nf = Utils.GuessNumberFormat(input); + double.TryParse(input, NumberStyles.Float, nf, out var value); + + switch (ValueType) + { + case SearchValueType.Float: + data = BitConverter.GetBytes((float)value); + break; + case SearchValueType.Double: + data = BitConverter.GetBytes(value); + break; + } + } + + if (data != null) + { + process.WriteRemoteMemory(Address, data); + + RefreshValue(); + } + } + + private static string FormatValue(byte value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); + private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(byte[] value) => "[...]"; + private static string FormatValue(string value) => $"\"{value}\""; + } +} diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index df1231aa..bf5a5a80 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -187,6 +187,7 @@ + @@ -286,9 +287,6 @@ MemorySearchResultControl.cs - - MemorySearchResultControl.cs - MemoryViewControl.cs @@ -860,9 +858,7 @@ - - - + diff --git a/UI/MemorySearchResultControl.Designer.cs b/UI/MemorySearchResultControl.Designer.cs index 1fb98223..4b148ac5 100644 --- a/UI/MemorySearchResultControl.Designer.cs +++ b/UI/MemorySearchResultControl.Designer.cs @@ -60,6 +60,7 @@ private void InitializeComponent() this.resultDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.resultDataGridView.Size = new System.Drawing.Size(290, 327); this.resultDataGridView.TabIndex = 15; + this.resultDataGridView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.resultDataGridView_CellDoubleClick); // // descriptionColumn // @@ -72,7 +73,7 @@ private void InitializeComponent() // addressColumn // this.addressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.addressColumn.DataPropertyName = "Address"; + this.addressColumn.DataPropertyName = "AddressStr"; this.addressColumn.HeaderText = "Address"; this.addressColumn.Name = "addressColumn"; this.addressColumn.ReadOnly = true; @@ -88,7 +89,7 @@ private void InitializeComponent() // // valueColumn // - this.valueColumn.DataPropertyName = "Value"; + this.valueColumn.DataPropertyName = "ValueStr"; this.valueColumn.HeaderText = "Value"; this.valueColumn.Name = "valueColumn"; this.valueColumn.ReadOnly = true; @@ -96,7 +97,7 @@ private void InitializeComponent() // // previousValueColumn // - this.previousValueColumn.DataPropertyName = "Previous"; + this.previousValueColumn.DataPropertyName = "PreviousValueStr"; this.previousValueColumn.HeaderText = "Previous"; this.previousValueColumn.Name = "previousValueColumn"; this.previousValueColumn.ReadOnly = true; diff --git a/UI/MemorySearchResultControl.ResultData.cs b/UI/MemorySearchResultControl.ResultData.cs deleted file mode 100644 index aa61b200..00000000 --- a/UI/MemorySearchResultControl.ResultData.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.ComponentModel; -using System.Diagnostics.Contracts; -using System.Globalization; -using ReClassNET.Memory; -using ReClassNET.MemorySearcher; - -namespace ReClassNET.UI -{ - public partial class MemorySearchResultControl - { - private class ResultData : INotifyPropertyChanged - { - public string Description { get; set; } = string.Empty; - public string Address => Result.Address.ToString(Constants.StringHexFormat); - public string ValueType => Result.ValueType.ToString(); - public string Value { get; private set; } - public string Previous { get; } - - public bool ShowValueHexadecimal { get; set; } - - public SearchResult Result { get; } - - public event PropertyChangedEventHandler PropertyChanged; - - public ResultData(SearchResult result) - { - Contract.Requires(result != null); - - Result = result; - Previous = Value = FormatValue(); - } - - private void NotifyPropertyChanged(string propertyName = null) - { - if (propertyName != null) - { - var propertyChanged = PropertyChanged; - propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - } - - public void UpdateValue(RemoteProcess process) - { - Contract.Requires(process != null); - - var address = Result.Address; - - switch (Result.ValueType) - { - case SearchValueType.Byte: - Value = FormatValue(process.ReadRemoteMemory(address, 1)[0], ShowValueHexadecimal); - break; - case SearchValueType.Short: - Value = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(address, 2), 0), ShowValueHexadecimal); - break; - case SearchValueType.Integer: - Value = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(address, 4), 0), ShowValueHexadecimal); - break; - case SearchValueType.Long: - Value = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(address, 8), 0), ShowValueHexadecimal); - break; - case SearchValueType.Float: - Value = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(address, 4), 0)); - break; - case SearchValueType.Double: - Value = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(address, 8), 0)); - break; - case SearchValueType.ArrayOfBytes: - case SearchValueType.String: - return; - } - - NotifyPropertyChanged(nameof(Value)); - } - - private string FormatValue() - { - Contract.Requires(Result != null); - - switch (Result.ValueType) - { - case SearchValueType.Byte: - return FormatValue(((ByteSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Short: - return FormatValue(((ShortSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Integer: - return FormatValue(((IntegerSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Long: - return FormatValue(((LongSearchResult)Result).Value, ShowValueHexadecimal); - case SearchValueType.Float: - return FormatValue(((FloatSearchResult)Result).Value); - case SearchValueType.Double: - return FormatValue(((DoubleSearchResult)Result).Value); - case SearchValueType.ArrayOfBytes: - return FormatValue((byte[])null); - case SearchValueType.String: - return FormatValue(((StringSearchResult)Result).Value); - default: - throw new InvalidOperationException(); - } - } - - private static string FormatValue(byte value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(byte[] value) => "[...]"; - private static string FormatValue(string value) => $"\"{value}\""; - } - } -} diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs index 0bfb843f..e2bdb502 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemorySearchResultControl.cs @@ -1,16 +1,15 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; -using System.Globalization; using System.Linq; using System.Windows.Forms; -using ReClassNET.Memory; using ReClassNET.MemorySearcher; using ReClassNET.Util; namespace ReClassNET.UI { + public delegate void MemorySearchResultControlResultDoubleClickEventHandler(object sender, MemoryRecord record); + public partial class MemorySearchResultControl : UserControl { public bool ShowDescriptionColumn @@ -45,7 +44,9 @@ public bool ShowPreviousValueColumn public bool ShowValuesHexadecimal { get; set; } - private readonly BindingList bindings; + public event MemorySearchResultControlResultDoubleClickEventHandler RecordDoubleClick; + + private readonly BindingList bindings; public MemorySearchResultControl() { @@ -56,7 +57,7 @@ public MemorySearchResultControl() return; } - bindings = new BindingList + bindings = new BindingList { AllowNew = true, AllowEdit = true, @@ -68,7 +69,7 @@ public MemorySearchResultControl() resultDataGridView.DataSource = bindings; } - public void SetSearchResults(IEnumerable results) + public void SetRecords(IEnumerable results) { Contract.Requires(results != null); @@ -81,7 +82,7 @@ public void SetSearchResults(IEnumerable results) bindings.RaiseListChangedEvents = false; - foreach (var result in results.Select(r => new ResultData(r))) + foreach (var result in results) { bindings.Add(result); } @@ -90,17 +91,35 @@ public void SetSearchResults(IEnumerable results) bindings.ResetBindings(); } - public void UpdateValues(RemoteProcess process) + public void AddRecord(MemoryRecord result) { - Contract.Requires(process != null); + Contract.Requires(result != null); + + bindings.Add(result); + } + + public void Clear() + { + SetRecords(null); + } - foreach (var row in resultDataGridView.GetVisibleRows()) + public void RefreshValues() + { + foreach (var record in resultDataGridView.GetVisibleRows().Select(r => (MemoryRecord)r.DataBoundItem)) { - if (row.DataBoundItem is ResultData result) - { - result.UpdateValue(process); - } + record.RefreshValue(); } } + + private void OnRecordDoubleClick(MemoryRecord record) + { + var evt = RecordDoubleClick; + evt?.Invoke(this, record); + } + + private void resultDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) + { + OnRecordDoubleClick((MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem); + } } } From cfb7c96d05a313e99eea70e79c88de513d2b2051 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 16 Sep 2017 22:09:58 +0200 Subject: [PATCH 081/777] Added ArrayOfBytes value and encoding. --- .../Comparer/ArrayOfBytesMemoryComparer.cs | 7 +++++-- .../Comparer/StringMemoryComparer.cs | 4 ++-- MemorySearcher/SearchResult.cs | 19 ++++++++++++++++++- MemorySearcher/SearchResultStore.cs | 11 +++++++---- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs index 1ff3192b..aa818312 100644 --- a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; using System.Diagnostics.Contracts; namespace ReClassNET.MemorySearcher.Comparer @@ -42,7 +43,9 @@ public bool Compare(byte[] data, int index, out SearchResult result) return false; } - result = new ArrayOfBytesSearchResult(); + var temp = new byte[ValueSize]; + Array.Copy(data, index, temp, 0, temp.Length); + result = new ArrayOfBytesSearchResult(temp); return true; } diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index e5d2455c..0c63e0d0 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -7,7 +7,7 @@ namespace ReClassNET.MemorySearcher.Comparer public class StringMemoryComparer : IMemoryComparer { public SearchCompareType CompareType => SearchCompareType.Equal; - public bool CaseSensitive { get; } = true; + public bool CaseSensitive { get; } public Encoding Encoding { get; } public string Value { get; } public int ValueSize => Value.Length * Encoding.GetMaxByteCount(1); @@ -30,7 +30,7 @@ public bool Compare(byte[] data, int index, out SearchResult result) return false; } - result = new StringSearchResult(value); + result = new StringSearchResult(value, Encoding); return true; } diff --git a/MemorySearcher/SearchResult.cs b/MemorySearcher/SearchResult.cs index 083d85ef..61922ebb 100644 --- a/MemorySearcher/SearchResult.cs +++ b/MemorySearcher/SearchResult.cs @@ -1,4 +1,6 @@ using System; +using System.Diagnostics.Contracts; +using System.Text; namespace ReClassNET.MemorySearcher { @@ -84,6 +86,15 @@ public DoubleSearchResult(double value) public class ArrayOfBytesSearchResult : SearchResult { public override SearchValueType ValueType => SearchValueType.ArrayOfBytes; + + public byte[] Value { get; } + + public ArrayOfBytesSearchResult(byte[] value) + { + Contract.Requires(value != null); + + Value = value; + } } public class StringSearchResult : SearchResult @@ -92,9 +103,15 @@ public class StringSearchResult : SearchResult public string Value { get; } - public StringSearchResult(string value) + public Encoding Encoding { get; } + + public StringSearchResult(string value, Encoding encoding) { + Contract.Requires(value != null); + Contract.Requires(encoding != null); + Value = value; + Encoding = encoding; } } } diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/SearchResultStore.cs index e274132a..6f4f3c87 100644 --- a/MemorySearcher/SearchResultStore.cs +++ b/MemorySearcher/SearchResultStore.cs @@ -24,7 +24,7 @@ private enum StorageMode private StorageMode mode = StorageMode.Memory; - private readonly SearchValueType valueType = SearchValueType.Byte; + private readonly SearchValueType valueType; public int TotalResultCount { get; private set; } @@ -172,10 +172,11 @@ private SearchResult ReadSearchResult(BinaryReader br) result = new DoubleSearchResult(br.ReadDouble()); break; case SearchValueType.ArrayOfBytes: - result = new ArrayOfBytesSearchResult(); + result = new ArrayOfBytesSearchResult(br.ReadBytes(br.ReadInt32())); break; case SearchValueType.String: - result = new StringSearchResult(br.ReadString()); + var encoding = br.ReadInt32(); + result = new StringSearchResult(br.ReadString(), encoding == 0 ? Encoding.UTF8 : encoding == 1 ? Encoding.Unicode : Encoding.UTF32); break; default: throw new ArgumentOutOfRangeException(); @@ -211,9 +212,11 @@ private static void WriteSearchResult(BinaryWriter bw, SearchResult result) bw.Write(doubleSearchResult.Value); break; case ArrayOfBytesSearchResult arrayOfBytesSearchResult: - + bw.Write(arrayOfBytesSearchResult.Value.Length); + bw.Write(arrayOfBytesSearchResult.Value); break; case StringSearchResult stringSearchResult: + bw.Write(stringSearchResult.Encoding == Encoding.UTF8 ? 0 : stringSearchResult.Encoding == Encoding.Unicode ? 1 : 2); bw.Write(stringSearchResult.Value); break; default: From 03fd9f70a9b78e3a09191a905b1afdb513959d5b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 16 Sep 2017 23:10:01 +0200 Subject: [PATCH 082/777] Added GetSimpleByteCountPerChar. --- .../Comparer/StringMemoryComparer.cs | 3 ++- ReClass.NET.csproj | 1 + Util/Extension.Encoding.cs | 20 +++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Util/Extension.Encoding.cs diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index 0c63e0d0..2ba8524b 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Text; +using ReClassNET.Util; namespace ReClassNET.MemorySearcher.Comparer { @@ -10,7 +11,7 @@ public class StringMemoryComparer : IMemoryComparer public bool CaseSensitive { get; } public Encoding Encoding { get; } public string Value { get; } - public int ValueSize => Value.Length * Encoding.GetMaxByteCount(1); + public int ValueSize => Value.Length * Encoding.GetSimpleByteCountPerChar(); public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) { diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index bf5a5a80..04e9a9e7 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -294,6 +294,7 @@ + diff --git a/Util/Extension.Encoding.cs b/Util/Extension.Encoding.cs new file mode 100644 index 00000000..75d61acd --- /dev/null +++ b/Util/Extension.Encoding.cs @@ -0,0 +1,20 @@ +using System; +using System.Text; + +namespace ReClassNET.Util +{ + public static class EncodingExtension + { + /// Gets the (wrong) byte count per character. Special chars may need more bytes per character. + /// The encoding. + /// The byte count per character. + public static int GetSimpleByteCountPerChar(this Encoding encoding) + { + if (encoding == Encoding.UTF8 || encoding == Encoding.ASCII) return 1; + if (encoding == Encoding.Unicode) return 2; + if (encoding == Encoding.UTF32) return 4; + + throw new NotImplementedException(); + } + } +} From dca3868428006d384f8d30131193ec008d73ec62 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 16 Sep 2017 23:35:32 +0200 Subject: [PATCH 083/777] Added relative address highlighting. Added array of byte display. --- Forms/MemorySearchForm.Designer.cs | 1 + Forms/MemorySearchForm.cs | 33 +++++- Forms/MemorySearchForm.resx | 3 - MemorySearcher/MemoryRecord.cs | 177 ++++++++++++++++++++++------- Util/Util.cs | 39 +++++++ 5 files changed, 208 insertions(+), 45 deletions(-) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index 24625600..51aa6cbd 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -564,6 +564,7 @@ private void InitializeComponent() this.Controls.Add(this.bannerBox); this.MinimumSize = new System.Drawing.Size(628, 622); this.Name = "MemorySearchForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "ReClass.NET - Memory Searcher"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MemorySearchForm_FormClosing); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index f1a3543d..001c905f 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -55,6 +55,27 @@ public MemorySearchForm(RemoteProcess process) OnValueTypeChanged(); Reset(); + + process.ProcessAttached += sender => + { + Reset(); + + if (addressListMemorySearchResultControl.Records.Any()) + { + if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + addressListMemorySearchResultControl.Clear(); + } + else + { + foreach (var record in addressListMemorySearchResultControl.Records) + { + record.ResolveAddress(process); + record.RefreshValue(process); + } + } + } + }; } protected override void OnLoad(EventArgs e) @@ -80,8 +101,8 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) private void updateValuesTimer_Tick(object sender, EventArgs e) { - memorySearchResultControl.RefreshValues(); - addressListMemorySearchResultControl.RefreshValues(); + memorySearchResultControl.RefreshValues(process); + addressListMemorySearchResultControl.RefreshValues(process); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -116,7 +137,12 @@ private void ShowResults() searcher.GetResults() .Take(MaxVisibleResults) .OrderBy(r => r.Address, IntPtrComparer.Instance) - .Select(r => new MemoryRecord(r, process)) + .Select(r => + { + var record = new MemoryRecord(r); + record.ResolveAddress(process); + return record; + }) ); } @@ -173,6 +199,7 @@ private void Reset() nextScanButton.Enabled = false; valueTypeComboBox.Enabled = true; + valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == SearchValueType.Integer); floatingOptionsGroupBox.Enabled = true; stringOptionsGroupBox.Enabled = true; diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx index dfb94ff6..e0f6ed97 100644 --- a/Forms/MemorySearchForm.resx +++ b/Forms/MemorySearchForm.resx @@ -126,9 +126,6 @@ 172, 6 - - 172, 6 - 42 diff --git a/MemorySearcher/MemoryRecord.cs b/MemorySearcher/MemoryRecord.cs index 44670c1b..f1ebbc8e 100644 --- a/MemorySearcher/MemoryRecord.cs +++ b/MemorySearcher/MemoryRecord.cs @@ -2,56 +2,76 @@ using System.ComponentModel; using System.Diagnostics.Contracts; using System.Globalization; +using System.Text; using ReClassNET.Memory; using ReClassNET.Util; namespace ReClassNET.MemorySearcher { - public class MemoryRecord + public enum MemoryRecordAddressMode { - private readonly RemoteProcess process; + Absolute, + Relative, + Unknown + } + + public class MemoryRecord : INotifyPropertyChanged + { + private IntPtr addressOrOffset; + private IntPtr realAddress; + private string moduleName; - private IntPtr address; - private SearchValueType valueType; + public MemoryRecordAddressMode AddressMode { get; set; } public IntPtr Address { - get => HasScanResultAttached ? Result.Address : address; - set { if (!HasScanResultAttached) { address = value; } } + get => addressOrOffset; + set + { + addressOrOffset = value; + AddressMode = MemoryRecordAddressMode.Unknown; + } } - public string AddressStr => Result.Address.ToString(Constants.StringHexFormat); - public string Description { get; set; } = string.Empty; - public SearchValueType ValueType + + public string AddressStr => realAddress.ToString(Constants.StringHexFormat); + + public string ModuleName { - get => HasScanResultAttached ? Result.ValueType : valueType; - set { if (!HasScanResultAttached) { valueType = value; } } + get => moduleName; + set + { + moduleName = value; + AddressMode = MemoryRecordAddressMode.Relative; + } } + public bool IsRelativeAddress => !string.IsNullOrEmpty(ModuleName); + + public string Description { get; set; } = string.Empty; + public SearchValueType ValueType { get; set; } public string ValueStr { get; private set; } public string PreviousValueStr { get; } - public bool ShowValueHexadecimal { get; set; } + public int ValueLength { get; set; } - public bool HasScanResultAttached => Result != null; + public Encoding Encoding { get; set; } - public SearchResult Result { get; } + public bool ShowValueHexadecimal { get; set; } public event PropertyChangedEventHandler PropertyChanged; - public MemoryRecord(RemoteProcess process) + public MemoryRecord() { - Contract.Requires(process != null); - this.process = process; } - public MemoryRecord(SearchResult result, RemoteProcess process) - : this(process) + public MemoryRecord(SearchResult result) { Contract.Requires(result != null); - Contract.Requires(process != null); - Result = result; + addressOrOffset = result.Address; + AddressMode = MemoryRecordAddressMode.Unknown; + ValueType = result.ValueType; switch (ValueType) { @@ -74,10 +94,15 @@ public MemoryRecord(SearchResult result, RemoteProcess process) ValueStr = FormatValue(((DoubleSearchResult)result).Value); break; case SearchValueType.ArrayOfBytes: - ValueStr = FormatValue((byte[])null); + var byteData = ((ArrayOfBytesSearchResult)result).Value; + ValueLength = byteData.Length; + ValueStr = FormatValue(byteData); break; case SearchValueType.String: - ValueStr = FormatValue(((StringSearchResult)result).Value); + var strResult = (StringSearchResult)result; + ValueLength = strResult.Value.Length; + Encoding = strResult.Encoding; + ValueStr = FormatValue(strResult.Value); break; default: throw new InvalidOperationException(); @@ -92,38 +117,112 @@ private void NotifyPropertyChanged(string propertyName) propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - public void RefreshValue() + public void ResolveAddress(RemoteProcess process) + { + Contract.Requires(process != null); + + if (AddressMode == MemoryRecordAddressMode.Unknown) + { + realAddress = addressOrOffset; + + var module = process.GetModuleToPointer(addressOrOffset); + if (module != null) + { + addressOrOffset = addressOrOffset.Sub(module.Start); + ModuleName = module.Name; + + AddressMode = MemoryRecordAddressMode.Relative; + } + else + { + AddressMode = MemoryRecordAddressMode.Absolute; + } + } + else if (AddressMode == MemoryRecordAddressMode.Relative) + { + var module = process.GetModuleByName(ModuleName); + if (module != null) + { + realAddress = module.Start.Add(addressOrOffset); + } + } + } + + public void RefreshValue(RemoteProcess process) { + Contract.Requires(process != null); + + byte[] buffer; + switch (ValueType) { case SearchValueType.Byte: - ValueStr = FormatValue(process.ReadRemoteMemory(Address, 1)[0], ShowValueHexadecimal); + buffer = new byte[1]; break; case SearchValueType.Short: - ValueStr = FormatValue(BitConverter.ToInt16(process.ReadRemoteMemory(Address, 2), 0), ShowValueHexadecimal); + buffer = new byte[2]; break; case SearchValueType.Integer: - ValueStr = FormatValue(BitConverter.ToInt32(process.ReadRemoteMemory(Address, 4), 0), ShowValueHexadecimal); - break; - case SearchValueType.Long: - ValueStr = FormatValue(BitConverter.ToInt64(process.ReadRemoteMemory(Address, 8), 0), ShowValueHexadecimal); - break; case SearchValueType.Float: - ValueStr = FormatValue(BitConverter.ToSingle(process.ReadRemoteMemory(Address, 4), 0)); + buffer = new byte[4]; break; + case SearchValueType.Long: case SearchValueType.Double: - ValueStr = FormatValue(BitConverter.ToDouble(process.ReadRemoteMemory(Address, 8), 0)); + buffer = new byte[8]; break; case SearchValueType.ArrayOfBytes: + buffer = new byte[ValueLength]; + break; case SearchValueType.String: - return; + buffer = new byte[ValueLength * Encoding.GetSimpleByteCountPerChar()]; + break; + default: + throw new InvalidOperationException(); + } + + if (process.ReadRemoteMemoryIntoBuffer(realAddress, ref buffer)) + { + switch (ValueType) + { + case SearchValueType.Byte: + ValueStr = FormatValue(buffer[0], ShowValueHexadecimal); + break; + case SearchValueType.Short: + ValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); + break; + case SearchValueType.Integer: + ValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); + break; + case SearchValueType.Long: + ValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); + break; + case SearchValueType.Float: + ValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); + break; + case SearchValueType.Double: + ValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); + break; + case SearchValueType.ArrayOfBytes: + ValueStr = FormatValue(buffer); + break; + case SearchValueType.String: + ValueStr = FormatValue(Encoding.GetString(buffer)); + break; + } + } + else + { + ValueStr = "???"; } NotifyPropertyChanged(nameof(ValueStr)); } - public void SetValue(string input, bool isHex) + public void SetValue(RemoteProcess process, string input, bool isHex) { + Contract.Requires(process != null); + Contract.Requires(input != null); + byte[] data = null; if (ValueType == SearchValueType.Byte || ValueType == SearchValueType.Short || ValueType == SearchValueType.Integer || ValueType == SearchValueType.Long) @@ -165,9 +264,9 @@ public void SetValue(string input, bool isHex) if (data != null) { - process.WriteRemoteMemory(Address, data); + process.WriteRemoteMemory(realAddress, data); - RefreshValue(); + RefreshValue(process); } } @@ -177,7 +276,7 @@ public void SetValue(string input, bool isHex) private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(byte[] value) => "[...]"; - private static string FormatValue(string value) => $"\"{value}\""; + private static string FormatValue(byte[] value) => Utils.ByteArrayToHexString(value); + private static string FormatValue(string value) => value; } } diff --git a/Util/Util.cs b/Util/Util.cs index 856e7f3b..ec84feab 100644 --- a/Util/Util.cs +++ b/Util/Util.cs @@ -70,5 +70,44 @@ public static NumberFormatInfo GuessNumberFormat(string input) NumberGroupSeparator = "," }; } + + private static readonly uint[] hexLookup = CreateHexLookup(); + + private static uint[] CreateHexLookup() + { + var result = new uint[256]; + for (var i = 0; i < 256; i++) + { + var s = i.ToString("X2"); + result[i] = (uint)s[0] + ((uint)s[1] << 16); + } + return result; + } + + public static string ByteArrayToHexString(byte[] data) + { + Contract.Requires(data != null); + + if (data.Length == 0) + { + return string.Empty; + } + + var lookup = hexLookup; + var result = new char[data.Length * 2 + data.Length - 1]; + + var val = lookup[data[0]]; + result[0] = (char)val; + result[1] = (char)(val >> 16); + + for (var i = 1; i < data.Length; i++) + { + val = lookup[data[i]]; + result[2 * i] = ' '; + result[2 * i + 1] = (char)val; + result[2 * i + 2] = (char)(val >> 16); + } + return new string(result); + } } } From 1fc89d1aaf26f65880c329d103b98ae578d69116 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 16 Sep 2017 23:36:08 +0200 Subject: [PATCH 084/777] . --- UI/MemorySearchResultControl.Designer.cs | 1 + UI/MemorySearchResultControl.cs | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/UI/MemorySearchResultControl.Designer.cs b/UI/MemorySearchResultControl.Designer.cs index 4b148ac5..a989a0be 100644 --- a/UI/MemorySearchResultControl.Designer.cs +++ b/UI/MemorySearchResultControl.Designer.cs @@ -61,6 +61,7 @@ private void InitializeComponent() this.resultDataGridView.Size = new System.Drawing.Size(290, 327); this.resultDataGridView.TabIndex = 15; this.resultDataGridView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.resultDataGridView_CellDoubleClick); + this.resultDataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.resultDataGridView_CellFormatting); // // descriptionColumn // diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs index e2bdb502..e32fbbc0 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemorySearchResultControl.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; +using System.Drawing; using System.Linq; using System.Windows.Forms; +using ReClassNET.Memory; using ReClassNET.MemorySearcher; using ReClassNET.Util; @@ -44,6 +46,8 @@ public bool ShowPreviousValueColumn public bool ShowValuesHexadecimal { get; set; } + public IEnumerable Records => bindings; + public event MemorySearchResultControlResultDoubleClickEventHandler RecordDoubleClick; private readonly BindingList bindings; @@ -103,11 +107,13 @@ public void Clear() SetRecords(null); } - public void RefreshValues() + public void RefreshValues(RemoteProcess process) { + Contract.Requires(process != null); + foreach (var record in resultDataGridView.GetVisibleRows().Select(r => (MemoryRecord)r.DataBoundItem)) { - record.RefreshValue(); + record.RefreshValue(process); } } @@ -121,5 +127,18 @@ private void resultDataGridView_CellDoubleClick(object sender, DataGridViewCellE { OnRecordDoubleClick((MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem); } + + private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex == 1) + { + var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; + if (record.IsRelativeAddress) + { + e.CellStyle.ForeColor = Color.ForestGreen; + e.FormattingApplied = true; + } + } + } } } From aef01a0c7782a5ed3544147c83ae07400328498e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 00:56:17 +0200 Subject: [PATCH 085/777] Added pattern matching. --- Forms/MainForm.cs | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index d8dc76bd..1f534814 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -53,7 +53,7 @@ public MainForm(CoreFunctionsManager coreFunctions) toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); remoteProcess = new RemoteProcess(coreFunctions); - remoteProcess.ProcessAttached += (sender) => + remoteProcess.ProcessAttached += sender => { var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; @@ -374,8 +374,7 @@ private void aboutToolStripMenuItem_Click(object sender, EventArgs e) private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) { - var item = sender as IntegerToolStripMenuItem; - if (item == null) + if (!(sender is IntegerToolStripMenuItem item)) { return; } @@ -390,8 +389,7 @@ private void addXBytesToolStripMenuItem_Click(object sender, EventArgs e) private void insertBytesToolStripMenuItem_Click(object sender, EventArgs e) { - var item = sender as IntegerToolStripMenuItem; - if (item == null) + if (!(sender is IntegerToolStripMenuItem item)) { return; } @@ -406,8 +404,7 @@ private void insertXBytesToolStripMenuItem_Click(object sender, EventArgs e) private void memoryTypeToolStripButton_Click(object sender, EventArgs e) { - var item = sender as TypeToolStripButton; - if (item == null) + if (!(sender is TypeToolStripButton item)) { return; } @@ -421,8 +418,7 @@ private void MainForm_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { - var files = e.Data.GetData(DataFormats.FileDrop) as string[]; - if (files != null && files.Any()) + if (e.Data.GetData(DataFormats.FileDrop) is string[] files && files.Any()) { switch (Path.GetExtension(files.First())) { @@ -439,8 +435,7 @@ private void MainForm_DragEnter(object sender, DragEventArgs e) private void MainForm_DragDrop(object sender, DragEventArgs e) { - var files = e.Data.GetData(DataFormats.FileDrop) as string[]; - if (files != null && files.Any()) + if (e.Data.GetData(DataFormats.FileDrop) is string[] files && files.Any()) { try { @@ -484,8 +479,7 @@ private void classesView_ClassSelected(object sender, ClassNode node) private void memoryViewControl_SelectionChanged(object sender, EventArgs e) { - var memoryView = sender as MemoryViewControl; - if (memoryView == null) + if (!(sender is MemoryViewControl memoryView)) { return; } @@ -649,7 +643,7 @@ private void LoadFileFromPath(string filePath, ref ReClassNetProject project) Contract.Ensures(Contract.ValueAtReturn(out project) != null); IReClassImport import = null; - switch (Path.GetExtension(filePath)) + switch (Path.GetExtension(filePath)?.ToLower()) { case ReClassNetFile.FileExtension: import = new ReClassNetFile(project); From afa083f6c03d9e5dfc8f722716edd8158ac65271 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 12:00:51 +0200 Subject: [PATCH 086/777] Reduce number of function calls. --- MemorySearcher/Comparer/StringMemoryComparer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index 2ba8524b..774f8263 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -11,13 +11,14 @@ public class StringMemoryComparer : IMemoryComparer public bool CaseSensitive { get; } public Encoding Encoding { get; } public string Value { get; } - public int ValueSize => Value.Length * Encoding.GetSimpleByteCountPerChar(); + public int ValueSize { get; } public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) { Value = value; Encoding = encoding; CaseSensitive = caseSensitive; + ValueSize = Value.Length * Encoding.GetSimpleByteCountPerChar(); } public bool Compare(byte[] data, int index, out SearchResult result) From da1ce889e332e86caeca27d08b2c6085e1aa35a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 13:58:10 +0200 Subject: [PATCH 087/777] Added record import. --- DataExchange/Scanner/CheatEngineFile.cs | 129 ++++++++++++++++++ DataExchange/Scanner/CrySearchFile.cs | 120 +++++++++++++++++ DataExchange/Scanner/IScannerExport.cs | 24 ++++ DataExchange/Scanner/IScannerImport.cs | 27 ++++ DataExchange/Scanner/ReClassScanFile.cs | 165 ++++++++++++++++++++++++ Forms/MemorySearchForm.Designer.cs | 15 +-- Forms/MemorySearchForm.cs | 55 ++++++++ ReClass.NET.csproj | 5 + 8 files changed, 527 insertions(+), 13 deletions(-) create mode 100644 DataExchange/Scanner/CheatEngineFile.cs create mode 100644 DataExchange/Scanner/CrySearchFile.cs create mode 100644 DataExchange/Scanner/IScannerExport.cs create mode 100644 DataExchange/Scanner/IScannerImport.cs create mode 100644 DataExchange/Scanner/ReClassScanFile.cs diff --git a/DataExchange/Scanner/CheatEngineFile.cs b/DataExchange/Scanner/CheatEngineFile.cs new file mode 100644 index 00000000..f99e220f --- /dev/null +++ b/DataExchange/Scanner/CheatEngineFile.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Xml.Linq; +using ReClassNET.Logger; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.DataExchange.Scanner +{ + public class CheatEngineFile : IScannerImport + { + public const string FormatName = "Cheat Engine Tables"; + public const string FileExtension = ".ct"; + + private const string Version26 = "26"; + + public const string XmlVersionElement = "CheatEngineTableVersion"; + public const string XmlEntriesElement = "CheatEntries"; + public const string XmlEntryElement = "CheatEntry"; + public const string XmlDescriptionElement = "Description"; + public const string XmlValueTypeElement = "VariableType"; + public const string XmlAddressElement = "Address"; + public const string XmlUnicodeElement = "Unicode"; + public const string XmlLengthElement = "Length"; + + public IEnumerable Load(string filePath, ILogger logger) + { + using (var stream = File.OpenRead(filePath)) + { + var document = XDocument.Load(stream); + if (document.Root != null) + { + var version = document.Root.Attribute(XmlVersionElement)?.Value; + if (string.Compare(version, Version26, StringComparison.Ordinal) >= 0) + { + var entries = document.Root.Element(XmlEntriesElement); + if (entries != null) + { + foreach (var entry in entries.Elements(XmlEntryElement)) + { + var description = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty; + if (description == "\"No description\"") + { + description = string.Empty; + } + var variableTypeStr = entry.Element(XmlValueTypeElement)?.Value.Trim() ?? string.Empty; + var valueType = Parse(variableTypeStr, logger); + + var record = new MemoryRecord + { + Description = description, + ValueType = valueType + }; + + var addressStr = entry.Element(XmlAddressElement)?.Value.Trim() ?? string.Empty; + var addressParts = addressStr.Split('+'); + if (addressParts.Length == 2) + { + long.TryParse(addressParts[1], NumberStyles.HexNumber, null, out var value); + record.Address = (IntPtr)value; + + record.ModuleName = addressParts[0].Trim(); + } + else + { + long.TryParse(addressStr, NumberStyles.HexNumber, null, out var value); + record.Address = (IntPtr)value; + } + + if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + { + var lengthStr = entry.Element(XmlLengthElement)?.Value ?? string.Empty; + int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); + + record.ValueLength = Math.Max(1, valueLength); + + if (valueType == SearchValueType.String) + { + var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1"; + + if (isUnicode) + { + record.Encoding = Encoding.Unicode; + } + else + { + record.Encoding = Encoding.UTF8; + } + } + } + + yield return record; + } + } + } + } + } + } + + private static SearchValueType Parse(string value, ILogger logger) + { + switch (value) + { + case "Byte": + return SearchValueType.Byte; + case "2 Bytes": + return SearchValueType.Short; + case "4 Bytes": + return SearchValueType.Integer; + case "8 Bytes": + return SearchValueType.Long; + case "Float": + return SearchValueType.Float; + case "Double": + return SearchValueType.Double; + case "String": + return SearchValueType.String; + case "Array of byte": + return SearchValueType.ArrayOfBytes; + default: + logger?.Log(LogLevel.Warning, $"Unknown value type: {value}"); + + return SearchValueType.Integer; + } + } + } +} diff --git a/DataExchange/Scanner/CrySearchFile.cs b/DataExchange/Scanner/CrySearchFile.cs new file mode 100644 index 00000000..9c6a3a37 --- /dev/null +++ b/DataExchange/Scanner/CrySearchFile.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Xml.Linq; +using ReClassNET.Logger; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.DataExchange.Scanner +{ + public class CrySearchFile : IScannerImport + { + public const string FormatName = "CrySearch Address Tables"; + public const string FileExtension = ".csat"; + + private const string Version3 = "3.0"; + + public const string XmlVersionElement = "CrySearchVersion"; + public const string XmlEntriesElement = "Entries"; + public const string XmlItemElement = "item"; + public const string XmlDescriptionElement = "Description"; + public const string XmlValueTypeElement = "ValueType"; + public const string XmlAddressElement = "Address"; + public const string XmlModuleNameElement = "ModuleName"; + public const string XmlIsRelativeElement = "IsRelative"; + public const string XmlSizeElement = "Size"; + + public const string XmlValueAttribute = "value"; + + public IEnumerable Load(string filePath, ILogger logger) + { + var document = XDocument.Load(filePath); + if (document.Root != null) + { + var version = document.Root.Element(XmlVersionElement)?.Value; + if (string.Compare(version, Version3, StringComparison.Ordinal) >= 0) + { + var entries = document.Root.Element(XmlEntriesElement); + if (entries != null) + { + foreach (var entry in entries.Elements(XmlItemElement)) + { + var description = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty; + var valueTypeStr = entry.Element(XmlValueTypeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty; + var addressStr = entry.Element(XmlAddressElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty; + var moduleName = entry.Element(XmlModuleNameElement)?.Value.Trim() ?? string.Empty; + + long.TryParse(addressStr, NumberStyles.Number, null, out var value); + var valueType = Parse(valueTypeStr, logger); + + var record = new MemoryRecord + { + Address = (IntPtr)value, + Description = description, + ValueType = valueType + }; + + if ((entry.Element(XmlIsRelativeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty) == "1" && !string.IsNullOrEmpty(moduleName)) + { + record.ModuleName = moduleName; + } + + if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + { + var lengthStr = (entry.Element(XmlSizeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty); + int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); + + record.ValueLength = Math.Max(1, valueLength); + + if (valueType == SearchValueType.String) + { + switch (valueTypeStr) + { + default: + case "8": + record.Encoding = Encoding.UTF8; + break; + case "9": + record.Encoding = Encoding.Unicode; + break; + } + } + } + + yield return record; + } + } + } + } + } + + private static SearchValueType Parse(string value, ILogger logger) + { + switch (value) + { + case "1": + return SearchValueType.Byte; + case "2": + return SearchValueType.Short; + case "3": + return SearchValueType.Integer; + case "4": + return SearchValueType.Long; + case "5": + return SearchValueType.Float; + case "6": + return SearchValueType.Double; + case "7": + return SearchValueType.ArrayOfBytes; + case "8": + case "9": + return SearchValueType.String; + default: + logger?.Log(LogLevel.Warning, $"Unknown value type: {value}"); + + return SearchValueType.Integer; + } + } + } +} diff --git a/DataExchange/Scanner/IScannerExport.cs b/DataExchange/Scanner/IScannerExport.cs new file mode 100644 index 00000000..64d52aa8 --- /dev/null +++ b/DataExchange/Scanner/IScannerExport.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using ReClassNET.Logger; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.DataExchange.Scanner +{ + [ContractClass(typeof(ScannerExportContract))] + public interface IScannerExport + { + void Save(IEnumerable records, string filePath, ILogger logger); + } + + [ContractClassFor(typeof(IScannerExport))] + internal abstract class ScannerExportContract : IScannerExport + { + public void Save(IEnumerable records, string filePath, ILogger logger) + { + Contract.Requires(records != null); + Contract.Requires(filePath != null); + Contract.Requires(logger != null); + } + } +} diff --git a/DataExchange/Scanner/IScannerImport.cs b/DataExchange/Scanner/IScannerImport.cs new file mode 100644 index 00000000..7ffbde3e --- /dev/null +++ b/DataExchange/Scanner/IScannerImport.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using ReClassNET.Logger; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.DataExchange.Scanner +{ + [ContractClass(typeof(ScannerImportContract))] + public interface IScannerImport + { + IEnumerable Load(string filePath, ILogger logger); + } + + [ContractClassFor(typeof(IScannerImport))] + internal abstract class ScannerImportContract : IScannerImport + { + public IEnumerable Load(string filePath, ILogger logger) + { + Contract.Requires(filePath != null); + Contract.Requires(logger != null); + Contract.Ensures(Contract.Result>() != null); + + throw new NotImplementedException(); + } + } +} diff --git a/DataExchange/Scanner/ReClassScanFile.cs b/DataExchange/Scanner/ReClassScanFile.cs new file mode 100644 index 00000000..d33a609e --- /dev/null +++ b/DataExchange/Scanner/ReClassScanFile.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Xml.Linq; +using ReClassNET.Logger; +using ReClassNET.MemorySearcher; + +namespace ReClassNET.DataExchange.Scanner +{ + public class ReClassScanFile : IScannerImport, IScannerExport + { + public const string FormatName = "ReClass.NET Scanner File"; + public const string FileExtension = ".rcnetscan"; + + private const string Version1 = "1"; + + private const string DataFileName = "Data.xml"; + + public const string XmlRootElement = "records"; + public const string XmlRecordElement = "record"; + + public const string XmlVersionAttribute = "version"; + public const string XmlPlatformAttribute = "platform"; + public const string XmlValueTypeAttribute = "type"; + public const string XmlAddressAttribute = "address"; + public const string XmlModuleAttribute = "module"; + public const string XmlValueLengthAttribute = "length"; + public const string XmlEncodingAttribute = "encoding"; + + public IEnumerable Load(string filePath, ILogger logger) + { + using (var fs = new FileStream(filePath, FileMode.Open)) + { + using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) + { + var dataEntry = archive.GetEntry(DataFileName); + if (dataEntry == null) + { + throw new FormatException(); + } + using (var entryStream = dataEntry.Open()) + { + var document = XDocument.Load(entryStream); + if (document.Root == null) + { + logger.Log(LogLevel.Error, "File has not the correct format."); + yield break; + } + + //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; + if (platform != Constants.Platform) + { + logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); + } + + foreach (var element in document.Root.Elements(XmlRecordElement)) + { + var valueTypeStr = element.Attribute(XmlValueTypeAttribute)?.Value ?? string.Empty; + + if (!Enum.TryParse(valueTypeStr, out var valueType)) + { + logger?.Log(LogLevel.Warning, $"Unknown value type: {valueTypeStr}"); + continue; + } + + var addressStr = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty; + var moduleName = element.Attribute(XmlModuleAttribute)?.Value ?? string.Empty; + + long.TryParse(addressStr, NumberStyles.HexNumber, null, out var address); + + var record = new MemoryRecord + { + Address = (IntPtr)address, + ValueType = valueType + }; + + if (!string.IsNullOrEmpty(moduleName)) + { + record.ModuleName = moduleName; + } + + if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + { + var lengthStr = element.Attribute(XmlValueLengthAttribute)?.Value ?? string.Empty; + int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); + + record.ValueLength = Math.Max(1, valueLength); + + if (valueType == SearchValueType.String) + { + switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty) + { + default: + case "UTF8": + record.Encoding = Encoding.UTF8; + break; + case "UTF16": + record.Encoding = Encoding.Unicode; + break; + case "UTF32": + record.Encoding = Encoding.UTF32; + break; + } + } + } + + yield return record; + } + } + } + } + } + + public void Save(IEnumerable records, string filePath, ILogger logger) + { + using (var fs = new FileStream(filePath, FileMode.Create)) + { + using (var archive = new ZipArchive(fs, ZipArchiveMode.Create)) + { + var dataEntry = archive.CreateEntry(DataFileName); + using (var entryStream = dataEntry.Open()) + { + var document = new XDocument( + new XComment($"{Constants.ApplicationName} Scanner {Constants.ApplicationVersion} by {Constants.Author}"), + new XComment($"Website: {Constants.HomepageUrl}"), + new XElement( + XmlRootElement, + new XAttribute(XmlVersionAttribute, Version1), + new XAttribute(XmlPlatformAttribute, Constants.Platform), + records.Select(r => + { + var temp = new XElement( + XmlRecordElement, + new XAttribute(XmlValueTypeAttribute, r.ValueType.ToString()), + new XAttribute(XmlAddressAttribute, r.Address.ToString(Constants.StringHexFormat)) + ); + if (r.IsRelativeAddress) + { + temp.SetAttributeValue(XmlModuleAttribute, r.ModuleName); + } + if (r.ValueType == SearchValueType.ArrayOfBytes || r.ValueType == SearchValueType.String) + { + temp.SetAttributeValue(XmlValueLengthAttribute, r.ValueLength); + if (r.ValueType == SearchValueType.String) + { + temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding == Encoding.UTF8 ? "UTF8" : r.Encoding == Encoding.Unicode ? "UTF16" : "UTF32"); + } + } + return temp; + }) + ) + ); + + document.Save(entryStream); + } + } + } + } + } +} diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index 51aa6cbd..c45f1403 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -68,7 +68,6 @@ private void InitializeComponent() this.menuToolStrip = new System.Windows.Forms.ToolStrip(); this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); this.saveAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); - this.saveAsAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); @@ -494,12 +493,11 @@ private void InitializeComponent() this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openAddressFileToolStripButton, this.saveAddressFileToolStripButton, - this.saveAsAddressFileToolStripButton, this.toolStripSeparator1, this.clearAddressListToolStripButton}); this.menuToolStrip.Location = new System.Drawing.Point(3, 0); this.menuToolStrip.Name = "menuToolStrip"; - this.menuToolStrip.Size = new System.Drawing.Size(110, 25); + this.menuToolStrip.Size = new System.Drawing.Size(87, 25); this.menuToolStrip.TabIndex = 0; // // openAddressFileToolStripButton @@ -510,6 +508,7 @@ private void InitializeComponent() this.openAddressFileToolStripButton.Name = "openAddressFileToolStripButton"; this.openAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); this.openAddressFileToolStripButton.ToolTipText = "Open..."; + this.openAddressFileToolStripButton.Click += new System.EventHandler(this.openAddressFileToolStripButton_Click); // // saveAddressFileToolStripButton // @@ -520,15 +519,6 @@ private void InitializeComponent() this.saveAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); this.saveAddressFileToolStripButton.ToolTipText = "Save"; // - // saveAsAddressFileToolStripButton - // - this.saveAsAddressFileToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.saveAsAddressFileToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; - this.saveAsAddressFileToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.saveAsAddressFileToolStripButton.Name = "saveAsAddressFileToolStripButton"; - this.saveAsAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); - this.saveAsAddressFileToolStripButton.ToolTipText = "Save as..."; - // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; @@ -627,7 +617,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStrip menuToolStrip; private System.Windows.Forms.ToolStripButton openAddressFileToolStripButton; private System.Windows.Forms.ToolStripButton saveAddressFileToolStripButton; - private System.Windows.Forms.ToolStripButton saveAsAddressFileToolStripButton; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripButton clearAddressListToolStripButton; private System.Windows.Forms.ToolTip infoToolTip; diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 001c905f..864dbe45 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -5,11 +5,14 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Globalization; +using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using ReClassNET.DataExchange.Scanner; +using ReClassNET.Logger; using ReClassNET.Memory; using ReClassNET.MemorySearcher; using ReClassNET.MemorySearcher.Comparer; @@ -398,5 +401,57 @@ private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRe { addressListMemorySearchResultControl.AddRecord(record); } + + private void openAddressFileToolStripButton_Click(object sender, EventArgs e) + { + using (var ofd = new OpenFileDialog()) + { + ofd.CheckFileExists = true; + ofd.Filter = $"All Scanner Types |*{ReClassScanFile.FileExtension};*{CheatEngineFile.FileExtension};*{CrySearchFile.FileExtension}" + + $"|{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" + + $"|{CheatEngineFile.FormatName} (*{CheatEngineFile.FileExtension})|*{CheatEngineFile.FileExtension}" + + $"|{CrySearchFile.FormatName} (*{CrySearchFile.FileExtension})|*{CrySearchFile.FileExtension}"; + + if (ofd.ShowDialog() == DialogResult.OK) + { + IScannerImport import = null; + switch (Path.GetExtension(ofd.FileName)?.ToLower()) + { + case ReClassScanFile.FileExtension: + import = new ReClassScanFile(); + break; + case CheatEngineFile.FileExtension: + import = new CheatEngineFile(); + break; + case CrySearchFile.FileExtension: + import = new CrySearchFile(); + break; + default: + Program.Logger.Log(LogLevel.Error, $"The file '{ofd.FileName}' has an unknown type."); + break; + } + if (import != null) + { + if (addressListMemorySearchResultControl.Records.Any()) + { + if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + } + + addressListMemorySearchResultControl.SetRecords( + import.Load(ofd.FileName, Program.Logger) + .Select(r => + { + r.ResolveAddress(process); + r.RefreshValue(process); + return r; + }) + ); + } + } + } + } } } diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 04e9a9e7..7489c200 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -151,6 +151,11 @@ + + + + + From 4f04401f555b753b8d3f50ceeabbb3a71c1f1e75 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:02:50 +0200 Subject: [PATCH 088/777] Rename Search -> Scan (Part 1). --- DataExchange/Scanner/CheatEngineFile.cs | 24 +++---- DataExchange/Scanner/CrySearchFile.cs | 24 +++---- DataExchange/Scanner/ReClassScanFile.cs | 10 +-- Forms/MemorySearchForm.cs | 66 +++++++++--------- .../Comparer/ArrayOfBytesMemoryComparer.cs | 6 +- MemorySearcher/Comparer/ByteMemoryComparer.cs | 56 +++++++-------- .../Comparer/DoubleMemoryComparer.cs | 64 ++++++++--------- .../Comparer/FloatMemoryComparer.cs | 64 ++++++++--------- MemorySearcher/Comparer/IMemoryComparer.cs | 6 +- .../Comparer/IntegerMemoryComparer.cs | 56 +++++++-------- MemorySearcher/Comparer/LongMemoryComparer.cs | 56 +++++++-------- .../Comparer/ShortMemoryComparer.cs | 56 +++++++-------- .../Comparer/StringMemoryComparer.cs | 6 +- MemorySearcher/InvalidCompareTypeException.cs | 2 +- MemorySearcher/MemoryRecord.cs | 68 +++++++++---------- ...earchCompareType.cs => ScanCompareType.cs} | 2 +- .../{SearchContext.cs => ScanContext.cs} | 8 +-- .../{SearchResult.cs => ScanResult.cs} | 36 +++++----- ...earchResultBlock.cs => ScanResultBlock.cs} | 6 +- ...earchResultStore.cs => ScanResultStore.cs} | 42 ++++++------ .../{SearchRoundMode.cs => ScanRoundMode.cs} | 2 +- .../{SearchSettings.cs => ScanSettings.cs} | 4 +- .../{SearchValueType.cs => ScanValueType.cs} | 2 +- MemorySearcher/{Searcher.cs => Scanner.cs} | 26 +++---- .../{SearchWorker.cs => ScannerWorker.cs} | 10 +-- ReClass.NET.csproj | 20 +++--- 26 files changed, 361 insertions(+), 361 deletions(-) rename MemorySearcher/{SearchCompareType.cs => ScanCompareType.cs} (96%) rename MemorySearcher/{SearchContext.cs => ScanContext.cs} (70%) rename MemorySearcher/{SearchResult.cs => ScanResult.cs} (53%) rename MemorySearcher/{SearchResultBlock.cs => ScanResultBlock.cs} (62%) rename MemorySearcher/{SearchResultStore.cs => ScanResultStore.cs} (80%) rename MemorySearcher/{SearchRoundMode.cs => ScanRoundMode.cs} (73%) rename MemorySearcher/{SearchSettings.cs => ScanSettings.cs} (88%) rename MemorySearcher/{SearchValueType.cs => ScanValueType.cs} (93%) rename MemorySearcher/{Searcher.cs => Scanner.cs} (89%) rename MemorySearcher/{SearchWorker.cs => ScannerWorker.cs} (78%) diff --git a/DataExchange/Scanner/CheatEngineFile.cs b/DataExchange/Scanner/CheatEngineFile.cs index f99e220f..025eb86c 100644 --- a/DataExchange/Scanner/CheatEngineFile.cs +++ b/DataExchange/Scanner/CheatEngineFile.cs @@ -69,14 +69,14 @@ public IEnumerable Load(string filePath, ILogger logger) record.Address = (IntPtr)value; } - if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { var lengthStr = entry.Element(XmlLengthElement)?.Value ?? string.Empty; int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); record.ValueLength = Math.Max(1, valueLength); - if (valueType == SearchValueType.String) + if (valueType == ScanValueType.String) { var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1"; @@ -99,30 +99,30 @@ public IEnumerable Load(string filePath, ILogger logger) } } - private static SearchValueType Parse(string value, ILogger logger) + private static ScanValueType Parse(string value, ILogger logger) { switch (value) { case "Byte": - return SearchValueType.Byte; + return ScanValueType.Byte; case "2 Bytes": - return SearchValueType.Short; + return ScanValueType.Short; case "4 Bytes": - return SearchValueType.Integer; + return ScanValueType.Integer; case "8 Bytes": - return SearchValueType.Long; + return ScanValueType.Long; case "Float": - return SearchValueType.Float; + return ScanValueType.Float; case "Double": - return SearchValueType.Double; + return ScanValueType.Double; case "String": - return SearchValueType.String; + return ScanValueType.String; case "Array of byte": - return SearchValueType.ArrayOfBytes; + return ScanValueType.ArrayOfBytes; default: logger?.Log(LogLevel.Warning, $"Unknown value type: {value}"); - return SearchValueType.Integer; + return ScanValueType.Integer; } } } diff --git a/DataExchange/Scanner/CrySearchFile.cs b/DataExchange/Scanner/CrySearchFile.cs index 9c6a3a37..010e9a44 100644 --- a/DataExchange/Scanner/CrySearchFile.cs +++ b/DataExchange/Scanner/CrySearchFile.cs @@ -60,14 +60,14 @@ public IEnumerable Load(string filePath, ILogger logger) record.ModuleName = moduleName; } - if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { var lengthStr = (entry.Element(XmlSizeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty); int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); record.ValueLength = Math.Max(1, valueLength); - if (valueType == SearchValueType.String) + if (valueType == ScanValueType.String) { switch (valueTypeStr) { @@ -89,31 +89,31 @@ public IEnumerable Load(string filePath, ILogger logger) } } - private static SearchValueType Parse(string value, ILogger logger) + private static ScanValueType Parse(string value, ILogger logger) { switch (value) { case "1": - return SearchValueType.Byte; + return ScanValueType.Byte; case "2": - return SearchValueType.Short; + return ScanValueType.Short; case "3": - return SearchValueType.Integer; + return ScanValueType.Integer; case "4": - return SearchValueType.Long; + return ScanValueType.Long; case "5": - return SearchValueType.Float; + return ScanValueType.Float; case "6": - return SearchValueType.Double; + return ScanValueType.Double; case "7": - return SearchValueType.ArrayOfBytes; + return ScanValueType.ArrayOfBytes; case "8": case "9": - return SearchValueType.String; + return ScanValueType.String; default: logger?.Log(LogLevel.Warning, $"Unknown value type: {value}"); - return SearchValueType.Integer; + return ScanValueType.Integer; } } } diff --git a/DataExchange/Scanner/ReClassScanFile.cs b/DataExchange/Scanner/ReClassScanFile.cs index d33a609e..dc5163c8 100644 --- a/DataExchange/Scanner/ReClassScanFile.cs +++ b/DataExchange/Scanner/ReClassScanFile.cs @@ -62,7 +62,7 @@ public IEnumerable Load(string filePath, ILogger logger) { var valueTypeStr = element.Attribute(XmlValueTypeAttribute)?.Value ?? string.Empty; - if (!Enum.TryParse(valueTypeStr, out var valueType)) + if (!Enum.TryParse(valueTypeStr, out var valueType)) { logger?.Log(LogLevel.Warning, $"Unknown value type: {valueTypeStr}"); continue; @@ -84,14 +84,14 @@ public IEnumerable Load(string filePath, ILogger logger) record.ModuleName = moduleName; } - if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { var lengthStr = element.Attribute(XmlValueLengthAttribute)?.Value ?? string.Empty; int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); record.ValueLength = Math.Max(1, valueLength); - if (valueType == SearchValueType.String) + if (valueType == ScanValueType.String) { switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty) { @@ -143,10 +143,10 @@ public void Save(IEnumerable records, string filePath, ILogger log { temp.SetAttributeValue(XmlModuleAttribute, r.ModuleName); } - if (r.ValueType == SearchValueType.ArrayOfBytes || r.ValueType == SearchValueType.String) + if (r.ValueType == ScanValueType.ArrayOfBytes || r.ValueType == ScanValueType.String) { temp.SetAttributeValue(XmlValueLengthAttribute, r.ValueLength); - if (r.ValueType == SearchValueType.String) + if (r.ValueType == ScanValueType.String) { temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding == Encoding.UTF8 ? "UTF8" : r.Encoding == Encoding.Unicode ? "UTF16" : "UTF32"); } diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index 864dbe45..d9afb811 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -29,10 +29,10 @@ public partial class MemorySearchForm : IconForm private bool isFirstScan; - private Searcher searcher; + private Scanner searcher; - private SearchCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); - private SearchValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + private ScanCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + private ScanValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); public MemorySearchForm(RemoteProcess process) { @@ -54,7 +54,7 @@ public MemorySearchForm(RemoteProcess process) int.MaxValue.ToString(Constants.StringHexFormat); #endif - valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); + valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); OnValueTypeChanged(); Reset(); @@ -158,37 +158,37 @@ private void OnValueTypeChanged() int alignment = 1; switch (valueType) { - case SearchValueType.Short: + case ScanValueType.Short: alignment = 2; break; - case SearchValueType.Integer: - case SearchValueType.Long: - case SearchValueType.Float: - case SearchValueType.Double: + case ScanValueType.Integer: + case ScanValueType.Long: + case ScanValueType.Float: + case ScanValueType.Double: alignment = 4; break; } fastScanAlignmentTextBox.Text = alignment.ToString(); - floatingOptionsGroupBox.Visible = valueType == SearchValueType.Float || valueType == SearchValueType.Double; - stringOptionsGroupBox.Visible = valueType == SearchValueType.String; + floatingOptionsGroupBox.Visible = valueType == ScanValueType.Float || valueType == ScanValueType.Double; + stringOptionsGroupBox.Visible = valueType == ScanValueType.String; } private void SetValidCompareTypes() { var valueType = SelectedValueType; - if (valueType == SearchValueType.ArrayOfBytes || valueType == SearchValueType.String) + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { - scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(SearchCompareType.Equal); + scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(ScanCompareType.Equal); } else { scanTypeComboBox.DataSource = isFirstScan - ? EnumDescriptionDisplay.CreateExclude( - SearchCompareType.Changed, SearchCompareType.NotChanged, SearchCompareType.Decreased, SearchCompareType.DecreasedOrEqual, - SearchCompareType.Increased, SearchCompareType.IncreasedOrEqual + ? EnumDescriptionDisplay.CreateExclude( + ScanCompareType.Changed, ScanCompareType.NotChanged, ScanCompareType.Decreased, ScanCompareType.DecreasedOrEqual, + ScanCompareType.Increased, ScanCompareType.IncreasedOrEqual ) - : EnumDescriptionDisplay.CreateExclude(SearchCompareType.Unknown); + : EnumDescriptionDisplay.CreateExclude(ScanCompareType.Unknown); } } @@ -202,7 +202,7 @@ private void Reset() nextScanButton.Enabled = false; valueTypeComboBox.Enabled = true; - valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == SearchValueType.Integer); + valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); floatingOptionsGroupBox.Enabled = true; stringOptionsGroupBox.Enabled = true; @@ -221,7 +221,7 @@ private async Task OnStartFirstScan() var settings = CreateSearchSettings(); var comparer = CreateComparer(settings); - searcher = new Searcher(process, settings); + searcher = new Scanner(process, settings); var report = new Progress(i => scanProgressBar.Value = i); var completed = await searcher.Search(comparer, CancellationToken.None, report); @@ -274,9 +274,9 @@ private async Task OnStartSecondScan() } } - private SearchSettings CreateSearchSettings() + private ScanSettings CreateSearchSettings() { - var settings = new SearchSettings + var settings = new ScanSettings { ValueType = SelectedValueType }; @@ -314,13 +314,13 @@ SettingState CheckStateToSettingState(CheckState state) return settings; } - private IMemoryComparer CreateComparer(SearchSettings settings) + private IMemoryComparer CreateComparer(ScanSettings settings) { Contract.Requires(settings != null); var compareType = SelectedCompareType; - if (settings.ValueType == SearchValueType.Byte || settings.ValueType == SearchValueType.Short || settings.ValueType == SearchValueType.Integer || settings.ValueType == SearchValueType.Long) + if (settings.ValueType == ScanValueType.Byte || settings.ValueType == ScanValueType.Short || settings.ValueType == ScanValueType.Integer || settings.ValueType == ScanValueType.Long) { var numberStyle = isHexCheckBox.Checked ? NumberStyles.HexNumber : NumberStyles.Integer; long.TryParse(valueDualValueControl.Value1, numberStyle, null, out var value1); @@ -328,17 +328,17 @@ private IMemoryComparer CreateComparer(SearchSettings settings) switch (settings.ValueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: return new ByteMemoryComparer(compareType, (byte)value1, (byte)value2); - case SearchValueType.Short: + case ScanValueType.Short: return new ShortMemoryComparer(compareType, (short)value1, (short)value2); - case SearchValueType.Integer: + case ScanValueType.Integer: return new IntegerMemoryComparer(compareType, (int)value1, (int)value2); - case SearchValueType.Long: + case ScanValueType.Long: return new LongMemoryComparer(compareType, value1, value2); } } - else if (settings.ValueType == SearchValueType.Float || settings.ValueType == SearchValueType.Double) + else if (settings.ValueType == ScanValueType.Float || settings.ValueType == ScanValueType.Double) { int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) { @@ -366,23 +366,23 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) CalculateSignificantDigits(valueDualValueControl.Value2, nf2) ); - var roundMode = roundStrictRadioButton.Checked ? SearchRoundMode.Strict : roundLooseRadioButton.Checked ? SearchRoundMode.Normal : SearchRoundMode.Truncate; + var roundMode = roundStrictRadioButton.Checked ? ScanRoundMode.Strict : roundLooseRadioButton.Checked ? ScanRoundMode.Normal : ScanRoundMode.Truncate; switch (settings.ValueType) { - case SearchValueType.Float: + case ScanValueType.Float: return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2); - case SearchValueType.Double: + case ScanValueType.Double: return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2); } } - else if (settings.ValueType == SearchValueType.ArrayOfBytes) + else if (settings.ValueType == ScanValueType.ArrayOfBytes) { var pattern = BytePattern.Parse(valueDualValueControl.Value1); return new ArrayOfBytesMemoryComparer(pattern); } - else if (settings.ValueType == SearchValueType.String) + else if (settings.ValueType == ScanValueType.String) { var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs index aa818312..bc1fecf6 100644 --- a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -6,7 +6,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ArrayOfBytesMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType => SearchCompareType.Equal; + public ScanCompareType CompareType => ScanCompareType.Equal; public BytePattern Value { get; } public int ValueSize => Value.Length; @@ -24,7 +24,7 @@ public ArrayOfBytesMemoryComparer(BytePattern value) } } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -50,7 +50,7 @@ public bool Compare(byte[] data, int index, out SearchResult result) return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is ArrayOfBytesSearchResult); diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemorySearcher/Comparer/ByteMemoryComparer.cs index 3a4d3a86..ccf3a3c2 100644 --- a/MemorySearcher/Comparer/ByteMemoryComparer.cs +++ b/MemorySearcher/Comparer/ByteMemoryComparer.cs @@ -5,19 +5,19 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ByteMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } + public ScanCompareType CompareType { get; } public byte Value1 { get; } public byte Value2 { get; } public int ValueSize => sizeof(byte); - public ByteMemoryComparer(SearchCompareType compareType, byte value1, byte value2) + public ByteMemoryComparer(ScanCompareType compareType, byte value1, byte value2) { CompareType = compareType; Value1 = value1; Value2 = value2; } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -27,23 +27,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -60,7 +60,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is ByteSearchResult); @@ -69,7 +69,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (ByteSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, ByteSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ByteSearchResult previous, out ScanResult result) { result = null; @@ -79,33 +79,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs index cf55ea7c..4d006916 100644 --- a/MemorySearcher/Comparer/DoubleMemoryComparer.cs +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -6,8 +6,8 @@ namespace ReClassNET.MemorySearcher.Comparer { public class DoubleMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } - public SearchRoundMode RoundType { get; } + public ScanCompareType CompareType { get; } + public ScanRoundMode RoundType { get; } public double Value1 { get; } public double Value2 { get; } public int ValueSize => sizeof(double); @@ -16,7 +16,7 @@ public class DoubleMemoryComparer : IMemoryComparer private readonly double minValue; private readonly double maxValue; - public DoubleMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, int significantDigits, double value1, double value2) + public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, double value1, double value2) { CompareType = compareType; RoundType = roundType; @@ -34,18 +34,18 @@ private bool CheckRoundedEquality(double value) { switch (RoundType) { - case SearchRoundMode.Strict: + case ScanRoundMode.Strict: return Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); - case SearchRoundMode.Normal: + case ScanRoundMode.Normal: return minValue < value && value < maxValue; - case SearchRoundMode.Truncate: + case ScanRoundMode.Truncate: return (long)value == (long)Value1; default: throw new ArgumentOutOfRangeException(); } } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -55,23 +55,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return !CheckRoundedEquality(value); - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -88,7 +88,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is DoubleSearchResult); @@ -97,7 +97,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (DoubleSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, DoubleSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, DoubleSearchResult previous, out ScanResult result) { result = null; @@ -107,33 +107,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return !CheckRoundedEquality(value); - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs index 2682a31c..b0ce1643 100644 --- a/MemorySearcher/Comparer/FloatMemoryComparer.cs +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -6,8 +6,8 @@ namespace ReClassNET.MemorySearcher.Comparer { public class FloatMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } - public SearchRoundMode RoundType { get; } + public ScanCompareType CompareType { get; } + public ScanRoundMode RoundType { get; } public float Value1 { get; } public float Value2 { get; } public int ValueSize => sizeof(float); @@ -16,7 +16,7 @@ public class FloatMemoryComparer : IMemoryComparer private readonly float minValue; private readonly float maxValue; - public FloatMemoryComparer(SearchCompareType compareType, SearchRoundMode roundType, int significantDigits, float value1, float value2) + public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, float value1, float value2) { CompareType = compareType; RoundType = roundType; @@ -34,18 +34,18 @@ private bool CheckRoundedEquality(float value) { switch (RoundType) { - case SearchRoundMode.Strict: + case ScanRoundMode.Strict: return Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); - case SearchRoundMode.Normal: + case ScanRoundMode.Normal: return minValue < value && value < maxValue; - case SearchRoundMode.Truncate: + case ScanRoundMode.Truncate: return (int)value == (int)Value1; default: throw new ArgumentOutOfRangeException(); } } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -55,23 +55,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return !CheckRoundedEquality(value); - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -88,7 +88,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is FloatSearchResult); @@ -97,7 +97,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (FloatSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, FloatSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, FloatSearchResult previous, out ScanResult result) { result = null; @@ -107,33 +107,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return CheckRoundedEquality(value); - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return !CheckRoundedEquality(value); - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/IMemoryComparer.cs b/MemorySearcher/Comparer/IMemoryComparer.cs index a23d95fc..7eaf4d17 100644 --- a/MemorySearcher/Comparer/IMemoryComparer.cs +++ b/MemorySearcher/Comparer/IMemoryComparer.cs @@ -2,11 +2,11 @@ { public interface IMemoryComparer { - SearchCompareType CompareType { get; } + ScanCompareType CompareType { get; } int ValueSize { get; } - bool Compare(byte[] data, int index, out SearchResult result); + bool Compare(byte[] data, int index, out ScanResult result); - bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result); + bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result); } } diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemorySearcher/Comparer/IntegerMemoryComparer.cs index a8a9a83a..c96a4537 100644 --- a/MemorySearcher/Comparer/IntegerMemoryComparer.cs +++ b/MemorySearcher/Comparer/IntegerMemoryComparer.cs @@ -5,19 +5,19 @@ namespace ReClassNET.MemorySearcher.Comparer { public class IntegerMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } + public ScanCompareType CompareType { get; } public int Value1 { get; } public int Value2 { get; } public int ValueSize => sizeof(int); - public IntegerMemoryComparer(SearchCompareType compareType, int value1, int value2) + public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2) { CompareType = compareType; Value1 = value1; Value2 = value2; } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -27,23 +27,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -60,7 +60,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is IntegerSearchResult); @@ -69,7 +69,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (IntegerSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, IntegerSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, IntegerSearchResult previous, out ScanResult result) { result = null; @@ -79,33 +79,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemorySearcher/Comparer/LongMemoryComparer.cs index ffe5d747..f2737285 100644 --- a/MemorySearcher/Comparer/LongMemoryComparer.cs +++ b/MemorySearcher/Comparer/LongMemoryComparer.cs @@ -5,19 +5,19 @@ namespace ReClassNET.MemorySearcher.Comparer { public class LongMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } + public ScanCompareType CompareType { get; } public long Value1 { get; } public long Value2 { get; } public int ValueSize => sizeof(long); - public LongMemoryComparer(SearchCompareType compareType, long value1, long value2) + public LongMemoryComparer(ScanCompareType compareType, long value1, long value2) { CompareType = compareType; Value1 = value1; Value2 = value2; } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -27,23 +27,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -60,7 +60,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is LongSearchResult); @@ -69,7 +69,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (LongSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, LongSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, LongSearchResult previous, out ScanResult result) { result = null; @@ -79,33 +79,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemorySearcher/Comparer/ShortMemoryComparer.cs index d5cdafda..f9e50a96 100644 --- a/MemorySearcher/Comparer/ShortMemoryComparer.cs +++ b/MemorySearcher/Comparer/ShortMemoryComparer.cs @@ -5,19 +5,19 @@ namespace ReClassNET.MemorySearcher.Comparer { public class ShortMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType { get; } + public ScanCompareType CompareType { get; } public short Value1 { get; } public short Value2 { get; } public int ValueSize => sizeof(short); - public ShortMemoryComparer(SearchCompareType compareType, short value1, short value2) + public ShortMemoryComparer(ScanCompareType compareType, short value1, short value2) { CompareType = compareType; Value1 = value1; Value2 = value2; } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -27,23 +27,23 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; - case SearchCompareType.Unknown: + case ScanCompareType.Unknown: return true; default: throw new InvalidCompareTypeException(CompareType); @@ -60,7 +60,7 @@ bool IsMatch() return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is ShortSearchResult); @@ -69,7 +69,7 @@ public bool Compare(byte[] data, int index, SearchResult previous, out SearchRes return Compare(data, index, (ShortSearchResult)previous, out result); } - public bool Compare(byte[] data, int index, ShortSearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ShortSearchResult previous, out ScanResult result) { result = null; @@ -79,33 +79,33 @@ bool IsMatch() { switch (CompareType) { - case SearchCompareType.Equal: + case ScanCompareType.Equal: return value == Value1; - case SearchCompareType.NotEqual: + case ScanCompareType.NotEqual: return value != Value1; - case SearchCompareType.Changed: + case ScanCompareType.Changed: return value != previous.Value; - case SearchCompareType.NotChanged: + case ScanCompareType.NotChanged: return value == previous.Value; - case SearchCompareType.GreaterThan: + case ScanCompareType.GreaterThan: return value > Value1; - case SearchCompareType.GreaterThanOrEqual: + case ScanCompareType.GreaterThanOrEqual: return value >= Value1; - case SearchCompareType.Increased: + case ScanCompareType.Increased: return value > previous.Value; - case SearchCompareType.IncreasedOrEqual: + case ScanCompareType.IncreasedOrEqual: return value >= previous.Value; - case SearchCompareType.LessThan: + case ScanCompareType.LessThan: return value < Value1; - case SearchCompareType.LessThanOrEqual: + case ScanCompareType.LessThanOrEqual: return value <= Value1; - case SearchCompareType.Decreased: + case ScanCompareType.Decreased: return value < previous.Value; - case SearchCompareType.DecreasedOrEqual: + case ScanCompareType.DecreasedOrEqual: return value <= previous.Value; - case SearchCompareType.Between: + case ScanCompareType.Between: return Value1 < value && value < Value2; - case SearchCompareType.BetweenOrEqual: + case ScanCompareType.BetweenOrEqual: return Value1 <= value && value <= Value2; default: throw new InvalidCompareTypeException(CompareType); diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index 774f8263..4adf6462 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -7,7 +7,7 @@ namespace ReClassNET.MemorySearcher.Comparer { public class StringMemoryComparer : IMemoryComparer { - public SearchCompareType CompareType => SearchCompareType.Equal; + public ScanCompareType CompareType => ScanCompareType.Equal; public bool CaseSensitive { get; } public Encoding Encoding { get; } public string Value { get; } @@ -21,7 +21,7 @@ public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) ValueSize = Value.Length * Encoding.GetSimpleByteCountPerChar(); } - public bool Compare(byte[] data, int index, out SearchResult result) + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; @@ -37,7 +37,7 @@ public bool Compare(byte[] data, int index, out SearchResult result) return true; } - public bool Compare(byte[] data, int index, SearchResult previous, out SearchResult result) + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG Debug.Assert(previous is StringSearchResult); diff --git a/MemorySearcher/InvalidCompareTypeException.cs b/MemorySearcher/InvalidCompareTypeException.cs index f9c8a031..726ab738 100644 --- a/MemorySearcher/InvalidCompareTypeException.cs +++ b/MemorySearcher/InvalidCompareTypeException.cs @@ -4,7 +4,7 @@ namespace ReClassNET.MemorySearcher { public class InvalidCompareTypeException : Exception { - public InvalidCompareTypeException(SearchCompareType type) + public InvalidCompareTypeException(ScanCompareType type) : base($"{type} is not valid in the current state.") { diff --git a/MemorySearcher/MemoryRecord.cs b/MemorySearcher/MemoryRecord.cs index f1ebbc8e..ac27028a 100644 --- a/MemorySearcher/MemoryRecord.cs +++ b/MemorySearcher/MemoryRecord.cs @@ -47,7 +47,7 @@ public string ModuleName public bool IsRelativeAddress => !string.IsNullOrEmpty(ModuleName); public string Description { get; set; } = string.Empty; - public SearchValueType ValueType { get; set; } + public ScanValueType ValueType { get; set; } public string ValueStr { get; private set; } public string PreviousValueStr { get; } @@ -65,7 +65,7 @@ public MemoryRecord() } - public MemoryRecord(SearchResult result) + public MemoryRecord(ScanResult result) { Contract.Requires(result != null); @@ -75,30 +75,30 @@ public MemoryRecord(SearchResult result) switch (ValueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: ValueStr = FormatValue(((ByteSearchResult)result).Value, false); break; - case SearchValueType.Short: + case ScanValueType.Short: ValueStr = FormatValue(((ShortSearchResult)result).Value, false); break; - case SearchValueType.Integer: + case ScanValueType.Integer: ValueStr = FormatValue(((IntegerSearchResult)result).Value, false); break; - case SearchValueType.Long: + case ScanValueType.Long: ValueStr = FormatValue(((LongSearchResult)result).Value, false); break; - case SearchValueType.Float: + case ScanValueType.Float: ValueStr = FormatValue(((FloatSearchResult)result).Value); break; - case SearchValueType.Double: + case ScanValueType.Double: ValueStr = FormatValue(((DoubleSearchResult)result).Value); break; - case SearchValueType.ArrayOfBytes: + case ScanValueType.ArrayOfBytes: var byteData = ((ArrayOfBytesSearchResult)result).Value; ValueLength = byteData.Length; ValueStr = FormatValue(byteData); break; - case SearchValueType.String: + case ScanValueType.String: var strResult = (StringSearchResult)result; ValueLength = strResult.Value.Length; Encoding = strResult.Encoding; @@ -156,24 +156,24 @@ public void RefreshValue(RemoteProcess process) switch (ValueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: buffer = new byte[1]; break; - case SearchValueType.Short: + case ScanValueType.Short: buffer = new byte[2]; break; - case SearchValueType.Integer: - case SearchValueType.Float: + case ScanValueType.Integer: + case ScanValueType.Float: buffer = new byte[4]; break; - case SearchValueType.Long: - case SearchValueType.Double: + case ScanValueType.Long: + case ScanValueType.Double: buffer = new byte[8]; break; - case SearchValueType.ArrayOfBytes: + case ScanValueType.ArrayOfBytes: buffer = new byte[ValueLength]; break; - case SearchValueType.String: + case ScanValueType.String: buffer = new byte[ValueLength * Encoding.GetSimpleByteCountPerChar()]; break; default: @@ -184,28 +184,28 @@ public void RefreshValue(RemoteProcess process) { switch (ValueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: ValueStr = FormatValue(buffer[0], ShowValueHexadecimal); break; - case SearchValueType.Short: + case ScanValueType.Short: ValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); break; - case SearchValueType.Integer: + case ScanValueType.Integer: ValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); break; - case SearchValueType.Long: + case ScanValueType.Long: ValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); break; - case SearchValueType.Float: + case ScanValueType.Float: ValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); break; - case SearchValueType.Double: + case ScanValueType.Double: ValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); break; - case SearchValueType.ArrayOfBytes: + case ScanValueType.ArrayOfBytes: ValueStr = FormatValue(buffer); break; - case SearchValueType.String: + case ScanValueType.String: ValueStr = FormatValue(Encoding.GetString(buffer)); break; } @@ -225,38 +225,38 @@ public void SetValue(RemoteProcess process, string input, bool isHex) byte[] data = null; - if (ValueType == SearchValueType.Byte || ValueType == SearchValueType.Short || ValueType == SearchValueType.Integer || ValueType == SearchValueType.Long) + if (ValueType == ScanValueType.Byte || ValueType == ScanValueType.Short || ValueType == ScanValueType.Integer || ValueType == ScanValueType.Long) { var numberStyle = isHex ? NumberStyles.HexNumber : NumberStyles.Integer; long.TryParse(input, numberStyle, null, out var value); switch (ValueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: data = BitConverter.GetBytes((byte)value); break; - case SearchValueType.Short: + case ScanValueType.Short: data = BitConverter.GetBytes((short)value); break; - case SearchValueType.Integer: + case ScanValueType.Integer: data = BitConverter.GetBytes((int)value); break; - case SearchValueType.Long: + case ScanValueType.Long: data = BitConverter.GetBytes(value); break; } } - else if (ValueType == SearchValueType.Float || ValueType == SearchValueType.Double) + else if (ValueType == ScanValueType.Float || ValueType == ScanValueType.Double) { var nf = Utils.GuessNumberFormat(input); double.TryParse(input, NumberStyles.Float, nf, out var value); switch (ValueType) { - case SearchValueType.Float: + case ScanValueType.Float: data = BitConverter.GetBytes((float)value); break; - case SearchValueType.Double: + case ScanValueType.Double: data = BitConverter.GetBytes(value); break; } diff --git a/MemorySearcher/SearchCompareType.cs b/MemorySearcher/ScanCompareType.cs similarity index 96% rename from MemorySearcher/SearchCompareType.cs rename to MemorySearcher/ScanCompareType.cs index d7c1f06f..cc2e9b62 100644 --- a/MemorySearcher/SearchCompareType.cs +++ b/MemorySearcher/ScanCompareType.cs @@ -2,7 +2,7 @@ namespace ReClassNET.MemorySearcher { - public enum SearchCompareType + public enum ScanCompareType { [Description("Is Equal")] Equal, diff --git a/MemorySearcher/SearchContext.cs b/MemorySearcher/ScanContext.cs similarity index 70% rename from MemorySearcher/SearchContext.cs rename to MemorySearcher/ScanContext.cs index cdf8e0e4..c3d8682f 100644 --- a/MemorySearcher/SearchContext.cs +++ b/MemorySearcher/ScanContext.cs @@ -3,12 +3,12 @@ namespace ReClassNET.MemorySearcher { - internal class SearchContext + internal class ScanContext { public byte[] Buffer { get; private set; } - public SearchWorker Worker { get; } + public ScannerWorker Worker { get; } - public SearchContext(SearchSettings settings, IMemoryComparer comparer, int bufferSize) + public ScanContext(ScanSettings settings, IMemoryComparer comparer, int bufferSize) { Contract.Requires(settings != null); Contract.Requires(comparer != null); @@ -16,7 +16,7 @@ public SearchContext(SearchSettings settings, IMemoryComparer comparer, int buff EnsureBufferSize(bufferSize); - Worker = new SearchWorker(settings, comparer); + Worker = new ScannerWorker(settings, comparer); } public void EnsureBufferSize(int size) diff --git a/MemorySearcher/SearchResult.cs b/MemorySearcher/ScanResult.cs similarity index 53% rename from MemorySearcher/SearchResult.cs rename to MemorySearcher/ScanResult.cs index 61922ebb..dd57d5a2 100644 --- a/MemorySearcher/SearchResult.cs +++ b/MemorySearcher/ScanResult.cs @@ -4,16 +4,16 @@ namespace ReClassNET.MemorySearcher { - public abstract class SearchResult + public abstract class ScanResult { - public abstract SearchValueType ValueType { get; } + public abstract ScanValueType ValueType { get; } public IntPtr Address { get; set; } } - public class ByteSearchResult : SearchResult + public class ByteSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Byte; + public override ScanValueType ValueType => ScanValueType.Byte; public byte Value { get; } @@ -23,9 +23,9 @@ public ByteSearchResult(byte value) } } - public class ShortSearchResult : SearchResult + public class ShortSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Short; + public override ScanValueType ValueType => ScanValueType.Short; public short Value { get; } @@ -35,9 +35,9 @@ public ShortSearchResult(short value) } } - public class IntegerSearchResult : SearchResult + public class IntegerSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Integer; + public override ScanValueType ValueType => ScanValueType.Integer; public int Value { get; } @@ -47,9 +47,9 @@ public IntegerSearchResult(int value) } } - public class LongSearchResult : SearchResult + public class LongSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Long; + public override ScanValueType ValueType => ScanValueType.Long; public long Value { get; } @@ -59,9 +59,9 @@ public LongSearchResult(long value) } } - public class FloatSearchResult : SearchResult + public class FloatSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Float; + public override ScanValueType ValueType => ScanValueType.Float; public float Value { get; } @@ -71,9 +71,9 @@ public FloatSearchResult(float value) } } - public class DoubleSearchResult : SearchResult + public class DoubleSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.Double; + public override ScanValueType ValueType => ScanValueType.Double; public double Value { get; } @@ -83,9 +83,9 @@ public DoubleSearchResult(double value) } } - public class ArrayOfBytesSearchResult : SearchResult + public class ArrayOfBytesSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.ArrayOfBytes; + public override ScanValueType ValueType => ScanValueType.ArrayOfBytes; public byte[] Value { get; } @@ -97,9 +97,9 @@ public ArrayOfBytesSearchResult(byte[] value) } } - public class StringSearchResult : SearchResult + public class StringSearchResult : ScanResult { - public override SearchValueType ValueType => SearchValueType.String; + public override ScanValueType ValueType => ScanValueType.String; public string Value { get; } diff --git a/MemorySearcher/SearchResultBlock.cs b/MemorySearcher/ScanResultBlock.cs similarity index 62% rename from MemorySearcher/SearchResultBlock.cs rename to MemorySearcher/ScanResultBlock.cs index 90b955a6..30f21084 100644 --- a/MemorySearcher/SearchResultBlock.cs +++ b/MemorySearcher/ScanResultBlock.cs @@ -4,14 +4,14 @@ namespace ReClassNET.MemorySearcher { - internal class SearchResultBlock + internal class ScanResultBlock { public IntPtr Start { get; } public IntPtr End { get; } public int Size => End.Sub(Start).ToInt32(); - public IReadOnlyList Results { get; } + public IReadOnlyList Results { get; } - public SearchResultBlock(IntPtr start, IntPtr end, IReadOnlyList results) + public ScanResultBlock(IntPtr start, IntPtr end, IReadOnlyList results) { Start = start; End = end; diff --git a/MemorySearcher/SearchResultStore.cs b/MemorySearcher/ScanResultStore.cs similarity index 80% rename from MemorySearcher/SearchResultStore.cs rename to MemorySearcher/ScanResultStore.cs index 6f4f3c87..bf32a8cd 100644 --- a/MemorySearcher/SearchResultStore.cs +++ b/MemorySearcher/ScanResultStore.cs @@ -7,7 +7,7 @@ namespace ReClassNET.MemorySearcher { - internal class SearchResultStore : IDisposable + internal class ScanResultStore : IDisposable { private enum StorageMode { @@ -17,18 +17,18 @@ private enum StorageMode private const int MaximumMemoryResultsCount = 10000000; - private readonly List store = new List(); + private readonly List store = new List(); private readonly string storePath; private FileStream fileStream; private StorageMode mode = StorageMode.Memory; - private readonly SearchValueType valueType; + private readonly ScanValueType valueType; public int TotalResultCount { get; private set; } - public SearchResultStore(SearchValueType valueType, string storePath) + public ScanResultStore(ScanValueType valueType, string storePath) { this.valueType = valueType; this.storePath = Path.Combine(storePath, $"ReClass.NET_MemorySearcher_{Guid.NewGuid()}.tmp"); @@ -60,12 +60,12 @@ public void Finish() } } - public IEnumerable GetResultBlocks() + public IEnumerable GetResultBlocks() { return mode == StorageMode.Memory ? store : ReadBlocksFromFile(); } - public void AddBlock(SearchResultBlock block) + public void AddBlock(ScanResultBlock block) { Contract.Requires(block != null); @@ -102,7 +102,7 @@ public void AddBlock(SearchResultBlock block) } } - private void AppendBlockToFile(SearchResultBlock block) + private void AppendBlockToFile(ScanResultBlock block) { Contract.Requires(block != null); @@ -119,7 +119,7 @@ private void AppendBlockToFile(SearchResultBlock block) } } - private IEnumerable ReadBlocksFromFile() + private IEnumerable ReadBlocksFromFile() { using (var stream = File.OpenRead(storePath)) { @@ -134,47 +134,47 @@ private IEnumerable ReadBlocksFromFile() var resultCount = br.ReadInt32(); - var results = new List(resultCount); + var results = new List(resultCount); for (var i = 0; i < resultCount; ++i) { results.Add(ReadSearchResult(br)); } - yield return new SearchResultBlock(start, end, results); + yield return new ScanResultBlock(start, end, results); } } } } - private SearchResult ReadSearchResult(BinaryReader br) + private ScanResult ReadSearchResult(BinaryReader br) { var address = br.ReadIntPtr(); - SearchResult result; + ScanResult result; switch (valueType) { - case SearchValueType.Byte: + case ScanValueType.Byte: result = new ByteSearchResult(br.ReadByte()); break; - case SearchValueType.Short: + case ScanValueType.Short: result = new ShortSearchResult(br.ReadInt16()); break; - case SearchValueType.Integer: + case ScanValueType.Integer: result = new IntegerSearchResult(br.ReadInt32()); break; - case SearchValueType.Long: + case ScanValueType.Long: result = new LongSearchResult(br.ReadInt64()); break; - case SearchValueType.Float: + case ScanValueType.Float: result = new FloatSearchResult(br.ReadSingle()); break; - case SearchValueType.Double: + case ScanValueType.Double: result = new DoubleSearchResult(br.ReadDouble()); break; - case SearchValueType.ArrayOfBytes: + case ScanValueType.ArrayOfBytes: result = new ArrayOfBytesSearchResult(br.ReadBytes(br.ReadInt32())); break; - case SearchValueType.String: + case ScanValueType.String: var encoding = br.ReadInt32(); result = new StringSearchResult(br.ReadString(), encoding == 0 ? Encoding.UTF8 : encoding == 1 ? Encoding.Unicode : Encoding.UTF32); break; @@ -187,7 +187,7 @@ private SearchResult ReadSearchResult(BinaryReader br) return result; } - private static void WriteSearchResult(BinaryWriter bw, SearchResult result) + private static void WriteSearchResult(BinaryWriter bw, ScanResult result) { bw.Write(result.Address); diff --git a/MemorySearcher/SearchRoundMode.cs b/MemorySearcher/ScanRoundMode.cs similarity index 73% rename from MemorySearcher/SearchRoundMode.cs rename to MemorySearcher/ScanRoundMode.cs index 759926c2..15bcd89d 100644 --- a/MemorySearcher/SearchRoundMode.cs +++ b/MemorySearcher/ScanRoundMode.cs @@ -1,6 +1,6 @@ namespace ReClassNET.MemorySearcher { - public enum SearchRoundMode + public enum ScanRoundMode { Strict, Normal, diff --git a/MemorySearcher/SearchSettings.cs b/MemorySearcher/ScanSettings.cs similarity index 88% rename from MemorySearcher/SearchSettings.cs rename to MemorySearcher/ScanSettings.cs index bbe25eed..ee2303fa 100644 --- a/MemorySearcher/SearchSettings.cs +++ b/MemorySearcher/ScanSettings.cs @@ -9,7 +9,7 @@ public enum SettingState Indeterminate } - public class SearchSettings + public class ScanSettings { public IntPtr StartAddress { get; set; } = IntPtr.Zero; public IntPtr StopAddress { get; set; } = @@ -26,6 +26,6 @@ public class SearchSettings public bool SearchMemMapped { get; set; } = false; public bool FastScan { get; set; } = true; public int FastScanAlignment { get; set; } = 1; - public SearchValueType ValueType { get; set; } = SearchValueType.Byte; + public ScanValueType ValueType { get; set; } = ScanValueType.Byte; } } diff --git a/MemorySearcher/SearchValueType.cs b/MemorySearcher/ScanValueType.cs similarity index 93% rename from MemorySearcher/SearchValueType.cs rename to MemorySearcher/ScanValueType.cs index 5d2ed0d3..b6fe6489 100644 --- a/MemorySearcher/SearchValueType.cs +++ b/MemorySearcher/ScanValueType.cs @@ -2,7 +2,7 @@ namespace ReClassNET.MemorySearcher { - public enum SearchValueType + public enum ScanValueType { [Description("Byte")] Byte, diff --git a/MemorySearcher/Searcher.cs b/MemorySearcher/Scanner.cs similarity index 89% rename from MemorySearcher/Searcher.cs rename to MemorySearcher/Scanner.cs index b628a654..738c258e 100644 --- a/MemorySearcher/Searcher.cs +++ b/MemorySearcher/Scanner.cs @@ -11,19 +11,19 @@ namespace ReClassNET.MemorySearcher { - public class Searcher : IDisposable + public class Scanner : IDisposable { private readonly RemoteProcess process; - private readonly SearchSettings settings; - private SearchResultStore store; + private readonly ScanSettings settings; + private ScanResultStore store; - public SearchSettings Settings => settings; + public ScanSettings Settings => settings; public int TotalResultCount => store.TotalResultCount; private bool isFirstScan; - public Searcher(RemoteProcess process, SearchSettings settings) + public Scanner(RemoteProcess process, ScanSettings settings) { Contract.Requires(process != null); Contract.Requires(settings != null); @@ -40,16 +40,16 @@ public void Dispose() store = null; } - public IEnumerable GetResults() + public IEnumerable GetResults() { - Contract.Ensures(Contract.Result>() != null); + Contract.Ensures(Contract.Result>() != null); return store.GetResultBlocks().SelectMany(kv => kv.Results); } - private SearchResultStore CreateStore() + private ScanResultStore CreateStore() { - return new SearchResultStore(Settings.ValueType, Path.GetTempPath()); + return new ScanResultStore(Settings.ValueType, Path.GetTempPath()); } private IList
GetSearchableSections() @@ -128,7 +128,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr var result = Parallel.ForEach( sections, new ParallelOptions { CancellationToken = ct}, - () => new SearchContext(settings, comparer, initialBufferSize), + () => new ScanContext(settings, comparer, initialBufferSize), (s, state, _, context) => { var size = s.Size.ToInt32(); @@ -141,7 +141,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr .ToList(); if (results.Count > 0) { - var block = new SearchResultBlock( + var block = new ScanResultBlock( results.Min(r => r.Address, IntPtrComparer.Instance), results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, results @@ -187,7 +187,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro var result = Parallel.ForEach( store.GetResultBlocks(), new ParallelOptions { CancellationToken = ct }, - () => new SearchContext(settings, comparer, 0), + () => new ScanContext(settings, comparer, 0), (b, state, _, context) => { context.EnsureBufferSize(b.Size); @@ -199,7 +199,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro .ToList(); if (results.Count > 0) { - var block = new SearchResultBlock( + var block = new ScanResultBlock( results.Min(r => r.Address, IntPtrComparer.Instance), results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, results diff --git a/MemorySearcher/SearchWorker.cs b/MemorySearcher/ScannerWorker.cs similarity index 78% rename from MemorySearcher/SearchWorker.cs rename to MemorySearcher/ScannerWorker.cs index dbbfa033..ba08d963 100644 --- a/MemorySearcher/SearchWorker.cs +++ b/MemorySearcher/ScannerWorker.cs @@ -5,12 +5,12 @@ namespace ReClassNET.MemorySearcher { - internal class SearchWorker + internal class ScannerWorker { - private readonly SearchSettings settings; + private readonly ScanSettings settings; private readonly IMemoryComparer comparer; - public SearchWorker(SearchSettings settings, IMemoryComparer comparer) + public ScannerWorker(ScanSettings settings, IMemoryComparer comparer) { Contract.Requires(settings != null); Contract.Requires(comparer != null); @@ -19,7 +19,7 @@ public SearchWorker(SearchSettings settings, IMemoryComparer comparer) this.comparer = comparer; } - public IEnumerable Search(byte[] data, int count) + public IEnumerable Search(byte[] data, int count) { Contract.Requires(data != null); @@ -36,7 +36,7 @@ public IEnumerable Search(byte[] data, int count) } } - public IEnumerable Search(byte[] data, int count, IEnumerable results) + public IEnumerable Search(byte[] data, int count, IEnumerable results) { Contract.Requires(data != null); Contract.Requires(results != null); diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 7489c200..ca7511f0 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -193,17 +193,17 @@ - - - - - - + + + + + + - - - - + + + + From e096c597896ea0235212e9866d84ac7a48291bca Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:18:59 +0200 Subject: [PATCH 089/777] Rename Search -> Scan (Part 2). --- Forms/MainForm.cs | 2 +- Forms/MemorySearchForm.Designer.cs | 12 +++--- Forms/MemorySearchForm.cs | 12 +++--- Forms/MemorySearchForm.resx | 6 +++ .../Comparer/ArrayOfBytesMemoryComparer.cs | 6 +-- MemorySearcher/Comparer/ByteMemoryComparer.cs | 12 +++--- .../Comparer/DoubleMemoryComparer.cs | 12 +++--- .../Comparer/FloatMemoryComparer.cs | 12 +++--- .../{IMemoryComparer.cs => IScanComparer.cs} | 2 +- .../Comparer/IntegerMemoryComparer.cs | 12 +++--- .../InvalidCompareTypeException.cs | 2 +- MemorySearcher/Comparer/LongMemoryComparer.cs | 12 +++--- .../Comparer/ShortMemoryComparer.cs | 12 +++--- .../Comparer/StringMemoryComparer.cs | 6 +-- MemorySearcher/MemoryRecord.cs | 16 ++++---- MemorySearcher/ScanContext.cs | 2 +- MemorySearcher/ScanResult.cs | 32 +++++++-------- MemorySearcher/ScanResultBlock.cs | 3 ++ MemorySearcher/ScanResultStore.cs | 40 +++++++++---------- MemorySearcher/ScanSettings.cs | 12 +++--- MemorySearcher/Scanner.cs | 29 +++++++------- MemorySearcher/ScannerWorker.cs | 9 +---- ReClass.NET.csproj | 4 +- 23 files changed, 135 insertions(+), 132 deletions(-) rename MemorySearcher/Comparer/{IMemoryComparer.cs => IScanComparer.cs} (88%) rename MemorySearcher/{ => Comparer}/InvalidCompareTypeException.cs (82%) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 1f534814..d9189a33 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -297,7 +297,7 @@ private void memoryViewerToolStripMenuItem_Click(object sender, EventArgs e) private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) { - new MemorySearchForm(remoteProcess).Show(); + new ScannerForm(remoteProcess).Show(); } private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/MemorySearchForm.Designer.cs index c45f1403..c257b3e2 100644 --- a/Forms/MemorySearchForm.Designer.cs +++ b/Forms/MemorySearchForm.Designer.cs @@ -1,6 +1,6 @@ namespace ReClassNET.Forms { - partial class MemorySearchForm + partial class ScannerForm { /// /// Required designer variable. @@ -89,8 +89,8 @@ private void InitializeComponent() this.bannerBox.Name = "bannerBox"; this.bannerBox.Size = new System.Drawing.Size(612, 48); this.bannerBox.TabIndex = 7; - this.bannerBox.Text = "Search the process memory for specific values."; - this.bannerBox.Title = "Memory Searcher"; + this.bannerBox.Text = "Scan the process memory for specific values."; + this.bannerBox.Title = "Scanner"; // // filterGroupBox // @@ -538,7 +538,7 @@ private void InitializeComponent() // this.infoToolTip.AutomaticDelay = 100; // - // MemorySearchForm + // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; @@ -553,9 +553,9 @@ private void InitializeComponent() this.Controls.Add(this.flowLayoutPanel1); this.Controls.Add(this.bannerBox); this.MinimumSize = new System.Drawing.Size(628, 622); - this.Name = "MemorySearchForm"; + this.Name = "ScannerForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ReClass.NET - Memory Searcher"; + this.Text = "ReClass.NET - Scanner"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MemorySearchForm_FormClosing); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); this.filterGroupBox.ResumeLayout(false); diff --git a/Forms/MemorySearchForm.cs b/Forms/MemorySearchForm.cs index d9afb811..b7de3c10 100644 --- a/Forms/MemorySearchForm.cs +++ b/Forms/MemorySearchForm.cs @@ -21,7 +21,7 @@ namespace ReClassNET.Forms { - public partial class MemorySearchForm : IconForm + public partial class ScannerForm : IconForm { private const int MaxVisibleResults = 10000; @@ -34,7 +34,7 @@ public partial class MemorySearchForm : IconForm private ScanCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); private ScanValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); - public MemorySearchForm(RemoteProcess process) + public ScannerForm(RemoteProcess process) { Contract.Requires(process != null); @@ -307,14 +307,14 @@ SettingState CheckStateToSettingState(CheckState state) } } - settings.SearchWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); - settings.SearchExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); - settings.SearchCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); + settings.ScanWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); + settings.ScanExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); + settings.ScanCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); return settings; } - private IMemoryComparer CreateComparer(ScanSettings settings) + private IScanComparer CreateComparer(ScanSettings settings) { Contract.Requires(settings != null); diff --git a/Forms/MemorySearchForm.resx b/Forms/MemorySearchForm.resx index e0f6ed97..f35ec465 100644 --- a/Forms/MemorySearchForm.resx +++ b/Forms/MemorySearchForm.resx @@ -126,6 +126,12 @@ 172, 6 + + 172, 6 + + + 304, 6 + 42 diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs index bc1fecf6..06f91f96 100644 --- a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs @@ -4,7 +4,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class ArrayOfBytesMemoryComparer : IMemoryComparer + public class ArrayOfBytesMemoryComparer : IScanComparer { public ScanCompareType CompareType => ScanCompareType.Equal; public BytePattern Value { get; } @@ -45,7 +45,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) var temp = new byte[ValueSize]; Array.Copy(data, index, temp, 0, temp.Length); - result = new ArrayOfBytesSearchResult(temp); + result = new ArrayOfBytesScanResult(temp); return true; } @@ -53,7 +53,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is ArrayOfBytesSearchResult); + Debug.Assert(previous is ArrayOfBytesScanResult); #endif return Compare(data, index, out result); diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemorySearcher/Comparer/ByteMemoryComparer.cs index ccf3a3c2..dda26825 100644 --- a/MemorySearcher/Comparer/ByteMemoryComparer.cs +++ b/MemorySearcher/Comparer/ByteMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class ByteMemoryComparer : IMemoryComparer + public class ByteMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public byte Value1 { get; } @@ -55,7 +55,7 @@ bool IsMatch() return false; } - result = new ByteSearchResult(value); + result = new ByteScanResult(value); return true; } @@ -63,13 +63,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is ByteSearchResult); + Debug.Assert(previous is ByteScanResult); #endif - return Compare(data, index, (ByteSearchResult)previous, out result); + return Compare(data, index, (ByteScanResult)previous, out result); } - public bool Compare(byte[] data, int index, ByteSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, ByteScanResult previous, out ScanResult result) { result = null; @@ -117,7 +117,7 @@ bool IsMatch() return false; } - result = new ByteSearchResult(value); + result = new ByteScanResult(value); return true; } diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemorySearcher/Comparer/DoubleMemoryComparer.cs index 4d006916..7012342c 100644 --- a/MemorySearcher/Comparer/DoubleMemoryComparer.cs +++ b/MemorySearcher/Comparer/DoubleMemoryComparer.cs @@ -4,7 +4,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class DoubleMemoryComparer : IMemoryComparer + public class DoubleMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public ScanRoundMode RoundType { get; } @@ -83,7 +83,7 @@ bool IsMatch() return false; } - result = new DoubleSearchResult(value); + result = new DoubleScanResult(value); return true; } @@ -91,13 +91,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is DoubleSearchResult); + Debug.Assert(previous is DoubleScanResult); #endif - return Compare(data, index, (DoubleSearchResult)previous, out result); + return Compare(data, index, (DoubleScanResult)previous, out result); } - public bool Compare(byte[] data, int index, DoubleSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, DoubleScanResult previous, out ScanResult result) { result = null; @@ -145,7 +145,7 @@ bool IsMatch() return false; } - result = new DoubleSearchResult(value); + result = new DoubleScanResult(value); return true; } diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemorySearcher/Comparer/FloatMemoryComparer.cs index b0ce1643..88e9ddef 100644 --- a/MemorySearcher/Comparer/FloatMemoryComparer.cs +++ b/MemorySearcher/Comparer/FloatMemoryComparer.cs @@ -4,7 +4,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class FloatMemoryComparer : IMemoryComparer + public class FloatMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public ScanRoundMode RoundType { get; } @@ -83,7 +83,7 @@ bool IsMatch() return false; } - result = new FloatSearchResult(value); + result = new FloatScanResult(value); return true; } @@ -91,13 +91,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is FloatSearchResult); + Debug.Assert(previous is FloatScanResult); #endif - return Compare(data, index, (FloatSearchResult)previous, out result); + return Compare(data, index, (FloatScanResult)previous, out result); } - public bool Compare(byte[] data, int index, FloatSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, FloatScanResult previous, out ScanResult result) { result = null; @@ -145,7 +145,7 @@ bool IsMatch() return false; } - result = new FloatSearchResult(value); + result = new FloatScanResult(value); return true; } diff --git a/MemorySearcher/Comparer/IMemoryComparer.cs b/MemorySearcher/Comparer/IScanComparer.cs similarity index 88% rename from MemorySearcher/Comparer/IMemoryComparer.cs rename to MemorySearcher/Comparer/IScanComparer.cs index 7eaf4d17..047aed95 100644 --- a/MemorySearcher/Comparer/IMemoryComparer.cs +++ b/MemorySearcher/Comparer/IScanComparer.cs @@ -1,6 +1,6 @@ namespace ReClassNET.MemorySearcher.Comparer { - public interface IMemoryComparer + public interface IScanComparer { ScanCompareType CompareType { get; } int ValueSize { get; } diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemorySearcher/Comparer/IntegerMemoryComparer.cs index c96a4537..36d271df 100644 --- a/MemorySearcher/Comparer/IntegerMemoryComparer.cs +++ b/MemorySearcher/Comparer/IntegerMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class IntegerMemoryComparer : IMemoryComparer + public class IntegerMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public int Value1 { get; } @@ -55,7 +55,7 @@ bool IsMatch() return false; } - result = new IntegerSearchResult(value); + result = new IntegerScanResult(value); return true; } @@ -63,13 +63,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is IntegerSearchResult); + Debug.Assert(previous is IntegerScanResult); #endif - return Compare(data, index, (IntegerSearchResult)previous, out result); + return Compare(data, index, (IntegerScanResult)previous, out result); } - public bool Compare(byte[] data, int index, IntegerSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, IntegerScanResult previous, out ScanResult result) { result = null; @@ -117,7 +117,7 @@ bool IsMatch() return false; } - result = new IntegerSearchResult(value); + result = new IntegerScanResult(value); return true; } diff --git a/MemorySearcher/InvalidCompareTypeException.cs b/MemorySearcher/Comparer/InvalidCompareTypeException.cs similarity index 82% rename from MemorySearcher/InvalidCompareTypeException.cs rename to MemorySearcher/Comparer/InvalidCompareTypeException.cs index 726ab738..18b3676a 100644 --- a/MemorySearcher/InvalidCompareTypeException.cs +++ b/MemorySearcher/Comparer/InvalidCompareTypeException.cs @@ -1,6 +1,6 @@ using System; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemorySearcher.Comparer { public class InvalidCompareTypeException : Exception { diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemorySearcher/Comparer/LongMemoryComparer.cs index f2737285..85b39c2d 100644 --- a/MemorySearcher/Comparer/LongMemoryComparer.cs +++ b/MemorySearcher/Comparer/LongMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class LongMemoryComparer : IMemoryComparer + public class LongMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public long Value1 { get; } @@ -55,7 +55,7 @@ bool IsMatch() return false; } - result = new LongSearchResult(value); + result = new LongScanResult(value); return true; } @@ -63,13 +63,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is LongSearchResult); + Debug.Assert(previous is LongScanResult); #endif - return Compare(data, index, (LongSearchResult)previous, out result); + return Compare(data, index, (LongScanResult)previous, out result); } - public bool Compare(byte[] data, int index, LongSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, LongScanResult previous, out ScanResult result) { result = null; @@ -117,7 +117,7 @@ bool IsMatch() return false; } - result = new LongSearchResult(value); + result = new LongScanResult(value); return true; } diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemorySearcher/Comparer/ShortMemoryComparer.cs index f9e50a96..f7c7efe3 100644 --- a/MemorySearcher/Comparer/ShortMemoryComparer.cs +++ b/MemorySearcher/Comparer/ShortMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class ShortMemoryComparer : IMemoryComparer + public class ShortMemoryComparer : IScanComparer { public ScanCompareType CompareType { get; } public short Value1 { get; } @@ -55,7 +55,7 @@ bool IsMatch() return false; } - result = new ShortSearchResult(value); + result = new ShortScanResult(value); return true; } @@ -63,13 +63,13 @@ bool IsMatch() public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is ShortSearchResult); + Debug.Assert(previous is ShortScanResult); #endif - return Compare(data, index, (ShortSearchResult)previous, out result); + return Compare(data, index, (ShortScanResult)previous, out result); } - public bool Compare(byte[] data, int index, ShortSearchResult previous, out ScanResult result) + public bool Compare(byte[] data, int index, ShortScanResult previous, out ScanResult result) { result = null; @@ -117,7 +117,7 @@ bool IsMatch() return false; } - result = new ShortSearchResult(value); + result = new ShortScanResult(value); return true; } diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemorySearcher/Comparer/StringMemoryComparer.cs index 4adf6462..0b12b140 100644 --- a/MemorySearcher/Comparer/StringMemoryComparer.cs +++ b/MemorySearcher/Comparer/StringMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemorySearcher.Comparer { - public class StringMemoryComparer : IMemoryComparer + public class StringMemoryComparer : IScanComparer { public ScanCompareType CompareType => ScanCompareType.Equal; public bool CaseSensitive { get; } @@ -32,7 +32,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) return false; } - result = new StringSearchResult(value, Encoding); + result = new StringScanResult(value, Encoding); return true; } @@ -40,7 +40,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG - Debug.Assert(previous is StringSearchResult); + Debug.Assert(previous is StringScanResult); #endif return Compare(data, index, out result); diff --git a/MemorySearcher/MemoryRecord.cs b/MemorySearcher/MemoryRecord.cs index ac27028a..b560f51c 100644 --- a/MemorySearcher/MemoryRecord.cs +++ b/MemorySearcher/MemoryRecord.cs @@ -76,30 +76,30 @@ public MemoryRecord(ScanResult result) switch (ValueType) { case ScanValueType.Byte: - ValueStr = FormatValue(((ByteSearchResult)result).Value, false); + ValueStr = FormatValue(((ByteScanResult)result).Value, false); break; case ScanValueType.Short: - ValueStr = FormatValue(((ShortSearchResult)result).Value, false); + ValueStr = FormatValue(((ShortScanResult)result).Value, false); break; case ScanValueType.Integer: - ValueStr = FormatValue(((IntegerSearchResult)result).Value, false); + ValueStr = FormatValue(((IntegerScanResult)result).Value, false); break; case ScanValueType.Long: - ValueStr = FormatValue(((LongSearchResult)result).Value, false); + ValueStr = FormatValue(((LongScanResult)result).Value, false); break; case ScanValueType.Float: - ValueStr = FormatValue(((FloatSearchResult)result).Value); + ValueStr = FormatValue(((FloatScanResult)result).Value); break; case ScanValueType.Double: - ValueStr = FormatValue(((DoubleSearchResult)result).Value); + ValueStr = FormatValue(((DoubleScanResult)result).Value); break; case ScanValueType.ArrayOfBytes: - var byteData = ((ArrayOfBytesSearchResult)result).Value; + var byteData = ((ArrayOfBytesScanResult)result).Value; ValueLength = byteData.Length; ValueStr = FormatValue(byteData); break; case ScanValueType.String: - var strResult = (StringSearchResult)result; + var strResult = (StringScanResult)result; ValueLength = strResult.Value.Length; Encoding = strResult.Encoding; ValueStr = FormatValue(strResult.Value); diff --git a/MemorySearcher/ScanContext.cs b/MemorySearcher/ScanContext.cs index c3d8682f..c8f2c604 100644 --- a/MemorySearcher/ScanContext.cs +++ b/MemorySearcher/ScanContext.cs @@ -8,7 +8,7 @@ internal class ScanContext public byte[] Buffer { get; private set; } public ScannerWorker Worker { get; } - public ScanContext(ScanSettings settings, IMemoryComparer comparer, int bufferSize) + public ScanContext(ScanSettings settings, IScanComparer comparer, int bufferSize) { Contract.Requires(settings != null); Contract.Requires(comparer != null); diff --git a/MemorySearcher/ScanResult.cs b/MemorySearcher/ScanResult.cs index dd57d5a2..357b9e89 100644 --- a/MemorySearcher/ScanResult.cs +++ b/MemorySearcher/ScanResult.cs @@ -11,85 +11,85 @@ public abstract class ScanResult public IntPtr Address { get; set; } } - public class ByteSearchResult : ScanResult + public class ByteScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Byte; public byte Value { get; } - public ByteSearchResult(byte value) + public ByteScanResult(byte value) { Value = value; } } - public class ShortSearchResult : ScanResult + public class ShortScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Short; public short Value { get; } - public ShortSearchResult(short value) + public ShortScanResult(short value) { Value = value; } } - public class IntegerSearchResult : ScanResult + public class IntegerScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Integer; public int Value { get; } - public IntegerSearchResult(int value) + public IntegerScanResult(int value) { Value = value; } } - public class LongSearchResult : ScanResult + public class LongScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Long; public long Value { get; } - public LongSearchResult(long value) + public LongScanResult(long value) { Value = value; } } - public class FloatSearchResult : ScanResult + public class FloatScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Float; public float Value { get; } - public FloatSearchResult(float value) + public FloatScanResult(float value) { Value = value; } } - public class DoubleSearchResult : ScanResult + public class DoubleScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.Double; public double Value { get; } - public DoubleSearchResult(double value) + public DoubleScanResult(double value) { Value = value; } } - public class ArrayOfBytesSearchResult : ScanResult + public class ArrayOfBytesScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.ArrayOfBytes; public byte[] Value { get; } - public ArrayOfBytesSearchResult(byte[] value) + public ArrayOfBytesScanResult(byte[] value) { Contract.Requires(value != null); @@ -97,7 +97,7 @@ public ArrayOfBytesSearchResult(byte[] value) } } - public class StringSearchResult : ScanResult + public class StringScanResult : ScanResult { public override ScanValueType ValueType => ScanValueType.String; @@ -105,7 +105,7 @@ public class StringSearchResult : ScanResult public Encoding Encoding { get; } - public StringSearchResult(string value, Encoding encoding) + public StringScanResult(string value, Encoding encoding) { Contract.Requires(value != null); Contract.Requires(encoding != null); diff --git a/MemorySearcher/ScanResultBlock.cs b/MemorySearcher/ScanResultBlock.cs index 30f21084..48909082 100644 --- a/MemorySearcher/ScanResultBlock.cs +++ b/MemorySearcher/ScanResultBlock.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.Contracts; using ReClassNET.Util; namespace ReClassNET.MemorySearcher @@ -13,6 +14,8 @@ internal class ScanResultBlock public ScanResultBlock(IntPtr start, IntPtr end, IReadOnlyList results) { + Contract.Requires(results != null); + Start = start; End = end; Results = results; diff --git a/MemorySearcher/ScanResultStore.cs b/MemorySearcher/ScanResultStore.cs index bf32a8cd..3bbd227e 100644 --- a/MemorySearcher/ScanResultStore.cs +++ b/MemorySearcher/ScanResultStore.cs @@ -106,7 +106,7 @@ private void AppendBlockToFile(ScanResultBlock block) { Contract.Requires(block != null); - using (var bw = new BinaryWriter(fileStream, Encoding.ASCII, true)) + using (var bw = new BinaryWriter(fileStream, Encoding.Unicode, true)) { bw.Write(block.Start); bw.Write(block.End); @@ -123,7 +123,7 @@ private IEnumerable ReadBlocksFromFile() { using (var stream = File.OpenRead(storePath)) { - using (var br = new BinaryReader(stream)) + using (var br = new BinaryReader(stream, Encoding.Unicode)) { var length = stream.Length; @@ -137,7 +137,7 @@ private IEnumerable ReadBlocksFromFile() var results = new List(resultCount); for (var i = 0; i < resultCount; ++i) { - results.Add(ReadSearchResult(br)); + results.Add(ReadScanResult(br)); } yield return new ScanResultBlock(start, end, results); @@ -146,7 +146,7 @@ private IEnumerable ReadBlocksFromFile() } } - private ScanResult ReadSearchResult(BinaryReader br) + private ScanResult ReadScanResult(BinaryReader br) { var address = br.ReadIntPtr(); @@ -154,29 +154,29 @@ private ScanResult ReadSearchResult(BinaryReader br) switch (valueType) { case ScanValueType.Byte: - result = new ByteSearchResult(br.ReadByte()); + result = new ByteScanResult(br.ReadByte()); break; case ScanValueType.Short: - result = new ShortSearchResult(br.ReadInt16()); + result = new ShortScanResult(br.ReadInt16()); break; case ScanValueType.Integer: - result = new IntegerSearchResult(br.ReadInt32()); + result = new IntegerScanResult(br.ReadInt32()); break; case ScanValueType.Long: - result = new LongSearchResult(br.ReadInt64()); + result = new LongScanResult(br.ReadInt64()); break; case ScanValueType.Float: - result = new FloatSearchResult(br.ReadSingle()); + result = new FloatScanResult(br.ReadSingle()); break; case ScanValueType.Double: - result = new DoubleSearchResult(br.ReadDouble()); + result = new DoubleScanResult(br.ReadDouble()); break; case ScanValueType.ArrayOfBytes: - result = new ArrayOfBytesSearchResult(br.ReadBytes(br.ReadInt32())); + result = new ArrayOfBytesScanResult(br.ReadBytes(br.ReadInt32())); break; case ScanValueType.String: var encoding = br.ReadInt32(); - result = new StringSearchResult(br.ReadString(), encoding == 0 ? Encoding.UTF8 : encoding == 1 ? Encoding.Unicode : Encoding.UTF32); + result = new StringScanResult(br.ReadString(), encoding == 0 ? Encoding.UTF8 : encoding == 1 ? Encoding.Unicode : Encoding.UTF32); break; default: throw new ArgumentOutOfRangeException(); @@ -193,29 +193,29 @@ private static void WriteSearchResult(BinaryWriter bw, ScanResult result) switch (result) { - case ByteSearchResult byteSearchResult: + case ByteScanResult byteSearchResult: bw.Write(byteSearchResult.Value); break; - case ShortSearchResult shortSearchResult: + case ShortScanResult shortSearchResult: bw.Write(shortSearchResult.Value); break; - case IntegerSearchResult integerSearchResult: + case IntegerScanResult integerSearchResult: bw.Write(integerSearchResult.Value); break; - case LongSearchResult longSearchResult: + case LongScanResult longSearchResult: bw.Write(longSearchResult.Value); break; - case FloatSearchResult floatSearchResult: + case FloatScanResult floatSearchResult: bw.Write(floatSearchResult.Value); break; - case DoubleSearchResult doubleSearchResult: + case DoubleScanResult doubleSearchResult: bw.Write(doubleSearchResult.Value); break; - case ArrayOfBytesSearchResult arrayOfBytesSearchResult: + case ArrayOfBytesScanResult arrayOfBytesSearchResult: bw.Write(arrayOfBytesSearchResult.Value.Length); bw.Write(arrayOfBytesSearchResult.Value); break; - case StringSearchResult stringSearchResult: + case StringScanResult stringSearchResult: bw.Write(stringSearchResult.Encoding == Encoding.UTF8 ? 0 : stringSearchResult.Encoding == Encoding.Unicode ? 1 : 2); bw.Write(stringSearchResult.Value); break; diff --git a/MemorySearcher/ScanSettings.cs b/MemorySearcher/ScanSettings.cs index ee2303fa..f24b7078 100644 --- a/MemorySearcher/ScanSettings.cs +++ b/MemorySearcher/ScanSettings.cs @@ -18,12 +18,12 @@ public class ScanSettings #else (IntPtr)int.MaxValue; #endif - public SettingState SearchWritableMemory { get; set; } = SettingState.Yes; - public SettingState SearchExecutableMemory { get; set; } = SettingState.Indeterminate; - public SettingState SearchCopyOnWriteMemory { get; set; } = SettingState.No; - public bool SearchMemPrivate { get; set; } = true; - public bool SearchMemImage { get; set; } = true; - public bool SearchMemMapped { get; set; } = false; + public SettingState ScanWritableMemory { get; set; } = SettingState.Yes; + public SettingState ScanExecutableMemory { get; set; } = SettingState.Indeterminate; + public SettingState ScanCopyOnWriteMemory { get; set; } = SettingState.No; + public bool ScanMemPrivate { get; set; } = true; + public bool ScanMemImage { get; set; } = true; + public bool ScanMemMapped { get; set; } = false; public bool FastScan { get; set; } = true; public int FastScanAlignment { get; set; } = 1; public ScanValueType ValueType { get; set; } = ScanValueType.Byte; diff --git a/MemorySearcher/Scanner.cs b/MemorySearcher/Scanner.cs index 738c258e..e4e680bb 100644 --- a/MemorySearcher/Scanner.cs +++ b/MemorySearcher/Scanner.cs @@ -14,10 +14,9 @@ namespace ReClassNET.MemorySearcher public class Scanner : IDisposable { private readonly RemoteProcess process; - private readonly ScanSettings settings; private ScanResultStore store; - public ScanSettings Settings => settings; + public ScanSettings Settings { get; } public int TotalResultCount => store.TotalResultCount; @@ -29,7 +28,7 @@ public Scanner(RemoteProcess process, ScanSettings settings) Contract.Requires(settings != null); this.process = process; - this.settings = settings; + Settings = settings; isFirstScan = true; } @@ -58,21 +57,21 @@ private IList
GetSearchableSections() return process.Sections .Where(s => !s.Protection.HasFlag(SectionProtection.Guard)) - .Where(s => s.Start.InRange(settings.StartAddress, settings.StopAddress)) + .Where(s => s.Start.InRange(Settings.StartAddress, Settings.StopAddress)) .Where(s => { switch (s.Type) { - case SectionType.Private: return settings.SearchMemPrivate; - case SectionType.Image: return settings.SearchMemImage; - case SectionType.Mapped: return settings.SearchMemMapped; + case SectionType.Private: return Settings.ScanMemPrivate; + case SectionType.Image: return Settings.ScanMemImage; + case SectionType.Mapped: return Settings.ScanMemMapped; default: return false; } }) .Where(s => { var isWritable = s.Protection.HasFlag(SectionProtection.Write); - switch (settings.SearchWritableMemory) + switch (Settings.ScanWritableMemory) { case SettingState.Yes: return isWritable; case SettingState.No: return !isWritable; @@ -82,7 +81,7 @@ private IList
GetSearchableSections() .Where(s => { var isExecutable = s.Protection.HasFlag(SectionProtection.Execute); - switch (settings.SearchExecutableMemory) + switch (Settings.ScanExecutableMemory) { case SettingState.Yes: return isExecutable; case SettingState.No: return !isExecutable; @@ -92,7 +91,7 @@ private IList
GetSearchableSections() .Where(s => { var isCopyOnWrite = s.Protection.HasFlag(SectionProtection.CopyOnWrite); - switch (settings.SearchCopyOnWriteMemory) + switch (Settings.ScanCopyOnWriteMemory) { case SettingState.Yes: return isCopyOnWrite; case SettingState.No: return !isCopyOnWrite; @@ -102,12 +101,12 @@ private IList
GetSearchableSections() .ToList(); } - public Task Search(IMemoryComparer comparer, CancellationToken ct, IProgress progress) + public Task Search(IScanComparer comparer, CancellationToken ct, IProgress progress) { return isFirstScan ? FirstScan(comparer, ct, progress) : NextScan(comparer, ct, progress); } - private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IProgress progress) + private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProgress progress) { Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); @@ -128,7 +127,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr var result = Parallel.ForEach( sections, new ParallelOptions { CancellationToken = ct}, - () => new ScanContext(settings, comparer, initialBufferSize), + () => new ScanContext(Settings, comparer, initialBufferSize), (s, state, _, context) => { var size = s.Size.ToInt32(); @@ -170,7 +169,7 @@ private Task FirstScan(IMemoryComparer comparer, CancellationToken ct, IPr }, ct); } - private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IProgress progress) + private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgress progress) { Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); @@ -187,7 +186,7 @@ private Task NextScan(IMemoryComparer comparer, CancellationToken ct, IPro var result = Parallel.ForEach( store.GetResultBlocks(), new ParallelOptions { CancellationToken = ct }, - () => new ScanContext(settings, comparer, 0), + () => new ScanContext(Settings, comparer, 0), (b, state, _, context) => { context.EnsureBufferSize(b.Size); diff --git a/MemorySearcher/ScannerWorker.cs b/MemorySearcher/ScannerWorker.cs index ba08d963..565190ba 100644 --- a/MemorySearcher/ScannerWorker.cs +++ b/MemorySearcher/ScannerWorker.cs @@ -8,9 +8,9 @@ namespace ReClassNET.MemorySearcher internal class ScannerWorker { private readonly ScanSettings settings; - private readonly IMemoryComparer comparer; + private readonly IScanComparer comparer; - public ScannerWorker(ScanSettings settings, IMemoryComparer comparer) + public ScannerWorker(ScanSettings settings, IScanComparer comparer) { Contract.Requires(settings != null); Contract.Requires(comparer != null); @@ -57,10 +57,5 @@ public IEnumerable Search(byte[] data, int count, IEnumerable - + @@ -199,7 +199,7 @@ - + From ccd3cbd29653f7743256830cb30ffa163e3dddfe Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:20:27 +0200 Subject: [PATCH 090/777] Rename Search -> Scan (Part 3). --- ...ySearchForm.Designer.cs => ScannerForm.Designer.cs} | 0 Forms/{MemorySearchForm.cs => ScannerForm.cs} | 0 Forms/{MemorySearchForm.resx => ScannerForm.resx} | 0 ReClass.NET.csproj | 10 +++++----- 4 files changed, 5 insertions(+), 5 deletions(-) rename Forms/{MemorySearchForm.Designer.cs => ScannerForm.Designer.cs} (100%) rename Forms/{MemorySearchForm.cs => ScannerForm.cs} (100%) rename Forms/{MemorySearchForm.resx => ScannerForm.resx} (100%) diff --git a/Forms/MemorySearchForm.Designer.cs b/Forms/ScannerForm.Designer.cs similarity index 100% rename from Forms/MemorySearchForm.Designer.cs rename to Forms/ScannerForm.Designer.cs diff --git a/Forms/MemorySearchForm.cs b/Forms/ScannerForm.cs similarity index 100% rename from Forms/MemorySearchForm.cs rename to Forms/ScannerForm.cs diff --git a/Forms/MemorySearchForm.resx b/Forms/ScannerForm.resx similarity index 100% rename from Forms/MemorySearchForm.resx rename to Forms/ScannerForm.resx diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index c5878c29..dadffd55 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -176,11 +176,11 @@ InputBytesForm.cs - + Form - - MemorySearchForm.cs + + ScannerForm.cs @@ -449,8 +449,8 @@ InputBytesForm.cs - - MemorySearchForm.cs + + ScannerForm.cs ClassNodeView.cs From 7ecdb074a17ea6059a3fc6189b872dfb26293396 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:29:42 +0200 Subject: [PATCH 091/777] Rename Search -> Scan (Part 4). --- .../BytePattern.cs | 0 .../Comparer/ArrayOfBytesMemoryComparer.cs | 0 .../Comparer/ByteMemoryComparer.cs | 0 .../Comparer/DoubleMemoryComparer.cs | 0 .../Comparer/FloatMemoryComparer.cs | 0 .../Comparer/IScanComparer.cs | 0 .../Comparer/IntegerMemoryComparer.cs | 0 .../Comparer/InvalidCompareTypeException.cs | 0 .../Comparer/LongMemoryComparer.cs | 0 .../Comparer/ShortMemoryComparer.cs | 0 .../Comparer/StringMemoryComparer.cs | 0 .../MemoryRecord.cs | 0 .../ScanCompareType.cs | 0 .../ScanContext.cs | 0 .../ScanResult.cs | 0 .../ScanResultBlock.cs | 0 .../ScanResultStore.cs | 0 .../ScanRoundMode.cs | 0 .../ScanSettings.cs | 0 .../ScanValueType.cs | 0 {MemorySearcher => MemoryScanner}/Scanner.cs | 0 .../ScannerWorker.cs | 0 ReClass.NET.csproj | 44 +++++++++---------- 23 files changed, 22 insertions(+), 22 deletions(-) rename {MemorySearcher => MemoryScanner}/BytePattern.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/ArrayOfBytesMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/ByteMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/DoubleMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/FloatMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/IScanComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/IntegerMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/InvalidCompareTypeException.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/LongMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/ShortMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/Comparer/StringMemoryComparer.cs (100%) rename {MemorySearcher => MemoryScanner}/MemoryRecord.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanCompareType.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanContext.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanResult.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanResultBlock.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanResultStore.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanRoundMode.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanSettings.cs (100%) rename {MemorySearcher => MemoryScanner}/ScanValueType.cs (100%) rename {MemorySearcher => MemoryScanner}/Scanner.cs (100%) rename {MemorySearcher => MemoryScanner}/ScannerWorker.cs (100%) diff --git a/MemorySearcher/BytePattern.cs b/MemoryScanner/BytePattern.cs similarity index 100% rename from MemorySearcher/BytePattern.cs rename to MemoryScanner/BytePattern.cs diff --git a/MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs b/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/ArrayOfBytesMemoryComparer.cs rename to MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs diff --git a/MemorySearcher/Comparer/ByteMemoryComparer.cs b/MemoryScanner/Comparer/ByteMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/ByteMemoryComparer.cs rename to MemoryScanner/Comparer/ByteMemoryComparer.cs diff --git a/MemorySearcher/Comparer/DoubleMemoryComparer.cs b/MemoryScanner/Comparer/DoubleMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/DoubleMemoryComparer.cs rename to MemoryScanner/Comparer/DoubleMemoryComparer.cs diff --git a/MemorySearcher/Comparer/FloatMemoryComparer.cs b/MemoryScanner/Comparer/FloatMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/FloatMemoryComparer.cs rename to MemoryScanner/Comparer/FloatMemoryComparer.cs diff --git a/MemorySearcher/Comparer/IScanComparer.cs b/MemoryScanner/Comparer/IScanComparer.cs similarity index 100% rename from MemorySearcher/Comparer/IScanComparer.cs rename to MemoryScanner/Comparer/IScanComparer.cs diff --git a/MemorySearcher/Comparer/IntegerMemoryComparer.cs b/MemoryScanner/Comparer/IntegerMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/IntegerMemoryComparer.cs rename to MemoryScanner/Comparer/IntegerMemoryComparer.cs diff --git a/MemorySearcher/Comparer/InvalidCompareTypeException.cs b/MemoryScanner/Comparer/InvalidCompareTypeException.cs similarity index 100% rename from MemorySearcher/Comparer/InvalidCompareTypeException.cs rename to MemoryScanner/Comparer/InvalidCompareTypeException.cs diff --git a/MemorySearcher/Comparer/LongMemoryComparer.cs b/MemoryScanner/Comparer/LongMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/LongMemoryComparer.cs rename to MemoryScanner/Comparer/LongMemoryComparer.cs diff --git a/MemorySearcher/Comparer/ShortMemoryComparer.cs b/MemoryScanner/Comparer/ShortMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/ShortMemoryComparer.cs rename to MemoryScanner/Comparer/ShortMemoryComparer.cs diff --git a/MemorySearcher/Comparer/StringMemoryComparer.cs b/MemoryScanner/Comparer/StringMemoryComparer.cs similarity index 100% rename from MemorySearcher/Comparer/StringMemoryComparer.cs rename to MemoryScanner/Comparer/StringMemoryComparer.cs diff --git a/MemorySearcher/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs similarity index 100% rename from MemorySearcher/MemoryRecord.cs rename to MemoryScanner/MemoryRecord.cs diff --git a/MemorySearcher/ScanCompareType.cs b/MemoryScanner/ScanCompareType.cs similarity index 100% rename from MemorySearcher/ScanCompareType.cs rename to MemoryScanner/ScanCompareType.cs diff --git a/MemorySearcher/ScanContext.cs b/MemoryScanner/ScanContext.cs similarity index 100% rename from MemorySearcher/ScanContext.cs rename to MemoryScanner/ScanContext.cs diff --git a/MemorySearcher/ScanResult.cs b/MemoryScanner/ScanResult.cs similarity index 100% rename from MemorySearcher/ScanResult.cs rename to MemoryScanner/ScanResult.cs diff --git a/MemorySearcher/ScanResultBlock.cs b/MemoryScanner/ScanResultBlock.cs similarity index 100% rename from MemorySearcher/ScanResultBlock.cs rename to MemoryScanner/ScanResultBlock.cs diff --git a/MemorySearcher/ScanResultStore.cs b/MemoryScanner/ScanResultStore.cs similarity index 100% rename from MemorySearcher/ScanResultStore.cs rename to MemoryScanner/ScanResultStore.cs diff --git a/MemorySearcher/ScanRoundMode.cs b/MemoryScanner/ScanRoundMode.cs similarity index 100% rename from MemorySearcher/ScanRoundMode.cs rename to MemoryScanner/ScanRoundMode.cs diff --git a/MemorySearcher/ScanSettings.cs b/MemoryScanner/ScanSettings.cs similarity index 100% rename from MemorySearcher/ScanSettings.cs rename to MemoryScanner/ScanSettings.cs diff --git a/MemorySearcher/ScanValueType.cs b/MemoryScanner/ScanValueType.cs similarity index 100% rename from MemorySearcher/ScanValueType.cs rename to MemoryScanner/ScanValueType.cs diff --git a/MemorySearcher/Scanner.cs b/MemoryScanner/Scanner.cs similarity index 100% rename from MemorySearcher/Scanner.cs rename to MemoryScanner/Scanner.cs diff --git a/MemorySearcher/ScannerWorker.cs b/MemoryScanner/ScannerWorker.cs similarity index 100% rename from MemorySearcher/ScannerWorker.cs rename to MemoryScanner/ScannerWorker.cs diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index dadffd55..d4a150cb 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -182,28 +182,28 @@ ScannerForm.cs - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + From cf42f9d798c3b2d5547e516c7f97428c1194b3f3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:41:04 +0200 Subject: [PATCH 092/777] Rename Search -> Scan (Part 5). --- DataExchange/Scanner/CheatEngineFile.cs | 2 +- DataExchange/Scanner/CrySearchFile.cs | 2 +- DataExchange/Scanner/IScannerExport.cs | 2 +- DataExchange/Scanner/IScannerImport.cs | 2 +- DataExchange/Scanner/ReClassScanFile.cs | 2 +- Forms/ScannerForm.cs | 6 ++---- MemoryScanner/BytePattern.cs | 2 +- MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs | 2 +- MemoryScanner/Comparer/ByteMemoryComparer.cs | 5 ++--- MemoryScanner/Comparer/DoubleMemoryComparer.cs | 2 +- MemoryScanner/Comparer/FloatMemoryComparer.cs | 2 +- MemoryScanner/Comparer/IScanComparer.cs | 2 +- MemoryScanner/Comparer/IntegerMemoryComparer.cs | 2 +- MemoryScanner/Comparer/InvalidCompareTypeException.cs | 2 +- MemoryScanner/Comparer/LongMemoryComparer.cs | 2 +- MemoryScanner/Comparer/ShortMemoryComparer.cs | 2 +- MemoryScanner/Comparer/StringMemoryComparer.cs | 2 +- MemoryScanner/MemoryRecord.cs | 2 +- MemoryScanner/ScanCompareType.cs | 2 +- MemoryScanner/ScanResult.cs | 2 +- MemoryScanner/ScanResultBlock.cs | 2 +- MemoryScanner/ScanResultStore.cs | 4 ++-- MemoryScanner/ScanRoundMode.cs | 2 +- MemoryScanner/ScanSettings.cs | 2 +- MemoryScanner/ScanValueType.cs | 2 +- MemoryScanner/Scanner.cs | 7 ++++--- MemoryScanner/{ScanContext.cs => ScannerContext.cs} | 8 ++++---- MemoryScanner/ScannerWorker.cs | 4 ++-- ReClass.NET.csproj | 2 +- UI/MemorySearchResultControl.cs | 2 +- 30 files changed, 40 insertions(+), 42 deletions(-) rename MemoryScanner/{ScanContext.cs => ScannerContext.cs} (72%) diff --git a/DataExchange/Scanner/CheatEngineFile.cs b/DataExchange/Scanner/CheatEngineFile.cs index 025eb86c..67f28811 100644 --- a/DataExchange/Scanner/CheatEngineFile.cs +++ b/DataExchange/Scanner/CheatEngineFile.cs @@ -5,7 +5,7 @@ using System.Text; using System.Xml.Linq; using ReClassNET.Logger; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; namespace ReClassNET.DataExchange.Scanner { diff --git a/DataExchange/Scanner/CrySearchFile.cs b/DataExchange/Scanner/CrySearchFile.cs index 010e9a44..f1a99199 100644 --- a/DataExchange/Scanner/CrySearchFile.cs +++ b/DataExchange/Scanner/CrySearchFile.cs @@ -4,7 +4,7 @@ using System.Text; using System.Xml.Linq; using ReClassNET.Logger; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; namespace ReClassNET.DataExchange.Scanner { diff --git a/DataExchange/Scanner/IScannerExport.cs b/DataExchange/Scanner/IScannerExport.cs index 64d52aa8..83b58fa2 100644 --- a/DataExchange/Scanner/IScannerExport.cs +++ b/DataExchange/Scanner/IScannerExport.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using ReClassNET.Logger; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; namespace ReClassNET.DataExchange.Scanner { diff --git a/DataExchange/Scanner/IScannerImport.cs b/DataExchange/Scanner/IScannerImport.cs index 7ffbde3e..d9ee79dd 100644 --- a/DataExchange/Scanner/IScannerImport.cs +++ b/DataExchange/Scanner/IScannerImport.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using ReClassNET.Logger; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; namespace ReClassNET.DataExchange.Scanner { diff --git a/DataExchange/Scanner/ReClassScanFile.cs b/DataExchange/Scanner/ReClassScanFile.cs index dc5163c8..857134e3 100644 --- a/DataExchange/Scanner/ReClassScanFile.cs +++ b/DataExchange/Scanner/ReClassScanFile.cs @@ -7,7 +7,7 @@ using System.Text; using System.Xml.Linq; using ReClassNET.Logger; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; namespace ReClassNET.DataExchange.Scanner { diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index b7de3c10..c1ff5e35 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Diagnostics.Contracts; -using System.Drawing; using System.Globalization; using System.IO; using System.Linq; @@ -14,8 +11,9 @@ using ReClassNET.DataExchange.Scanner; using ReClassNET.Logger; using ReClassNET.Memory; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; using ReClassNET.MemorySearcher; -using ReClassNET.MemorySearcher.Comparer; using ReClassNET.UI; using ReClassNET.Util; diff --git a/MemoryScanner/BytePattern.cs b/MemoryScanner/BytePattern.cs index 75b116dd..bdb99631 100644 --- a/MemoryScanner/BytePattern.cs +++ b/MemoryScanner/BytePattern.cs @@ -5,7 +5,7 @@ using System.Linq; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public class BytePattern { diff --git a/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs b/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs index 06f91f96..e40dfa70 100644 --- a/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class ArrayOfBytesMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/ByteMemoryComparer.cs b/MemoryScanner/Comparer/ByteMemoryComparer.cs index dda26825..667374a0 100644 --- a/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -1,7 +1,6 @@ -using System; -using System.Diagnostics; +using System.Diagnostics; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class ByteMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/MemoryScanner/Comparer/DoubleMemoryComparer.cs index 7012342c..feaa0cc5 100644 --- a/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class DoubleMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/FloatMemoryComparer.cs b/MemoryScanner/Comparer/FloatMemoryComparer.cs index 88e9ddef..cb20d662 100644 --- a/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class FloatMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/IScanComparer.cs b/MemoryScanner/Comparer/IScanComparer.cs index 047aed95..197b7744 100644 --- a/MemoryScanner/Comparer/IScanComparer.cs +++ b/MemoryScanner/Comparer/IScanComparer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public interface IScanComparer { diff --git a/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/MemoryScanner/Comparer/IntegerMemoryComparer.cs index 36d271df..41e7685a 100644 --- a/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class IntegerMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/InvalidCompareTypeException.cs b/MemoryScanner/Comparer/InvalidCompareTypeException.cs index 18b3676a..2bf6ce91 100644 --- a/MemoryScanner/Comparer/InvalidCompareTypeException.cs +++ b/MemoryScanner/Comparer/InvalidCompareTypeException.cs @@ -1,6 +1,6 @@ using System; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class InvalidCompareTypeException : Exception { diff --git a/MemoryScanner/Comparer/LongMemoryComparer.cs b/MemoryScanner/Comparer/LongMemoryComparer.cs index 85b39c2d..69d9a33e 100644 --- a/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class LongMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/ShortMemoryComparer.cs b/MemoryScanner/Comparer/ShortMemoryComparer.cs index f7c7efe3..30448ce9 100644 --- a/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -1,7 +1,7 @@ using System; using System.Diagnostics; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class ShortMemoryComparer : IScanComparer { diff --git a/MemoryScanner/Comparer/StringMemoryComparer.cs b/MemoryScanner/Comparer/StringMemoryComparer.cs index 0b12b140..09c6c828 100644 --- a/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -3,7 +3,7 @@ using System.Text; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher.Comparer +namespace ReClassNET.MemoryScanner.Comparer { public class StringMemoryComparer : IScanComparer { diff --git a/MemoryScanner/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs index b560f51c..96e610e8 100644 --- a/MemoryScanner/MemoryRecord.cs +++ b/MemoryScanner/MemoryRecord.cs @@ -6,7 +6,7 @@ using ReClassNET.Memory; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public enum MemoryRecordAddressMode { diff --git a/MemoryScanner/ScanCompareType.cs b/MemoryScanner/ScanCompareType.cs index cc2e9b62..a7fb6459 100644 --- a/MemoryScanner/ScanCompareType.cs +++ b/MemoryScanner/ScanCompareType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public enum ScanCompareType { diff --git a/MemoryScanner/ScanResult.cs b/MemoryScanner/ScanResult.cs index 357b9e89..f793e4b3 100644 --- a/MemoryScanner/ScanResult.cs +++ b/MemoryScanner/ScanResult.cs @@ -2,7 +2,7 @@ using System.Diagnostics.Contracts; using System.Text; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public abstract class ScanResult { diff --git a/MemoryScanner/ScanResultBlock.cs b/MemoryScanner/ScanResultBlock.cs index 48909082..fec2991a 100644 --- a/MemoryScanner/ScanResultBlock.cs +++ b/MemoryScanner/ScanResultBlock.cs @@ -3,7 +3,7 @@ using System.Diagnostics.Contracts; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { internal class ScanResultBlock { diff --git a/MemoryScanner/ScanResultStore.cs b/MemoryScanner/ScanResultStore.cs index 3bbd227e..2d57476e 100644 --- a/MemoryScanner/ScanResultStore.cs +++ b/MemoryScanner/ScanResultStore.cs @@ -5,7 +5,7 @@ using System.Text; using ReClassNET.Util; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { internal class ScanResultStore : IDisposable { @@ -31,7 +31,7 @@ private enum StorageMode public ScanResultStore(ScanValueType valueType, string storePath) { this.valueType = valueType; - this.storePath = Path.Combine(storePath, $"ReClass.NET_MemorySearcher_{Guid.NewGuid()}.tmp"); + this.storePath = Path.Combine(storePath, $"ReClass.NET_MemoryScanner_{Guid.NewGuid()}.tmp"); } public void Dispose() diff --git a/MemoryScanner/ScanRoundMode.cs b/MemoryScanner/ScanRoundMode.cs index 15bcd89d..109a6aa7 100644 --- a/MemoryScanner/ScanRoundMode.cs +++ b/MemoryScanner/ScanRoundMode.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public enum ScanRoundMode { diff --git a/MemoryScanner/ScanSettings.cs b/MemoryScanner/ScanSettings.cs index f24b7078..e04178d1 100644 --- a/MemoryScanner/ScanSettings.cs +++ b/MemoryScanner/ScanSettings.cs @@ -1,6 +1,6 @@ using System; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public enum SettingState { diff --git a/MemoryScanner/ScanValueType.cs b/MemoryScanner/ScanValueType.cs index b6fe6489..7bfef7a4 100644 --- a/MemoryScanner/ScanValueType.cs +++ b/MemoryScanner/ScanValueType.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { public enum ScanValueType { diff --git a/MemoryScanner/Scanner.cs b/MemoryScanner/Scanner.cs index e4e680bb..ef5897a5 100644 --- a/MemoryScanner/Scanner.cs +++ b/MemoryScanner/Scanner.cs @@ -6,7 +6,8 @@ using System.Threading; using System.Threading.Tasks; using ReClassNET.Memory; -using ReClassNET.MemorySearcher.Comparer; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; using ReClassNET.Util; namespace ReClassNET.MemorySearcher @@ -127,7 +128,7 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg var result = Parallel.ForEach( sections, new ParallelOptions { CancellationToken = ct}, - () => new ScanContext(Settings, comparer, initialBufferSize), + () => new ScannerContext(Settings, comparer, initialBufferSize), (s, state, _, context) => { var size = s.Size.ToInt32(); @@ -186,7 +187,7 @@ private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgr var result = Parallel.ForEach( store.GetResultBlocks(), new ParallelOptions { CancellationToken = ct }, - () => new ScanContext(Settings, comparer, 0), + () => new ScannerContext(Settings, comparer, 0), (b, state, _, context) => { context.EnsureBufferSize(b.Size); diff --git a/MemoryScanner/ScanContext.cs b/MemoryScanner/ScannerContext.cs similarity index 72% rename from MemoryScanner/ScanContext.cs rename to MemoryScanner/ScannerContext.cs index c8f2c604..2c1dbc04 100644 --- a/MemoryScanner/ScanContext.cs +++ b/MemoryScanner/ScannerContext.cs @@ -1,14 +1,14 @@ using System.Diagnostics.Contracts; -using ReClassNET.MemorySearcher.Comparer; +using ReClassNET.MemoryScanner.Comparer; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { - internal class ScanContext + internal class ScannerContext { public byte[] Buffer { get; private set; } public ScannerWorker Worker { get; } - public ScanContext(ScanSettings settings, IScanComparer comparer, int bufferSize) + public ScannerContext(ScanSettings settings, IScanComparer comparer, int bufferSize) { Contract.Requires(settings != null); Contract.Requires(comparer != null); diff --git a/MemoryScanner/ScannerWorker.cs b/MemoryScanner/ScannerWorker.cs index 565190ba..2b8efe74 100644 --- a/MemoryScanner/ScannerWorker.cs +++ b/MemoryScanner/ScannerWorker.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using ReClassNET.MemorySearcher.Comparer; +using ReClassNET.MemoryScanner.Comparer; -namespace ReClassNET.MemorySearcher +namespace ReClassNET.MemoryScanner { internal class ScannerWorker { diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index d4a150cb..d32fdd58 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -194,7 +194,7 @@ - + diff --git a/UI/MemorySearchResultControl.cs b/UI/MemorySearchResultControl.cs index e32fbbc0..a81a3bf4 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemorySearchResultControl.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Windows.Forms; using ReClassNET.Memory; -using ReClassNET.MemorySearcher; +using ReClassNET.MemoryScanner; using ReClassNET.Util; namespace ReClassNET.UI From 5a461550d2fe9e384b26b820e01c33d03bd45882 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:55:58 +0200 Subject: [PATCH 093/777] Rename Search -> Scan (Part 6). --- Forms/ScannerForm.Designer.cs | 66 +++++++++---------- Forms/ScannerForm.cs | 37 ++++++----- Forms/ScannerForm.resx | 6 -- ReClass.NET.csproj | 10 +-- UI/DualValueControl.cs | 6 ++ ...signer.cs => MemoryRecordList.Designer.cs} | 2 +- ...chResultControl.cs => MemoryRecordList.cs} | 4 +- ...sultControl.resx => MemoryRecordList.resx} | 0 8 files changed, 66 insertions(+), 65 deletions(-) rename UI/{MemorySearchResultControl.Designer.cs => MemoryRecordList.Designer.cs} (99%) rename UI/{MemorySearchResultControl.cs => MemoryRecordList.cs} (96%) rename UI/{MemorySearchResultControl.resx => MemoryRecordList.resx} (100%) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index c257b3e2..4a62ca78 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -62,8 +62,8 @@ private void InitializeComponent() this.scanProgressBar = new System.Windows.Forms.ProgressBar(); this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); - this.memorySearchResultControl = new ReClassNET.UI.MemorySearchResultControl(); - this.addressListMemorySearchResultControl = new ReClassNET.UI.MemorySearchResultControl(); + this.resultMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); + this.addressListMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); this.toolStripPanel = new System.Windows.Forms.ToolStripPanel(); this.menuToolStrip = new System.Windows.Forms.ToolStrip(); this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); @@ -445,37 +445,37 @@ private void InitializeComponent() this.updateValuesTimer.Interval = 1000; this.updateValuesTimer.Tick += new System.EventHandler(this.updateValuesTimer_Tick); // - // memorySearchResultControl + // resultMemoryRecordList // - this.memorySearchResultControl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.memorySearchResultControl.Location = new System.Drawing.Point(11, 80); - this.memorySearchResultControl.Name = "memorySearchResultControl"; - this.memorySearchResultControl.ShowAddressColumn = true; - this.memorySearchResultControl.ShowDescriptionColumn = false; - this.memorySearchResultControl.ShowPreviousValueColumn = true; - this.memorySearchResultControl.ShowValueColumn = true; - this.memorySearchResultControl.ShowValuesHexadecimal = false; - this.memorySearchResultControl.ShowValueTypeColumn = false; - this.memorySearchResultControl.Size = new System.Drawing.Size(268, 292); - this.memorySearchResultControl.TabIndex = 16; - this.memorySearchResultControl.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); - // - // addressListMemorySearchResultControl - // - this.addressListMemorySearchResultControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.resultMemoryRecordList.Location = new System.Drawing.Point(11, 80); + this.resultMemoryRecordList.Name = "resultMemoryRecordList"; + this.resultMemoryRecordList.ShowAddressColumn = true; + this.resultMemoryRecordList.ShowDescriptionColumn = false; + this.resultMemoryRecordList.ShowPreviousValueColumn = true; + this.resultMemoryRecordList.ShowValueColumn = true; + this.resultMemoryRecordList.ShowValuesHexadecimal = false; + this.resultMemoryRecordList.ShowValueTypeColumn = false; + this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 292); + this.resultMemoryRecordList.TabIndex = 16; + this.resultMemoryRecordList.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); + // + // addressListMemoryRecordList + // + this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.addressListMemorySearchResultControl.Location = new System.Drawing.Point(11, 402); - this.addressListMemorySearchResultControl.Name = "addressListMemorySearchResultControl"; - this.addressListMemorySearchResultControl.ShowAddressColumn = true; - this.addressListMemorySearchResultControl.ShowDescriptionColumn = true; - this.addressListMemorySearchResultControl.ShowPreviousValueColumn = false; - this.addressListMemorySearchResultControl.ShowValueColumn = true; - this.addressListMemorySearchResultControl.ShowValuesHexadecimal = false; - this.addressListMemorySearchResultControl.ShowValueTypeColumn = true; - this.addressListMemorySearchResultControl.Size = new System.Drawing.Size(592, 169); - this.addressListMemorySearchResultControl.TabIndex = 17; + this.addressListMemoryRecordList.Location = new System.Drawing.Point(11, 402); + this.addressListMemoryRecordList.Name = "addressListMemoryRecordList"; + this.addressListMemoryRecordList.ShowAddressColumn = true; + this.addressListMemoryRecordList.ShowDescriptionColumn = true; + this.addressListMemoryRecordList.ShowPreviousValueColumn = false; + this.addressListMemoryRecordList.ShowValueColumn = true; + this.addressListMemoryRecordList.ShowValuesHexadecimal = false; + this.addressListMemoryRecordList.ShowValueTypeColumn = true; + this.addressListMemoryRecordList.Size = new System.Drawing.Size(592, 169); + this.addressListMemoryRecordList.TabIndex = 17; // // toolStripPanel // @@ -544,8 +544,8 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(612, 583); this.Controls.Add(this.toolStripPanel); - this.Controls.Add(this.addressListMemorySearchResultControl); - this.Controls.Add(this.memorySearchResultControl); + this.Controls.Add(this.addressListMemoryRecordList); + this.Controls.Add(this.resultMemoryRecordList); this.Controls.Add(this.resultCountLabel); this.Controls.Add(this.scanProgressBar); this.Controls.Add(this.nextScanButton); @@ -611,8 +611,8 @@ private void InitializeComponent() private System.Windows.Forms.ProgressBar scanProgressBar; private System.Windows.Forms.Label resultCountLabel; private System.Windows.Forms.Timer updateValuesTimer; - private UI.MemorySearchResultControl memorySearchResultControl; - private UI.MemorySearchResultControl addressListMemorySearchResultControl; + private UI.MemoryRecordList resultMemoryRecordList; + private UI.MemoryRecordList addressListMemoryRecordList; private System.Windows.Forms.ToolStripPanel toolStripPanel; private System.Windows.Forms.ToolStrip menuToolStrip; private System.Windows.Forms.ToolStripButton openAddressFileToolStripButton; diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index c1ff5e35..8142c7d4 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -61,15 +61,15 @@ public ScannerForm(RemoteProcess process) { Reset(); - if (addressListMemorySearchResultControl.Records.Any()) + if (addressListMemoryRecordList.Records.Any()) { if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo) != DialogResult.Yes) { - addressListMemorySearchResultControl.Clear(); + addressListMemoryRecordList.Clear(); } else { - foreach (var record in addressListMemorySearchResultControl.Records) + foreach (var record in addressListMemoryRecordList.Records) { record.ResolveAddress(process); record.RefreshValue(process); @@ -102,8 +102,8 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) private void updateValuesTimer_Tick(object sender, EventArgs e) { - memorySearchResultControl.RefreshValues(process); - addressListMemorySearchResultControl.RefreshValues(process); + resultMemoryRecordList.RefreshValues(process); + addressListMemoryRecordList.RefreshValues(process); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -134,7 +134,7 @@ private void ShowResults() SetResultCount(searcher.TotalResultCount); - memorySearchResultControl.SetRecords( + resultMemoryRecordList.SetRecords( searcher.GetResults() .Take(MaxVisibleResults) .OrderBy(r => r.Address, IntPtrComparer.Instance) @@ -196,9 +196,10 @@ private void Reset() searcher = null; SetResultCount(0); - memorySearchResultControl.SetRecords(null); + resultMemoryRecordList.SetRecords(null); nextScanButton.Enabled = false; + valueDualValueControl.Clear(); valueTypeComboBox.Enabled = true; valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); @@ -392,12 +393,12 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) private void clearAddressListToolStripButton_Click(object sender, EventArgs e) { - addressListMemorySearchResultControl.Clear(); + addressListMemoryRecordList.Clear(); } private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) { - addressListMemorySearchResultControl.AddRecord(record); + addressListMemoryRecordList.AddRecord(record); } private void openAddressFileToolStripButton_Click(object sender, EventArgs e) @@ -430,7 +431,7 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) } if (import != null) { - if (addressListMemorySearchResultControl.Records.Any()) + if (addressListMemoryRecordList.Records.Any()) { if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo) != DialogResult.Yes) { @@ -438,14 +439,14 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) } } - addressListMemorySearchResultControl.SetRecords( - import.Load(ofd.FileName, Program.Logger) - .Select(r => - { - r.ResolveAddress(process); - r.RefreshValue(process); - return r; - }) + addressListMemoryRecordList.SetRecords( + import.Load(ofd.FileName, Program.Logger) + .Select(r => + { + r.ResolveAddress(process); + r.RefreshValue(process); + return r; + }) ); } } diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index f35ec465..e0f6ed97 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -126,12 +126,6 @@ 172, 6 - - 172, 6 - - - 304, 6 - 42 diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index d32fdd58..0c3a6aab 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -286,11 +286,11 @@ Component - + UserControl - - MemorySearchResultControl.cs + + MemoryRecordList.cs MemoryViewControl.cs @@ -469,8 +469,8 @@ DualValueControl.cs - - MemorySearchResultControl.cs + + MemoryRecordList.cs MemoryViewControl.cs diff --git a/UI/DualValueControl.cs b/UI/DualValueControl.cs index 8601f819..36111ab1 100644 --- a/UI/DualValueControl.cs +++ b/UI/DualValueControl.cs @@ -49,6 +49,12 @@ protected override void SetBoundsCore(int x, int y, int width, int height, Bound { base.SetBoundsCore(x, y, width, 40, specified); } + + public void Clear() + { + value1TextBox.Clear(); + value2TextBox.Clear(); + } } internal class DualValueControlDesigner : ControlDesigner diff --git a/UI/MemorySearchResultControl.Designer.cs b/UI/MemoryRecordList.Designer.cs similarity index 99% rename from UI/MemorySearchResultControl.Designer.cs rename to UI/MemoryRecordList.Designer.cs index a989a0be..cee746f2 100644 --- a/UI/MemorySearchResultControl.Designer.cs +++ b/UI/MemoryRecordList.Designer.cs @@ -1,6 +1,6 @@ namespace ReClassNET.UI { - partial class MemorySearchResultControl + partial class MemoryRecordList { /// /// Erforderliche Designervariable. diff --git a/UI/MemorySearchResultControl.cs b/UI/MemoryRecordList.cs similarity index 96% rename from UI/MemorySearchResultControl.cs rename to UI/MemoryRecordList.cs index a81a3bf4..26db1934 100644 --- a/UI/MemorySearchResultControl.cs +++ b/UI/MemoryRecordList.cs @@ -12,7 +12,7 @@ namespace ReClassNET.UI { public delegate void MemorySearchResultControlResultDoubleClickEventHandler(object sender, MemoryRecord record); - public partial class MemorySearchResultControl : UserControl + public partial class MemoryRecordList : UserControl { public bool ShowDescriptionColumn { @@ -52,7 +52,7 @@ public bool ShowPreviousValueColumn private readonly BindingList bindings; - public MemorySearchResultControl() + public MemoryRecordList() { InitializeComponent(); diff --git a/UI/MemorySearchResultControl.resx b/UI/MemoryRecordList.resx similarity index 100% rename from UI/MemorySearchResultControl.resx rename to UI/MemoryRecordList.resx From 3736b9aee82d2e37c39e625dec078db1bc4dea56 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 14:58:46 +0200 Subject: [PATCH 094/777] Changed control name. --- Forms/ScannerForm.Designer.cs | 22 +++++++++---------- Forms/ScannerForm.cs | 22 +++++++++---------- Forms/ScannerForm.resx | 6 +++++ ReClass.NET.csproj | 10 ++++----- ...l.Designer.cs => DualValueBox.Designer.cs} | 2 +- UI/{DualValueControl.cs => DualValueBox.cs} | 4 ++-- ...ualValueControl.resx => DualValueBox.resx} | 0 7 files changed, 36 insertions(+), 30 deletions(-) rename UI/{DualValueControl.Designer.cs => DualValueBox.Designer.cs} (99%) rename UI/{DualValueControl.cs => DualValueBox.cs} (94%) rename UI/{DualValueControl.resx => DualValueBox.resx} (100%) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 4a62ca78..693e54ce 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -36,7 +36,7 @@ private void InitializeComponent() this.scanTypeComboBox = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.isHexCheckBox = new System.Windows.Forms.CheckBox(); - this.valueDualValueControl = new ReClassNET.UI.DualValueControl(); + this.dualValueBox = new ReClassNET.UI.DualValueBox(); this.scanOptionsGroupBox = new System.Windows.Forms.GroupBox(); this.fastScanAlignmentTextBox = new System.Windows.Forms.TextBox(); this.fastScanCheckBox = new System.Windows.Forms.CheckBox(); @@ -99,7 +99,7 @@ private void InitializeComponent() this.filterGroupBox.Controls.Add(this.scanTypeComboBox); this.filterGroupBox.Controls.Add(this.label1); this.filterGroupBox.Controls.Add(this.isHexCheckBox); - this.filterGroupBox.Controls.Add(this.valueDualValueControl); + this.filterGroupBox.Controls.Add(this.dualValueBox); this.filterGroupBox.Location = new System.Drawing.Point(3, 3); this.filterGroupBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 1); this.filterGroupBox.Name = "filterGroupBox"; @@ -160,15 +160,15 @@ private void InitializeComponent() this.isHexCheckBox.Text = "Is Hex"; this.isHexCheckBox.UseVisualStyleBackColor = true; // - // valueDualValueControl + // dualValueBox // - this.valueDualValueControl.Location = new System.Drawing.Point(72, 12); - this.valueDualValueControl.Name = "valueDualValueControl"; - this.valueDualValueControl.ShowSecondInputField = false; - this.valueDualValueControl.Size = new System.Drawing.Size(224, 40); - this.valueDualValueControl.TabIndex = 2; - this.valueDualValueControl.Value1 = ""; - this.valueDualValueControl.Value2 = ""; + this.dualValueBox.Location = new System.Drawing.Point(72, 12); + this.dualValueBox.Name = "dualValueBox"; + this.dualValueBox.ShowSecondInputField = false; + this.dualValueBox.Size = new System.Drawing.Size(224, 40); + this.dualValueBox.TabIndex = 2; + this.dualValueBox.Value1 = ""; + this.dualValueBox.Value2 = ""; // // scanOptionsGroupBox // @@ -580,7 +580,7 @@ private void InitializeComponent() private UI.BannerBox bannerBox; private System.Windows.Forms.GroupBox filterGroupBox; - private UI.DualValueControl valueDualValueControl; + private UI.DualValueBox dualValueBox; private System.Windows.Forms.CheckBox isHexCheckBox; private System.Windows.Forms.ComboBox scanTypeComboBox; private System.Windows.Forms.Label label1; diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 8142c7d4..c9b7472b 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -199,7 +199,7 @@ private void Reset() resultMemoryRecordList.SetRecords(null); nextScanButton.Enabled = false; - valueDualValueControl.Clear(); + dualValueBox.Clear(); valueTypeComboBox.Enabled = true; valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); @@ -322,8 +322,8 @@ private IScanComparer CreateComparer(ScanSettings settings) if (settings.ValueType == ScanValueType.Byte || settings.ValueType == ScanValueType.Short || settings.ValueType == ScanValueType.Integer || settings.ValueType == ScanValueType.Long) { var numberStyle = isHexCheckBox.Checked ? NumberStyles.HexNumber : NumberStyles.Integer; - long.TryParse(valueDualValueControl.Value1, numberStyle, null, out var value1); - long.TryParse(valueDualValueControl.Value2, numberStyle, null, out var value2); + long.TryParse(dualValueBox.Value1, numberStyle, null, out var value1); + long.TryParse(dualValueBox.Value2, numberStyle, null, out var value2); switch (settings.ValueType) { @@ -355,14 +355,14 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) return digits; } - var nf1 = Utils.GuessNumberFormat(valueDualValueControl.Value1); - double.TryParse(valueDualValueControl.Value1, NumberStyles.Float, nf1, out var value1); - var nf2 = Utils.GuessNumberFormat(valueDualValueControl.Value2); - double.TryParse(valueDualValueControl.Value2, NumberStyles.Float, nf2, out var value2); + var nf1 = Utils.GuessNumberFormat(dualValueBox.Value1); + double.TryParse(dualValueBox.Value1, NumberStyles.Float, nf1, out var value1); + var nf2 = Utils.GuessNumberFormat(dualValueBox.Value2); + double.TryParse(dualValueBox.Value2, NumberStyles.Float, nf2, out var value2); var significantDigits = Math.Max( - CalculateSignificantDigits(valueDualValueControl.Value1, nf1), - CalculateSignificantDigits(valueDualValueControl.Value2, nf2) + CalculateSignificantDigits(dualValueBox.Value1, nf1), + CalculateSignificantDigits(dualValueBox.Value2, nf2) ); var roundMode = roundStrictRadioButton.Checked ? ScanRoundMode.Strict : roundLooseRadioButton.Checked ? ScanRoundMode.Normal : ScanRoundMode.Truncate; @@ -377,7 +377,7 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) } else if (settings.ValueType == ScanValueType.ArrayOfBytes) { - var pattern = BytePattern.Parse(valueDualValueControl.Value1); + var pattern = BytePattern.Parse(dualValueBox.Value1); return new ArrayOfBytesMemoryComparer(pattern); } @@ -385,7 +385,7 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) { var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; - return new StringMemoryComparer(valueDualValueControl.Value1, encoding, caseSensitiveCheckBox.Checked); + return new StringMemoryComparer(dualValueBox.Value1, encoding, caseSensitiveCheckBox.Checked); } throw new Exception(); diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index e0f6ed97..f35ec465 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -126,6 +126,12 @@ 172, 6 + + 172, 6 + + + 304, 6 + 42 diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 0c3a6aab..7ff001f5 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -275,11 +275,11 @@ LogForm.cs - + UserControl - - DualValueControl.cs + + DualValueBox.cs @@ -466,8 +466,8 @@ ColorBox.cs - - DualValueControl.cs + + DualValueBox.cs MemoryRecordList.cs diff --git a/UI/DualValueControl.Designer.cs b/UI/DualValueBox.Designer.cs similarity index 99% rename from UI/DualValueControl.Designer.cs rename to UI/DualValueBox.Designer.cs index 8f00216e..9767497c 100644 --- a/UI/DualValueControl.Designer.cs +++ b/UI/DualValueBox.Designer.cs @@ -1,6 +1,6 @@ namespace ReClassNET.UI { - partial class DualValueControl + partial class DualValueBox { /// /// Erforderliche Designervariable. diff --git a/UI/DualValueControl.cs b/UI/DualValueBox.cs similarity index 94% rename from UI/DualValueControl.cs rename to UI/DualValueBox.cs index 36111ab1..8ac6c1c6 100644 --- a/UI/DualValueControl.cs +++ b/UI/DualValueBox.cs @@ -5,7 +5,7 @@ namespace ReClassNET.UI { [Designer(typeof(DualValueControlDesigner))] - public partial class DualValueControl : UserControl + public partial class DualValueBox : UserControl { public bool ShowSecondInputField { @@ -40,7 +40,7 @@ public string Value2 set => value2TextBox.Text = value; } - public DualValueControl() + public DualValueBox() { InitializeComponent(); } diff --git a/UI/DualValueControl.resx b/UI/DualValueBox.resx similarity index 100% rename from UI/DualValueControl.resx rename to UI/DualValueBox.resx From 832791c7a6a4e6fe8e373cb4dcbd0b251c97d2bf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 22:28:20 +0200 Subject: [PATCH 095/777] Changed floating point format. --- MemoryScanner/MemoryRecord.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MemoryScanner/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs index 96e610e8..bd139a5f 100644 --- a/MemoryScanner/MemoryRecord.cs +++ b/MemoryScanner/MemoryRecord.cs @@ -274,8 +274,8 @@ public void SetValue(RemoteProcess process, string input, bool isHex) private static string FormatValue(short value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); private static string FormatValue(int value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); - private static string FormatValue(float value) => value.ToString(CultureInfo.InvariantCulture); - private static string FormatValue(double value) => value.ToString(CultureInfo.InvariantCulture); + private static string FormatValue(float value) => value.ToString("0.0000"); + private static string FormatValue(double value) => value.ToString("0.0000"); private static string FormatValue(byte[] value) => Utils.ByteArrayToHexString(value); private static string FormatValue(string value) => value; } From a63fa9205b409419d37f3fc1826c63ea2fd6c440 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 22:28:42 +0200 Subject: [PATCH 096/777] Limit significant digits. --- MemoryScanner/Comparer/DoubleMemoryComparer.cs | 8 ++++---- MemoryScanner/Comparer/FloatMemoryComparer.cs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/MemoryScanner/Comparer/DoubleMemoryComparer.cs index feaa0cc5..63430460 100644 --- a/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -20,11 +20,11 @@ public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType { CompareType = compareType; RoundType = roundType; - this.significantDigits = significantDigits; - Value1 = Math.Round(value1, significantDigits, MidpointRounding.AwayFromZero); - Value2 = Math.Round(value2, significantDigits, MidpointRounding.AwayFromZero); + this.significantDigits = Math.Max(significantDigits, 1); + Value1 = Math.Round(value1, this.significantDigits, MidpointRounding.AwayFromZero); + Value2 = Math.Round(value2, this.significantDigits, MidpointRounding.AwayFromZero); - var factor = (int)Math.Pow(10.0, significantDigits); + var factor = (int)Math.Pow(10.0, this.significantDigits); minValue = value1 - 1.0 / factor; maxValue = value1 + 1.0 / factor; diff --git a/MemoryScanner/Comparer/FloatMemoryComparer.cs b/MemoryScanner/Comparer/FloatMemoryComparer.cs index cb20d662..672b5963 100644 --- a/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -20,11 +20,11 @@ public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, { CompareType = compareType; RoundType = roundType; - this.significantDigits = significantDigits; - Value1 = (float)Math.Round(value1, significantDigits, MidpointRounding.AwayFromZero); - Value2 = (float)Math.Round(value2, significantDigits, MidpointRounding.AwayFromZero); + this.significantDigits = Math.Max(significantDigits, 1); + Value1 = (float)Math.Round(value1, this.significantDigits, MidpointRounding.AwayFromZero); + Value2 = (float)Math.Round(value2, this.significantDigits, MidpointRounding.AwayFromZero); - var factor = (int)Math.Pow(10.0, significantDigits); + var factor = (int)Math.Pow(10.0, this.significantDigits); minValue = value1 - 1.0f / factor; maxValue = value1 + 1.0f / factor; From 07d706a0c69c3e59b07d74db2b5d9ea63c02d867 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 22:29:31 +0200 Subject: [PATCH 097/777] Added column auto sizing. --- UI/MemoryRecordList.Designer.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/UI/MemoryRecordList.Designer.cs b/UI/MemoryRecordList.Designer.cs index cee746f2..d89a90de 100644 --- a/UI/MemoryRecordList.Designer.cs +++ b/UI/MemoryRecordList.Designer.cs @@ -90,6 +90,7 @@ private void InitializeComponent() // // valueColumn // + this.valueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.valueColumn.DataPropertyName = "ValueStr"; this.valueColumn.HeaderText = "Value"; this.valueColumn.Name = "valueColumn"; @@ -98,18 +99,19 @@ private void InitializeComponent() // // previousValueColumn // + this.previousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.previousValueColumn.DataPropertyName = "PreviousValueStr"; this.previousValueColumn.HeaderText = "Previous"; this.previousValueColumn.Name = "previousValueColumn"; this.previousValueColumn.ReadOnly = true; this.previousValueColumn.Width = 73; // - // MemorySearchResultControl + // MemoryRecordList // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.resultDataGridView); - this.Name = "MemorySearchResultControl"; + this.Name = "MemoryRecordList"; this.Size = new System.Drawing.Size(290, 327); ((System.ComponentModel.ISupportInitialize)(this.resultDataGridView)).EndInit(); this.ResumeLayout(false); From 703ee01b3a6d5dab635c013588f3711a3b55034d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 22:29:52 +0200 Subject: [PATCH 098/777] Added address list export. --- Forms/ScannerForm.Designer.cs | 54 ++++++++++++++++++----------- Forms/ScannerForm.cs | 64 ++++++++++++++++++++++++++++++++--- Forms/ScannerForm.resx | 3 -- Util/Extension.Linq.cs | 8 +++++ 4 files changed, 102 insertions(+), 27 deletions(-) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 693e54ce..ebce8f1e 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -47,7 +47,7 @@ private void InitializeComponent() this.label4 = new System.Windows.Forms.Label(); this.startAddressTextBox = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); - this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.flowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); this.floatingOptionsGroupBox = new System.Windows.Forms.GroupBox(); this.roundTruncateRadioButton = new System.Windows.Forms.RadioButton(); this.roundLooseRadioButton = new System.Windows.Forms.RadioButton(); @@ -71,10 +71,11 @@ private void InitializeComponent() this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); + this.saveAddressFileAsToolStripButton = new System.Windows.Forms.ToolStripButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); - this.flowLayoutPanel1.SuspendLayout(); + this.flowLayoutPanel.SuspendLayout(); this.floatingOptionsGroupBox.SuspendLayout(); this.stringOptionsGroupBox.SuspendLayout(); this.toolStripPanel.SuspendLayout(); @@ -277,20 +278,20 @@ private void InitializeComponent() this.label2.TabIndex = 0; this.label2.Text = "Start:"; // - // flowLayoutPanel1 - // - this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanel1.Controls.Add(this.filterGroupBox); - this.flowLayoutPanel1.Controls.Add(this.floatingOptionsGroupBox); - this.flowLayoutPanel1.Controls.Add(this.stringOptionsGroupBox); - this.flowLayoutPanel1.Controls.Add(this.scanOptionsGroupBox); - this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanel1.Location = new System.Drawing.Point(292, 80); - this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); - this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(317, 294); - this.flowLayoutPanel1.TabIndex = 9; - this.flowLayoutPanel1.WrapContents = false; + // flowLayoutPanel + // + this.flowLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.flowLayoutPanel.Controls.Add(this.filterGroupBox); + this.flowLayoutPanel.Controls.Add(this.floatingOptionsGroupBox); + this.flowLayoutPanel.Controls.Add(this.stringOptionsGroupBox); + this.flowLayoutPanel.Controls.Add(this.scanOptionsGroupBox); + this.flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel.Location = new System.Drawing.Point(292, 80); + this.flowLayoutPanel.Margin = new System.Windows.Forms.Padding(0); + this.flowLayoutPanel.Name = "flowLayoutPanel"; + this.flowLayoutPanel.Size = new System.Drawing.Size(317, 294); + this.flowLayoutPanel.TabIndex = 9; + this.flowLayoutPanel.WrapContents = false; // // floatingOptionsGroupBox // @@ -493,11 +494,12 @@ private void InitializeComponent() this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openAddressFileToolStripButton, this.saveAddressFileToolStripButton, + this.saveAddressFileAsToolStripButton, this.toolStripSeparator1, this.clearAddressListToolStripButton}); this.menuToolStrip.Location = new System.Drawing.Point(3, 0); this.menuToolStrip.Name = "menuToolStrip"; - this.menuToolStrip.Size = new System.Drawing.Size(87, 25); + this.menuToolStrip.Size = new System.Drawing.Size(141, 25); this.menuToolStrip.TabIndex = 0; // // openAddressFileToolStripButton @@ -518,6 +520,7 @@ private void InitializeComponent() this.saveAddressFileToolStripButton.Name = "saveAddressFileToolStripButton"; this.saveAddressFileToolStripButton.Size = new System.Drawing.Size(23, 22); this.saveAddressFileToolStripButton.ToolTipText = "Save"; + this.saveAddressFileToolStripButton.Click += new System.EventHandler(this.saveAddressFileToolStripButton_Click); // // toolStripSeparator1 // @@ -538,6 +541,16 @@ private void InitializeComponent() // this.infoToolTip.AutomaticDelay = 100; // + // saveAddressFileAsToolStripButton + // + this.saveAddressFileAsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveAddressFileAsToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; + this.saveAddressFileAsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveAddressFileAsToolStripButton.Name = "saveAddressFileAsToolStripButton"; + this.saveAddressFileAsToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveAddressFileAsToolStripButton.ToolTipText = "Save As..."; + this.saveAddressFileAsToolStripButton.Click += new System.EventHandler(this.saveAsToolStripButton_Click); + // // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -550,7 +563,7 @@ private void InitializeComponent() this.Controls.Add(this.scanProgressBar); this.Controls.Add(this.nextScanButton); this.Controls.Add(this.firstScanButton); - this.Controls.Add(this.flowLayoutPanel1); + this.Controls.Add(this.flowLayoutPanel); this.Controls.Add(this.bannerBox); this.MinimumSize = new System.Drawing.Size(628, 622); this.Name = "ScannerForm"; @@ -562,7 +575,7 @@ private void InitializeComponent() this.filterGroupBox.PerformLayout(); this.scanOptionsGroupBox.ResumeLayout(false); this.scanOptionsGroupBox.PerformLayout(); - this.flowLayoutPanel1.ResumeLayout(false); + this.flowLayoutPanel.ResumeLayout(false); this.floatingOptionsGroupBox.ResumeLayout(false); this.floatingOptionsGroupBox.PerformLayout(); this.stringOptionsGroupBox.ResumeLayout(false); @@ -596,7 +609,7 @@ private void InitializeComponent() private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox startAddressTextBox; private System.Windows.Forms.Label label2; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel; private System.Windows.Forms.GroupBox floatingOptionsGroupBox; private System.Windows.Forms.RadioButton roundTruncateRadioButton; private System.Windows.Forms.RadioButton roundLooseRadioButton; @@ -620,5 +633,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripButton clearAddressListToolStripButton; private System.Windows.Forms.ToolTip infoToolTip; + private System.Windows.Forms.ToolStripButton saveAddressFileAsToolStripButton; } } \ No newline at end of file diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index c9b7472b..e18d655a 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -1,5 +1,4 @@ using System; -using System.Data; using System.Diagnostics.Contracts; using System.Globalization; using System.IO; @@ -57,8 +56,12 @@ public ScannerForm(RemoteProcess process) Reset(); + firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = process.IsValid; + process.ProcessAttached += sender => { + firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = true; + Reset(); if (addressListMemoryRecordList.Records.Any()) @@ -77,6 +80,12 @@ public ScannerForm(RemoteProcess process) } } }; + process.ProcessClosing += sender => + { + Reset(); + + firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = false; + }; } protected override void OnLoad(EventArgs e) @@ -128,7 +137,7 @@ private void SetResultCount(int count) resultCountLabel.Text = count > MaxVisibleResults ? $"Found: {count} (only {MaxVisibleResults} shown)" : $"Found: {count}"; } - private void ShowResults() + private void ShowScannerResults() { Contract.Requires(searcher != null); @@ -198,10 +207,16 @@ private void Reset() SetResultCount(0); resultMemoryRecordList.SetRecords(null); + firstScanButton.Enabled = true; nextScanButton.Enabled = false; + + isHexCheckBox.Enabled = true; + isHexCheckBox.Checked = false; dualValueBox.Clear(); + valueTypeComboBox.Enabled = true; valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); + OnValueTypeChanged(); floatingOptionsGroupBox.Enabled = true; stringOptionsGroupBox.Enabled = true; @@ -227,7 +242,7 @@ private async Task OnStartFirstScan() if (completed) { - ShowResults(); + ShowScannerResults(); firstScanButton.Enabled = true; nextScanButton.Enabled = true; @@ -264,7 +279,7 @@ private async Task OnStartSecondScan() if (completed) { - ShowResults(); + ShowScannerResults(); } scanProgressBar.Value = 0; @@ -401,6 +416,8 @@ private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRe addressListMemoryRecordList.AddRecord(record); } + private string addressFilePath; + private void openAddressFileToolStripButton_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) @@ -452,5 +469,44 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) } } } + + private void saveAddressFileToolStripButton_Click(object sender, EventArgs e) + { + if (addressListMemoryRecordList.Records.None()) + { + return; + } + + if (string.IsNullOrEmpty(addressFilePath)) + { + saveAsToolStripButton_Click(sender, e); + + return; + } + + var file = new ReClassScanFile(); + file.Save(addressListMemoryRecordList.Records, addressFilePath, Program.Logger); + } + + private void saveAsToolStripButton_Click(object sender, EventArgs e) + { + if (addressListMemoryRecordList.Records.None()) + { + return; + } + + using (var sfd = new SaveFileDialog()) + { + sfd.DefaultExt = ReClassScanFile.FileExtension; + sfd.Filter = $"{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + addressFilePath = sfd.FileName; + + saveAddressFileToolStripButton_Click(sender, e); + } + } + } } } diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index f35ec465..d916b150 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -126,9 +126,6 @@ 172, 6 - - 172, 6 - 304, 6 diff --git a/Util/Extension.Linq.cs b/Util/Extension.Linq.cs index 856f365a..b31bfcd7 100644 --- a/Util/Extension.Linq.cs +++ b/Util/Extension.Linq.cs @@ -66,6 +66,14 @@ public static TResult Min(this IEnumerable source, Fu } } + [DebuggerStepThrough] + public static bool None(this IEnumerable source) + { + Contract.Requires(source != null); + + return !source.Any(); + } + [DebuggerStepThrough] public static bool None(this IEnumerable source, Func predicate) { From 8fd0e298a848d0a79cf08b421f0c748d9908e820 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 23:01:10 +0200 Subject: [PATCH 099/777] Disable hex checkbox. --- Forms/ScannerForm.cs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index e18d655a..6759c426 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -160,18 +160,37 @@ private void OnValueTypeChanged() { SetValidCompareTypes(); + isHexCheckBox.Enabled = true; + var valueType = SelectedValueType; - int alignment = 1; switch (valueType) { + case ScanValueType.Byte: case ScanValueType.Short: - alignment = 2; - break; case ScanValueType.Integer: case ScanValueType.Long: + isHexCheckBox.Enabled = true; + break; case ScanValueType.Float: case ScanValueType.Double: + case ScanValueType.ArrayOfBytes: + case ScanValueType.String: + isHexCheckBox.Checked = false; + isHexCheckBox.Enabled = false; + break; + } + + var alignment = 1; + switch (valueType) + { + case ScanValueType.Short: + alignment = 2; + break; + case ScanValueType.Float: + case ScanValueType.Double: + case ScanValueType.Integer: + case ScanValueType.Long: alignment = 4; break; } From 911b1e807c12f0ee381f3d4628d17b05a15ce585 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 17 Sep 2017 23:23:35 +0200 Subject: [PATCH 100/777] Default input value. --- Forms/ScannerForm.Designer.cs | 30 +++++++++++++++--------------- Forms/ScannerForm.cs | 6 +++++- Forms/ScannerForm.resx | 3 --- UI/DualValueBox.Designer.cs | 4 ++-- UI/DualValueBox.cs | 16 ++++++++++++---- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index ebce8f1e..c4f66a33 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -68,10 +68,10 @@ private void InitializeComponent() this.menuToolStrip = new System.Windows.Forms.ToolStrip(); this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); this.saveAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveAddressFileAsToolStripButton = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.saveAddressFileAsToolStripButton = new System.Windows.Forms.ToolStripButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -166,10 +166,10 @@ private void InitializeComponent() this.dualValueBox.Location = new System.Drawing.Point(72, 12); this.dualValueBox.Name = "dualValueBox"; this.dualValueBox.ShowSecondInputField = false; - this.dualValueBox.Size = new System.Drawing.Size(224, 40); + this.dualValueBox.Size = new System.Drawing.Size(224, 34); this.dualValueBox.TabIndex = 2; - this.dualValueBox.Value1 = ""; - this.dualValueBox.Value2 = ""; + this.dualValueBox.Value1 = "0"; + this.dualValueBox.Value2 = "0"; // // scanOptionsGroupBox // @@ -499,7 +499,7 @@ private void InitializeComponent() this.clearAddressListToolStripButton}); this.menuToolStrip.Location = new System.Drawing.Point(3, 0); this.menuToolStrip.Name = "menuToolStrip"; - this.menuToolStrip.Size = new System.Drawing.Size(141, 25); + this.menuToolStrip.Size = new System.Drawing.Size(110, 25); this.menuToolStrip.TabIndex = 0; // // openAddressFileToolStripButton @@ -522,6 +522,16 @@ private void InitializeComponent() this.saveAddressFileToolStripButton.ToolTipText = "Save"; this.saveAddressFileToolStripButton.Click += new System.EventHandler(this.saveAddressFileToolStripButton_Click); // + // saveAddressFileAsToolStripButton + // + this.saveAddressFileAsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveAddressFileAsToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; + this.saveAddressFileAsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveAddressFileAsToolStripButton.Name = "saveAddressFileAsToolStripButton"; + this.saveAddressFileAsToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveAddressFileAsToolStripButton.ToolTipText = "Save As..."; + this.saveAddressFileAsToolStripButton.Click += new System.EventHandler(this.saveAsToolStripButton_Click); + // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; @@ -541,16 +551,6 @@ private void InitializeComponent() // this.infoToolTip.AutomaticDelay = 100; // - // saveAddressFileAsToolStripButton - // - this.saveAddressFileAsToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.saveAddressFileAsToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; - this.saveAddressFileAsToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.saveAddressFileAsToolStripButton.Name = "saveAddressFileAsToolStripButton"; - this.saveAddressFileAsToolStripButton.Size = new System.Drawing.Size(23, 22); - this.saveAddressFileAsToolStripButton.ToolTipText = "Save As..."; - this.saveAddressFileAsToolStripButton.Click += new System.EventHandler(this.saveAsToolStripButton_Click); - // // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 6759c426..4cdc3018 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -231,7 +231,6 @@ private void Reset() isHexCheckBox.Enabled = true; isHexCheckBox.Checked = false; - dualValueBox.Clear(); valueTypeComboBox.Enabled = true; valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); @@ -475,6 +474,11 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) } } + if (import is ReClassScanFile) + { + addressFilePath = ofd.FileName; + } + addressListMemoryRecordList.SetRecords( import.Load(ofd.FileName, Program.Logger) .Select(r => diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index d916b150..e0f6ed97 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -126,9 +126,6 @@ 172, 6 - - 304, 6 - 42 diff --git a/UI/DualValueBox.Designer.cs b/UI/DualValueBox.Designer.cs index 9767497c..6d4cdeee 100644 --- a/UI/DualValueBox.Designer.cs +++ b/UI/DualValueBox.Designer.cs @@ -95,12 +95,12 @@ private void InitializeComponent() this.tableLayoutPanel.Size = new System.Drawing.Size(255, 34); this.tableLayoutPanel.TabIndex = 4; // - // DualValueControl + // DualValueBox // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tableLayoutPanel); - this.Name = "DualValueControl"; + this.Name = "DualValueBox"; this.Size = new System.Drawing.Size(255, 34); this.tableLayoutPanel.ResumeLayout(false); this.tableLayoutPanel.PerformLayout(); diff --git a/UI/DualValueBox.cs b/UI/DualValueBox.cs index 8ac6c1c6..46dab641 100644 --- a/UI/DualValueBox.cs +++ b/UI/DualValueBox.cs @@ -47,13 +47,21 @@ public DualValueBox() protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { - base.SetBoundsCore(x, y, width, 40, specified); + base.SetBoundsCore(x, y, width, 34, specified); } - public void Clear() + public void Clear() => Clear(true, true); + + public void Clear(bool clearValue1, bool clearValue2) { - value1TextBox.Clear(); - value2TextBox.Clear(); + if (clearValue1) + { + value1TextBox.Clear(); + } + if (clearValue2) + { + value2TextBox.Clear(); + } } } From d0b23019201641a3f766ea0253bb1482b57a94b3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 18 Sep 2017 00:12:01 +0200 Subject: [PATCH 101/777] Use patternmatching. --- UI/MemoryViewControl.cs | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index a66714c9..c0d3a334 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -14,7 +14,7 @@ namespace ReClassNET.UI { - partial class MemoryViewControl : ScrollableCustomControl + public partial class MemoryViewControl : ScrollableCustomControl { private ReClassNetProject project; @@ -213,7 +213,7 @@ protected override void OnPaint(PaintEventArgs e) HorizontalScroll.Enabled = true; HorizontalScroll.LargeChange = ClientSize.Width; - HorizontalScroll.Maximum = (drawnSize.Width - ClientSize.Width) + HorizontalScroll.LargeChange; + HorizontalScroll.Maximum = drawnSize.Width - ClientSize.Width + HorizontalScroll.LargeChange; } else { @@ -375,8 +375,7 @@ protected override void OnMouseClick(MouseEventArgs e) { IEnumerable items = null; - var functionNode = hitObject as FunctionNode; - if (functionNode != null) + if (hitObject is FunctionNode functionNode) { var noneClass = new ClassNode(false) { @@ -385,8 +384,7 @@ protected override void OnMouseClick(MouseEventArgs e) void ChangeTypeHandler(object sender2, EventArgs e2) { - var selectedClassNode = (sender2 as TypeToolStripMenuItem)?.Tag as ClassNode; - if (selectedClassNode == null) + if (!((sender2 as TypeToolStripMenuItem)?.Tag is ClassNode selectedClassNode)) { return; } @@ -413,13 +411,11 @@ void ChangeTypeHandler(object sender2, EventArgs e2) }); } - var refNode = hitObject as BaseReferenceNode; - if (refNode != null) + if (hitObject is BaseReferenceNode refNode) { void ChangeInnerNodeHandler(object sender2, EventArgs e2) { - var selectedClassNode = (sender2 as TypeToolStripMenuItem)?.Tag as ClassNode; - if (selectedClassNode == null) + if (!((sender2 as TypeToolStripMenuItem)?.Tag is ClassNode selectedClassNode)) { return; } @@ -780,8 +776,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) { - var item = sender as IntegerToolStripMenuItem; - if (item == null) + if (!(sender is IntegerToolStripMenuItem item)) { return; } @@ -791,8 +786,7 @@ private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) private void insertBytesToolStripMenuItem_Click(object sender, EventArgs e) { - var item = sender as IntegerToolStripMenuItem; - if (item == null) + if (!(sender is IntegerToolStripMenuItem item)) { return; } @@ -802,8 +796,7 @@ private void insertBytesToolStripMenuItem_Click(object sender, EventArgs e) private void memoryTypeToolStripMenuItem_Click(object sender, EventArgs e) { - var item = sender as TypeToolStripMenuItem; - if (item == null) + if (!(sender is TypeToolStripMenuItem item)) { return; } @@ -815,8 +808,7 @@ private void createClassFromNodesToolStripMenuItem_Click(object sender, EventArg { if (selectedNodes.Count > 0 && !(selectedNodes[0].Node is ClassNode)) { - var parentNode = selectedNodes[0].Node.ParentNode as ClassNode; - if (parentNode != null) + if (selectedNodes[0].Node.ParentNode is ClassNode parentNode) { var newClassNode = ClassNode.Create(); selectedNodes.Select(h => h.Node).ForEach(newClassNode.AddNode); @@ -1089,8 +1081,7 @@ private void PasteNodeFromClipboardToSelection() if (selectedNodes.Count == 1) { var selectedNode = selectedNodes.First().Node; - var parent = selectedNode.ParentNode as ClassNode; - if (parent != null) + if (selectedNode.ParentNode is ClassNode parent) { foreach (var node in result.Item2) { @@ -1105,8 +1096,7 @@ private void PasteNodeFromClipboardToSelection() private bool IsCycleFree(ClassNode parent, BaseNode node) { - var referenceNode = node as BaseReferenceNode; - if (referenceNode == null) + if (!(node is BaseReferenceNode referenceNode)) { return true; } From 48f9ba2501c2d8ae23287aff53ff6e38ce29ab19 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 18 Sep 2017 00:12:39 +0200 Subject: [PATCH 102/777] Removed seperator. --- Forms/ProcessInfoForm.Designer.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Forms/ProcessInfoForm.Designer.cs b/Forms/ProcessInfoForm.Designer.cs index a1a2d676..bba84d88 100644 --- a/Forms/ProcessInfoForm.Designer.cs +++ b/Forms/ProcessInfoForm.Designer.cs @@ -31,7 +31,6 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.setCurrentClassAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.createClassAtAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.dumpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -65,12 +64,11 @@ private void InitializeComponent() // this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.setCurrentClassAddressToolStripMenuItem, - this.toolStripSeparator1, this.createClassAtAddressToolStripMenuItem, this.toolStripSeparator2, this.dumpToolStripMenuItem}); this.contextMenuStrip.Name = "contextMenuStrip"; - this.contextMenuStrip.Size = new System.Drawing.Size(203, 104); + this.contextMenuStrip.Size = new System.Drawing.Size(203, 98); // // setCurrentClassAddressToolStripMenuItem // @@ -80,11 +78,6 @@ private void InitializeComponent() this.setCurrentClassAddressToolStripMenuItem.Text = "Set current class address"; this.setCurrentClassAddressToolStripMenuItem.Click += new System.EventHandler(this.setCurrentClassAddressToolStripMenuItem_Click); // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(199, 6); - // // createClassAtAddressToolStripMenuItem // this.createClassAtAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; @@ -330,7 +323,6 @@ private void InitializeComponent() private System.Windows.Forms.DataGridView sectionsDataGridView; private System.Windows.Forms.ContextMenuStrip contextMenuStrip; private System.Windows.Forms.ToolStripMenuItem setCurrentClassAddressToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem createClassAtAddressToolStripMenuItem; private UI.BannerBox bannerBox1; private System.Windows.Forms.TabControl tabControl; From 825e65d8a12119205c0a57efea8cd3bd9b2d13cd Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 18 Sep 2017 17:34:20 +0200 Subject: [PATCH 103/777] Use pattern matching. --- Debugger/RemoteDebugger.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Debugger/RemoteDebugger.cs b/Debugger/RemoteDebugger.cs index 8d031fde..790ae130 100644 --- a/Debugger/RemoteDebugger.cs +++ b/Debugger/RemoteDebugger.cs @@ -182,7 +182,7 @@ private List SplitBreakpoint(IntPtr address, int size) private HardwareBreakpointRegister GetUsableDebugRegister() { - var all = new HashSet() + var all = new HashSet { HardwareBreakpointRegister.Dr0, HardwareBreakpointRegister.Dr1, @@ -194,8 +194,7 @@ private HardwareBreakpointRegister GetUsableDebugRegister() { foreach (var bp in breakpoints) { - var hwbp = bp as HardwareBreakpoint; - if (hwbp != null) + if (bp is HardwareBreakpoint hwbp) { all.Remove(hwbp.Register); } @@ -211,7 +210,7 @@ private HardwareBreakpointRegister GetUsableDebugRegister() } } - class BreakpointSplit + internal class BreakpointSplit { public IntPtr Address; public int Size; From 14c5865f6d55496da09d77991f62de9b21b85a9d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 18 Sep 2017 17:34:56 +0200 Subject: [PATCH 104/777] Added RealAddress. --- DataExchange/Scanner/CheatEngineFile.cs | 4 ++-- DataExchange/Scanner/CrySearchFile.cs | 2 +- DataExchange/Scanner/ReClassScanFile.cs | 9 +++++++-- MemoryScanner/MemoryRecord.cs | 15 ++++++++------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/DataExchange/Scanner/CheatEngineFile.cs b/DataExchange/Scanner/CheatEngineFile.cs index 67f28811..dd8e580c 100644 --- a/DataExchange/Scanner/CheatEngineFile.cs +++ b/DataExchange/Scanner/CheatEngineFile.cs @@ -59,14 +59,14 @@ public IEnumerable Load(string filePath, ILogger logger) if (addressParts.Length == 2) { long.TryParse(addressParts[1], NumberStyles.HexNumber, null, out var value); - record.Address = (IntPtr)value; + record.AddressOrOffset = (IntPtr)value; record.ModuleName = addressParts[0].Trim(); } else { long.TryParse(addressStr, NumberStyles.HexNumber, null, out var value); - record.Address = (IntPtr)value; + record.AddressOrOffset = (IntPtr)value; } if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) diff --git a/DataExchange/Scanner/CrySearchFile.cs b/DataExchange/Scanner/CrySearchFile.cs index f1a99199..42d77147 100644 --- a/DataExchange/Scanner/CrySearchFile.cs +++ b/DataExchange/Scanner/CrySearchFile.cs @@ -50,7 +50,7 @@ public IEnumerable Load(string filePath, ILogger logger) var record = new MemoryRecord { - Address = (IntPtr)value, + AddressOrOffset = (IntPtr)value, Description = description, ValueType = valueType }; diff --git a/DataExchange/Scanner/ReClassScanFile.cs b/DataExchange/Scanner/ReClassScanFile.cs index 857134e3..5927d8c6 100644 --- a/DataExchange/Scanner/ReClassScanFile.cs +++ b/DataExchange/Scanner/ReClassScanFile.cs @@ -28,6 +28,7 @@ public class ReClassScanFile : IScannerImport, IScannerExport public const string XmlValueTypeAttribute = "type"; public const string XmlAddressAttribute = "address"; public const string XmlModuleAttribute = "module"; + public const string XmlDescriptionAttribute = "description"; public const string XmlValueLengthAttribute = "length"; public const string XmlEncodingAttribute = "encoding"; @@ -68,6 +69,8 @@ public IEnumerable Load(string filePath, ILogger logger) continue; } + var description = element.Attribute(XmlDescriptionAttribute)?.Value ?? string.Empty; + var addressStr = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty; var moduleName = element.Attribute(XmlModuleAttribute)?.Value ?? string.Empty; @@ -75,7 +78,8 @@ public IEnumerable Load(string filePath, ILogger logger) var record = new MemoryRecord { - Address = (IntPtr)address, + Description = description, + AddressOrOffset = (IntPtr)address, ValueType = valueType }; @@ -137,7 +141,8 @@ public void Save(IEnumerable records, string filePath, ILogger log var temp = new XElement( XmlRecordElement, new XAttribute(XmlValueTypeAttribute, r.ValueType.ToString()), - new XAttribute(XmlAddressAttribute, r.Address.ToString(Constants.StringHexFormat)) + new XAttribute(XmlDescriptionAttribute, r.Description ?? string.Empty), + new XAttribute(XmlAddressAttribute, r.AddressOrOffset.ToString(Constants.StringHexFormat)) ); if (r.IsRelativeAddress) { diff --git a/MemoryScanner/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs index bd139a5f..587bf443 100644 --- a/MemoryScanner/MemoryRecord.cs +++ b/MemoryScanner/MemoryRecord.cs @@ -18,12 +18,11 @@ public enum MemoryRecordAddressMode public class MemoryRecord : INotifyPropertyChanged { private IntPtr addressOrOffset; - private IntPtr realAddress; private string moduleName; public MemoryRecordAddressMode AddressMode { get; set; } - public IntPtr Address + public IntPtr AddressOrOffset { get => addressOrOffset; set @@ -32,8 +31,10 @@ public IntPtr Address AddressMode = MemoryRecordAddressMode.Unknown; } } + + public IntPtr RealAddress { get; private set; } - public string AddressStr => realAddress.ToString(Constants.StringHexFormat); + public string AddressStr => RealAddress.ToString(Constants.StringHexFormat); public string ModuleName { @@ -123,7 +124,7 @@ public void ResolveAddress(RemoteProcess process) if (AddressMode == MemoryRecordAddressMode.Unknown) { - realAddress = addressOrOffset; + RealAddress = addressOrOffset; var module = process.GetModuleToPointer(addressOrOffset); if (module != null) @@ -143,7 +144,7 @@ public void ResolveAddress(RemoteProcess process) var module = process.GetModuleByName(ModuleName); if (module != null) { - realAddress = module.Start.Add(addressOrOffset); + RealAddress = module.Start.Add(addressOrOffset); } } } @@ -180,7 +181,7 @@ public void RefreshValue(RemoteProcess process) throw new InvalidOperationException(); } - if (process.ReadRemoteMemoryIntoBuffer(realAddress, ref buffer)) + if (process.ReadRemoteMemoryIntoBuffer(RealAddress, ref buffer)) { switch (ValueType) { @@ -264,7 +265,7 @@ public void SetValue(RemoteProcess process, string input, bool isHex) if (data != null) { - process.WriteRemoteMemory(realAddress, data); + process.WriteRemoteMemory(RealAddress, data); RefreshValue(process); } From 85082433587abeda1f620dc11ada1a2b6b6aa947 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 18 Sep 2017 20:19:27 +0200 Subject: [PATCH 105/777] Added re-attach button. --- Core/CoreFunctionsManager.cs | 15 ++++++ Forms/MainForm.Designer.cs | 12 +++++ Forms/MainForm.cs | 53 ++++++++++++++++++-- Properties/Resources.Designer.cs | 12 ++++- Properties/Resources.resx | 3 ++ ReClass.NET.csproj | 4 +- Resources/Images/B16x16_Magnifier_Arrow.png | Bin 0 -> 830 bytes 7 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 Resources/Images/B16x16_Magnifier_Arrow.png diff --git a/Core/CoreFunctionsManager.cs b/Core/CoreFunctionsManager.cs index e1f0a63a..b2489eb6 100644 --- a/Core/CoreFunctionsManager.cs +++ b/Core/CoreFunctionsManager.cs @@ -98,6 +98,13 @@ public void EnumerateProcesses(Action callbackProcess) currentFunctions.EnumerateProcesses(c); } + public IList EnumerateProcesses() + { + var processes = new List(); + EnumerateProcesses(processes.Add); + return processes; + } + public void EnumerateRemoteSectionsAndModules(IntPtr process, Action
callbackSection, Action callbackModule) { var c1 = callbackSection == null ? null : (EnumerateRemoteSectionCallback)delegate (ref EnumerateRemoteSectionData data) @@ -131,6 +138,14 @@ public void EnumerateRemoteSectionsAndModules(IntPtr process, Action
ca currentFunctions.EnumerateRemoteSectionsAndModules(process, c1, c2); } + public void EnumerateRemoteSectionsAndModules(IntPtr process, out List
sections, out List modules) + { + sections = new List
(); + modules = new List(); + + EnumerateRemoteSectionsAndModules(process, sections.Add, modules.Add); + } + public IntPtr OpenRemoteProcess(IntPtr pid, ProcessAccess desiredAccess) { return currentFunctions.OpenRemoteProcess(pid, desiredAccess); diff --git a/Forms/MainForm.Designer.cs b/Forms/MainForm.Designer.cs index fa6d73a3..5a05e687 100644 --- a/Forms/MainForm.Designer.cs +++ b/Forms/MainForm.Designer.cs @@ -108,6 +108,7 @@ private void InitializeComponent() this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.attachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reattachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.detachToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.openProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -932,6 +933,7 @@ private void InitializeComponent() // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.attachToProcessToolStripMenuItem, + this.reattachToProcessToolStripMenuItem, this.detachToolStripMenuItem, this.toolStripSeparator1, this.openProjectToolStripMenuItem, @@ -948,6 +950,7 @@ private void InitializeComponent() this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fileToolStripMenuItem.Text = "File"; + this.fileToolStripMenuItem.DropDownOpening += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpening); // // attachToProcessToolStripMenuItem // @@ -957,6 +960,14 @@ private void InitializeComponent() this.attachToProcessToolStripMenuItem.Text = "Attach to Process..."; this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripMenuItem_Click); // + // reattachToProcessToolStripMenuItem + // + this.reattachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Arrow; + this.reattachToProcessToolStripMenuItem.Name = "reattachToProcessToolStripMenuItem"; + this.reattachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.reattachToProcessToolStripMenuItem.Text = "<>"; + this.reattachToProcessToolStripMenuItem.Click += new System.EventHandler(this.reattachToProcessToolStripMenuItem_Click); + // // detachToolStripMenuItem // this.detachToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Remove; @@ -1334,6 +1345,7 @@ private void InitializeComponent() private UI.TypeToolStripButton boolToolStripButton; private UI.TypeToolStripButton fnTypeToolStripButton; private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; } } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index d9189a33..8709c0db 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -148,6 +148,20 @@ private async void MainForm_FormClosing(object sender, FormClosingEventArgs e) #region Menustrip + private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + var lastProcess = Program.Settings.LastProcess; + if (string.IsNullOrEmpty(lastProcess)) + { + reattachToProcessToolStripMenuItem.Visible = false; + } + else + { + reattachToProcessToolStripMenuItem.Visible = true; + reattachToProcessToolStripMenuItem.Text = $"Re-Attach to '{lastProcess}'"; + } + } + private void attachToProcessToolStripMenuItem_Click(object sender, EventArgs e) { using (var pb = new ProcessBrowserForm(coreFunctions, Program.Settings.LastProcess)) @@ -156,21 +170,38 @@ private void attachToProcessToolStripMenuItem_Click(object sender, EventArgs e) { if (pb.SelectedProcess != null) { - remoteProcess.Close(); + AttachToProcess(pb.SelectedProcess); - remoteProcess.Open(pb.SelectedProcess); - remoteProcess.UpdateProcessInformations(); if (pb.LoadSymbols) { LoadAllSymbolsForCurrentProcess(); } - - Program.Settings.LastProcess = remoteProcess.UnderlayingProcess.Name; } } } } + private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e) + { + var lastProcess = Program.Settings.LastProcess; + if (string.IsNullOrEmpty(lastProcess)) + { + return; + } + + var info = coreFunctions.EnumerateProcesses().FirstOrDefault(p => p.Name == lastProcess); + if (info == null) + { + MessageBox.Show($"Process '{lastProcess}' could not be found.", Constants.ApplicationName); + + Program.Settings.LastProcess = string.Empty; + } + else + { + AttachToProcess(info); + } + } + private void detachToolStripMenuItem_Click(object sender, EventArgs e) { remoteProcess.Close(); @@ -496,6 +527,18 @@ private void memoryViewControl_SelectionChanged(object sender, EventArgs e) #endregion + public void AttachToProcess(ProcessInfo info) + { + Contract.Requires(info != null); + + remoteProcess.Close(); + + remoteProcess.Open(info); + remoteProcess.UpdateProcessInformations(); + + Program.Settings.LastProcess = remoteProcess.UnderlayingProcess.Name; + } + /// Creates a new default class. public void CreateNewDefaultClass() { diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 8297585a..9a33c824 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -910,6 +910,16 @@ internal static System.Drawing.Bitmap B16x16_Magnifier { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Magnifier_Arrow { + get { + object obj = ResourceManager.GetObject("B16x16_Magnifier_Arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1231,7 +1241,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/14 21:59:08 + /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/18 18:04:02 /// ähnelt. /// internal static string BuildDate { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 47fd8aca..f8ac830f 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -475,4 +475,7 @@ ..\Resources\Images\B16x16_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Magnifier_Arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 7ff001f5..36882f7b 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -864,7 +864,9 @@ - + + + diff --git a/Resources/Images/B16x16_Magnifier_Arrow.png b/Resources/Images/B16x16_Magnifier_Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0cd45c1bec9285e61f1e378f6fefcfe8302f51 GIT binary patch literal 830 zcmV-E1Ht@>P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;#7RU!RCwB?lg(>fWfaDL@11+^v@`jdn=uJBlcZ@HJ533qXljIjiwLQ9QK38A zE?RIE6%5_ftsoK?ZpK9E|Dcvu8Vo8li2)--DJ0q^Bu;3|G#@j`%>8=r`*txYH4xnR zz=3l(@SNv4oFlZ>{2!PABO@PSnih>tYN)-v<9ezw{i+a{rDAbmd+TwoT=B*i7Z=Ip zatsX(F*!L&5Cmwgs{~qWnw!$YXI^^k^OlZot2JGVVF=bX%f0#Khhyu@_g^WMO78(t ze}6wh2qq>bo++rUNe-Uu?fc?LN1sSICdvd2Bd;Dl0r;vb_iY?8jyqTnT>aG<~nX@u6*5HN|3)LZN`~`_BlH4NWg^t2&A< zY`Rb=!$!H9?^Ix0nlv2idj7ez(;Yu-iJ%QD23syv0*F`D5k%lguq=of8X$fXxCVIp z1VU@g*I$j#Wcn|jEm;n`E+|!P8U`fe;MftjrU$eixgt<9vE!B8txAaMVE&h6Wu zhHLY*)j?+(G7Zq$0LL4vq1XSQ61uWAoy7~o3UKs*g>SyQ^{pTHpL}rLzR}$MBC+}; zH}4LhwIql_0x3D>oV2nnee8N==JUVo0rkM1&{`ve0HEh|_VQbApMSsWh3u($dn`HF zbA?DNA{C*~tQYg7l18s3cN_gi(lL z*fiC)a&PG_v&;7)^N{n7{2+YjNe>xGn(Nw-Dk9Q~N5xf~nihWhdy3gVr* Date: Mon, 18 Sep 2017 20:20:28 +0200 Subject: [PATCH 106/777] Added new EnumerateRemoteSectionsAndModules method. --- Forms/ProcessBrowserForm.cs | 29 ++++++++++++++--------------- Forms/ProcessInfoForm.cs | 5 ++--- Memory/RemoteProcess.cs | 20 ++++++++++++++++---- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Forms/ProcessBrowserForm.cs b/Forms/ProcessBrowserForm.cs index 213e4025..e5369189 100644 --- a/Forms/ProcessBrowserForm.cs +++ b/Forms/ProcessBrowserForm.cs @@ -15,7 +15,7 @@ public partial class ProcessBrowserForm : IconForm { private const string NoPreviousProcess = "No previous process"; - private static readonly string[] CommonProcesses = new string[] + private static readonly string[] commonProcesses = { "[system process]", "system", "svchost.exe", "services.exe", "wininit.exe", "smss.exe", "csrss.exe", "lsass.exe", "winlogon.exe", "wininit.exe", "dwm.exe" @@ -53,7 +53,7 @@ public ProcessBrowserForm(CoreFunctionsManager coreFunctions, string previousPro foreach (var row in processDataGridView.Rows.Cast()) { - if ((row.Cells[1].Value as string) == previousProcess) + if (row.Cells[1].Value as string == previousProcess) { processDataGridView.CurrentCell = row.Cells[1]; break; @@ -114,19 +114,18 @@ private void RefreshProcessList() dt.Columns.Add("path", typeof(string)); dt.Columns.Add("info", typeof(ProcessInfo)); - coreFunctions.EnumerateProcesses(p => + var shouldFilter = filterCheckBox.Checked; + + foreach (var p in coreFunctions.EnumerateProcesses().Where(p => !shouldFilter || !commonProcesses.Contains(p.Name.ToLower()))) { - if (!filterCheckBox.Checked || !CommonProcesses.Contains(p.Name.ToLower())) - { - var row = dt.NewRow(); - row["icon"] = NativeMethods.GetIconForFile(p.Path); - row["name"] = p.Name; - row["id"] = p.Id; - row["path"] = p.Path; - row["info"] = p; - dt.Rows.Add(row); - } - }); + var row = dt.NewRow(); + row["icon"] = NativeMethods.GetIconForFile(p.Path); + row["name"] = p.Name; + row["id"] = p.Id; + row["path"] = p.Path; + row["info"] = p; + dt.Rows.Add(row); + } dt.DefaultView.Sort = "name ASC"; @@ -142,7 +141,7 @@ private void ApplyFilter() { filter = $"name like '%{filter}%' or path like '%{filter}%'"; } - (processDataGridView.DataSource as DataTable).DefaultView.RowFilter = filter; + ((DataTable)processDataGridView.DataSource).DefaultView.RowFilter = filter; } } } diff --git a/Forms/ProcessInfoForm.cs b/Forms/ProcessInfoForm.cs index 074a8af9..62cd80e6 100644 --- a/Forms/ProcessInfoForm.cs +++ b/Forms/ProcessInfoForm.cs @@ -113,8 +113,7 @@ protected override void OnFormClosed(FormClosedEventArgs e) private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { - var dgv = sender as DataGridView; - if (dgv == null) + if (!(sender is DataGridView dgv)) { return; } @@ -226,7 +225,7 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) dumper.DumpSection(address, size, stream); } - MessageBox.Show("Module successfully dumped.", "ReClass.NET", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Module successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception ex) diff --git a/Memory/RemoteProcess.cs b/Memory/RemoteProcess.cs index 6b9c231a..eb35822b 100644 --- a/Memory/RemoteProcess.cs +++ b/Memory/RemoteProcess.cs @@ -520,6 +520,21 @@ public void EnumerateRemoteSectionsAndModules(Action
callbackSection, A coreFunctions.EnumerateRemoteSectionsAndModules(handle, callbackSection, callbackModule); } + public bool EnumerateRemoteSectionsAndModules(out List
sections, out List modules) + { + if (!IsValid) + { + sections = null; + modules = null; + + return false; + } + + coreFunctions.EnumerateRemoteSectionsAndModules(handle, out sections, out modules); + + return true; + } + /// Updates the process informations. public void UpdateProcessInformations() { @@ -550,10 +565,7 @@ public Task UpdateProcessInformationsAsync() return Task.Run(() => { - var newModules = new List(); - var newSections = new List
(); - - EnumerateRemoteSectionsAndModules(newSections.Add, newModules.Add); + EnumerateRemoteSectionsAndModules(out var newSections, out var newModules); newModules.Sort((m1, m2) => m1.Start.CompareTo(m2.Start)); newSections.Sort((s1, s2) => s1.Start.CompareTo(s2.Start)); From 066393ef00e41414f9c39cd2978dd23ff7e35b51 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 10:30:54 +0200 Subject: [PATCH 107/777] Added LinkedWindowFeatures for functions which work across different windows. --- Debugger/RemoteDebugger.Extensions.cs | 2 +- Forms/FoundCodeForm.cs | 5 +- Forms/MainForm.cs | 72 ++++------ Forms/PluginForm.cs | 15 +- Forms/ProcessBrowserForm.cs | 12 +- Forms/ProcessInfoForm.cs | 63 +++------ Forms/ScannerForm.Designer.cs | 165 +++++++++++++++++++++- Forms/ScannerForm.cs | 189 ++++++++++++++++++++------ Forms/ScannerForm.resx | 9 ++ Plugins/PluginManager.cs | 6 +- Program.cs | 19 ++- ReClass.NET.csproj | 1 + UI/ClassNodeView.cs | 2 +- UI/LinkedWindowFeatures.cs | 68 +++++++++ UI/MemoryViewControl.cs | 14 +- 15 files changed, 455 insertions(+), 187 deletions(-) create mode 100644 UI/LinkedWindowFeatures.cs diff --git a/Debugger/RemoteDebugger.Extensions.cs b/Debugger/RemoteDebugger.Extensions.cs index 0b7f7aa8..a5d1de7c 100644 --- a/Debugger/RemoteDebugger.Extensions.cs +++ b/Debugger/RemoteDebugger.Extensions.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Debugger { public static class RemoteDebuggerExtensions { - public static bool AskUserAndStartDebugger(this RemoteDebugger debugger) + public static bool AskUserAndAttachDebugger(this RemoteDebugger debugger) { Contract.Requires(debugger != null); diff --git a/Forms/FoundCodeForm.cs b/Forms/FoundCodeForm.cs index 37289efb..012c66f1 100644 --- a/Forms/FoundCodeForm.cs +++ b/Forms/FoundCodeForm.cs @@ -155,14 +155,11 @@ private void createFunctionButton_Click(object sender, EventArgs e) return; } - var node = ClassNode.Create(); - node.Address = functionStartAddress; + var node = LinkedWindowFeatures.CreateClassAtAddress(functionStartAddress, false); node.AddNode(new FunctionNode { Comment = info.Instructions[2].Instruction }); - - Program.MainForm.ClassView.SelectedClass = node; } private void stopButton_Click(object sender, EventArgs e) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 8709c0db..f43b4ddd 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -21,10 +21,6 @@ namespace ReClassNET.Forms { public partial class MainForm : IconForm { - private readonly CoreFunctionsManager coreFunctions; - - private readonly RemoteProcess remoteProcess; - private readonly PluginManager pluginManager; private ReClassNetProject currentProject; @@ -38,29 +34,24 @@ public partial class MainForm : IconForm public MenuStrip MainMenu => mainMenuStrip; - public MainForm(CoreFunctionsManager coreFunctions) + public MainForm() { - Contract.Requires(coreFunctions != null); - Contract.Ensures(remoteProcess != null); Contract.Ensures(pluginManager != null); Contract.Ensures(currentProject != null); - this.coreFunctions = coreFunctions; - InitializeComponent(); mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); - remoteProcess = new RemoteProcess(coreFunctions); - remoteProcess.ProcessAttached += sender => + Program.RemoteProcess.ProcessAttached += sender => { var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; Text = $"{Constants.ApplicationName} - {text}"; processInfoToolStripStatusLabel.Text = text; }; - remoteProcess.ProcessClosed += (sender) => + Program.RemoteProcess.ProcessClosed += (sender) => { Text = Constants.ApplicationName; processInfoToolStripStatusLabel.Text = "No process selected"; @@ -68,14 +59,12 @@ public MainForm(CoreFunctionsManager coreFunctions) memoryViewControl.Memory = new MemoryBuffer { - Process = remoteProcess + Process = Program.RemoteProcess }; - pluginManager = new PluginManager(new DefaultPluginHost(this, remoteProcess, Program.Logger), coreFunctions); + pluginManager = new PluginManager(new DefaultPluginHost(this, Program.RemoteProcess, Program.Logger)); SetProject(new ReClassNetProject()); - - newClassToolStripButton_Click(null, null); } protected override void OnLoad(EventArgs e) @@ -85,6 +74,8 @@ protected override void OnLoad(EventArgs e) GlobalWindowManager.AddWindow(this); pluginManager.LoadAllPlugins(Path.Combine(Application.StartupPath, Constants.PluginsFolder), Program.Logger); + + LinkedWindowFeatures.CreateDefaultClass(); } protected override void OnFormClosed(FormClosedEventArgs e) @@ -142,8 +133,6 @@ private async void MainForm_FormClosing(object sender, FormClosingEventArgs e) Close(); } - - remoteProcess.Dispose(); } #region Menustrip @@ -164,7 +153,7 @@ private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) private void attachToProcessToolStripMenuItem_Click(object sender, EventArgs e) { - using (var pb = new ProcessBrowserForm(coreFunctions, Program.Settings.LastProcess)) + using (var pb = new ProcessBrowserForm(Program.Settings.LastProcess)) { if (pb.ShowDialog() == DialogResult.OK) { @@ -189,7 +178,7 @@ private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e return; } - var info = coreFunctions.EnumerateProcesses().FirstOrDefault(p => p.Name == lastProcess); + var info = Program.CoreFunctions.EnumerateProcesses().FirstOrDefault(p => p.Name == lastProcess); if (info == null) { MessageBox.Show($"Process '{lastProcess}' could not be found.", Constants.ApplicationName); @@ -204,12 +193,12 @@ private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e private void detachToolStripMenuItem_Click(object sender, EventArgs e) { - remoteProcess.Close(); + Program.RemoteProcess.Close(); } private void newClassToolStripButton_Click(object sender, EventArgs e) { - CreateNewDefaultClass(); + LinkedWindowFeatures.CreateDefaultClass(); } private void openProjectToolStripMenuItem_Click(object sender, EventArgs e) @@ -310,7 +299,7 @@ private void settingsToolStripMenuItem_Click(object sender, EventArgs e) private void pluginsToolStripButton_Click(object sender, EventArgs e) { - using (var pf = new PluginForm(pluginManager, coreFunctions)) + using (var pf = new PluginForm(pluginManager)) { pf.ShowDialog(); } @@ -323,12 +312,12 @@ private void quitToolStripMenuItem_Click(object sender, EventArgs e) private void memoryViewerToolStripMenuItem_Click(object sender, EventArgs e) { - new ProcessInfoForm(remoteProcess, classesView).Show(); + new ProcessInfoForm().Show(); } private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) { - new ScannerForm(remoteProcess).Show(); + new ScannerForm().Show(); } private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) @@ -341,7 +330,7 @@ private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) { try { - remoteProcess.Symbols.LoadSymbolsFromPDB(ofd.FileName); + Program.RemoteProcess.Symbols.LoadSymbolsFromPDB(ofd.FileName); } catch (Exception ex) { @@ -358,7 +347,7 @@ private void loadSymbolsToolStripMenuItem_Click(object sender, EventArgs e) private void ControlRemoteProcessToolStripMenuItem_Click(object sender, EventArgs e) { - if (!remoteProcess.IsValid) + if (!Program.RemoteProcess.IsValid) { return; } @@ -373,7 +362,7 @@ private void ControlRemoteProcessToolStripMenuItem_Click(object sender, EventArg action = ControlRemoteProcessAction.Suspend; } - remoteProcess.ControlRemoteProcess(action); + Program.RemoteProcess.ControlRemoteProcess(action); } private void cleanUnusedClassesToolStripMenuItem_Click(object sender, EventArgs e) @@ -498,7 +487,7 @@ private void processUpdateTimer_Tick(object sender, EventArgs e) return; } - updateProcessInformationsTask = remoteProcess.UpdateProcessInformationsAsync(); + updateProcessInformationsTask = Program.RemoteProcess.UpdateProcessInformationsAsync(); } private void classesView_ClassSelected(object sender, ClassNode node) @@ -531,27 +520,12 @@ public void AttachToProcess(ProcessInfo info) { Contract.Requires(info != null); - remoteProcess.Close(); - - remoteProcess.Open(info); - remoteProcess.UpdateProcessInformations(); + Program.RemoteProcess.Close(); - Program.Settings.LastProcess = remoteProcess.UnderlayingProcess.Name; - } - - /// Creates a new default class. - public void CreateNewDefaultClass() - { - var node = ClassNode.Create(); - node.AddBytes(64); - - var mainModule = remoteProcess.GetModuleByName(remoteProcess.UnderlayingProcess?.Name); - if (mainModule != null) - { - node.Address = mainModule.Start; - } + Program.RemoteProcess.Open(info); + Program.RemoteProcess.UpdateProcessInformations(); - classesView.SelectedClass = node; + Program.Settings.LastProcess = Program.RemoteProcess.UnderlayingProcess.Name; } /// Sets the current project. @@ -728,7 +702,7 @@ private void LoadAllSymbolsForCurrentProcess() loadSymbolsTaskToken = new CancellationTokenSource(); - loadSymbolsTask = remoteProcess + loadSymbolsTask = Program.RemoteProcess .LoadAllSymbolsAsync(progress, loadSymbolsTaskToken.Token) .ContinueWith(_ => infoToolStripStatusLabel.Visible = false, TaskScheduler.FromCurrentSynchronizationContext()); } diff --git a/Forms/PluginForm.cs b/Forms/PluginForm.cs index 24f3558e..1cd5150e 100644 --- a/Forms/PluginForm.cs +++ b/Forms/PluginForm.cs @@ -4,7 +4,6 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; -using ReClassNET.Core; using ReClassNET.Plugins; using ReClassNET.UI; @@ -12,8 +11,6 @@ namespace ReClassNET.Forms { public partial class PluginForm : IconForm { - private readonly CoreFunctionsManager coreFunctions; - private class PluginInfoRow { private readonly PluginInfo plugin; @@ -33,12 +30,9 @@ public PluginInfoRow(PluginInfo plugin) } } - internal PluginForm(PluginManager pluginManager, CoreFunctionsManager coreFunctions) + internal PluginForm(PluginManager pluginManager) { Contract.Requires(pluginManager != null); - Contract.Requires(coreFunctions != null); - - this.coreFunctions = coreFunctions; InitializeComponent(); @@ -51,7 +45,7 @@ internal PluginForm(PluginManager pluginManager, CoreFunctionsManager coreFuncti // Native Methods Tab - functionsProvidersComboBox.Items.AddRange(coreFunctions.FunctionProviders.ToArray()); + functionsProvidersComboBox.Items.AddRange(Program.CoreFunctions.FunctionProviders.ToArray()); } protected override void OnLoad(EventArgs e) @@ -83,7 +77,7 @@ private void functionsProvidersComboBox_SelectionChangeCommitted(object sender, return; } - coreFunctions.SetActiveFunctionsProvider(provider); + Program.CoreFunctions.SetActiveFunctionsProvider(provider); } private void getMoreLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) @@ -104,8 +98,7 @@ private void UpdatePluginDescription() return; } - var plugin = row.DataBoundItem as PluginInfoRow; - if (plugin != null) + if (row.DataBoundItem is PluginInfoRow plugin) { descriptionGroupBox.Text = plugin.Name; descriptionLabel.Text = plugin.Description; diff --git a/Forms/ProcessBrowserForm.cs b/Forms/ProcessBrowserForm.cs index e5369189..8ed96774 100644 --- a/Forms/ProcessBrowserForm.cs +++ b/Forms/ProcessBrowserForm.cs @@ -1,10 +1,8 @@ using System; using System.Data; -using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; using System.Windows.Forms; -using ReClassNET.Core; using ReClassNET.Memory; using ReClassNET.Native; using ReClassNET.UI; @@ -21,8 +19,6 @@ public partial class ProcessBrowserForm : IconForm "smss.exe", "csrss.exe", "lsass.exe", "winlogon.exe", "wininit.exe", "dwm.exe" }; - private readonly CoreFunctionsManager coreFunctions; - /// Gets the selected process. public ProcessInfo SelectedProcess => (processDataGridView.SelectedRows.Cast().FirstOrDefault()?.DataBoundItem as DataRowView) ?.Row @@ -31,12 +27,8 @@ public partial class ProcessBrowserForm : IconForm /// Gets if symbols should get loaded. public bool LoadSymbols => loadSymbolsCheckBox.Checked; - public ProcessBrowserForm(CoreFunctionsManager coreFunctions, string previousProcess) + public ProcessBrowserForm(string previousProcess) { - Contract.Requires(coreFunctions != null); - - this.coreFunctions = coreFunctions; - InitializeComponent(); processDataGridView.AutoGenerateColumns = false; @@ -116,7 +108,7 @@ private void RefreshProcessList() var shouldFilter = filterCheckBox.Checked; - foreach (var p in coreFunctions.EnumerateProcesses().Where(p => !shouldFilter || !commonProcesses.Contains(p.Name.ToLower()))) + foreach (var p in Program.CoreFunctions.EnumerateProcesses().Where(p => !shouldFilter || !commonProcesses.Contains(p.Name.ToLower()))) { var row = dt.NewRow(); row["icon"] = NativeMethods.GetIconForFile(p.Path); diff --git a/Forms/ProcessInfoForm.cs b/Forms/ProcessInfoForm.cs index 62cd80e6..7c56d336 100644 --- a/Forms/ProcessInfoForm.cs +++ b/Forms/ProcessInfoForm.cs @@ -1,33 +1,22 @@ using System; using System.Data; -using System.Diagnostics.Contracts; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; using ReClassNET.Memory; using ReClassNET.Native; -using ReClassNET.Nodes; using ReClassNET.UI; namespace ReClassNET.Forms { public partial class ProcessInfoForm : IconForm { - private readonly RemoteProcess process; - private readonly ClassNodeView classesView; - /// The context menu of the sections grid view. public ContextMenuStrip GridContextMenu => contextMenuStrip; - public ProcessInfoForm(RemoteProcess process, ClassNodeView classesView) + public ProcessInfoForm() { - Contract.Requires(process != null); - Contract.Requires(classesView != null); - - this.process = process; - this.classesView = classesView; - InitializeComponent(); tabControl.ImageList = new ImageList(); @@ -45,7 +34,7 @@ public ProcessInfoForm(RemoteProcess process, ClassNodeView classesView) moduleIconDataGridViewImageColumn.Visible = false; } - if (process.IsValid) + if (Program.RemoteProcess.IsValid) { var sections = new DataTable(); sections.Columns.Add("address", typeof(string)); @@ -64,7 +53,7 @@ public ProcessInfoForm(RemoteProcess process, ClassNodeView classesView) modules.Columns.Add("path", typeof(string)); modules.Columns.Add("module", typeof(Module)); - process.EnumerateRemoteSectionsAndModules( + Program.RemoteProcess.EnumerateRemoteSectionsAndModules( delegate (Section section) { var row = sections.NewRow(); @@ -130,40 +119,12 @@ private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventAr private void setCurrentClassAddressToolStripMenuItem_Click(object sender, EventArgs e) { - var classNode = classesView.SelectedClass; - if (classNode == null) - { - return; - } - - IntPtr address; - if (GetToolStripSourceControl(sender) == modulesDataGridView) - { - address = GetSelectedModule()?.Start ?? IntPtr.Zero; - } - else - { - address = GetSelectedSection()?.Start ?? IntPtr.Zero; - } - - classNode.Address = address; + LinkedWindowFeatures.SetCurrentClassAddress(GetSelectedAddress(sender)); } private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArgs e) { - var node = ClassNode.Create(); - node.AddBytes(64); - - if (GetToolStripSourceControl(sender) == modulesDataGridView) - { - node.Address = GetSelectedModule()?.Start ?? IntPtr.Zero; - } - else - { - node.Address = GetSelectedSection()?.Start ?? IntPtr.Zero; - } - - classesView.SelectedClass = node; + LinkedWindowFeatures.CreateClassAtAddress(GetSelectedAddress(sender), true); } private void dumpToolStripMenuItem_Click(object sender, EventArgs e) @@ -210,7 +171,7 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) if (sfd.ShowDialog() == DialogResult.OK) { - var dumper = new Dumper(process); + var dumper = new Dumper(Program.RemoteProcess); try { @@ -245,6 +206,18 @@ private void sectionsDataGridView_CellMouseDoubleClick(object sender, DataGridVi #endregion + private IntPtr GetSelectedAddress(object sender) + { + if (GetToolStripSourceControl(sender) == modulesDataGridView) + { + return GetSelectedModule()?.Start ?? IntPtr.Zero; + } + else + { + return GetSelectedSection()?.Start ?? IntPtr.Zero; + } + } + private Control GetToolStripSourceControl(object sender) { return ((sender as ToolStripMenuItem)?.GetCurrentParent() as ContextMenuStrip)?.SourceControl; diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index c4f66a33..2a8432c0 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -63,6 +63,22 @@ private void InitializeComponent() this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); this.resultMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); + this.resultListContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addSelectedResultsToAddressListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeSelectedRecordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.changeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.descriptionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.valueTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.valueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.setCurrentClassAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createClassAtAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.findOutWhatAccessesThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addressListMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); this.toolStripPanel = new System.Windows.Forms.ToolStripPanel(); this.menuToolStrip = new System.Windows.Forms.ToolStrip(); @@ -78,6 +94,7 @@ private void InitializeComponent() this.flowLayoutPanel.SuspendLayout(); this.floatingOptionsGroupBox.SuspendLayout(); this.stringOptionsGroupBox.SuspendLayout(); + this.resultListContextMenuStrip.SuspendLayout(); this.toolStripPanel.SuspendLayout(); this.menuToolStrip.SuspendLayout(); this.SuspendLayout(); @@ -450,30 +467,155 @@ private void InitializeComponent() // this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.resultMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; this.resultMemoryRecordList.Location = new System.Drawing.Point(11, 80); this.resultMemoryRecordList.Name = "resultMemoryRecordList"; this.resultMemoryRecordList.ShowAddressColumn = true; this.resultMemoryRecordList.ShowDescriptionColumn = false; this.resultMemoryRecordList.ShowPreviousValueColumn = true; this.resultMemoryRecordList.ShowValueColumn = true; - this.resultMemoryRecordList.ShowValuesHexadecimal = false; this.resultMemoryRecordList.ShowValueTypeColumn = false; this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 292); this.resultMemoryRecordList.TabIndex = 16; this.resultMemoryRecordList.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // + // resultListContextMenuStrip + // + this.resultListContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addSelectedResultsToAddressListToolStripMenuItem, + this.removeSelectedRecordsToolStripMenuItem, + this.changeToolStripMenuItem, + this.toolStripSeparator2, + this.setCurrentClassAddressToolStripMenuItem, + this.createClassAtAddressToolStripMenuItem, + this.toolStripSeparator3, + this.findOutWhatAccessesThisAddressToolStripMenuItem, + this.findOutWhatWritesToThisAddressToolStripMenuItem, + this.toolStripSeparator4, + this.copyAddressToolStripMenuItem}); + this.resultListContextMenuStrip.Name = "resultListContextMenuStrip"; + this.resultListContextMenuStrip.Size = new System.Drawing.Size(270, 198); + this.resultListContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.resultListContextMenuStrip_Opening); + // + // addSelectedResultsToAddressListToolStripMenuItem + // + this.addSelectedResultsToAddressListToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Tree_Expand; + this.addSelectedResultsToAddressListToolStripMenuItem.Name = "addSelectedResultsToAddressListToolStripMenuItem"; + this.addSelectedResultsToAddressListToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.addSelectedResultsToAddressListToolStripMenuItem.Text = "Add selected results to address list"; + this.addSelectedResultsToAddressListToolStripMenuItem.Click += new System.EventHandler(this.addSelectedResultsToAddressListToolStripMenuItem_Click); + // + // removeSelectedRecordsToolStripMenuItem + // + this.removeSelectedRecordsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; + this.removeSelectedRecordsToolStripMenuItem.Name = "removeSelectedRecordsToolStripMenuItem"; + this.removeSelectedRecordsToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.removeSelectedRecordsToolStripMenuItem.Text = "Remove selected records"; + this.removeSelectedRecordsToolStripMenuItem.Click += new System.EventHandler(this.removeSelectedRecordsToolStripMenuItem_Click); + // + // changeToolStripMenuItem + // + this.changeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.descriptionToolStripMenuItem, + this.addressToolStripMenuItem, + this.valueTypeToolStripMenuItem, + this.valueToolStripMenuItem}); + this.changeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Textfield_Rename; + this.changeToolStripMenuItem.Name = "changeToolStripMenuItem"; + this.changeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.changeToolStripMenuItem.Text = "Change..."; + // + // descriptionToolStripMenuItem + // + this.descriptionToolStripMenuItem.Name = "descriptionToolStripMenuItem"; + this.descriptionToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.descriptionToolStripMenuItem.Text = "Description"; + // + // addressToolStripMenuItem + // + this.addressToolStripMenuItem.Name = "addressToolStripMenuItem"; + this.addressToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.addressToolStripMenuItem.Text = "Address"; + // + // valueTypeToolStripMenuItem + // + this.valueTypeToolStripMenuItem.Name = "valueTypeToolStripMenuItem"; + this.valueTypeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.valueTypeToolStripMenuItem.Text = "Value Type"; + // + // valueToolStripMenuItem + // + this.valueToolStripMenuItem.Name = "valueToolStripMenuItem"; + this.valueToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.valueToolStripMenuItem.Text = "Value"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(266, 6); + // + // setCurrentClassAddressToolStripMenuItem + // + this.setCurrentClassAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Exchange_Button; + this.setCurrentClassAddressToolStripMenuItem.Name = "setCurrentClassAddressToolStripMenuItem"; + this.setCurrentClassAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.setCurrentClassAddressToolStripMenuItem.Text = "Set current class address"; + this.setCurrentClassAddressToolStripMenuItem.Click += new System.EventHandler(this.setCurrentClassAddressToolStripMenuItem_Click); + // + // createClassAtAddressToolStripMenuItem + // + this.createClassAtAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; + this.createClassAtAddressToolStripMenuItem.Name = "createClassAtAddressToolStripMenuItem"; + this.createClassAtAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.createClassAtAddressToolStripMenuItem.Text = "Create class at address"; + this.createClassAtAddressToolStripMenuItem.Click += new System.EventHandler(this.createClassAtAddressToolStripMenuItem_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(266, 6); + // + // findOutWhatAccessesThisAddressToolStripMenuItem + // + this.findOutWhatAccessesThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Access; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Name = "findOutWhatAccessesThisAddressToolStripMenuItem"; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.findOutWhatAccessesThisAddressToolStripMenuItem.Text = "Find out what accesses this address..."; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatAccessesThisAddressToolStripMenuItem_Click); + // + // findOutWhatWritesToThisAddressToolStripMenuItem + // + this.findOutWhatWritesToThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Write; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Name = "findOutWhatWritesToThisAddressToolStripMenuItem"; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.findOutWhatWritesToThisAddressToolStripMenuItem.Text = "Find out what writes to this address..."; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatWritesToThisAddressToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(266, 6); + // + // copyAddressToolStripMenuItem + // + this.copyAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; + this.copyAddressToolStripMenuItem.Name = "copyAddressToolStripMenuItem"; + this.copyAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.copyAddressToolStripMenuItem.Text = "Copy Address"; + this.copyAddressToolStripMenuItem.Click += new System.EventHandler(this.copyAddressToolStripMenuItem_Click); + // // addressListMemoryRecordList // this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.addressListMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; this.addressListMemoryRecordList.Location = new System.Drawing.Point(11, 402); this.addressListMemoryRecordList.Name = "addressListMemoryRecordList"; this.addressListMemoryRecordList.ShowAddressColumn = true; this.addressListMemoryRecordList.ShowDescriptionColumn = true; this.addressListMemoryRecordList.ShowPreviousValueColumn = false; this.addressListMemoryRecordList.ShowValueColumn = true; - this.addressListMemoryRecordList.ShowValuesHexadecimal = false; this.addressListMemoryRecordList.ShowValueTypeColumn = true; this.addressListMemoryRecordList.Size = new System.Drawing.Size(592, 169); this.addressListMemoryRecordList.TabIndex = 17; @@ -540,7 +682,7 @@ private void InitializeComponent() // clearAddressListToolStripButton // this.clearAddressListToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.clearAddressListToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Quit; + this.clearAddressListToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; this.clearAddressListToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; this.clearAddressListToolStripButton.Name = "clearAddressListToolStripButton"; this.clearAddressListToolStripButton.Size = new System.Drawing.Size(23, 22); @@ -580,6 +722,7 @@ private void InitializeComponent() this.floatingOptionsGroupBox.PerformLayout(); this.stringOptionsGroupBox.ResumeLayout(false); this.stringOptionsGroupBox.PerformLayout(); + this.resultListContextMenuStrip.ResumeLayout(false); this.toolStripPanel.ResumeLayout(false); this.toolStripPanel.PerformLayout(); this.menuToolStrip.ResumeLayout(false); @@ -634,5 +777,21 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton clearAddressListToolStripButton; private System.Windows.Forms.ToolTip infoToolTip; private System.Windows.Forms.ToolStripButton saveAddressFileAsToolStripButton; + private System.Windows.Forms.ContextMenuStrip resultListContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem addSelectedResultsToAddressListToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem setCurrentClassAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createClassAtAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeSelectedRecordsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem changeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem descriptionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem valueTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem valueToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; } } \ No newline at end of file diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 4cdc3018..3a0a8537 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Diagnostics.Contracts; using System.Globalization; using System.IO; @@ -22,8 +23,6 @@ public partial class ScannerForm : IconForm { private const int MaxVisibleResults = 10000; - private readonly RemoteProcess process; - private bool isFirstScan; private Scanner searcher; @@ -31,12 +30,8 @@ public partial class ScannerForm : IconForm private ScanCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); private ScanValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); - public ScannerForm(RemoteProcess process) + public ScannerForm() { - Contract.Requires(process != null); - - this.process = process; - InitializeComponent(); toolStripPanel.RenderMode = ToolStripRenderMode.Professional; @@ -56,36 +51,10 @@ public ScannerForm(RemoteProcess process) Reset(); - firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = process.IsValid; - - process.ProcessAttached += sender => - { - firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = true; - - Reset(); - - if (addressListMemoryRecordList.Records.Any()) - { - if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo) != DialogResult.Yes) - { - addressListMemoryRecordList.Clear(); - } - else - { - foreach (var record in addressListMemoryRecordList.Records) - { - record.ResolveAddress(process); - record.RefreshValue(process); - } - } - } - }; - process.ProcessClosing += sender => - { - Reset(); + firstScanButton.Enabled = flowLayoutPanel.Enabled = Program.RemoteProcess.IsValid; - firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = false; - }; + Program.RemoteProcess.ProcessAttached += RemoteProcessOnProcessAttached; + Program.RemoteProcess.ProcessClosing += RemoteProcessOnProcessClosing; } protected override void OnLoad(EventArgs e) @@ -104,15 +73,48 @@ protected override void OnFormClosed(FormClosedEventArgs e) #region Event Handler + private void RemoteProcessOnProcessAttached(RemoteProcess remoteProcess) + { + firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = true; + + Reset(); + + if (addressListMemoryRecordList.Records.Any()) + { + if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + addressListMemoryRecordList.Clear(); + } + else + { + foreach (var record in addressListMemoryRecordList.Records) + { + record.ResolveAddress(Program.RemoteProcess); + record.RefreshValue(Program.RemoteProcess); + } + } + } + } + + private void RemoteProcessOnProcessClosing(RemoteProcess remoteProcess) + { + Reset(); + + firstScanButton.Enabled = nextScanButton.Enabled = flowLayoutPanel.Enabled = false; + } + private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) { searcher?.Dispose(); + + Program.RemoteProcess.ProcessAttached -= RemoteProcessOnProcessAttached; + Program.RemoteProcess.ProcessClosing -= RemoteProcessOnProcessClosing; } private void updateValuesTimer_Tick(object sender, EventArgs e) { - resultMemoryRecordList.RefreshValues(process); - addressListMemoryRecordList.RefreshValues(process); + resultMemoryRecordList.RefreshValues(Program.RemoteProcess); + addressListMemoryRecordList.RefreshValues(Program.RemoteProcess); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -150,7 +152,7 @@ private void ShowScannerResults() .Select(r => { var record = new MemoryRecord(r); - record.ResolveAddress(process); + record.ResolveAddress(Program.RemoteProcess); return record; }) ); @@ -253,7 +255,7 @@ private async Task OnStartFirstScan() var settings = CreateSearchSettings(); var comparer = CreateComparer(settings); - searcher = new Scanner(process, settings); + searcher = new Scanner(Program.RemoteProcess, settings); var report = new Progress(i => scanProgressBar.Value = i); var completed = await searcher.Search(comparer, CancellationToken.None, report); @@ -431,7 +433,7 @@ private void clearAddressListToolStripButton_Click(object sender, EventArgs e) private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) { - addressListMemoryRecordList.AddRecord(record); + addressListMemoryRecordList.Records.Add(record); } private string addressFilePath; @@ -483,8 +485,8 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) import.Load(ofd.FileName, Program.Logger) .Select(r => { - r.ResolveAddress(process); - r.RefreshValue(process); + r.ResolveAddress(Program.RemoteProcess); + r.RefreshValue(Program.RemoteProcess); return r; }) ); @@ -531,5 +533,106 @@ private void saveAsToolStripButton_Click(object sender, EventArgs e) } } } + + private void resultListContextMenuStrip_Opening(object sender, CancelEventArgs e) + { + var cms = (ContextMenuStrip)sender; + + var isResultList = cms.SourceControl.Parent == resultMemoryRecordList; + + addSelectedResultsToAddressListToolStripMenuItem.Visible = isResultList; + changeToolStripMenuItem.Visible = !isResultList; + removeSelectedRecordsToolStripMenuItem.Visible = !isResultList; + + // Hide all other items if multiple records are selected. + var multipleRecordsSelected = (isResultList ? resultMemoryRecordList.SelectedRecords.Count : addressListMemoryRecordList.SelectedRecords.Count) > 1; + for (var i = 3; i < cms.Items.Count; ++i) + { + cms.Items[i].Visible = !multipleRecordsSelected; + } + } + + private static MemoryRecordList GetMemoryRecordListFromMenuItem(object sender) => + (MemoryRecordList)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl.Parent; + + private void removeSelectedRecordsToolStripMenuItem_Click(object sender, EventArgs e) + { + addressListMemoryRecordList.Records.Remove(addressListMemoryRecordList.SelectedRecord); + } + + private void copyAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + var record = GetMemoryRecordListFromMenuItem(sender)?.SelectedRecord; + if (record != null) + { + Clipboard.SetText(record.RealAddress.ToString("X")); + } + } + + private void addSelectedResultsToAddressListToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (var record in resultMemoryRecordList.SelectedRecords) + { + addressListMemoryRecordList.Records.Add(record); + } + } + + private void setCurrentClassAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + LinkedWindowFeatures.SetCurrentClassAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress); + } + + private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + LinkedWindowFeatures.CreateClassAtAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress, true); + } + + private void findOutWhatAccessesThisAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + FindWhatInteractsWithSelectedRecord( + GetMemoryRecordListFromMenuItem(sender).SelectedRecord, + false + ); + } + + private void findOutWhatWritesToThisAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + FindWhatInteractsWithSelectedRecord( + GetMemoryRecordListFromMenuItem(sender).SelectedRecord, + true + ); + } + + private void FindWhatInteractsWithSelectedRecord(MemoryRecord record,bool writeOnly) + { + int size; + switch (record.ValueType) + { + case ScanValueType.Byte: + size = 1; + break; + case ScanValueType.Short: + size = 2; + break; + case ScanValueType.Integer: + case ScanValueType.Float: + size = 4; + break; + case ScanValueType.Long: + case ScanValueType.Double: + size = 8; + break; + case ScanValueType.ArrayOfBytes: + size = record.ValueLength; + break; + case ScanValueType.String: + size = record.ValueLength; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + LinkedWindowFeatures.FindWhatInteractsWithAddress(record.RealAddress, size, writeOnly); + } } } diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index e0f6ed97..3aab10d9 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -123,9 +123,18 @@ 15, 6 + + 417, 6 + + + 172, 6 + 172, 6 + + 304, 6 + 42 diff --git a/Plugins/PluginManager.cs b/Plugins/PluginManager.cs index b3b3b82c..9461a500 100644 --- a/Plugins/PluginManager.cs +++ b/Plugins/PluginManager.cs @@ -16,14 +16,12 @@ internal sealed class PluginManager : IEnumerable private readonly List plugins = new List(); private readonly IPluginHost host; - private readonly CoreFunctionsManager coreFunctions; - public PluginManager(IPluginHost host, CoreFunctionsManager coreFunctions) + public PluginManager(IPluginHost host) { Contract.Requires(host != null); this.host = host; - this.coreFunctions = coreFunctions; } IEnumerator IEnumerable.GetEnumerator() @@ -105,7 +103,7 @@ private void LoadPlugins(IEnumerable files, ILogger logger) } else { - coreFunctions.RegisterFunctions( + Program.CoreFunctions.RegisterFunctions( pi.Name, new NativeCoreWrapper(pi.NativeHandle) ); diff --git a/Program.cs b/Program.cs index cc0d326b..f8a7e652 100644 --- a/Program.cs +++ b/Program.cs @@ -6,6 +6,7 @@ using ReClassNET.Core; using ReClassNET.Forms; using ReClassNET.Logger; +using ReClassNET.Memory; using ReClassNET.Native; using ReClassNET.UI; @@ -19,6 +20,10 @@ static class Program public static Random GlobalRandom { get; } = new Random(); + public static RemoteProcess RemoteProcess { get; private set; } + + public static CoreFunctionsManager CoreFunctions => RemoteProcess.CoreFunctions; + public static MainForm MainForm { get; private set; } public static bool DesignMode { get; private set; } = true; @@ -58,18 +63,26 @@ static void Main() #if DEBUG using (var coreFunctions = new CoreFunctionsManager()) { - MainForm = new MainForm(coreFunctions); + RemoteProcess = new RemoteProcess(coreFunctions); + + MainForm = new MainForm(); Application.Run(MainForm); + + RemoteProcess.Dispose(); } #else try { - using (var nativeHelper = new CoreFunctionsManager()) + using (var coreFunctions = new CoreFunctionsManager()) { - MainForm = new MainForm(nativeHelper); + RemoteProcess = new RemoteProcess(coreFunctions); + + MainForm = new MainForm(); Application.Run(MainForm); + + RemoteProcess.Dispose(); } } catch (Exception ex) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 36882f7b..ed34b565 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -283,6 +283,7 @@ + Component diff --git a/UI/ClassNodeView.cs b/UI/ClassNodeView.cs index fc99d7a4..73f074be 100644 --- a/UI/ClassNodeView.cs +++ b/UI/ClassNodeView.cs @@ -330,7 +330,7 @@ private void collapseAllClassesToolStripMenuItem_Click(object sender, EventArgs private void addNewClassToolStripMenuItem_Click(object sender, EventArgs e) { - Program.MainForm?.CreateNewDefaultClass(); + LinkedWindowFeatures.CreateDefaultClass(); } #endregion diff --git a/UI/LinkedWindowFeatures.cs b/UI/LinkedWindowFeatures.cs new file mode 100644 index 00000000..eeef1ddb --- /dev/null +++ b/UI/LinkedWindowFeatures.cs @@ -0,0 +1,68 @@ +using System; +using ReClassNET.Debugger; +using ReClassNET.Nodes; + +namespace ReClassNET.UI +{ + public class LinkedWindowFeatures + { + public static ClassNode CreateClassAtAddress(IntPtr address, bool addDefaultBytes) + { + var classView = Program.MainForm.ClassView; + + var node = ClassNode.Create(); + node.Address = address; + if (addDefaultBytes) + { + node.AddBytes(64); + } + + classView.SelectedClass = node; + + return node; + } + + public static ClassNode CreateDefaultClass() + { + var address = ClassNode.DefaultAddress; + + var mainModule = Program.RemoteProcess.GetModuleByName(Program.RemoteProcess.UnderlayingProcess?.Name); + if (mainModule != null) + { + address = mainModule.Start; + } + + return CreateClassAtAddress(address, true); + } + + public static void SetCurrentClassAddress(IntPtr address) + { + var classNode = Program.MainForm.ClassView.SelectedClass; + if (classNode == null) + { + return; + } + + classNode.Address = address; + } + + public static void FindWhatInteractsWithAddress(IntPtr address, int size, bool writeOnly) + { + var debugger = Program.RemoteProcess.Debugger; + + if (!debugger.AskUserAndAttachDebugger()) + { + return; + } + + if (writeOnly) + { + debugger.FindWhatWritesToAddress(address, size); + } + else + { + debugger.FindWhatAccessesAddress(address, size); + } + } + } +} diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index c0d3a334..e8cfea94 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Windows.Forms; using ReClassNET.DataExchange.ReClass; -using ReClassNET.Debugger; using ReClassNET.Memory; using ReClassNET.Nodes; using ReClassNET.Util; @@ -1129,18 +1128,7 @@ private void FindWhatInteractsWithSelectedNode(bool writeOnly) return; } - var debugger = Memory.Process.Debugger; - if (debugger.AskUserAndStartDebugger()) - { - if (writeOnly) - { - debugger.FindWhatWritesToAddress(selectedNode.Address, selectedNode.Node.MemorySize); - } - else - { - debugger.FindWhatAccessesAddress(selectedNode.Address, selectedNode.Node.MemorySize); - } - } + LinkedWindowFeatures.FindWhatInteractsWithAddress(selectedNode.Address, selectedNode.Node.MemorySize, writeOnly); } } } From a5a53152ed00bdf5e4c30c45805db91705d83d7e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 10:34:34 +0200 Subject: [PATCH 108/777] WIN64 -> RECLASSNET64 --- AddressParser/TokenReader.cs | 2 +- Constants.cs | 2 +- Debugger/DataExchange.cs | 2 +- Debugger/RemoteDebugger.cs | 2 +- Forms/FoundCodeForm.cs | 2 +- Memory/RemoteProcess.cs | 4 ++-- Nodes/BaseContainerNode.cs | 2 +- Nodes/ClassNode.cs | 2 +- ReClass.NET.csproj | 8 ++++---- UI/MemoryPreviewPopUp.cs | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/AddressParser/TokenReader.cs b/AddressParser/TokenReader.cs index 34a8f9b3..963a9fa8 100644 --- a/AddressParser/TokenReader.cs +++ b/AddressParser/TokenReader.cs @@ -70,7 +70,7 @@ public List Read(string formula) if (long.TryParse(buffer, NumberStyles.HexNumber, null, out var offsetValue)) { -#if WIN64 +#if RECLASSNET64 var address = (IntPtr)offsetValue; #else var address = (IntPtr)unchecked((int)offsetValue); diff --git a/Constants.cs b/Constants.cs index 01e83f71..879a955d 100644 --- a/Constants.cs +++ b/Constants.cs @@ -14,7 +14,7 @@ internal class Constants public const string PluginUrl = "https://github.com/KN4CK3R/ReClass.NET#plugins"; -#if WIN64 +#if RECLASSNET64 public const string Platform = "x64"; public const string StringHexFormat = "X016"; diff --git a/Debugger/DataExchange.cs b/Debugger/DataExchange.cs index 28a470f0..176352ce 100644 --- a/Debugger/DataExchange.cs +++ b/Debugger/DataExchange.cs @@ -15,7 +15,7 @@ public struct ExceptionDebugInfo [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct RegisterInfo { -#if WIN64 +#if RECLASSNET64 public IntPtr Rax; public IntPtr Rbx; public IntPtr Rcx; diff --git a/Debugger/RemoteDebugger.cs b/Debugger/RemoteDebugger.cs index 790ae130..b4144a0e 100644 --- a/Debugger/RemoteDebugger.cs +++ b/Debugger/RemoteDebugger.cs @@ -130,7 +130,7 @@ private List SplitBreakpoint(IntPtr address, int size) while (size > 0) { -#if WIN64 +#if RECLASSNET64 if (size >= 8) { if (address.Mod(8) == 0) diff --git a/Forms/FoundCodeForm.cs b/Forms/FoundCodeForm.cs index 012c66f1..ac07c5ab 100644 --- a/Forms/FoundCodeForm.cs +++ b/Forms/FoundCodeForm.cs @@ -99,7 +99,7 @@ private void foundCodeDataGridView_SelectionChanged(object sender, EventArgs e) sb.AppendLine(); -#if WIN64 +#if RECLASSNET64 sb.AppendLine($"RAX = {info.DebugInfo.Registers.Rax.ToString(Constants.StringHexFormat)}"); sb.AppendLine($"RBX = {info.DebugInfo.Registers.Rbx.ToString(Constants.StringHexFormat)}"); sb.AppendLine($"RCX = {info.DebugInfo.Registers.Rcx.ToString(Constants.StringHexFormat)}"); diff --git a/Memory/RemoteProcess.cs b/Memory/RemoteProcess.cs index eb35822b..2fdb21d0 100644 --- a/Memory/RemoteProcess.cs +++ b/Memory/RemoteProcess.cs @@ -288,8 +288,8 @@ public string ReadRemoteRuntimeTypeInformation(IntPtr address) var objectLocatorPtr = ReadRemoteObject(address - IntPtr.Size); if (objectLocatorPtr.MayBeValid()) { - -#if WIN64 + +#if RECLASSNET64 rtti = ReadRemoteRuntimeTypeInformation64(objectLocatorPtr); #else rtti = ReadRemoteRuntimeTypeInformation32(objectLocatorPtr); diff --git a/Nodes/BaseContainerNode.cs b/Nodes/BaseContainerNode.cs index 4000fa18..389a852a 100644 --- a/Nodes/BaseContainerNode.cs +++ b/Nodes/BaseContainerNode.cs @@ -147,7 +147,7 @@ public virtual void InsertBytes(int index, int size, ref List createdN while (size != 0) { BaseNode node; -#if WIN64 +#if RECLASSNET64 if (size >= 8) { node = new Hex64Node(); diff --git a/Nodes/ClassNode.cs b/Nodes/ClassNode.cs index c24440ee..279416e4 100644 --- a/Nodes/ClassNode.cs +++ b/Nodes/ClassNode.cs @@ -16,7 +16,7 @@ public class ClassNode : BaseContainerNode { public static event ClassCreatedEventHandler ClassCreated; -#if WIN64 +#if RECLASSNET64 public static IntPtr DefaultAddress = (IntPtr)0x140000000; #else public static IntPtr DefaultAddress = (IntPtr)0x400000; diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index ed34b565..89dc3939 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -22,7 +22,7 @@ full false bin\x86\Debug\ - TRACE;DEBUG;WIN32;RECLASSNET32 + TRACE;DEBUG;RECLASSNET32 prompt 4 false @@ -75,7 +75,7 @@ pdbonly true bin\x86\Release\ - TRACE;WIN32;RECLASSNET32;RELEASE + TRACE;RECLASSNET32;RELEASE prompt 4 @@ -85,7 +85,7 @@ full false bin\x64\Debug\ - TRACE;DEBUG;WIN64;RECLASSNET64 + TRACE;DEBUG;RECLASSNET64 prompt 4 false @@ -95,7 +95,7 @@ pdbonly true bin\x64\Release\ - TRACE;WIN64;RECLASSNET64;RELEASE + TRACE;RECLASSNET64;RELEASE prompt 4 diff --git a/UI/MemoryPreviewPopUp.cs b/UI/MemoryPreviewPopUp.cs index c09224df..6c048b9c 100644 --- a/UI/MemoryPreviewPopUp.cs +++ b/UI/MemoryPreviewPopUp.cs @@ -55,7 +55,7 @@ private void SetNodeCount(int count) { BaseHexNode CreateNode(int index) { -#if WIN64 +#if RECLASSNET64 return new Hex64Node { Offset = (IntPtr)(index * 8) }; #else return new Hex32Node { Offset = (IntPtr)(index * 4) }; From 132bc0474828d127c1dc07cc31acced102556b53 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 11:55:46 +0200 Subject: [PATCH 109/777] Added comments to scanner files. --- Forms/ScannerForm.cs | 405 +++++++++++++----------- MemoryScanner/BytePattern.cs | 31 ++ MemoryScanner/Comparer/IScanComparer.cs | 55 +++- MemoryScanner/ScanResultStore.cs | 44 ++- MemoryScanner/ScanSettings.cs | 8 +- MemoryScanner/Scanner.cs | 64 +++- MemoryScanner/ScannerContext.cs | 3 + MemoryScanner/ScannerWorker.cs | 14 + UI/MemoryRecordList.Designer.cs | 3 +- UI/MemoryRecordList.cs | 106 +++++-- 10 files changed, 499 insertions(+), 234 deletions(-) diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 3a0a8537..56e3e822 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -30,6 +30,8 @@ public partial class ScannerForm : IconForm private ScanCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); private ScanValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + private string addressFilePath; + public ScannerForm() { InitializeComponent(); @@ -129,16 +131,198 @@ private async void firstScanButton_Click(object sender, EventArgs e) private async void nextScanButton_Click(object sender, EventArgs e) { - await OnStartSecondScan(); + await OnStartNextScan(); + } + + private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) + { + addressListMemoryRecordList.Records.Add(record); + } + + private void openAddressFileToolStripButton_Click(object sender, EventArgs e) + { + using (var ofd = new OpenFileDialog()) + { + ofd.CheckFileExists = true; + ofd.Filter = $"All Scanner Types |*{ReClassScanFile.FileExtension};*{CheatEngineFile.FileExtension};*{CrySearchFile.FileExtension}" + + $"|{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" + + $"|{CheatEngineFile.FormatName} (*{CheatEngineFile.FileExtension})|*{CheatEngineFile.FileExtension}" + + $"|{CrySearchFile.FormatName} (*{CrySearchFile.FileExtension})|*{CrySearchFile.FileExtension}"; + + if (ofd.ShowDialog() == DialogResult.OK) + { + IScannerImport import = null; + switch (Path.GetExtension(ofd.FileName)?.ToLower()) + { + case ReClassScanFile.FileExtension: + import = new ReClassScanFile(); + break; + case CheatEngineFile.FileExtension: + import = new CheatEngineFile(); + break; + case CrySearchFile.FileExtension: + import = new CrySearchFile(); + break; + default: + Program.Logger.Log(LogLevel.Error, $"The file '{ofd.FileName}' has an unknown type."); + break; + } + if (import != null) + { + if (addressListMemoryRecordList.Records.Any()) + { + if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + } + + if (import is ReClassScanFile) + { + addressFilePath = ofd.FileName; + } + + addressListMemoryRecordList.SetRecords( + import.Load(ofd.FileName, Program.Logger) + .Select(r => + { + r.ResolveAddress(Program.RemoteProcess); + r.RefreshValue(Program.RemoteProcess); + return r; + }) + ); + } + } + } + } + + private void saveAddressFileToolStripButton_Click(object sender, EventArgs e) + { + if (addressListMemoryRecordList.Records.None()) + { + return; + } + + if (string.IsNullOrEmpty(addressFilePath)) + { + saveAsToolStripButton_Click(sender, e); + + return; + } + + var file = new ReClassScanFile(); + file.Save(addressListMemoryRecordList.Records, addressFilePath, Program.Logger); + } + + private void saveAsToolStripButton_Click(object sender, EventArgs e) + { + if (addressListMemoryRecordList.Records.None()) + { + return; + } + + using (var sfd = new SaveFileDialog()) + { + sfd.DefaultExt = ReClassScanFile.FileExtension; + sfd.Filter = $"{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + addressFilePath = sfd.FileName; + + saveAddressFileToolStripButton_Click(sender, e); + } + } + } + + private void clearAddressListToolStripButton_Click(object sender, EventArgs e) + { + addressListMemoryRecordList.Clear(); + } + + private void resultListContextMenuStrip_Opening(object sender, CancelEventArgs e) + { + var cms = (ContextMenuStrip)sender; + + var isResultList = cms.SourceControl.Parent == resultMemoryRecordList; + + addSelectedResultsToAddressListToolStripMenuItem.Visible = isResultList; + changeToolStripMenuItem.Visible = !isResultList; + removeSelectedRecordsToolStripMenuItem.Visible = !isResultList; + + // Hide all other items if multiple records are selected. + var multipleRecordsSelected = (isResultList ? resultMemoryRecordList.SelectedRecords.Count : addressListMemoryRecordList.SelectedRecords.Count) > 1; + for (var i = 3; i < cms.Items.Count; ++i) + { + cms.Items[i].Visible = !multipleRecordsSelected; + } + } + + private static MemoryRecordList GetMemoryRecordListFromMenuItem(object sender) => + (MemoryRecordList)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl.Parent; + + private void addSelectedResultsToAddressListToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (var record in resultMemoryRecordList.SelectedRecords) + { + addressListMemoryRecordList.Records.Add(record); + } + } + + private void removeSelectedRecordsToolStripMenuItem_Click(object sender, EventArgs e) + { + addressListMemoryRecordList.Records.Remove(addressListMemoryRecordList.SelectedRecord); + } + + private void setCurrentClassAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + LinkedWindowFeatures.SetCurrentClassAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress); + } + + private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + LinkedWindowFeatures.CreateClassAtAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress, true); + } + + private void findOutWhatAccessesThisAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + FindWhatInteractsWithSelectedRecord( + GetMemoryRecordListFromMenuItem(sender).SelectedRecord, + false + ); + } + + private void findOutWhatWritesToThisAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + FindWhatInteractsWithSelectedRecord( + GetMemoryRecordListFromMenuItem(sender).SelectedRecord, + true + ); + } + + private void copyAddressToolStripMenuItem_Click(object sender, EventArgs e) + { + var record = GetMemoryRecordListFromMenuItem(sender)?.SelectedRecord; + if (record != null) + { + Clipboard.SetText(record.RealAddress.ToString("X")); + } } #endregion + /// + /// Displays the total result count. + /// + /// Number of. private void SetResultCount(int count) { resultCountLabel.Text = count > MaxVisibleResults ? $"Found: {count} (only {MaxVisibleResults} shown)" : $"Found: {count}"; } + /// + /// Shows some of the scanner results. + /// private void ShowScannerResults() { Contract.Requires(searcher != null); @@ -158,6 +342,9 @@ private void ShowScannerResults() ); } + /// + /// Hide gui elements after the value type has changed. + /// private void OnValueTypeChanged() { SetValidCompareTypes(); @@ -202,6 +389,9 @@ private void OnValueTypeChanged() stringOptionsGroupBox.Visible = valueType == ScanValueType.String; } + /// + /// Sets valid compare types dependend on the selected value type. + /// private void SetValidCompareTypes() { var valueType = SelectedValueType; @@ -220,13 +410,16 @@ private void SetValidCompareTypes() } } + /// + /// Resets all fields. + /// private void Reset() { searcher?.Dispose(); searcher = null; SetResultCount(0); - resultMemoryRecordList.SetRecords(null); + resultMemoryRecordList.Clear(); firstScanButton.Enabled = true; nextScanButton.Enabled = false; @@ -247,6 +440,10 @@ private void Reset() SetValidCompareTypes(); } + /// + /// Executes the first scan async. + /// + /// The scanner task. private async Task OnStartFirstScan() { if (isFirstScan) @@ -285,7 +482,11 @@ private async Task OnStartFirstScan() Reset(); } - private async Task OnStartSecondScan() + /// + /// Executes the next scan async. + /// + /// The scanner task. + private async Task OnStartNextScan() { if (!isFirstScan) { @@ -308,8 +509,14 @@ private async Task OnStartSecondScan() } } + /// + /// Creates the search settings from the user input. + /// + /// The search settings. private ScanSettings CreateSearchSettings() { + Contract.Ensures(Contract.Result() != null); + var settings = new ScanSettings { ValueType = SelectedValueType @@ -324,7 +531,7 @@ private ScanSettings CreateSearchSettings() settings.StartAddress = unchecked((IntPtr)(int)startAddressVar); settings.StopAddress = unchecked((IntPtr)(int)endAddressVar); #endif - settings.FastScan = fastScanCheckBox.Checked; + settings.EnableFastScan = fastScanCheckBox.Checked; int.TryParse(fastScanAlignmentTextBox.Text, out var alignment); settings.FastScanAlignment = Math.Max(1, alignment); @@ -348,9 +555,14 @@ SettingState CheckStateToSettingState(CheckState state) return settings; } + /// + /// Creates the comparer from the user input. + /// + /// The scan comparer. private IScanComparer CreateComparer(ScanSettings settings) { Contract.Requires(settings != null); + Contract.Ensures(Contract.Result() != null); var compareType = SelectedCompareType; @@ -426,184 +638,13 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) throw new Exception(); } - private void clearAddressListToolStripButton_Click(object sender, EventArgs e) - { - addressListMemoryRecordList.Clear(); - } - - private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) - { - addressListMemoryRecordList.Records.Add(record); - } - - private string addressFilePath; - - private void openAddressFileToolStripButton_Click(object sender, EventArgs e) - { - using (var ofd = new OpenFileDialog()) - { - ofd.CheckFileExists = true; - ofd.Filter = $"All Scanner Types |*{ReClassScanFile.FileExtension};*{CheatEngineFile.FileExtension};*{CrySearchFile.FileExtension}" - + $"|{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" - + $"|{CheatEngineFile.FormatName} (*{CheatEngineFile.FileExtension})|*{CheatEngineFile.FileExtension}" - + $"|{CrySearchFile.FormatName} (*{CrySearchFile.FileExtension})|*{CrySearchFile.FileExtension}"; - - if (ofd.ShowDialog() == DialogResult.OK) - { - IScannerImport import = null; - switch (Path.GetExtension(ofd.FileName)?.ToLower()) - { - case ReClassScanFile.FileExtension: - import = new ReClassScanFile(); - break; - case CheatEngineFile.FileExtension: - import = new CheatEngineFile(); - break; - case CrySearchFile.FileExtension: - import = new CrySearchFile(); - break; - default: - Program.Logger.Log(LogLevel.Error, $"The file '{ofd.FileName}' has an unknown type."); - break; - } - if (import != null) - { - if (addressListMemoryRecordList.Records.Any()) - { - if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo) != DialogResult.Yes) - { - return; - } - } - - if (import is ReClassScanFile) - { - addressFilePath = ofd.FileName; - } - - addressListMemoryRecordList.SetRecords( - import.Load(ofd.FileName, Program.Logger) - .Select(r => - { - r.ResolveAddress(Program.RemoteProcess); - r.RefreshValue(Program.RemoteProcess); - return r; - }) - ); - } - } - } - } - - private void saveAddressFileToolStripButton_Click(object sender, EventArgs e) - { - if (addressListMemoryRecordList.Records.None()) - { - return; - } - - if (string.IsNullOrEmpty(addressFilePath)) - { - saveAsToolStripButton_Click(sender, e); - - return; - } - - var file = new ReClassScanFile(); - file.Save(addressListMemoryRecordList.Records, addressFilePath, Program.Logger); - } - - private void saveAsToolStripButton_Click(object sender, EventArgs e) - { - if (addressListMemoryRecordList.Records.None()) - { - return; - } - - using (var sfd = new SaveFileDialog()) - { - sfd.DefaultExt = ReClassScanFile.FileExtension; - sfd.Filter = $"{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}"; - - if (sfd.ShowDialog() == DialogResult.OK) - { - addressFilePath = sfd.FileName; - - saveAddressFileToolStripButton_Click(sender, e); - } - } - } - - private void resultListContextMenuStrip_Opening(object sender, CancelEventArgs e) - { - var cms = (ContextMenuStrip)sender; - - var isResultList = cms.SourceControl.Parent == resultMemoryRecordList; - - addSelectedResultsToAddressListToolStripMenuItem.Visible = isResultList; - changeToolStripMenuItem.Visible = !isResultList; - removeSelectedRecordsToolStripMenuItem.Visible = !isResultList; - - // Hide all other items if multiple records are selected. - var multipleRecordsSelected = (isResultList ? resultMemoryRecordList.SelectedRecords.Count : addressListMemoryRecordList.SelectedRecords.Count) > 1; - for (var i = 3; i < cms.Items.Count; ++i) - { - cms.Items[i].Visible = !multipleRecordsSelected; - } - } - - private static MemoryRecordList GetMemoryRecordListFromMenuItem(object sender) => - (MemoryRecordList)((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl.Parent; - - private void removeSelectedRecordsToolStripMenuItem_Click(object sender, EventArgs e) - { - addressListMemoryRecordList.Records.Remove(addressListMemoryRecordList.SelectedRecord); - } - - private void copyAddressToolStripMenuItem_Click(object sender, EventArgs e) - { - var record = GetMemoryRecordListFromMenuItem(sender)?.SelectedRecord; - if (record != null) - { - Clipboard.SetText(record.RealAddress.ToString("X")); - } - } - - private void addSelectedResultsToAddressListToolStripMenuItem_Click(object sender, EventArgs e) - { - foreach (var record in resultMemoryRecordList.SelectedRecords) - { - addressListMemoryRecordList.Records.Add(record); - } - } - - private void setCurrentClassAddressToolStripMenuItem_Click(object sender, EventArgs e) - { - LinkedWindowFeatures.SetCurrentClassAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress); - } - - private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArgs e) - { - LinkedWindowFeatures.CreateClassAtAddress(GetMemoryRecordListFromMenuItem(sender).SelectedRecord.RealAddress, true); - } - - private void findOutWhatAccessesThisAddressToolStripMenuItem_Click(object sender, EventArgs e) - { - FindWhatInteractsWithSelectedRecord( - GetMemoryRecordListFromMenuItem(sender).SelectedRecord, - false - ); - } - - private void findOutWhatWritesToThisAddressToolStripMenuItem_Click(object sender, EventArgs e) - { - FindWhatInteractsWithSelectedRecord( - GetMemoryRecordListFromMenuItem(sender).SelectedRecord, - true - ); - } - - private void FindWhatInteractsWithSelectedRecord(MemoryRecord record,bool writeOnly) + /// + /// Attaches the debugger to find what interacts with the selected record. + /// + /// Thrown when one or more arguments are outside the required range. + /// The record. + /// True to search only for write access. + private static void FindWhatInteractsWithSelectedRecord(MemoryRecord record, bool writeOnly) { int size; switch (record.ValueType) diff --git a/MemoryScanner/BytePattern.cs b/MemoryScanner/BytePattern.cs index bdb99631..9336ceb1 100644 --- a/MemoryScanner/BytePattern.cs +++ b/MemoryScanner/BytePattern.cs @@ -86,10 +86,29 @@ public bool Equals(byte b) private readonly List pattern = new List(); + /// + /// Gets the length of the pattern in byte. + /// public int Length => pattern.Count; + /// + /// Gets if the pattern contains wildcards. + /// public bool HasWildcards => pattern.Any(pb => pb.HasWildcard); + /// + /// Parses the provided string for a byte pattern. Wildcards are supported by nibble. + /// + /// + /// Valid patterns: + /// AA BB CC DD + /// AABBCCDD + /// aabb CCdd + /// A? ?B ?? DD + /// + /// Thrown if the provided string doesn't contain a valid byte pattern. + /// The byte pattern in hex format. + /// The corresponding . public static BytePattern Parse(string value) { Contract.Requires(!string.IsNullOrEmpty(value)); @@ -114,6 +133,12 @@ public static BytePattern Parse(string value) return pattern; } + /// + /// Tests if the provided byte array matches the byte pattern at the provided index. + /// + /// The byte array to be compared. + /// The index into the byte array. + /// True if the pattern matches, false if they are not. public bool Equals(byte[] data, int index) { for (var j = 0; j < pattern.Count; ++j) @@ -127,6 +152,12 @@ public bool Equals(byte[] data, int index) return true; } + /// + /// Converts this to a byte array. + /// + /// Thrown if the pattern contains wildcards. + /// The bytes of the pattern. + /// public byte[] ToByteArray() { if (HasWildcards) diff --git a/MemoryScanner/Comparer/IScanComparer.cs b/MemoryScanner/Comparer/IScanComparer.cs index 197b7744..0ec8006b 100644 --- a/MemoryScanner/Comparer/IScanComparer.cs +++ b/MemoryScanner/Comparer/IScanComparer.cs @@ -1,12 +1,65 @@ -namespace ReClassNET.MemoryScanner.Comparer +using System; +using System.Diagnostics.Contracts; + +namespace ReClassNET.MemoryScanner.Comparer { + [ContractClass(typeof(ScanComparerContract))] public interface IScanComparer { ScanCompareType CompareType { get; } int ValueSize { get; } + /// + /// Compares the data at the provided index to the current . + /// + /// The byte array to be compared. + /// The index into the byte array. + /// [out] The scan result if the matched. + /// True if matched. bool Compare(byte[] data, int index, out ScanResult result); + /// + /// Compares the data at the provided index to the current . + /// The previous results may be used. + /// + /// The byte array to be compared. + /// The index into the byte array. + /// Scan result to be compared. + /// [out] The scan result if the matched. + /// True if matched. bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result); } + + + [ContractClassFor(typeof(IScanComparer))] + internal abstract class ScanComparerContract : IScanComparer + { + public ScanCompareType CompareType => throw new NotImplementedException(); + + public int ValueSize + { + get + { + Contract.Ensures(ValueSize > 0); + + throw new NotImplementedException(); + } + } + public bool Compare(byte[] data, int index, out ScanResult result) + { + Contract.Requires(data != null); + Contract.Requires(index >= 0); + + throw new System.NotImplementedException(); + } + + public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) + { + Contract.Requires(data != null); + Contract.Requires(index >= 0); + Contract.Requires(previous != null); + + throw new System.NotImplementedException(); + } + } } diff --git a/MemoryScanner/ScanResultStore.cs b/MemoryScanner/ScanResultStore.cs index 2d57476e..f4ea0794 100644 --- a/MemoryScanner/ScanResultStore.cs +++ b/MemoryScanner/ScanResultStore.cs @@ -7,6 +7,10 @@ namespace ReClassNET.MemoryScanner { + /// + /// The store of all found scan results. If the result count exceed the limit, + /// the results are stored in temporary files. + /// internal class ScanResultStore : IDisposable { private enum StorageMode @@ -26,6 +30,9 @@ private enum StorageMode private readonly ScanValueType valueType; + /// + /// Gets the number of total results. + /// public int TotalResultCount { get; private set; } public ScanResultStore(ScanValueType valueType, string storePath) @@ -60,11 +67,21 @@ public void Finish() } } + /// + /// Gets the result blocks from the store. This may read results from files.. + /// public IEnumerable GetResultBlocks() { + Contract.Ensures(Contract.Result>() != null); + return mode == StorageMode.Memory ? store : ReadBlocksFromFile(); } + /// + /// Adds a result block to the store. If the result count exceed the limit, + /// the results are stored in temporary files. + /// + /// The result block to add. public void AddBlock(ScanResultBlock block) { Contract.Requires(block != null); @@ -102,6 +119,10 @@ public void AddBlock(ScanResultBlock block) } } + /// + /// Writes a result block to the file. + /// + /// The result block to add. private void AppendBlockToFile(ScanResultBlock block) { Contract.Requires(block != null); @@ -119,8 +140,13 @@ private void AppendBlockToFile(ScanResultBlock block) } } + /// + /// Reads all memory blocks from the file. + /// private IEnumerable ReadBlocksFromFile() { + Contract.Ensures(Contract.Result>() != null); + using (var stream = File.OpenRead(storePath)) { using (var br = new BinaryReader(stream, Encoding.Unicode)) @@ -146,8 +172,16 @@ private IEnumerable ReadBlocksFromFile() } } + /// + /// Reads a single scan result from the file. + /// + /// Thrown if the is not valid. + /// The to read from. + /// The scan result. private ScanResult ReadScanResult(BinaryReader br) { + Contract.Ensures(Contract.Result() != null); + var address = br.ReadIntPtr(); ScanResult result; @@ -187,8 +221,16 @@ private ScanResult ReadScanResult(BinaryReader br) return result; } + /// + /// Writes a single scan result to the file. + /// + /// The to write to. + /// The result to write. private static void WriteSearchResult(BinaryWriter bw, ScanResult result) { + Contract.Requires(bw != null); + Contract.Requires(result != null); + bw.Write(result.Address); switch (result) @@ -219,8 +261,6 @@ private static void WriteSearchResult(BinaryWriter bw, ScanResult result) bw.Write(stringSearchResult.Encoding == Encoding.UTF8 ? 0 : stringSearchResult.Encoding == Encoding.Unicode ? 1 : 2); bw.Write(stringSearchResult.Value); break; - default: - throw new ArgumentOutOfRangeException(nameof(result)); } } } diff --git a/MemoryScanner/ScanSettings.cs b/MemoryScanner/ScanSettings.cs index e04178d1..79d341e3 100644 --- a/MemoryScanner/ScanSettings.cs +++ b/MemoryScanner/ScanSettings.cs @@ -21,10 +21,10 @@ public class ScanSettings public SettingState ScanWritableMemory { get; set; } = SettingState.Yes; public SettingState ScanExecutableMemory { get; set; } = SettingState.Indeterminate; public SettingState ScanCopyOnWriteMemory { get; set; } = SettingState.No; - public bool ScanMemPrivate { get; set; } = true; - public bool ScanMemImage { get; set; } = true; - public bool ScanMemMapped { get; set; } = false; - public bool FastScan { get; set; } = true; + public bool ScanPrivateMemory { get; set; } = true; + public bool ScanImageMemory { get; set; } = true; + public bool ScanMappedMemory { get; set; } = false; + public bool EnableFastScan { get; set; } = true; public int FastScanAlignment { get; set; } = 1; public ScanValueType ValueType { get; set; } = ScanValueType.Byte; } diff --git a/MemoryScanner/Scanner.cs b/MemoryScanner/Scanner.cs index ef5897a5..84fe3584 100644 --- a/MemoryScanner/Scanner.cs +++ b/MemoryScanner/Scanner.cs @@ -19,6 +19,9 @@ public class Scanner : IDisposable public ScanSettings Settings { get; } + /// + /// Gets the total result count from the last scan. + /// public int TotalResultCount => store.TotalResultCount; private bool isFirstScan; @@ -40,6 +43,12 @@ public void Dispose() store = null; } + /// + /// Retrieves the results of the last scan from the store. + /// + /// + /// An enumeration of the s of the last scan. + /// public IEnumerable GetResults() { Contract.Ensures(Contract.Result>() != null); @@ -47,11 +56,19 @@ public IEnumerable GetResults() return store.GetResultBlocks().SelectMany(kv => kv.Results); } + /// + /// Creates a new and uses the system temporary path as file location. + /// + /// The new . private ScanResultStore CreateStore() { return new ScanResultStore(Settings.ValueType, Path.GetTempPath()); } + /// + /// Gets a list of the sections which meet the provided scan settings. + /// + /// A list of searchable sections. private IList
GetSearchableSections() { Contract.Ensures(Contract.Result>() != null); @@ -63,9 +80,9 @@ private IList
GetSearchableSections() { switch (s.Type) { - case SectionType.Private: return Settings.ScanMemPrivate; - case SectionType.Image: return Settings.ScanMemImage; - case SectionType.Mapped: return Settings.ScanMemMapped; + case SectionType.Private: return Settings.ScanPrivateMemory; + case SectionType.Image: return Settings.ScanImageMemory; + case SectionType.Mapped: return Settings.ScanMappedMemory; default: return false; } }) @@ -102,11 +119,26 @@ private IList
GetSearchableSections() .ToList(); } + /// + /// Starts an async search with the provided . + /// The results are stored in the store. + /// + /// The comparer to scan for values. + /// The to stop the scan. + /// The object to report the current progress. + /// The asynchronous result indicating if the scan completed. public Task Search(IScanComparer comparer, CancellationToken ct, IProgress progress) { return isFirstScan ? FirstScan(comparer, ct, progress) : NextScan(comparer, ct, progress); } + /// + /// Starts an async first scan with the provided . + /// + /// The comparer to scan for values. + /// The to stop the scan. + /// The object to report the current progress. + /// The asynchronous result indicating if the scan completed. private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProgress progress) { Contract.Requires(comparer != null); @@ -125,28 +157,34 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg return Task.Run(() => { + // Algorithm: + // 1. Partition the sections for the worker threads. + // 2. Create a ScannerContext per worker thread. + // 3. n Worker -> m Sections: Read data, search results, store results + var result = Parallel.ForEach( - sections, + sections, // Sections get grouped by the framework to balance the workers. new ParallelOptions { CancellationToken = ct}, - () => new ScannerContext(Settings, comparer, initialBufferSize), + () => new ScannerContext(Settings, comparer, initialBufferSize), // Create a new context for every worker (thread). (s, state, _, context) => { var size = s.Size.ToInt32(); context.EnsureBufferSize(size); var buffer = context.Buffer; - if (process.ReadRemoteMemoryIntoBuffer(s.Start, ref buffer, 0, size)) + if (process.ReadRemoteMemoryIntoBuffer(s.Start, ref buffer, 0, size)) // Fill the buffer. { - var results = context.Worker.Search(buffer, size) - .Select(r => { r.Address = r.Address.Add(s.Start); return r; }) + var results = context.Worker.Search(buffer, size) // Search for results. + .Select(r => { r.Address = r.Address.Add(s.Start); return r; }) // Results are relative to the buffer so add the section start address. .ToList(); if (results.Count > 0) { + // Minify the result block range. var block = new ScanResultBlock( results.Min(r => r.Address, IntPtrComparer.Instance), results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, results ); - store.AddBlock(block); + store.AddBlock(block); // Store the result block. } } @@ -170,6 +208,14 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg }, ct); } + /// + /// Starts an async next scan with the provided . + /// The next scan uses the previous results to refine the results. + /// + /// The comparer to scan for values. + /// The to stop the scan. + /// The object to report the current progress. + /// The asynchronous result indicating if the scan completed. private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgress progress) { Contract.Requires(comparer != null); diff --git a/MemoryScanner/ScannerContext.cs b/MemoryScanner/ScannerContext.cs index 2c1dbc04..6b6f20cc 100644 --- a/MemoryScanner/ScannerContext.cs +++ b/MemoryScanner/ScannerContext.cs @@ -13,6 +13,8 @@ public ScannerContext(ScanSettings settings, IScanComparer comparer, int bufferS Contract.Requires(settings != null); Contract.Requires(comparer != null); Contract.Requires(bufferSize >= 0); + Contract.Ensures(Buffer != null); + Contract.Ensures(Worker != null); EnsureBufferSize(bufferSize); @@ -22,6 +24,7 @@ public ScannerContext(ScanSettings settings, IScanComparer comparer, int bufferS public void EnsureBufferSize(int size) { Contract.Requires(size >= 0); + Contract.Ensures(Buffer != null); if (Buffer == null || Buffer.Length < size) { diff --git a/MemoryScanner/ScannerWorker.cs b/MemoryScanner/ScannerWorker.cs index 2b8efe74..a841ab61 100644 --- a/MemoryScanner/ScannerWorker.cs +++ b/MemoryScanner/ScannerWorker.cs @@ -19,6 +19,12 @@ public ScannerWorker(ScanSettings settings, IScanComparer comparer) this.comparer = comparer; } + /// + /// Uses the to scan the byte array for results. + /// + /// The data to scan. + /// The length of the parameter. + /// An enumeration of all s. public IEnumerable Search(byte[] data, int count) { Contract.Requires(data != null); @@ -36,6 +42,14 @@ public IEnumerable Search(byte[] data, int count) } } + /// + /// Uses the to scan the byte array for results. + /// The comparer uses the provided previous results to compare to the current value. + /// + /// The data to scan. + /// The length of the parameter. + /// The previous results to use. + /// An enumeration of all s. public IEnumerable Search(byte[] data, int count, IEnumerable results) { Contract.Requires(data != null); diff --git a/UI/MemoryRecordList.Designer.cs b/UI/MemoryRecordList.Designer.cs index d89a90de..518180cd 100644 --- a/UI/MemoryRecordList.Designer.cs +++ b/UI/MemoryRecordList.Designer.cs @@ -52,7 +52,6 @@ private void InitializeComponent() this.previousValueColumn}); this.resultDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; this.resultDataGridView.Location = new System.Drawing.Point(0, 0); - this.resultDataGridView.MultiSelect = false; this.resultDataGridView.Name = "resultDataGridView"; this.resultDataGridView.ReadOnly = true; this.resultDataGridView.RowHeadersVisible = false; @@ -62,6 +61,8 @@ private void InitializeComponent() this.resultDataGridView.TabIndex = 15; this.resultDataGridView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.resultDataGridView_CellDoubleClick); this.resultDataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.resultDataGridView_CellFormatting); + this.resultDataGridView.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.resultDataGridView_CellMouseDown); + this.resultDataGridView.RowContextMenuStripNeeded += new System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventHandler(this.resultDataGridView_RowContextMenuStripNeeded); // // descriptionColumn // diff --git a/UI/MemoryRecordList.cs b/UI/MemoryRecordList.cs index 26db1934..4fe7fd7f 100644 --- a/UI/MemoryRecordList.cs +++ b/UI/MemoryRecordList.cs @@ -44,9 +44,23 @@ public bool ShowPreviousValueColumn set => previousValueColumn.Visible = value; } - public bool ShowValuesHexadecimal { get; set; } + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public IList Records => bindings; - public IEnumerable Records => bindings; + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public MemoryRecord SelectedRecord => GetSelectedRecords().FirstOrDefault(); + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public IList SelectedRecords => GetSelectedRecords().ToList(); + + public override ContextMenuStrip ContextMenuStrip + { + get; + set; + } public event MemorySearchResultControlResultDoubleClickEventHandler RecordDoubleClick; @@ -73,40 +87,80 @@ public MemoryRecordList() resultDataGridView.DataSource = bindings; } - public void SetRecords(IEnumerable results) + #region Event Handler + + private void resultDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { - Contract.Requires(results != null); + OnRecordDoubleClick((MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem); + } - bindings.Clear(); + private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex == 1) + { + var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; + if (record.IsRelativeAddress) + { + e.CellStyle.ForeColor = Color.ForestGreen; + e.FormattingApplied = true; + } + } + } - if (results == null) + private void resultDataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) + { + if (e.Button == MouseButtons.Right) { - return; + if (e.RowIndex != -1) + { + var row = resultDataGridView.Rows[e.RowIndex]; + row.Selected = true; + } } + } + + private void resultDataGridView_RowContextMenuStripNeeded(object sender, DataGridViewRowContextMenuStripNeededEventArgs e) + { + e.ContextMenuStrip = ContextMenuStrip; + } + + #endregion + + private IEnumerable GetSelectedRecords() => resultDataGridView.SelectedRows.Cast().Select(r => (MemoryRecord)r.DataBoundItem); + + /// + /// Sets the records to display. + /// + /// The records. + public void SetRecords(IEnumerable records) + { + Contract.Requires(records != null); + + bindings.Clear(); bindings.RaiseListChangedEvents = false; - foreach (var result in results) + foreach (var record in records) { - bindings.Add(result); + bindings.Add(record); } bindings.RaiseListChangedEvents = true; bindings.ResetBindings(); } - public void AddRecord(MemoryRecord result) - { - Contract.Requires(result != null); - - bindings.Add(result); - } - + /// + /// Removes all records. + /// public void Clear() { - SetRecords(null); + bindings.Clear(); } + /// + /// Refreshes the data of all displayed records. + /// + /// The process. public void RefreshValues(RemoteProcess process) { Contract.Requires(process != null); @@ -122,23 +176,5 @@ private void OnRecordDoubleClick(MemoryRecord record) var evt = RecordDoubleClick; evt?.Invoke(this, record); } - - private void resultDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) - { - OnRecordDoubleClick((MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem); - } - - private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) - { - if (e.ColumnIndex == 1) - { - var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; - if (record.IsRelativeAddress) - { - e.CellStyle.ForeColor = Color.ForestGreen; - e.FormattingApplied = true; - } - } - } } } From 336774a8b94605fcca19ce7166ee1dfb2c6042e8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 11:56:07 +0200 Subject: [PATCH 110/777] Get rid of CS0067. --- Logger/ILogger.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Logger/ILogger.cs b/Logger/ILogger.cs index 5744da57..46967266 100644 --- a/Logger/ILogger.cs +++ b/Logger/ILogger.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Logger { public delegate void NewLogEntryEventHandler(LogLevel level, string message, Exception ex); - [ContractClass(typeof(ILoggerContract))] + [ContractClass(typeof(LoggerContract))] public interface ILogger { /// Gets triggered every time a new entry is created. @@ -22,9 +22,9 @@ public interface ILogger } [ContractClassFor(typeof(ILogger))] - internal abstract class ILoggerContract : ILogger + internal abstract class LoggerContract : ILogger { - public event NewLogEntryEventHandler NewLogEntry; + public event NewLogEntryEventHandler NewLogEntry { add { throw new NotImplementedException(); } remove { } } public void Log(Exception ex) { From 9ee636f13ea36a80a9ab2e3e4f4a1982a9bae93b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 23:27:10 +0200 Subject: [PATCH 111/777] Fixed ByteValue. --- MemoryScanner/BytePattern.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MemoryScanner/BytePattern.cs b/MemoryScanner/BytePattern.cs index 9336ceb1..16b6513c 100644 --- a/MemoryScanner/BytePattern.cs +++ b/MemoryScanner/BytePattern.cs @@ -22,7 +22,7 @@ private struct Nibble public bool HasWildcard => nibble1.IsWildcard || nibble2.IsWildcard; - public byte ByteValue => !HasWildcard ? (byte)(nibble1.Value << 4 + nibble2.Value) : throw new InvalidOperationException(); + public byte ByteValue => !HasWildcard ? (byte)((nibble1.Value << 4) + nibble2.Value) : throw new InvalidOperationException(); private static bool IsHexValue(char c) { From e70d0502ca7c98860ed7ac913aab92ee22f65977 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 19 Sep 2017 23:27:58 +0200 Subject: [PATCH 112/777] Fixed ByteArrayToHexString. --- Util/Util.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Util/Util.cs b/Util/Util.cs index ec84feab..55ff46ce 100644 --- a/Util/Util.cs +++ b/Util/Util.cs @@ -103,9 +103,9 @@ public static string ByteArrayToHexString(byte[] data) for (var i = 1; i < data.Length; i++) { val = lookup[data[i]]; - result[2 * i] = ' '; - result[2 * i + 1] = (char)val; - result[2 * i + 2] = (char)(val >> 16); + result[3 * i - 1] = ' '; + result[3 * i] = (char)val; + result[3 * i + 1] = (char)(val >> 16); } return new string(result); } From 864d3af947fb9ac56459da61adc1f3353a38a779 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 20 Sep 2017 22:27:20 +0200 Subject: [PATCH 113/777] Added second constructor. --- .../Comparer/ArrayOfBytesMemoryComparer.cs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs b/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs index e40dfa70..e7e2bcbc 100644 --- a/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs @@ -7,38 +7,45 @@ namespace ReClassNET.MemoryScanner.Comparer public class ArrayOfBytesMemoryComparer : IScanComparer { public ScanCompareType CompareType => ScanCompareType.Equal; - public BytePattern Value { get; } - public int ValueSize => Value.Length; + public int ValueSize => bytePattern?.Length ?? byteArray.Length; - private readonly byte[] pattern; + private readonly BytePattern bytePattern; + private readonly byte[] byteArray; - public ArrayOfBytesMemoryComparer(BytePattern value) + public ArrayOfBytesMemoryComparer(BytePattern pattern) { - Contract.Requires(value != null); + Contract.Requires(pattern != null); - Value = value; + bytePattern = pattern; - if (!value.HasWildcards) + if (!bytePattern.HasWildcards) { - pattern = value.ToByteArray(); + byteArray = bytePattern.ToByteArray(); } } + public ArrayOfBytesMemoryComparer(byte[] pattern) + { + Contract.Requires(pattern != null); + + byteArray = pattern; + } + public bool Compare(byte[] data, int index, out ScanResult result) { result = null; - if (pattern != null) + if (byteArray != null) { - for (var i = 0; i < pattern.Length; ++i) + for (var i = 0; i < byteArray.Length; ++i) { - if (data[index + i] != pattern[i]) + if (data[index + i] != byteArray[i]) { return false; } } } - else if (!Value.Equals(data, index)) + else if (!bytePattern.Equals(data, index)) { return false; } From 6ac72140a88cdf1bae1df65d963eaceb2040d461 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 20 Sep 2017 22:27:43 +0200 Subject: [PATCH 114/777] Changed default settings. --- MemoryScanner/ScanSettings.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MemoryScanner/ScanSettings.cs b/MemoryScanner/ScanSettings.cs index 79d341e3..b21b9793 100644 --- a/MemoryScanner/ScanSettings.cs +++ b/MemoryScanner/ScanSettings.cs @@ -25,7 +25,9 @@ public class ScanSettings public bool ScanImageMemory { get; set; } = true; public bool ScanMappedMemory { get; set; } = false; public bool EnableFastScan { get; set; } = true; - public int FastScanAlignment { get; set; } = 1; - public ScanValueType ValueType { get; set; } = ScanValueType.Byte; + public int FastScanAlignment { get; set; } = 4; + public ScanValueType ValueType { get; set; } = ScanValueType.Integer; + + public static ScanSettings Default => new ScanSettings(); } } From f021ee20857390009c384b0ec6721beb7aed81fb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 20 Sep 2017 22:28:20 +0200 Subject: [PATCH 115/777] Added ReadValueFromMemory for value nodes. --- Memory/MemoryBuffer.cs | 5 +++++ Nodes/BaseHexNode.cs | 6 ++++++ Nodes/DoubleNode.cs | 6 ++++++ Nodes/FloatNode.cs | 6 ++++++ Nodes/Int16Node.cs | 6 ++++++ Nodes/Int32Node.cs | 6 ++++++ Nodes/Int64Node.cs | 6 ++++++ Nodes/Int8Node.cs | 6 ++++++ Nodes/UInt16Node.cs | 6 ++++++ Nodes/UInt32Node.cs | 6 ++++++ Nodes/UInt64Node.cs | 6 ++++++ Nodes/UInt8Node.cs | 6 ++++++ Nodes/UTF16TextNode.cs | 6 ++++++ Nodes/UTF32TextNode.cs | 6 ++++++ Nodes/UTF8TextNode.cs | 6 ++++++ 15 files changed, 89 insertions(+) diff --git a/Memory/MemoryBuffer.cs b/Memory/MemoryBuffer.cs index 0424a8d6..37ef8440 100644 --- a/Memory/MemoryBuffer.cs +++ b/Memory/MemoryBuffer.cs @@ -130,6 +130,11 @@ public byte ReadByte(int offset) return data[Offset + offset]; } + public byte[] ReadBytes(IntPtr offset, int length) + { + return ReadBytes(offset.ToInt32(), length); + } + public byte[] ReadBytes(int offset, int length) { Contract.Requires(offset >= 0); diff --git a/Nodes/BaseHexNode.cs b/Nodes/BaseHexNode.cs index e0402236..d8003be6 100644 --- a/Nodes/BaseHexNode.cs +++ b/Nodes/BaseHexNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Globalization; +using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; @@ -111,5 +112,10 @@ public void Update(HotSpot spot, int maxId) } } } + + public byte[] ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadBytes(Offset, MemorySize); + } } } diff --git a/Nodes/DoubleNode.cs b/Nodes/DoubleNode.cs index 14753afc..4fffd98c 100644 --- a/Nodes/DoubleNode.cs +++ b/Nodes/DoubleNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -32,5 +33,10 @@ public override void Update(HotSpot spot) } } } + + public double ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/FloatNode.cs b/Nodes/FloatNode.cs index c96fd8a3..c52419a6 100644 --- a/Nodes/FloatNode.cs +++ b/Nodes/FloatNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -32,5 +33,10 @@ public override void Update(HotSpot spot) } } } + + public float ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/Int16Node.cs b/Nodes/Int16Node.cs index 89e106b5..c786bbfc 100644 --- a/Nodes/Int16Node.cs +++ b/Nodes/Int16Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public short ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/Int32Node.cs b/Nodes/Int32Node.cs index 58e181ff..59940d1e 100644 --- a/Nodes/Int32Node.cs +++ b/Nodes/Int32Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public int ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/Int64Node.cs b/Nodes/Int64Node.cs index 22761b8a..75abbbbe 100644 --- a/Nodes/Int64Node.cs +++ b/Nodes/Int64Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public long ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/Int8Node.cs b/Nodes/Int8Node.cs index 6f795da5..97ceb001 100644 --- a/Nodes/Int8Node.cs +++ b/Nodes/Int8Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public sbyte ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/UInt16Node.cs b/Nodes/UInt16Node.cs index a362883d..645ef8f8 100644 --- a/Nodes/UInt16Node.cs +++ b/Nodes/UInt16Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public ushort ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/UInt32Node.cs b/Nodes/UInt32Node.cs index de98ab22..cd09a1fe 100644 --- a/Nodes/UInt32Node.cs +++ b/Nodes/UInt32Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public uint ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/UInt64Node.cs b/Nodes/UInt64Node.cs index 2c7c6d68..23290df2 100644 --- a/Nodes/UInt64Node.cs +++ b/Nodes/UInt64Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public ulong ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/UInt8Node.cs b/Nodes/UInt8Node.cs index 72e9684e..9815cfed 100644 --- a/Nodes/UInt8Node.cs +++ b/Nodes/UInt8Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,5 +34,10 @@ public override void Update(HotSpot spot) } } } + + public byte ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadObject(Offset); + } } } diff --git a/Nodes/UTF16TextNode.cs b/Nodes/UTF16TextNode.cs index 11f19682..ebbc0932 100644 --- a/Nodes/UTF16TextNode.cs +++ b/Nodes/UTF16TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -16,5 +17,10 @@ public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUtf16String(Offset, MemorySize)); } + + public string ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadUtf16String(Offset, MemorySize); + } } } diff --git a/Nodes/UTF32TextNode.cs b/Nodes/UTF32TextNode.cs index 5f8d0309..b85576b9 100644 --- a/Nodes/UTF32TextNode.cs +++ b/Nodes/UTF32TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -16,5 +17,10 @@ public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUtf32String(Offset, MemorySize)); } + + public string ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadUtf32String(Offset, MemorySize); + } } } diff --git a/Nodes/UTF8TextNode.cs b/Nodes/UTF8TextNode.cs index 46baafd8..43c47ae8 100644 --- a/Nodes/UTF8TextNode.cs +++ b/Nodes/UTF8TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -16,5 +17,10 @@ public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUtf8String(Offset, MemorySize)); } + + public string ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadUtf8String(Offset, MemorySize); + } } } From c343a232f0ffc5d2fec3af363cbfb6bab3a4e6cf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 20 Sep 2017 22:32:32 +0200 Subject: [PATCH 116/777] Added direct memory search from the node view. --- Forms/ScannerForm.Designer.cs | 16 +-- Forms/ScannerForm.cs | 167 +++++++++++++++++++------------ Forms/ScannerForm.resx | 6 -- UI/LinkedWindowFeatures.cs | 65 ++++++++++++ UI/MemoryViewControl.Designer.cs | 105 +++++++++++-------- UI/MemoryViewControl.cs | 88 +++++++++++++++- 6 files changed, 324 insertions(+), 123 deletions(-) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 2a8432c0..19604451 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -43,7 +43,7 @@ private void InitializeComponent() this.scanCopyOnWriteCheckBox = new System.Windows.Forms.CheckBox(); this.scanExecutableCheckBox = new System.Windows.Forms.CheckBox(); this.scanWritableCheckBox = new System.Windows.Forms.CheckBox(); - this.endAddressTextBox = new System.Windows.Forms.TextBox(); + this.stopAddressTextBox = new System.Windows.Forms.TextBox(); this.label4 = new System.Windows.Forms.Label(); this.startAddressTextBox = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); @@ -195,7 +195,7 @@ private void InitializeComponent() this.scanOptionsGroupBox.Controls.Add(this.scanCopyOnWriteCheckBox); this.scanOptionsGroupBox.Controls.Add(this.scanExecutableCheckBox); this.scanOptionsGroupBox.Controls.Add(this.scanWritableCheckBox); - this.scanOptionsGroupBox.Controls.Add(this.endAddressTextBox); + this.scanOptionsGroupBox.Controls.Add(this.stopAddressTextBox); this.scanOptionsGroupBox.Controls.Add(this.label4); this.scanOptionsGroupBox.Controls.Add(this.startAddressTextBox); this.scanOptionsGroupBox.Controls.Add(this.label2); @@ -263,12 +263,12 @@ private void InitializeComponent() this.scanWritableCheckBox.ThreeState = true; this.scanWritableCheckBox.UseVisualStyleBackColor = true; // - // endAddressTextBox + // stopAddressTextBox // - this.endAddressTextBox.Location = new System.Drawing.Point(66, 42); - this.endAddressTextBox.Name = "endAddressTextBox"; - this.endAddressTextBox.Size = new System.Drawing.Size(218, 20); - this.endAddressTextBox.TabIndex = 3; + this.stopAddressTextBox.Location = new System.Drawing.Point(66, 42); + this.stopAddressTextBox.Name = "stopAddressTextBox"; + this.stopAddressTextBox.Size = new System.Drawing.Size(218, 20); + this.stopAddressTextBox.TabIndex = 3; // // label4 // @@ -748,7 +748,7 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox scanCopyOnWriteCheckBox; private System.Windows.Forms.CheckBox scanExecutableCheckBox; private System.Windows.Forms.CheckBox scanWritableCheckBox; - private System.Windows.Forms.TextBox endAddressTextBox; + private System.Windows.Forms.TextBox stopAddressTextBox; private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox startAddressTextBox; private System.Windows.Forms.Label label2; diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 56e3e822..a46c603f 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -40,15 +40,10 @@ public ScannerForm() toolStripPanel.Renderer = new CustomToolStripProfessionalRenderer(true, false); menuToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); - startAddressTextBox.Text = 0.ToString(Constants.StringHexFormat); - endAddressTextBox.Text = -#if RECLASSNET64 - long.MaxValue.ToString(Constants.StringHexFormat); -#else - int.MaxValue.ToString(Constants.StringHexFormat); -#endif - valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); + + SetGuiFromSettings(ScanSettings.Default); + OnValueTypeChanged(); Reset(); @@ -126,12 +121,42 @@ private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs private async void firstScanButton_Click(object sender, EventArgs e) { - await OnStartFirstScan(); + if (isFirstScan) + { + firstScanButton.Enabled = false; + + var settings = CreateSearchSettings(); + var comparer = CreateComparer(settings); + + await StartFirstScanEx(settings, comparer); + + return; + } + + Reset(); } private async void nextScanButton_Click(object sender, EventArgs e) { - await OnStartNextScan(); + if (!isFirstScan) + { + firstScanButton.Enabled = false; + nextScanButton.Enabled = false; + + var comparer = CreateComparer(searcher.Settings); + + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); + + if (completed) + { + ShowScannerResults(); + } + + scanProgressBar.Value = 0; + firstScanButton.Enabled = true; + nextScanButton.Enabled = true; + } } private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) @@ -349,8 +374,6 @@ private void OnValueTypeChanged() { SetValidCompareTypes(); - isHexCheckBox.Enabled = true; - var valueType = SelectedValueType; switch (valueType) @@ -428,7 +451,7 @@ private void Reset() isHexCheckBox.Checked = false; valueTypeComboBox.Enabled = true; - valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); + //valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); OnValueTypeChanged(); floatingOptionsGroupBox.Enabled = true; @@ -441,78 +464,60 @@ private void Reset() } /// - /// Executes the first scan async. + /// Excutes a new scan with the provided settings and comparer. /// - /// The scanner task. - private async Task OnStartFirstScan() + /// The scan settings. + /// The comparer. + public void ExcuteScan(ScanSettings settings, IScanComparer comparer) { - if (isFirstScan) - { - firstScanButton.Enabled = false; - - var settings = CreateSearchSettings(); - var comparer = CreateComparer(settings); - searcher = new Scanner(Program.RemoteProcess, settings); - - var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); - - if (completed) - { - ShowScannerResults(); - - firstScanButton.Enabled = true; - nextScanButton.Enabled = true; - valueTypeComboBox.Enabled = false; - - floatingOptionsGroupBox.Enabled = false; - stringOptionsGroupBox.Enabled = false; - scanOptionsGroupBox.Enabled = false; - - isFirstScan = false; - - SetValidCompareTypes(); - } + Contract.Requires(settings != null); + Contract.Requires(comparer != null); - scanProgressBar.Value = 0; + Reset(); - return; - } + SetGuiFromSettings(settings); - Reset(); + Invoke((Action)(async () => await StartFirstScanEx(settings, comparer))); } /// - /// Executes the next scan async. + /// Starts a new first scan with the provided settings and comparer. /// - /// The scanner task. - private async Task OnStartNextScan() + /// The scan settings. + /// The comparer. + private async Task StartFirstScanEx(ScanSettings settings, IScanComparer comparer) { - if (!isFirstScan) - { - firstScanButton.Enabled = false; - nextScanButton.Enabled = false; + firstScanButton.Enabled = false; - var comparer = CreateComparer(searcher.Settings); + searcher = new Scanner(Program.RemoteProcess, settings); - var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); - if (completed) - { - ShowScannerResults(); - } + if (completed) + { + ShowScannerResults(); - scanProgressBar.Value = 0; firstScanButton.Enabled = true; nextScanButton.Enabled = true; + valueTypeComboBox.Enabled = false; + + floatingOptionsGroupBox.Enabled = false; + stringOptionsGroupBox.Enabled = false; + scanOptionsGroupBox.Enabled = false; + + isFirstScan = false; + + SetValidCompareTypes(); } + + scanProgressBar.Value = 0; } /// /// Creates the search settings from the user input. /// - /// The search settings. + /// The scan settings. private ScanSettings CreateSearchSettings() { Contract.Ensures(Contract.Result() != null); @@ -523,7 +528,7 @@ private ScanSettings CreateSearchSettings() }; long.TryParse(startAddressTextBox.Text, NumberStyles.HexNumber, null, out var startAddressVar); - long.TryParse(endAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); + long.TryParse(stopAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); #if RECLASSNET64 settings.StartAddress = unchecked((IntPtr)startAddressVar); settings.StopAddress = unchecked((IntPtr)endAddressVar); @@ -555,6 +560,40 @@ SettingState CheckStateToSettingState(CheckState state) return settings; } + /// + /// Sets the input fields according to the provided settings. + /// + /// The scan settings. + private void SetGuiFromSettings(ScanSettings settings) + { + Contract.Requires(settings != null); + + valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == settings.ValueType); + + startAddressTextBox.Text = settings.StartAddress.ToString(Constants.StringHexFormat); + stopAddressTextBox.Text = settings.StopAddress.ToString(Constants.StringHexFormat); + + fastScanCheckBox.Checked = settings.EnableFastScan; + fastScanAlignmentTextBox.Text = Math.Max(1, settings.FastScanAlignment).ToString(); + + CheckState SettingStateToCheckState(SettingState state) + { + switch (state) + { + case SettingState.Yes: + return CheckState.Checked; + case SettingState.No: + return CheckState.Unchecked; + default: + return CheckState.Indeterminate; + } + } + + scanWritableCheckBox.CheckState = SettingStateToCheckState(settings.ScanWritableMemory); + scanExecutableCheckBox.CheckState = SettingStateToCheckState(settings.ScanExecutableMemory); + scanCopyOnWriteCheckBox.CheckState = SettingStateToCheckState(settings.ScanCopyOnWriteMemory); + } + /// /// Creates the comparer from the user input. /// diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index 3aab10d9..a51fb480 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -129,12 +129,6 @@ 172, 6 - - 172, 6 - - - 304, 6 - 42 diff --git a/UI/LinkedWindowFeatures.cs b/UI/LinkedWindowFeatures.cs index eeef1ddb..40c42656 100644 --- a/UI/LinkedWindowFeatures.cs +++ b/UI/LinkedWindowFeatures.cs @@ -1,5 +1,11 @@ using System; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Windows.Forms; using ReClassNET.Debugger; +using ReClassNET.Forms; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; using ReClassNET.Nodes; namespace ReClassNET.UI @@ -8,6 +14,8 @@ public class LinkedWindowFeatures { public static ClassNode CreateClassAtAddress(IntPtr address, bool addDefaultBytes) { + Contract.Ensures(Contract.Result() != null); + var classView = Program.MainForm.ClassView; var node = ClassNode.Create(); @@ -24,6 +32,8 @@ public static ClassNode CreateClassAtAddress(IntPtr address, bool addDefaultByte public static ClassNode CreateDefaultClass() { + Contract.Ensures(Contract.Result() != null); + var address = ClassNode.DefaultAddress; var mainModule = Program.RemoteProcess.GetModuleByName(Program.RemoteProcess.UnderlayingProcess?.Name); @@ -64,5 +74,60 @@ public static void FindWhatInteractsWithAddress(IntPtr address, int size, bool w debugger.FindWhatAccessesAddress(address, size); } } + + public static void StartMemoryScan(IScanComparer comparer) + { + Contract.Requires(comparer != null); + + var sf = GlobalWindowManager.Windows.OfType().FirstOrDefault(); + if (sf != null) + { + if (MessageBox.Show("Open a new scanner window?", Constants.ApplicationName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) + { + sf = null; + } + } + if (sf == null) + { + sf = new ScannerForm(); + sf.Show(); + } + + var settings = ScanSettings.Default; + switch (comparer) + { + case ByteMemoryComparer _: + settings.ValueType = ScanValueType.Byte; + break; + case ShortMemoryComparer _: + settings.ValueType = ScanValueType.Short; + settings.FastScanAlignment = 2; + break; + case IntegerMemoryComparer _: + settings.ValueType = ScanValueType.Integer; + settings.FastScanAlignment = 4; + break; + case LongMemoryComparer _: + settings.ValueType = ScanValueType.Long; + settings.FastScanAlignment = 4; + break; + case FloatMemoryComparer _: + settings.ValueType = ScanValueType.Float; + settings.FastScanAlignment = 4; + break; + case DoubleMemoryComparer _: + settings.ValueType = ScanValueType.Double; + settings.FastScanAlignment = 4; + break; + case ArrayOfBytesMemoryComparer _: + settings.ValueType = ScanValueType.ArrayOfBytes; + break; + case StringMemoryComparer _: + settings.ValueType = ScanValueType.String; + break; + } + + sf.ExcuteScan(settings, comparer); + } } } diff --git a/UI/MemoryViewControl.Designer.cs b/UI/MemoryViewControl.Designer.cs index 3f406c44..547d01fa 100644 --- a/UI/MemoryViewControl.Designer.cs +++ b/UI/MemoryViewControl.Designer.cs @@ -105,6 +105,8 @@ private void InitializeComponent() this.repaintTimer = new System.Windows.Forms.Timer(this.components); this.editBox = new ReClassNET.UI.HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.searchForEqualValuesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -119,6 +121,8 @@ private void InitializeComponent() this.toolStripSeparator13, this.dissectNodesToolStripMenuItem, this.toolStripSeparator2, + this.searchForEqualValuesToolStripMenuItem, + this.toolStripSeparator15, this.findOutWhatAccessesThisAddressToolStripMenuItem, this.findOutWhatWritesToThisAddressToolStripMenuItem, this.toolStripSeparator14, @@ -128,7 +132,7 @@ private void InitializeComponent() this.toolStripSeparator12, this.copyAddressToolStripMenuItem}); this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 276); + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 326); this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); // // changeTypeToolStripMenuItem @@ -185,7 +189,7 @@ private void InitializeComponent() // this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex64ToolStripMenuItem.Text = "Hex 64"; this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -194,7 +198,7 @@ private void InitializeComponent() // this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex32ToolStripMenuItem.Text = "Hex 32"; this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -203,7 +207,7 @@ private void InitializeComponent() // this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex16ToolStripMenuItem.Text = "Hex 16"; this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -212,7 +216,7 @@ private void InitializeComponent() // this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex8ToolStripMenuItem.Text = "Hex 8"; this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -220,13 +224,13 @@ private void InitializeComponent() // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); // // int64ToolStripMenuItem // this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int64ToolStripMenuItem.Text = "Int 64"; this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -235,7 +239,7 @@ private void InitializeComponent() // this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int32ToolStripMenuItem.Text = "Int 32"; this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -244,7 +248,7 @@ private void InitializeComponent() // this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int16ToolStripMenuItem.Text = "Int 16"; this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -253,7 +257,7 @@ private void InitializeComponent() // this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int8ToolStripMenuItem.Text = "Int 8"; this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -261,13 +265,13 @@ private void InitializeComponent() // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); // // uInt64ToolStripMenuItem // this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt64ToolStripMenuItem.Text = "UInt 64"; this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -276,7 +280,7 @@ private void InitializeComponent() // this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt32ToolStripMenuItem.Text = "UInt 32"; this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -285,7 +289,7 @@ private void InitializeComponent() // this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt16ToolStripMenuItem.Text = "UInt 16"; this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -294,7 +298,7 @@ private void InitializeComponent() // this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt8ToolStripMenuItem.Text = "UInt 8"; this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -302,13 +306,13 @@ private void InitializeComponent() // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); // // boolToolStripMenuItem // this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.boolToolStripMenuItem.Text = "Bool"; this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -317,7 +321,7 @@ private void InitializeComponent() // this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.bitsToolStripMenuItem.Text = "Bits"; this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -325,13 +329,13 @@ private void InitializeComponent() // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); // // floatToolStripMenuItem // this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.floatToolStripMenuItem.Text = "Float"; this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -340,7 +344,7 @@ private void InitializeComponent() // this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.doubleToolStripMenuItem.Text = "Double"; this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -348,13 +352,13 @@ private void InitializeComponent() // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); // // vector4ToolStripMenuItem // this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector4ToolStripMenuItem.Text = "Vector 4"; this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -363,7 +367,7 @@ private void InitializeComponent() // this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector3ToolStripMenuItem.Text = "Vector 3"; this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -372,7 +376,7 @@ private void InitializeComponent() // this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector2ToolStripMenuItem.Text = "Vector 2"; this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -380,13 +384,13 @@ private void InitializeComponent() // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); // // matrix4x4ToolStripMenuItem // this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -395,7 +399,7 @@ private void InitializeComponent() // this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -404,7 +408,7 @@ private void InitializeComponent() // this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -412,13 +416,13 @@ private void InitializeComponent() // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); // // uTF8TextToolStripMenuItem // this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -427,7 +431,7 @@ private void InitializeComponent() // this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -436,7 +440,7 @@ private void InitializeComponent() // this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -445,7 +449,7 @@ private void InitializeComponent() // this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -453,13 +457,13 @@ private void InitializeComponent() // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); // // classInstanceToolStripMenuItem // this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.classInstanceToolStripMenuItem.Text = "Class Instance"; this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -468,7 +472,7 @@ private void InitializeComponent() // this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.classPointerToolStripMenuItem.Text = "Class Pointer"; this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -476,13 +480,13 @@ private void InitializeComponent() // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); // // arrayToolStripMenuItem // this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.arrayToolStripMenuItem.Text = "Array of Classes"; this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -491,7 +495,7 @@ private void InitializeComponent() // this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -500,7 +504,7 @@ private void InitializeComponent() // this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -509,7 +513,7 @@ private void InitializeComponent() // this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.functionPointerToolStripMenuItem.Text = "Function Pointer"; this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -518,7 +522,7 @@ private void InitializeComponent() // this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.functionToolStripMenuItem.Text = "Function"; this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -790,6 +794,19 @@ private void InitializeComponent() // this.nodeInfoToolTip.ShowAlways = true; // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(266, 6); + // + // searchForEqualValuesToolStripMenuItem + // + this.searchForEqualValuesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.searchForEqualValuesToolStripMenuItem.Name = "searchForEqualValuesToolStripMenuItem"; + this.searchForEqualValuesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.searchForEqualValuesToolStripMenuItem.Text = "Search for equal values..."; + this.searchForEqualValuesToolStripMenuItem.Click += new System.EventHandler(this.searchForEqualValuesToolStripMenuItem_Click); + // // MemoryViewControl // this.Controls.Add(this.editBox); @@ -880,5 +897,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem searchForEqualValuesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; } } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index e8cfea94..5355f7e7 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -5,9 +5,12 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using System.Text; using System.Windows.Forms; using ReClassNET.DataExchange.ReClass; using ReClassNET.Memory; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; using ReClassNET.Nodes; using ReClassNET.Util; @@ -258,7 +261,7 @@ protected override void OnMouseClick(MouseEventArgs e) break; } - else if (hotSpot.Type == HotSpotType.Click) + if (hotSpot.Type == HotSpotType.Click) { hitObject.Update(hotSpot); @@ -266,7 +269,7 @@ protected override void OnMouseClick(MouseEventArgs e) break; } - else if (hotSpot.Type == HotSpotType.Select) + if (hotSpot.Type == HotSpotType.Select) { if (e.Button == MouseButtons.Left) { @@ -758,6 +761,26 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs var node = selectedNodes.Select(s => s.Node).FirstOrDefault(); var nodeIsClass = node is ClassNode; + var nodeIsValueNode = false; + switch (node) + { + case BaseHexNode _: + case FloatNode _: + case DoubleNode _: + case Int8Node _: + case UInt8Node _: + case Int16Node _: + case UInt16Node _: + case Int32Node _: + case UInt32Node _: + case Int64Node _: + case UInt64Node _: + case Utf8TextNode _: + case Utf16TextNode _: + case Utf32TextNode _: + nodeIsValueNode = true; + break; + } addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; insertBytesToolStripMenuItem.Enabled = count == 1 && node?.ParentNode != null; @@ -766,6 +789,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs createClassFromNodesToolStripMenuItem.Enabled = count > 0 && !nodeIsClass; dissectNodesToolStripMenuItem.Enabled = count > 0 && !nodeIsClass; + searchForEqualValuesToolStripMenuItem.Enabled = count == 1 && nodeIsValueNode; pasteNodesToolStripMenuItem.Enabled = count == 1 && ReClassClipboard.ContainsNodes; removeToolStripMenuItem.Enabled = !nodeIsClass; @@ -838,6 +862,66 @@ private void dissectNodesToolStripMenuItem_Click(object sender, EventArgs e) } } + private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArgs e) + { + var selectedNode = selectedNodes.FirstOrDefault(); + if (selectedNode == null) + { + return; + } + + IScanComparer comparer; + switch (selectedNode.Node) + { + case BaseHexNode node: + comparer = new ArrayOfBytesMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory)); + break; + case FloatNode node: + comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case DoubleNode node: + comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case Int8Node node: + comparer = new ByteMemoryComparer(ScanCompareType.Equal, (byte)node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case UInt8Node node: + comparer = new ByteMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case Int16Node node: + comparer = new ShortMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case UInt16Node node: + comparer = new ShortMemoryComparer(ScanCompareType.Equal, (short)node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case Int32Node node: + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case UInt32Node node: + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case Int64Node node: + comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case UInt64Node node: + comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0); + break; + case Utf8TextNode node: + comparer = new StringMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory), Encoding.UTF8, true); + break; + case Utf16TextNode node: + comparer = new StringMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory), Encoding.Unicode, true); + break; + case Utf32TextNode node: + comparer = new StringMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory), Encoding.UTF32, true); + break; + default: + return; + } + + LinkedWindowFeatures.StartMemoryScan(comparer); + } + private void findOutWhatAccessesThisAddressToolStripMenuItem_Click(object sender, EventArgs e) { FindWhatInteractsWithSelectedNode(false); From 890ad047e3b8c054a64525a9c81efbb59082fce7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 11:00:15 +0200 Subject: [PATCH 117/777] Changed messagebox icons. --- Forms/FoundCodeForm.cs | 2 +- Forms/MainForm.cs | 2 +- Forms/ScannerForm.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Forms/FoundCodeForm.cs b/Forms/FoundCodeForm.cs index ac07c5ab..01eb29f9 100644 --- a/Forms/FoundCodeForm.cs +++ b/Forms/FoundCodeForm.cs @@ -150,7 +150,7 @@ private void createFunctionButton_Click(object sender, EventArgs e) var functionStartAddress = disassembler.RemoteGetFunctionStartAddress(process, info.DebugInfo.ExceptionAddress); if (functionStartAddress.IsNull()) { - MessageBox.Show("Could not find the start of the function. Aborting.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Could not find the start of the function. Aborting.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index f43b4ddd..5dcaa79f 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -181,7 +181,7 @@ private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e var info = Program.CoreFunctions.EnumerateProcesses().FirstOrDefault(p => p.Name == lastProcess); if (info == null) { - MessageBox.Show($"Process '{lastProcess}' could not be found.", Constants.ApplicationName); + MessageBox.Show($"Process '{lastProcess}' could not be found.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Error); Program.Settings.LastProcess = string.Empty; } diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index a46c603f..9610783d 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -78,7 +78,7 @@ private void RemoteProcessOnProcessAttached(RemoteProcess remoteProcess) if (addressListMemoryRecordList.Records.Any()) { - if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo) != DialogResult.Yes) + if (MessageBox.Show("Keep the current address list?", "Process has changed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { addressListMemoryRecordList.Clear(); } @@ -196,7 +196,7 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) { if (addressListMemoryRecordList.Records.Any()) { - if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo) != DialogResult.Yes) + if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return; } From 33c86afe57e90d2ce55ddeb5433d8b9fbff392bb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 11:37:19 +0200 Subject: [PATCH 118/777] Changed column size mode. --- UI/MemoryRecordList.Designer.cs | 10 ++-------- UI/MemoryRecordList.cs | 2 ++ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/UI/MemoryRecordList.Designer.cs b/UI/MemoryRecordList.Designer.cs index 518180cd..34475868 100644 --- a/UI/MemoryRecordList.Designer.cs +++ b/UI/MemoryRecordList.Designer.cs @@ -42,6 +42,7 @@ private void InitializeComponent() this.resultDataGridView.AllowUserToAddRows = false; this.resultDataGridView.AllowUserToDeleteRows = false; this.resultDataGridView.AllowUserToResizeRows = false; + this.resultDataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.resultDataGridView.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.SingleVertical; this.resultDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.resultDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { @@ -66,7 +67,6 @@ private void InitializeComponent() // // descriptionColumn // - this.descriptionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; this.descriptionColumn.DataPropertyName = "Description"; this.descriptionColumn.HeaderText = "Description"; this.descriptionColumn.Name = "descriptionColumn"; @@ -74,38 +74,32 @@ private void InitializeComponent() // // addressColumn // - this.addressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; this.addressColumn.DataPropertyName = "AddressStr"; this.addressColumn.HeaderText = "Address"; + this.addressColumn.MinimumWidth = 70; this.addressColumn.Name = "addressColumn"; this.addressColumn.ReadOnly = true; // // valueTypeColumn // - this.valueTypeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.valueTypeColumn.DataPropertyName = "ValueType"; this.valueTypeColumn.HeaderText = "Value Type"; this.valueTypeColumn.Name = "valueTypeColumn"; this.valueTypeColumn.ReadOnly = true; - this.valueTypeColumn.Width = 86; // // valueColumn // - this.valueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.valueColumn.DataPropertyName = "ValueStr"; this.valueColumn.HeaderText = "Value"; this.valueColumn.Name = "valueColumn"; this.valueColumn.ReadOnly = true; - this.valueColumn.Width = 59; // // previousValueColumn // - this.previousValueColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.previousValueColumn.DataPropertyName = "PreviousValueStr"; this.previousValueColumn.HeaderText = "Previous"; this.previousValueColumn.Name = "previousValueColumn"; this.previousValueColumn.ReadOnly = true; - this.previousValueColumn.Width = 73; // // MemoryRecordList // diff --git a/UI/MemoryRecordList.cs b/UI/MemoryRecordList.cs index 4fe7fd7f..518e1684 100644 --- a/UI/MemoryRecordList.cs +++ b/UI/MemoryRecordList.cs @@ -147,6 +147,8 @@ public void SetRecords(IEnumerable records) bindings.RaiseListChangedEvents = true; bindings.ResetBindings(); + + //resultDataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells); } /// From e60b43e0aaef6ef901ad19c883172e9d5a4b0e63 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 14:06:49 +0200 Subject: [PATCH 119/777] Changed / added icons. --- Forms/FoundCodeForm.Designer.cs | 26 ++++++++++++++++++++----- Forms/FoundCodeForm.cs | 2 ++ Forms/FoundCodeForm.resx | 6 ------ Forms/ScannerForm.Designer.cs | 4 ++-- Forms/ScannerForm.cs | 10 ++++++++++ Properties/Resources.Designer.cs | 22 ++++++++++++++++++++- Properties/Resources.resx | 6 ++++++ ReClass.NET.csproj | 9 +++++++++ Resources/Images/B32x32_3D_Glasses.png | Bin 0 -> 768 bytes Resources/Images/B32x32_Bug.png | Bin 0 -> 2078 bytes Resources/Images/B32x32_Eye.png | Bin 0 -> 1731 bytes 11 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 Resources/Images/B32x32_3D_Glasses.png create mode 100644 Resources/Images/B32x32_Bug.png create mode 100644 Resources/Images/B32x32_Eye.png diff --git a/Forms/FoundCodeForm.Designer.cs b/Forms/FoundCodeForm.Designer.cs index 5d192058..1e1d5dcf 100644 --- a/Forms/FoundCodeForm.Designer.cs +++ b/Forms/FoundCodeForm.Designer.cs @@ -36,11 +36,13 @@ private void InitializeComponent() this.stopButton = new System.Windows.Forms.Button(); this.closeButton = new System.Windows.Forms.Button(); this.createFunctionButton = new System.Windows.Forms.Button(); + this.bannerBox = new ReClassNET.UI.BannerBox(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.foundCodeDataGridView)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); // // splitContainer @@ -48,7 +50,7 @@ private void InitializeComponent() this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Location = new System.Drawing.Point(0, 49); this.splitContainer.Name = "splitContainer"; this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; // @@ -115,7 +117,7 @@ private void InitializeComponent() // stopButton // this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.stopButton.Location = new System.Drawing.Point(489, 53); + this.stopButton.Location = new System.Drawing.Point(489, 101); this.stopButton.Name = "stopButton"; this.stopButton.Size = new System.Drawing.Size(86, 35); this.stopButton.TabIndex = 1; @@ -126,7 +128,7 @@ private void InitializeComponent() // closeButton // this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.closeButton.Location = new System.Drawing.Point(489, 53); + this.closeButton.Location = new System.Drawing.Point(489, 101); this.closeButton.Name = "closeButton"; this.closeButton.Size = new System.Drawing.Size(86, 35); this.closeButton.TabIndex = 2; @@ -138,7 +140,7 @@ private void InitializeComponent() // createFunctionButton // this.createFunctionButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.createFunctionButton.Location = new System.Drawing.Point(489, 12); + this.createFunctionButton.Location = new System.Drawing.Point(489, 60); this.createFunctionButton.Name = "createFunctionButton"; this.createFunctionButton.Size = new System.Drawing.Size(86, 35); this.createFunctionButton.TabIndex = 3; @@ -146,11 +148,23 @@ private void InitializeComponent() this.createFunctionButton.UseVisualStyleBackColor = true; this.createFunctionButton.Click += new System.EventHandler(this.createFunctionButton_Click); // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_3D_Glasses; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(587, 48); + this.bannerBox.TabIndex = 8; + this.bannerBox.Text = "<>"; + this.bannerBox.Title = "Instruction Finder"; + // // FoundCodeForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(587, 426); + this.ClientSize = new System.Drawing.Size(587, 474); + this.Controls.Add(this.bannerBox); this.Controls.Add(this.createFunctionButton); this.Controls.Add(this.closeButton); this.Controls.Add(this.stopButton); @@ -165,6 +179,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); this.splitContainer.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.foundCodeDataGridView)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); this.ResumeLayout(false); } @@ -179,5 +194,6 @@ private void InitializeComponent() private System.Windows.Forms.Button closeButton; private System.Windows.Forms.TextBox infoTextBox; private System.Windows.Forms.Button createFunctionButton; + private UI.BannerBox bannerBox; } } \ No newline at end of file diff --git a/Forms/FoundCodeForm.cs b/Forms/FoundCodeForm.cs index 01eb29f9..113a8e21 100644 --- a/Forms/FoundCodeForm.cs +++ b/Forms/FoundCodeForm.cs @@ -50,6 +50,8 @@ public FoundCodeForm(RemoteProcess process, IntPtr address, HardwareBreakpointTr Text = "Find out what accesses " + address.ToString(Constants.StringHexFormat); } + bannerBox.Text = Text; + data = new DataTable(); data.Columns.Add("counter", typeof(int)); data.Columns.Add("instruction", typeof(string)); diff --git a/Forms/FoundCodeForm.resx b/Forms/FoundCodeForm.resx index 5a42245f..0fa6a150 100644 --- a/Forms/FoundCodeForm.resx +++ b/Forms/FoundCodeForm.resx @@ -123,10 +123,4 @@ True - - True - - - True - \ No newline at end of file diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 19604451..02e2343d 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -102,7 +102,7 @@ private void InitializeComponent() // bannerBox // this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; - this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Magnifier; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Eye; this.bannerBox.Location = new System.Drawing.Point(0, 0); this.bannerBox.Name = "bannerBox"; this.bannerBox.Size = new System.Drawing.Size(612, 48); @@ -697,7 +697,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(612, 583); + this.ClientSize = new System.Drawing.Size(612, 584); this.Controls.Add(this.toolStripPanel); this.Controls.Add(this.addressListMemoryRecordList); this.Controls.Add(this.resultMemoryRecordList); diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 9610783d..a140a72d 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -138,6 +138,11 @@ private async void firstScanButton_Click(object sender, EventArgs e) private async void nextScanButton_Click(object sender, EventArgs e) { + if (!Program.RemoteProcess.IsValid) + { + return; + } + if (!isFirstScan) { firstScanButton.Enabled = false; @@ -487,6 +492,11 @@ public void ExcuteScan(ScanSettings settings, IScanComparer comparer) /// The comparer. private async Task StartFirstScanEx(ScanSettings settings, IScanComparer comparer) { + if (!Program.RemoteProcess.IsValid) + { + return; + } + firstScanButton.Enabled = false; searcher = new Scanner(Program.RemoteProcess, settings); diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 9a33c824..17d911e6 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -1200,6 +1200,16 @@ internal static System.Drawing.Bitmap B16x16_Warning { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_3D_Glasses { + get { + object obj = ResourceManager.GetObject("B32x32_3D_Glasses", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1210,6 +1220,16 @@ internal static System.Drawing.Bitmap B32x32_Cogs { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Eye { + get { + object obj = ResourceManager.GetObject("B32x32_Eye", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1241,7 +1261,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/18 18:04:02 + /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/21 12:01:34 /// ähnelt. /// internal static string BuildDate { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index f8ac830f..1b8e6e26 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -478,4 +478,10 @@ ..\Resources\Images\B16x16_Magnifier_Arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B32x32_3D_Glasses.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 89dc3939..4a0e3252 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -868,6 +868,15 @@ + + + + + + + + + diff --git a/Resources/Images/B32x32_3D_Glasses.png b/Resources/Images/B32x32_3D_Glasses.png new file mode 100644 index 0000000000000000000000000000000000000000..0fafc03b93d781fdf8591bd004596cf2af0d1c31 GIT binary patch literal 768 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 IM6N<$f(-xdw*UYD literal 0 HcmV?d00001 diff --git a/Resources/Images/B32x32_Eye.png b/Resources/Images/B32x32_Eye.png new file mode 100644 index 0000000000000000000000000000000000000000..72edb6b701fb7deb90d293ee71e3fab6e58b949b GIT binary patch literal 1731 zcmV;!20ZzRP)SY?GQ5*WMs8k7o_D{R6ty)bRsA{)$TY*WdG)<~hsp=jex)s_C zC{t)lK|miWw1}o1qyz{~u@k?a*N*M`+PRJ+F$7w>{edQNrDK2o?svZPJLmk)cRn-2 zFmNp&4%hg(4&XWf_EkWRKD%tag~Oe+x=Y~MH?Fpj3hJV!8^;w5{}_J$i|sU}|1SW9 z1JCvCbh&KzH#Ruoa5-QTEfB4uY3hm!N>xFrSVloEp^z&&M1`qlW4>6P|%0I=Pg zde#+Xr5BArZ|Y951f9 z_qS*EUkUl;0JuF*_ipIxZ26O}%ZNuNQIhlEDUhsv5YfgV{NeOcWOzU9yaJI^py?V) zRfeL%!);Npd6fZwc0cl`cY&*9(Xz0e0JS0!p4=+83^Ek?+3wg79@*0UKl-tr-u9C z^|(eebut<`g=$%bpc%*v{06iA zn`*h=b0UIxE{_gZ9&PqC!iV0(#Nl`G(Cw>{&m^Jo2Flecy8JG@c60)__BVlZEk@HV zKP4)vm_Gh@IP6N_x>X%FZab71nJ4Ic8Co71bR9`2&JngM%`!~i@&-!YVe+_)MFAg9 zUd*G#Hs}51p|_Avromfn$P|j03Vn%*lP6FvrJz=2d@wPC7Iy<|f%SVQKC|S7$qx_4Q#vOEW6uog`G@ zwpNgdCcp^-c#=pYjASZ-(D@JwnHVzJG!)v$DlkZP5iX~VoKWDoX+1iBG>)pGz^+Zb z^2f&mJ*I6FfX(MtM?|{=4oO1jo4ep&u^QdoOW|->VNm!OMavWmrxNkhI&~NX0`T5@ z?;{qCAs$Z>#brSadRvRf@s>04D9ya5jq@jR6shh#E|=ro1g=fZ+XFLEU} zoHl8WU}RV~YC(op0|PkaG4y}y4ouC+dx2@2`Boo#Y~O}jol{2qXSYB~9)!VJYZ+pu z?}Q-O-->LRN2bCfc*nQl^+`llg>tSU(CWs}J>Nm0YDKOh;I@IKb2Uu?Hq*q5Jh;>t z*uk|>#(s|-dp_QJ^TTgHV^)J1DLpM~NKV91X%qTsVa{jzqUS^IFR6 z5fKvEw9PI#kenoK+a7QK-O66+&IOBl!1LxtJj%Wyp!p_Qte?6K!OiO1jHU4iWVZBjMa8Y?@tT66$N*CK3)YZB0=TJ*&Xk@@(BACquLvTW6 zRx&1%0tt;U{>INx)rgnad$MYLZ;`ItK22$IaIEDtmFUTVb}kfT?cTj0sKpV Z0RT&Hpm`Jl8sPu{002ovPDHLkV1i#rJ7xd? literal 0 HcmV?d00001 From 845db16496ca20f8897a0fbad8ee602f109aacba Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 16:05:15 +0200 Subject: [PATCH 120/777] Removed duplicated code. --- UI/EnumDescriptionDisplay.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/UI/EnumDescriptionDisplay.cs b/UI/EnumDescriptionDisplay.cs index 26e52c3f..060f885e 100644 --- a/UI/EnumDescriptionDisplay.cs +++ b/UI/EnumDescriptionDisplay.cs @@ -35,7 +35,7 @@ public static List> CreateExact(IEnumerable return include .Select(value => new EnumDescriptionDisplay { - Description = value.GetType().GetField(value.ToString()).GetCustomAttribute()?.Description ?? value.ToString(), + Description = GetDescription(value), Value = value }) .OrderBy(item => item.Value) @@ -59,11 +59,18 @@ public static List> CreateExclude(IEnumerable new EnumDescriptionDisplay { - Description = value.GetType().GetField(value.ToString()).GetCustomAttribute()?.Description ?? value.ToString(), + Description = GetDescription(value), Value = value }) .OrderBy(item => item.Value) .ToList(); } + + private static string GetDescription(TEnum value) + { + Contract.Ensures(Contract.Result() != null); + + return value.GetType().GetField(value.ToString()).GetCustomAttribute()?.Description ?? value.ToString(); + } } } From aed3437df79a75c89f90656899f4b5ea9eb3d142 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 23:32:40 +0200 Subject: [PATCH 121/777] Added padding between input fields. --- UI/DualValueBox.Designer.cs | 2 +- UI/DualValueBox.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/UI/DualValueBox.Designer.cs b/UI/DualValueBox.Designer.cs index 6d4cdeee..f94500f7 100644 --- a/UI/DualValueBox.Designer.cs +++ b/UI/DualValueBox.Designer.cs @@ -71,7 +71,7 @@ private void InitializeComponent() this.value2TextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.value2TextBox.Location = new System.Drawing.Point(255, 13); - this.value2TextBox.Margin = new System.Windows.Forms.Padding(0); + this.value2TextBox.Margin = new System.Windows.Forms.Padding(1, 0, 0, 0); this.value2TextBox.Name = "value2TextBox"; this.value2TextBox.Size = new System.Drawing.Size(1, 20); this.value2TextBox.TabIndex = 3; diff --git a/UI/DualValueBox.cs b/UI/DualValueBox.cs index 46dab641..a3f473f9 100644 --- a/UI/DualValueBox.cs +++ b/UI/DualValueBox.cs @@ -17,12 +17,14 @@ public bool ShowSecondInputField tableLayoutPanel.ColumnStyles[1].SizeType = SizeType.Percent; tableLayoutPanel.ColumnStyles[1].Width = 50; tableLayoutPanel.ColumnStyles[0].Width = 50; + value1TextBox.Margin = new Padding(0, 0, 1, 0); } else { tableLayoutPanel.ColumnStyles[1].SizeType = SizeType.Absolute; tableLayoutPanel.ColumnStyles[1].Width = 0; tableLayoutPanel.ColumnStyles[0].Width = 100; + value1TextBox.Margin = new Padding(0); value2TextBox.Text = null; } } From db0afe0c4bfb4fc1e55bf076962432edae93b91b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 23:33:37 +0200 Subject: [PATCH 122/777] Deactivate input field on unknown scans. --- Forms/ScannerForm.Designer.cs | 3 ++- Forms/ScannerForm.cs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 02e2343d..051b935e 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -157,6 +157,7 @@ private void InitializeComponent() this.scanTypeComboBox.Size = new System.Drawing.Size(224, 21); this.scanTypeComboBox.TabIndex = 5; this.scanTypeComboBox.ValueMember = "Value"; + this.scanTypeComboBox.SelectionChangeCommitted += new System.EventHandler(this.scanTypeComboBox_SelectionChangeCommitted); // // label1 // @@ -628,7 +629,7 @@ private void InitializeComponent() this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal; this.toolStripPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; this.toolStripPanel.RowMargin = new System.Windows.Forms.Padding(0); - this.toolStripPanel.Size = new System.Drawing.Size(591, 25); + this.toolStripPanel.Size = new System.Drawing.Size(128, 25); // // menuToolStrip // diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index a140a72d..e3740451 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -114,6 +114,40 @@ private void updateValuesTimer_Tick(object sender, EventArgs e) addressListMemoryRecordList.RefreshValues(Program.RemoteProcess); } + private void scanTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) + { + var enableHexCheckBox = true; + var enableValueBox = true; + var enableDualInput = false; + + switch (SelectedCompareType) + { + case ScanCompareType.Unknown: + enableHexCheckBox = false; + enableValueBox = false; + break; + case ScanCompareType.Between: + case ScanCompareType.BetweenOrEqual: + enableDualInput = true; + break; + } + + switch (SelectedValueType) + { + case ScanValueType.Float: + case ScanValueType.Double: + case ScanValueType.ArrayOfBytes: + case ScanValueType.String: + isHexCheckBox.Checked = false; + enableHexCheckBox = false; + break; + } + + isHexCheckBox.Enabled = enableHexCheckBox; + dualValueBox.Enabled = enableValueBox; + dualValueBox.ShowSecondInputField = enableDualInput; + } + private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) { OnValueTypeChanged(); From fda7fba157ce416c81c52140d97bf3a1c6c91f1c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 21 Sep 2017 23:55:19 +0200 Subject: [PATCH 123/777] Show error on invalid input. --- Forms/ScannerForm.cs | 96 ++++++++++++++++++++++++------------ MemoryScanner/BytePattern.cs | 7 ++- 2 files changed, 71 insertions(+), 32 deletions(-) diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index e3740451..09afc62b 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -157,12 +157,17 @@ private async void firstScanButton_Click(object sender, EventArgs e) { if (isFirstScan) { - firstScanButton.Enabled = false; - - var settings = CreateSearchSettings(); - var comparer = CreateComparer(settings); + try + { + var settings = CreateSearchSettings(); + var comparer = CreateComparer(settings); - await StartFirstScanEx(settings, comparer); + await StartFirstScanEx(settings, comparer); + } + catch (Exception ex) + { + Program.ShowException(ex); + } return; } @@ -182,19 +187,27 @@ private async void nextScanButton_Click(object sender, EventArgs e) firstScanButton.Enabled = false; nextScanButton.Enabled = false; - var comparer = CreateComparer(searcher.Settings); + try + { + var comparer = CreateComparer(searcher.Settings); - var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); - if (completed) + if (completed) + { + ShowScannerResults(); + } + } + catch (Exception ex) { - ShowScannerResults(); + Program.ShowException(ex); } - scanProgressBar.Value = 0; firstScanButton.Enabled = true; nextScanButton.Enabled = true; + + scanProgressBar.Value = 0; } } @@ -533,29 +546,35 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare firstScanButton.Enabled = false; - searcher = new Scanner(Program.RemoteProcess, settings); + try + { + searcher = new Scanner(Program.RemoteProcess, settings); - var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); + var report = new Progress(i => scanProgressBar.Value = i); + var completed = await searcher.Search(comparer, CancellationToken.None, report); - if (completed) - { - ShowScannerResults(); + if (completed) + { + ShowScannerResults(); - firstScanButton.Enabled = true; - nextScanButton.Enabled = true; - valueTypeComboBox.Enabled = false; + nextScanButton.Enabled = true; + valueTypeComboBox.Enabled = false; - floatingOptionsGroupBox.Enabled = false; - stringOptionsGroupBox.Enabled = false; - scanOptionsGroupBox.Enabled = false; + floatingOptionsGroupBox.Enabled = false; + stringOptionsGroupBox.Enabled = false; + scanOptionsGroupBox.Enabled = false; - isFirstScan = false; + isFirstScan = false; - SetValidCompareTypes(); + SetValidCompareTypes(); + } } + finally + { + firstScanButton.Enabled = true; - scanProgressBar.Value = 0; + scanProgressBar.Value = 0; + } } /// @@ -648,12 +667,13 @@ private IScanComparer CreateComparer(ScanSettings settings) Contract.Ensures(Contract.Result() != null); var compareType = SelectedCompareType; + var checkBothInputFields = compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual; if (settings.ValueType == ScanValueType.Byte || settings.ValueType == ScanValueType.Short || settings.ValueType == ScanValueType.Integer || settings.ValueType == ScanValueType.Long) { var numberStyle = isHexCheckBox.Checked ? NumberStyles.HexNumber : NumberStyles.Integer; - long.TryParse(dualValueBox.Value1, numberStyle, null, out var value1); - long.TryParse(dualValueBox.Value2, numberStyle, null, out var value2); + if (!long.TryParse(dualValueBox.Value1, numberStyle, null, out var value1)) throw new InvalidInputException(dualValueBox.Value1); + if (!long.TryParse(dualValueBox.Value2, numberStyle, null, out var value2) && checkBothInputFields) throw new InvalidInputException(dualValueBox.Value2); switch (settings.ValueType) { @@ -686,9 +706,9 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) } var nf1 = Utils.GuessNumberFormat(dualValueBox.Value1); - double.TryParse(dualValueBox.Value1, NumberStyles.Float, nf1, out var value1); + if (!double.TryParse(dualValueBox.Value1, NumberStyles.Float, nf1, out var value1)) throw new InvalidInputException(dualValueBox.Value1); var nf2 = Utils.GuessNumberFormat(dualValueBox.Value2); - double.TryParse(dualValueBox.Value2, NumberStyles.Float, nf2, out var value2); + if (!double.TryParse(dualValueBox.Value2, NumberStyles.Float, nf2, out var value2) && checkBothInputFields) throw new InvalidInputException(dualValueBox.Value2); var significantDigits = Math.Max( CalculateSignificantDigits(dualValueBox.Value1, nf1), @@ -713,12 +733,17 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) } else if (settings.ValueType == ScanValueType.String) { + if (string.IsNullOrEmpty(dualValueBox.Value1)) + { + throw new InvalidInputException(dualValueBox.Value1); + } + var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; return new StringMemoryComparer(dualValueBox.Value1, encoding, caseSensitiveCheckBox.Checked); } - throw new Exception(); + throw new InvalidOperationException(); } /// @@ -759,4 +784,13 @@ private static void FindWhatInteractsWithSelectedRecord(MemoryRecord record, boo LinkedWindowFeatures.FindWhatInteractsWithAddress(record.RealAddress, size, writeOnly); } } + + internal class InvalidInputException : Exception + { + public InvalidInputException(string input) + : base($"'{input}' is not a valid input.") + { + + } + } } diff --git a/MemoryScanner/BytePattern.cs b/MemoryScanner/BytePattern.cs index 16b6513c..5ff487ec 100644 --- a/MemoryScanner/BytePattern.cs +++ b/MemoryScanner/BytePattern.cs @@ -112,6 +112,7 @@ public bool Equals(byte b) public static BytePattern Parse(string value) { Contract.Requires(!string.IsNullOrEmpty(value)); + Contract.Ensures(Contract.Result() != null); var pattern = new BytePattern(); @@ -126,7 +127,7 @@ public static BytePattern Parse(string value) // Check if we are not at the end of the stream if (sr.Peek() != -1) { - throw new ArgumentException(); + throw new ArgumentException($"'{value}' is not a valid byte pattern."); } } @@ -141,6 +142,8 @@ public static BytePattern Parse(string value) /// True if the pattern matches, false if they are not. public bool Equals(byte[] data, int index) { + Contract.Requires(data != null); + for (var j = 0; j < pattern.Count; ++j) { if (!pattern[j].Equals(data[index + j])) @@ -160,6 +163,8 @@ public bool Equals(byte[] data, int index) /// public byte[] ToByteArray() { + Contract.Ensures(Contract.Result() != null); + if (HasWildcards) { throw new InvalidOperationException(); From 0079c5a88348e8f5df36aa54dcbb0c9afe055051 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 22 Sep 2017 13:30:50 +0200 Subject: [PATCH 124/777] Added change highlighting. --- MemoryScanner/MemoryRecord.cs | 22 ++++++++++++++-------- UI/MemoryRecordList.cs | 8 +++++++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/MemoryScanner/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs index 587bf443..0d7d83fe 100644 --- a/MemoryScanner/MemoryRecord.cs +++ b/MemoryScanner/MemoryRecord.cs @@ -52,6 +52,7 @@ public string ModuleName public string ValueStr { get; private set; } public string PreviousValueStr { get; } + public bool HasChangedSinceLastUpdate { get; private set; } public int ValueLength { get; set; } @@ -183,33 +184,38 @@ public void RefreshValue(RemoteProcess process) if (process.ReadRemoteMemoryIntoBuffer(RealAddress, ref buffer)) { + string newValueStr = null; switch (ValueType) { case ScanValueType.Byte: - ValueStr = FormatValue(buffer[0], ShowValueHexadecimal); + newValueStr = FormatValue(buffer[0], ShowValueHexadecimal); break; case ScanValueType.Short: - ValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); + newValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Integer: - ValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); + newValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Long: - ValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); + newValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Float: - ValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); + newValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); break; case ScanValueType.Double: - ValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); + newValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); break; case ScanValueType.ArrayOfBytes: - ValueStr = FormatValue(buffer); + newValueStr = FormatValue(buffer); break; case ScanValueType.String: - ValueStr = FormatValue(Encoding.GetString(buffer)); + newValueStr = FormatValue(Encoding.GetString(buffer)); break; } + + HasChangedSinceLastUpdate = ValueStr != newValueStr; + + ValueStr = newValueStr; } else { diff --git a/UI/MemoryRecordList.cs b/UI/MemoryRecordList.cs index 518e1684..3fe014f7 100644 --- a/UI/MemoryRecordList.cs +++ b/UI/MemoryRecordList.cs @@ -96,7 +96,7 @@ private void resultDataGridView_CellDoubleClick(object sender, DataGridViewCellE private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { - if (e.ColumnIndex == 1) + if (e.ColumnIndex == 1) // Address { var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; if (record.IsRelativeAddress) @@ -105,6 +105,12 @@ private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFo e.FormattingApplied = true; } } + else if (e.ColumnIndex == 3) // Value + { + var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; + e.CellStyle.ForeColor = record.HasChangedSinceLastUpdate ? Color.Red : Color.Black; + e.FormattingApplied = true; + } } private void resultDataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) From 43050db7286c3b56ec18c1f95952555c9fb841a1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 22 Sep 2017 21:30:44 +0200 Subject: [PATCH 125/777] Updated sqlite. --- ReClass.NET.csproj | 19 ++++++++++--------- packages.config | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 4a0e3252..da20cbb9 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -117,9 +117,8 @@ - - packages\System.Data.SQLite.Core.1.0.103\lib\net46\System.Data.SQLite.dll - True + + packages\System.Data.SQLite.Core.1.0.105.2\lib\net46\System.Data.SQLite.dll @@ -494,7 +493,9 @@ Resources.Designer.cs - + + Designer + SettingsSingleFileGenerator Settings.Designer.cs @@ -878,16 +879,16 @@ - + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" + + Missing file: "{0}". - + - - powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 051b935e..99744b9c 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -88,6 +88,9 @@ private void InitializeComponent() this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); + this.toolStripPanel2 = new System.Windows.Forms.ToolStripPanel(); + this.additionalToolStrip = new System.Windows.Forms.ToolStrip(); + this.inputCorrelatorToolStripButton = new System.Windows.Forms.ToolStripButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -97,6 +100,8 @@ private void InitializeComponent() this.resultListContextMenuStrip.SuspendLayout(); this.toolStripPanel.SuspendLayout(); this.menuToolStrip.SuspendLayout(); + this.toolStripPanel2.SuspendLayout(); + this.additionalToolStrip.SuspendLayout(); this.SuspendLayout(); // // bannerBox @@ -624,7 +629,7 @@ private void InitializeComponent() // toolStripPanel // this.toolStripPanel.Controls.Add(this.menuToolStrip); - this.toolStripPanel.Location = new System.Drawing.Point(-4, 375); + this.toolStripPanel.Location = new System.Drawing.Point(11, 375); this.toolStripPanel.Name = "toolStripPanel"; this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal; this.toolStripPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; @@ -634,15 +639,16 @@ private void InitializeComponent() // menuToolStrip // this.menuToolStrip.Dock = System.Windows.Forms.DockStyle.None; + this.menuToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openAddressFileToolStripButton, this.saveAddressFileToolStripButton, this.saveAddressFileAsToolStripButton, this.toolStripSeparator1, this.clearAddressListToolStripButton}); - this.menuToolStrip.Location = new System.Drawing.Point(3, 0); + this.menuToolStrip.Location = new System.Drawing.Point(0, 0); this.menuToolStrip.Name = "menuToolStrip"; - this.menuToolStrip.Size = new System.Drawing.Size(110, 25); + this.menuToolStrip.Size = new System.Drawing.Size(101, 25); this.menuToolStrip.TabIndex = 0; // // openAddressFileToolStripButton @@ -694,11 +700,43 @@ private void InitializeComponent() // this.infoToolTip.AutomaticDelay = 100; // + // toolStripPanel2 + // + this.toolStripPanel2.Controls.Add(this.additionalToolStrip); + this.toolStripPanel2.Location = new System.Drawing.Point(580, 375); + this.toolStripPanel2.Name = "toolStripPanel2"; + this.toolStripPanel2.Orientation = System.Windows.Forms.Orientation.Horizontal; + this.toolStripPanel2.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.toolStripPanel2.RowMargin = new System.Windows.Forms.Padding(0); + this.toolStripPanel2.Size = new System.Drawing.Size(39, 25); + // + // additionalToolStrip + // + this.additionalToolStrip.Dock = System.Windows.Forms.DockStyle.None; + this.additionalToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.additionalToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.inputCorrelatorToolStripButton}); + this.additionalToolStrip.Location = new System.Drawing.Point(0, 0); + this.additionalToolStrip.Name = "additionalToolStrip"; + this.additionalToolStrip.Size = new System.Drawing.Size(50, 25); + this.additionalToolStrip.TabIndex = 0; + // + // inputCorrelatorToolStripButton + // + this.inputCorrelatorToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.inputCorrelatorToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Canvas_Size; + this.inputCorrelatorToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.inputCorrelatorToolStripButton.Name = "inputCorrelatorToolStripButton"; + this.inputCorrelatorToolStripButton.Size = new System.Drawing.Size(23, 22); + this.inputCorrelatorToolStripButton.ToolTipText = "Show Input Correlator..."; + this.inputCorrelatorToolStripButton.Click += new System.EventHandler(this.inputCorrelatorToolStripButton_Click); + // // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(612, 584); + this.Controls.Add(this.toolStripPanel2); this.Controls.Add(this.toolStripPanel); this.Controls.Add(this.addressListMemoryRecordList); this.Controls.Add(this.resultMemoryRecordList); @@ -728,6 +766,10 @@ private void InitializeComponent() this.toolStripPanel.PerformLayout(); this.menuToolStrip.ResumeLayout(false); this.menuToolStrip.PerformLayout(); + this.toolStripPanel2.ResumeLayout(false); + this.toolStripPanel2.PerformLayout(); + this.additionalToolStrip.ResumeLayout(false); + this.additionalToolStrip.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -794,5 +836,8 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem valueToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripPanel toolStripPanel2; + private System.Windows.Forms.ToolStrip additionalToolStrip; + private System.Windows.Forms.ToolStripButton inputCorrelatorToolStripButton; } } \ No newline at end of file diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index fc837ab4..5d2e9b05 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -24,10 +24,10 @@ public partial class ScannerForm : IconForm private bool isFirstScan; - private Scanner searcher; + private Scanner scanner; - private ScanCompareType SelectedCompareType => (scanTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); - private ScanValueType SelectedValueType => (valueTypeComboBox.SelectedItem as EnumDescriptionDisplay)?.Value ?? throw new InvalidOperationException(); + private ScanCompareType SelectedCompareType => ((EnumDescriptionDisplay)scanTypeComboBox.SelectedItem).Value; + private ScanValueType SelectedValueType => ((EnumDescriptionDisplay)valueTypeComboBox.SelectedItem).Value; private string addressFilePath; @@ -35,9 +35,9 @@ public ScannerForm() { InitializeComponent(); - toolStripPanel.RenderMode = ToolStripRenderMode.Professional; - toolStripPanel.Renderer = new CustomToolStripProfessionalRenderer(true, false); - menuToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); + toolStripPanel.RenderMode = toolStripPanel2.RenderMode = ToolStripRenderMode.Professional; + toolStripPanel.Renderer = toolStripPanel2.Renderer = new CustomToolStripProfessionalRenderer(true, false); + menuToolStrip.Renderer = additionalToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); @@ -101,7 +101,7 @@ private void RemoteProcessOnProcessClosing(RemoteProcess remoteProcess) private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) { - searcher?.Dispose(); + scanner?.Dispose(); Program.RemoteProcess.ProcessAttached -= RemoteProcessOnProcessAttached; Program.RemoteProcess.ProcessClosing -= RemoteProcessOnProcessClosing; @@ -188,14 +188,14 @@ private async void nextScanButton_Click(object sender, EventArgs e) try { - var comparer = CreateComparer(searcher.Settings); + var comparer = CreateComparer(scanner.Settings); var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); + var completed = await scanner.Search(comparer, CancellationToken.None, report); if (completed) { - ShowScannerResults(); + ShowScannerResults(scanner); } } catch (Exception ex) @@ -316,6 +316,11 @@ private void clearAddressListToolStripButton_Click(object sender, EventArgs e) addressListMemoryRecordList.Clear(); } + private void inputCorrelatorToolStripButton_Click(object sender, EventArgs e) + { + new InputCorrelatorForm(this).Show(); + } + private void resultListContextMenuStrip_Opening(object sender, CancelEventArgs e) { var cms = (ContextMenuStrip)sender; @@ -399,14 +404,14 @@ private void SetResultCount(int count) /// /// Shows some of the scanner results. /// - private void ShowScannerResults() + public void ShowScannerResults(Scanner scanner) { - Contract.Requires(searcher != null); + Contract.Requires(scanner != null); - SetResultCount(searcher.TotalResultCount); + SetResultCount(scanner.TotalResultCount); resultMemoryRecordList.SetRecords( - searcher.GetResults() + scanner.GetResults() .Take(MaxVisibleResults) .OrderBy(r => r.Address, IntPtrComparer.Instance) .Select(r => @@ -489,8 +494,8 @@ private void SetValidCompareTypes() /// private void Reset() { - searcher?.Dispose(); - searcher = null; + scanner?.Dispose(); + scanner = null; SetResultCount(0); resultMemoryRecordList.Clear(); @@ -547,14 +552,14 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare try { - searcher = new Scanner(Program.RemoteProcess, settings); + scanner = new Scanner(Program.RemoteProcess, settings); var report = new Progress(i => scanProgressBar.Value = i); - var completed = await searcher.Search(comparer, CancellationToken.None, report); + var completed = await scanner.Search(comparer, CancellationToken.None, report); if (completed) { - ShowScannerResults(); + ShowScannerResults(scanner); nextScanButton.Enabled = true; valueTypeComboBox.Enabled = false; diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index a51fb480..f2679c16 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -129,6 +129,15 @@ 172, 6 + + 172, 6 + + + 304, 6 + + + 630, 8 + 42 diff --git a/Input/KeyboardHotkey.cs b/Input/KeyboardHotkey.cs new file mode 100644 index 00000000..aad26440 --- /dev/null +++ b/Input/KeyboardHotkey.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Windows.Forms; + +namespace ReClassNET.Input +{ + public class KeyboardHotkey + { + private readonly HashSet keys = new HashSet(); + + public IEnumerable Keys => keys; + + public bool IsEmpty => keys.Count == 0; + + public void Clear() => keys.Clear(); + + public bool AddKey(Keys key) => keys.Add(key); + + public bool Matches(Keys[] pressedKeys) + { + Contract.Requires(pressedKeys != null); + + if (keys.Count == 0 || keys.Count > pressedKeys.Length) + { + return false; + } + + return keys.All(pressedKeys.Contains); + } + + public KeyboardHotkey Clone() + { + var copy = new KeyboardHotkey(); + foreach (var key in Keys) copy.AddKey(key); + return copy; + } + + public override string ToString() + { + if (keys.Count == 0) + { + return string.Empty; + } + return keys.Select(k => k.ToString()).Aggregate((s1, s2) => $"{s1} + {s2}"); + } + } +} diff --git a/MemoryScanner/InputCorrelatedScanner.cs b/MemoryScanner/InputCorrelatedScanner.cs new file mode 100644 index 00000000..2ccca385 --- /dev/null +++ b/MemoryScanner/InputCorrelatedScanner.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using ReClassNET.Input; +using ReClassNET.Memory; +using ReClassNET.MemoryScanner.Comparer; + +namespace ReClassNET.MemoryScanner +{ + public class InputCorrelatedScanner : Scanner + { + private readonly KeyboardInput input; + private readonly List hotkeys; + + public int ScanCount { get; private set; } + + public InputCorrelatedScanner(RemoteProcess process, KeyboardInput input, IEnumerable hotkeys, ScanValueType valueType) + : base(process, CreateScanSettings(valueType)) + { + Contract.Requires(process != null); + Contract.Requires(input != null); + Contract.Requires(hotkeys != null); + Contract.Ensures(this.input != null); + + this.input = input; + this.hotkeys = hotkeys.ToList(); + } + + private static ScanSettings CreateScanSettings(ScanValueType valueType) + { + Contract.Ensures(Contract.Result() != null); + + var settings = ScanSettings.Default; + settings.ValueType = valueType; + return settings; + } + + private IScanComparer CreateScanComparer(ScanCompareType compareType) + { + Contract.Ensures(Contract.Result() != null); + + switch (Settings.ValueType) + { + case ScanValueType.Byte: + return new ByteMemoryComparer(compareType, 0, 0); + case ScanValueType.Short: + return new ShortMemoryComparer(compareType, 0, 0); + case ScanValueType.Integer: + return new IntegerMemoryComparer(compareType, 0, 0); + case ScanValueType.Long: + return new LongMemoryComparer(compareType, 0, 0); + case ScanValueType.Float: + return new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0); + case ScanValueType.Double: + return new DoubleMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0); + default: + throw new InvalidOperationException(); + } + } + + public Task Initialize() + { + return Search(CreateScanComparer(ScanCompareType.Unknown), CancellationToken.None, null); + } + + public async Task CorrelateInput(CancellationToken ct, IProgress progress) + { + var keys = input.GetPressedKeys().Select(k => k & Keys.KeyCode).Where(k => k != Keys.None).ToArray(); + + var compareType = keys.Length != 0 && hotkeys.Any(h => h.Matches(keys)) ? ScanCompareType.Changed : ScanCompareType.NotChanged; + + await Search(CreateScanComparer(compareType), ct, progress); + + ScanCount++; + } + } +} diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 17d911e6..12d29c28 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -630,6 +630,16 @@ internal static System.Drawing.Bitmap B16x16_Camera { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Canvas_Size { + get { + object obj = ResourceManager.GetObject("B16x16_Canvas_Size", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1210,6 +1220,16 @@ internal static System.Drawing.Bitmap B32x32_3D_Glasses { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Canvas_Size { + get { + object obj = ResourceManager.GetObject("B32x32_Canvas_Size", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1261,7 +1281,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/21 12:01:34 + /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/25 19:13:20 /// ähnelt. /// internal static string BuildDate { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 1b8e6e26..91bbf5e5 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -484,4 +484,10 @@ ..\Resources\Images\B32x32_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B32x32_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index da20cbb9..a895f151 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -175,12 +175,20 @@ InputBytesForm.cs + + Form + + + InputCorrelatorForm.cs + Form ScannerForm.cs + + @@ -191,6 +199,7 @@ + @@ -281,6 +290,12 @@ DualValueBox.cs + + UserControl + + + HotkeyBox.cs + @@ -449,6 +464,9 @@ InputBytesForm.cs + + InputCorrelatorForm.cs + ScannerForm.cs @@ -469,6 +487,9 @@ DualValueBox.cs + + HotkeyBox.cs + MemoryRecordList.cs @@ -878,6 +899,12 @@ + + + + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" diff --git a/Resources/Images/B16x16_Canvas_Size.png b/Resources/Images/B16x16_Canvas_Size.png new file mode 100644 index 0000000000000000000000000000000000000000..5cec80d1847b854148166eb2d3dbb00136276416 GIT binary patch literal 737 zcmV<70v`Q|P) zEFv36hbXnI9+Wf^d(c9$nRD6gZy!gbs0HinZ-0C3%US!|(oiG<0%J_HiUhbdhSqT% zF4-2zq%BK56$xw_5-djsNs>e>)5o^$uwk0aNG6$S8jL5HWm&ATst`nqDMw?ZAuY|J zxhm~!nr6-UKmaKeG)EAuEkWPxn&@8-l;GNfNzC4<-qs9+!!??wL3U2!oNICM3%)Ne z!GF+;yALOjvpZXmVt;`bD}0PJ4xBk^n!+Hf&i^o3g{-Iu`g75HE)Qir<03y5tiXE0 zhGE%APjj@YEb-mB2f=6>T->=sEfF;K&B3Fqd~F%OObMq8as(-+oLkq>J2H>_rU){1 z86J%<7EA`_^8QCw8N|aBC8DUBSro3T|C2M@xSks-n;- zY<9V_2%))kG}azRQR^7m!k^&MRM>o1BE^)WG1ByZTt|by2s*!J@%P_;8pz7bKy29( z<|wiZUDco|j#1<^8NW0MzyW2f&#`!KsYu)q#CKVl9{!5jCd1XF!NaZ{LG z>7QrE+JxvY?CvUzAruu}lrF-!*I)mH1GRK}hj!UCY zhmbT(=C2Cy|8+{UJ@giXlMBc#%omeBzk84BvVG{hP`q78gM(qHswQ#6CGPl+y5l=8Jg+Jiw9+{%{bysDnAAeyj^^*Sw-xmLg-vSH(@r^xO TB*xYP00000NkvXXu0mjfj^k9< literal 0 HcmV?d00001 diff --git a/Resources/Images/B32x32_Canvas_Size.png b/Resources/Images/B32x32_Canvas_Size.png new file mode 100644 index 0000000000000000000000000000000000000000..14fd1f7dbbfa1181d9977b38860de6de9a8bb2c5 GIT binary patch literal 1594 zcmV-A2F3Y_P)u*$55dYoB?%v&QAsA?UL61sEtbGDXDJT?RNJbXU@I5>~`;MH=Ja;({tv`%$fHE z?tOX78ahQe0ps_|L{I*e;6F7@hFqGaL7xP?=l6P0+H?+Wq4n6&F@za;0R#*~0^_{LXH3JiZhR)a z3u>01$wy8=f3Rs;0k$?D#jU|XR4y)nPJ$R1=RH1S8o2O~d?v?)Q;;}8JRwk5F&Afc zu0o9Pd9(fSdA$-C=RH1S8m4vQ@AMn8N=@cLI5)w2zVPeDv#(9s=n1*Tj4&P-S%!_$4?{rxi7MMZhb@{F% z*!S8>T)7z`vjHpWyJc`C{a#skKSCRxMAX5Q%+g1%{qXQ5bezA2qzp~E0Fo#3W*MKY zQL_~Y^?9*v(-JhF7((e|v+#P=vMdo_g!|FBc>yNK55hqKLszBnZ7&vKaveM~^e=h` z?~sh;2z3o)DBxYYx9fUE=|Z#*+>+(>;>{=qZj7afsDh&8@mVtHR8CWeXjWjIG0n9| z9DP^rAU&J81~6}yQN3mn0-mnx$M;nDSb;p&c3kKP28@*H(nYZOM@=i}*w2dUtbk$% zCezLg`jJj1(s;2fdnZr2;P{?(tCYP*Pd&P1Arv!yw;5;SpHB{6QQz*olix8#82OD3F}Q;xtTLY^svd zINeh9&Mxs>rr$d-fR_HNsqV%DMorN}XxOp@(O71U;Lg}svlMkzix8*B=pG&EQ(smu zAbKQXreg!KCI}5}KmCQqSBf)Aal_YV(eTnTQYy1Xu-{`8Odeg4Q<6S?H&oq+QmKs9 zYPo6c>$)uWcUH`|+b_3r4R9H3otkWx0;=lVOEsDQS_)Swo$~Vx`;IR6WH)6Kn~78j zpKj$mlCkjm1O0d^bO>I$H9Q_ip5Y}h2sh;(pD_*7<~ow;xeN`-wg2Q0-h6pA6)WJ< z?I=w|hKvKoU)`{Zij0EK_xGTFOVN~krg4EPE0@#yt+^UYx3^(M*$Svc6YyIj+0_w& zKSyIY-E&6LxIJXbp;S%l98;O@*QU+*`P4ZowLwzAkia944B}RfKv@;kk8d + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer = new System.Windows.Forms.Timer(this.components); + this.textBox = new System.Windows.Forms.TextBox(); + this.clearButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // timer + // + this.timer.Enabled = true; + this.timer.Tick += new System.EventHandler(this.timer_Tick); + // + // textBox + // + this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBox.Enabled = false; + this.textBox.Location = new System.Drawing.Point(0, 0); + this.textBox.Name = "textBox"; + this.textBox.Size = new System.Drawing.Size(140, 20); + this.textBox.TabIndex = 0; + this.textBox.Enter += new System.EventHandler(this.textBox_Enter); + this.textBox.Leave += new System.EventHandler(this.textBox_Leave); + // + // clearButton + // + this.clearButton.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.clearButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; + this.clearButton.Location = new System.Drawing.Point(142, 0); + this.clearButton.Name = "clearButton"; + this.clearButton.Size = new System.Drawing.Size(20, 20); + this.clearButton.TabIndex = 1; + this.clearButton.UseVisualStyleBackColor = true; + this.clearButton.Click += new System.EventHandler(this.clearButton_Click); + // + // HotkeyBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.clearButton); + this.Controls.Add(this.textBox); + this.Name = "HotkeyBox"; + this.Size = new System.Drawing.Size(162, 20); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Timer timer; + private System.Windows.Forms.TextBox textBox; + private System.Windows.Forms.Button clearButton; + } +} diff --git a/UI/HotkeyBox.cs b/UI/HotkeyBox.cs new file mode 100644 index 00000000..88a40d04 --- /dev/null +++ b/UI/HotkeyBox.cs @@ -0,0 +1,79 @@ +using System; +using System.ComponentModel; +using System.Linq; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using ReClassNET.Input; + +namespace ReClassNET.UI +{ + [Designer(typeof(HotkeyBoxDesigner))] + public partial class HotkeyBox : UserControl + { + public KeyboardInput Input { get; set; } + + public KeyboardHotkey Hotkey { get; } = new KeyboardHotkey(); + + public HotkeyBox() + { + InitializeComponent(); + + DisplayHotkey(); + } + + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, width, 20, specified); + } + + private void textBox_Enter(object sender, EventArgs e) + { + timer.Enabled = true; + } + + private void textBox_Leave(object sender, EventArgs e) + { + timer.Enabled = false; + } + + private void timer_Tick(object sender, EventArgs e) + { + if (Input == null) + { + return; + } + + var keys = Input.GetPressedKeys(); + if (keys.Length != 0) + { + foreach (var key in keys.Select(k => k & Keys.KeyCode).Where(k => k != Keys.None)) + { + Hotkey.AddKey(key); + } + DisplayHotkey(); + } + } + + private void clearButton_Click(object sender, EventArgs e) + { + Hotkey.Clear(); + + DisplayHotkey(); + } + + private void DisplayHotkey() + { + textBox.Text = Hotkey.ToString(); + } + } + + internal class HotkeyBoxDesigner : ControlDesigner + { + private HotkeyBoxDesigner() + { + AutoResizeHandles = true; + } + + public override SelectionRules SelectionRules => SelectionRules.LeftSizeable | SelectionRules.RightSizeable | SelectionRules.Moveable; + } +} diff --git a/UI/HotkeyBox.resx b/UI/HotkeyBox.resx new file mode 100644 index 00000000..e22c5ac6 --- /dev/null +++ b/UI/HotkeyBox.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file From 9ba17c54cb3e84ccf9d7c8095f5ec5ae4496350e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 7 Oct 2017 00:32:12 +0200 Subject: [PATCH 134/777] Fixed loading of older files. Should be removed in the future. --- DataExchange/ReClass/ReClassNetFile.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/DataExchange/ReClass/ReClassNetFile.cs b/DataExchange/ReClass/ReClassNetFile.cs index 29732c2a..1fbed43f 100644 --- a/DataExchange/ReClass/ReClassNetFile.cs +++ b/DataExchange/ReClass/ReClassNetFile.cs @@ -43,6 +43,17 @@ public ReClassNetFile(ReClassNetProject project) this.project = project; } + static ReClassNetFile() + { + // Obsolete: The name of the class was changed. Because of this older files can't load this nodes. + buildInStringToTypeMap["UTF8TextNode"] = typeof(Utf8TextNode); + buildInStringToTypeMap["UTF8TextPtrNode"] = typeof(Utf8TextPtrNode); + buildInStringToTypeMap["UTF16TextNode"] = typeof(Utf16TextNode); + buildInStringToTypeMap["UTF16TextPtrNode"] = typeof(Utf16TextPtrNode); + buildInStringToTypeMap["UTF32TextNode"] = typeof(Utf32TextNode); + buildInStringToTypeMap["UTF32TextPtrNode"] = typeof(Utf32TextPtrNode); + } + private static readonly Dictionary buildInStringToTypeMap = new[] { typeof(BoolNode), From f2496e8b7bd5c0fe14d1df92e863de02089abdb7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 7 Oct 2017 23:56:44 +0200 Subject: [PATCH 135/777] Use expression. --- Nodes/BaseNode.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Nodes/BaseNode.cs b/Nodes/BaseNode.cs index 448705fa..28a27377 100644 --- a/Nodes/BaseNode.cs +++ b/Nodes/BaseNode.cs @@ -31,10 +31,10 @@ public abstract class BaseNode public IntPtr Offset { get; set; } /// Gets or sets the name of the node. If a new name was set the property changed event gets fired. - public virtual string Name { get { return name; } set { if (value != null && name != value) { name = value; NameChanged?.Invoke(this); } } } + public virtual string Name { get => name; set { if (value != null && name != value) { name = value; NameChanged?.Invoke(this); } } } /// Gets or sets the comment of the node. - public string Comment { get { return comment; } set { if (value != null && comment != value) { comment = value; CommentChanged?.Invoke(this); } } } + public string Comment { get => comment; set { if (value != null && comment != value) { comment = value; CommentChanged?.Invoke(this); } } } /// Gets or sets the parent node. public BaseContainerNode ParentNode { get; internal set; } @@ -51,7 +51,7 @@ public abstract class BaseNode public event NodeEventHandler NameChanged; public event NodeEventHandler CommentChanged; - protected GrowingList levelsOpen = new GrowingList(false); + protected readonly GrowingList levelsOpen = new GrowingList(false); [ContractInvariantMethod] private void ObjectInvariants() From 1f59374c620f4e6a4ca98bfe5347f33fa52e2954 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 7 Oct 2017 23:57:49 +0200 Subject: [PATCH 136/777] Fixed missing last result. --- MemoryScanner/ScannerWorker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MemoryScanner/ScannerWorker.cs b/MemoryScanner/ScannerWorker.cs index a841ab61..e6cd6ee4 100644 --- a/MemoryScanner/ScannerWorker.cs +++ b/MemoryScanner/ScannerWorker.cs @@ -60,7 +60,7 @@ public IEnumerable Search(byte[] data, int count, IEnumerable Date: Sun, 8 Oct 2017 21:13:33 +0200 Subject: [PATCH 137/777] Removed line. --- NativeCore/Windows/Input.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 14d05f9d..8409d210 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -32,8 +32,7 @@ class DirectInput } if (directInputInterface->CreateDevice(GUID_SysKeyboard, &keyboardDevice, nullptr) != DI_OK - || keyboardDevice->SetDataFormat(&c_dfDIKeyboard) != DI_OK - /*|| keyboardDevice->SetCooperativeLevel(target, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE) != DI_OK*/) + || keyboardDevice->SetDataFormat(&c_dfDIKeyboard) != DI_OK) { return false; } From 2fc7d0136afa817d7e56de6980ef7dc1fbfea822 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 21:14:03 +0200 Subject: [PATCH 138/777] Added Clear method. Changed timer interval. --- UI/HotkeyBox.Designer.cs | 1 + UI/HotkeyBox.cs | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/UI/HotkeyBox.Designer.cs b/UI/HotkeyBox.Designer.cs index 425e20e1..5654a7d5 100644 --- a/UI/HotkeyBox.Designer.cs +++ b/UI/HotkeyBox.Designer.cs @@ -37,6 +37,7 @@ private void InitializeComponent() // timer // this.timer.Enabled = true; + this.timer.Interval = 50; this.timer.Tick += new System.EventHandler(this.timer_Tick); // // textBox diff --git a/UI/HotkeyBox.cs b/UI/HotkeyBox.cs index 88a40d04..8a5d1747 100644 --- a/UI/HotkeyBox.cs +++ b/UI/HotkeyBox.cs @@ -56,15 +56,20 @@ private void timer_Tick(object sender, EventArgs e) private void clearButton_Click(object sender, EventArgs e) { - Hotkey.Clear(); - - DisplayHotkey(); + Clear(); } private void DisplayHotkey() { textBox.Text = Hotkey.ToString(); } + + public void Clear() + { + Hotkey.Clear(); + + DisplayHotkey(); + } } internal class HotkeyBoxDesigner : ControlDesigner From 7bfccd28a370781b7815e9cde0e7d09da51dbdff Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 21:19:34 +0200 Subject: [PATCH 139/777] Changed how the scanner reacts to input. --- Forms/InputCorrelatorForm.Designer.cs | 9 ++--- Forms/InputCorrelatorForm.cs | 48 +++++++++++++------------ Forms/InputCorrelatorForm.resx | 2 +- MemoryScanner/InputCorrelatedScanner.cs | 28 ++++++++++++--- 4 files changed, 56 insertions(+), 31 deletions(-) diff --git a/Forms/InputCorrelatorForm.Designer.cs b/Forms/InputCorrelatorForm.Designer.cs index 8c5e7014..a66ed6be 100644 --- a/Forms/InputCorrelatorForm.Designer.cs +++ b/Forms/InputCorrelatorForm.Designer.cs @@ -29,7 +29,7 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - this.rescanTimer = new System.Windows.Forms.Timer(this.components); + this.refineTimer = new System.Windows.Forms.Timer(this.components); this.bannerBox = new ReClassNET.UI.BannerBox(); this.settingsGroupBox = new System.Windows.Forms.GroupBox(); this.removeButton = new System.Windows.Forms.Button(); @@ -44,9 +44,10 @@ private void InitializeComponent() this.settingsGroupBox.SuspendLayout(); this.SuspendLayout(); // - // rescanTimer + // refineTimer // - this.rescanTimer.Tick += new System.EventHandler(this.timer_Tick); + this.refineTimer.Interval = 50; + this.refineTimer.Tick += new System.EventHandler(this.refineTimer_Tick); // // bannerBox // @@ -180,7 +181,7 @@ private void InitializeComponent() } #endregion - private System.Windows.Forms.Timer rescanTimer; + private System.Windows.Forms.Timer refineTimer; private UI.BannerBox bannerBox; private System.Windows.Forms.GroupBox settingsGroupBox; private UI.HotkeyBox hotkeyBox; diff --git a/Forms/InputCorrelatorForm.cs b/Forms/InputCorrelatorForm.cs index 1f2f1491..a22e4320 100644 --- a/Forms/InputCorrelatorForm.cs +++ b/Forms/InputCorrelatorForm.cs @@ -1,28 +1,25 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Diagnostics.Contracts; -using System.Drawing; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.Input; using ReClassNET.MemoryScanner; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Forms { public partial class InputCorrelatorForm : IconForm { + private static readonly TimeSpan refineInterval = TimeSpan.FromMilliseconds(400); + private readonly ScannerForm scannerForm; private readonly KeyboardInput input; private InputCorrelatedScanner scanner; private bool isScanning = false; + private DateTime lastRefineTime; public InputCorrelatorForm(ScannerForm sf) { @@ -46,8 +43,6 @@ public InputCorrelatorForm(ScannerForm sf) hotkeyBox.Input = input; - rescanTimer.Interval = 400; - infoLabel.Text = string.Empty; } @@ -60,6 +55,8 @@ private void addButton_Click(object sender, EventArgs e) } hotkeyListBox.Items.Add(hotkey); + + hotkeyBox.Clear(); } private void removeButton_Click(object sender, EventArgs e) @@ -73,34 +70,41 @@ private void removeButton_Click(object sender, EventArgs e) hotkeyListBox.Items.RemoveAt(index); } - private async void timer_Tick(object sender, EventArgs e) + private async void refineTimer_Tick(object sender, EventArgs e) { if (isScanning) { return; } - isScanning = true; + scanner.CorrelateInput(); - try + if (lastRefineTime + refineInterval < DateTime.Now) { - await scanner.CorrelateInput(CancellationToken.None, null); + isScanning = true; - infoLabel.Text = $"Scan Count: {scanner.ScanCount} Possible Values: {scanner.TotalResultCount}"; - } - catch (Exception ex) - { - Program.ShowException(ex); - } + try + { + await scanner.RefineResults(CancellationToken.None, null); - isScanning = false; + infoLabel.Text = $"Scan Count: {scanner.ScanCount} Possible Values: {scanner.TotalResultCount}"; + } + catch (Exception ex) + { + Program.ShowException(ex); + } + + isScanning = false; + + lastRefineTime = DateTime.Now; + } } private async void InputCorrelatorForm_FormClosing(object sender, FormClosingEventArgs e) { hotkeyBox.Input = null; - rescanTimer.Enabled = false; + refineTimer.Enabled = false; if (isScanning) { @@ -146,7 +150,7 @@ private async void startStopButton_Click(object sender, EventArgs e) startStopButton.Text = "Stop Scan"; - rescanTimer.Enabled = true; + refineTimer.Enabled = true; return; } @@ -157,7 +161,7 @@ private async void startStopButton_Click(object sender, EventArgs e) } else { - rescanTimer.Enabled = false; + refineTimer.Enabled = false; startStopButton.Text = "Start Scan"; diff --git a/Forms/InputCorrelatorForm.resx b/Forms/InputCorrelatorForm.resx index f49b5ee5..4c5d0a61 100644 --- a/Forms/InputCorrelatorForm.resx +++ b/Forms/InputCorrelatorForm.resx @@ -117,7 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 \ No newline at end of file diff --git a/MemoryScanner/InputCorrelatedScanner.cs b/MemoryScanner/InputCorrelatedScanner.cs index 2ccca385..20deed2e 100644 --- a/MemoryScanner/InputCorrelatedScanner.cs +++ b/MemoryScanner/InputCorrelatedScanner.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -68,14 +67,35 @@ public Task Initialize() return Search(CreateScanComparer(ScanCompareType.Unknown), CancellationToken.None, null); } - public async Task CorrelateInput(CancellationToken ct, IProgress progress) + private bool shouldHaveChangedSinceLastScan = false; + + public void CorrelateInput() + { + if (!shouldHaveChangedSinceLastScan) + { + var keys = input.GetPressedKeys().Select(k => k & Keys.KeyCode).Where(k => k != Keys.None).ToArray(); + + if (keys.Length != 0 && hotkeys.Any(h => h.Matches(keys))) + { + shouldHaveChangedSinceLastScan = true; + } + } + } + + public async Task RefineResults(CancellationToken ct, IProgress progress) { - var keys = input.GetPressedKeys().Select(k => k & Keys.KeyCode).Where(k => k != Keys.None).ToArray(); + var compareType = shouldHaveChangedSinceLastScan ? ScanCompareType.Changed : ScanCompareType.NotChanged; - var compareType = keys.Length != 0 && hotkeys.Any(h => h.Matches(keys)) ? ScanCompareType.Changed : ScanCompareType.NotChanged; + if (compareType == ScanCompareType.Changed) + { + // If the value should have changed, we give the target some time to react to the pressed key. + await Task.Delay(TimeSpan.FromMilliseconds(200), ct); + } await Search(CreateScanComparer(compareType), ct, progress); + shouldHaveChangedSinceLastScan = false; + ScanCount++; } } From 577c48782ca846cfce747c4e813f58bc89e0176d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 21:26:21 +0200 Subject: [PATCH 140/777] Added region. --- Forms/InputCorrelatorForm.cs | 110 ++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/Forms/InputCorrelatorForm.cs b/Forms/InputCorrelatorForm.cs index a22e4320..f2682a17 100644 --- a/Forms/InputCorrelatorForm.cs +++ b/Forms/InputCorrelatorForm.cs @@ -46,59 +46,7 @@ public InputCorrelatorForm(ScannerForm sf) infoLabel.Text = string.Empty; } - private void addButton_Click(object sender, EventArgs e) - { - var hotkey = hotkeyBox.Hotkey.Clone(); - if (hotkey.IsEmpty) - { - return; - } - - hotkeyListBox.Items.Add(hotkey); - - hotkeyBox.Clear(); - } - - private void removeButton_Click(object sender, EventArgs e) - { - var index = hotkeyListBox.SelectedIndex; - if (index < 0) - { - return; - } - - hotkeyListBox.Items.RemoveAt(index); - } - - private async void refineTimer_Tick(object sender, EventArgs e) - { - if (isScanning) - { - return; - } - - scanner.CorrelateInput(); - - if (lastRefineTime + refineInterval < DateTime.Now) - { - isScanning = true; - - try - { - await scanner.RefineResults(CancellationToken.None, null); - - infoLabel.Text = $"Scan Count: {scanner.ScanCount} Possible Values: {scanner.TotalResultCount}"; - } - catch (Exception ex) - { - Program.ShowException(ex); - } - - isScanning = false; - - lastRefineTime = DateTime.Now; - } - } + #region Event Handler private async void InputCorrelatorForm_FormClosing(object sender, FormClosingEventArgs e) { @@ -124,6 +72,30 @@ private async void InputCorrelatorForm_FormClosing(object sender, FormClosingEve input?.Dispose(); } + private void addButton_Click(object sender, EventArgs e) + { + var hotkey = hotkeyBox.Hotkey.Clone(); + if (hotkey.IsEmpty) + { + return; + } + + hotkeyListBox.Items.Add(hotkey); + + hotkeyBox.Clear(); + } + + private void removeButton_Click(object sender, EventArgs e) + { + var index = hotkeyListBox.SelectedIndex; + if (index < 0) + { + return; + } + + hotkeyListBox.Items.RemoveAt(index); + } + private async void startStopButton_Click(object sender, EventArgs e) { if (scanner == null) @@ -178,5 +150,37 @@ private async void startStopButton_Click(object sender, EventArgs e) settingsGroupBox.Enabled = true; } + + private async void refineTimer_Tick(object sender, EventArgs e) + { + if (isScanning) + { + return; + } + + scanner.CorrelateInput(); + + if (lastRefineTime + refineInterval < DateTime.Now) + { + isScanning = true; + + try + { + await scanner.RefineResults(CancellationToken.None, null); + + infoLabel.Text = $"Scan Count: {scanner.ScanCount} Possible Values: {scanner.TotalResultCount}"; + } + catch (Exception ex) + { + Program.ShowException(ex); + } + + isScanning = false; + + lastRefineTime = DateTime.Now; + } + } + + #endregion } } From 94d99079ff77a9241057da9a8da3d2c090303478 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 21:34:33 +0200 Subject: [PATCH 141/777] Changed contract class name. --- CodeGenerator/ICodeGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeGenerator/ICodeGenerator.cs b/CodeGenerator/ICodeGenerator.cs index 9cd6ade1..525cb744 100644 --- a/CodeGenerator/ICodeGenerator.cs +++ b/CodeGenerator/ICodeGenerator.cs @@ -6,7 +6,7 @@ namespace ReClassNET.CodeGenerator { - [ContractClass(typeof(ICodeGeneratorContract))] + [ContractClass(typeof(CodeGeneratorContract))] public interface ICodeGenerator { /// The language this generator produces. @@ -20,7 +20,7 @@ public interface ICodeGenerator } [ContractClassFor(typeof(ICodeGenerator))] - internal abstract class ICodeGeneratorContract : ICodeGenerator + internal abstract class CodeGeneratorContract : ICodeGenerator { public Language Language => throw new NotImplementedException(); From f394a0f6e8e4d39567d8c8fad8930e787a74f025 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 22:53:41 +0200 Subject: [PATCH 142/777] Added show class node code. --- Forms/MainForm.cs | 2 +- UI/ClassNodeView.Designer.cs | 33 ++++++++++++++++----- UI/ClassNodeView.cs | 17 +++++++---- UI/LinkedWindowFeatures.cs | 17 +++++++++++ UI/MemoryViewControl.Designer.cs | 49 ++++++++++++++++++++++---------- UI/MemoryViewControl.cs | 10 +++++++ 6 files changed, 99 insertions(+), 29 deletions(-) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 5dcaa79f..b0ab7e04 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -601,7 +601,7 @@ private void ShowCodeForm(ICodeGenerator generator) { Contract.Requires(generator != null); - new CodeForm(generator, currentProject.Classes, Program.Logger).Show(); + LinkedWindowFeatures.ShowCodeGeneratorForm(currentProject.Classes, generator); } /// Opens the and calls with the result. diff --git a/UI/ClassNodeView.Designer.cs b/UI/ClassNodeView.Designer.cs index 7c9d49bb..9290e5ad 100644 --- a/UI/ClassNodeView.Designer.cs +++ b/UI/ClassNodeView.Designer.cs @@ -35,6 +35,8 @@ private void InitializeComponent() this.deleteClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.removeUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.rootContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.enableHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.autoExpandHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -68,15 +70,17 @@ private void InitializeComponent() this.renameClassToolStripMenuItem, this.deleteClassToolStripMenuItem, this.toolStripSeparator1, - this.removeUnusedClassesToolStripMenuItem}); + this.removeUnusedClassesToolStripMenuItem, + this.toolStripSeparator4, + this.showCodeOfClassToolStripMenuItem}); this.classContextMenuStrip.Name = "contextMenuStrip"; - this.classContextMenuStrip.Size = new System.Drawing.Size(199, 76); + this.classContextMenuStrip.Size = new System.Drawing.Size(206, 104); // // renameClassToolStripMenuItem // this.renameClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Textfield_Rename; this.renameClassToolStripMenuItem.Name = "renameClassToolStripMenuItem"; - this.renameClassToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.renameClassToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.renameClassToolStripMenuItem.Text = "Rename class"; this.renameClassToolStripMenuItem.Click += new System.EventHandler(this.renameClassToolStripMenuItem_Click); // @@ -84,23 +88,36 @@ private void InitializeComponent() // this.deleteClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Remove; this.deleteClassToolStripMenuItem.Name = "deleteClassToolStripMenuItem"; - this.deleteClassToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.deleteClassToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.deleteClassToolStripMenuItem.Text = "Delete class"; this.deleteClassToolStripMenuItem.Click += new System.EventHandler(this.deleteClassToolStripMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(195, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(202, 6); // // removeUnusedClassesToolStripMenuItem // this.removeUnusedClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; this.removeUnusedClassesToolStripMenuItem.Name = "removeUnusedClassesToolStripMenuItem"; - this.removeUnusedClassesToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.removeUnusedClassesToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.removeUnusedClassesToolStripMenuItem.Text = "Remove unused classes"; this.removeUnusedClassesToolStripMenuItem.Click += new System.EventHandler(this.removeUnusedClassesToolStripMenuItem_Click); // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(202, 6); + // + // showCodeOfClassToolStripMenuItem + // + this.showCodeOfClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; + this.showCodeOfClassToolStripMenuItem.Name = "showCodeOfClassToolStripMenuItem"; + this.showCodeOfClassToolStripMenuItem.Size = new System.Drawing.Size(205, 22); + this.showCodeOfClassToolStripMenuItem.Text = "Show C++ Code of Class"; + this.showCodeOfClassToolStripMenuItem.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem_Click); + // // rootContextMenuStrip // this.rootContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -112,7 +129,7 @@ private void InitializeComponent() this.toolStripSeparator3, this.addNewClassToolStripMenuItem}); this.rootContextMenuStrip.Name = "rootContextMenuStrip"; - this.rootContextMenuStrip.Size = new System.Drawing.Size(221, 148); + this.rootContextMenuStrip.Size = new System.Drawing.Size(221, 126); // // enableHierarchyViewToolStripMenuItem // @@ -192,5 +209,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem enableHierarchyViewToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripMenuItem addNewClassToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; } } diff --git a/UI/ClassNodeView.cs b/UI/ClassNodeView.cs index 73f074be..b45433ca 100644 --- a/UI/ClassNodeView.cs +++ b/UI/ClassNodeView.cs @@ -212,8 +212,7 @@ private void classesTreeView_AfterSelect(object sender, TreeViewEventArgs e) return; } - var node = e.Node as ClassTreeNode; - if (node == null) + if (!(e.Node is ClassTreeNode node)) { return; } @@ -253,8 +252,7 @@ private void removeUnusedClassesToolStripMenuItem_Click(object sender, EventArgs private void deleteClassToolStripMenuItem_Click(object sender, EventArgs e) { - var treeNode = classesTreeView.SelectedNode as ClassTreeNode; - if (treeNode != null) + if (classesTreeView.SelectedNode is ClassTreeNode treeNode) { try { @@ -277,8 +275,7 @@ private void classesTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArg { if (!string.IsNullOrEmpty(e.Label)) { - var node = e.Node as ClassTreeNode; - if (node != null) + if (e.Node is ClassTreeNode node) { node.ClassNode.Name = e.Label; @@ -333,6 +330,14 @@ private void addNewClassToolStripMenuItem_Click(object sender, EventArgs e) LinkedWindowFeatures.CreateDefaultClass(); } + private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) + { + if (classesTreeView.SelectedNode is ClassTreeNode node) + { + LinkedWindowFeatures.ShowCodeGeneratorForm(node.ClassNode.Yield()); + } + } + #endregion /// Adds the class to the view. diff --git a/UI/LinkedWindowFeatures.cs b/UI/LinkedWindowFeatures.cs index 40c42656..8d4c26d8 100644 --- a/UI/LinkedWindowFeatures.cs +++ b/UI/LinkedWindowFeatures.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; +using ReClassNET.CodeGenerator; using ReClassNET.Debugger; using ReClassNET.Forms; using ReClassNET.MemoryScanner; @@ -129,5 +131,20 @@ public static void StartMemoryScan(IScanComparer comparer) sf.ExcuteScan(settings, comparer); } + + public static void ShowCodeGeneratorForm(IEnumerable classes) + { + Contract.Requires(classes != null); + + ShowCodeGeneratorForm(classes, new CppCodeGenerator()); + } + + public static void ShowCodeGeneratorForm(IEnumerable classes, ICodeGenerator generator) + { + Contract.Requires(classes != null); + Contract.Requires(generator != null); + + new CodeForm(generator, classes, Program.Logger).Show(); + } } } diff --git a/UI/MemoryViewControl.Designer.cs b/UI/MemoryViewControl.Designer.cs index 547d01fa..54babb78 100644 --- a/UI/MemoryViewControl.Designer.cs +++ b/UI/MemoryViewControl.Designer.cs @@ -94,6 +94,8 @@ private void InitializeComponent() this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.dissectNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.searchForEqualValuesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); this.findOutWhatAccessesThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); @@ -102,11 +104,11 @@ private void InitializeComponent() this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.repaintTimer = new System.Windows.Forms.Timer(this.components); this.editBox = new ReClassNET.UI.HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.searchForEqualValuesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -130,9 +132,11 @@ private void InitializeComponent() this.pasteNodesToolStripMenuItem, this.removeToolStripMenuItem, this.toolStripSeparator12, - this.copyAddressToolStripMenuItem}); + this.copyAddressToolStripMenuItem, + this.toolStripSeparator16, + this.showCodeOfClassToolStripMenuItem}); this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 326); + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 354); this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); // // changeTypeToolStripMenuItem @@ -714,6 +718,19 @@ private void InitializeComponent() this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(266, 6); // + // searchForEqualValuesToolStripMenuItem + // + this.searchForEqualValuesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.searchForEqualValuesToolStripMenuItem.Name = "searchForEqualValuesToolStripMenuItem"; + this.searchForEqualValuesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.searchForEqualValuesToolStripMenuItem.Text = "Search for equal values..."; + this.searchForEqualValuesToolStripMenuItem.Click += new System.EventHandler(this.searchForEqualValuesToolStripMenuItem_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(266, 6); + // // findOutWhatAccessesThisAddressToolStripMenuItem // this.findOutWhatAccessesThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Access; @@ -772,6 +789,14 @@ private void InitializeComponent() this.copyAddressToolStripMenuItem.Text = "Copy Address"; this.copyAddressToolStripMenuItem.Click += new System.EventHandler(this.copyAddressToolStripMenuItem_Click); // + // showCodeOfClassToolStripMenuItem + // + this.showCodeOfClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; + this.showCodeOfClassToolStripMenuItem.Name = "showCodeOfClassToolStripMenuItem"; + this.showCodeOfClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.showCodeOfClassToolStripMenuItem.Text = "Show C++ Code of Class"; + this.showCodeOfClassToolStripMenuItem.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem_Click); + // // repaintTimer // this.repaintTimer.Enabled = true; @@ -794,18 +819,10 @@ private void InitializeComponent() // this.nodeInfoToolTip.ShowAlways = true; // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(266, 6); + // toolStripSeparator16 // - // searchForEqualValuesToolStripMenuItem - // - this.searchForEqualValuesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.searchForEqualValuesToolStripMenuItem.Name = "searchForEqualValuesToolStripMenuItem"; - this.searchForEqualValuesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.searchForEqualValuesToolStripMenuItem.Text = "Search for equal values..."; - this.searchForEqualValuesToolStripMenuItem.Click += new System.EventHandler(this.searchForEqualValuesToolStripMenuItem_Click); + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(266, 6); // // MemoryViewControl // @@ -899,5 +916,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripMenuItem searchForEqualValuesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; } } diff --git a/UI/MemoryViewControl.cs b/UI/MemoryViewControl.cs index 5355f7e7..4303ad2c 100644 --- a/UI/MemoryViewControl.cs +++ b/UI/MemoryViewControl.cs @@ -795,6 +795,8 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs removeToolStripMenuItem.Enabled = !nodeIsClass; copyAddressToolStripMenuItem.Enabled = !nodeIsClass; + + showCodeOfClassToolStripMenuItem.Enabled = nodeIsClass; } private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) @@ -1214,5 +1216,13 @@ private void FindWhatInteractsWithSelectedNode(bool writeOnly) LinkedWindowFeatures.FindWhatInteractsWithAddress(selectedNode.Address, selectedNode.Node.MemorySize, writeOnly); } + + private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) + { + if (selectedNodes.FirstOrDefault()?.Node is ClassNode node) + { + LinkedWindowFeatures.ShowCodeGeneratorForm(node.Yield()); + } + } } } From 5810a1ec146c22cfc73e43db85586cfbf4887d6a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 8 Oct 2017 23:18:48 +0200 Subject: [PATCH 143/777] Updated readme. --- README.md | 6 ++++++ ReClass.NET.csproj | 1 + 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 09c22bf8..e7138b32 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ This is a port of ReClass to the .NET platform with additional features. - Control the remote process: start / stop / kill - Process Selection Dialog with filtering - Memory Viewer +- Memory Scanner + - Scan for values correlated to your input - Class address calculator - Code Generator (C++ / C#) - Module / Section Dumper @@ -46,6 +48,7 @@ This is a port of ReClass to the .NET platform with additional features. - [Frostbite Plugin](https://github.com/KN4CK3R/ReClass.NET-FrostbitePlugin) - [MemoryPipe Plugin](https://github.com/KN4CK3R/ReClass.NET-MemoryPipePlugin) - [LoadBinary Plugin](https://github.com/KN4CK3R/ReClass.NET-LoadBinaryPlugin) +- [Handle Abuser Plugin](https://github.com/KN4CK3R/ReClass.NET-HandleAbuser) To install a plugin just copy it in the "Plugins" folder. If you want to develop your own plugin just learn from the code of the [Sample Plugins](https://github.com/KN4CK3R/ReClass.NET-SamplePlugin) and [Frostbite Plugin](https://github.com/KN4CK3R/ReClass.NET-FrostbitePlugin) repositories. If you have developed a nice plugin, leave me a message and I will add it to the list above. @@ -80,6 +83,9 @@ Process Selection Memory Viewer ![](https://abload.de/img/memoryviewerb4y1s.jpg) +Memory Scanner +![](https://abload.de/img/scannerytub1.jpg) + Pointer Preview ![](http://abload.de/img/memorypreview2gsfp.jpg) diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index a895f151..4f4d3917 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -531,6 +531,7 @@ + From 5c0d01cb2c77e81df69a4a324f7339e8276c230a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Oct 2017 17:29:32 +0200 Subject: [PATCH 144/777] Highlight changed values. --- MemoryScanner/MemoryRecord.cs | 25 +++++++++++-------------- UI/MemoryRecordList.cs | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/MemoryScanner/MemoryRecord.cs b/MemoryScanner/MemoryRecord.cs index 0d7d83fe..5047887f 100644 --- a/MemoryScanner/MemoryRecord.cs +++ b/MemoryScanner/MemoryRecord.cs @@ -52,7 +52,7 @@ public string ModuleName public string ValueStr { get; private set; } public string PreviousValueStr { get; } - public bool HasChangedSinceLastUpdate { get; private set; } + public bool HasChangedValue { get; private set; } public int ValueLength { get; set; } @@ -184,44 +184,41 @@ public void RefreshValue(RemoteProcess process) if (process.ReadRemoteMemoryIntoBuffer(RealAddress, ref buffer)) { - string newValueStr = null; switch (ValueType) { case ScanValueType.Byte: - newValueStr = FormatValue(buffer[0], ShowValueHexadecimal); + ValueStr = FormatValue(buffer[0], ShowValueHexadecimal); break; case ScanValueType.Short: - newValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Integer: - newValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Long: - newValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Float: - newValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); + ValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); break; case ScanValueType.Double: - newValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); + ValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); break; case ScanValueType.ArrayOfBytes: - newValueStr = FormatValue(buffer); + ValueStr = FormatValue(buffer); break; case ScanValueType.String: - newValueStr = FormatValue(Encoding.GetString(buffer)); + ValueStr = FormatValue(Encoding.GetString(buffer)); break; } - - HasChangedSinceLastUpdate = ValueStr != newValueStr; - - ValueStr = newValueStr; } else { ValueStr = "???"; } + HasChangedValue = ValueStr != PreviousValueStr; + NotifyPropertyChanged(nameof(ValueStr)); } diff --git a/UI/MemoryRecordList.cs b/UI/MemoryRecordList.cs index 4b45ca13..70961093 100644 --- a/UI/MemoryRecordList.cs +++ b/UI/MemoryRecordList.cs @@ -108,7 +108,7 @@ private void resultDataGridView_CellFormatting(object sender, DataGridViewCellFo else if (e.ColumnIndex == 3) // Value { var record = (MemoryRecord)resultDataGridView.Rows[e.RowIndex].DataBoundItem; - e.CellStyle.ForeColor = record.HasChangedSinceLastUpdate ? Color.Red : Color.Black; + e.CellStyle.ForeColor = record.HasChangedValue ? Color.Red : Color.Black; e.FormattingApplied = true; } } From 26941ca82bea5f8a0e7b06db8b39f49af067601b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Oct 2017 17:57:03 +0200 Subject: [PATCH 145/777] Update result count while scanning. --- Forms/ScannerForm.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 5d2e9b05..2d04ff01 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -190,7 +190,11 @@ private async void nextScanButton_Click(object sender, EventArgs e) { var comparer = CreateComparer(scanner.Settings); - var report = new Progress(i => scanProgressBar.Value = i); + var report = new Progress(i => + { + scanProgressBar.Value = i; + SetResultCount(scanner.TotalResultCount); + }); var completed = await scanner.Search(comparer, CancellationToken.None, report); if (completed) @@ -554,7 +558,11 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare { scanner = new Scanner(Program.RemoteProcess, settings); - var report = new Progress(i => scanProgressBar.Value = i); + var report = new Progress(i => + { + scanProgressBar.Value = i; + SetResultCount(scanner.TotalResultCount); + }); var completed = await scanner.Search(comparer, CancellationToken.None, report); if (completed) From 71372dd225fb5287fef68fa84054e1e1f9aa212b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Oct 2017 20:55:16 +0200 Subject: [PATCH 146/777] Fix compare type reset after scan. --- Forms/ScannerForm.Designer.cs | 28 ++++++------- Forms/ScannerForm.cs | 78 ++++++++++++++++++++--------------- Forms/ScannerForm.resx | 6 --- 3 files changed, 59 insertions(+), 53 deletions(-) diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index 99744b9c..a6bbd952 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -33,7 +33,7 @@ private void InitializeComponent() this.filterGroupBox = new System.Windows.Forms.GroupBox(); this.valueTypeComboBox = new System.Windows.Forms.ComboBox(); this.label3 = new System.Windows.Forms.Label(); - this.scanTypeComboBox = new System.Windows.Forms.ComboBox(); + this.compareTypeComboBox = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.isHexCheckBox = new System.Windows.Forms.CheckBox(); this.dualValueBox = new ReClassNET.UI.DualValueBox(); @@ -119,7 +119,7 @@ private void InitializeComponent() // this.filterGroupBox.Controls.Add(this.valueTypeComboBox); this.filterGroupBox.Controls.Add(this.label3); - this.filterGroupBox.Controls.Add(this.scanTypeComboBox); + this.filterGroupBox.Controls.Add(this.compareTypeComboBox); this.filterGroupBox.Controls.Add(this.label1); this.filterGroupBox.Controls.Add(this.isHexCheckBox); this.filterGroupBox.Controls.Add(this.dualValueBox); @@ -152,17 +152,17 @@ private void InitializeComponent() this.label3.TabIndex = 7; this.label3.Text = "Value Type:"; // - // scanTypeComboBox + // compareTypeComboBox // - this.scanTypeComboBox.DisplayMember = "Description"; - this.scanTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.scanTypeComboBox.FormattingEnabled = true; - this.scanTypeComboBox.Location = new System.Drawing.Point(72, 50); - this.scanTypeComboBox.Name = "scanTypeComboBox"; - this.scanTypeComboBox.Size = new System.Drawing.Size(224, 21); - this.scanTypeComboBox.TabIndex = 5; - this.scanTypeComboBox.ValueMember = "Value"; - this.scanTypeComboBox.SelectionChangeCommitted += new System.EventHandler(this.scanTypeComboBox_SelectionChangeCommitted); + this.compareTypeComboBox.DisplayMember = "Description"; + this.compareTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.compareTypeComboBox.FormattingEnabled = true; + this.compareTypeComboBox.Location = new System.Drawing.Point(72, 50); + this.compareTypeComboBox.Name = "compareTypeComboBox"; + this.compareTypeComboBox.Size = new System.Drawing.Size(224, 21); + this.compareTypeComboBox.TabIndex = 5; + this.compareTypeComboBox.ValueMember = "Value"; + this.compareTypeComboBox.SelectionChangeCommitted += new System.EventHandler(this.scanTypeComboBox_SelectionChangeCommitted); // // label1 // @@ -718,7 +718,7 @@ private void InitializeComponent() this.inputCorrelatorToolStripButton}); this.additionalToolStrip.Location = new System.Drawing.Point(0, 0); this.additionalToolStrip.Name = "additionalToolStrip"; - this.additionalToolStrip.Size = new System.Drawing.Size(50, 25); + this.additionalToolStrip.Size = new System.Drawing.Size(26, 25); this.additionalToolStrip.TabIndex = 0; // // inputCorrelatorToolStripButton @@ -781,7 +781,7 @@ private void InitializeComponent() private System.Windows.Forms.GroupBox filterGroupBox; private UI.DualValueBox dualValueBox; private System.Windows.Forms.CheckBox isHexCheckBox; - private System.Windows.Forms.ComboBox scanTypeComboBox; + private System.Windows.Forms.ComboBox compareTypeComboBox; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox valueTypeComboBox; private System.Windows.Forms.Label label3; diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index 2d04ff01..fb974ace 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -26,7 +26,7 @@ public partial class ScannerForm : IconForm private Scanner scanner; - private ScanCompareType SelectedCompareType => ((EnumDescriptionDisplay)scanTypeComboBox.SelectedItem).Value; + private ScanCompareType SelectedCompareType => ((EnumDescriptionDisplay)compareTypeComboBox.SelectedItem).Value; private ScanValueType SelectedValueType => ((EnumDescriptionDisplay)valueTypeComboBox.SelectedItem).Value; private string addressFilePath; @@ -115,36 +115,7 @@ private void updateValuesTimer_Tick(object sender, EventArgs e) private void scanTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) { - var enableHexCheckBox = true; - var enableValueBox = true; - var enableDualInput = false; - - switch (SelectedCompareType) - { - case ScanCompareType.Unknown: - enableHexCheckBox = false; - enableValueBox = false; - break; - case ScanCompareType.Between: - case ScanCompareType.BetweenOrEqual: - enableDualInput = true; - break; - } - - switch (SelectedValueType) - { - case ScanValueType.Float: - case ScanValueType.Double: - case ScanValueType.ArrayOfBytes: - case ScanValueType.String: - isHexCheckBox.Checked = false; - enableHexCheckBox = false; - break; - } - - isHexCheckBox.Enabled = enableHexCheckBox; - dualValueBox.Enabled = enableValueBox; - dualValueBox.ShowSecondInputField = enableDualInput; + OnCompareTypeChanged(); } private void valueTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -427,6 +398,43 @@ public void ShowScannerResults(Scanner scanner) ); } + /// + /// Set input elements according to the selected compare type. + /// + private void OnCompareTypeChanged() + { + var enableHexCheckBox = true; + var enableValueBox = true; + var enableDualInput = false; + + switch (SelectedCompareType) + { + case ScanCompareType.Unknown: + enableHexCheckBox = false; + enableValueBox = false; + break; + case ScanCompareType.Between: + case ScanCompareType.BetweenOrEqual: + enableDualInput = true; + break; + } + + switch (SelectedValueType) + { + case ScanValueType.Float: + case ScanValueType.Double: + case ScanValueType.ArrayOfBytes: + case ScanValueType.String: + isHexCheckBox.Checked = false; + enableHexCheckBox = false; + break; + } + + isHexCheckBox.Enabled = enableHexCheckBox; + dualValueBox.Enabled = enableValueBox; + dualValueBox.ShowSecondInputField = enableDualInput; + } + /// /// Hide gui elements after the value type has changed. /// @@ -477,20 +485,23 @@ private void OnValueTypeChanged() /// private void SetValidCompareTypes() { + var compareType = compareTypeComboBox.SelectedItem != null ? SelectedCompareType : ScanCompareType.Equal; var valueType = SelectedValueType; if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { - scanTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(ScanCompareType.Equal); + compareTypeComboBox.DataSource = EnumDescriptionDisplay.CreateExact(ScanCompareType.Equal); } else { - scanTypeComboBox.DataSource = isFirstScan + compareTypeComboBox.DataSource = isFirstScan ? EnumDescriptionDisplay.CreateExclude( ScanCompareType.Changed, ScanCompareType.NotChanged, ScanCompareType.Decreased, ScanCompareType.DecreasedOrEqual, ScanCompareType.Increased, ScanCompareType.IncreasedOrEqual ) : EnumDescriptionDisplay.CreateExclude(ScanCompareType.Unknown); } + + compareTypeComboBox.SelectedItem = compareTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == compareType); } /// @@ -579,6 +590,7 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare isFirstScan = false; SetValidCompareTypes(); + OnCompareTypeChanged(); } } finally diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index f2679c16..c9436557 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -129,12 +129,6 @@ 172, 6 - - 172, 6 - - - 304, 6 - 630, 8 From d8ba71e190db57631dd803868a297220938fcd47 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 14 Oct 2017 16:26:01 +0200 Subject: [PATCH 147/777] Added abbility to restore the previous scan results. --- Forms/ScannerForm.Designer.cs | 70 +++++------ Forms/ScannerForm.cs | 36 ++++-- Forms/ScannerForm.resx | 3 - MemoryScanner/ScanResult.cs | 42 +++++++ MemoryScanner/Scanner.cs | 120 +++++++++++++------ Properties/Resources.Designer.cs | 22 +++- Properties/Resources.resx | 6 + ReClass.NET.csproj | 10 ++ Resources/Images/B16x16_Redo.png | Bin 0 -> 708 bytes Resources/Images/B16x16_Undo.png | Bin 0 -> 707 bytes UI/IconButton.cs | 195 +++++++++++++++++++++++++++++++ Util/CircularBuffer.cs | 171 +++++++++++++++++++++++++++ Util/Extension.Linq.cs | 22 ++++ 13 files changed, 607 insertions(+), 90 deletions(-) create mode 100644 Resources/Images/B16x16_Redo.png create mode 100644 Resources/Images/B16x16_Undo.png create mode 100644 UI/IconButton.cs create mode 100644 Util/CircularBuffer.cs diff --git a/Forms/ScannerForm.Designer.cs b/Forms/ScannerForm.Designer.cs index a6bbd952..15faa96b 100644 --- a/Forms/ScannerForm.Designer.cs +++ b/Forms/ScannerForm.Designer.cs @@ -88,9 +88,8 @@ private void InitializeComponent() this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.toolStripPanel2 = new System.Windows.Forms.ToolStripPanel(); - this.additionalToolStrip = new System.Windows.Forms.ToolStrip(); - this.inputCorrelatorToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.undoIconButton = new ReClassNET.UI.IconButton(); + this.showInputCorrelatorIconButton = new ReClassNET.UI.IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -100,8 +99,6 @@ private void InitializeComponent() this.resultListContextMenuStrip.SuspendLayout(); this.toolStripPanel.SuspendLayout(); this.menuToolStrip.SuspendLayout(); - this.toolStripPanel2.SuspendLayout(); - this.additionalToolStrip.SuspendLayout(); this.SuspendLayout(); // // bannerBox @@ -700,43 +697,35 @@ private void InitializeComponent() // this.infoToolTip.AutomaticDelay = 100; // - // toolStripPanel2 - // - this.toolStripPanel2.Controls.Add(this.additionalToolStrip); - this.toolStripPanel2.Location = new System.Drawing.Point(580, 375); - this.toolStripPanel2.Name = "toolStripPanel2"; - this.toolStripPanel2.Orientation = System.Windows.Forms.Orientation.Horizontal; - this.toolStripPanel2.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.toolStripPanel2.RowMargin = new System.Windows.Forms.Padding(0); - this.toolStripPanel2.Size = new System.Drawing.Size(39, 25); - // - // additionalToolStrip - // - this.additionalToolStrip.Dock = System.Windows.Forms.DockStyle.None; - this.additionalToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.additionalToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.inputCorrelatorToolStripButton}); - this.additionalToolStrip.Location = new System.Drawing.Point(0, 0); - this.additionalToolStrip.Name = "additionalToolStrip"; - this.additionalToolStrip.Size = new System.Drawing.Size(26, 25); - this.additionalToolStrip.TabIndex = 0; - // - // inputCorrelatorToolStripButton - // - this.inputCorrelatorToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.inputCorrelatorToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Canvas_Size; - this.inputCorrelatorToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.inputCorrelatorToolStripButton.Name = "inputCorrelatorToolStripButton"; - this.inputCorrelatorToolStripButton.Size = new System.Drawing.Size(23, 22); - this.inputCorrelatorToolStripButton.ToolTipText = "Show Input Correlator..."; - this.inputCorrelatorToolStripButton.Click += new System.EventHandler(this.inputCorrelatorToolStripButton_Click); + // undoIconButton + // + this.undoIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Undo; + this.undoIconButton.Location = new System.Drawing.Point(256, 54); + this.undoIconButton.Name = "undoIconButton"; + this.undoIconButton.Pressed = false; + this.undoIconButton.Selected = false; + this.undoIconButton.Size = new System.Drawing.Size(23, 22); + this.undoIconButton.TabIndex = 18; + this.undoIconButton.Click += new System.EventHandler(this.undoIconButton_Click); + // + // showInputCorrelatorIconButton + // + this.showInputCorrelatorIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Canvas_Size; + this.showInputCorrelatorIconButton.Location = new System.Drawing.Point(580, 378); + this.showInputCorrelatorIconButton.Name = "showInputCorrelatorIconButton"; + this.showInputCorrelatorIconButton.Pressed = false; + this.showInputCorrelatorIconButton.Selected = false; + this.showInputCorrelatorIconButton.Size = new System.Drawing.Size(23, 22); + this.showInputCorrelatorIconButton.TabIndex = 19; + this.showInputCorrelatorIconButton.Click += new System.EventHandler(this.showInputCorrelatorIconButton_Click); // // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(612, 584); - this.Controls.Add(this.toolStripPanel2); + this.Controls.Add(this.showInputCorrelatorIconButton); + this.Controls.Add(this.undoIconButton); this.Controls.Add(this.toolStripPanel); this.Controls.Add(this.addressListMemoryRecordList); this.Controls.Add(this.resultMemoryRecordList); @@ -766,10 +755,6 @@ private void InitializeComponent() this.toolStripPanel.PerformLayout(); this.menuToolStrip.ResumeLayout(false); this.menuToolStrip.PerformLayout(); - this.toolStripPanel2.ResumeLayout(false); - this.toolStripPanel2.PerformLayout(); - this.additionalToolStrip.ResumeLayout(false); - this.additionalToolStrip.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -836,8 +821,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem valueToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; - private System.Windows.Forms.ToolStripPanel toolStripPanel2; - private System.Windows.Forms.ToolStrip additionalToolStrip; - private System.Windows.Forms.ToolStripButton inputCorrelatorToolStripButton; + private UI.IconButton undoIconButton; + private UI.IconButton showInputCorrelatorIconButton; } } \ No newline at end of file diff --git a/Forms/ScannerForm.cs b/Forms/ScannerForm.cs index fb974ace..6d798968 100644 --- a/Forms/ScannerForm.cs +++ b/Forms/ScannerForm.cs @@ -26,8 +26,8 @@ public partial class ScannerForm : IconForm private Scanner scanner; - private ScanCompareType SelectedCompareType => ((EnumDescriptionDisplay)compareTypeComboBox.SelectedItem).Value; - private ScanValueType SelectedValueType => ((EnumDescriptionDisplay)valueTypeComboBox.SelectedItem).Value; + private ScanCompareType SelectedCompareType => ((EnumDescriptionDisplay)compareTypeComboBox.SelectedItem)?.Value ?? default(ScanCompareType); + private ScanValueType SelectedValueType => ((EnumDescriptionDisplay)valueTypeComboBox.SelectedItem)?.Value ?? default(ScanValueType); private string addressFilePath; @@ -35,9 +35,8 @@ public ScannerForm() { InitializeComponent(); - toolStripPanel.RenderMode = toolStripPanel2.RenderMode = ToolStripRenderMode.Professional; - toolStripPanel.Renderer = toolStripPanel2.Renderer = new CustomToolStripProfessionalRenderer(true, false); - menuToolStrip.Renderer = additionalToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); + toolStripPanel.Renderer = new CustomToolStripProfessionalRenderer(true, false); + menuToolStrip.Renderer = new CustomToolStripProfessionalRenderer(false, false); valueTypeComboBox.DataSource = EnumDescriptionDisplay.Create(); @@ -171,6 +170,8 @@ private async void nextScanButton_Click(object sender, EventArgs e) if (completed) { ShowScannerResults(scanner); + + undoIconButton.Enabled = scanner.CanUndoLastScan; } } catch (Exception ex) @@ -291,7 +292,7 @@ private void clearAddressListToolStripButton_Click(object sender, EventArgs e) addressListMemoryRecordList.Clear(); } - private void inputCorrelatorToolStripButton_Click(object sender, EventArgs e) + private void showInputCorrelatorIconButton_Click(object sender, EventArgs e) { new InputCorrelatorForm(this).Show(); } @@ -365,6 +366,18 @@ private void copyAddressToolStripMenuItem_Click(object sender, EventArgs e) } } + private void undoIconButton_Click(object sender, EventArgs e) + { + if (scanner.CanUndoLastScan) + { + scanner.UndoLastScan(); + + ShowScannerResults(scanner); + } + + undoIconButton.Enabled = scanner.CanUndoLastScan; + } + #endregion /// @@ -485,7 +498,7 @@ private void OnValueTypeChanged() /// private void SetValidCompareTypes() { - var compareType = compareTypeComboBox.SelectedItem != null ? SelectedCompareType : ScanCompareType.Equal; + var compareType = SelectedCompareType; var valueType = SelectedValueType; if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) { @@ -501,7 +514,7 @@ private void SetValidCompareTypes() : EnumDescriptionDisplay.CreateExclude(ScanCompareType.Unknown); } - compareTypeComboBox.SelectedItem = compareTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == compareType); + compareTypeComboBox.SelectedItem = compareTypeComboBox.Items.Cast>().PredicateOrFirst(e => e.Value == compareType); } /// @@ -512,6 +525,8 @@ private void Reset() scanner?.Dispose(); scanner = null; + undoIconButton.Enabled = false; + SetResultCount(0); resultMemoryRecordList.Clear(); @@ -522,7 +537,7 @@ private void Reset() isHexCheckBox.Checked = false; valueTypeComboBox.Enabled = true; - //valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == ScanValueType.Integer); + //valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().PredicateOrFirst(e => e.Value == ScanValueType.Integer); OnValueTypeChanged(); floatingOptionsGroupBox.Enabled = true; @@ -530,6 +545,7 @@ private void Reset() scanOptionsGroupBox.Enabled = true; isFirstScan = true; + undoIconButton.Enabled = false; SetValidCompareTypes(); } @@ -655,7 +671,7 @@ private void SetGuiFromSettings(ScanSettings settings) { Contract.Requires(settings != null); - valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().FirstOrDefault(e => e.Value == settings.ValueType); + valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().PredicateOrFirst(e => e.Value == settings.ValueType); startAddressTextBox.Text = settings.StartAddress.ToString(Constants.StringHexFormat); stopAddressTextBox.Text = settings.StopAddress.ToString(Constants.StringHexFormat); diff --git a/Forms/ScannerForm.resx b/Forms/ScannerForm.resx index c9436557..a51fb480 100644 --- a/Forms/ScannerForm.resx +++ b/Forms/ScannerForm.resx @@ -129,9 +129,6 @@ 172, 6 - - 630, 8 - 42 diff --git a/MemoryScanner/ScanResult.cs b/MemoryScanner/ScanResult.cs index f793e4b3..cad1b337 100644 --- a/MemoryScanner/ScanResult.cs +++ b/MemoryScanner/ScanResult.cs @@ -9,6 +9,8 @@ public abstract class ScanResult public abstract ScanValueType ValueType { get; } public IntPtr Address { get; set; } + + public abstract ScanResult Clone(); } public class ByteScanResult : ScanResult @@ -21,6 +23,11 @@ public ByteScanResult(byte value) { Value = value; } + + public override ScanResult Clone() + { + return new ByteScanResult(Value) { Address = Address }; + } } public class ShortScanResult : ScanResult @@ -33,6 +40,11 @@ public ShortScanResult(short value) { Value = value; } + + public override ScanResult Clone() + { + return new ShortScanResult(Value) { Address = Address }; + } } public class IntegerScanResult : ScanResult @@ -45,6 +57,11 @@ public IntegerScanResult(int value) { Value = value; } + + public override ScanResult Clone() + { + return new IntegerScanResult(Value) { Address = Address }; + } } public class LongScanResult : ScanResult @@ -57,6 +74,11 @@ public LongScanResult(long value) { Value = value; } + + public override ScanResult Clone() + { + return new LongScanResult(Value) { Address = Address }; + } } public class FloatScanResult : ScanResult @@ -69,6 +91,11 @@ public FloatScanResult(float value) { Value = value; } + + public override ScanResult Clone() + { + return new FloatScanResult(Value) { Address = Address }; + } } public class DoubleScanResult : ScanResult @@ -81,6 +108,11 @@ public DoubleScanResult(double value) { Value = value; } + + public override ScanResult Clone() + { + return new DoubleScanResult(Value) { Address = Address }; + } } public class ArrayOfBytesScanResult : ScanResult @@ -95,6 +127,11 @@ public ArrayOfBytesScanResult(byte[] value) Value = value; } + + public override ScanResult Clone() + { + return new ArrayOfBytesScanResult(Value) { Address = Address }; + } } public class StringScanResult : ScanResult @@ -113,5 +150,10 @@ public StringScanResult(string value, Encoding encoding) Value = value; Encoding = encoding; } + + public override ScanResult Clone() + { + return new StringScanResult(Value, Encoding) { Address = Address }; + } } } diff --git a/MemoryScanner/Scanner.cs b/MemoryScanner/Scanner.cs index 0bb0441e..4e9f084f 100644 --- a/MemoryScanner/Scanner.cs +++ b/MemoryScanner/Scanner.cs @@ -14,14 +14,21 @@ namespace ReClassNET.MemoryScanner public class Scanner : IDisposable { private readonly RemoteProcess process; - private ScanResultStore store; + private readonly CircularBuffer stores; public ScanSettings Settings { get; } + private ScanResultStore CurrentStore => stores.Head; + /// /// Gets the total result count from the last scan. /// - public int TotalResultCount => store.TotalResultCount; + public int TotalResultCount => CurrentStore?.TotalResultCount ?? 0; + + /// + /// Checks if the last scan can be undone. + /// + public bool CanUndoLastScan => stores.Count > 1; private bool isFirstScan; @@ -30,6 +37,8 @@ public Scanner(RemoteProcess process, ScanSettings settings) Contract.Requires(process != null); Contract.Requires(settings != null); + stores = new CircularBuffer(3); + this.process = process; Settings = settings; @@ -38,8 +47,11 @@ public Scanner(RemoteProcess process, ScanSettings settings) public void Dispose() { - store?.Dispose(); - store = null; + foreach (var store in stores) + { + store?.Dispose(); + } + stores.Clear(); } /// @@ -52,7 +64,33 @@ public IEnumerable GetResults() { Contract.Ensures(Contract.Result>() != null); - return store.GetResultBlocks().SelectMany(kv => kv.Results); + if (CurrentStore == null) + { + return Enumerable.Empty(); + } + + return CurrentStore.GetResultBlocks().SelectMany(rb => rb.Results.Select(r => + { + // Convert the block offset to a real address. + var c = r.Clone(); + c.Address = c.Address.Add(rb.Start); + return c; + })); + } + + /// + /// Restores the results of the previous scan. + /// + /// Thrown if no previous results are present. + public void UndoLastScan() + { + if (!CanUndoLastScan) + { + throw new InvalidOperationException(); + } + + var store = stores.Dequeue(); + store?.Dispose(); } /// @@ -143,7 +181,7 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); - store = CreateStore(); + var store = CreateStore(); var sections = GetSearchableSections(); if (sections.Count == 0) @@ -177,16 +215,11 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg if (process.ReadRemoteMemoryIntoBuffer(s.Start, ref buffer, 0, size)) // Fill the buffer. { var results = context.Worker.Search(buffer, size) // Search for results. - .Select(r => { r.Address = r.Address.Add(s.Start); return r; }) // Results are relative to the buffer so add the section start address. + .OrderBy(r => r.Address, IntPtrComparer.Instance) .ToList(); if (results.Count > 0) { - // Minify the result block range. - var block = new ScanResultBlock( - results.Min(r => r.Address, IntPtrComparer.Instance), - results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, - results - ); + var block = CreateResultBlock(results, s.Start, comparer.ValueSize); store.AddBlock(block); // Store the result block. } } @@ -200,6 +233,9 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg store.Finish(); + var previousStore = stores.Enqueue(store); + previousStore?.Dispose(); + if (result.IsCompleted) { isFirstScan = false; @@ -224,17 +260,17 @@ private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgr Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); - var localStore = CreateStore(); + var store = CreateStore(); progress?.Report(0); var counter = 0; - var totalResultCount = (float)store.TotalResultCount; + var totalResultCount = (float)CurrentStore.TotalResultCount; return Task.Run(() => { var result = Parallel.ForEach( - store.GetResultBlocks(), + CurrentStore.GetResultBlocks(), new ParallelOptions { CancellationToken = ct }, () => new ScannerContext(Settings, comparer, 0), (b, state, _, context) => @@ -243,17 +279,13 @@ private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgr var buffer = context.Buffer; if (process.ReadRemoteMemoryIntoBuffer(b.Start, ref buffer, 0, b.Size)) { - var results = context.Worker.Search(buffer, buffer.Length, b.Results.Select(r => { r.Address = r.Address.Sub(b.Start); return r; })) - .Select(r => { r.Address = r.Address.Add(b.Start); return r; }) + var results = context.Worker.Search(buffer, buffer.Length, b.Results) + .OrderBy(r => r.Address, IntPtrComparer.Instance) .ToList(); if (results.Count > 0) { - var block = new ScanResultBlock( - results.Min(r => r.Address, IntPtrComparer.Instance), - results.Max(r => r.Address, IntPtrComparer.Instance) + comparer.ValueSize, - results - ); - localStore.AddBlock(block); + var block = CreateResultBlock(results, b.Start, comparer.ValueSize); + store.AddBlock(block); } } @@ -264,19 +296,41 @@ private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgr w => { } ); - localStore.Finish(); + store.Finish(); - if (result.IsCompleted) - { - store.Dispose(); + var previousStore = stores.Enqueue(store); + previousStore?.Dispose(); - store = localStore; + return result.IsCompleted; + }, ct); + } - return true; - } + /// + /// Creates a result block from the scan results and adjusts the result offset. + /// + /// The results in this block. + /// The start address of the previous block or section. + /// The size of the value type. + /// The new result block. + private static ScanResultBlock CreateResultBlock(IReadOnlyList results, IntPtr previousStartAddress, int valueSize) + { + // Calculate start and end address + var startAddress = results.First().Address.Add(previousStartAddress); + var endAddress = results.Last().Address.Add(previousStartAddress) + valueSize; - return false; - }, ct); + // Adjust the offsets of the results + var firstOffset = results.First().Address; + foreach (var result in results) + { + result.Address = result.Address.Sub(firstOffset); + } + + var block = new ScanResultBlock( + startAddress, + endAddress, + results + ); + return block; } } } diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 12d29c28..6e22a44e 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -1070,6 +1070,16 @@ internal static System.Drawing.Bitmap B16x16_Quit { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Redo { + get { + object obj = ResourceManager.GetObject("B16x16_Redo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1180,6 +1190,16 @@ internal static System.Drawing.Bitmap B16x16_Tree_Expand { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Undo { + get { + object obj = ResourceManager.GetObject("B16x16_Undo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1281,7 +1301,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/09/25 19:13:20 + /// Sucht eine lokalisierte Zeichenfolge, die 2017/10/11 21:28:28 /// ähnelt. /// internal static string BuildDate { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 91bbf5e5..ce8838dc 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -490,4 +490,10 @@ ..\Resources\Images\B16x16_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Undo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index 4f4d3917..ed289581 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -296,6 +296,9 @@ HotkeyBox.cs + + Component + @@ -311,6 +314,7 @@ MemoryViewControl.cs + @@ -906,6 +910,12 @@ + + + + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" diff --git a/Resources/Images/B16x16_Redo.png b/Resources/Images/B16x16_Redo.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e45cff9397f422f9d63459ea3e685d441f09ba GIT binary patch literal 708 zcmV;#0z3VQP)@A>nW=<)yo#7xKlEh(vj1xwlt7#MgWzP$bT0%*uZWO;x9 z!fSwov9Uh~14Beagrk7ItviRhqIkg9=T8*)ge4C=e*XL?NDV*$F=Er`Vr(4mXr?g1 z)x}1@)Y^!FfsqM{nHgR`f5y<=G55mJn=cZMojrRIAb>Coh_o}9pPyizU~Z|yz`(=; z#6U+fLTM=f>$l$wi{@|tuwv(>V1NKZ@j|4%et%nvY=(}S5Cg-n4-5>yKLTkW{__dQ z{tTo)gT>g`J~N1_^Ko3f_)G{OfLLIf9gU6cqmAAaD6jz)zkJHTz{3~O8o!7fdBvhJL&&7 zEzS8KWN)@fPg66=+sNqB{}Vy~Up;L5Ul8klLse1H6FK$(0tk$}jE(!hOym0h|8~m% zDNRwIbd{B3fWmAbIX`3L{U`QU{to~eC?zhgj2`F!0R%=(K`Q6}?=tznbY|Lr4LLb~ zWE+4{s&A&Qo(5!cV$%x{Kwva8UiSa1o0b3Vw6&)alRA+BKmf4-{V&fa#mul`<-^an zUcH*g01htV0YCr&lNW=6vZVpTfxUMQymyyFg$$D!0_P3$1SAV4gvrH q1Tx^k^5vIKzWDHAF9R6>Aiw}@kj85RTB}e10000gx00G1Zv_aomR`x(qRh0l2FE0bbpFa!?fB$08 zkFQ)|s9L!2z&&2xfMaLReuNnS5I{^UzkfRf$Hoe9fp{-pGBCV;4WVDWU|@Lm41ym& zW{~CPX6X0xb5MHuav8D<00M~l)~8P=@1HyOnT?gzU0Y6$f#K#&28Oq985rKZgBbSe z6~w?NPZ+p>wDzArsy8?}Ki_-*{y4}0fB<3!5w|~mI{y0k^X(5GJqk7R^5S3xY54Gg z;V@9{y|_37pRO(g>+jzT438c$h_JFUeEIar>Y2FstQW6ee+LL4W|&hReEj(I13UYi znbkhd^K)@A%v-naX4mP{i91)X{{CA+!pI;bgn{AeRR)QlKiRi``0yC0=M+Ey zVT~0JdHJSom6iV+{r%6t#LV>djcY9}FMXXe=l_3O+y7ZoQhPw+00D#(*(oWx*+@tv zp{LLZetz%&x3v79qNw;ED8va6Kn$b;P{O)4dGi0A+S>nhH8gAh0*IMZ1Ma+ke^KiH z{{%~Qb%Axyo~;K6ASMPf!11eBC%hFCV_^OEO$;D_$THxanAm~S7cMXefB&up5J1f2 p81VS{^OpjgoMw-I|K0`=U;x^&`B18C?@a&z002ovPDHLkV1f|(PF(;1 literal 0 HcmV?d00001 diff --git a/UI/IconButton.cs b/UI/IconButton.cs new file mode 100644 index 00000000..d3331c2c --- /dev/null +++ b/UI/IconButton.cs @@ -0,0 +1,195 @@ +using System; +using System.ComponentModel; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace ReClassNET.UI +{ + /// + /// Based on . + /// + [DefaultEvent("Click")] + public class IconButton : Panel + { + public bool Pressed { get; set; } + public bool Selected { get; set; } + + public Image Image { get; set; } + public Rectangle ImageRectangle { get; } = new Rectangle(3, 3, 16, 16); + + private readonly ProfessionalColorTable colorTable = new ProfessionalColorTable(); + + public IconButton() + { + DoubleBuffered = true; + } + + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, 23, 22, specified); + } + + protected override void Select(bool directed, bool forward) + { + base.Select(directed, forward); + + Selected = true; + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + Pressed = true; + + Invalidate(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + + Pressed = false; + + Invalidate(); + } + + protected override void OnMouseEnter(EventArgs e) + { + base.OnMouseEnter(e); + + Selected = true; + + Invalidate(); + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + + Selected = false; + Pressed = false; + + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + RenderButtonBackground(e.Graphics); + RenderImage(e.Graphics); + } + + private void RenderButtonBackground(Graphics g) + { + Contract.Requires(g != null); + + var bounds = new Rectangle(Point.Empty, Size); + var drawHotBorder = true; + + if (Pressed) + { + RenderPressedButtonFill(g, bounds); + } + else if (Selected) + { + RenderSelectedButtonFill(g, bounds); + } + else + { + drawHotBorder = false; + using (var brush = new SolidBrush(BackColor)) + { + g.FillRectangle(brush, bounds); + } + } + + if (drawHotBorder) + { + using (var pen = new Pen(colorTable.ButtonSelectedBorder)) + { + g.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); + } + } + } + + private void RenderPressedButtonFill(Graphics g, Rectangle bounds) + { + Contract.Requires(g != null); + + if (bounds.Width == 0 || bounds.Height == 0) + { + return; + } + + using (var brush = new LinearGradientBrush(bounds, colorTable.ButtonPressedGradientBegin, colorTable.ButtonPressedGradientEnd, LinearGradientMode.Vertical)) + { + g.FillRectangle(brush, bounds); + } + } + + private void RenderSelectedButtonFill(Graphics g, Rectangle bounds) + { + Contract.Requires(g != null); + + if (bounds.Width == 0 || bounds.Height == 0) + { + return; + } + + using (var brush = new LinearGradientBrush(bounds, colorTable.ButtonSelectedGradientBegin, colorTable.ButtonSelectedGradientEnd, LinearGradientMode.Vertical)) + { + g.FillRectangle(brush, bounds); + } + } + + private void RenderImage(Graphics g) + { + Contract.Requires(g != null); + + var image = Image; + if (image == null) + { + return; + } + + var imageRect = ImageRectangle; + + if (!Enabled) + { + var disposeImage = false; + if (Pressed) + { + imageRect.X += 1; + } + if (!Enabled) + { + image = ToolStripRenderer.CreateDisabledImage(image); + disposeImage = true; + } + + g.DrawImage(image, imageRect); + + if (disposeImage) + { + image.Dispose(); + } + return; + } + + g.DrawImage(image, imageRect); + } + } + + internal class IconButtonDesigner : ControlDesigner + { + private IconButtonDesigner() + { + AutoResizeHandles = true; + } + + public override SelectionRules SelectionRules => SelectionRules.Moveable; + } +} diff --git a/Util/CircularBuffer.cs b/Util/CircularBuffer.cs new file mode 100644 index 00000000..4a802c6a --- /dev/null +++ b/Util/CircularBuffer.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ReClassNET.Util +{ + /// + /// A circular buffer with a fixed size. + /// + public class CircularBuffer : IEnumerable + { + private readonly T[] buffer; + private int head; + private int tail; + + public CircularBuffer(int capacity) + { + if (capacity < 0) + { + throw new ArgumentOutOfRangeException(nameof(capacity)); + } + + buffer = new T[capacity]; + head = capacity - 1; + } + + public int Count { get; private set; } + + public int Capacity => buffer.Length; + + public T Head => buffer[head]; + public T Tail => buffer[tail]; + + public T Enqueue(T item) + { + head = (head + 1) % Capacity; + var overwritten = buffer[head]; + buffer[head] = item; + if (Count == Capacity) + { + tail = (tail + 1) % Capacity; + } + else + { + ++Count; + } + + return overwritten; + } + + public T Dequeue() + { + if (Count == 0) + { + throw new InvalidOperationException(); + } + + var dequeued = buffer[head]; + buffer[head] = default(T); + if (head == 0) + { + head = Capacity - 1; + } + else + { + head = (head - 1) % Capacity; + } + --Count; + return dequeued; + } + + public void Clear() + { + head = Capacity - 1; + tail = 0; + Count = 0; + } + + public T this[int index] + { + get + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + return buffer[(tail + index) % Capacity]; + } + set + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + buffer[(tail + index) % Capacity] = value; + } + } + + public int IndexOf(T item) + { + for (var i = 0; i < Count; ++i) + { + if (Equals(item, this[i])) + { + return i; + } + } + + return -1; + } + + public void Insert(int index, T item) + { + if (index < 0 || index > Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (Count == index) + { + Enqueue(item); + } + else + { + var last = this[Count - 1]; + for (var i = index; i < Count - 2; ++i) + { + this[i + 1] = this[i]; + } + + this[index] = item; + Enqueue(last); + } + } + + public void RemoveAt(int index) + { + if (index < 0 || index >= Count) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + for (var i = index; i > 0; --i) + { + this[i] = this[i - 1]; + } + + Dequeue(); + } + + public IEnumerator GetEnumerator() + { + if (Count == 0 || Capacity == 0) + { + yield break; + } + + for (var i = 0; i < Count; ++i) + { + yield return this[i]; + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Util/Extension.Linq.cs b/Util/Extension.Linq.cs index b31bfcd7..32754357 100644 --- a/Util/Extension.Linq.cs +++ b/Util/Extension.Linq.cs @@ -251,5 +251,27 @@ public static bool SequenceEqualsEx(this IEnumerable first, IE } return counter.Values.All(c => c == 0); } + + public static TSource PredicateOrFirst(this IEnumerable source, Func predicate) + { + Contract.Requires(source != null); + Contract.Requires(predicate != null); + + var result = default(TSource); + var first = true; + foreach (var element in source) + { + if (predicate(element)) + { + return element; + } + if (first) + { + result = element; + first = false; + } + } + return result; + } } } From 22a674bb3169b45d45c2ba70210f72c3d217f114 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 14 Oct 2017 16:26:15 +0200 Subject: [PATCH 148/777] Clear memory on Dispose(). --- MemoryScanner/ScanResultStore.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MemoryScanner/ScanResultStore.cs b/MemoryScanner/ScanResultStore.cs index f4ea0794..62aee95e 100644 --- a/MemoryScanner/ScanResultStore.cs +++ b/MemoryScanner/ScanResultStore.cs @@ -45,6 +45,8 @@ public void Dispose() { Finish(); + store.Clear(); + try { if (File.Exists(storePath)) From 709d2d1a60abe8a225477d6fecb741a01bcbcce1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 15 Oct 2017 23:51:10 +0200 Subject: [PATCH 149/777] Added quick dropdown process selection. --- Forms/MainForm.Designer.cs | 26 +++++++++--------- Forms/MainForm.cs | 53 ++++++++++++++++++++++++------------- Forms/ProcessBrowserForm.cs | 4 +-- Memory/ProcessInfo.cs | 12 +++++++++ 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/Forms/MainForm.Designer.cs b/Forms/MainForm.Designer.cs index 5a05e687..b64f5480 100644 --- a/Forms/MainForm.Designer.cs +++ b/Forms/MainForm.Designer.cs @@ -35,7 +35,7 @@ private void InitializeComponent() this.classesView = new ReClassNET.UI.ClassNodeView(); this.memoryViewControl = new ReClassNET.UI.MemoryViewControl(); this.toolStrip = new System.Windows.Forms.ToolStrip(); - this.attachToProcessToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.attachToProcessToolStripSplitButton = new System.Windows.Forms.ToolStripSplitButton(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.openProjectToolStripButton = new System.Windows.Forms.ToolStripButton(); this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); @@ -195,7 +195,7 @@ private void InitializeComponent() // toolStrip // this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.attachToProcessToolStripButton, + this.attachToProcessToolStripSplitButton, this.toolStripSeparator6, this.openProjectToolStripButton, this.saveToolStripButton, @@ -251,15 +251,17 @@ private void InitializeComponent() this.toolStrip.Size = new System.Drawing.Size(1141, 25); this.toolStrip.TabIndex = 3; // - // attachToProcessToolStripButton + // attachToProcessToolStripSplitButton // - this.attachToProcessToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.attachToProcessToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; - this.attachToProcessToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.attachToProcessToolStripButton.Name = "attachToProcessToolStripButton"; - this.attachToProcessToolStripButton.Size = new System.Drawing.Size(23, 22); - this.attachToProcessToolStripButton.ToolTipText = "Attach to Process..."; - this.attachToProcessToolStripButton.Click += new System.EventHandler(this.attachToProcessToolStripMenuItem_Click); + this.attachToProcessToolStripSplitButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.attachToProcessToolStripSplitButton.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; + this.attachToProcessToolStripSplitButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.attachToProcessToolStripSplitButton.Name = "attachToProcessToolStripSplitButton"; + this.attachToProcessToolStripSplitButton.Size = new System.Drawing.Size(32, 22); + this.attachToProcessToolStripSplitButton.ToolTipText = "Attach to Process..."; + this.attachToProcessToolStripSplitButton.ButtonClick += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); + this.attachToProcessToolStripSplitButton.DropDownClosed += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownClosed); + this.attachToProcessToolStripSplitButton.DropDownOpening += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownOpening); // // toolStripSeparator6 // @@ -958,7 +960,7 @@ private void InitializeComponent() this.attachToProcessToolStripMenuItem.Name = "attachToProcessToolStripMenuItem"; this.attachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); this.attachToProcessToolStripMenuItem.Text = "Attach to Process..."; - this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripMenuItem_Click); + this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); // // reattachToProcessToolStripMenuItem // @@ -1262,7 +1264,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem loadSymbolsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStrip toolStrip; - private System.Windows.Forms.ToolStripButton attachToProcessToolStripButton; private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; private System.Windows.Forms.SplitContainer splitContainer; private System.Windows.Forms.ToolStripStatusLabel processInfoToolStripStatusLabel; @@ -1346,6 +1347,7 @@ private void InitializeComponent() private UI.TypeToolStripButton fnTypeToolStripButton; private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripSplitButton attachToProcessToolStripSplitButton; } } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index b0ab7e04..e4c767ef 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -151,25 +151,6 @@ private void fileToolStripMenuItem_DropDownOpening(object sender, EventArgs e) } } - private void attachToProcessToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var pb = new ProcessBrowserForm(Program.Settings.LastProcess)) - { - if (pb.ShowDialog() == DialogResult.OK) - { - if (pb.SelectedProcess != null) - { - AttachToProcess(pb.SelectedProcess); - - if (pb.LoadSymbols) - { - LoadAllSymbolsForCurrentProcess(); - } - } - } - } - } - private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e) { var lastProcess = Program.Settings.LastProcess; @@ -392,6 +373,40 @@ private void aboutToolStripMenuItem_Click(object sender, EventArgs e) #region Toolstrip + private void attachToProcessToolStripSplitButton_ButtonClick(object sender, EventArgs e) + { + using (var pb = new ProcessBrowserForm(Program.Settings.LastProcess)) + { + if (pb.ShowDialog() == DialogResult.OK) + { + if (pb.SelectedProcess != null) + { + AttachToProcess(pb.SelectedProcess); + + if (pb.LoadSymbols) + { + LoadAllSymbolsForCurrentProcess(); + } + } + } + } + } + + private void attachToProcessToolStripSplitButton_DropDownClosed(object sender, EventArgs e) + { + attachToProcessToolStripSplitButton.DropDownItems.Clear(); + } + + private void attachToProcessToolStripSplitButton_DropDownOpening(object sender, EventArgs e) + { + attachToProcessToolStripSplitButton.DropDownItems.AddRange( + Program.CoreFunctions.EnumerateProcesses() + .OrderBy(p => p.Name).ThenBy(p => p.Id, IntPtrComparer.Instance) + .Select(p => new ToolStripMenuItem($"[{p.Id}] {p.Name}", p.Icon, (sender2, e2) => AttachToProcess(p))) + .ToArray() + ); + } + private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) { if (!(sender is IntegerToolStripMenuItem item)) diff --git a/Forms/ProcessBrowserForm.cs b/Forms/ProcessBrowserForm.cs index 8ed96774..9478a06f 100644 --- a/Forms/ProcessBrowserForm.cs +++ b/Forms/ProcessBrowserForm.cs @@ -100,7 +100,7 @@ private void processDataGridView_CellMouseDoubleClick(object sender, DataGridVie private void RefreshProcessList() { var dt = new DataTable(); - dt.Columns.Add("icon", typeof(Icon)); + dt.Columns.Add("icon", typeof(Image)); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("id", typeof(IntPtr)); dt.Columns.Add("path", typeof(string)); @@ -111,7 +111,7 @@ private void RefreshProcessList() foreach (var p in Program.CoreFunctions.EnumerateProcesses().Where(p => !shouldFilter || !commonProcesses.Contains(p.Name.ToLower()))) { var row = dt.NewRow(); - row["icon"] = NativeMethods.GetIconForFile(p.Path); + row["icon"] = p.Icon; row["name"] = p.Name; row["id"] = p.Id; row["path"] = p.Path; diff --git a/Memory/ProcessInfo.cs b/Memory/ProcessInfo.cs index 97159f6d..59390c84 100644 --- a/Memory/ProcessInfo.cs +++ b/Memory/ProcessInfo.cs @@ -1,5 +1,7 @@ using System; using System.Diagnostics.Contracts; +using System.Drawing; +using ReClassNET.Native; namespace ReClassNET.Memory { @@ -8,6 +10,9 @@ public class ProcessInfo public IntPtr Id { get; } public string Name { get; } public string Path { get; } + public Image Icon => icon.Value; + + private readonly Lazy icon; public ProcessInfo(IntPtr id, string name, string path) { @@ -17,6 +22,13 @@ public ProcessInfo(IntPtr id, string name, string path) Id = id; Name = name; Path = path; + icon = new Lazy(() => + { + using (var i = NativeMethods.GetIconForFile(Path)) + { + return i.ToBitmap(); + } + }); } } } From 1d66b2cfcc23b773287a4e900e5efe1e5d1297c5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 19:37:00 +0200 Subject: [PATCH 150/777] Show platform in the title. --- Forms/MainForm.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index e4c767ef..cdd6d355 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -41,19 +41,21 @@ public MainForm() InitializeComponent(); + Text = $"{Constants.ApplicationName} ({Constants.Platform})"; + mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); Program.RemoteProcess.ProcessAttached += sender => { - var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; + var text = $"{sender.UnderlayingProcess.Name} ({Constants.Platform}) (ID: {sender.UnderlayingProcess.Id.ToString()})"; Text = $"{Constants.ApplicationName} - {text}"; processInfoToolStripStatusLabel.Text = text; }; Program.RemoteProcess.ProcessClosed += (sender) => { - Text = Constants.ApplicationName; + Text = $"{Constants.ApplicationName} ({Constants.Platform})"; processInfoToolStripStatusLabel.Text = "No process selected"; }; From 6d1ac309fdd553a83ce03608e9808ab3285c79a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 21:46:13 +0200 Subject: [PATCH 151/777] Added ability to register project files and load them as parameter. --- Constants.cs | 6 + DataExchange/ReClass/ReClassNetFile.cs | 1 + Forms/MainForm.cs | 84 ++++++----- Forms/SettingsForm.Designer.cs | 54 ++++++++ Forms/SettingsForm.cs | 21 +++ Native/INativeMethods.cs | 25 +++- Native/NativeMethods.Unix.cs | 10 ++ Native/NativeMethods.Windows.cs | 184 ++++++++++++++++++++++++- Native/NativeMethods.cs | 21 +++ Program.cs | 25 +++- ReClass.NET.csproj | 2 + Settings.cs | 37 +++-- Util/CommandLineArgs.cs | 125 +++++++++++++++++ Util/PathUtil.cs | 91 ++++++++++++ Util/WinUtil.cs | 51 ++++++- 15 files changed, 678 insertions(+), 59 deletions(-) create mode 100644 Util/CommandLineArgs.cs create mode 100644 Util/PathUtil.cs diff --git a/Constants.cs b/Constants.cs index 879a955d..f1b44bd5 100644 --- a/Constants.cs +++ b/Constants.cs @@ -27,5 +27,11 @@ internal class Constants public const string SettingsFile = "settings.xml"; public const string PluginsFolder = "Plugins"; + + public static class CommandLineOptions + { + public const string FileExtRegister = "registerfileext"; + public const string FileExtUnregister = "unregisterfileext"; + } } } diff --git a/DataExchange/ReClass/ReClassNetFile.cs b/DataExchange/ReClass/ReClassNetFile.cs index 1fbed43f..3c520204 100644 --- a/DataExchange/ReClass/ReClassNetFile.cs +++ b/DataExchange/ReClass/ReClassNetFile.cs @@ -10,6 +10,7 @@ public partial class ReClassNetFile : IReClassImport, IReClassExport { public const string FormatName = "ReClass.NET File"; public const string FileExtension = ".rcnet"; + public const string FileExtensionId = "rcnetfile"; private const string Version1 = "1"; diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index cdd6d355..fe3327c7 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -65,8 +65,6 @@ public MainForm() }; pluginManager = new PluginManager(new DefaultPluginHost(this, Program.RemoteProcess, Program.Logger)); - - SetProject(new ReClassNetProject()); } protected override void OnLoad(EventArgs e) @@ -77,7 +75,28 @@ protected override void OnLoad(EventArgs e) pluginManager.LoadAllPlugins(Path.Combine(Application.StartupPath, Constants.PluginsFolder), Program.Logger); - LinkedWindowFeatures.CreateDefaultClass(); + var createDefaultProject = true; + + if (Program.CommandLineArgs.FileName != null) + { + try + { + LoadProjectFromPath(Program.CommandLineArgs.FileName); + + createDefaultProject = false; + } + catch (Exception ex) + { + Program.Logger.Log(ex); + } + } + + if (createDefaultProject) + { + SetProject(new ReClassNetProject()); + + LinkedWindowFeatures.CreateDefaultClass(); + } } protected override void OnFormClosed(FormClosedEventArgs e) @@ -191,17 +210,7 @@ private void openProjectToolStripMenuItem_Click(object sender, EventArgs e) var path = ShowOpenProjectFileDialog(); if (path != null) { - var project = new ReClassNetProject(); - - LoadFileFromPath(path, ref project); - - // If the file is a ReClass.NET file remember the path. - if (Path.GetExtension(path) == ReClassNetFile.FileExtension) - { - project.Path = path; - } - - SetProject(project); + LoadProjectFromPath(path); } } catch (Exception ex) @@ -217,7 +226,7 @@ private void mergeWithProjectToolStripMenuItem_Click(object sender, EventArgs e) var path = ShowOpenProjectFileDialog(); if (path != null) { - LoadFileFromPath(path, ref currentProject); + LoadProjectFromPath(path, ref currentProject); } } catch (Exception ex) @@ -478,17 +487,7 @@ private void MainForm_DragDrop(object sender, DragEventArgs e) { var path = files.First(); - var project = new ReClassNetProject(); - - LoadFileFromPath(path, ref project); - - // If the file is a ReClass.NET file remember the path. - if (Path.GetExtension(path) == ReClassNetFile.FileExtension) - { - project.Path = path; - } - - SetProject(project); + LoadProjectFromPath(path); } catch (Exception ex) { @@ -667,17 +666,36 @@ public static string ShowOpenProjectFileDialog() return null; } + /// Loads the file as a new project. + /// Full pathname of the file. + public void LoadProjectFromPath(string path) + { + Contract.Requires(path != null); + + var project = new ReClassNetProject(); + + LoadProjectFromPath(path, ref project); + + // If the file is a ReClass.NET file remember the path. + if (Path.GetExtension(path) == ReClassNetFile.FileExtension) + { + project.Path = path; + } + + SetProject(project); + } + /// Loads the file into the given project. - /// Full pathname of the file. + /// Full pathname of the file. /// [in,out] The project. - private void LoadFileFromPath(string filePath, ref ReClassNetProject project) + private static void LoadProjectFromPath(string path, ref ReClassNetProject project) { - Contract.Requires(filePath != null); + Contract.Requires(path != null); Contract.Requires(project != null); Contract.Ensures(Contract.ValueAtReturn(out project) != null); IReClassImport import = null; - switch (Path.GetExtension(filePath)?.ToLower()) + switch (Path.GetExtension(path)?.ToLower()) { case ReClassNetFile.FileExtension: import = new ReClassNetFile(project); @@ -692,10 +710,10 @@ private void LoadFileFromPath(string filePath, ref ReClassNetProject project) import = new ReClass2007File(project); break; default: - Program.Logger.Log(LogLevel.Error, $"The file '{filePath}' has an unknown type."); - break; + Program.Logger.Log(LogLevel.Error, $"The file '{path}' has an unknown type."); + return; } - import?.Load(filePath, Program.Logger); + import.Load(path, Program.Logger); } /// Loads all symbols for the current process and displays the progress status. diff --git a/Forms/SettingsForm.Designer.cs b/Forms/SettingsForm.Designer.cs index 06a91875..015a6b23 100644 --- a/Forms/SettingsForm.Designer.cs +++ b/Forms/SettingsForm.Designer.cs @@ -30,6 +30,10 @@ private void InitializeComponent() { this.settingsTabControl = new System.Windows.Forms.TabControl(); this.generalSettingsTabPage = new System.Windows.Forms.TabPage(); + this.fileAssociationGroupBox = new System.Windows.Forms.GroupBox(); + this.removeAssociationButton = new System.Windows.Forms.Button(); + this.createAssociationButton = new System.Windows.Forms.Button(); + this.associationInfoLabel = new System.Windows.Forms.Label(); this.commentsGroupBox = new System.Windows.Forms.GroupBox(); this.showPluginInfoCheckBox = new ReClassNET.UI.SettingsCheckBox(); this.showStringCheckBox = new ReClassNET.UI.SettingsCheckBox(); @@ -125,6 +129,7 @@ private void InitializeComponent() this.bannerBox = new ReClassNET.UI.BannerBox(); this.settingsTabControl.SuspendLayout(); this.generalSettingsTabPage.SuspendLayout(); + this.fileAssociationGroupBox.SuspendLayout(); this.commentsGroupBox.SuspendLayout(); this.displayGroupBox.SuspendLayout(); this.colorsSettingTabPage.SuspendLayout(); @@ -146,6 +151,7 @@ private void InitializeComponent() // // generalSettingsTabPage // + this.generalSettingsTabPage.Controls.Add(this.fileAssociationGroupBox); this.generalSettingsTabPage.Controls.Add(this.commentsGroupBox); this.generalSettingsTabPage.Controls.Add(this.displayGroupBox); this.generalSettingsTabPage.Controls.Add(this.stayOnTopCheckBox); @@ -156,6 +162,49 @@ private void InitializeComponent() this.generalSettingsTabPage.TabIndex = 0; this.generalSettingsTabPage.Text = "General"; this.generalSettingsTabPage.UseVisualStyleBackColor = true; + // + // fileAssociationGroupBox + // + this.fileAssociationGroupBox.Controls.Add(this.removeAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.createAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.associationInfoLabel); + this.fileAssociationGroupBox.Location = new System.Drawing.Point(6, 231); + this.fileAssociationGroupBox.Name = "fileAssociationGroupBox"; + this.fileAssociationGroupBox.Size = new System.Drawing.Size(542, 85); + this.fileAssociationGroupBox.TabIndex = 4; + this.fileAssociationGroupBox.TabStop = false; + this.fileAssociationGroupBox.Text = "RCNET File Association"; + // + // removeAssociationButton + // + this.removeAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.removeAssociationButton.Location = new System.Drawing.Point(146, 52); + this.removeAssociationButton.Name = "removeAssociationButton"; + this.removeAssociationButton.Size = new System.Drawing.Size(135, 23); + this.removeAssociationButton.TabIndex = 2; + this.removeAssociationButton.Text = "&Remove Association"; + this.removeAssociationButton.UseVisualStyleBackColor = true; + this.removeAssociationButton.Click += new System.EventHandler(this.removeAssociationButton_Click); + // + // createAssociationButton + // + this.createAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.createAssociationButton.Location = new System.Drawing.Point(9, 52); + this.createAssociationButton.Name = "createAssociationButton"; + this.createAssociationButton.Size = new System.Drawing.Size(131, 23); + this.createAssociationButton.TabIndex = 1; + this.createAssociationButton.Text = "Create &Association"; + this.createAssociationButton.UseVisualStyleBackColor = true; + this.createAssociationButton.Click += new System.EventHandler(this.createAssociationButton_Click); + // + // associationInfoLabel + // + this.associationInfoLabel.Location = new System.Drawing.Point(6, 21); + this.associationInfoLabel.Name = "associationInfoLabel"; + this.associationInfoLabel.Size = new System.Drawing.Size(525, 28); + this.associationInfoLabel.TabIndex = 0; + this.associationInfoLabel.Text = "RCNET files can be associated with ReClass.NET. When you double-click a RCNET fil" + + "e, they will automatically be opened by ReClass.NET."; // // commentsGroupBox // @@ -1054,6 +1103,7 @@ private void InitializeComponent() this.settingsTabControl.ResumeLayout(false); this.generalSettingsTabPage.ResumeLayout(false); this.generalSettingsTabPage.PerformLayout(); + this.fileAssociationGroupBox.ResumeLayout(false); this.commentsGroupBox.ResumeLayout(false); this.commentsGroupBox.PerformLayout(); this.displayGroupBox.ResumeLayout(false); @@ -1165,5 +1215,9 @@ private void InitializeComponent() private UI.BannerBox bannerBox; private System.Windows.Forms.Label boolSettingsLabel; private UI.SettingsTextBox boolSettingsTextBox; + private System.Windows.Forms.GroupBox fileAssociationGroupBox; + private System.Windows.Forms.Button removeAssociationButton; + private System.Windows.Forms.Button createAssociationButton; + private System.Windows.Forms.Label associationInfoLabel; } } \ No newline at end of file diff --git a/Forms/SettingsForm.cs b/Forms/SettingsForm.cs index b733f205..dec15079 100644 --- a/Forms/SettingsForm.cs +++ b/Forms/SettingsForm.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.Contracts; using System.Windows.Forms; +using ReClassNET.Native; using ReClassNET.UI; using ReClassNET.Util; @@ -31,6 +32,16 @@ public SettingsForm(Settings settings) backgroundColorBox.Color = System.Drawing.Color.Red; SetBindings(); + + if (NativeMethods.IsUnix()) + { + fileAssociationGroupBox.Enabled = false; + } + else + { + NativeMethodsWindows.SetButtonShield(createAssociationButton, true); + NativeMethodsWindows.SetButtonShield(removeAssociationButton, true); + } } protected override void OnLoad(EventArgs e) @@ -47,6 +58,16 @@ protected override void OnFormClosed(FormClosedEventArgs e) GlobalWindowManager.RemoveWindow(this); } + private void createAssociationButton_Click(object sender, EventArgs e) + { + WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtRegister}"); + } + + private void removeAssociationButton_Click(object sender, EventArgs e) + { + WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtUnregister}"); + } + private void SetBindings() { SetGeneralBindings(); diff --git a/Native/INativeMethods.cs b/Native/INativeMethods.cs index 9c009f97..cef87737 100644 --- a/Native/INativeMethods.cs +++ b/Native/INativeMethods.cs @@ -4,6 +4,7 @@ namespace ReClassNET.Native { + [ContractClass(typeof(NativeMethodsContract))] internal interface INativeMethods { IntPtr LoadLibrary(string fileName); @@ -19,10 +20,14 @@ internal interface INativeMethods string UndecorateSymbolName(string name); void SetProcessDpiAwareness(); + + bool RegisterExtension(string fileExtension, string extensionId, string applicationPath, string applicationName); + + void UnregisterExtension(string fileExtension, string extensionId); } [ContractClassFor(typeof(INativeMethods))] - internal abstract class IINativeMethodsContract : INativeMethods + internal abstract class NativeMethodsContract : INativeMethods { public IntPtr LoadLibrary(string fileName) { @@ -67,5 +72,23 @@ public void SetProcessDpiAwareness() { throw new NotImplementedException(); } + + public bool RegisterExtension(string fileExtension, string extensionId, string applicationPath, string applicationName) + { + Contract.Requires(!string.IsNullOrEmpty(fileExtension)); + Contract.Requires(!string.IsNullOrEmpty(extensionId)); + Contract.Requires(applicationPath != null); + Contract.Requires(applicationName != null); + + throw new NotImplementedException(); + } + + public void UnregisterExtension(string fileExtension, string extensionId) + { + Contract.Requires(!string.IsNullOrEmpty(fileExtension)); + Contract.Requires(!string.IsNullOrEmpty(extensionId)); + + throw new NotImplementedException(); + } } } diff --git a/Native/NativeMethods.Unix.cs b/Native/NativeMethods.Unix.cs index 7bdcc183..50be47b3 100644 --- a/Native/NativeMethods.Unix.cs +++ b/Native/NativeMethods.Unix.cs @@ -58,5 +58,15 @@ public void SetProcessDpiAwareness() { } + + public bool RegisterExtension(string fileExtension, string extensionId, string applicationPath, string applicationName) + { + return false; + } + + public void UnregisterExtension(string fileExtension, string extensionId) + { + + } } } diff --git a/Native/NativeMethods.Windows.cs b/Native/NativeMethods.Windows.cs index 4694b5f0..24f81c6d 100644 --- a/Native/NativeMethods.Windows.cs +++ b/Native/NativeMethods.Windows.cs @@ -1,8 +1,11 @@ using System; +using System.Diagnostics.Contracts; using System.Drawing; using System.Runtime.InteropServices; using System.Security.Principal; using System.Text; +using System.Windows.Forms; +using Microsoft.Win32; using ReClassNET.Util; namespace ReClassNET.Native @@ -12,7 +15,7 @@ internal class NativeMethodsWindows : INativeMethods #region Imports [DllImport("kernel32.dll", ExactSpelling = true)] - public static extern bool CloseHandle(IntPtr hObject); + private static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] private static extern IntPtr LoadLibrary(string lpFileName); @@ -23,12 +26,12 @@ internal class NativeMethodsWindows : INativeMethods [DllImport("kernel32.dll", ExactSpelling = true)] private static extern bool FreeLibrary(IntPtr hModule); - public const uint SHGFI_ICON = 0x100; - public const uint SHGFI_LARGEICON = 0x0; - public const uint SHGFI_SMALLICON = 0x1; + private const uint SHGFI_ICON = 0x100; + private const uint SHGFI_LARGEICON = 0x0; + private const uint SHGFI_SMALLICON = 0x1; [StructLayout(LayoutKind.Sequential)] - public struct SHFILEINFO + private struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; @@ -40,14 +43,14 @@ public struct SHFILEINFO }; [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct LUID + private struct LUID { public uint LowPart; public int HighPart; } [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct TOKEN_PRIVILEGES + private struct TOKEN_PRIVILEGES { public uint PrivilegeCount; public LUID Luid; @@ -83,6 +86,17 @@ private enum ProcessDpiAwareness : uint [DllImport("shcore.dll")] private static extern int SetProcessDpiAwareness([MarshalAs(UnmanagedType.U4)] ProcessDpiAwareness a); + [DllImport("shell32.dll")] + private static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2); + + private const int SHCNE_ASSOCCHANGED = 0x08000000; + private const uint SHCNF_IDLIST = 0x0000; + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam); + + private const int BCM_SETSHIELD = 0x160C; + #endregion IntPtr INativeMethods.LoadLibrary(string fileName) @@ -155,5 +169,161 @@ public void SetProcessDpiAwareness() SetProcessDPIAware(); } } + + public bool RegisterExtension(string fileExtension, string extensionId, string applicationPath, string applicationName) + { + try + { + var classesRoot = Registry.ClassesRoot; + + try + { + classesRoot.CreateSubKey(fileExtension); + } + catch (Exception) + { + + } + using (var fileExtensionKey = classesRoot.OpenSubKey(fileExtension, true)) + { + fileExtensionKey.SetValue(string.Empty, extensionId, RegistryValueKind.String); + } + + try + { + classesRoot.CreateSubKey(extensionId); + } + catch (Exception) + { + + } + using (var extensionInfoKey = classesRoot.OpenSubKey(extensionId, true)) + { + extensionInfoKey.SetValue(string.Empty, applicationName, RegistryValueKind.String); + + try + { + extensionInfoKey.CreateSubKey("DefaultIcon"); + } + catch (Exception) + { + + } + + using (var icon = extensionInfoKey.OpenSubKey("DefaultIcon", true)) + { + if (applicationPath.IndexOfAny(new[] { ' ', '\t' }) < 0) + { + icon.SetValue(string.Empty, applicationPath + ",0", RegistryValueKind.String); + } + else + { + icon.SetValue(string.Empty, "\"" + applicationPath + "\",0", RegistryValueKind.String); + } + } + + try + { + extensionInfoKey.CreateSubKey("shell"); + } + catch (Exception) + { + } + using (var shellKey = extensionInfoKey.OpenSubKey("shell", true)) + { + try + { + shellKey.CreateSubKey("open"); + } + catch (Exception) + { + + } + + using (var openKey = shellKey.OpenSubKey("open", true)) + { + + openKey.SetValue(string.Empty, $"&Open with {applicationName}", RegistryValueKind.String); + + try + { + openKey.CreateSubKey("command"); + } + catch (Exception) + { + + } + + using (var commandKey = openKey.OpenSubKey("command", true)) + { + commandKey.SetValue(string.Empty, $"\"{applicationPath}\" \"%1\"", RegistryValueKind.String); + } + } + } + } + + ShChangeNotify(); + + return true; + } + catch (Exception) + { + return false; + } + } + + public void UnregisterExtension(string fileExtension, string extensionId) + { + try + { + var classesRoot = Registry.ClassesRoot; + + classesRoot.DeleteSubKeyTree(fileExtension); + classesRoot.DeleteSubKeyTree(extensionId); + + ShChangeNotify(); + } + catch (Exception) + { + + } + } + + private static void ShChangeNotify() + { + try + { + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); + } + catch (Exception) + { + + } + } + + public static void SetButtonShield(Button button, bool setShield) + { + Contract.Requires(button != null); + + try + { + if (button.FlatStyle != FlatStyle.System) + { + button.FlatStyle = FlatStyle.System; + } + + var h = button.Handle; + if (h == IntPtr.Zero) + { + return; + } + + SendMessage(h, BCM_SETSHIELD, IntPtr.Zero, (IntPtr)(setShield ? 1 : 0)); + } + catch (Exception) + { + + } + } } } diff --git a/Native/NativeMethods.cs b/Native/NativeMethods.cs index ca5ac810..eee78100 100644 --- a/Native/NativeMethods.cs +++ b/Native/NativeMethods.cs @@ -83,6 +83,9 @@ public static void EnableDebugPrivileges() public static string UndecorateSymbolName(string name) { + Contract.Requires(name != null); + Contract.Ensures(Contract.Result() != null); + return nativeMethods.UndecorateSymbolName(name); } @@ -90,5 +93,23 @@ public static void SetProcessDpiAwareness() { nativeMethods.SetProcessDpiAwareness(); } + + public static bool RegisterExtension(string fileExtension, string extensionId, string applicationPath, string applicationName) + { + Contract.Requires(!string.IsNullOrEmpty(fileExtension)); + Contract.Requires(!string.IsNullOrEmpty(extensionId)); + Contract.Requires(applicationPath != null); + Contract.Requires(applicationName != null); + + return nativeMethods.RegisterExtension(fileExtension, extensionId, applicationPath, applicationName); + } + + public static void UnregisterExtension(string fileExtension, string extensionId) + { + Contract.Requires(!string.IsNullOrEmpty(fileExtension)); + Contract.Requires(!string.IsNullOrEmpty(extensionId)); + + nativeMethods.UnregisterExtension(fileExtension, extensionId); + } } } diff --git a/Program.cs b/Program.cs index f8a7e652..882a273b 100644 --- a/Program.cs +++ b/Program.cs @@ -4,16 +4,20 @@ using System.Windows.Forms; using Microsoft.SqlServer.MessageBox; using ReClassNET.Core; +using ReClassNET.DataExchange.ReClass; using ReClassNET.Forms; using ReClassNET.Logger; using ReClassNET.Memory; using ReClassNET.Native; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET { static class Program { + public static CommandLineArgs CommandLineArgs { get; private set; } + public static Settings Settings { get; private set; } public static ILogger Logger { get; private set; } @@ -31,10 +35,25 @@ static class Program public static FontEx MonoSpaceFont { get; private set; } [STAThread] - static void Main() + static void Main(string[] args) { DesignMode = false; // The designer doesn't call Main() + CommandLineArgs = new CommandLineArgs(args); + + if (CommandLineArgs[Constants.CommandLineOptions.FileExtRegister] != null) + { + NativeMethods.RegisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId, PathUtil.ExecutablePath, Constants.ApplicationName); + + return; + } + if (CommandLineArgs[Constants.CommandLineOptions.FileExtUnregister] != null) + { + NativeMethods.UnregisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId); + + return; + } + try { DpiUtil.ConfigureProcess(); @@ -58,7 +77,7 @@ static void Main() CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; - Settings = Settings.Load(Constants.SettingsFile); + Settings = Settings.Load(); Logger = new GuiLogger(); #if DEBUG using (var coreFunctions = new CoreFunctionsManager()) @@ -91,7 +110,7 @@ static void Main() } #endif - Settings.Save(Settings, Constants.SettingsFile); + Settings.Save(Settings); } /// Shows the exception in a special form. diff --git a/ReClass.NET.csproj b/ReClass.NET.csproj index ed289581..f8d3dee7 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET.csproj @@ -315,6 +315,7 @@ + @@ -449,6 +450,7 @@ + diff --git a/Settings.cs b/Settings.cs index 35ff40e2..359a7499 100644 --- a/Settings.cs +++ b/Settings.cs @@ -1,4 +1,5 @@ -using System.Diagnostics.Contracts; +using System; +using System.Diagnostics.Contracts; using System.Drawing; using System.IO; using System.Xml; @@ -10,15 +11,17 @@ namespace ReClassNET { public class Settings { - public static Settings Load(string filename) + public static Settings Load() { - Contract.Requires(!string.IsNullOrEmpty(filename)); + EnsureSettingsDirectoryAvailable(); try { - if (File.Exists(filename)) + var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); + + if (File.Exists(path)) { - using (var sr = new StreamReader(filename)) + using (var sr = new StreamReader(path)) { return (Settings)new XmlSerializer(typeof(Settings)).Deserialize(sr); } @@ -32,17 +35,35 @@ public static Settings Load(string filename) return new Settings(); } - public static void Save(Settings settings, string filename) + public static void Save(Settings settings) { Contract.Requires(settings != null); - Contract.Requires(!string.IsNullOrEmpty(filename)); - using (var sr = new StreamWriter(filename)) + EnsureSettingsDirectoryAvailable(); + + var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); + + using (var sr = new StreamWriter(path)) { new XmlSerializer(typeof(Settings)).Serialize(sr, settings); } } + private static void EnsureSettingsDirectoryAvailable() + { + try + { + if (Directory.Exists(PathUtil.SettingsFolderPath) == false) + { + Directory.CreateDirectory(PathUtil.SettingsFolderPath); + } + } + catch (Exception) + { + + } + } + // Application Settings public string LastProcess { get; set; } = string.Empty; diff --git a/Util/CommandLineArgs.cs b/Util/CommandLineArgs.cs new file mode 100644 index 00000000..2a22fc5a --- /dev/null +++ b/Util/CommandLineArgs.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace ReClassNET.Util +{ + public class CommandLineArgs + { + private readonly List fileNames = new List(); + private readonly SortedDictionary parms = new SortedDictionary(); + + /// + /// Get the primary file name. + /// + public string FileName => fileNames.Count < 1 ? null : fileNames[0]; + + /// + /// Gets all file names. + /// + public IEnumerable FileNames => fileNames; + + /// + /// Gets all provided parameters. + /// + public IEnumerable> Parameters => parms; + + public CommandLineArgs(string[] args) + { + if (args == null) + { + return; + } + + foreach (var str in args) + { + if (string.IsNullOrEmpty(str)) + { + continue; + } + + var kv = GetParameter(str); + if (kv.Key.Length == 0) + { + fileNames.Add(kv.Value); + } + else + { + parms[kv.Key] = kv.Value; + } + } + } + + /// + /// Get the value of a command line parameter. + /// + /// + /// Returns null if no parameter with the specified key exists. + /// + public string this[string strKey] + { + get + { + if (string.IsNullOrEmpty(strKey)) + { + return FileName; + } + + if (parms.TryGetValue(strKey.ToLower(), out var strValue)) + { + return strValue; + } + + return null; + } + } + + /// + /// Parses the parameter and extracts the key and value. + /// + /// The parameter string to parse. + /// + /// The parameter split in key and value. An empty key signals a file name. + /// + internal static KeyValuePair GetParameter(string str) + { + Contract.Requires(str != null); + + if (str.StartsWith("--")) + { + str = str.Remove(0, 2); + } + else if (str.StartsWith("-")) + { + str = str.Remove(0, 1); + } + else + { + return new KeyValuePair(string.Empty, str); + } + + var posColon = str.IndexOf(':'); + var posEqual = str.IndexOf('='); + + if (posColon < 0 && posEqual < 0) + { + return new KeyValuePair(str.ToLower(), string.Empty); + } + + var posMin = Math.Min(posColon, posEqual); + if (posMin < 0) + { + posMin = posColon < 0 ? posEqual : posColon; + } + + if (posMin <= 0) + { + return new KeyValuePair(str.ToLower(), string.Empty); + } + + var key = str.Substring(0, posMin).ToLower(); + var value = str.Remove(0, posMin + 1); + return new KeyValuePair(key, value); + } + } +} diff --git a/Util/PathUtil.cs b/Util/PathUtil.cs new file mode 100644 index 00000000..cb32593f --- /dev/null +++ b/Util/PathUtil.cs @@ -0,0 +1,91 @@ +using System; +using System.Diagnostics.Contracts; +using System.IO; +using System.Reflection; + +namespace ReClassNET.Util +{ + public class PathUtil + { + private static readonly Lazy executablePath = new Lazy(() => + { + string path = null; + try + { + path = Assembly.GetExecutingAssembly().Location; + } + catch (Exception) + { + + } + + if (string.IsNullOrEmpty(path)) + { + path = Assembly.GetExecutingAssembly().GetName().CodeBase; + path = FileUrlToPath(path); + } + + return path; + }); + + /// Gets the full pathname of the executable file. + public static string ExecutablePath => executablePath.Value; + + private static readonly Lazy executableFolderPath = new Lazy(() => Path.GetDirectoryName(executablePath.Value)); + + /// Gets the full pathname of the executable folder. + public static string ExecutableFolderPath => executableFolderPath.Value; + + private static readonly Lazy temporaryFolderPath = new Lazy(Path.GetTempPath); + + /// Gets the full pathname of the temporary folder. + /// %temp% + public static string TemporaryFolderPath => temporaryFolderPath.Value; + + private static readonly Lazy settingsFolderPath = new Lazy(() => + { + string applicationData; + try + { + applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + } + catch (Exception) + { + applicationData = executableFolderPath.Value; + } + + string localApplicationData; + try + { + localApplicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + } + catch (Exception) + { + localApplicationData = applicationData; + } + + return Path.Combine(localApplicationData, Constants.ApplicationName); + }); + + /// Gets the full pathname of the settings folder. + /// %localappdata%\ReClass.NET\ + public static string SettingsFolderPath => settingsFolderPath.Value; + + /// Converts a file url to a normal path. + /// URL of the file. + /// The path part of the URL. + public static string FileUrlToPath(string url) + { + Contract.Requires(url != null); + + if (url.StartsWith("file:///", StringComparison.OrdinalIgnoreCase)) + { + url = url.Substring(8, url.Length - 8); + } + + url = url.Replace('/', Path.DirectorySeparatorChar); + + return url; + } + } +} diff --git a/Util/WinUtil.cs b/Util/WinUtil.cs index fa697258..f01c0b07 100644 --- a/Util/WinUtil.cs +++ b/Util/WinUtil.cs @@ -1,4 +1,6 @@ using System; +using System.Diagnostics; +using System.Diagnostics.Contracts; using Microsoft.Win32; namespace ReClassNET.Util @@ -23,8 +25,8 @@ public static class WinUtil static WinUtil() { - OperatingSystem os = Environment.OSVersion; - Version v = os.Version; + var os = Environment.OSVersion; + var v = os.Version; IsWindows9x = os.Platform == PlatformID.Win32Windows; IsWindows2000 = v.Major == 5 && v.Minor == 0; @@ -32,18 +34,17 @@ static WinUtil() IsAtLeastWindows2000 = v.Major >= 5; IsAtLeastWindowsVista = v.Major >= 6; - IsAtLeastWindows7 = v.Major >= 7 || (v.Major == 6 && v.Minor >= 1); - IsAtLeastWindows8 = v.Major >= 7 || (v.Major == 6 && v.Minor >= 2); + IsAtLeastWindows7 = v.Major >= 7 || v.Major == 6 && v.Minor >= 1; + IsAtLeastWindows8 = v.Major >= 7 || v.Major == 6 && v.Minor >= 2; try { - using (var rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", false)) + using (var rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false)) { if (rk != null) { var str = rk.GetValue("CurrentMajorVersionNumber", string.Empty)?.ToString(); - uint u; - if (uint.TryParse(str, out u)) + if (uint.TryParse(str, out var u)) { IsAtLeastWindows10 = u >= 10; } @@ -55,5 +56,41 @@ static WinUtil() } } + + /// Executes the a process with elevated permissions. + /// The executable path. + /// The arguments. + /// True if it succeeds, false if it fails. + public static bool RunElevated(string applicationPath, string arguments) + { + Contract.Requires(applicationPath != null); + + try + { + var processStartInfo = new ProcessStartInfo + { + FileName = applicationPath, + UseShellExecute = true, + WindowStyle = ProcessWindowStyle.Normal + }; + if (arguments != null) + { + processStartInfo.Arguments = arguments; + } + + if (IsAtLeastWindowsVista) + { + processStartInfo.Verb = "runas"; + } + + Process.Start(processStartInfo); + } + catch (Exception) + { + return false; + } + + return true; + } } } From 53d7a4ee27a8abeed9dd02ea3dc5997140d702ae Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 21:47:16 +0200 Subject: [PATCH 152/777] Fixed platform position. --- Forms/MainForm.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index fe3327c7..96d74fd2 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -48,12 +48,12 @@ public MainForm() Program.RemoteProcess.ProcessAttached += sender => { - var text = $"{sender.UnderlayingProcess.Name} ({Constants.Platform}) (ID: {sender.UnderlayingProcess.Id.ToString()})"; + var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; - Text = $"{Constants.ApplicationName} - {text}"; + Text = $"{Constants.ApplicationName} ({Constants.Platform}) - {text}"; processInfoToolStripStatusLabel.Text = text; }; - Program.RemoteProcess.ProcessClosed += (sender) => + Program.RemoteProcess.ProcessClosed += sender => { Text = $"{Constants.ApplicationName} ({Constants.Platform})"; processInfoToolStripStatusLabel.Text = "No process selected"; From ccd0e9357c418cd9c55483f2556f6e42f658759b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 22:54:21 +0200 Subject: [PATCH 153/777] Added attach to process command line parameter. --- Constants.cs | 2 ++ Forms/MainForm.cs | 32 +++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Constants.cs b/Constants.cs index f1b44bd5..979c46d4 100644 --- a/Constants.cs +++ b/Constants.cs @@ -30,6 +30,8 @@ internal class Constants public static class CommandLineOptions { + public const string AttachTo = "attachto"; + public const string FileExtRegister = "registerfileext"; public const string FileExtUnregister = "unregisterfileext"; } diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs index 96d74fd2..35ee14ae 100644 --- a/Forms/MainForm.cs +++ b/Forms/MainForm.cs @@ -97,6 +97,11 @@ protected override void OnLoad(EventArgs e) LinkedWindowFeatures.CreateDefaultClass(); } + + if (Program.CommandLineArgs[Constants.CommandLineOptions.AttachTo] != null) + { + AttachToProcess(Program.CommandLineArgs[Constants.CommandLineOptions.AttachTo]); + } } protected override void OnFormClosed(FormClosedEventArgs e) @@ -180,17 +185,7 @@ private void reattachToProcessToolStripMenuItem_Click(object sender, EventArgs e return; } - var info = Program.CoreFunctions.EnumerateProcesses().FirstOrDefault(p => p.Name == lastProcess); - if (info == null) - { - MessageBox.Show($"Process '{lastProcess}' could not be found.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Error); - - Program.Settings.LastProcess = string.Empty; - } - else - { - AttachToProcess(info); - } + AttachToProcess(lastProcess); } private void detachToolStripMenuItem_Click(object sender, EventArgs e) @@ -532,6 +527,21 @@ private void memoryViewControl_SelectionChanged(object sender, EventArgs e) #endregion + public void AttachToProcess(string processName) + { + var info = Program.CoreFunctions.EnumerateProcesses().FirstOrDefault(p => string.Equals(p.Name, processName, StringComparison.OrdinalIgnoreCase)); + if (info == null) + { + MessageBox.Show($"Process '{processName}' could not be found.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Error); + + Program.Settings.LastProcess = string.Empty; + } + else + { + AttachToProcess(info); + } + } + public void AttachToProcess(ProcessInfo info) { Contract.Requires(info != null); From e277af127aad370ca0cec8e237033006174b77e6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 22:58:40 +0200 Subject: [PATCH 154/777] Moved project in subfolder (1). --- ReClass.NET.sln | 2 +- .../AddressParser}/AstBuilder.cs | 0 .../AddressParser}/Interpreter.cs | 0 .../AddressParser}/Operations.cs | 0 .../AddressParser}/ParseException.cs | 0 .../AddressParser}/Token.cs | 0 .../AddressParser}/TokenReader.cs | 0 App.config => ReClass.NET/App.config | 0 .../CodeGenerator}/CSharpCodeGenerator.cs | 296 +- .../CodeGenerator}/CppCodeGenerator.cs | 522 ++-- .../CodeGenerator}/CustomCodeGenerator.cs | 0 .../CodeGenerator}/ICodeGenerator.cs | 0 .../CodeGenerator}/Language.cs | 0 .../CodeGenerator}/MemberDefinition.cs | 0 Constants.cs => ReClass.NET/Constants.cs | 0 .../Core}/CoreFunctionsManager.cs | 0 {Core => ReClass.NET/Core}/DataExchange.cs | 0 .../Core}/ICoreProcessFunctions.cs | 0 .../Core}/InternalCoreFunctions.cs | 0 .../Core}/NativeCoreWrapper.cs | 0 .../ReClass/CustomNodeConverter.cs | 0 .../DataExchange}/ReClass/IReClassExport.cs | 0 .../DataExchange}/ReClass/IReClassImport.cs | 0 .../DataExchange}/ReClass/ReClass2007File.cs | 0 .../DataExchange}/ReClass/ReClassClipboard.cs | 0 .../DataExchange}/ReClass/ReClassFile.cs | 0 .../ReClass/ReClassNetFile.Read.cs | 0 .../ReClass/ReClassNetFile.Write.cs | 0 .../DataExchange}/ReClass/ReClassNetFile.cs | 0 .../DataExchange}/ReClass/ReClassQtFile.cs | 0 .../DataExchange}/Scanner/CheatEngineFile.cs | 0 .../DataExchange}/Scanner/CrySearchFile.cs | 0 .../DataExchange}/Scanner/IScannerExport.cs | 0 .../DataExchange}/Scanner/IScannerImport.cs | 0 .../DataExchange}/Scanner/ReClassScanFile.cs | 0 .../BreakpointAlreadySetException.cs | 0 .../Debugger}/DataExchange.cs | 0 .../Debugger}/HardwareBreakpoint.cs | 0 .../Debugger}/IBreakpoint.cs | 0 .../NoHardwareBreakpointAvailableException.cs | 0 .../Debugger}/RemoteDebugger.Extensions.cs | 0 .../Debugger}/RemoteDebugger.Handler.cs | 0 .../Debugger}/RemoteDebugger.Thread.cs | 0 .../Debugger}/RemoteDebugger.cs | 0 .../Debugger}/SoftwareBreakpoint.cs | 0 .../Forms}/AboutForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/AboutForm.cs | 0 {Forms => ReClass.NET/Forms}/AboutForm.resx | 0 .../Forms}/CodeForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/CodeForm.cs | 0 {Forms => ReClass.NET/Forms}/CodeForm.resx | 0 .../Forms}/FoundCodeForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/FoundCodeForm.cs | 0 .../Forms}/FoundCodeForm.resx | 0 {Forms => ReClass.NET/Forms}/IconForm.cs | 0 .../Forms}/InputBytesForm.Designer.cs | 0 .../Forms}/InputBytesForm.cs | 0 .../Forms}/InputBytesForm.resx | 0 .../Forms}/InputCorrelatorForm.Designer.cs | 0 .../Forms}/InputCorrelatorForm.cs | 0 .../Forms}/InputCorrelatorForm.resx | 0 .../Forms}/LogForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/LogForm.cs | 0 {Forms => ReClass.NET/Forms}/LogForm.resx | 0 .../Forms}/MainForm.Designer.cs | 2706 ++++++++--------- {Forms => ReClass.NET/Forms}/MainForm.cs | 0 {Forms => ReClass.NET/Forms}/MainForm.resx | 0 .../Forms}/PluginForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/PluginForm.cs | 0 {Forms => ReClass.NET/Forms}/PluginForm.resx | 0 .../Forms}/ProcessBrowserForm.Designer.cs | 0 .../Forms}/ProcessBrowserForm.cs | 0 .../Forms}/ProcessBrowserForm.resx | 0 .../Forms}/ProcessInfoForm.Designer.cs | 0 .../Forms}/ProcessInfoForm.cs | 0 .../Forms}/ProcessInfoForm.resx | 0 .../Forms}/ProcessMemoryViewForm.Designer.cs | 0 .../Forms}/ProcessMemoryViewForm.cs | 0 .../Forms}/ProcessMemoryViewForm.resx | 0 .../Forms}/ScannerForm.Designer.cs | 0 {Forms => ReClass.NET/Forms}/ScannerForm.cs | 0 {Forms => ReClass.NET/Forms}/ScannerForm.resx | 0 .../Forms}/SettingsForm.Designer.cs | 2444 +++++++-------- {Forms => ReClass.NET/Forms}/SettingsForm.cs | 390 +-- .../Forms}/SettingsForm.resx | 0 .../Input}/KeyboardHotkey.cs | 0 {Input => ReClass.NET/Input}/KeyboardInput.cs | 0 {Logger => ReClass.NET/Logger}/BaseLogger.cs | 0 {Logger => ReClass.NET/Logger}/GuiLogger.cs | 0 {Logger => ReClass.NET/Logger}/ILogger.cs | 0 {Logger => ReClass.NET/Logger}/LogLevel.cs | 0 {Logger => ReClass.NET/Logger}/NullLogger.cs | 0 .../Memory}/Disassembler.cs | 0 {Memory => ReClass.NET/Memory}/Dumper.cs | 0 .../Memory}/MemoryBuffer.cs | 0 {Memory => ReClass.NET/Memory}/Module.cs | 0 .../Memory}/NodeDissector.cs | 0 {Memory => ReClass.NET/Memory}/ProcessInfo.cs | 0 .../Memory}/RemoteProcess.cs | 0 {Memory => ReClass.NET/Memory}/Section.cs | 0 .../Memory}/UnionDataType.cs | 0 .../MemoryScanner}/BytePattern.cs | 0 .../Comparer/ArrayOfBytesMemoryComparer.cs | 0 .../Comparer/ByteMemoryComparer.cs | 0 .../Comparer/DoubleMemoryComparer.cs | 0 .../Comparer/FloatMemoryComparer.cs | 0 .../MemoryScanner}/Comparer/IScanComparer.cs | 0 .../Comparer/IntegerMemoryComparer.cs | 0 .../Comparer/InvalidCompareTypeException.cs | 0 .../Comparer/LongMemoryComparer.cs | 0 .../Comparer/ShortMemoryComparer.cs | 0 .../Comparer/StringMemoryComparer.cs | 0 .../MemoryScanner}/InputCorrelatedScanner.cs | 0 .../MemoryScanner}/MemoryRecord.cs | 0 .../MemoryScanner}/ScanCompareType.cs | 0 .../MemoryScanner}/ScanResult.cs | 0 .../MemoryScanner}/ScanResultBlock.cs | 0 .../MemoryScanner}/ScanResultStore.cs | 0 .../MemoryScanner}/ScanRoundMode.cs | 0 .../MemoryScanner}/ScanSettings.cs | 0 .../MemoryScanner}/ScanValueType.cs | 0 .../MemoryScanner}/Scanner.cs | 0 .../MemoryScanner}/ScannerContext.cs | 0 .../MemoryScanner}/ScannerWorker.cs | 0 .../Native}/INativeMethods.cs | 0 .../Native}/NativeMethods.Unix.cs | 0 .../Native}/NativeMethods.Windows.cs | 0 .../Native}/NativeMethods.cs | 0 {Nodes => ReClass.NET/Nodes}/BaseArrayNode.cs | 0 .../Nodes}/BaseContainerNode.cs | 0 .../Nodes}/BaseFunctionNode.cs | 0 .../Nodes}/BaseFunctionPtrNode.cs | 0 .../Nodes}/BaseHexCommentNode.cs | 0 {Nodes => ReClass.NET/Nodes}/BaseHexNode.cs | 0 .../Nodes}/BaseMatrixNode.cs | 0 {Nodes => ReClass.NET/Nodes}/BaseNode.cs | 0 .../Nodes}/BaseNumericNode.cs | 0 .../Nodes}/BaseReferenceNode.cs | 0 {Nodes => ReClass.NET/Nodes}/BaseTextNode.cs | 0 .../Nodes}/BaseTextPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/BitFieldNode.cs | 0 {Nodes => ReClass.NET/Nodes}/BoolNode.cs | 136 +- .../Nodes}/ClassInstanceArrayNode.cs | 0 .../Nodes}/ClassInstanceNode.cs | 0 {Nodes => ReClass.NET/Nodes}/ClassNode.cs | 0 .../Nodes}/ClassPtrArrayNode.cs | 0 {Nodes => ReClass.NET/Nodes}/ClassPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/ClassUtil.cs | 0 {Nodes => ReClass.NET/Nodes}/DoubleNode.cs | 0 {Nodes => ReClass.NET/Nodes}/FloatNode.cs | 0 .../Nodes}/FunctionNode.Tokenizer.cs | 0 {Nodes => ReClass.NET/Nodes}/FunctionNode.cs | 0 .../Nodes}/FunctionPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/Hex16Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Hex32Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Hex64Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Hex8Node.cs | 0 .../Nodes}/INodeInfoReader.cs | 0 {Nodes => ReClass.NET/Nodes}/Int16Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Int32Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Int64Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Int8Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Matrix3x3Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Matrix3x4Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Matrix4x4Node.cs | 0 {Nodes => ReClass.NET/Nodes}/NodeUuid.cs | 0 {Nodes => ReClass.NET/Nodes}/UInt16Node.cs | 0 {Nodes => ReClass.NET/Nodes}/UInt32Node.cs | 0 {Nodes => ReClass.NET/Nodes}/UInt64Node.cs | 0 {Nodes => ReClass.NET/Nodes}/UInt8Node.cs | 0 {Nodes => ReClass.NET/Nodes}/UTF16TextNode.cs | 0 .../Nodes}/UTF16TextPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/UTF32TextNode.cs | 0 .../Nodes}/UTF32TextPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/UTF8TextNode.cs | 0 .../Nodes}/UTF8TextPtrNode.cs | 0 {Nodes => ReClass.NET/Nodes}/VMethodNode.cs | 0 {Nodes => ReClass.NET/Nodes}/VTableNode.cs | 0 {Nodes => ReClass.NET/Nodes}/Vector2Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Vector3Node.cs | 0 {Nodes => ReClass.NET/Nodes}/Vector4Node.cs | 0 .../Plugins}/DefaultPluginHost.cs | 0 .../Plugins}/IPluginHost.cs | 0 {Plugins => ReClass.NET/Plugins}/Plugin.cs | 0 .../Plugins}/PluginInfo.cs | 0 .../Plugins}/PluginManager.cs | 0 Program.cs => ReClass.NET/Program.cs | 0 .../Properties}/AssemblyInfo.cs | 0 .../Properties}/Resources.Designer.cs | 2646 ++++++++-------- .../Properties}/Resources.resx | 996 +++--- .../Properties}/Settings.Designer.cs | 0 .../Properties}/Settings.settings | 0 .../ReClass.NET.csproj | 1876 ++++++------ .../ReClassNetProject.cs | 0 ReClass.NET/Resources/BuildDate.txt | Bin 0 -> 44 bytes .../Resources}/Icon/ReClassNet.ico | Bin .../Resources}/Icon/icon.pdn | 0 .../Resources}/Icon/icon_128.png | Bin .../Resources}/Icon/icon_16.png | Bin .../Resources}/Icon/icon_256.png | Bin .../Resources}/Icon/icon_32.png | Bin .../Resources}/Icon/icon_48.png | Bin .../Resources}/Icon/icon_64.png | Bin .../Resources}/Icon/icon_96.png | Bin .../Resources}/Images/B16x16_Accept.png | Bin .../Resources}/Images/B16x16_Array_Type.png | Bin .../Images/B16x16_Arrow_Refresh.png | Bin .../Images/B16x16_Button_Add_Bytes_1024.png | Bin .../Images/B16x16_Button_Add_Bytes_2048.png | Bin .../Images/B16x16_Button_Add_Bytes_256.png | Bin .../Images/B16x16_Button_Add_Bytes_4.png | Bin .../Images/B16x16_Button_Add_Bytes_4096.png | Bin .../Images/B16x16_Button_Add_Bytes_64.png | Bin .../Images/B16x16_Button_Add_Bytes_8.png | Bin .../Images/B16x16_Button_Add_Bytes_X.png | Bin .../Resources}/Images/B16x16_Button_Array.png | Bin .../Resources}/Images/B16x16_Button_Bits.png | Bin .../Resources}/Images/B16x16_Button_Bool.png | Bin .../Images/B16x16_Button_Class_Add.png | Bin .../Images/B16x16_Button_Class_Instance.png | Bin .../Images/B16x16_Button_Class_Pointer.png | Bin .../Images/B16x16_Button_Class_Remove.png | Bin .../Images/B16x16_Button_Delete.png | Bin .../Images/B16x16_Button_Double.png | Bin .../Images/B16x16_Button_Drop_Down.png | Bin .../Resources}/Images/B16x16_Button_Float.png | Bin .../Images/B16x16_Button_Function.png | Bin .../Images/B16x16_Button_Function_Pointer.png | Bin .../Images/B16x16_Button_Hex_16.png | Bin .../Images/B16x16_Button_Hex_32.png | Bin .../Images/B16x16_Button_Hex_64.png | Bin .../Resources}/Images/B16x16_Button_Hex_8.png | Bin .../B16x16_Button_Insert_Bytes_1024.png | Bin .../B16x16_Button_Insert_Bytes_2048.png | Bin .../Images/B16x16_Button_Insert_Bytes_256.png | Bin .../Images/B16x16_Button_Insert_Bytes_4.png | Bin .../B16x16_Button_Insert_Bytes_4096.png | Bin .../Images/B16x16_Button_Insert_Bytes_64.png | Bin .../Images/B16x16_Button_Insert_Bytes_8.png | Bin .../Images/B16x16_Button_Insert_Bytes_X.png | Bin .../Images/B16x16_Button_Int_16.png | Bin .../Images/B16x16_Button_Int_32.png | Bin .../Images/B16x16_Button_Int_64.png | Bin .../Resources}/Images/B16x16_Button_Int_8.png | Bin .../Images/B16x16_Button_Matrix_3x3.png | Bin .../Images/B16x16_Button_Matrix_3x4.png | Bin .../Images/B16x16_Button_Matrix_4x4.png | Bin .../Images/B16x16_Button_Pointer_Array.png | Bin .../Resources}/Images/B16x16_Button_Text.png | Bin .../Images/B16x16_Button_Text_Pointer.png | Bin .../Images/B16x16_Button_UInt_16.png | Bin .../Images/B16x16_Button_UInt_32.png | Bin .../Images/B16x16_Button_UInt_64.png | Bin .../Images/B16x16_Button_UInt_8.png | Bin .../Resources}/Images/B16x16_Button_UText.png | Bin .../Images/B16x16_Button_UText_Pointer.png | Bin .../Images/B16x16_Button_VTable.png | Bin .../Images/B16x16_Button_Vector_2.png | Bin .../Images/B16x16_Button_Vector_3.png | Bin .../Images/B16x16_Button_Vector_4.png | Bin .../Resources}/Images/B16x16_Camera.png | Bin .../Resources}/Images/B16x16_Canvas_Size.png | Bin .../Resources}/Images/B16x16_Category.png | Bin .../Resources}/Images/B16x16_Chart_Delete.png | Bin .../Resources}/Images/B16x16_Class_Type.png | Bin .../Resources}/Images/B16x16_Closed_Icon.png | Bin .../Resources}/Images/B16x16_Cogs.png | Bin .../Resources}/Images/B16x16_Color_Wheel.png | Bin .../Images/B16x16_Control_Pause.png | Bin .../Resources}/Images/B16x16_Control_Play.png | Bin .../Resources}/Images/B16x16_Control_Stop.png | Bin .../Resources}/Images/B16x16_Custom_Type.png | Bin .../Resources}/Images/B16x16_Double_Type.png | Bin .../Resources}/Images/B16x16_Drive_Go.png | Bin .../Resources}/Images/B16x16_Enum_Type.png | Bin .../Resources}/Images/B16x16_Error.png | Bin .../Images/B16x16_Exchange_Button.png | Bin .../Resources}/Images/B16x16_Eye.png | Bin .../Resources}/Images/B16x16_Find_Access.png | Bin .../Resources}/Images/B16x16_Find_Write.png | Bin .../Resources}/Images/B16x16_Float_Type.png | Bin .../Resources}/Images/B16x16_Folder.png | Bin .../Resources}/Images/B16x16_Folder_Add.png | Bin .../Images/B16x16_Function_Type.png | Bin .../Resources}/Images/B16x16_Gear.png | Bin .../Resources}/Images/B16x16_Help.png | Bin .../Resources}/Images/B16x16_Information.png | Bin .../Images/B16x16_Interface_Type.png | Bin .../Resources}/Images/B16x16_Left_Button.png | Bin .../Resources}/Images/B16x16_Magnifier.png | Bin .../Images/B16x16_Magnifier_Arrow.png | Bin .../Images/B16x16_Magnifier_Remove.png | Bin .../Resources}/Images/B16x16_Matrix_Type.png | Bin .../Resources}/Images/B16x16_Open_Icon.png | Bin .../Resources}/Images/B16x16_Page_Code.png | Bin .../Images/B16x16_Page_Code_Add.png | Bin .../Images/B16x16_Page_Code_Cpp.png | Bin .../Images/B16x16_Page_Code_Csharp.png | Bin .../Resources}/Images/B16x16_Page_Copy.png | Bin .../Resources}/Images/B16x16_Page_Paste.png | Bin .../Images/B16x16_Page_White_Stack.png | Bin .../Resources}/Images/B16x16_Pdb.png | Bin .../Resources}/Images/B16x16_Plugin.png | Bin .../Resources}/Images/B16x16_Pointer_Type.png | Bin .../Resources}/Images/B16x16_Quit.png | Bin .../Resources}/Images/B16x16_Redo.png | Bin .../Resources}/Images/B16x16_Right_Button.png | Bin .../Resources}/Images/B16x16_Save.png | Bin .../Resources}/Images/B16x16_Save_As.png | Bin .../Images/B16x16_Settings_Edit.png | Bin .../Resources}/Images/B16x16_Signed_Type.png | Bin .../Resources}/Images/B16x16_Table_Gear.png | Bin .../Images/B16x16_Text_List_Bullets.png | Bin .../Resources}/Images/B16x16_Text_Type.png | Bin .../Images/B16x16_Textfield_Rename.png | Bin .../Images/B16x16_Tree_Collapse.png | Bin .../Resources}/Images/B16x16_Tree_Expand.png | Bin .../Resources}/Images/B16x16_Undo.png | Bin .../Images/B16x16_Unsigned_Type.png | Bin .../Resources}/Images/B16x16_Vector_Type.png | Bin .../Resources}/Images/B16x16_Warning.png | Bin .../Resources}/Images/B32x32_3D_Glasses.png | Bin .../Resources}/Images/B32x32_Bug.png | Bin .../Resources}/Images/B32x32_Canvas_Size.png | Bin .../Resources}/Images/B32x32_Cogs.png | Bin .../Resources}/Images/B32x32_Eye.png | Bin .../Resources}/Images/B32x32_Magnifier.png | Bin .../Resources}/Images/B32x32_Page_Code.png | Bin .../Resources}/Images/B32x32_Plugin.png | Bin Settings.cs => ReClass.NET/Settings.cs | 484 +-- .../Symbols}/ComDisposableWrapper.cs | 0 .../Symbols}/SymbolReader.cs | 0 .../Symbols}/SymbolStore.cs | 0 {UI => ReClass.NET/UI}/BannerBox.cs | 0 {UI => ReClass.NET/UI}/BannerFactory.cs | 0 .../UI}/ClassNodeView.Designer.cs | 0 {UI => ReClass.NET/UI}/ClassNodeView.cs | 0 {UI => ReClass.NET/UI}/ClassNodeView.resx | 0 {UI => ReClass.NET/UI}/ColorBox.Designer.cs | 0 {UI => ReClass.NET/UI}/ColorBox.cs | 0 {UI => ReClass.NET/UI}/ColorBox.resx | 0 .../UI}/CustomToolStripItems.cs | 0 .../CustomToolStripProfessionalRenderer.cs | 0 {UI => ReClass.NET/UI}/DpiUtil.cs | 0 .../UI}/DualValueBox.Designer.cs | 0 {UI => ReClass.NET/UI}/DualValueBox.cs | 0 {UI => ReClass.NET/UI}/DualValueBox.resx | 0 .../UI}/EnumDescriptionDisplay.cs | 0 {UI => ReClass.NET/UI}/FontEx.cs | 0 {UI => ReClass.NET/UI}/GlobalWindowManager.cs | 0 {UI => ReClass.NET/UI}/HotSpot.cs | 0 {UI => ReClass.NET/UI}/HotSpotTextBox.cs | 0 {UI => ReClass.NET/UI}/HotkeyBox.Designer.cs | 0 {UI => ReClass.NET/UI}/HotkeyBox.cs | 0 {UI => ReClass.NET/UI}/HotkeyBox.resx | 0 {UI => ReClass.NET/UI}/ISettingsBindable.cs | 0 {UI => ReClass.NET/UI}/IconButton.cs | 0 {UI => ReClass.NET/UI}/Icons.cs | 0 .../UI}/LinkedWindowFeatures.cs | 0 {UI => ReClass.NET/UI}/MemoryPreviewPopUp.cs | 0 .../UI}/MemoryRecordList.Designer.cs | 0 {UI => ReClass.NET/UI}/MemoryRecordList.cs | 0 {UI => ReClass.NET/UI}/MemoryRecordList.resx | 0 .../UI}/MemoryViewControl.Designer.cs | 1844 +++++------ {UI => ReClass.NET/UI}/MemoryViewControl.cs | 0 {UI => ReClass.NET/UI}/MemoryViewControl.resx | 0 .../UI}/ScrollableCustomControl.cs | 0 {UI => ReClass.NET/UI}/SettingsCheckBox.cs | 0 {UI => ReClass.NET/UI}/SettingsTextBox.cs | 0 {UI => ReClass.NET/UI}/ViewInfo.cs | 0 {Util => ReClass.NET/Util}/CircularBuffer.cs | 0 {Util => ReClass.NET/Util}/CommandLineArgs.cs | 0 .../Util}/Extension.BinaryReaderWriter.cs | 0 .../Util}/Extension.DataGridView.cs | 0 .../Util}/Extension.Dictionary.cs | 0 .../Util}/Extension.Encoding.cs | 0 .../Util}/Extension.FloatingPoint.cs | 0 .../Util}/Extension.Graphics.cs | 0 .../Util}/Extension.IntPtr.cs | 0 {Util => ReClass.NET/Util}/Extension.Linq.cs | 0 .../Util}/Extension.RichTextBox.cs | 0 {Util => ReClass.NET/Util}/Extension.Size.cs | 0 .../Util}/Extension.String.cs | 0 .../Util}/Extension.StringReader.cs | 0 {Util => ReClass.NET/Util}/Extensions.cs | 0 {Util => ReClass.NET/Util}/GrowingList.cs | 0 {Util => ReClass.NET/Util}/IntPtrComparer.cs | 0 {Util => ReClass.NET/Util}/PathUtil.cs | 0 .../Util}/Rtf/RtfBuilder.RtfFormatLock.cs | 0 .../Util}/Rtf/RtfBuilder.RtfFormatWrapper.cs | 0 {Util => ReClass.NET/Util}/Rtf/RtfBuilder.cs | 0 {Util => ReClass.NET/Util}/Rtf/RtfFont.cs | 0 {Util => ReClass.NET/Util}/Util.cs | 0 .../Util}/ValueTypeWrapper.cs | 0 {Util => ReClass.NET/Util}/WinUtil.cs | 0 .../packages.config | 0 396 files changed, 7171 insertions(+), 7171 deletions(-) rename {AddressParser => ReClass.NET/AddressParser}/AstBuilder.cs (100%) rename {AddressParser => ReClass.NET/AddressParser}/Interpreter.cs (100%) rename {AddressParser => ReClass.NET/AddressParser}/Operations.cs (100%) rename {AddressParser => ReClass.NET/AddressParser}/ParseException.cs (100%) rename {AddressParser => ReClass.NET/AddressParser}/Token.cs (100%) rename {AddressParser => ReClass.NET/AddressParser}/TokenReader.cs (100%) rename App.config => ReClass.NET/App.config (100%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/CSharpCodeGenerator.cs (96%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/CppCodeGenerator.cs (96%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/CustomCodeGenerator.cs (100%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/ICodeGenerator.cs (100%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/Language.cs (100%) rename {CodeGenerator => ReClass.NET/CodeGenerator}/MemberDefinition.cs (100%) rename Constants.cs => ReClass.NET/Constants.cs (100%) rename {Core => ReClass.NET/Core}/CoreFunctionsManager.cs (100%) rename {Core => ReClass.NET/Core}/DataExchange.cs (100%) rename {Core => ReClass.NET/Core}/ICoreProcessFunctions.cs (100%) rename {Core => ReClass.NET/Core}/InternalCoreFunctions.cs (100%) rename {Core => ReClass.NET/Core}/NativeCoreWrapper.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/CustomNodeConverter.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/IReClassExport.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/IReClassImport.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClass2007File.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassClipboard.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassFile.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassNetFile.Read.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassNetFile.Write.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassNetFile.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/ReClass/ReClassQtFile.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/Scanner/CheatEngineFile.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/Scanner/CrySearchFile.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/Scanner/IScannerExport.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/Scanner/IScannerImport.cs (100%) rename {DataExchange => ReClass.NET/DataExchange}/Scanner/ReClassScanFile.cs (100%) rename {Debugger => ReClass.NET/Debugger}/BreakpointAlreadySetException.cs (100%) rename {Debugger => ReClass.NET/Debugger}/DataExchange.cs (100%) rename {Debugger => ReClass.NET/Debugger}/HardwareBreakpoint.cs (100%) rename {Debugger => ReClass.NET/Debugger}/IBreakpoint.cs (100%) rename {Debugger => ReClass.NET/Debugger}/NoHardwareBreakpointAvailableException.cs (100%) rename {Debugger => ReClass.NET/Debugger}/RemoteDebugger.Extensions.cs (100%) rename {Debugger => ReClass.NET/Debugger}/RemoteDebugger.Handler.cs (100%) rename {Debugger => ReClass.NET/Debugger}/RemoteDebugger.Thread.cs (100%) rename {Debugger => ReClass.NET/Debugger}/RemoteDebugger.cs (100%) rename {Debugger => ReClass.NET/Debugger}/SoftwareBreakpoint.cs (100%) rename {Forms => ReClass.NET/Forms}/AboutForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/AboutForm.cs (100%) rename {Forms => ReClass.NET/Forms}/AboutForm.resx (100%) rename {Forms => ReClass.NET/Forms}/CodeForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/CodeForm.cs (100%) rename {Forms => ReClass.NET/Forms}/CodeForm.resx (100%) rename {Forms => ReClass.NET/Forms}/FoundCodeForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/FoundCodeForm.cs (100%) rename {Forms => ReClass.NET/Forms}/FoundCodeForm.resx (100%) rename {Forms => ReClass.NET/Forms}/IconForm.cs (100%) rename {Forms => ReClass.NET/Forms}/InputBytesForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/InputBytesForm.cs (100%) rename {Forms => ReClass.NET/Forms}/InputBytesForm.resx (100%) rename {Forms => ReClass.NET/Forms}/InputCorrelatorForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/InputCorrelatorForm.cs (100%) rename {Forms => ReClass.NET/Forms}/InputCorrelatorForm.resx (100%) rename {Forms => ReClass.NET/Forms}/LogForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/LogForm.cs (100%) rename {Forms => ReClass.NET/Forms}/LogForm.resx (100%) rename {Forms => ReClass.NET/Forms}/MainForm.Designer.cs (98%) rename {Forms => ReClass.NET/Forms}/MainForm.cs (100%) rename {Forms => ReClass.NET/Forms}/MainForm.resx (100%) rename {Forms => ReClass.NET/Forms}/PluginForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/PluginForm.cs (100%) rename {Forms => ReClass.NET/Forms}/PluginForm.resx (100%) rename {Forms => ReClass.NET/Forms}/ProcessBrowserForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessBrowserForm.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessBrowserForm.resx (100%) rename {Forms => ReClass.NET/Forms}/ProcessInfoForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessInfoForm.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessInfoForm.resx (100%) rename {Forms => ReClass.NET/Forms}/ProcessMemoryViewForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessMemoryViewForm.cs (100%) rename {Forms => ReClass.NET/Forms}/ProcessMemoryViewForm.resx (100%) rename {Forms => ReClass.NET/Forms}/ScannerForm.Designer.cs (100%) rename {Forms => ReClass.NET/Forms}/ScannerForm.cs (100%) rename {Forms => ReClass.NET/Forms}/ScannerForm.resx (100%) rename {Forms => ReClass.NET/Forms}/SettingsForm.Designer.cs (97%) rename {Forms => ReClass.NET/Forms}/SettingsForm.cs (97%) rename {Forms => ReClass.NET/Forms}/SettingsForm.resx (100%) rename {Input => ReClass.NET/Input}/KeyboardHotkey.cs (100%) rename {Input => ReClass.NET/Input}/KeyboardInput.cs (100%) rename {Logger => ReClass.NET/Logger}/BaseLogger.cs (100%) rename {Logger => ReClass.NET/Logger}/GuiLogger.cs (100%) rename {Logger => ReClass.NET/Logger}/ILogger.cs (100%) rename {Logger => ReClass.NET/Logger}/LogLevel.cs (100%) rename {Logger => ReClass.NET/Logger}/NullLogger.cs (100%) rename {Memory => ReClass.NET/Memory}/Disassembler.cs (100%) rename {Memory => ReClass.NET/Memory}/Dumper.cs (100%) rename {Memory => ReClass.NET/Memory}/MemoryBuffer.cs (100%) rename {Memory => ReClass.NET/Memory}/Module.cs (100%) rename {Memory => ReClass.NET/Memory}/NodeDissector.cs (100%) rename {Memory => ReClass.NET/Memory}/ProcessInfo.cs (100%) rename {Memory => ReClass.NET/Memory}/RemoteProcess.cs (100%) rename {Memory => ReClass.NET/Memory}/Section.cs (100%) rename {Memory => ReClass.NET/Memory}/UnionDataType.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/BytePattern.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/ArrayOfBytesMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/ByteMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/DoubleMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/FloatMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/IScanComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/IntegerMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/InvalidCompareTypeException.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/LongMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/ShortMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Comparer/StringMemoryComparer.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/InputCorrelatedScanner.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/MemoryRecord.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanCompareType.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanResult.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanResultBlock.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanResultStore.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanRoundMode.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanSettings.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScanValueType.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/Scanner.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScannerContext.cs (100%) rename {MemoryScanner => ReClass.NET/MemoryScanner}/ScannerWorker.cs (100%) rename {Native => ReClass.NET/Native}/INativeMethods.cs (100%) rename {Native => ReClass.NET/Native}/NativeMethods.Unix.cs (100%) rename {Native => ReClass.NET/Native}/NativeMethods.Windows.cs (100%) rename {Native => ReClass.NET/Native}/NativeMethods.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseArrayNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseContainerNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseFunctionNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseFunctionPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseHexCommentNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseHexNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseMatrixNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseNumericNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseReferenceNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseTextNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BaseTextPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BitFieldNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/BoolNode.cs (96%) rename {Nodes => ReClass.NET/Nodes}/ClassInstanceArrayNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/ClassInstanceNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/ClassNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/ClassPtrArrayNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/ClassPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/ClassUtil.cs (100%) rename {Nodes => ReClass.NET/Nodes}/DoubleNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/FloatNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/FunctionNode.Tokenizer.cs (100%) rename {Nodes => ReClass.NET/Nodes}/FunctionNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/FunctionPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Hex16Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Hex32Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Hex64Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Hex8Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/INodeInfoReader.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Int16Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Int32Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Int64Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Int8Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Matrix3x3Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Matrix3x4Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Matrix4x4Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/NodeUuid.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UInt16Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UInt32Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UInt64Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UInt8Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF16TextNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF16TextPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF32TextNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF32TextPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF8TextNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/UTF8TextPtrNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/VMethodNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/VTableNode.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Vector2Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Vector3Node.cs (100%) rename {Nodes => ReClass.NET/Nodes}/Vector4Node.cs (100%) rename {Plugins => ReClass.NET/Plugins}/DefaultPluginHost.cs (100%) rename {Plugins => ReClass.NET/Plugins}/IPluginHost.cs (100%) rename {Plugins => ReClass.NET/Plugins}/Plugin.cs (100%) rename {Plugins => ReClass.NET/Plugins}/PluginInfo.cs (100%) rename {Plugins => ReClass.NET/Plugins}/PluginManager.cs (100%) rename Program.cs => ReClass.NET/Program.cs (100%) rename {Properties => ReClass.NET/Properties}/AssemblyInfo.cs (100%) rename {Properties => ReClass.NET/Properties}/Resources.Designer.cs (97%) rename {Properties => ReClass.NET/Properties}/Resources.resx (98%) rename {Properties => ReClass.NET/Properties}/Settings.Designer.cs (100%) rename {Properties => ReClass.NET/Properties}/Settings.settings (100%) rename ReClass.NET.csproj => ReClass.NET/ReClass.NET.csproj (97%) rename ReClassNetProject.cs => ReClass.NET/ReClassNetProject.cs (100%) create mode 100644 ReClass.NET/Resources/BuildDate.txt rename {Resources => ReClass.NET/Resources}/Icon/ReClassNet.ico (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon.pdn (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_128.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_16.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_256.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_32.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_48.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_64.png (100%) rename {Resources => ReClass.NET/Resources}/Icon/icon_96.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Accept.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Array_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Arrow_Refresh.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_1024.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_2048.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_256.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_4.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_4096.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_64.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_8.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Add_Bytes_X.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Array.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Bits.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Bool.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Class_Add.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Class_Instance.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Class_Pointer.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Class_Remove.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Delete.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Double.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Drop_Down.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Float.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Function.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Function_Pointer.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Hex_16.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Hex_32.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Hex_64.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Hex_8.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_1024.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_2048.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_256.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_4.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_4096.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_64.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_8.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Insert_Bytes_X.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Int_16.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Int_32.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Int_64.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Int_8.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Matrix_3x3.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Matrix_3x4.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Matrix_4x4.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Pointer_Array.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Text.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Text_Pointer.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UInt_16.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UInt_32.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UInt_64.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UInt_8.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UText.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_UText_Pointer.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_VTable.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Vector_2.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Vector_3.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Button_Vector_4.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Camera.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Canvas_Size.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Category.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Chart_Delete.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Class_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Closed_Icon.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Cogs.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Color_Wheel.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Control_Pause.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Control_Play.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Control_Stop.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Custom_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Double_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Drive_Go.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Enum_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Error.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Exchange_Button.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Eye.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Find_Access.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Find_Write.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Float_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Folder.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Folder_Add.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Function_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Gear.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Help.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Information.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Interface_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Left_Button.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Magnifier.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Magnifier_Arrow.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Magnifier_Remove.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Matrix_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Open_Icon.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Code.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Code_Add.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Code_Cpp.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Code_Csharp.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Copy.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_Paste.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Page_White_Stack.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Pdb.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Plugin.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Pointer_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Quit.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Redo.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Right_Button.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Save.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Save_As.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Settings_Edit.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Signed_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Table_Gear.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Text_List_Bullets.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Text_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Textfield_Rename.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Tree_Collapse.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Tree_Expand.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Undo.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Unsigned_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Vector_Type.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B16x16_Warning.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_3D_Glasses.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Bug.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Canvas_Size.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Cogs.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Eye.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Magnifier.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Page_Code.png (100%) rename {Resources => ReClass.NET/Resources}/Images/B32x32_Plugin.png (100%) rename Settings.cs => ReClass.NET/Settings.cs (96%) rename {Symbols => ReClass.NET/Symbols}/ComDisposableWrapper.cs (100%) rename {Symbols => ReClass.NET/Symbols}/SymbolReader.cs (100%) rename {Symbols => ReClass.NET/Symbols}/SymbolStore.cs (100%) rename {UI => ReClass.NET/UI}/BannerBox.cs (100%) rename {UI => ReClass.NET/UI}/BannerFactory.cs (100%) rename {UI => ReClass.NET/UI}/ClassNodeView.Designer.cs (100%) rename {UI => ReClass.NET/UI}/ClassNodeView.cs (100%) rename {UI => ReClass.NET/UI}/ClassNodeView.resx (100%) rename {UI => ReClass.NET/UI}/ColorBox.Designer.cs (100%) rename {UI => ReClass.NET/UI}/ColorBox.cs (100%) rename {UI => ReClass.NET/UI}/ColorBox.resx (100%) rename {UI => ReClass.NET/UI}/CustomToolStripItems.cs (100%) rename {UI => ReClass.NET/UI}/CustomToolStripProfessionalRenderer.cs (100%) rename {UI => ReClass.NET/UI}/DpiUtil.cs (100%) rename {UI => ReClass.NET/UI}/DualValueBox.Designer.cs (100%) rename {UI => ReClass.NET/UI}/DualValueBox.cs (100%) rename {UI => ReClass.NET/UI}/DualValueBox.resx (100%) rename {UI => ReClass.NET/UI}/EnumDescriptionDisplay.cs (100%) rename {UI => ReClass.NET/UI}/FontEx.cs (100%) rename {UI => ReClass.NET/UI}/GlobalWindowManager.cs (100%) rename {UI => ReClass.NET/UI}/HotSpot.cs (100%) rename {UI => ReClass.NET/UI}/HotSpotTextBox.cs (100%) rename {UI => ReClass.NET/UI}/HotkeyBox.Designer.cs (100%) rename {UI => ReClass.NET/UI}/HotkeyBox.cs (100%) rename {UI => ReClass.NET/UI}/HotkeyBox.resx (100%) rename {UI => ReClass.NET/UI}/ISettingsBindable.cs (100%) rename {UI => ReClass.NET/UI}/IconButton.cs (100%) rename {UI => ReClass.NET/UI}/Icons.cs (100%) rename {UI => ReClass.NET/UI}/LinkedWindowFeatures.cs (100%) rename {UI => ReClass.NET/UI}/MemoryPreviewPopUp.cs (100%) rename {UI => ReClass.NET/UI}/MemoryRecordList.Designer.cs (100%) rename {UI => ReClass.NET/UI}/MemoryRecordList.cs (100%) rename {UI => ReClass.NET/UI}/MemoryRecordList.resx (100%) rename {UI => ReClass.NET/UI}/MemoryViewControl.Designer.cs (98%) rename {UI => ReClass.NET/UI}/MemoryViewControl.cs (100%) rename {UI => ReClass.NET/UI}/MemoryViewControl.resx (100%) rename {UI => ReClass.NET/UI}/ScrollableCustomControl.cs (100%) rename {UI => ReClass.NET/UI}/SettingsCheckBox.cs (100%) rename {UI => ReClass.NET/UI}/SettingsTextBox.cs (100%) rename {UI => ReClass.NET/UI}/ViewInfo.cs (100%) rename {Util => ReClass.NET/Util}/CircularBuffer.cs (100%) rename {Util => ReClass.NET/Util}/CommandLineArgs.cs (100%) rename {Util => ReClass.NET/Util}/Extension.BinaryReaderWriter.cs (100%) rename {Util => ReClass.NET/Util}/Extension.DataGridView.cs (100%) rename {Util => ReClass.NET/Util}/Extension.Dictionary.cs (100%) rename {Util => ReClass.NET/Util}/Extension.Encoding.cs (100%) rename {Util => ReClass.NET/Util}/Extension.FloatingPoint.cs (100%) rename {Util => ReClass.NET/Util}/Extension.Graphics.cs (100%) rename {Util => ReClass.NET/Util}/Extension.IntPtr.cs (100%) rename {Util => ReClass.NET/Util}/Extension.Linq.cs (100%) rename {Util => ReClass.NET/Util}/Extension.RichTextBox.cs (100%) rename {Util => ReClass.NET/Util}/Extension.Size.cs (100%) rename {Util => ReClass.NET/Util}/Extension.String.cs (100%) rename {Util => ReClass.NET/Util}/Extension.StringReader.cs (100%) rename {Util => ReClass.NET/Util}/Extensions.cs (100%) rename {Util => ReClass.NET/Util}/GrowingList.cs (100%) rename {Util => ReClass.NET/Util}/IntPtrComparer.cs (100%) rename {Util => ReClass.NET/Util}/PathUtil.cs (100%) rename {Util => ReClass.NET/Util}/Rtf/RtfBuilder.RtfFormatLock.cs (100%) rename {Util => ReClass.NET/Util}/Rtf/RtfBuilder.RtfFormatWrapper.cs (100%) rename {Util => ReClass.NET/Util}/Rtf/RtfBuilder.cs (100%) rename {Util => ReClass.NET/Util}/Rtf/RtfFont.cs (100%) rename {Util => ReClass.NET/Util}/Util.cs (100%) rename {Util => ReClass.NET/Util}/ValueTypeWrapper.cs (100%) rename {Util => ReClass.NET/Util}/WinUtil.cs (100%) rename packages.config => ReClass.NET/packages.config (100%) diff --git a/ReClass.NET.sln b/ReClass.NET.sln index 64a9433b..30520c36 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET", "ReClass.NET.csproj", "{BFB8917D-E9B4-463F-A6E8-612C35728C78}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET", "ReClass.NET\ReClass.NET.csproj", "{BFB8917D-E9B4-463F-A6E8-612C35728C78}" ProjectSection(ProjectDependencies) = postProject {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} = {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} EndProjectSection diff --git a/AddressParser/AstBuilder.cs b/ReClass.NET/AddressParser/AstBuilder.cs similarity index 100% rename from AddressParser/AstBuilder.cs rename to ReClass.NET/AddressParser/AstBuilder.cs diff --git a/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs similarity index 100% rename from AddressParser/Interpreter.cs rename to ReClass.NET/AddressParser/Interpreter.cs diff --git a/AddressParser/Operations.cs b/ReClass.NET/AddressParser/Operations.cs similarity index 100% rename from AddressParser/Operations.cs rename to ReClass.NET/AddressParser/Operations.cs diff --git a/AddressParser/ParseException.cs b/ReClass.NET/AddressParser/ParseException.cs similarity index 100% rename from AddressParser/ParseException.cs rename to ReClass.NET/AddressParser/ParseException.cs diff --git a/AddressParser/Token.cs b/ReClass.NET/AddressParser/Token.cs similarity index 100% rename from AddressParser/Token.cs rename to ReClass.NET/AddressParser/Token.cs diff --git a/AddressParser/TokenReader.cs b/ReClass.NET/AddressParser/TokenReader.cs similarity index 100% rename from AddressParser/TokenReader.cs rename to ReClass.NET/AddressParser/TokenReader.cs diff --git a/App.config b/ReClass.NET/App.config similarity index 100% rename from App.config rename to ReClass.NET/App.config diff --git a/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs similarity index 96% rename from CodeGenerator/CSharpCodeGenerator.cs rename to ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 81c9758b..47cf8818 100644 --- a/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -1,148 +1,148 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; -using System.Linq; -using System.Text; -using ReClassNET.Logger; -using ReClassNET.Nodes; -using ReClassNET.Util; - -namespace ReClassNET.CodeGenerator -{ - class CSharpCodeGenerator : ICodeGenerator - { - private readonly Dictionary typeToTypedefMap = new Dictionary - { - [typeof(DoubleNode)] = "double", - [typeof(FloatNode)] = "float", - [typeof(BoolNode)] = "bool", - [typeof(Int8Node)] = "sbyte", - [typeof(Int16Node)] = "short", - [typeof(Int32Node)] = "int", - [typeof(Int64Node)] = "long", - [typeof(UInt8Node)] = "byte", - [typeof(UInt16Node)] = "ushort", - [typeof(UInt32Node)] = "uint", - [typeof(UInt64Node)] = "ulong", - - [typeof(FunctionPtrNode)] = "IntPtr", - [typeof(Utf8TextPtrNode)] = "IntPtr", - [typeof(Utf16TextPtrNode)] = "IntPtr", - [typeof(Utf32TextPtrNode)] = "IntPtr", - [typeof(ClassPtrNode)] = "IntPtr", - [typeof(VTableNode)] = "IntPtr" - }; - - public Language Language => Language.CSharp; - - public string GenerateCode(IEnumerable classes, ILogger logger) - { - var sb = new StringBuilder(); - sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); - sb.AppendLine(); - sb.AppendLine("// Warning: The code doesn't contain arrays and instances!"); - sb.AppendLine(); - sb.AppendLine("using System.Runtime.InteropServices;"); - sb.AppendLine(); - - sb.Append( - string.Join( - Environment.NewLine + Environment.NewLine, - classes.Select(c => - { - var csb = new StringBuilder(); - - csb.AppendLine("[StructLayout(LayoutKind.Explicit)]"); - csb.Append($"struct {c.Name}"); - if (!string.IsNullOrEmpty(c.Comment)) - { - csb.Append($" // {c.Comment}"); - } - csb.AppendLine(); - - csb.AppendLine("{"); - - csb.AppendLine( - string.Join( - Environment.NewLine + Environment.NewLine, - YieldMemberDefinitions(c.Nodes, logger) - .Select(m => $"\t{GetFieldDecorator(m)}{Environment.NewLine}\t{GetFieldDefinition(m)}") - ) - ); - csb.Append("}"); - return csb.ToString(); - }) - ) - ); - - return sb.ToString(); - } - - private IEnumerable YieldMemberDefinitions(IEnumerable members, ILogger logger) - { - Contract.Requires(members != null); - Contract.Requires(Contract.ForAll(members, m => m != null)); - Contract.Ensures(Contract.Result>() != null); - Contract.Ensures(Contract.ForAll(Contract.Result>(), d => d != null)); - - foreach (var member in members.WhereNot(n => n is BaseHexNode)) - { - var bitFieldNode = member as BitFieldNode; - if (bitFieldNode != null) - { - string type; - switch (bitFieldNode.Bits) - { - default: - type = typeToTypedefMap[typeof(UInt8Node)]; - break; - case 16: - type = typeToTypedefMap[typeof(UInt16Node)]; - break; - case 32: - type = typeToTypedefMap[typeof(UInt32Node)]; - break; - case 64: - type = typeToTypedefMap[typeof(UInt64Node)]; - break; - } - - yield return new MemberDefinition(member, type); - } - else - { - if (typeToTypedefMap.TryGetValue(member.GetType(), out var type)) - { - yield return new MemberDefinition(member, type); - } - else - { - var generator = CustomCodeGenerator.GetGenerator(member, Language); - if (generator != null) - { - yield return generator.GetMemberDefinition(member, Language, logger); - - continue; - } - - logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}"); - } - } - } - } - - private string GetFieldDecorator(MemberDefinition member) - { - Contract.Requires(member != null); - - return $"[FieldOffset({member.Offset})]"; - } - - private string GetFieldDefinition(MemberDefinition member) - { - Contract.Requires(member != null); - - return $"public {member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim(); - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using ReClassNET.Logger; +using ReClassNET.Nodes; +using ReClassNET.Util; + +namespace ReClassNET.CodeGenerator +{ + class CSharpCodeGenerator : ICodeGenerator + { + private readonly Dictionary typeToTypedefMap = new Dictionary + { + [typeof(DoubleNode)] = "double", + [typeof(FloatNode)] = "float", + [typeof(BoolNode)] = "bool", + [typeof(Int8Node)] = "sbyte", + [typeof(Int16Node)] = "short", + [typeof(Int32Node)] = "int", + [typeof(Int64Node)] = "long", + [typeof(UInt8Node)] = "byte", + [typeof(UInt16Node)] = "ushort", + [typeof(UInt32Node)] = "uint", + [typeof(UInt64Node)] = "ulong", + + [typeof(FunctionPtrNode)] = "IntPtr", + [typeof(Utf8TextPtrNode)] = "IntPtr", + [typeof(Utf16TextPtrNode)] = "IntPtr", + [typeof(Utf32TextPtrNode)] = "IntPtr", + [typeof(ClassPtrNode)] = "IntPtr", + [typeof(VTableNode)] = "IntPtr" + }; + + public Language Language => Language.CSharp; + + public string GenerateCode(IEnumerable classes, ILogger logger) + { + var sb = new StringBuilder(); + sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); + sb.AppendLine(); + sb.AppendLine("// Warning: The code doesn't contain arrays and instances!"); + sb.AppendLine(); + sb.AppendLine("using System.Runtime.InteropServices;"); + sb.AppendLine(); + + sb.Append( + string.Join( + Environment.NewLine + Environment.NewLine, + classes.Select(c => + { + var csb = new StringBuilder(); + + csb.AppendLine("[StructLayout(LayoutKind.Explicit)]"); + csb.Append($"struct {c.Name}"); + if (!string.IsNullOrEmpty(c.Comment)) + { + csb.Append($" // {c.Comment}"); + } + csb.AppendLine(); + + csb.AppendLine("{"); + + csb.AppendLine( + string.Join( + Environment.NewLine + Environment.NewLine, + YieldMemberDefinitions(c.Nodes, logger) + .Select(m => $"\t{GetFieldDecorator(m)}{Environment.NewLine}\t{GetFieldDefinition(m)}") + ) + ); + csb.Append("}"); + return csb.ToString(); + }) + ) + ); + + return sb.ToString(); + } + + private IEnumerable YieldMemberDefinitions(IEnumerable members, ILogger logger) + { + Contract.Requires(members != null); + Contract.Requires(Contract.ForAll(members, m => m != null)); + Contract.Ensures(Contract.Result>() != null); + Contract.Ensures(Contract.ForAll(Contract.Result>(), d => d != null)); + + foreach (var member in members.WhereNot(n => n is BaseHexNode)) + { + var bitFieldNode = member as BitFieldNode; + if (bitFieldNode != null) + { + string type; + switch (bitFieldNode.Bits) + { + default: + type = typeToTypedefMap[typeof(UInt8Node)]; + break; + case 16: + type = typeToTypedefMap[typeof(UInt16Node)]; + break; + case 32: + type = typeToTypedefMap[typeof(UInt32Node)]; + break; + case 64: + type = typeToTypedefMap[typeof(UInt64Node)]; + break; + } + + yield return new MemberDefinition(member, type); + } + else + { + if (typeToTypedefMap.TryGetValue(member.GetType(), out var type)) + { + yield return new MemberDefinition(member, type); + } + else + { + var generator = CustomCodeGenerator.GetGenerator(member, Language); + if (generator != null) + { + yield return generator.GetMemberDefinition(member, Language, logger); + + continue; + } + + logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}"); + } + } + } + } + + private string GetFieldDecorator(MemberDefinition member) + { + Contract.Requires(member != null); + + return $"[FieldOffset({member.Offset})]"; + } + + private string GetFieldDefinition(MemberDefinition member) + { + Contract.Requires(member != null); + + return $"public {member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim(); + } + } +} diff --git a/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs similarity index 96% rename from CodeGenerator/CppCodeGenerator.cs rename to ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 1cb53f81..c936ec98 100644 --- a/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -1,261 +1,261 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; -using System.Linq; -using System.Text; -using ReClassNET.Logger; -using ReClassNET.Nodes; -using ReClassNET.Util; - -namespace ReClassNET.CodeGenerator -{ - class CppCodeGenerator : ICodeGenerator - { - private readonly Dictionary typeToTypedefMap = new Dictionary - { - [typeof(BoolNode)] = Program.Settings.TypeBool, - [typeof(DoubleNode)] = Program.Settings.TypeDouble, - [typeof(FloatNode)] = Program.Settings.TypeFloat, - [typeof(FunctionPtrNode)] = Program.Settings.TypeFunctionPtr, - [typeof(Int8Node)] = Program.Settings.TypeInt8, - [typeof(Int16Node)] = Program.Settings.TypeInt16, - [typeof(Int32Node)] = Program.Settings.TypeInt32, - [typeof(Int64Node)] = Program.Settings.TypeInt64, - [typeof(Matrix3x3Node)] = Program.Settings.TypeMatrix3x3, - [typeof(Matrix3x4Node)] = Program.Settings.TypeMatrix3x4, - [typeof(Matrix4x4Node)] = Program.Settings.TypeMatrix4x4, - [typeof(UInt8Node)] = Program.Settings.TypeUInt8, - [typeof(UInt16Node)] = Program.Settings.TypeUInt16, - [typeof(UInt32Node)] = Program.Settings.TypeUInt32, - [typeof(UInt64Node)] = Program.Settings.TypeUInt64, - [typeof(Utf8TextNode)] = Program.Settings.TypeUTF8Text, - [typeof(Utf8TextPtrNode)] = Program.Settings.TypeUTF8TextPtr, - [typeof(Utf16TextNode)] = Program.Settings.TypeUTF16Text, - [typeof(Utf16TextPtrNode)] = Program.Settings.TypeUTF16TextPtr, - [typeof(Utf32TextNode)] = Program.Settings.TypeUTF32Text, - [typeof(Utf32TextPtrNode)] = Program.Settings.TypeUTF32PtrText, - [typeof(Vector2Node)] = Program.Settings.TypeVector2, - [typeof(Vector3Node)] = Program.Settings.TypeVector3, - [typeof(Vector4Node)] = Program.Settings.TypeVector4 - }; - - public Language Language => Language.Cpp; - - public string GenerateCode(IEnumerable classes, ILogger logger) - { - var classNodes = classes as IList ?? classes.ToList(); - - var sb = new StringBuilder(); - sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); - sb.AppendLine(); - sb.AppendLine( - string.Join( - Environment.NewLine + Environment.NewLine, - // Skip class which contains FunctionNodes because these are not data classes. - OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => - { - var csb = new StringBuilder(); - csb.Append($"class {c.Name}"); - - bool skipFirstMember = false; - var inheritedFromNode = c.Nodes.FirstOrDefault() as ClassInstanceNode; - if (inheritedFromNode != null) - { - skipFirstMember = true; - - csb.Append(" : public "); - csb.Append(inheritedFromNode.InnerNode.Name); - } - - if (!string.IsNullOrEmpty(c.Comment)) - { - csb.Append($" // {c.Comment}"); - } - csb.AppendLine(); - - csb.AppendLine("{"); - csb.AppendLine("public:"); - csb.AppendLine( - string.Join( - Environment.NewLine, - YieldMemberDefinitions(c.Nodes.Skip(skipFirstMember ? 1 : 0).WhereNot(n => n is FunctionNode), logger) - .Select(MemberDefinitionToString) - .Select(s => "\t" + s) - ) - ); - - var vTableNodes = c.Nodes.OfType().ToList(); - if (vTableNodes.Any()) - { - csb.AppendLine(); - csb.AppendLine( - string.Join( - Environment.NewLine, - vTableNodes.SelectMany(vt => vt.Nodes).OfType().Select(m => $"\tvirtual void {m.MethodName}();") - ) - ); - } - - var functionNodes = classNodes.SelectMany(c2 => c2.Nodes).OfType().Where(f => f.BelongsToClass == c).ToList(); - if (functionNodes.Any()) - { - csb.AppendLine(); - csb.AppendLine( - string.Join( - Environment.NewLine, - functionNodes.Select(f => $"\t{f.Signature} {{ }}") - ) - ); - } - - csb.Append($"}}; //Size: 0x{c.MemorySize:X04}"); - return csb.ToString(); - }) - ) - ); - - return sb.ToString(); - } - - private IEnumerable OrderByInheritance(IEnumerable classes) - { - Contract.Requires(classes != null); - Contract.Requires(Contract.ForAll(classes, c => c != null)); - Contract.Ensures(Contract.Result>() != null); - - var alreadySeen = new HashSet(); - - return classes.SelectMany(c => YieldReversedHierarchy(c, alreadySeen)).Distinct(); - } - - private IEnumerable YieldReversedHierarchy(ClassNode node, HashSet alreadySeen) - { - Contract.Requires(node != null); - Contract.Requires(alreadySeen != null); - Contract.Requires(Contract.ForAll(alreadySeen, c => c != null)); - Contract.Ensures(Contract.Result>() != null); - - if (!alreadySeen.Add(node)) - { - yield break; - } - - foreach (var referenceNode in node.Nodes.OfType()) - { - foreach (var referencedNode in YieldReversedHierarchy(referenceNode.InnerNode, alreadySeen)) - { - yield return referencedNode; - } - } - - yield return node; - } - - private IEnumerable YieldMemberDefinitions(IEnumerable members, ILogger logger) - { - Contract.Requires(members != null); - Contract.Requires(Contract.ForAll(members, m => m != null)); - Contract.Ensures(Contract.Result>() != null); - Contract.Ensures(Contract.ForAll(Contract.Result>(), d => d != null)); - - int fill = 0; - int fillStart = 0; - - foreach (var member in members.WhereNot(m => m is VTableNode)) - { - if (member is BaseHexNode) - { - if (fill == 0) - { - fillStart = member.Offset.ToInt32(); - } - fill += member.MemorySize; - - continue; - } - - if (fill != 0) - { - yield return new MemberDefinition(Program.Settings.TypePadding, fill, $"pad_{fillStart:X04}", fillStart, string.Empty); - - fill = 0; - } - - if (typeToTypedefMap.TryGetValue(member.GetType(), out var type)) - { - var count = (member as BaseTextNode)?.Length ?? 0; - - yield return new MemberDefinition(member, type, count); - } - else if (member is BitFieldNode) - { - switch (((BitFieldNode)member).Bits) - { - case 8: - type = Program.Settings.TypeUInt8; - break; - case 16: - type = Program.Settings.TypeUInt16; - break; - case 32: - type = Program.Settings.TypeUInt32; - break; - case 64: - type = Program.Settings.TypeUInt64; - break; - } - - yield return new MemberDefinition(member, type); - } - else if (member is ClassInstanceArrayNode) - { - var instanceArray = (ClassInstanceArrayNode)member; - - yield return new MemberDefinition(member, instanceArray.InnerNode.Name, instanceArray.Count); - } - else if (member is ClassInstanceNode) - { - yield return new MemberDefinition(member, ((ClassInstanceNode)member).InnerNode.Name); - } - else if (member is ClassPtrArrayNode) - { - var ptrArray = (ClassPtrArrayNode)member; - - yield return new MemberDefinition(member, $"class {ptrArray.InnerNode.Name}*", ptrArray.Count); - } - else if (member is ClassPtrNode) - { - yield return new MemberDefinition(member, $"class {((ClassPtrNode)member).InnerNode.Name}*"); - } - else - { - var generator = CustomCodeGenerator.GetGenerator(member, Language); - if (generator != null) - { - yield return generator.GetMemberDefinition(member, Language, logger); - } - else - { - logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}"); - } - } - } - - if (fill != 0) - { - yield return new MemberDefinition(Program.Settings.TypePadding, fill, $"pad_{fillStart:X04}", fillStart, string.Empty); - } - } - - private string MemberDefinitionToString(MemberDefinition member) - { - Contract.Requires(member != null); - - if (member.IsArray) - { - return $"{member.Type} {member.Name}[{member.ArrayCount}]; //0x{member.Offset:X04} {member.Comment}".Trim(); - } - return $"{member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim(); - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using ReClassNET.Logger; +using ReClassNET.Nodes; +using ReClassNET.Util; + +namespace ReClassNET.CodeGenerator +{ + class CppCodeGenerator : ICodeGenerator + { + private readonly Dictionary typeToTypedefMap = new Dictionary + { + [typeof(BoolNode)] = Program.Settings.TypeBool, + [typeof(DoubleNode)] = Program.Settings.TypeDouble, + [typeof(FloatNode)] = Program.Settings.TypeFloat, + [typeof(FunctionPtrNode)] = Program.Settings.TypeFunctionPtr, + [typeof(Int8Node)] = Program.Settings.TypeInt8, + [typeof(Int16Node)] = Program.Settings.TypeInt16, + [typeof(Int32Node)] = Program.Settings.TypeInt32, + [typeof(Int64Node)] = Program.Settings.TypeInt64, + [typeof(Matrix3x3Node)] = Program.Settings.TypeMatrix3x3, + [typeof(Matrix3x4Node)] = Program.Settings.TypeMatrix3x4, + [typeof(Matrix4x4Node)] = Program.Settings.TypeMatrix4x4, + [typeof(UInt8Node)] = Program.Settings.TypeUInt8, + [typeof(UInt16Node)] = Program.Settings.TypeUInt16, + [typeof(UInt32Node)] = Program.Settings.TypeUInt32, + [typeof(UInt64Node)] = Program.Settings.TypeUInt64, + [typeof(Utf8TextNode)] = Program.Settings.TypeUTF8Text, + [typeof(Utf8TextPtrNode)] = Program.Settings.TypeUTF8TextPtr, + [typeof(Utf16TextNode)] = Program.Settings.TypeUTF16Text, + [typeof(Utf16TextPtrNode)] = Program.Settings.TypeUTF16TextPtr, + [typeof(Utf32TextNode)] = Program.Settings.TypeUTF32Text, + [typeof(Utf32TextPtrNode)] = Program.Settings.TypeUTF32PtrText, + [typeof(Vector2Node)] = Program.Settings.TypeVector2, + [typeof(Vector3Node)] = Program.Settings.TypeVector3, + [typeof(Vector4Node)] = Program.Settings.TypeVector4 + }; + + public Language Language => Language.Cpp; + + public string GenerateCode(IEnumerable classes, ILogger logger) + { + var classNodes = classes as IList ?? classes.ToList(); + + var sb = new StringBuilder(); + sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); + sb.AppendLine(); + sb.AppendLine( + string.Join( + Environment.NewLine + Environment.NewLine, + // Skip class which contains FunctionNodes because these are not data classes. + OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => + { + var csb = new StringBuilder(); + csb.Append($"class {c.Name}"); + + bool skipFirstMember = false; + var inheritedFromNode = c.Nodes.FirstOrDefault() as ClassInstanceNode; + if (inheritedFromNode != null) + { + skipFirstMember = true; + + csb.Append(" : public "); + csb.Append(inheritedFromNode.InnerNode.Name); + } + + if (!string.IsNullOrEmpty(c.Comment)) + { + csb.Append($" // {c.Comment}"); + } + csb.AppendLine(); + + csb.AppendLine("{"); + csb.AppendLine("public:"); + csb.AppendLine( + string.Join( + Environment.NewLine, + YieldMemberDefinitions(c.Nodes.Skip(skipFirstMember ? 1 : 0).WhereNot(n => n is FunctionNode), logger) + .Select(MemberDefinitionToString) + .Select(s => "\t" + s) + ) + ); + + var vTableNodes = c.Nodes.OfType().ToList(); + if (vTableNodes.Any()) + { + csb.AppendLine(); + csb.AppendLine( + string.Join( + Environment.NewLine, + vTableNodes.SelectMany(vt => vt.Nodes).OfType().Select(m => $"\tvirtual void {m.MethodName}();") + ) + ); + } + + var functionNodes = classNodes.SelectMany(c2 => c2.Nodes).OfType().Where(f => f.BelongsToClass == c).ToList(); + if (functionNodes.Any()) + { + csb.AppendLine(); + csb.AppendLine( + string.Join( + Environment.NewLine, + functionNodes.Select(f => $"\t{f.Signature} {{ }}") + ) + ); + } + + csb.Append($"}}; //Size: 0x{c.MemorySize:X04}"); + return csb.ToString(); + }) + ) + ); + + return sb.ToString(); + } + + private IEnumerable OrderByInheritance(IEnumerable classes) + { + Contract.Requires(classes != null); + Contract.Requires(Contract.ForAll(classes, c => c != null)); + Contract.Ensures(Contract.Result>() != null); + + var alreadySeen = new HashSet(); + + return classes.SelectMany(c => YieldReversedHierarchy(c, alreadySeen)).Distinct(); + } + + private IEnumerable YieldReversedHierarchy(ClassNode node, HashSet alreadySeen) + { + Contract.Requires(node != null); + Contract.Requires(alreadySeen != null); + Contract.Requires(Contract.ForAll(alreadySeen, c => c != null)); + Contract.Ensures(Contract.Result>() != null); + + if (!alreadySeen.Add(node)) + { + yield break; + } + + foreach (var referenceNode in node.Nodes.OfType()) + { + foreach (var referencedNode in YieldReversedHierarchy(referenceNode.InnerNode, alreadySeen)) + { + yield return referencedNode; + } + } + + yield return node; + } + + private IEnumerable YieldMemberDefinitions(IEnumerable members, ILogger logger) + { + Contract.Requires(members != null); + Contract.Requires(Contract.ForAll(members, m => m != null)); + Contract.Ensures(Contract.Result>() != null); + Contract.Ensures(Contract.ForAll(Contract.Result>(), d => d != null)); + + int fill = 0; + int fillStart = 0; + + foreach (var member in members.WhereNot(m => m is VTableNode)) + { + if (member is BaseHexNode) + { + if (fill == 0) + { + fillStart = member.Offset.ToInt32(); + } + fill += member.MemorySize; + + continue; + } + + if (fill != 0) + { + yield return new MemberDefinition(Program.Settings.TypePadding, fill, $"pad_{fillStart:X04}", fillStart, string.Empty); + + fill = 0; + } + + if (typeToTypedefMap.TryGetValue(member.GetType(), out var type)) + { + var count = (member as BaseTextNode)?.Length ?? 0; + + yield return new MemberDefinition(member, type, count); + } + else if (member is BitFieldNode) + { + switch (((BitFieldNode)member).Bits) + { + case 8: + type = Program.Settings.TypeUInt8; + break; + case 16: + type = Program.Settings.TypeUInt16; + break; + case 32: + type = Program.Settings.TypeUInt32; + break; + case 64: + type = Program.Settings.TypeUInt64; + break; + } + + yield return new MemberDefinition(member, type); + } + else if (member is ClassInstanceArrayNode) + { + var instanceArray = (ClassInstanceArrayNode)member; + + yield return new MemberDefinition(member, instanceArray.InnerNode.Name, instanceArray.Count); + } + else if (member is ClassInstanceNode) + { + yield return new MemberDefinition(member, ((ClassInstanceNode)member).InnerNode.Name); + } + else if (member is ClassPtrArrayNode) + { + var ptrArray = (ClassPtrArrayNode)member; + + yield return new MemberDefinition(member, $"class {ptrArray.InnerNode.Name}*", ptrArray.Count); + } + else if (member is ClassPtrNode) + { + yield return new MemberDefinition(member, $"class {((ClassPtrNode)member).InnerNode.Name}*"); + } + else + { + var generator = CustomCodeGenerator.GetGenerator(member, Language); + if (generator != null) + { + yield return generator.GetMemberDefinition(member, Language, logger); + } + else + { + logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}"); + } + } + } + + if (fill != 0) + { + yield return new MemberDefinition(Program.Settings.TypePadding, fill, $"pad_{fillStart:X04}", fillStart, string.Empty); + } + } + + private string MemberDefinitionToString(MemberDefinition member) + { + Contract.Requires(member != null); + + if (member.IsArray) + { + return $"{member.Type} {member.Name}[{member.ArrayCount}]; //0x{member.Offset:X04} {member.Comment}".Trim(); + } + return $"{member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim(); + } + } +} diff --git a/CodeGenerator/CustomCodeGenerator.cs b/ReClass.NET/CodeGenerator/CustomCodeGenerator.cs similarity index 100% rename from CodeGenerator/CustomCodeGenerator.cs rename to ReClass.NET/CodeGenerator/CustomCodeGenerator.cs diff --git a/CodeGenerator/ICodeGenerator.cs b/ReClass.NET/CodeGenerator/ICodeGenerator.cs similarity index 100% rename from CodeGenerator/ICodeGenerator.cs rename to ReClass.NET/CodeGenerator/ICodeGenerator.cs diff --git a/CodeGenerator/Language.cs b/ReClass.NET/CodeGenerator/Language.cs similarity index 100% rename from CodeGenerator/Language.cs rename to ReClass.NET/CodeGenerator/Language.cs diff --git a/CodeGenerator/MemberDefinition.cs b/ReClass.NET/CodeGenerator/MemberDefinition.cs similarity index 100% rename from CodeGenerator/MemberDefinition.cs rename to ReClass.NET/CodeGenerator/MemberDefinition.cs diff --git a/Constants.cs b/ReClass.NET/Constants.cs similarity index 100% rename from Constants.cs rename to ReClass.NET/Constants.cs diff --git a/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs similarity index 100% rename from Core/CoreFunctionsManager.cs rename to ReClass.NET/Core/CoreFunctionsManager.cs diff --git a/Core/DataExchange.cs b/ReClass.NET/Core/DataExchange.cs similarity index 100% rename from Core/DataExchange.cs rename to ReClass.NET/Core/DataExchange.cs diff --git a/Core/ICoreProcessFunctions.cs b/ReClass.NET/Core/ICoreProcessFunctions.cs similarity index 100% rename from Core/ICoreProcessFunctions.cs rename to ReClass.NET/Core/ICoreProcessFunctions.cs diff --git a/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs similarity index 100% rename from Core/InternalCoreFunctions.cs rename to ReClass.NET/Core/InternalCoreFunctions.cs diff --git a/Core/NativeCoreWrapper.cs b/ReClass.NET/Core/NativeCoreWrapper.cs similarity index 100% rename from Core/NativeCoreWrapper.cs rename to ReClass.NET/Core/NativeCoreWrapper.cs diff --git a/DataExchange/ReClass/CustomNodeConverter.cs b/ReClass.NET/DataExchange/ReClass/CustomNodeConverter.cs similarity index 100% rename from DataExchange/ReClass/CustomNodeConverter.cs rename to ReClass.NET/DataExchange/ReClass/CustomNodeConverter.cs diff --git a/DataExchange/ReClass/IReClassExport.cs b/ReClass.NET/DataExchange/ReClass/IReClassExport.cs similarity index 100% rename from DataExchange/ReClass/IReClassExport.cs rename to ReClass.NET/DataExchange/ReClass/IReClassExport.cs diff --git a/DataExchange/ReClass/IReClassImport.cs b/ReClass.NET/DataExchange/ReClass/IReClassImport.cs similarity index 100% rename from DataExchange/ReClass/IReClassImport.cs rename to ReClass.NET/DataExchange/ReClass/IReClassImport.cs diff --git a/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs similarity index 100% rename from DataExchange/ReClass/ReClass2007File.cs rename to ReClass.NET/DataExchange/ReClass/ReClass2007File.cs diff --git a/DataExchange/ReClass/ReClassClipboard.cs b/ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs similarity index 100% rename from DataExchange/ReClass/ReClassClipboard.cs rename to ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs diff --git a/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs similarity index 100% rename from DataExchange/ReClass/ReClassFile.cs rename to ReClass.NET/DataExchange/ReClass/ReClassFile.cs diff --git a/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs similarity index 100% rename from DataExchange/ReClass/ReClassNetFile.Read.cs rename to ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs diff --git a/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs similarity index 100% rename from DataExchange/ReClass/ReClassNetFile.Write.cs rename to ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs diff --git a/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs similarity index 100% rename from DataExchange/ReClass/ReClassNetFile.cs rename to ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs diff --git a/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs similarity index 100% rename from DataExchange/ReClass/ReClassQtFile.cs rename to ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs diff --git a/DataExchange/Scanner/CheatEngineFile.cs b/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs similarity index 100% rename from DataExchange/Scanner/CheatEngineFile.cs rename to ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs diff --git a/DataExchange/Scanner/CrySearchFile.cs b/ReClass.NET/DataExchange/Scanner/CrySearchFile.cs similarity index 100% rename from DataExchange/Scanner/CrySearchFile.cs rename to ReClass.NET/DataExchange/Scanner/CrySearchFile.cs diff --git a/DataExchange/Scanner/IScannerExport.cs b/ReClass.NET/DataExchange/Scanner/IScannerExport.cs similarity index 100% rename from DataExchange/Scanner/IScannerExport.cs rename to ReClass.NET/DataExchange/Scanner/IScannerExport.cs diff --git a/DataExchange/Scanner/IScannerImport.cs b/ReClass.NET/DataExchange/Scanner/IScannerImport.cs similarity index 100% rename from DataExchange/Scanner/IScannerImport.cs rename to ReClass.NET/DataExchange/Scanner/IScannerImport.cs diff --git a/DataExchange/Scanner/ReClassScanFile.cs b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs similarity index 100% rename from DataExchange/Scanner/ReClassScanFile.cs rename to ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs diff --git a/Debugger/BreakpointAlreadySetException.cs b/ReClass.NET/Debugger/BreakpointAlreadySetException.cs similarity index 100% rename from Debugger/BreakpointAlreadySetException.cs rename to ReClass.NET/Debugger/BreakpointAlreadySetException.cs diff --git a/Debugger/DataExchange.cs b/ReClass.NET/Debugger/DataExchange.cs similarity index 100% rename from Debugger/DataExchange.cs rename to ReClass.NET/Debugger/DataExchange.cs diff --git a/Debugger/HardwareBreakpoint.cs b/ReClass.NET/Debugger/HardwareBreakpoint.cs similarity index 100% rename from Debugger/HardwareBreakpoint.cs rename to ReClass.NET/Debugger/HardwareBreakpoint.cs diff --git a/Debugger/IBreakpoint.cs b/ReClass.NET/Debugger/IBreakpoint.cs similarity index 100% rename from Debugger/IBreakpoint.cs rename to ReClass.NET/Debugger/IBreakpoint.cs diff --git a/Debugger/NoHardwareBreakpointAvailableException.cs b/ReClass.NET/Debugger/NoHardwareBreakpointAvailableException.cs similarity index 100% rename from Debugger/NoHardwareBreakpointAvailableException.cs rename to ReClass.NET/Debugger/NoHardwareBreakpointAvailableException.cs diff --git a/Debugger/RemoteDebugger.Extensions.cs b/ReClass.NET/Debugger/RemoteDebugger.Extensions.cs similarity index 100% rename from Debugger/RemoteDebugger.Extensions.cs rename to ReClass.NET/Debugger/RemoteDebugger.Extensions.cs diff --git a/Debugger/RemoteDebugger.Handler.cs b/ReClass.NET/Debugger/RemoteDebugger.Handler.cs similarity index 100% rename from Debugger/RemoteDebugger.Handler.cs rename to ReClass.NET/Debugger/RemoteDebugger.Handler.cs diff --git a/Debugger/RemoteDebugger.Thread.cs b/ReClass.NET/Debugger/RemoteDebugger.Thread.cs similarity index 100% rename from Debugger/RemoteDebugger.Thread.cs rename to ReClass.NET/Debugger/RemoteDebugger.Thread.cs diff --git a/Debugger/RemoteDebugger.cs b/ReClass.NET/Debugger/RemoteDebugger.cs similarity index 100% rename from Debugger/RemoteDebugger.cs rename to ReClass.NET/Debugger/RemoteDebugger.cs diff --git a/Debugger/SoftwareBreakpoint.cs b/ReClass.NET/Debugger/SoftwareBreakpoint.cs similarity index 100% rename from Debugger/SoftwareBreakpoint.cs rename to ReClass.NET/Debugger/SoftwareBreakpoint.cs diff --git a/Forms/AboutForm.Designer.cs b/ReClass.NET/Forms/AboutForm.Designer.cs similarity index 100% rename from Forms/AboutForm.Designer.cs rename to ReClass.NET/Forms/AboutForm.Designer.cs diff --git a/Forms/AboutForm.cs b/ReClass.NET/Forms/AboutForm.cs similarity index 100% rename from Forms/AboutForm.cs rename to ReClass.NET/Forms/AboutForm.cs diff --git a/Forms/AboutForm.resx b/ReClass.NET/Forms/AboutForm.resx similarity index 100% rename from Forms/AboutForm.resx rename to ReClass.NET/Forms/AboutForm.resx diff --git a/Forms/CodeForm.Designer.cs b/ReClass.NET/Forms/CodeForm.Designer.cs similarity index 100% rename from Forms/CodeForm.Designer.cs rename to ReClass.NET/Forms/CodeForm.Designer.cs diff --git a/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs similarity index 100% rename from Forms/CodeForm.cs rename to ReClass.NET/Forms/CodeForm.cs diff --git a/Forms/CodeForm.resx b/ReClass.NET/Forms/CodeForm.resx similarity index 100% rename from Forms/CodeForm.resx rename to ReClass.NET/Forms/CodeForm.resx diff --git a/Forms/FoundCodeForm.Designer.cs b/ReClass.NET/Forms/FoundCodeForm.Designer.cs similarity index 100% rename from Forms/FoundCodeForm.Designer.cs rename to ReClass.NET/Forms/FoundCodeForm.Designer.cs diff --git a/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs similarity index 100% rename from Forms/FoundCodeForm.cs rename to ReClass.NET/Forms/FoundCodeForm.cs diff --git a/Forms/FoundCodeForm.resx b/ReClass.NET/Forms/FoundCodeForm.resx similarity index 100% rename from Forms/FoundCodeForm.resx rename to ReClass.NET/Forms/FoundCodeForm.resx diff --git a/Forms/IconForm.cs b/ReClass.NET/Forms/IconForm.cs similarity index 100% rename from Forms/IconForm.cs rename to ReClass.NET/Forms/IconForm.cs diff --git a/Forms/InputBytesForm.Designer.cs b/ReClass.NET/Forms/InputBytesForm.Designer.cs similarity index 100% rename from Forms/InputBytesForm.Designer.cs rename to ReClass.NET/Forms/InputBytesForm.Designer.cs diff --git a/Forms/InputBytesForm.cs b/ReClass.NET/Forms/InputBytesForm.cs similarity index 100% rename from Forms/InputBytesForm.cs rename to ReClass.NET/Forms/InputBytesForm.cs diff --git a/Forms/InputBytesForm.resx b/ReClass.NET/Forms/InputBytesForm.resx similarity index 100% rename from Forms/InputBytesForm.resx rename to ReClass.NET/Forms/InputBytesForm.resx diff --git a/Forms/InputCorrelatorForm.Designer.cs b/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs similarity index 100% rename from Forms/InputCorrelatorForm.Designer.cs rename to ReClass.NET/Forms/InputCorrelatorForm.Designer.cs diff --git a/Forms/InputCorrelatorForm.cs b/ReClass.NET/Forms/InputCorrelatorForm.cs similarity index 100% rename from Forms/InputCorrelatorForm.cs rename to ReClass.NET/Forms/InputCorrelatorForm.cs diff --git a/Forms/InputCorrelatorForm.resx b/ReClass.NET/Forms/InputCorrelatorForm.resx similarity index 100% rename from Forms/InputCorrelatorForm.resx rename to ReClass.NET/Forms/InputCorrelatorForm.resx diff --git a/Forms/LogForm.Designer.cs b/ReClass.NET/Forms/LogForm.Designer.cs similarity index 100% rename from Forms/LogForm.Designer.cs rename to ReClass.NET/Forms/LogForm.Designer.cs diff --git a/Forms/LogForm.cs b/ReClass.NET/Forms/LogForm.cs similarity index 100% rename from Forms/LogForm.cs rename to ReClass.NET/Forms/LogForm.cs diff --git a/Forms/LogForm.resx b/ReClass.NET/Forms/LogForm.resx similarity index 100% rename from Forms/LogForm.resx rename to ReClass.NET/Forms/LogForm.resx diff --git a/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs similarity index 98% rename from Forms/MainForm.Designer.cs rename to ReClass.NET/Forms/MainForm.Designer.cs index b64f5480..8febcf52 100644 --- a/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -1,1353 +1,1353 @@ -namespace ReClassNET.Forms -{ - partial class MainForm - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); - this.splitContainer = new System.Windows.Forms.SplitContainer(); - this.classesView = new ReClassNET.UI.ClassNodeView(); - this.memoryViewControl = new ReClassNET.UI.MemoryViewControl(); - this.toolStrip = new System.Windows.Forms.ToolStrip(); - this.attachToProcessToolStripSplitButton = new System.Windows.Forms.ToolStripSplitButton(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.openProjectToolStripButton = new System.Windows.Forms.ToolStripButton(); - this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.newClassToolStripButton = new System.Windows.Forms.ToolStripButton(); - this.addBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.addXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insertBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.insert4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insertXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.hex64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.int64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.uint64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.boolToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.bitFieldToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); - this.floatToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.doubleToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.vec4ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vec3ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vec2ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat44ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat34ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat33ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.utf8TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf8TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf16TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf16TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.classInstanceToolStripButton6 = new ReClassNET.UI.TypeToolStripButton(); - this.classPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.arrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.ptrArrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vtableToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.fnPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.fnTypeToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); - this.statusStrip = new System.Windows.Forms.StatusStrip(); - this.processInfoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.infoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); - this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.attachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.reattachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.detachToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.openProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mergeWithProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.clearProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.processToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.processInformationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.memorySearcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); - this.loadSymbolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.loadSymbolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.resumeProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.suspendProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.terminateProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cleanUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); - this.generateCppCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.generateCSharpCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); - this.splitContainer.Panel1.SuspendLayout(); - this.splitContainer.Panel2.SuspendLayout(); - this.splitContainer.SuspendLayout(); - this.toolStrip.SuspendLayout(); - this.statusStrip.SuspendLayout(); - this.mainMenuStrip.SuspendLayout(); - this.SuspendLayout(); - // - // processUpdateTimer - // - this.processUpdateTimer.Enabled = true; - this.processUpdateTimer.Interval = 5000; - this.processUpdateTimer.Tick += new System.EventHandler(this.processUpdateTimer_Tick); - // - // splitContainer - // - this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; - this.splitContainer.Location = new System.Drawing.Point(0, 49); - this.splitContainer.Name = "splitContainer"; - // - // splitContainer.Panel1 - // - this.splitContainer.Panel1.Controls.Add(this.classesView); - // - // splitContainer.Panel2 - // - this.splitContainer.Panel2.BackColor = System.Drawing.SystemColors.Control; - this.splitContainer.Panel2.Controls.Add(this.memoryViewControl); - this.splitContainer.Size = new System.Drawing.Size(1141, 524); - this.splitContainer.SplitterDistance = 201; - this.splitContainer.TabIndex = 4; - // - // classesView - // - this.classesView.Dock = System.Windows.Forms.DockStyle.Fill; - this.classesView.Location = new System.Drawing.Point(0, 0); - this.classesView.Name = "classesView"; - this.classesView.Size = new System.Drawing.Size(201, 524); - this.classesView.TabIndex = 0; - this.classesView.SelectionChanged += new ReClassNET.UI.ClassNodeView.SelectionChangedEvent(this.classesView_ClassSelected); - // - // memoryViewControl - // - this.memoryViewControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.memoryViewControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.memoryViewControl.Location = new System.Drawing.Point(0, 0); - this.memoryViewControl.Name = "memoryViewControl"; - this.memoryViewControl.Size = new System.Drawing.Size(936, 524); - this.memoryViewControl.TabIndex = 0; - this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); - // - // toolStrip - // - this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.attachToProcessToolStripSplitButton, - this.toolStripSeparator6, - this.openProjectToolStripButton, - this.saveToolStripButton, - this.toolStripSeparator7, - this.newClassToolStripButton, - this.addBytesToolStripDropDownButton, - this.insertBytesToolStripDropDownButton, - this.toolStripSeparator8, - this.hex64ToolStripButton, - this.hex32ToolStripButton, - this.hex16ToolStripButton, - this.hex8ToolStripButton, - this.toolStripSeparator9, - this.int64ToolStripButton, - this.int32ToolStripButton, - this.int16ToolStripButton, - this.int8ToolStripButton, - this.toolStripSeparator10, - this.uint64ToolStripButton, - this.uint32ToolStripButton, - this.uint16ToolStripButton, - this.uint8ToolStripButton, - this.toolStripSeparator11, - this.boolToolStripButton, - this.bitFieldToolStripButton, - this.toolStripSeparator18, - this.floatToolStripButton, - this.doubleToolStripButton, - this.toolStripSeparator12, - this.vec4ToolStripButton, - this.vec3ToolStripButton, - this.vec2ToolStripButton, - this.mat44ToolStripButton, - this.mat34ToolStripButton, - this.mat33ToolStripButton, - this.toolStripSeparator13, - this.utf8TextToolStripButton, - this.utf8TextPtrToolStripButton, - this.utf16TextToolStripButton, - this.utf16TextPtrToolStripButton, - this.toolStripSeparator14, - this.classInstanceToolStripButton6, - this.classPtrToolStripButton, - this.toolStripSeparator15, - this.arrayToolStripButton, - this.ptrArrayToolStripButton, - this.vtableToolStripButton, - this.fnPtrToolStripButton, - this.fnTypeToolStripButton, - this.toolStripSeparator19}); - this.toolStrip.Location = new System.Drawing.Point(0, 24); - this.toolStrip.Name = "toolStrip"; - this.toolStrip.Size = new System.Drawing.Size(1141, 25); - this.toolStrip.TabIndex = 3; - // - // attachToProcessToolStripSplitButton - // - this.attachToProcessToolStripSplitButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.attachToProcessToolStripSplitButton.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; - this.attachToProcessToolStripSplitButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.attachToProcessToolStripSplitButton.Name = "attachToProcessToolStripSplitButton"; - this.attachToProcessToolStripSplitButton.Size = new System.Drawing.Size(32, 22); - this.attachToProcessToolStripSplitButton.ToolTipText = "Attach to Process..."; - this.attachToProcessToolStripSplitButton.ButtonClick += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); - this.attachToProcessToolStripSplitButton.DropDownClosed += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownClosed); - this.attachToProcessToolStripSplitButton.DropDownOpening += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownOpening); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25); - // - // openProjectToolStripButton - // - this.openProjectToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.openProjectToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; - this.openProjectToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.openProjectToolStripButton.Name = "openProjectToolStripButton"; - this.openProjectToolStripButton.Size = new System.Drawing.Size(23, 22); - this.openProjectToolStripButton.ToolTipText = "Open Project..."; - this.openProjectToolStripButton.Click += new System.EventHandler(this.openProjectToolStripMenuItem_Click); - // - // saveToolStripButton - // - this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.saveToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save; - this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.saveToolStripButton.Name = "saveToolStripButton"; - this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); - this.saveToolStripButton.ToolTipText = "Save Project"; - this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25); - // - // newClassToolStripButton - // - this.newClassToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.newClassToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; - this.newClassToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.newClassToolStripButton.Name = "newClassToolStripButton"; - this.newClassToolStripButton.Size = new System.Drawing.Size(23, 22); - this.newClassToolStripButton.Text = "addClassToolStripButton"; - this.newClassToolStripButton.ToolTipText = "Add a new class to this project"; - this.newClassToolStripButton.Click += new System.EventHandler(this.newClassToolStripButton_Click); - // - // addBytesToolStripDropDownButton - // - this.addBytesToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.addBytesToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.add4BytesToolStripMenuItem, - this.add8BytesToolStripMenuItem, - this.add64BytesToolStripMenuItem, - this.add256BytesToolStripMenuItem, - this.add1024BytesToolStripMenuItem, - this.add2048BytesToolStripMenuItem, - this.add4096BytesToolStripMenuItem, - this.addXBytesToolStripMenuItem}); - this.addBytesToolStripDropDownButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; - this.addBytesToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.addBytesToolStripDropDownButton.Name = "addBytesToolStripDropDownButton"; - this.addBytesToolStripDropDownButton.Size = new System.Drawing.Size(29, 22); - // - // add4BytesToolStripMenuItem - // - this.add4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4; - this.add4BytesToolStripMenuItem.Name = "add4BytesToolStripMenuItem"; - this.add4BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add4BytesToolStripMenuItem.Tag = ""; - this.add4BytesToolStripMenuItem.Text = "Add 4 Bytes"; - this.add4BytesToolStripMenuItem.Value = 4; - this.add4BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add8BytesToolStripMenuItem - // - this.add8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_8; - this.add8BytesToolStripMenuItem.Name = "add8BytesToolStripMenuItem"; - this.add8BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add8BytesToolStripMenuItem.Text = "Add 8 Bytes"; - this.add8BytesToolStripMenuItem.Value = 8; - this.add8BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add64BytesToolStripMenuItem - // - this.add64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_64; - this.add64BytesToolStripMenuItem.Name = "add64BytesToolStripMenuItem"; - this.add64BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add64BytesToolStripMenuItem.Text = "Add 64 Bytes"; - this.add64BytesToolStripMenuItem.Value = 64; - this.add64BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add256BytesToolStripMenuItem - // - this.add256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_256; - this.add256BytesToolStripMenuItem.Name = "add256BytesToolStripMenuItem"; - this.add256BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add256BytesToolStripMenuItem.Text = "Add 256 Bytes"; - this.add256BytesToolStripMenuItem.Value = 256; - this.add256BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add1024BytesToolStripMenuItem - // - this.add1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_1024; - this.add1024BytesToolStripMenuItem.Name = "add1024BytesToolStripMenuItem"; - this.add1024BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add1024BytesToolStripMenuItem.Text = "Add 1024 Bytes"; - this.add1024BytesToolStripMenuItem.Value = 1024; - this.add1024BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add2048BytesToolStripMenuItem - // - this.add2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_2048; - this.add2048BytesToolStripMenuItem.Name = "add2048BytesToolStripMenuItem"; - this.add2048BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add2048BytesToolStripMenuItem.Text = "Add 2048 Bytes"; - this.add2048BytesToolStripMenuItem.Value = 2048; - this.add2048BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add4096BytesToolStripMenuItem - // - this.add4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4096; - this.add4096BytesToolStripMenuItem.Name = "add4096BytesToolStripMenuItem"; - this.add4096BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add4096BytesToolStripMenuItem.Text = "Add 4096 Bytes"; - this.add4096BytesToolStripMenuItem.Value = 4096; - this.add4096BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // addXBytesToolStripMenuItem - // - this.addXBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; - this.addXBytesToolStripMenuItem.Name = "addXBytesToolStripMenuItem"; - this.addXBytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.addXBytesToolStripMenuItem.Text = "Add ... Bytes"; - this.addXBytesToolStripMenuItem.Click += new System.EventHandler(this.addXBytesToolStripMenuItem_Click); - // - // insertBytesToolStripDropDownButton - // - this.insertBytesToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.insertBytesToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.insert4BytesToolStripMenuItem, - this.insert8BytesToolStripMenuItem, - this.insert64BytesToolStripMenuItem, - this.insert256BytesToolStripMenuItem, - this.insert1024BytesToolStripMenuItem, - this.insert2048BytesToolStripMenuItem, - this.insert4096BytesToolStripMenuItem, - this.insertXBytesToolStripMenuItem}); - this.insertBytesToolStripDropDownButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; - this.insertBytesToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.insertBytesToolStripDropDownButton.Name = "insertBytesToolStripDropDownButton"; - this.insertBytesToolStripDropDownButton.Size = new System.Drawing.Size(29, 22); - this.insertBytesToolStripDropDownButton.ToolTipText = "Insert bytes at selected position"; - // - // insert4BytesToolStripMenuItem - // - this.insert4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4; - this.insert4BytesToolStripMenuItem.Name = "insert4BytesToolStripMenuItem"; - this.insert4BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert4BytesToolStripMenuItem.Tag = ""; - this.insert4BytesToolStripMenuItem.Text = "Insert 4 Bytes"; - this.insert4BytesToolStripMenuItem.Value = 4; - this.insert4BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert8BytesToolStripMenuItem - // - this.insert8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_8; - this.insert8BytesToolStripMenuItem.Name = "insert8BytesToolStripMenuItem"; - this.insert8BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert8BytesToolStripMenuItem.Text = "Insert 8 Bytes"; - this.insert8BytesToolStripMenuItem.Value = 8; - this.insert8BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert64BytesToolStripMenuItem - // - this.insert64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_64; - this.insert64BytesToolStripMenuItem.Name = "insert64BytesToolStripMenuItem"; - this.insert64BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert64BytesToolStripMenuItem.Text = "Insert 64 Bytes"; - this.insert64BytesToolStripMenuItem.Value = 64; - this.insert64BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert256BytesToolStripMenuItem - // - this.insert256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_256; - this.insert256BytesToolStripMenuItem.Name = "insert256BytesToolStripMenuItem"; - this.insert256BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert256BytesToolStripMenuItem.Text = "Insert 256 Bytes"; - this.insert256BytesToolStripMenuItem.Value = 256; - this.insert256BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert1024BytesToolStripMenuItem - // - this.insert1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_1024; - this.insert1024BytesToolStripMenuItem.Name = "insert1024BytesToolStripMenuItem"; - this.insert1024BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert1024BytesToolStripMenuItem.Text = "Insert 1024 Bytes"; - this.insert1024BytesToolStripMenuItem.Value = 1024; - this.insert1024BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert2048BytesToolStripMenuItem - // - this.insert2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_2048; - this.insert2048BytesToolStripMenuItem.Name = "insert2048BytesToolStripMenuItem"; - this.insert2048BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert2048BytesToolStripMenuItem.Text = "Insert 2048 Bytes"; - this.insert2048BytesToolStripMenuItem.Value = 2048; - this.insert2048BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert4096BytesToolStripMenuItem - // - this.insert4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4096; - this.insert4096BytesToolStripMenuItem.Name = "insert4096BytesToolStripMenuItem"; - this.insert4096BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert4096BytesToolStripMenuItem.Text = "Insert 4096 Bytes"; - this.insert4096BytesToolStripMenuItem.Value = 4096; - this.insert4096BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insertXBytesToolStripMenuItem - // - this.insertXBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; - this.insertXBytesToolStripMenuItem.Name = "insertXBytesToolStripMenuItem"; - this.insertXBytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insertXBytesToolStripMenuItem.Text = "Insert ... Bytes"; - this.insertXBytesToolStripMenuItem.Click += new System.EventHandler(this.insertXBytesToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25); - // - // hex64ToolStripButton - // - this.hex64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; - this.hex64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex64ToolStripButton.Name = "hex64ToolStripButton"; - this.hex64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex64ToolStripButton.ToolTipText = "Hex64"; - this.hex64ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex64Node); - this.hex64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex32ToolStripButton - // - this.hex32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; - this.hex32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex32ToolStripButton.Name = "hex32ToolStripButton"; - this.hex32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex32ToolStripButton.ToolTipText = "Hex32"; - this.hex32ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex32Node); - this.hex32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex16ToolStripButton - // - this.hex16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; - this.hex16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex16ToolStripButton.Name = "hex16ToolStripButton"; - this.hex16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex16ToolStripButton.ToolTipText = "Hex16"; - this.hex16ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex16Node); - this.hex16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex8ToolStripButton - // - this.hex8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; - this.hex8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex8ToolStripButton.Name = "hex8ToolStripButton"; - this.hex8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex8ToolStripButton.ToolTipText = "Hex8"; - this.hex8ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex8Node); - this.hex8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // - // int64ToolStripButton - // - this.int64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; - this.int64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int64ToolStripButton.Name = "int64ToolStripButton"; - this.int64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int64ToolStripButton.ToolTipText = "Int64"; - this.int64ToolStripButton.Value = typeof(ReClassNET.Nodes.Int64Node); - this.int64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int32ToolStripButton - // - this.int32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; - this.int32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int32ToolStripButton.Name = "int32ToolStripButton"; - this.int32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int32ToolStripButton.ToolTipText = "Int32"; - this.int32ToolStripButton.Value = typeof(ReClassNET.Nodes.Int32Node); - this.int32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int16ToolStripButton - // - this.int16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; - this.int16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int16ToolStripButton.Name = "int16ToolStripButton"; - this.int16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int16ToolStripButton.ToolTipText = "Int16"; - this.int16ToolStripButton.Value = typeof(ReClassNET.Nodes.Int16Node); - this.int16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int8ToolStripButton - // - this.int8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; - this.int8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int8ToolStripButton.Name = "int8ToolStripButton"; - this.int8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int8ToolStripButton.ToolTipText = "Int8"; - this.int8ToolStripButton.Value = typeof(ReClassNET.Nodes.Int8Node); - this.int8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(6, 25); - // - // uint64ToolStripButton - // - this.uint64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; - this.uint64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint64ToolStripButton.Name = "uint64ToolStripButton"; - this.uint64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint64ToolStripButton.ToolTipText = "UInt64 / QWORD"; - this.uint64ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt64Node); - this.uint64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint32ToolStripButton - // - this.uint32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; - this.uint32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint32ToolStripButton.Name = "uint32ToolStripButton"; - this.uint32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint32ToolStripButton.ToolTipText = "UInt32 / DWORD"; - this.uint32ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt32Node); - this.uint32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint16ToolStripButton - // - this.uint16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; - this.uint16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint16ToolStripButton.Name = "uint16ToolStripButton"; - this.uint16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint16ToolStripButton.ToolTipText = "UInt16 / WORD"; - this.uint16ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt16Node); - this.uint16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint8ToolStripButton - // - this.uint8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; - this.uint8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint8ToolStripButton.Name = "uint8ToolStripButton"; - this.uint8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint8ToolStripButton.ToolTipText = "UInt8 / BYTE"; - this.uint8ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt8Node); - this.uint8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25); - // - // boolToolStripButton - // - this.boolToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.boolToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; - this.boolToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.boolToolStripButton.Name = "boolToolStripButton"; - this.boolToolStripButton.Size = new System.Drawing.Size(23, 22); - this.boolToolStripButton.ToolTipText = "Bool"; - this.boolToolStripButton.Value = typeof(ReClassNET.Nodes.BoolNode); - this.boolToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // bitFieldToolStripButton - // - this.bitFieldToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.bitFieldToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; - this.bitFieldToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.bitFieldToolStripButton.Name = "bitFieldToolStripButton"; - this.bitFieldToolStripButton.Size = new System.Drawing.Size(23, 22); - this.bitFieldToolStripButton.ToolTipText = "Bit Field"; - this.bitFieldToolStripButton.Value = typeof(ReClassNET.Nodes.BitFieldNode); - this.bitFieldToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator18 - // - this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(6, 25); - // - // floatToolStripButton - // - this.floatToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.floatToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; - this.floatToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.floatToolStripButton.Name = "floatToolStripButton"; - this.floatToolStripButton.Size = new System.Drawing.Size(23, 22); - this.floatToolStripButton.ToolTipText = "Float"; - this.floatToolStripButton.Value = typeof(ReClassNET.Nodes.FloatNode); - this.floatToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // doubleToolStripButton - // - this.doubleToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.doubleToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; - this.doubleToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.doubleToolStripButton.Name = "doubleToolStripButton"; - this.doubleToolStripButton.Size = new System.Drawing.Size(23, 22); - this.doubleToolStripButton.ToolTipText = "Double"; - this.doubleToolStripButton.Value = typeof(ReClassNET.Nodes.DoubleNode); - this.doubleToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(6, 25); - // - // vec4ToolStripButton - // - this.vec4ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec4ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; - this.vec4ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec4ToolStripButton.Name = "vec4ToolStripButton"; - this.vec4ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec4ToolStripButton.ToolTipText = "Vector4"; - this.vec4ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector4Node); - this.vec4ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vec3ToolStripButton - // - this.vec3ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec3ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; - this.vec3ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec3ToolStripButton.Name = "vec3ToolStripButton"; - this.vec3ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec3ToolStripButton.ToolTipText = "Vector3"; - this.vec3ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector3Node); - this.vec3ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vec2ToolStripButton - // - this.vec2ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec2ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; - this.vec2ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec2ToolStripButton.Name = "vec2ToolStripButton"; - this.vec2ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec2ToolStripButton.ToolTipText = "Vector2"; - this.vec2ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector2Node); - this.vec2ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat44ToolStripButton - // - this.mat44ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat44ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; - this.mat44ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat44ToolStripButton.Name = "mat44ToolStripButton"; - this.mat44ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat44ToolStripButton.ToolTipText = "4x4 Matrix"; - this.mat44ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); - this.mat44ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat34ToolStripButton - // - this.mat34ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat34ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; - this.mat34ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat34ToolStripButton.Name = "mat34ToolStripButton"; - this.mat34ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat34ToolStripButton.ToolTipText = "3x4 Matrix"; - this.mat34ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); - this.mat34ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat33ToolStripButton - // - this.mat33ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat33ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; - this.mat33ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat33ToolStripButton.Name = "mat33ToolStripButton"; - this.mat33ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat33ToolStripButton.ToolTipText = "3x3 Matrix"; - this.mat33ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); - this.mat33ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25); - // - // utf8TextToolStripButton - // - this.utf8TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf8TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; - this.utf8TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf8TextToolStripButton.Name = "utf8TextToolStripButton"; - this.utf8TextToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf8TextToolStripButton.ToolTipText = "UTF8 Text"; - this.utf8TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextNode); - this.utf8TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf8TextPtrToolStripButton - // - this.utf8TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf8TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; - this.utf8TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf8TextPtrToolStripButton.Name = "utf8TextPtrToolStripButton"; - this.utf8TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf8TextPtrToolStripButton.ToolTipText = "Pointer to UTF8 text"; - this.utf8TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); - this.utf8TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf16TextToolStripButton - // - this.utf16TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf16TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; - this.utf16TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf16TextToolStripButton.Name = "utf16TextToolStripButton"; - this.utf16TextToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf16TextToolStripButton.ToolTipText = "UTF16 / Unicode Text"; - this.utf16TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextNode); - this.utf16TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf16TextPtrToolStripButton - // - this.utf16TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf16TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; - this.utf16TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf16TextPtrToolStripButton.Name = "utf16TextPtrToolStripButton"; - this.utf16TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf16TextPtrToolStripButton.ToolTipText = "Pointer to UTF16 / Unicode text"; - this.utf16TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); - this.utf16TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(6, 25); - // - // classInstanceToolStripButton6 - // - this.classInstanceToolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.classInstanceToolStripButton6.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; - this.classInstanceToolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; - this.classInstanceToolStripButton6.Name = "classInstanceToolStripButton6"; - this.classInstanceToolStripButton6.Size = new System.Drawing.Size(23, 22); - this.classInstanceToolStripButton6.ToolTipText = "Class instance"; - this.classInstanceToolStripButton6.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); - this.classInstanceToolStripButton6.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // classPtrToolStripButton - // - this.classPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.classPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; - this.classPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.classPtrToolStripButton.Name = "classPtrToolStripButton"; - this.classPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.classPtrToolStripButton.ToolTipText = "Pointer to class instance"; - this.classPtrToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrNode); - this.classPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(6, 25); - // - // arrayToolStripButton - // - this.arrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.arrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; - this.arrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.arrayToolStripButton.Name = "arrayToolStripButton"; - this.arrayToolStripButton.Size = new System.Drawing.Size(23, 22); - this.arrayToolStripButton.ToolTipText = "Array of Classes"; - this.arrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); - this.arrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // ptrArrayToolStripButton - // - this.ptrArrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ptrArrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; - this.ptrArrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ptrArrayToolStripButton.Name = "ptrArrayToolStripButton"; - this.ptrArrayToolStripButton.Size = new System.Drawing.Size(23, 22); - this.ptrArrayToolStripButton.ToolTipText = "Array of Pointers"; - this.ptrArrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); - this.ptrArrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vtableToolStripButton - // - this.vtableToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vtableToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; - this.vtableToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vtableToolStripButton.Name = "vtableToolStripButton"; - this.vtableToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vtableToolStripButton.ToolTipText = "Pointer to VTable"; - this.vtableToolStripButton.Value = typeof(ReClassNET.Nodes.VTableNode); - this.vtableToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // fnPtrToolStripButton - // - this.fnPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.fnPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; - this.fnPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.fnPtrToolStripButton.Name = "fnPtrToolStripButton"; - this.fnPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.fnPtrToolStripButton.ToolTipText = "Pointer to a function"; - this.fnPtrToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); - this.fnPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // fnTypeToolStripButton - // - this.fnTypeToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.fnTypeToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; - this.fnTypeToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.fnTypeToolStripButton.Name = "fnTypeToolStripButton"; - this.fnTypeToolStripButton.Size = new System.Drawing.Size(23, 22); - this.fnTypeToolStripButton.ToolTipText = "Function"; - this.fnTypeToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionNode); - this.fnTypeToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator19 - // - this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(6, 25); - // - // statusStrip - // - this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.processInfoToolStripStatusLabel, - this.infoToolStripStatusLabel}); - this.statusStrip.Location = new System.Drawing.Point(0, 573); - this.statusStrip.Name = "statusStrip"; - this.statusStrip.Size = new System.Drawing.Size(1141, 22); - this.statusStrip.TabIndex = 1; - // - // processInfoToolStripStatusLabel - // - this.processInfoToolStripStatusLabel.Name = "processInfoToolStripStatusLabel"; - this.processInfoToolStripStatusLabel.Size = new System.Drawing.Size(112, 17); - this.processInfoToolStripStatusLabel.Text = "No process selected"; - // - // infoToolStripStatusLabel - // - this.infoToolStripStatusLabel.Name = "infoToolStripStatusLabel"; - this.infoToolStripStatusLabel.Size = new System.Drawing.Size(23, 17); - this.infoToolStripStatusLabel.Text = "<>"; - this.infoToolStripStatusLabel.Visible = false; - // - // mainMenuStrip - // - this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.fileToolStripMenuItem, - this.processToolStripMenuItem, - this.projectToolStripMenuItem, - this.helpToolStripMenuItem}); - this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); - this.mainMenuStrip.Name = "mainMenuStrip"; - this.mainMenuStrip.Size = new System.Drawing.Size(1141, 24); - this.mainMenuStrip.TabIndex = 2; - // - // fileToolStripMenuItem - // - this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.attachToProcessToolStripMenuItem, - this.reattachToProcessToolStripMenuItem, - this.detachToolStripMenuItem, - this.toolStripSeparator1, - this.openProjectToolStripMenuItem, - this.mergeWithProjectToolStripMenuItem, - this.clearProjectToolStripMenuItem, - this.toolStripSeparator2, - this.saveToolStripMenuItem, - this.saveAsToolStripMenuItem, - this.toolStripSeparator3, - this.settingsToolStripMenuItem, - this.pluginsToolStripMenuItem, - this.toolStripSeparator5, - this.quitToolStripMenuItem}); - this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); - this.fileToolStripMenuItem.Text = "File"; - this.fileToolStripMenuItem.DropDownOpening += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpening); - // - // attachToProcessToolStripMenuItem - // - this.attachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; - this.attachToProcessToolStripMenuItem.Name = "attachToProcessToolStripMenuItem"; - this.attachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.attachToProcessToolStripMenuItem.Text = "Attach to Process..."; - this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); - // - // reattachToProcessToolStripMenuItem - // - this.reattachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Arrow; - this.reattachToProcessToolStripMenuItem.Name = "reattachToProcessToolStripMenuItem"; - this.reattachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.reattachToProcessToolStripMenuItem.Text = "<>"; - this.reattachToProcessToolStripMenuItem.Click += new System.EventHandler(this.reattachToProcessToolStripMenuItem_Click); - // - // detachToolStripMenuItem - // - this.detachToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Remove; - this.detachToolStripMenuItem.Name = "detachToolStripMenuItem"; - this.detachToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.detachToolStripMenuItem.Text = "Detach"; - this.detachToolStripMenuItem.Click += new System.EventHandler(this.detachToolStripMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(243, 6); - // - // openProjectToolStripMenuItem - // - this.openProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; - this.openProjectToolStripMenuItem.Name = "openProjectToolStripMenuItem"; - this.openProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.openProjectToolStripMenuItem.Text = "Open Project..."; - this.openProjectToolStripMenuItem.Click += new System.EventHandler(this.openProjectToolStripMenuItem_Click); - // - // mergeWithProjectToolStripMenuItem - // - this.mergeWithProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder_Add; - this.mergeWithProjectToolStripMenuItem.Name = "mergeWithProjectToolStripMenuItem"; - this.mergeWithProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.mergeWithProjectToolStripMenuItem.Text = "Merge with Project..."; - this.mergeWithProjectToolStripMenuItem.Click += new System.EventHandler(this.mergeWithProjectToolStripMenuItem_Click); - // - // clearProjectToolStripMenuItem - // - this.clearProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Arrow_Refresh; - this.clearProjectToolStripMenuItem.Name = "clearProjectToolStripMenuItem"; - this.clearProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.clearProjectToolStripMenuItem.Text = "Clear Project"; - this.clearProjectToolStripMenuItem.Click += new System.EventHandler(this.clearProjectToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(243, 6); - // - // saveToolStripMenuItem - // - this.saveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Save; - this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.saveToolStripMenuItem.Text = "Save"; - this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); - // - // saveAsToolStripMenuItem - // - this.saveAsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; - this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; - this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.S))); - this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.saveAsToolStripMenuItem.Text = "Save as..."; - this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(243, 6); - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Cogs; - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.settingsToolStripMenuItem.Text = "Settings..."; - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); - // - // pluginsToolStripMenuItem - // - this.pluginsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Plugin; - this.pluginsToolStripMenuItem.Name = "pluginsToolStripMenuItem"; - this.pluginsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.pluginsToolStripMenuItem.Text = "Plugins..."; - this.pluginsToolStripMenuItem.Click += new System.EventHandler(this.pluginsToolStripButton_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(243, 6); - // - // quitToolStripMenuItem - // - this.quitToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Quit; - this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; - this.quitToolStripMenuItem.Size = new System.Drawing.Size(246, 22); - this.quitToolStripMenuItem.Text = "Quit"; - this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click); - // - // processToolStripMenuItem - // - this.processToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.processInformationsToolStripMenuItem, - this.memorySearcherToolStripMenuItem, - this.toolStripSeparator17, - this.loadSymbolToolStripMenuItem, - this.loadSymbolsToolStripMenuItem, - this.toolStripSeparator4, - this.resumeProcessToolStripMenuItem, - this.suspendProcessToolStripMenuItem, - this.terminateProcessToolStripMenuItem}); - this.processToolStripMenuItem.Name = "processToolStripMenuItem"; - this.processToolStripMenuItem.Size = new System.Drawing.Size(59, 20); - this.processToolStripMenuItem.Text = "Process"; - // - // processInformationsToolStripMenuItem - // - this.processInformationsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; - this.processInformationsToolStripMenuItem.Name = "processInformationsToolStripMenuItem"; - this.processInformationsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.processInformationsToolStripMenuItem.Text = "Process Informations"; - this.processInformationsToolStripMenuItem.Click += new System.EventHandler(this.memoryViewerToolStripMenuItem_Click); - // - // memorySearcherToolStripMenuItem - // - this.memorySearcherToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.memorySearcherToolStripMenuItem.Name = "memorySearcherToolStripMenuItem"; - this.memorySearcherToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.memorySearcherToolStripMenuItem.Text = "Memory Searcher"; - this.memorySearcherToolStripMenuItem.Click += new System.EventHandler(this.memorySearcherToolStripMenuItem_Click); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(182, 6); - // - // loadSymbolToolStripMenuItem - // - this.loadSymbolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Pdb; - this.loadSymbolToolStripMenuItem.Name = "loadSymbolToolStripMenuItem"; - this.loadSymbolToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.loadSymbolToolStripMenuItem.Text = "Load Symbol..."; - this.loadSymbolToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolToolStripMenuItem_Click); - // - // loadSymbolsToolStripMenuItem - // - this.loadSymbolsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("loadSymbolsToolStripMenuItem.Image"))); - this.loadSymbolsToolStripMenuItem.Name = "loadSymbolsToolStripMenuItem"; - this.loadSymbolsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.loadSymbolsToolStripMenuItem.Text = "Load all Symbols"; - this.loadSymbolsToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolsToolStripMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6); - // - // resumeProcessToolStripMenuItem - // - this.resumeProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Play; - this.resumeProcessToolStripMenuItem.Name = "resumeProcessToolStripMenuItem"; - this.resumeProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.resumeProcessToolStripMenuItem.Text = "Resume"; - this.resumeProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); - // - // suspendProcessToolStripMenuItem - // - this.suspendProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Pause; - this.suspendProcessToolStripMenuItem.Name = "suspendProcessToolStripMenuItem"; - this.suspendProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.suspendProcessToolStripMenuItem.Text = "Suspend"; - this.suspendProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); - // - // terminateProcessToolStripMenuItem - // - this.terminateProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Stop; - this.terminateProcessToolStripMenuItem.Name = "terminateProcessToolStripMenuItem"; - this.terminateProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.terminateProcessToolStripMenuItem.Text = "Kill"; - this.terminateProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); - // - // projectToolStripMenuItem - // - this.projectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cleanUnusedClassesToolStripMenuItem, - this.toolStripSeparator16, - this.generateCppCodeToolStripMenuItem, - this.generateCSharpCodeToolStripMenuItem}); - this.projectToolStripMenuItem.Name = "projectToolStripMenuItem"; - this.projectToolStripMenuItem.Size = new System.Drawing.Size(56, 20); - this.projectToolStripMenuItem.Text = "Project"; - // - // cleanUnusedClassesToolStripMenuItem - // - this.cleanUnusedClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; - this.cleanUnusedClassesToolStripMenuItem.Name = "cleanUnusedClassesToolStripMenuItem"; - this.cleanUnusedClassesToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.cleanUnusedClassesToolStripMenuItem.Text = "Remove unused classes"; - this.cleanUnusedClassesToolStripMenuItem.Click += new System.EventHandler(this.cleanUnusedClassesToolStripMenuItem_Click); - // - // toolStripSeparator16 - // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(195, 6); - // - // generateCppCodeToolStripMenuItem - // - this.generateCppCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; - this.generateCppCodeToolStripMenuItem.Name = "generateCppCodeToolStripMenuItem"; - this.generateCppCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.generateCppCodeToolStripMenuItem.Text = "Generate C++ Code"; - this.generateCppCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCppCodeToolStripMenuItem_Click); - // - // generateCSharpCodeToolStripMenuItem - // - this.generateCSharpCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Csharp; - this.generateCSharpCodeToolStripMenuItem.Name = "generateCSharpCodeToolStripMenuItem"; - this.generateCSharpCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.generateCSharpCodeToolStripMenuItem.Text = "Generate C# Code"; - this.generateCSharpCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCSharpCodeToolStripMenuItem_Click); - // - // helpToolStripMenuItem - // - this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.aboutToolStripMenuItem}); - this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; - this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); - this.helpToolStripMenuItem.Text = "Help"; - // - // aboutToolStripMenuItem - // - this.aboutToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Information; - this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(116, 22); - this.aboutToolStripMenuItem.Text = "About..."; - this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); - // - // MainForm - // - this.AllowDrop = true; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1141, 595); - this.Controls.Add(this.splitContainer); - this.Controls.Add(this.toolStrip); - this.Controls.Add(this.statusStrip); - this.Controls.Add(this.mainMenuStrip); - this.MainMenuStrip = this.mainMenuStrip; - this.MinimumSize = new System.Drawing.Size(200, 100); - this.Name = "MainForm"; - this.Text = "ReClass.NET"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); - this.DragDrop += new System.Windows.Forms.DragEventHandler(this.MainForm_DragDrop); - this.DragEnter += new System.Windows.Forms.DragEventHandler(this.MainForm_DragEnter); - this.splitContainer.Panel1.ResumeLayout(false); - this.splitContainer.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); - this.splitContainer.ResumeLayout(false); - this.toolStrip.ResumeLayout(false); - this.toolStrip.PerformLayout(); - this.statusStrip.ResumeLayout(false); - this.statusStrip.PerformLayout(); - this.mainMenuStrip.ResumeLayout(false); - this.mainMenuStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - - #endregion - - private UI.MemoryViewControl memoryViewControl; - private System.Windows.Forms.StatusStrip statusStrip; - private System.Windows.Forms.MenuStrip mainMenuStrip; - private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem attachToProcessToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem clearProjectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem openProjectToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem processToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem processInformationsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem resumeProcessToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem suspendProcessToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem terminateProcessToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem loadSymbolsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; - private System.Windows.Forms.ToolStrip toolStrip; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private System.Windows.Forms.SplitContainer splitContainer; - private System.Windows.Forms.ToolStripStatusLabel processInfoToolStripStatusLabel; - private System.Windows.Forms.ToolStripMenuItem pluginsToolStripMenuItem; - private System.Windows.Forms.ToolStripButton saveToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private System.Windows.Forms.ToolStripButton newClassToolStripButton; - private System.Windows.Forms.ToolStripDropDownButton addBytesToolStripDropDownButton; - private UI.IntegerToolStripMenuItem add4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add4096BytesToolStripMenuItem; - private System.Windows.Forms.ToolStripDropDownButton insertBytesToolStripDropDownButton; - private UI.IntegerToolStripMenuItem insert4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addXBytesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem insertXBytesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private UI.TypeToolStripButton hex64ToolStripButton; - private UI.TypeToolStripButton hex32ToolStripButton; - private UI.TypeToolStripButton hex16ToolStripButton; - private UI.TypeToolStripButton hex8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private UI.TypeToolStripButton int64ToolStripButton; - private UI.TypeToolStripButton int32ToolStripButton; - private UI.TypeToolStripButton int16ToolStripButton; - private UI.TypeToolStripButton int8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private UI.TypeToolStripButton uint64ToolStripButton; - private UI.TypeToolStripButton uint32ToolStripButton; - private UI.TypeToolStripButton uint16ToolStripButton; - private UI.TypeToolStripButton uint8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private UI.TypeToolStripButton floatToolStripButton; - private UI.TypeToolStripButton doubleToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; - private UI.TypeToolStripButton vec4ToolStripButton; - private UI.TypeToolStripButton vec3ToolStripButton; - private UI.TypeToolStripButton vec2ToolStripButton; - private UI.TypeToolStripButton mat44ToolStripButton; - private UI.TypeToolStripButton mat34ToolStripButton; - private UI.TypeToolStripButton mat33ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private UI.TypeToolStripButton utf8TextToolStripButton; - private UI.TypeToolStripButton utf8TextPtrToolStripButton; - private UI.TypeToolStripButton utf16TextToolStripButton; - private UI.TypeToolStripButton utf16TextPtrToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private UI.TypeToolStripButton classInstanceToolStripButton6; - private UI.TypeToolStripButton classPtrToolStripButton; - private UI.TypeToolStripButton arrayToolStripButton; - private UI.TypeToolStripButton vtableToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; - private UI.TypeToolStripButton fnPtrToolStripButton; - private UI.ClassNodeView classesView; - private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cleanUnusedClassesToolStripMenuItem; - private UI.TypeToolStripButton ptrArrayToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; - private System.Windows.Forms.ToolStripMenuItem generateCppCodeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem generateCSharpCodeToolStripMenuItem; - private System.Windows.Forms.Timer processUpdateTimer; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; - private System.Windows.Forms.ToolStripMenuItem loadSymbolToolStripMenuItem; - private System.Windows.Forms.ToolStripButton openProjectToolStripButton; - private UI.TypeToolStripButton bitFieldToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; - private System.Windows.Forms.ToolStripStatusLabel infoToolStripStatusLabel; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; - private System.Windows.Forms.ToolStripMenuItem mergeWithProjectToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem detachToolStripMenuItem; - private UI.TypeToolStripButton boolToolStripButton; - private UI.TypeToolStripButton fnTypeToolStripButton; - private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; - private System.Windows.Forms.ToolStripSplitButton attachToProcessToolStripSplitButton; - } -} - +namespace ReClassNET.Forms +{ + partial class MainForm + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.classesView = new ReClassNET.UI.ClassNodeView(); + this.memoryViewControl = new ReClassNET.UI.MemoryViewControl(); + this.toolStrip = new System.Windows.Forms.ToolStrip(); + this.attachToProcessToolStripSplitButton = new System.Windows.Forms.ToolStripSplitButton(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.openProjectToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.newClassToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.addBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); + this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.addXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insertBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); + this.insert4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insertXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.hex64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.hex32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.hex16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.hex8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.int64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.int32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.int16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.int8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.uint64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.uint32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.uint16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.uint8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.boolToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.bitFieldToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); + this.floatToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.doubleToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.vec4ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.vec3ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.vec2ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.mat44ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.mat34ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.mat33ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.utf8TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.utf8TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.utf16TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.utf16TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.classInstanceToolStripButton6 = new ReClassNET.UI.TypeToolStripButton(); + this.classPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.arrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.ptrArrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.vtableToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.fnPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.fnTypeToolStripButton = new ReClassNET.UI.TypeToolStripButton(); + this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.processInfoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.infoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.mainMenuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.attachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reattachToProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.detachToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.openProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeWithProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clearProjectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pluginsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.processToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.processInformationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.memorySearcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); + this.loadSymbolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadSymbolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.resumeProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.suspendProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.terminateProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cleanUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.generateCppCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateCSharpCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.toolStrip.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.mainMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // processUpdateTimer + // + this.processUpdateTimer.Enabled = true; + this.processUpdateTimer.Interval = 5000; + this.processUpdateTimer.Tick += new System.EventHandler(this.processUpdateTimer_Tick); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer.Location = new System.Drawing.Point(0, 49); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.classesView); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer.Panel2.Controls.Add(this.memoryViewControl); + this.splitContainer.Size = new System.Drawing.Size(1141, 524); + this.splitContainer.SplitterDistance = 201; + this.splitContainer.TabIndex = 4; + // + // classesView + // + this.classesView.Dock = System.Windows.Forms.DockStyle.Fill; + this.classesView.Location = new System.Drawing.Point(0, 0); + this.classesView.Name = "classesView"; + this.classesView.Size = new System.Drawing.Size(201, 524); + this.classesView.TabIndex = 0; + this.classesView.SelectionChanged += new ReClassNET.UI.ClassNodeView.SelectionChangedEvent(this.classesView_ClassSelected); + // + // memoryViewControl + // + this.memoryViewControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.memoryViewControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.memoryViewControl.Location = new System.Drawing.Point(0, 0); + this.memoryViewControl.Name = "memoryViewControl"; + this.memoryViewControl.Size = new System.Drawing.Size(936, 524); + this.memoryViewControl.TabIndex = 0; + this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); + // + // toolStrip + // + this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.attachToProcessToolStripSplitButton, + this.toolStripSeparator6, + this.openProjectToolStripButton, + this.saveToolStripButton, + this.toolStripSeparator7, + this.newClassToolStripButton, + this.addBytesToolStripDropDownButton, + this.insertBytesToolStripDropDownButton, + this.toolStripSeparator8, + this.hex64ToolStripButton, + this.hex32ToolStripButton, + this.hex16ToolStripButton, + this.hex8ToolStripButton, + this.toolStripSeparator9, + this.int64ToolStripButton, + this.int32ToolStripButton, + this.int16ToolStripButton, + this.int8ToolStripButton, + this.toolStripSeparator10, + this.uint64ToolStripButton, + this.uint32ToolStripButton, + this.uint16ToolStripButton, + this.uint8ToolStripButton, + this.toolStripSeparator11, + this.boolToolStripButton, + this.bitFieldToolStripButton, + this.toolStripSeparator18, + this.floatToolStripButton, + this.doubleToolStripButton, + this.toolStripSeparator12, + this.vec4ToolStripButton, + this.vec3ToolStripButton, + this.vec2ToolStripButton, + this.mat44ToolStripButton, + this.mat34ToolStripButton, + this.mat33ToolStripButton, + this.toolStripSeparator13, + this.utf8TextToolStripButton, + this.utf8TextPtrToolStripButton, + this.utf16TextToolStripButton, + this.utf16TextPtrToolStripButton, + this.toolStripSeparator14, + this.classInstanceToolStripButton6, + this.classPtrToolStripButton, + this.toolStripSeparator15, + this.arrayToolStripButton, + this.ptrArrayToolStripButton, + this.vtableToolStripButton, + this.fnPtrToolStripButton, + this.fnTypeToolStripButton, + this.toolStripSeparator19}); + this.toolStrip.Location = new System.Drawing.Point(0, 24); + this.toolStrip.Name = "toolStrip"; + this.toolStrip.Size = new System.Drawing.Size(1141, 25); + this.toolStrip.TabIndex = 3; + // + // attachToProcessToolStripSplitButton + // + this.attachToProcessToolStripSplitButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.attachToProcessToolStripSplitButton.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; + this.attachToProcessToolStripSplitButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.attachToProcessToolStripSplitButton.Name = "attachToProcessToolStripSplitButton"; + this.attachToProcessToolStripSplitButton.Size = new System.Drawing.Size(32, 22); + this.attachToProcessToolStripSplitButton.ToolTipText = "Attach to Process..."; + this.attachToProcessToolStripSplitButton.ButtonClick += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); + this.attachToProcessToolStripSplitButton.DropDownClosed += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownClosed); + this.attachToProcessToolStripSplitButton.DropDownOpening += new System.EventHandler(this.attachToProcessToolStripSplitButton_DropDownOpening); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25); + // + // openProjectToolStripButton + // + this.openProjectToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openProjectToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; + this.openProjectToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openProjectToolStripButton.Name = "openProjectToolStripButton"; + this.openProjectToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openProjectToolStripButton.ToolTipText = "Open Project..."; + this.openProjectToolStripButton.Click += new System.EventHandler(this.openProjectToolStripMenuItem_Click); + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Save; + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.ToolTipText = "Save Project"; + this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25); + // + // newClassToolStripButton + // + this.newClassToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newClassToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; + this.newClassToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newClassToolStripButton.Name = "newClassToolStripButton"; + this.newClassToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newClassToolStripButton.Text = "addClassToolStripButton"; + this.newClassToolStripButton.ToolTipText = "Add a new class to this project"; + this.newClassToolStripButton.Click += new System.EventHandler(this.newClassToolStripButton_Click); + // + // addBytesToolStripDropDownButton + // + this.addBytesToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.addBytesToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.add4BytesToolStripMenuItem, + this.add8BytesToolStripMenuItem, + this.add64BytesToolStripMenuItem, + this.add256BytesToolStripMenuItem, + this.add1024BytesToolStripMenuItem, + this.add2048BytesToolStripMenuItem, + this.add4096BytesToolStripMenuItem, + this.addXBytesToolStripMenuItem}); + this.addBytesToolStripDropDownButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; + this.addBytesToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.addBytesToolStripDropDownButton.Name = "addBytesToolStripDropDownButton"; + this.addBytesToolStripDropDownButton.Size = new System.Drawing.Size(29, 22); + // + // add4BytesToolStripMenuItem + // + this.add4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4; + this.add4BytesToolStripMenuItem.Name = "add4BytesToolStripMenuItem"; + this.add4BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add4BytesToolStripMenuItem.Tag = ""; + this.add4BytesToolStripMenuItem.Text = "Add 4 Bytes"; + this.add4BytesToolStripMenuItem.Value = 4; + this.add4BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add8BytesToolStripMenuItem + // + this.add8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_8; + this.add8BytesToolStripMenuItem.Name = "add8BytesToolStripMenuItem"; + this.add8BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add8BytesToolStripMenuItem.Text = "Add 8 Bytes"; + this.add8BytesToolStripMenuItem.Value = 8; + this.add8BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add64BytesToolStripMenuItem + // + this.add64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_64; + this.add64BytesToolStripMenuItem.Name = "add64BytesToolStripMenuItem"; + this.add64BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add64BytesToolStripMenuItem.Text = "Add 64 Bytes"; + this.add64BytesToolStripMenuItem.Value = 64; + this.add64BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add256BytesToolStripMenuItem + // + this.add256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_256; + this.add256BytesToolStripMenuItem.Name = "add256BytesToolStripMenuItem"; + this.add256BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add256BytesToolStripMenuItem.Text = "Add 256 Bytes"; + this.add256BytesToolStripMenuItem.Value = 256; + this.add256BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add1024BytesToolStripMenuItem + // + this.add1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_1024; + this.add1024BytesToolStripMenuItem.Name = "add1024BytesToolStripMenuItem"; + this.add1024BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add1024BytesToolStripMenuItem.Text = "Add 1024 Bytes"; + this.add1024BytesToolStripMenuItem.Value = 1024; + this.add1024BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add2048BytesToolStripMenuItem + // + this.add2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_2048; + this.add2048BytesToolStripMenuItem.Name = "add2048BytesToolStripMenuItem"; + this.add2048BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add2048BytesToolStripMenuItem.Text = "Add 2048 Bytes"; + this.add2048BytesToolStripMenuItem.Value = 2048; + this.add2048BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add4096BytesToolStripMenuItem + // + this.add4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4096; + this.add4096BytesToolStripMenuItem.Name = "add4096BytesToolStripMenuItem"; + this.add4096BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add4096BytesToolStripMenuItem.Text = "Add 4096 Bytes"; + this.add4096BytesToolStripMenuItem.Value = 4096; + this.add4096BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // addXBytesToolStripMenuItem + // + this.addXBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; + this.addXBytesToolStripMenuItem.Name = "addXBytesToolStripMenuItem"; + this.addXBytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.addXBytesToolStripMenuItem.Text = "Add ... Bytes"; + this.addXBytesToolStripMenuItem.Click += new System.EventHandler(this.addXBytesToolStripMenuItem_Click); + // + // insertBytesToolStripDropDownButton + // + this.insertBytesToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.insertBytesToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.insert4BytesToolStripMenuItem, + this.insert8BytesToolStripMenuItem, + this.insert64BytesToolStripMenuItem, + this.insert256BytesToolStripMenuItem, + this.insert1024BytesToolStripMenuItem, + this.insert2048BytesToolStripMenuItem, + this.insert4096BytesToolStripMenuItem, + this.insertXBytesToolStripMenuItem}); + this.insertBytesToolStripDropDownButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; + this.insertBytesToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.insertBytesToolStripDropDownButton.Name = "insertBytesToolStripDropDownButton"; + this.insertBytesToolStripDropDownButton.Size = new System.Drawing.Size(29, 22); + this.insertBytesToolStripDropDownButton.ToolTipText = "Insert bytes at selected position"; + // + // insert4BytesToolStripMenuItem + // + this.insert4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4; + this.insert4BytesToolStripMenuItem.Name = "insert4BytesToolStripMenuItem"; + this.insert4BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert4BytesToolStripMenuItem.Tag = ""; + this.insert4BytesToolStripMenuItem.Text = "Insert 4 Bytes"; + this.insert4BytesToolStripMenuItem.Value = 4; + this.insert4BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert8BytesToolStripMenuItem + // + this.insert8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_8; + this.insert8BytesToolStripMenuItem.Name = "insert8BytesToolStripMenuItem"; + this.insert8BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert8BytesToolStripMenuItem.Text = "Insert 8 Bytes"; + this.insert8BytesToolStripMenuItem.Value = 8; + this.insert8BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert64BytesToolStripMenuItem + // + this.insert64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_64; + this.insert64BytesToolStripMenuItem.Name = "insert64BytesToolStripMenuItem"; + this.insert64BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert64BytesToolStripMenuItem.Text = "Insert 64 Bytes"; + this.insert64BytesToolStripMenuItem.Value = 64; + this.insert64BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert256BytesToolStripMenuItem + // + this.insert256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_256; + this.insert256BytesToolStripMenuItem.Name = "insert256BytesToolStripMenuItem"; + this.insert256BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert256BytesToolStripMenuItem.Text = "Insert 256 Bytes"; + this.insert256BytesToolStripMenuItem.Value = 256; + this.insert256BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert1024BytesToolStripMenuItem + // + this.insert1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_1024; + this.insert1024BytesToolStripMenuItem.Name = "insert1024BytesToolStripMenuItem"; + this.insert1024BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert1024BytesToolStripMenuItem.Text = "Insert 1024 Bytes"; + this.insert1024BytesToolStripMenuItem.Value = 1024; + this.insert1024BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert2048BytesToolStripMenuItem + // + this.insert2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_2048; + this.insert2048BytesToolStripMenuItem.Name = "insert2048BytesToolStripMenuItem"; + this.insert2048BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert2048BytesToolStripMenuItem.Text = "Insert 2048 Bytes"; + this.insert2048BytesToolStripMenuItem.Value = 2048; + this.insert2048BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert4096BytesToolStripMenuItem + // + this.insert4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4096; + this.insert4096BytesToolStripMenuItem.Name = "insert4096BytesToolStripMenuItem"; + this.insert4096BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert4096BytesToolStripMenuItem.Text = "Insert 4096 Bytes"; + this.insert4096BytesToolStripMenuItem.Value = 4096; + this.insert4096BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insertXBytesToolStripMenuItem + // + this.insertXBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; + this.insertXBytesToolStripMenuItem.Name = "insertXBytesToolStripMenuItem"; + this.insertXBytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insertXBytesToolStripMenuItem.Text = "Insert ... Bytes"; + this.insertXBytesToolStripMenuItem.Click += new System.EventHandler(this.insertXBytesToolStripMenuItem_Click); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25); + // + // hex64ToolStripButton + // + this.hex64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.hex64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; + this.hex64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.hex64ToolStripButton.Name = "hex64ToolStripButton"; + this.hex64ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.hex64ToolStripButton.ToolTipText = "Hex64"; + this.hex64ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex64Node); + this.hex64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // hex32ToolStripButton + // + this.hex32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.hex32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; + this.hex32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.hex32ToolStripButton.Name = "hex32ToolStripButton"; + this.hex32ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.hex32ToolStripButton.ToolTipText = "Hex32"; + this.hex32ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex32Node); + this.hex32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // hex16ToolStripButton + // + this.hex16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.hex16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; + this.hex16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.hex16ToolStripButton.Name = "hex16ToolStripButton"; + this.hex16ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.hex16ToolStripButton.ToolTipText = "Hex16"; + this.hex16ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex16Node); + this.hex16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // hex8ToolStripButton + // + this.hex8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.hex8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; + this.hex8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.hex8ToolStripButton.Name = "hex8ToolStripButton"; + this.hex8ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.hex8ToolStripButton.ToolTipText = "Hex8"; + this.hex8ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex8Node); + this.hex8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); + // + // int64ToolStripButton + // + this.int64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.int64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; + this.int64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.int64ToolStripButton.Name = "int64ToolStripButton"; + this.int64ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.int64ToolStripButton.ToolTipText = "Int64"; + this.int64ToolStripButton.Value = typeof(ReClassNET.Nodes.Int64Node); + this.int64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // int32ToolStripButton + // + this.int32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.int32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; + this.int32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.int32ToolStripButton.Name = "int32ToolStripButton"; + this.int32ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.int32ToolStripButton.ToolTipText = "Int32"; + this.int32ToolStripButton.Value = typeof(ReClassNET.Nodes.Int32Node); + this.int32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // int16ToolStripButton + // + this.int16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.int16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; + this.int16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.int16ToolStripButton.Name = "int16ToolStripButton"; + this.int16ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.int16ToolStripButton.ToolTipText = "Int16"; + this.int16ToolStripButton.Value = typeof(ReClassNET.Nodes.Int16Node); + this.int16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // int8ToolStripButton + // + this.int8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.int8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; + this.int8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.int8ToolStripButton.Name = "int8ToolStripButton"; + this.int8ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.int8ToolStripButton.ToolTipText = "Int8"; + this.int8ToolStripButton.Value = typeof(ReClassNET.Nodes.Int8Node); + this.int8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(6, 25); + // + // uint64ToolStripButton + // + this.uint64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.uint64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; + this.uint64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.uint64ToolStripButton.Name = "uint64ToolStripButton"; + this.uint64ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.uint64ToolStripButton.ToolTipText = "UInt64 / QWORD"; + this.uint64ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt64Node); + this.uint64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // uint32ToolStripButton + // + this.uint32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.uint32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; + this.uint32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.uint32ToolStripButton.Name = "uint32ToolStripButton"; + this.uint32ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.uint32ToolStripButton.ToolTipText = "UInt32 / DWORD"; + this.uint32ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt32Node); + this.uint32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // uint16ToolStripButton + // + this.uint16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.uint16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; + this.uint16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.uint16ToolStripButton.Name = "uint16ToolStripButton"; + this.uint16ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.uint16ToolStripButton.ToolTipText = "UInt16 / WORD"; + this.uint16ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt16Node); + this.uint16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // uint8ToolStripButton + // + this.uint8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.uint8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; + this.uint8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.uint8ToolStripButton.Name = "uint8ToolStripButton"; + this.uint8ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.uint8ToolStripButton.ToolTipText = "UInt8 / BYTE"; + this.uint8ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt8Node); + this.uint8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25); + // + // boolToolStripButton + // + this.boolToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.boolToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; + this.boolToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.boolToolStripButton.Name = "boolToolStripButton"; + this.boolToolStripButton.Size = new System.Drawing.Size(23, 22); + this.boolToolStripButton.ToolTipText = "Bool"; + this.boolToolStripButton.Value = typeof(ReClassNET.Nodes.BoolNode); + this.boolToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // bitFieldToolStripButton + // + this.bitFieldToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bitFieldToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; + this.bitFieldToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bitFieldToolStripButton.Name = "bitFieldToolStripButton"; + this.bitFieldToolStripButton.Size = new System.Drawing.Size(23, 22); + this.bitFieldToolStripButton.ToolTipText = "Bit Field"; + this.bitFieldToolStripButton.Value = typeof(ReClassNET.Nodes.BitFieldNode); + this.bitFieldToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator18 + // + this.toolStripSeparator18.Name = "toolStripSeparator18"; + this.toolStripSeparator18.Size = new System.Drawing.Size(6, 25); + // + // floatToolStripButton + // + this.floatToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.floatToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; + this.floatToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.floatToolStripButton.Name = "floatToolStripButton"; + this.floatToolStripButton.Size = new System.Drawing.Size(23, 22); + this.floatToolStripButton.ToolTipText = "Float"; + this.floatToolStripButton.Value = typeof(ReClassNET.Nodes.FloatNode); + this.floatToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // doubleToolStripButton + // + this.doubleToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.doubleToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; + this.doubleToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.doubleToolStripButton.Name = "doubleToolStripButton"; + this.doubleToolStripButton.Size = new System.Drawing.Size(23, 22); + this.doubleToolStripButton.ToolTipText = "Double"; + this.doubleToolStripButton.Value = typeof(ReClassNET.Nodes.DoubleNode); + this.doubleToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(6, 25); + // + // vec4ToolStripButton + // + this.vec4ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.vec4ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; + this.vec4ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.vec4ToolStripButton.Name = "vec4ToolStripButton"; + this.vec4ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.vec4ToolStripButton.ToolTipText = "Vector4"; + this.vec4ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector4Node); + this.vec4ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // vec3ToolStripButton + // + this.vec3ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.vec3ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; + this.vec3ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.vec3ToolStripButton.Name = "vec3ToolStripButton"; + this.vec3ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.vec3ToolStripButton.ToolTipText = "Vector3"; + this.vec3ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector3Node); + this.vec3ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // vec2ToolStripButton + // + this.vec2ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.vec2ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; + this.vec2ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.vec2ToolStripButton.Name = "vec2ToolStripButton"; + this.vec2ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.vec2ToolStripButton.ToolTipText = "Vector2"; + this.vec2ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector2Node); + this.vec2ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // mat44ToolStripButton + // + this.mat44ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mat44ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; + this.mat44ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mat44ToolStripButton.Name = "mat44ToolStripButton"; + this.mat44ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.mat44ToolStripButton.ToolTipText = "4x4 Matrix"; + this.mat44ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); + this.mat44ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // mat34ToolStripButton + // + this.mat34ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mat34ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; + this.mat34ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mat34ToolStripButton.Name = "mat34ToolStripButton"; + this.mat34ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.mat34ToolStripButton.ToolTipText = "3x4 Matrix"; + this.mat34ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); + this.mat34ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // mat33ToolStripButton + // + this.mat33ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mat33ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; + this.mat33ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mat33ToolStripButton.Name = "mat33ToolStripButton"; + this.mat33ToolStripButton.Size = new System.Drawing.Size(23, 22); + this.mat33ToolStripButton.ToolTipText = "3x3 Matrix"; + this.mat33ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); + this.mat33ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25); + // + // utf8TextToolStripButton + // + this.utf8TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.utf8TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; + this.utf8TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.utf8TextToolStripButton.Name = "utf8TextToolStripButton"; + this.utf8TextToolStripButton.Size = new System.Drawing.Size(23, 22); + this.utf8TextToolStripButton.ToolTipText = "UTF8 Text"; + this.utf8TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextNode); + this.utf8TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // utf8TextPtrToolStripButton + // + this.utf8TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.utf8TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; + this.utf8TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.utf8TextPtrToolStripButton.Name = "utf8TextPtrToolStripButton"; + this.utf8TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); + this.utf8TextPtrToolStripButton.ToolTipText = "Pointer to UTF8 text"; + this.utf8TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); + this.utf8TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // utf16TextToolStripButton + // + this.utf16TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.utf16TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; + this.utf16TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.utf16TextToolStripButton.Name = "utf16TextToolStripButton"; + this.utf16TextToolStripButton.Size = new System.Drawing.Size(23, 22); + this.utf16TextToolStripButton.ToolTipText = "UTF16 / Unicode Text"; + this.utf16TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextNode); + this.utf16TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // utf16TextPtrToolStripButton + // + this.utf16TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.utf16TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; + this.utf16TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.utf16TextPtrToolStripButton.Name = "utf16TextPtrToolStripButton"; + this.utf16TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); + this.utf16TextPtrToolStripButton.ToolTipText = "Pointer to UTF16 / Unicode text"; + this.utf16TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); + this.utf16TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(6, 25); + // + // classInstanceToolStripButton6 + // + this.classInstanceToolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.classInstanceToolStripButton6.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; + this.classInstanceToolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; + this.classInstanceToolStripButton6.Name = "classInstanceToolStripButton6"; + this.classInstanceToolStripButton6.Size = new System.Drawing.Size(23, 22); + this.classInstanceToolStripButton6.ToolTipText = "Class instance"; + this.classInstanceToolStripButton6.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); + this.classInstanceToolStripButton6.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // classPtrToolStripButton + // + this.classPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.classPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; + this.classPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.classPtrToolStripButton.Name = "classPtrToolStripButton"; + this.classPtrToolStripButton.Size = new System.Drawing.Size(23, 22); + this.classPtrToolStripButton.ToolTipText = "Pointer to class instance"; + this.classPtrToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrNode); + this.classPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(6, 25); + // + // arrayToolStripButton + // + this.arrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.arrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; + this.arrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.arrayToolStripButton.Name = "arrayToolStripButton"; + this.arrayToolStripButton.Size = new System.Drawing.Size(23, 22); + this.arrayToolStripButton.ToolTipText = "Array of Classes"; + this.arrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); + this.arrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // ptrArrayToolStripButton + // + this.ptrArrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.ptrArrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; + this.ptrArrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.ptrArrayToolStripButton.Name = "ptrArrayToolStripButton"; + this.ptrArrayToolStripButton.Size = new System.Drawing.Size(23, 22); + this.ptrArrayToolStripButton.ToolTipText = "Array of Pointers"; + this.ptrArrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); + this.ptrArrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // vtableToolStripButton + // + this.vtableToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.vtableToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; + this.vtableToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.vtableToolStripButton.Name = "vtableToolStripButton"; + this.vtableToolStripButton.Size = new System.Drawing.Size(23, 22); + this.vtableToolStripButton.ToolTipText = "Pointer to VTable"; + this.vtableToolStripButton.Value = typeof(ReClassNET.Nodes.VTableNode); + this.vtableToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // fnPtrToolStripButton + // + this.fnPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.fnPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; + this.fnPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.fnPtrToolStripButton.Name = "fnPtrToolStripButton"; + this.fnPtrToolStripButton.Size = new System.Drawing.Size(23, 22); + this.fnPtrToolStripButton.ToolTipText = "Pointer to a function"; + this.fnPtrToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); + this.fnPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // fnTypeToolStripButton + // + this.fnTypeToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.fnTypeToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; + this.fnTypeToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.fnTypeToolStripButton.Name = "fnTypeToolStripButton"; + this.fnTypeToolStripButton.Size = new System.Drawing.Size(23, 22); + this.fnTypeToolStripButton.ToolTipText = "Function"; + this.fnTypeToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionNode); + this.fnTypeToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); + // + // toolStripSeparator19 + // + this.toolStripSeparator19.Name = "toolStripSeparator19"; + this.toolStripSeparator19.Size = new System.Drawing.Size(6, 25); + // + // statusStrip + // + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.processInfoToolStripStatusLabel, + this.infoToolStripStatusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 573); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(1141, 22); + this.statusStrip.TabIndex = 1; + // + // processInfoToolStripStatusLabel + // + this.processInfoToolStripStatusLabel.Name = "processInfoToolStripStatusLabel"; + this.processInfoToolStripStatusLabel.Size = new System.Drawing.Size(112, 17); + this.processInfoToolStripStatusLabel.Text = "No process selected"; + // + // infoToolStripStatusLabel + // + this.infoToolStripStatusLabel.Name = "infoToolStripStatusLabel"; + this.infoToolStripStatusLabel.Size = new System.Drawing.Size(23, 17); + this.infoToolStripStatusLabel.Text = "<>"; + this.infoToolStripStatusLabel.Visible = false; + // + // mainMenuStrip + // + this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.processToolStripMenuItem, + this.projectToolStripMenuItem, + this.helpToolStripMenuItem}); + this.mainMenuStrip.Location = new System.Drawing.Point(0, 0); + this.mainMenuStrip.Name = "mainMenuStrip"; + this.mainMenuStrip.Size = new System.Drawing.Size(1141, 24); + this.mainMenuStrip.TabIndex = 2; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.attachToProcessToolStripMenuItem, + this.reattachToProcessToolStripMenuItem, + this.detachToolStripMenuItem, + this.toolStripSeparator1, + this.openProjectToolStripMenuItem, + this.mergeWithProjectToolStripMenuItem, + this.clearProjectToolStripMenuItem, + this.toolStripSeparator2, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator3, + this.settingsToolStripMenuItem, + this.pluginsToolStripMenuItem, + this.toolStripSeparator5, + this.quitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + this.fileToolStripMenuItem.DropDownOpening += new System.EventHandler(this.fileToolStripMenuItem_DropDownOpening); + // + // attachToProcessToolStripMenuItem + // + this.attachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; + this.attachToProcessToolStripMenuItem.Name = "attachToProcessToolStripMenuItem"; + this.attachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.attachToProcessToolStripMenuItem.Text = "Attach to Process..."; + this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); + // + // reattachToProcessToolStripMenuItem + // + this.reattachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Arrow; + this.reattachToProcessToolStripMenuItem.Name = "reattachToProcessToolStripMenuItem"; + this.reattachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.reattachToProcessToolStripMenuItem.Text = "<>"; + this.reattachToProcessToolStripMenuItem.Click += new System.EventHandler(this.reattachToProcessToolStripMenuItem_Click); + // + // detachToolStripMenuItem + // + this.detachToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Remove; + this.detachToolStripMenuItem.Name = "detachToolStripMenuItem"; + this.detachToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.detachToolStripMenuItem.Text = "Detach"; + this.detachToolStripMenuItem.Click += new System.EventHandler(this.detachToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(243, 6); + // + // openProjectToolStripMenuItem + // + this.openProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; + this.openProjectToolStripMenuItem.Name = "openProjectToolStripMenuItem"; + this.openProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.openProjectToolStripMenuItem.Text = "Open Project..."; + this.openProjectToolStripMenuItem.Click += new System.EventHandler(this.openProjectToolStripMenuItem_Click); + // + // mergeWithProjectToolStripMenuItem + // + this.mergeWithProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder_Add; + this.mergeWithProjectToolStripMenuItem.Name = "mergeWithProjectToolStripMenuItem"; + this.mergeWithProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.mergeWithProjectToolStripMenuItem.Text = "Merge with Project..."; + this.mergeWithProjectToolStripMenuItem.Click += new System.EventHandler(this.mergeWithProjectToolStripMenuItem_Click); + // + // clearProjectToolStripMenuItem + // + this.clearProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Arrow_Refresh; + this.clearProjectToolStripMenuItem.Name = "clearProjectToolStripMenuItem"; + this.clearProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.clearProjectToolStripMenuItem.Text = "Clear Project"; + this.clearProjectToolStripMenuItem.Click += new System.EventHandler(this.clearProjectToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(243, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Save; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.saveToolStripMenuItem.Text = "Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Save_As; + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.saveAsToolStripMenuItem.Text = "Save as..."; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(243, 6); + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Cogs; + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.settingsToolStripMenuItem.Text = "Settings..."; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); + // + // pluginsToolStripMenuItem + // + this.pluginsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Plugin; + this.pluginsToolStripMenuItem.Name = "pluginsToolStripMenuItem"; + this.pluginsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.pluginsToolStripMenuItem.Text = "Plugins..."; + this.pluginsToolStripMenuItem.Click += new System.EventHandler(this.pluginsToolStripButton_Click); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(243, 6); + // + // quitToolStripMenuItem + // + this.quitToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Quit; + this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; + this.quitToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.quitToolStripMenuItem.Text = "Quit"; + this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click); + // + // processToolStripMenuItem + // + this.processToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.processInformationsToolStripMenuItem, + this.memorySearcherToolStripMenuItem, + this.toolStripSeparator17, + this.loadSymbolToolStripMenuItem, + this.loadSymbolsToolStripMenuItem, + this.toolStripSeparator4, + this.resumeProcessToolStripMenuItem, + this.suspendProcessToolStripMenuItem, + this.terminateProcessToolStripMenuItem}); + this.processToolStripMenuItem.Name = "processToolStripMenuItem"; + this.processToolStripMenuItem.Size = new System.Drawing.Size(59, 20); + this.processToolStripMenuItem.Text = "Process"; + // + // processInformationsToolStripMenuItem + // + this.processInformationsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; + this.processInformationsToolStripMenuItem.Name = "processInformationsToolStripMenuItem"; + this.processInformationsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.processInformationsToolStripMenuItem.Text = "Process Informations"; + this.processInformationsToolStripMenuItem.Click += new System.EventHandler(this.memoryViewerToolStripMenuItem_Click); + // + // memorySearcherToolStripMenuItem + // + this.memorySearcherToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.memorySearcherToolStripMenuItem.Name = "memorySearcherToolStripMenuItem"; + this.memorySearcherToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.memorySearcherToolStripMenuItem.Text = "Memory Searcher"; + this.memorySearcherToolStripMenuItem.Click += new System.EventHandler(this.memorySearcherToolStripMenuItem_Click); + // + // toolStripSeparator17 + // + this.toolStripSeparator17.Name = "toolStripSeparator17"; + this.toolStripSeparator17.Size = new System.Drawing.Size(182, 6); + // + // loadSymbolToolStripMenuItem + // + this.loadSymbolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Pdb; + this.loadSymbolToolStripMenuItem.Name = "loadSymbolToolStripMenuItem"; + this.loadSymbolToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.loadSymbolToolStripMenuItem.Text = "Load Symbol..."; + this.loadSymbolToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolToolStripMenuItem_Click); + // + // loadSymbolsToolStripMenuItem + // + this.loadSymbolsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("loadSymbolsToolStripMenuItem.Image"))); + this.loadSymbolsToolStripMenuItem.Name = "loadSymbolsToolStripMenuItem"; + this.loadSymbolsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.loadSymbolsToolStripMenuItem.Text = "Load all Symbols"; + this.loadSymbolsToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolsToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6); + // + // resumeProcessToolStripMenuItem + // + this.resumeProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Play; + this.resumeProcessToolStripMenuItem.Name = "resumeProcessToolStripMenuItem"; + this.resumeProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.resumeProcessToolStripMenuItem.Text = "Resume"; + this.resumeProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); + // + // suspendProcessToolStripMenuItem + // + this.suspendProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Pause; + this.suspendProcessToolStripMenuItem.Name = "suspendProcessToolStripMenuItem"; + this.suspendProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.suspendProcessToolStripMenuItem.Text = "Suspend"; + this.suspendProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); + // + // terminateProcessToolStripMenuItem + // + this.terminateProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Stop; + this.terminateProcessToolStripMenuItem.Name = "terminateProcessToolStripMenuItem"; + this.terminateProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.terminateProcessToolStripMenuItem.Text = "Kill"; + this.terminateProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); + // + // projectToolStripMenuItem + // + this.projectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cleanUnusedClassesToolStripMenuItem, + this.toolStripSeparator16, + this.generateCppCodeToolStripMenuItem, + this.generateCSharpCodeToolStripMenuItem}); + this.projectToolStripMenuItem.Name = "projectToolStripMenuItem"; + this.projectToolStripMenuItem.Size = new System.Drawing.Size(56, 20); + this.projectToolStripMenuItem.Text = "Project"; + // + // cleanUnusedClassesToolStripMenuItem + // + this.cleanUnusedClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; + this.cleanUnusedClassesToolStripMenuItem.Name = "cleanUnusedClassesToolStripMenuItem"; + this.cleanUnusedClassesToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.cleanUnusedClassesToolStripMenuItem.Text = "Remove unused classes"; + this.cleanUnusedClassesToolStripMenuItem.Click += new System.EventHandler(this.cleanUnusedClassesToolStripMenuItem_Click); + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(195, 6); + // + // generateCppCodeToolStripMenuItem + // + this.generateCppCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; + this.generateCppCodeToolStripMenuItem.Name = "generateCppCodeToolStripMenuItem"; + this.generateCppCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.generateCppCodeToolStripMenuItem.Text = "Generate C++ Code"; + this.generateCppCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCppCodeToolStripMenuItem_Click); + // + // generateCSharpCodeToolStripMenuItem + // + this.generateCSharpCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Csharp; + this.generateCSharpCodeToolStripMenuItem.Name = "generateCSharpCodeToolStripMenuItem"; + this.generateCSharpCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.generateCSharpCodeToolStripMenuItem.Text = "Generate C# Code"; + this.generateCSharpCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCSharpCodeToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Information; + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(116, 22); + this.aboutToolStripMenuItem.Text = "About..."; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); + // + // MainForm + // + this.AllowDrop = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1141, 595); + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.toolStrip); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.mainMenuStrip); + this.MainMenuStrip = this.mainMenuStrip; + this.MinimumSize = new System.Drawing.Size(200, 100); + this.Name = "MainForm"; + this.Text = "ReClass.NET"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.DragDrop += new System.Windows.Forms.DragEventHandler(this.MainForm_DragDrop); + this.DragEnter += new System.Windows.Forms.DragEventHandler(this.MainForm_DragEnter); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.toolStrip.ResumeLayout(false); + this.toolStrip.PerformLayout(); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.mainMenuStrip.ResumeLayout(false); + this.mainMenuStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + + #endregion + + private UI.MemoryViewControl memoryViewControl; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.MenuStrip mainMenuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem attachToProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem clearProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem processToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem processInformationsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem resumeProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem suspendProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem terminateProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem loadSymbolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStrip toolStrip; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.ToolStripStatusLabel processInfoToolStripStatusLabel; + private System.Windows.Forms.ToolStripMenuItem pluginsToolStripMenuItem; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripButton newClassToolStripButton; + private System.Windows.Forms.ToolStripDropDownButton addBytesToolStripDropDownButton; + private UI.IntegerToolStripMenuItem add4BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add8BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add64BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add256BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add1024BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add2048BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add4096BytesToolStripMenuItem; + private System.Windows.Forms.ToolStripDropDownButton insertBytesToolStripDropDownButton; + private UI.IntegerToolStripMenuItem insert4BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert8BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert64BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert256BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addXBytesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem insertXBytesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private UI.TypeToolStripButton hex64ToolStripButton; + private UI.TypeToolStripButton hex32ToolStripButton; + private UI.TypeToolStripButton hex16ToolStripButton; + private UI.TypeToolStripButton hex8ToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private UI.TypeToolStripButton int64ToolStripButton; + private UI.TypeToolStripButton int32ToolStripButton; + private UI.TypeToolStripButton int16ToolStripButton; + private UI.TypeToolStripButton int8ToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private UI.TypeToolStripButton uint64ToolStripButton; + private UI.TypeToolStripButton uint32ToolStripButton; + private UI.TypeToolStripButton uint16ToolStripButton; + private UI.TypeToolStripButton uint8ToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private UI.TypeToolStripButton floatToolStripButton; + private UI.TypeToolStripButton doubleToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private UI.TypeToolStripButton vec4ToolStripButton; + private UI.TypeToolStripButton vec3ToolStripButton; + private UI.TypeToolStripButton vec2ToolStripButton; + private UI.TypeToolStripButton mat44ToolStripButton; + private UI.TypeToolStripButton mat34ToolStripButton; + private UI.TypeToolStripButton mat33ToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private UI.TypeToolStripButton utf8TextToolStripButton; + private UI.TypeToolStripButton utf8TextPtrToolStripButton; + private UI.TypeToolStripButton utf16TextToolStripButton; + private UI.TypeToolStripButton utf16TextPtrToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private UI.TypeToolStripButton classInstanceToolStripButton6; + private UI.TypeToolStripButton classPtrToolStripButton; + private UI.TypeToolStripButton arrayToolStripButton; + private UI.TypeToolStripButton vtableToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private UI.TypeToolStripButton fnPtrToolStripButton; + private UI.ClassNodeView classesView; + private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cleanUnusedClassesToolStripMenuItem; + private UI.TypeToolStripButton ptrArrayToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripMenuItem generateCppCodeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem generateCSharpCodeToolStripMenuItem; + private System.Windows.Forms.Timer processUpdateTimer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; + private System.Windows.Forms.ToolStripMenuItem loadSymbolToolStripMenuItem; + private System.Windows.Forms.ToolStripButton openProjectToolStripButton; + private UI.TypeToolStripButton bitFieldToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; + private System.Windows.Forms.ToolStripStatusLabel infoToolStripStatusLabel; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; + private System.Windows.Forms.ToolStripMenuItem mergeWithProjectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem detachToolStripMenuItem; + private UI.TypeToolStripButton boolToolStripButton; + private UI.TypeToolStripButton fnTypeToolStripButton; + private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripSplitButton attachToProcessToolStripSplitButton; + } +} + diff --git a/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs similarity index 100% rename from Forms/MainForm.cs rename to ReClass.NET/Forms/MainForm.cs diff --git a/Forms/MainForm.resx b/ReClass.NET/Forms/MainForm.resx similarity index 100% rename from Forms/MainForm.resx rename to ReClass.NET/Forms/MainForm.resx diff --git a/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs similarity index 100% rename from Forms/PluginForm.Designer.cs rename to ReClass.NET/Forms/PluginForm.Designer.cs diff --git a/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs similarity index 100% rename from Forms/PluginForm.cs rename to ReClass.NET/Forms/PluginForm.cs diff --git a/Forms/PluginForm.resx b/ReClass.NET/Forms/PluginForm.resx similarity index 100% rename from Forms/PluginForm.resx rename to ReClass.NET/Forms/PluginForm.resx diff --git a/Forms/ProcessBrowserForm.Designer.cs b/ReClass.NET/Forms/ProcessBrowserForm.Designer.cs similarity index 100% rename from Forms/ProcessBrowserForm.Designer.cs rename to ReClass.NET/Forms/ProcessBrowserForm.Designer.cs diff --git a/Forms/ProcessBrowserForm.cs b/ReClass.NET/Forms/ProcessBrowserForm.cs similarity index 100% rename from Forms/ProcessBrowserForm.cs rename to ReClass.NET/Forms/ProcessBrowserForm.cs diff --git a/Forms/ProcessBrowserForm.resx b/ReClass.NET/Forms/ProcessBrowserForm.resx similarity index 100% rename from Forms/ProcessBrowserForm.resx rename to ReClass.NET/Forms/ProcessBrowserForm.resx diff --git a/Forms/ProcessInfoForm.Designer.cs b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs similarity index 100% rename from Forms/ProcessInfoForm.Designer.cs rename to ReClass.NET/Forms/ProcessInfoForm.Designer.cs diff --git a/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs similarity index 100% rename from Forms/ProcessInfoForm.cs rename to ReClass.NET/Forms/ProcessInfoForm.cs diff --git a/Forms/ProcessInfoForm.resx b/ReClass.NET/Forms/ProcessInfoForm.resx similarity index 100% rename from Forms/ProcessInfoForm.resx rename to ReClass.NET/Forms/ProcessInfoForm.resx diff --git a/Forms/ProcessMemoryViewForm.Designer.cs b/ReClass.NET/Forms/ProcessMemoryViewForm.Designer.cs similarity index 100% rename from Forms/ProcessMemoryViewForm.Designer.cs rename to ReClass.NET/Forms/ProcessMemoryViewForm.Designer.cs diff --git a/Forms/ProcessMemoryViewForm.cs b/ReClass.NET/Forms/ProcessMemoryViewForm.cs similarity index 100% rename from Forms/ProcessMemoryViewForm.cs rename to ReClass.NET/Forms/ProcessMemoryViewForm.cs diff --git a/Forms/ProcessMemoryViewForm.resx b/ReClass.NET/Forms/ProcessMemoryViewForm.resx similarity index 100% rename from Forms/ProcessMemoryViewForm.resx rename to ReClass.NET/Forms/ProcessMemoryViewForm.resx diff --git a/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs similarity index 100% rename from Forms/ScannerForm.Designer.cs rename to ReClass.NET/Forms/ScannerForm.Designer.cs diff --git a/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs similarity index 100% rename from Forms/ScannerForm.cs rename to ReClass.NET/Forms/ScannerForm.cs diff --git a/Forms/ScannerForm.resx b/ReClass.NET/Forms/ScannerForm.resx similarity index 100% rename from Forms/ScannerForm.resx rename to ReClass.NET/Forms/ScannerForm.resx diff --git a/Forms/SettingsForm.Designer.cs b/ReClass.NET/Forms/SettingsForm.Designer.cs similarity index 97% rename from Forms/SettingsForm.Designer.cs rename to ReClass.NET/Forms/SettingsForm.Designer.cs index 015a6b23..efefb7c1 100644 --- a/Forms/SettingsForm.Designer.cs +++ b/ReClass.NET/Forms/SettingsForm.Designer.cs @@ -1,1223 +1,1223 @@ -namespace ReClassNET.Forms -{ - partial class SettingsForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.settingsTabControl = new System.Windows.Forms.TabControl(); - this.generalSettingsTabPage = new System.Windows.Forms.TabPage(); - this.fileAssociationGroupBox = new System.Windows.Forms.GroupBox(); - this.removeAssociationButton = new System.Windows.Forms.Button(); - this.createAssociationButton = new System.Windows.Forms.Button(); - this.associationInfoLabel = new System.Windows.Forms.Label(); - this.commentsGroupBox = new System.Windows.Forms.GroupBox(); - this.showPluginInfoCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showStringCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showSymbolsCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showRttiCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showPointerCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showIntegerCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showFloatCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.displayGroupBox = new System.Windows.Forms.GroupBox(); - this.highlightChangedValuesCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showTextCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showNodeOffsetCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.showNodeAddressCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.stayOnTopCheckBox = new ReClassNET.UI.SettingsCheckBox(); - this.colorsSettingTabPage = new System.Windows.Forms.TabPage(); - this.nodeColorGroupBox = new System.Windows.Forms.GroupBox(); - this.nodeValueLabel = new System.Windows.Forms.Label(); - this.nodePluginLabel = new System.Windows.Forms.Label(); - this.nodeHexValueColorBox = new ReClassNET.UI.ColorBox(); - this.nodePluginColorBox = new ReClassNET.UI.ColorBox(); - this.nodeHexValueLabel = new System.Windows.Forms.Label(); - this.nodeVTableLabel = new System.Windows.Forms.Label(); - this.nodeOffsetColorBox = new ReClassNET.UI.ColorBox(); - this.nodeVTableColorBox = new ReClassNET.UI.ColorBox(); - this.nodeOffsetLabel = new System.Windows.Forms.Label(); - this.nodeTextLabel = new System.Windows.Forms.Label(); - this.nodeAddressColorBox = new ReClassNET.UI.ColorBox(); - this.nodeTextColorBox = new ReClassNET.UI.ColorBox(); - this.nodeAddressLabel = new System.Windows.Forms.Label(); - this.nodeCommentLabel = new System.Windows.Forms.Label(); - this.nodeHiddenColorBox = new ReClassNET.UI.ColorBox(); - this.nodeCommentColorBox = new ReClassNET.UI.ColorBox(); - this.nodeHiddenLabel = new System.Windows.Forms.Label(); - this.nodeIndexLabel = new System.Windows.Forms.Label(); - this.nodeSelectedColorBox = new ReClassNET.UI.ColorBox(); - this.nodeIndexColorBox = new ReClassNET.UI.ColorBox(); - this.nodeSelectedLabel = new System.Windows.Forms.Label(); - this.nodeTypeColorBox = new ReClassNET.UI.ColorBox(); - this.nodeValueColorBox = new ReClassNET.UI.ColorBox(); - this.nodeTypeLabel = new System.Windows.Forms.Label(); - this.nodeNameLabel = new System.Windows.Forms.Label(); - this.nodeNameColorBox = new ReClassNET.UI.ColorBox(); - this.backgroundLabel = new System.Windows.Forms.Label(); - this.backgroundColorBox = new ReClassNET.UI.ColorBox(); - this.typeDefinitionsSettingsTabPage = new System.Windows.Forms.TabPage(); - this.boolSettingsLabel = new System.Windows.Forms.Label(); - this.boolSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.functionPtrSettingsLabel = new System.Windows.Forms.Label(); - this.functionPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.utf16TextPtrSettingsLabel = new System.Windows.Forms.Label(); - this.utf16TextPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.utf16TextSettingsLabel = new System.Windows.Forms.Label(); - this.utf16TextSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.utf8TextPtrSettingsLabel = new System.Windows.Forms.Label(); - this.utf8TextPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.utf8TextSettingsLabel = new System.Windows.Forms.Label(); - this.utf8TextSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.matrix3x3SettingsLabel = new System.Windows.Forms.Label(); - this.matrix3x3SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.matrix3x4SettingsLabel = new System.Windows.Forms.Label(); - this.matrix3x4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.matrix4x4SettingsLabel = new System.Windows.Forms.Label(); - this.matrix4x4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.vector2SettingsLabel = new System.Windows.Forms.Label(); - this.vector2SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.vector3SettingsLabel = new System.Windows.Forms.Label(); - this.vector3SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.vector4SettingsLabel = new System.Windows.Forms.Label(); - this.vector4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.doubleSettingsLabel = new System.Windows.Forms.Label(); - this.doubleSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.floatSettingsLabel = new System.Windows.Forms.Label(); - this.floatSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.uint64SettingsLabel = new System.Windows.Forms.Label(); - this.uint64SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.uint32SettingsLabel = new System.Windows.Forms.Label(); - this.uint32SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.uint16SettingsLabel = new System.Windows.Forms.Label(); - this.uint16SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.uint8SettingsLabel = new System.Windows.Forms.Label(); - this.uint8SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.int64SettingsLabel = new System.Windows.Forms.Label(); - this.int64SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.int32SettingsLabel = new System.Windows.Forms.Label(); - this.int32SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.int16SettingsLabel = new System.Windows.Forms.Label(); - this.int16SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.int8SettingsLabel = new System.Windows.Forms.Label(); - this.int8SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.paddingSettingsLabel = new System.Windows.Forms.Label(); - this.paddingSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); - this.bannerBox = new ReClassNET.UI.BannerBox(); - this.settingsTabControl.SuspendLayout(); - this.generalSettingsTabPage.SuspendLayout(); - this.fileAssociationGroupBox.SuspendLayout(); - this.commentsGroupBox.SuspendLayout(); - this.displayGroupBox.SuspendLayout(); - this.colorsSettingTabPage.SuspendLayout(); - this.nodeColorGroupBox.SuspendLayout(); - this.typeDefinitionsSettingsTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); - this.SuspendLayout(); - // - // settingsTabControl - // - this.settingsTabControl.Controls.Add(this.generalSettingsTabPage); - this.settingsTabControl.Controls.Add(this.colorsSettingTabPage); - this.settingsTabControl.Controls.Add(this.typeDefinitionsSettingsTabPage); - this.settingsTabControl.Location = new System.Drawing.Point(12, 60); - this.settingsTabControl.Name = "settingsTabControl"; - this.settingsTabControl.SelectedIndex = 0; - this.settingsTabControl.Size = new System.Drawing.Size(562, 355); - this.settingsTabControl.TabIndex = 1; - // - // generalSettingsTabPage - // - this.generalSettingsTabPage.Controls.Add(this.fileAssociationGroupBox); - this.generalSettingsTabPage.Controls.Add(this.commentsGroupBox); - this.generalSettingsTabPage.Controls.Add(this.displayGroupBox); - this.generalSettingsTabPage.Controls.Add(this.stayOnTopCheckBox); - this.generalSettingsTabPage.Location = new System.Drawing.Point(4, 22); - this.generalSettingsTabPage.Name = "generalSettingsTabPage"; - this.generalSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.generalSettingsTabPage.Size = new System.Drawing.Size(554, 329); - this.generalSettingsTabPage.TabIndex = 0; - this.generalSettingsTabPage.Text = "General"; - this.generalSettingsTabPage.UseVisualStyleBackColor = true; - // - // fileAssociationGroupBox - // - this.fileAssociationGroupBox.Controls.Add(this.removeAssociationButton); - this.fileAssociationGroupBox.Controls.Add(this.createAssociationButton); - this.fileAssociationGroupBox.Controls.Add(this.associationInfoLabel); - this.fileAssociationGroupBox.Location = new System.Drawing.Point(6, 231); - this.fileAssociationGroupBox.Name = "fileAssociationGroupBox"; - this.fileAssociationGroupBox.Size = new System.Drawing.Size(542, 85); - this.fileAssociationGroupBox.TabIndex = 4; - this.fileAssociationGroupBox.TabStop = false; - this.fileAssociationGroupBox.Text = "RCNET File Association"; - // - // removeAssociationButton - // - this.removeAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.removeAssociationButton.Location = new System.Drawing.Point(146, 52); - this.removeAssociationButton.Name = "removeAssociationButton"; - this.removeAssociationButton.Size = new System.Drawing.Size(135, 23); - this.removeAssociationButton.TabIndex = 2; - this.removeAssociationButton.Text = "&Remove Association"; - this.removeAssociationButton.UseVisualStyleBackColor = true; - this.removeAssociationButton.Click += new System.EventHandler(this.removeAssociationButton_Click); - // - // createAssociationButton - // - this.createAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.createAssociationButton.Location = new System.Drawing.Point(9, 52); - this.createAssociationButton.Name = "createAssociationButton"; - this.createAssociationButton.Size = new System.Drawing.Size(131, 23); - this.createAssociationButton.TabIndex = 1; - this.createAssociationButton.Text = "Create &Association"; - this.createAssociationButton.UseVisualStyleBackColor = true; - this.createAssociationButton.Click += new System.EventHandler(this.createAssociationButton_Click); - // - // associationInfoLabel - // - this.associationInfoLabel.Location = new System.Drawing.Point(6, 21); - this.associationInfoLabel.Name = "associationInfoLabel"; - this.associationInfoLabel.Size = new System.Drawing.Size(525, 28); - this.associationInfoLabel.TabIndex = 0; - this.associationInfoLabel.Text = "RCNET files can be associated with ReClass.NET. When you double-click a RCNET fil" + - "e, they will automatically be opened by ReClass.NET."; - // - // commentsGroupBox - // - this.commentsGroupBox.Controls.Add(this.showPluginInfoCheckBox); - this.commentsGroupBox.Controls.Add(this.showStringCheckBox); - this.commentsGroupBox.Controls.Add(this.showSymbolsCheckBox); - this.commentsGroupBox.Controls.Add(this.showRttiCheckBox); - this.commentsGroupBox.Controls.Add(this.showPointerCheckBox); - this.commentsGroupBox.Controls.Add(this.showIntegerCheckBox); - this.commentsGroupBox.Controls.Add(this.showFloatCheckBox); - this.commentsGroupBox.Location = new System.Drawing.Point(6, 39); - this.commentsGroupBox.Name = "commentsGroupBox"; - this.commentsGroupBox.Size = new System.Drawing.Size(265, 186); - this.commentsGroupBox.TabIndex = 3; - this.commentsGroupBox.TabStop = false; - this.commentsGroupBox.Text = "Node Comments"; - // - // showPluginInfoCheckBox - // - this.showPluginInfoCheckBox.AutoSize = true; - this.showPluginInfoCheckBox.Location = new System.Drawing.Point(6, 157); - this.showPluginInfoCheckBox.Name = "showPluginInfoCheckBox"; - this.showPluginInfoCheckBox.Size = new System.Drawing.Size(111, 17); - this.showPluginInfoCheckBox.TabIndex = 6; - this.showPluginInfoCheckBox.Text = "Show Plugin Infos"; - this.showPluginInfoCheckBox.UseVisualStyleBackColor = true; - // - // showStringCheckBox - // - this.showStringCheckBox.AutoSize = true; - this.showStringCheckBox.Location = new System.Drawing.Point(6, 134); - this.showStringCheckBox.Name = "showStringCheckBox"; - this.showStringCheckBox.Size = new System.Drawing.Size(88, 17); - this.showStringCheckBox.TabIndex = 5; - this.showStringCheckBox.Text = "Show Strings"; - this.showStringCheckBox.UseVisualStyleBackColor = true; - // - // showSymbolsCheckBox - // - this.showSymbolsCheckBox.AutoSize = true; - this.showSymbolsCheckBox.Location = new System.Drawing.Point(6, 111); - this.showSymbolsCheckBox.Name = "showSymbolsCheckBox"; - this.showSymbolsCheckBox.Size = new System.Drawing.Size(130, 17); - this.showSymbolsCheckBox.TabIndex = 4; - this.showSymbolsCheckBox.Text = "Show Debug Symbols"; - this.showSymbolsCheckBox.UseVisualStyleBackColor = true; - // - // showRttiCheckBox - // - this.showRttiCheckBox.AutoSize = true; - this.showRttiCheckBox.Location = new System.Drawing.Point(6, 88); - this.showRttiCheckBox.Name = "showRttiCheckBox"; - this.showRttiCheckBox.Size = new System.Drawing.Size(81, 17); - this.showRttiCheckBox.TabIndex = 3; - this.showRttiCheckBox.Text = "Show RTTI"; - this.showRttiCheckBox.UseVisualStyleBackColor = true; - // - // showPointerCheckBox - // - this.showPointerCheckBox.AutoSize = true; - this.showPointerCheckBox.Location = new System.Drawing.Point(6, 65); - this.showPointerCheckBox.Name = "showPointerCheckBox"; - this.showPointerCheckBox.Size = new System.Drawing.Size(94, 17); - this.showPointerCheckBox.TabIndex = 2; - this.showPointerCheckBox.Text = "Show Pointers"; - this.showPointerCheckBox.UseVisualStyleBackColor = true; - // - // showIntegerCheckBox - // - this.showIntegerCheckBox.AutoSize = true; - this.showIntegerCheckBox.Location = new System.Drawing.Point(6, 42); - this.showIntegerCheckBox.Name = "showIntegerCheckBox"; - this.showIntegerCheckBox.Size = new System.Drawing.Size(124, 17); - this.showIntegerCheckBox.TabIndex = 1; - this.showIntegerCheckBox.Text = "Show Integer Values"; - this.showIntegerCheckBox.UseVisualStyleBackColor = true; - // - // showFloatCheckBox - // - this.showFloatCheckBox.AutoSize = true; - this.showFloatCheckBox.Location = new System.Drawing.Point(6, 19); - this.showFloatCheckBox.Name = "showFloatCheckBox"; - this.showFloatCheckBox.Size = new System.Drawing.Size(114, 17); - this.showFloatCheckBox.TabIndex = 0; - this.showFloatCheckBox.Text = "Show Float Values"; - this.showFloatCheckBox.UseVisualStyleBackColor = true; - // - // displayGroupBox - // - this.displayGroupBox.Controls.Add(this.highlightChangedValuesCheckBox); - this.displayGroupBox.Controls.Add(this.showTextCheckBox); - this.displayGroupBox.Controls.Add(this.showNodeOffsetCheckBox); - this.displayGroupBox.Controls.Add(this.showNodeAddressCheckBox); - this.displayGroupBox.Location = new System.Drawing.Point(283, 39); - this.displayGroupBox.Name = "displayGroupBox"; - this.displayGroupBox.Size = new System.Drawing.Size(265, 113); - this.displayGroupBox.TabIndex = 2; - this.displayGroupBox.TabStop = false; - this.displayGroupBox.Text = "Display"; - // - // highlightChangedValuesCheckBox - // - this.highlightChangedValuesCheckBox.AutoSize = true; - this.highlightChangedValuesCheckBox.Location = new System.Drawing.Point(6, 88); - this.highlightChangedValuesCheckBox.Name = "highlightChangedValuesCheckBox"; - this.highlightChangedValuesCheckBox.Size = new System.Drawing.Size(148, 17); - this.highlightChangedValuesCheckBox.TabIndex = 3; - this.highlightChangedValuesCheckBox.Text = "Highlight Changed Values"; - this.highlightChangedValuesCheckBox.UseVisualStyleBackColor = true; - // - // showTextCheckBox - // - this.showTextCheckBox.AutoSize = true; - this.showTextCheckBox.Location = new System.Drawing.Point(6, 65); - this.showTextCheckBox.Name = "showTextCheckBox"; - this.showTextCheckBox.Size = new System.Drawing.Size(166, 17); - this.showTextCheckBox.TabIndex = 2; - this.showTextCheckBox.Text = "Show Textual Representation"; - this.showTextCheckBox.UseVisualStyleBackColor = true; - // - // showNodeOffsetCheckBox - // - this.showNodeOffsetCheckBox.AutoSize = true; - this.showNodeOffsetCheckBox.Location = new System.Drawing.Point(6, 42); - this.showNodeOffsetCheckBox.Name = "showNodeOffsetCheckBox"; - this.showNodeOffsetCheckBox.Size = new System.Drawing.Size(113, 17); - this.showNodeOffsetCheckBox.TabIndex = 1; - this.showNodeOffsetCheckBox.Text = "Show Node Offset"; - this.showNodeOffsetCheckBox.UseVisualStyleBackColor = true; - // - // showNodeAddressCheckBox - // - this.showNodeAddressCheckBox.AutoSize = true; - this.showNodeAddressCheckBox.Location = new System.Drawing.Point(6, 19); - this.showNodeAddressCheckBox.Name = "showNodeAddressCheckBox"; - this.showNodeAddressCheckBox.Size = new System.Drawing.Size(123, 17); - this.showNodeAddressCheckBox.TabIndex = 0; - this.showNodeAddressCheckBox.Text = "Show Node Address"; - this.showNodeAddressCheckBox.UseVisualStyleBackColor = true; - // - // stayOnTopCheckBox - // - this.stayOnTopCheckBox.AutoSize = true; - this.stayOnTopCheckBox.Location = new System.Drawing.Point(6, 6); - this.stayOnTopCheckBox.Name = "stayOnTopCheckBox"; - this.stayOnTopCheckBox.Size = new System.Drawing.Size(187, 17); - this.stayOnTopCheckBox.TabIndex = 1; - this.stayOnTopCheckBox.Text = "Force ReClass.NET to stay on top"; - this.stayOnTopCheckBox.UseVisualStyleBackColor = true; - // - // colorsSettingTabPage - // - this.colorsSettingTabPage.Controls.Add(this.nodeColorGroupBox); - this.colorsSettingTabPage.Controls.Add(this.backgroundLabel); - this.colorsSettingTabPage.Controls.Add(this.backgroundColorBox); - this.colorsSettingTabPage.Location = new System.Drawing.Point(4, 22); - this.colorsSettingTabPage.Name = "colorsSettingTabPage"; - this.colorsSettingTabPage.Padding = new System.Windows.Forms.Padding(3); - this.colorsSettingTabPage.Size = new System.Drawing.Size(554, 329); - this.colorsSettingTabPage.TabIndex = 1; - this.colorsSettingTabPage.Text = "Colors"; - this.colorsSettingTabPage.UseVisualStyleBackColor = true; - // - // nodeColorGroupBox - // - this.nodeColorGroupBox.Controls.Add(this.nodeValueLabel); - this.nodeColorGroupBox.Controls.Add(this.nodePluginLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeHexValueColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodePluginColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeHexValueLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeVTableLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeOffsetColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeVTableColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeOffsetLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeTextLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeAddressColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeTextColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeAddressLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeCommentLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeHiddenColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeCommentColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeHiddenLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeIndexLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeSelectedColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeIndexColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeSelectedLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeTypeColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeValueColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeTypeLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeNameLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeNameColorBox); - this.nodeColorGroupBox.Location = new System.Drawing.Point(9, 43); - this.nodeColorGroupBox.Name = "nodeColorGroupBox"; - this.nodeColorGroupBox.Size = new System.Drawing.Size(539, 225); - this.nodeColorGroupBox.TabIndex = 28; - this.nodeColorGroupBox.TabStop = false; - this.nodeColorGroupBox.Text = "Node Colors"; - // - // nodeValueLabel - // - this.nodeValueLabel.AutoSize = true; - this.nodeValueLabel.Location = new System.Drawing.Point(9, 198); - this.nodeValueLabel.Name = "nodeValueLabel"; - this.nodeValueLabel.Size = new System.Drawing.Size(64, 13); - this.nodeValueLabel.TabIndex = 17; - this.nodeValueLabel.Text = "Value Color:"; - // - // nodePluginLabel - // - this.nodePluginLabel.AutoSize = true; - this.nodePluginLabel.Location = new System.Drawing.Point(286, 172); - this.nodePluginLabel.Name = "nodePluginLabel"; - this.nodePluginLabel.Size = new System.Drawing.Size(87, 13); - this.nodePluginLabel.TabIndex = 27; - this.nodePluginLabel.Text = "Plugin Info Color:"; - // - // nodeHexValueColorBox - // - this.nodeHexValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeHexValueColorBox.Location = new System.Drawing.Point(133, 117); - this.nodeHexValueColorBox.Name = "nodeHexValueColorBox"; - this.nodeHexValueColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeHexValueColorBox.TabIndex = 2; - // - // nodePluginColorBox - // - this.nodePluginColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodePluginColorBox.Location = new System.Drawing.Point(410, 169); - this.nodePluginColorBox.Name = "nodePluginColorBox"; - this.nodePluginColorBox.Size = new System.Drawing.Size(123, 20); - this.nodePluginColorBox.TabIndex = 26; - // - // nodeHexValueLabel - // - this.nodeHexValueLabel.AutoSize = true; - this.nodeHexValueLabel.Location = new System.Drawing.Point(9, 120); - this.nodeHexValueLabel.Name = "nodeHexValueLabel"; - this.nodeHexValueLabel.Size = new System.Drawing.Size(86, 13); - this.nodeHexValueLabel.TabIndex = 3; - this.nodeHexValueLabel.Text = "Hex Value Color:"; - // - // nodeVTableLabel - // - this.nodeVTableLabel.AutoSize = true; - this.nodeVTableLabel.Location = new System.Drawing.Point(286, 94); - this.nodeVTableLabel.Name = "nodeVTableLabel"; - this.nodeVTableLabel.Size = new System.Drawing.Size(71, 13); - this.nodeVTableLabel.TabIndex = 25; - this.nodeVTableLabel.Text = "VTable Color:"; - // - // nodeOffsetColorBox - // - this.nodeOffsetColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeOffsetColorBox.Location = new System.Drawing.Point(133, 91); - this.nodeOffsetColorBox.Name = "nodeOffsetColorBox"; - this.nodeOffsetColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeOffsetColorBox.TabIndex = 4; - // - // nodeVTableColorBox - // - this.nodeVTableColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeVTableColorBox.Location = new System.Drawing.Point(410, 91); - this.nodeVTableColorBox.Name = "nodeVTableColorBox"; - this.nodeVTableColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeVTableColorBox.TabIndex = 24; - // - // nodeOffsetLabel - // - this.nodeOffsetLabel.AutoSize = true; - this.nodeOffsetLabel.Location = new System.Drawing.Point(9, 94); - this.nodeOffsetLabel.Name = "nodeOffsetLabel"; - this.nodeOffsetLabel.Size = new System.Drawing.Size(65, 13); - this.nodeOffsetLabel.TabIndex = 5; - this.nodeOffsetLabel.Text = "Offset Color:"; - // - // nodeTextLabel - // - this.nodeTextLabel.AutoSize = true; - this.nodeTextLabel.Location = new System.Drawing.Point(286, 146); - this.nodeTextLabel.Name = "nodeTextLabel"; - this.nodeTextLabel.Size = new System.Drawing.Size(58, 13); - this.nodeTextLabel.TabIndex = 23; - this.nodeTextLabel.Text = "Text Color:"; - // - // nodeAddressColorBox - // - this.nodeAddressColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeAddressColorBox.Location = new System.Drawing.Point(133, 65); - this.nodeAddressColorBox.Name = "nodeAddressColorBox"; - this.nodeAddressColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeAddressColorBox.TabIndex = 6; - // - // nodeTextColorBox - // - this.nodeTextColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeTextColorBox.Location = new System.Drawing.Point(410, 143); - this.nodeTextColorBox.Name = "nodeTextColorBox"; - this.nodeTextColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeTextColorBox.TabIndex = 22; - // - // nodeAddressLabel - // - this.nodeAddressLabel.AutoSize = true; - this.nodeAddressLabel.Location = new System.Drawing.Point(9, 68); - this.nodeAddressLabel.Name = "nodeAddressLabel"; - this.nodeAddressLabel.Size = new System.Drawing.Size(75, 13); - this.nodeAddressLabel.TabIndex = 7; - this.nodeAddressLabel.Text = "Address Color:"; - // - // nodeCommentLabel - // - this.nodeCommentLabel.AutoSize = true; - this.nodeCommentLabel.Location = new System.Drawing.Point(286, 120); - this.nodeCommentLabel.Name = "nodeCommentLabel"; - this.nodeCommentLabel.Size = new System.Drawing.Size(81, 13); - this.nodeCommentLabel.TabIndex = 21; - this.nodeCommentLabel.Text = "Comment Color:"; - // - // nodeHiddenColorBox - // - this.nodeHiddenColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeHiddenColorBox.Location = new System.Drawing.Point(410, 18); - this.nodeHiddenColorBox.Name = "nodeHiddenColorBox"; - this.nodeHiddenColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeHiddenColorBox.TabIndex = 8; - // - // nodeCommentColorBox - // - this.nodeCommentColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeCommentColorBox.Location = new System.Drawing.Point(410, 117); - this.nodeCommentColorBox.Name = "nodeCommentColorBox"; - this.nodeCommentColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeCommentColorBox.TabIndex = 20; - // - // nodeHiddenLabel - // - this.nodeHiddenLabel.AutoSize = true; - this.nodeHiddenLabel.Location = new System.Drawing.Point(286, 21); - this.nodeHiddenLabel.Name = "nodeHiddenLabel"; - this.nodeHiddenLabel.Size = new System.Drawing.Size(71, 13); - this.nodeHiddenLabel.TabIndex = 9; - this.nodeHiddenLabel.Text = "Hidden Color:"; - // - // nodeIndexLabel - // - this.nodeIndexLabel.AutoSize = true; - this.nodeIndexLabel.Location = new System.Drawing.Point(286, 68); - this.nodeIndexLabel.Name = "nodeIndexLabel"; - this.nodeIndexLabel.Size = new System.Drawing.Size(63, 13); - this.nodeIndexLabel.TabIndex = 19; - this.nodeIndexLabel.Text = "Index Color:"; - // - // nodeSelectedColorBox - // - this.nodeSelectedColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeSelectedColorBox.Location = new System.Drawing.Point(133, 18); - this.nodeSelectedColorBox.Name = "nodeSelectedColorBox"; - this.nodeSelectedColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeSelectedColorBox.TabIndex = 10; - // - // nodeIndexColorBox - // - this.nodeIndexColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeIndexColorBox.Location = new System.Drawing.Point(410, 65); - this.nodeIndexColorBox.Name = "nodeIndexColorBox"; - this.nodeIndexColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeIndexColorBox.TabIndex = 18; - // - // nodeSelectedLabel - // - this.nodeSelectedLabel.AutoSize = true; - this.nodeSelectedLabel.Location = new System.Drawing.Point(9, 21); - this.nodeSelectedLabel.Name = "nodeSelectedLabel"; - this.nodeSelectedLabel.Size = new System.Drawing.Size(79, 13); - this.nodeSelectedLabel.TabIndex = 11; - this.nodeSelectedLabel.Text = "Selected Color:"; - // - // nodeTypeColorBox - // - this.nodeTypeColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeTypeColorBox.Location = new System.Drawing.Point(133, 143); - this.nodeTypeColorBox.Name = "nodeTypeColorBox"; - this.nodeTypeColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeTypeColorBox.TabIndex = 12; - // - // nodeValueColorBox - // - this.nodeValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeValueColorBox.Location = new System.Drawing.Point(133, 195); - this.nodeValueColorBox.Name = "nodeValueColorBox"; - this.nodeValueColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeValueColorBox.TabIndex = 16; - // - // nodeTypeLabel - // - this.nodeTypeLabel.AutoSize = true; - this.nodeTypeLabel.Location = new System.Drawing.Point(9, 146); - this.nodeTypeLabel.Name = "nodeTypeLabel"; - this.nodeTypeLabel.Size = new System.Drawing.Size(61, 13); - this.nodeTypeLabel.TabIndex = 13; - this.nodeTypeLabel.Text = "Type Color:"; - // - // nodeNameLabel - // - this.nodeNameLabel.AutoSize = true; - this.nodeNameLabel.Location = new System.Drawing.Point(9, 172); - this.nodeNameLabel.Name = "nodeNameLabel"; - this.nodeNameLabel.Size = new System.Drawing.Size(65, 13); - this.nodeNameLabel.TabIndex = 15; - this.nodeNameLabel.Text = "Name Color:"; - // - // nodeNameColorBox - // - this.nodeNameColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeNameColorBox.Location = new System.Drawing.Point(133, 169); - this.nodeNameColorBox.Name = "nodeNameColorBox"; - this.nodeNameColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeNameColorBox.TabIndex = 14; - // - // backgroundLabel - // - this.backgroundLabel.AutoSize = true; - this.backgroundLabel.Location = new System.Drawing.Point(6, 14); - this.backgroundLabel.Name = "backgroundLabel"; - this.backgroundLabel.Size = new System.Drawing.Size(161, 13); - this.backgroundLabel.TabIndex = 1; - this.backgroundLabel.Text = "Memory View Background Color:"; - // - // backgroundColorBox - // - this.backgroundColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.backgroundColorBox.Location = new System.Drawing.Point(175, 11); - this.backgroundColorBox.Name = "backgroundColorBox"; - this.backgroundColorBox.Size = new System.Drawing.Size(123, 20); - this.backgroundColorBox.TabIndex = 0; - // - // typeDefinitionsSettingsTabPage - // - this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.label1); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextPtrSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextPtrSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextPtrSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextPtrSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.paddingSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.paddingSettingsTextBox); - this.typeDefinitionsSettingsTabPage.Location = new System.Drawing.Point(4, 22); - this.typeDefinitionsSettingsTabPage.Name = "typeDefinitionsSettingsTabPage"; - this.typeDefinitionsSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.typeDefinitionsSettingsTabPage.Size = new System.Drawing.Size(554, 329); - this.typeDefinitionsSettingsTabPage.TabIndex = 2; - this.typeDefinitionsSettingsTabPage.Text = "Type Definitions"; - this.typeDefinitionsSettingsTabPage.UseVisualStyleBackColor = true; - // - // boolSettingsLabel - // - this.boolSettingsLabel.AutoSize = true; - this.boolSettingsLabel.Location = new System.Drawing.Point(6, 57); - this.boolSettingsLabel.Name = "boolSettingsLabel"; - this.boolSettingsLabel.Size = new System.Drawing.Size(31, 13); - this.boolSettingsLabel.TabIndex = 46; - this.boolSettingsLabel.Text = "Bool:"; - // - // boolSettingsTextBox - // - this.boolSettingsTextBox.Location = new System.Drawing.Point(98, 54); - this.boolSettingsTextBox.Name = "boolSettingsTextBox"; - this.boolSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.boolSettingsTextBox.TabIndex = 45; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(6, 6); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(214, 13); - this.label1.TabIndex = 44; - this.label1.Text = "These types are used to generate the code:"; - // - // functionPtrSettingsLabel - // - this.functionPtrSettingsLabel.AutoSize = true; - this.functionPtrSettingsLabel.Location = new System.Drawing.Point(254, 277); - this.functionPtrSettingsLabel.Name = "functionPtrSettingsLabel"; - this.functionPtrSettingsLabel.Size = new System.Drawing.Size(87, 13); - this.functionPtrSettingsLabel.TabIndex = 43; - this.functionPtrSettingsLabel.Text = "Function Pointer:"; - // - // functionPtrSettingsTextBox - // - this.functionPtrSettingsTextBox.Location = new System.Drawing.Point(346, 274); - this.functionPtrSettingsTextBox.Name = "functionPtrSettingsTextBox"; - this.functionPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.functionPtrSettingsTextBox.TabIndex = 42; - // - // utf16TextPtrSettingsLabel - // - this.utf16TextPtrSettingsLabel.AutoSize = true; - this.utf16TextPtrSettingsLabel.Location = new System.Drawing.Point(254, 255); - this.utf16TextPtrSettingsLabel.Name = "utf16TextPtrSettingsLabel"; - this.utf16TextPtrSettingsLabel.Size = new System.Drawing.Size(79, 13); - this.utf16TextPtrSettingsLabel.TabIndex = 41; - this.utf16TextPtrSettingsLabel.Text = "UTF16 Pointer:"; - // - // utf16TextPtrSettingsTextBox - // - this.utf16TextPtrSettingsTextBox.Location = new System.Drawing.Point(346, 252); - this.utf16TextPtrSettingsTextBox.Name = "utf16TextPtrSettingsTextBox"; - this.utf16TextPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.utf16TextPtrSettingsTextBox.TabIndex = 40; - // - // utf16TextSettingsLabel - // - this.utf16TextSettingsLabel.AutoSize = true; - this.utf16TextSettingsLabel.Location = new System.Drawing.Point(254, 233); - this.utf16TextSettingsLabel.Name = "utf16TextSettingsLabel"; - this.utf16TextSettingsLabel.Size = new System.Drawing.Size(43, 13); - this.utf16TextSettingsLabel.TabIndex = 39; - this.utf16TextSettingsLabel.Text = "UTF16:"; - // - // utf16TextSettingsTextBox - // - this.utf16TextSettingsTextBox.Location = new System.Drawing.Point(346, 230); - this.utf16TextSettingsTextBox.Name = "utf16TextSettingsTextBox"; - this.utf16TextSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.utf16TextSettingsTextBox.TabIndex = 38; - // - // utf8TextPtrSettingsLabel - // - this.utf8TextPtrSettingsLabel.AutoSize = true; - this.utf8TextPtrSettingsLabel.Location = new System.Drawing.Point(254, 211); - this.utf8TextPtrSettingsLabel.Name = "utf8TextPtrSettingsLabel"; - this.utf8TextPtrSettingsLabel.Size = new System.Drawing.Size(73, 13); - this.utf8TextPtrSettingsLabel.TabIndex = 37; - this.utf8TextPtrSettingsLabel.Text = "UTF8 Pointer:"; - // - // utf8TextPtrSettingsTextBox - // - this.utf8TextPtrSettingsTextBox.Location = new System.Drawing.Point(346, 208); - this.utf8TextPtrSettingsTextBox.Name = "utf8TextPtrSettingsTextBox"; - this.utf8TextPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.utf8TextPtrSettingsTextBox.TabIndex = 36; - // - // utf8TextSettingsLabel - // - this.utf8TextSettingsLabel.AutoSize = true; - this.utf8TextSettingsLabel.Location = new System.Drawing.Point(254, 189); - this.utf8TextSettingsLabel.Name = "utf8TextSettingsLabel"; - this.utf8TextSettingsLabel.Size = new System.Drawing.Size(37, 13); - this.utf8TextSettingsLabel.TabIndex = 35; - this.utf8TextSettingsLabel.Text = "UTF8:"; - // - // utf8TextSettingsTextBox - // - this.utf8TextSettingsTextBox.Location = new System.Drawing.Point(346, 186); - this.utf8TextSettingsTextBox.Name = "utf8TextSettingsTextBox"; - this.utf8TextSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.utf8TextSettingsTextBox.TabIndex = 34; - // - // matrix3x3SettingsLabel - // - this.matrix3x3SettingsLabel.AutoSize = true; - this.matrix3x3SettingsLabel.Location = new System.Drawing.Point(254, 123); - this.matrix3x3SettingsLabel.Name = "matrix3x3SettingsLabel"; - this.matrix3x3SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix3x3SettingsLabel.TabIndex = 33; - this.matrix3x3SettingsLabel.Text = "Matrix (3x3):"; - // - // matrix3x3SettingsTextBox - // - this.matrix3x3SettingsTextBox.Location = new System.Drawing.Point(346, 120); - this.matrix3x3SettingsTextBox.Name = "matrix3x3SettingsTextBox"; - this.matrix3x3SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix3x3SettingsTextBox.TabIndex = 32; - // - // matrix3x4SettingsLabel - // - this.matrix3x4SettingsLabel.AutoSize = true; - this.matrix3x4SettingsLabel.Location = new System.Drawing.Point(254, 145); - this.matrix3x4SettingsLabel.Name = "matrix3x4SettingsLabel"; - this.matrix3x4SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix3x4SettingsLabel.TabIndex = 31; - this.matrix3x4SettingsLabel.Text = "Matrix (3x4):"; - // - // matrix3x4SettingsTextBox - // - this.matrix3x4SettingsTextBox.Location = new System.Drawing.Point(346, 142); - this.matrix3x4SettingsTextBox.Name = "matrix3x4SettingsTextBox"; - this.matrix3x4SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix3x4SettingsTextBox.TabIndex = 30; - // - // matrix4x4SettingsLabel - // - this.matrix4x4SettingsLabel.AutoSize = true; - this.matrix4x4SettingsLabel.Location = new System.Drawing.Point(254, 167); - this.matrix4x4SettingsLabel.Name = "matrix4x4SettingsLabel"; - this.matrix4x4SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix4x4SettingsLabel.TabIndex = 29; - this.matrix4x4SettingsLabel.Text = "Matrix (4x4):"; - // - // matrix4x4SettingsTextBox - // - this.matrix4x4SettingsTextBox.Location = new System.Drawing.Point(346, 164); - this.matrix4x4SettingsTextBox.Name = "matrix4x4SettingsTextBox"; - this.matrix4x4SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix4x4SettingsTextBox.TabIndex = 28; - // - // vector2SettingsLabel - // - this.vector2SettingsLabel.AutoSize = true; - this.vector2SettingsLabel.Location = new System.Drawing.Point(254, 57); - this.vector2SettingsLabel.Name = "vector2SettingsLabel"; - this.vector2SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector2SettingsLabel.TabIndex = 27; - this.vector2SettingsLabel.Text = "Vector2:"; - // - // vector2SettingsTextBox - // - this.vector2SettingsTextBox.Location = new System.Drawing.Point(346, 54); - this.vector2SettingsTextBox.Name = "vector2SettingsTextBox"; - this.vector2SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.vector2SettingsTextBox.TabIndex = 26; - // - // vector3SettingsLabel - // - this.vector3SettingsLabel.AutoSize = true; - this.vector3SettingsLabel.Location = new System.Drawing.Point(254, 79); - this.vector3SettingsLabel.Name = "vector3SettingsLabel"; - this.vector3SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector3SettingsLabel.TabIndex = 25; - this.vector3SettingsLabel.Text = "Vector3:"; - // - // vector3SettingsTextBox - // - this.vector3SettingsTextBox.Location = new System.Drawing.Point(346, 76); - this.vector3SettingsTextBox.Name = "vector3SettingsTextBox"; - this.vector3SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.vector3SettingsTextBox.TabIndex = 24; - // - // vector4SettingsLabel - // - this.vector4SettingsLabel.AutoSize = true; - this.vector4SettingsLabel.Location = new System.Drawing.Point(254, 101); - this.vector4SettingsLabel.Name = "vector4SettingsLabel"; - this.vector4SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector4SettingsLabel.TabIndex = 23; - this.vector4SettingsLabel.Text = "Vector4:"; - // - // vector4SettingsTextBox - // - this.vector4SettingsTextBox.Location = new System.Drawing.Point(346, 98); - this.vector4SettingsTextBox.Name = "vector4SettingsTextBox"; - this.vector4SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.vector4SettingsTextBox.TabIndex = 22; - // - // doubleSettingsLabel - // - this.doubleSettingsLabel.AutoSize = true; - this.doubleSettingsLabel.Location = new System.Drawing.Point(6, 277); - this.doubleSettingsLabel.Name = "doubleSettingsLabel"; - this.doubleSettingsLabel.Size = new System.Drawing.Size(44, 13); - this.doubleSettingsLabel.TabIndex = 21; - this.doubleSettingsLabel.Text = "Double:"; - // - // doubleSettingsTextBox - // - this.doubleSettingsTextBox.Location = new System.Drawing.Point(98, 274); - this.doubleSettingsTextBox.Name = "doubleSettingsTextBox"; - this.doubleSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.doubleSettingsTextBox.TabIndex = 20; - // - // floatSettingsLabel - // - this.floatSettingsLabel.AutoSize = true; - this.floatSettingsLabel.Location = new System.Drawing.Point(6, 255); - this.floatSettingsLabel.Name = "floatSettingsLabel"; - this.floatSettingsLabel.Size = new System.Drawing.Size(33, 13); - this.floatSettingsLabel.TabIndex = 19; - this.floatSettingsLabel.Text = "Float:"; - // - // floatSettingsTextBox - // - this.floatSettingsTextBox.Location = new System.Drawing.Point(98, 252); - this.floatSettingsTextBox.Name = "floatSettingsTextBox"; - this.floatSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.floatSettingsTextBox.TabIndex = 18; - // - // uint64SettingsLabel - // - this.uint64SettingsLabel.AutoSize = true; - this.uint64SettingsLabel.Location = new System.Drawing.Point(6, 233); - this.uint64SettingsLabel.Name = "uint64SettingsLabel"; - this.uint64SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint64SettingsLabel.TabIndex = 17; - this.uint64SettingsLabel.Text = "UInt64:"; - // - // uint64SettingsTextBox - // - this.uint64SettingsTextBox.Location = new System.Drawing.Point(98, 230); - this.uint64SettingsTextBox.Name = "uint64SettingsTextBox"; - this.uint64SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.uint64SettingsTextBox.TabIndex = 16; - // - // uint32SettingsLabel - // - this.uint32SettingsLabel.AutoSize = true; - this.uint32SettingsLabel.Location = new System.Drawing.Point(6, 211); - this.uint32SettingsLabel.Name = "uint32SettingsLabel"; - this.uint32SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint32SettingsLabel.TabIndex = 15; - this.uint32SettingsLabel.Text = "UInt32:"; - // - // uint32SettingsTextBox - // - this.uint32SettingsTextBox.Location = new System.Drawing.Point(98, 208); - this.uint32SettingsTextBox.Name = "uint32SettingsTextBox"; - this.uint32SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.uint32SettingsTextBox.TabIndex = 14; - // - // uint16SettingsLabel - // - this.uint16SettingsLabel.AutoSize = true; - this.uint16SettingsLabel.Location = new System.Drawing.Point(6, 189); - this.uint16SettingsLabel.Name = "uint16SettingsLabel"; - this.uint16SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint16SettingsLabel.TabIndex = 13; - this.uint16SettingsLabel.Text = "UInt16:"; - // - // uint16SettingsTextBox - // - this.uint16SettingsTextBox.Location = new System.Drawing.Point(98, 186); - this.uint16SettingsTextBox.Name = "uint16SettingsTextBox"; - this.uint16SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.uint16SettingsTextBox.TabIndex = 12; - // - // uint8SettingsLabel - // - this.uint8SettingsLabel.AutoSize = true; - this.uint8SettingsLabel.Location = new System.Drawing.Point(6, 167); - this.uint8SettingsLabel.Name = "uint8SettingsLabel"; - this.uint8SettingsLabel.Size = new System.Drawing.Size(36, 13); - this.uint8SettingsLabel.TabIndex = 11; - this.uint8SettingsLabel.Text = "UInt8:"; - // - // uint8SettingsTextBox - // - this.uint8SettingsTextBox.Location = new System.Drawing.Point(98, 164); - this.uint8SettingsTextBox.Name = "uint8SettingsTextBox"; - this.uint8SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.uint8SettingsTextBox.TabIndex = 10; - // - // int64SettingsLabel - // - this.int64SettingsLabel.AutoSize = true; - this.int64SettingsLabel.Location = new System.Drawing.Point(6, 145); - this.int64SettingsLabel.Name = "int64SettingsLabel"; - this.int64SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int64SettingsLabel.TabIndex = 9; - this.int64SettingsLabel.Text = "Int64:"; - // - // int64SettingsTextBox - // - this.int64SettingsTextBox.Location = new System.Drawing.Point(98, 142); - this.int64SettingsTextBox.Name = "int64SettingsTextBox"; - this.int64SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.int64SettingsTextBox.TabIndex = 8; - // - // int32SettingsLabel - // - this.int32SettingsLabel.AutoSize = true; - this.int32SettingsLabel.Location = new System.Drawing.Point(6, 123); - this.int32SettingsLabel.Name = "int32SettingsLabel"; - this.int32SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int32SettingsLabel.TabIndex = 7; - this.int32SettingsLabel.Text = "Int32:"; - // - // int32SettingsTextBox - // - this.int32SettingsTextBox.Location = new System.Drawing.Point(98, 120); - this.int32SettingsTextBox.Name = "int32SettingsTextBox"; - this.int32SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.int32SettingsTextBox.TabIndex = 6; - // - // int16SettingsLabel - // - this.int16SettingsLabel.AutoSize = true; - this.int16SettingsLabel.Location = new System.Drawing.Point(6, 101); - this.int16SettingsLabel.Name = "int16SettingsLabel"; - this.int16SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int16SettingsLabel.TabIndex = 5; - this.int16SettingsLabel.Text = "Int16:"; - // - // int16SettingsTextBox - // - this.int16SettingsTextBox.Location = new System.Drawing.Point(98, 98); - this.int16SettingsTextBox.Name = "int16SettingsTextBox"; - this.int16SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.int16SettingsTextBox.TabIndex = 4; - // - // int8SettingsLabel - // - this.int8SettingsLabel.AutoSize = true; - this.int8SettingsLabel.Location = new System.Drawing.Point(6, 79); - this.int8SettingsLabel.Name = "int8SettingsLabel"; - this.int8SettingsLabel.Size = new System.Drawing.Size(28, 13); - this.int8SettingsLabel.TabIndex = 3; - this.int8SettingsLabel.Text = "Int8:"; - // - // int8SettingsTextBox - // - this.int8SettingsTextBox.Location = new System.Drawing.Point(98, 76); - this.int8SettingsTextBox.Name = "int8SettingsTextBox"; - this.int8SettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.int8SettingsTextBox.TabIndex = 2; - // - // paddingSettingsLabel - // - this.paddingSettingsLabel.AutoSize = true; - this.paddingSettingsLabel.Location = new System.Drawing.Point(6, 35); - this.paddingSettingsLabel.Name = "paddingSettingsLabel"; - this.paddingSettingsLabel.Size = new System.Drawing.Size(49, 13); - this.paddingSettingsLabel.TabIndex = 1; - this.paddingSettingsLabel.Text = "Padding:"; - // - // paddingSettingsTextBox - // - this.paddingSettingsTextBox.Location = new System.Drawing.Point(98, 32); - this.paddingSettingsTextBox.Name = "paddingSettingsTextBox"; - this.paddingSettingsTextBox.Size = new System.Drawing.Size(120, 20); - this.paddingSettingsTextBox.TabIndex = 0; - // - // bannerBox - // - this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; - this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Cogs; - this.bannerBox.Location = new System.Drawing.Point(0, 0); - this.bannerBox.Name = "bannerBox"; - this.bannerBox.Size = new System.Drawing.Size(586, 48); - this.bannerBox.TabIndex = 2; - this.bannerBox.Text = "Configure the global settings."; - this.bannerBox.Title = "Settings"; - // - // SettingsForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(586, 427); - this.Controls.Add(this.bannerBox); - this.Controls.Add(this.settingsTabControl); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SettingsForm"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ReClass.NET - Settings"; - this.settingsTabControl.ResumeLayout(false); - this.generalSettingsTabPage.ResumeLayout(false); - this.generalSettingsTabPage.PerformLayout(); - this.fileAssociationGroupBox.ResumeLayout(false); - this.commentsGroupBox.ResumeLayout(false); - this.commentsGroupBox.PerformLayout(); - this.displayGroupBox.ResumeLayout(false); - this.displayGroupBox.PerformLayout(); - this.colorsSettingTabPage.ResumeLayout(false); - this.colorsSettingTabPage.PerformLayout(); - this.nodeColorGroupBox.ResumeLayout(false); - this.nodeColorGroupBox.PerformLayout(); - this.typeDefinitionsSettingsTabPage.ResumeLayout(false); - this.typeDefinitionsSettingsTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - private System.Windows.Forms.TabControl settingsTabControl; - private System.Windows.Forms.TabPage generalSettingsTabPage; - private System.Windows.Forms.TabPage colorsSettingTabPage; - private System.Windows.Forms.TabPage typeDefinitionsSettingsTabPage; - private ReClassNET.UI.SettingsCheckBox stayOnTopCheckBox; - private System.Windows.Forms.GroupBox displayGroupBox; - private ReClassNET.UI.SettingsCheckBox showNodeAddressCheckBox; - private ReClassNET.UI.SettingsCheckBox showTextCheckBox; - private ReClassNET.UI.SettingsCheckBox showNodeOffsetCheckBox; - private ReClassNET.UI.SettingsCheckBox highlightChangedValuesCheckBox; - private System.Windows.Forms.GroupBox commentsGroupBox; - private ReClassNET.UI.SettingsCheckBox showRttiCheckBox; - private ReClassNET.UI.SettingsCheckBox showPointerCheckBox; - private ReClassNET.UI.SettingsCheckBox showIntegerCheckBox; - private ReClassNET.UI.SettingsCheckBox showFloatCheckBox; - private ReClassNET.UI.SettingsCheckBox showPluginInfoCheckBox; - private ReClassNET.UI.SettingsCheckBox showStringCheckBox; - private ReClassNET.UI.SettingsCheckBox showSymbolsCheckBox; - private UI.ColorBox backgroundColorBox; - private System.Windows.Forms.Label nodeSelectedLabel; - private UI.ColorBox nodeSelectedColorBox; - private System.Windows.Forms.Label nodeHiddenLabel; - private UI.ColorBox nodeHiddenColorBox; - private System.Windows.Forms.Label nodeAddressLabel; - private UI.ColorBox nodeAddressColorBox; - private System.Windows.Forms.Label nodeOffsetLabel; - private UI.ColorBox nodeOffsetColorBox; - private System.Windows.Forms.Label nodeHexValueLabel; - private UI.ColorBox nodeHexValueColorBox; - private System.Windows.Forms.Label backgroundLabel; - private System.Windows.Forms.Label nodeValueLabel; - private UI.ColorBox nodeValueColorBox; - private System.Windows.Forms.Label nodeNameLabel; - private UI.ColorBox nodeNameColorBox; - private System.Windows.Forms.Label nodeTypeLabel; - private UI.ColorBox nodeTypeColorBox; - private System.Windows.Forms.Label nodeVTableLabel; - private UI.ColorBox nodeVTableColorBox; - private System.Windows.Forms.Label nodeTextLabel; - private UI.ColorBox nodeTextColorBox; - private System.Windows.Forms.Label nodeCommentLabel; - private UI.ColorBox nodeCommentColorBox; - private System.Windows.Forms.Label nodeIndexLabel; - private UI.ColorBox nodeIndexColorBox; - private System.Windows.Forms.Label nodePluginLabel; - private UI.ColorBox nodePluginColorBox; - private System.Windows.Forms.Label floatSettingsLabel; - private UI.SettingsTextBox floatSettingsTextBox; - private System.Windows.Forms.Label uint64SettingsLabel; - private UI.SettingsTextBox uint64SettingsTextBox; - private System.Windows.Forms.Label uint32SettingsLabel; - private UI.SettingsTextBox uint32SettingsTextBox; - private System.Windows.Forms.Label uint16SettingsLabel; - private UI.SettingsTextBox uint16SettingsTextBox; - private System.Windows.Forms.Label uint8SettingsLabel; - private UI.SettingsTextBox uint8SettingsTextBox; - private System.Windows.Forms.Label int64SettingsLabel; - private UI.SettingsTextBox int64SettingsTextBox; - private System.Windows.Forms.Label int32SettingsLabel; - private UI.SettingsTextBox int32SettingsTextBox; - private System.Windows.Forms.Label int16SettingsLabel; - private UI.SettingsTextBox int16SettingsTextBox; - private System.Windows.Forms.Label int8SettingsLabel; - private UI.SettingsTextBox int8SettingsTextBox; - private System.Windows.Forms.Label paddingSettingsLabel; - private UI.SettingsTextBox paddingSettingsTextBox; - private System.Windows.Forms.Label functionPtrSettingsLabel; - private UI.SettingsTextBox functionPtrSettingsTextBox; - private System.Windows.Forms.Label utf16TextPtrSettingsLabel; - private UI.SettingsTextBox utf16TextPtrSettingsTextBox; - private System.Windows.Forms.Label utf16TextSettingsLabel; - private UI.SettingsTextBox utf16TextSettingsTextBox; - private System.Windows.Forms.Label utf8TextPtrSettingsLabel; - private UI.SettingsTextBox utf8TextPtrSettingsTextBox; - private System.Windows.Forms.Label utf8TextSettingsLabel; - private UI.SettingsTextBox utf8TextSettingsTextBox; - private System.Windows.Forms.Label matrix3x3SettingsLabel; - private UI.SettingsTextBox matrix3x3SettingsTextBox; - private System.Windows.Forms.Label matrix3x4SettingsLabel; - private UI.SettingsTextBox matrix3x4SettingsTextBox; - private System.Windows.Forms.Label matrix4x4SettingsLabel; - private UI.SettingsTextBox matrix4x4SettingsTextBox; - private System.Windows.Forms.Label vector2SettingsLabel; - private UI.SettingsTextBox vector2SettingsTextBox; - private System.Windows.Forms.Label vector3SettingsLabel; - private UI.SettingsTextBox vector3SettingsTextBox; - private System.Windows.Forms.Label vector4SettingsLabel; - private UI.SettingsTextBox vector4SettingsTextBox; - private System.Windows.Forms.Label doubleSettingsLabel; - private UI.SettingsTextBox doubleSettingsTextBox; - private System.Windows.Forms.GroupBox nodeColorGroupBox; - private System.Windows.Forms.Label label1; - private UI.BannerBox bannerBox; - private System.Windows.Forms.Label boolSettingsLabel; - private UI.SettingsTextBox boolSettingsTextBox; - private System.Windows.Forms.GroupBox fileAssociationGroupBox; - private System.Windows.Forms.Button removeAssociationButton; - private System.Windows.Forms.Button createAssociationButton; - private System.Windows.Forms.Label associationInfoLabel; - } +namespace ReClassNET.Forms +{ + partial class SettingsForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.settingsTabControl = new System.Windows.Forms.TabControl(); + this.generalSettingsTabPage = new System.Windows.Forms.TabPage(); + this.fileAssociationGroupBox = new System.Windows.Forms.GroupBox(); + this.removeAssociationButton = new System.Windows.Forms.Button(); + this.createAssociationButton = new System.Windows.Forms.Button(); + this.associationInfoLabel = new System.Windows.Forms.Label(); + this.commentsGroupBox = new System.Windows.Forms.GroupBox(); + this.showPluginInfoCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showStringCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showSymbolsCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showRttiCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showPointerCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showIntegerCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showFloatCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.displayGroupBox = new System.Windows.Forms.GroupBox(); + this.highlightChangedValuesCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showTextCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showNodeOffsetCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.showNodeAddressCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.stayOnTopCheckBox = new ReClassNET.UI.SettingsCheckBox(); + this.colorsSettingTabPage = new System.Windows.Forms.TabPage(); + this.nodeColorGroupBox = new System.Windows.Forms.GroupBox(); + this.nodeValueLabel = new System.Windows.Forms.Label(); + this.nodePluginLabel = new System.Windows.Forms.Label(); + this.nodeHexValueColorBox = new ReClassNET.UI.ColorBox(); + this.nodePluginColorBox = new ReClassNET.UI.ColorBox(); + this.nodeHexValueLabel = new System.Windows.Forms.Label(); + this.nodeVTableLabel = new System.Windows.Forms.Label(); + this.nodeOffsetColorBox = new ReClassNET.UI.ColorBox(); + this.nodeVTableColorBox = new ReClassNET.UI.ColorBox(); + this.nodeOffsetLabel = new System.Windows.Forms.Label(); + this.nodeTextLabel = new System.Windows.Forms.Label(); + this.nodeAddressColorBox = new ReClassNET.UI.ColorBox(); + this.nodeTextColorBox = new ReClassNET.UI.ColorBox(); + this.nodeAddressLabel = new System.Windows.Forms.Label(); + this.nodeCommentLabel = new System.Windows.Forms.Label(); + this.nodeHiddenColorBox = new ReClassNET.UI.ColorBox(); + this.nodeCommentColorBox = new ReClassNET.UI.ColorBox(); + this.nodeHiddenLabel = new System.Windows.Forms.Label(); + this.nodeIndexLabel = new System.Windows.Forms.Label(); + this.nodeSelectedColorBox = new ReClassNET.UI.ColorBox(); + this.nodeIndexColorBox = new ReClassNET.UI.ColorBox(); + this.nodeSelectedLabel = new System.Windows.Forms.Label(); + this.nodeTypeColorBox = new ReClassNET.UI.ColorBox(); + this.nodeValueColorBox = new ReClassNET.UI.ColorBox(); + this.nodeTypeLabel = new System.Windows.Forms.Label(); + this.nodeNameLabel = new System.Windows.Forms.Label(); + this.nodeNameColorBox = new ReClassNET.UI.ColorBox(); + this.backgroundLabel = new System.Windows.Forms.Label(); + this.backgroundColorBox = new ReClassNET.UI.ColorBox(); + this.typeDefinitionsSettingsTabPage = new System.Windows.Forms.TabPage(); + this.boolSettingsLabel = new System.Windows.Forms.Label(); + this.boolSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.functionPtrSettingsLabel = new System.Windows.Forms.Label(); + this.functionPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.utf16TextPtrSettingsLabel = new System.Windows.Forms.Label(); + this.utf16TextPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.utf16TextSettingsLabel = new System.Windows.Forms.Label(); + this.utf16TextSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.utf8TextPtrSettingsLabel = new System.Windows.Forms.Label(); + this.utf8TextPtrSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.utf8TextSettingsLabel = new System.Windows.Forms.Label(); + this.utf8TextSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.matrix3x3SettingsLabel = new System.Windows.Forms.Label(); + this.matrix3x3SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.matrix3x4SettingsLabel = new System.Windows.Forms.Label(); + this.matrix3x4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.matrix4x4SettingsLabel = new System.Windows.Forms.Label(); + this.matrix4x4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.vector2SettingsLabel = new System.Windows.Forms.Label(); + this.vector2SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.vector3SettingsLabel = new System.Windows.Forms.Label(); + this.vector3SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.vector4SettingsLabel = new System.Windows.Forms.Label(); + this.vector4SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.doubleSettingsLabel = new System.Windows.Forms.Label(); + this.doubleSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.floatSettingsLabel = new System.Windows.Forms.Label(); + this.floatSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.uint64SettingsLabel = new System.Windows.Forms.Label(); + this.uint64SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.uint32SettingsLabel = new System.Windows.Forms.Label(); + this.uint32SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.uint16SettingsLabel = new System.Windows.Forms.Label(); + this.uint16SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.uint8SettingsLabel = new System.Windows.Forms.Label(); + this.uint8SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.int64SettingsLabel = new System.Windows.Forms.Label(); + this.int64SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.int32SettingsLabel = new System.Windows.Forms.Label(); + this.int32SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.int16SettingsLabel = new System.Windows.Forms.Label(); + this.int16SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.int8SettingsLabel = new System.Windows.Forms.Label(); + this.int8SettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.paddingSettingsLabel = new System.Windows.Forms.Label(); + this.paddingSettingsTextBox = new ReClassNET.UI.SettingsTextBox(); + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.settingsTabControl.SuspendLayout(); + this.generalSettingsTabPage.SuspendLayout(); + this.fileAssociationGroupBox.SuspendLayout(); + this.commentsGroupBox.SuspendLayout(); + this.displayGroupBox.SuspendLayout(); + this.colorsSettingTabPage.SuspendLayout(); + this.nodeColorGroupBox.SuspendLayout(); + this.typeDefinitionsSettingsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.SuspendLayout(); + // + // settingsTabControl + // + this.settingsTabControl.Controls.Add(this.generalSettingsTabPage); + this.settingsTabControl.Controls.Add(this.colorsSettingTabPage); + this.settingsTabControl.Controls.Add(this.typeDefinitionsSettingsTabPage); + this.settingsTabControl.Location = new System.Drawing.Point(12, 60); + this.settingsTabControl.Name = "settingsTabControl"; + this.settingsTabControl.SelectedIndex = 0; + this.settingsTabControl.Size = new System.Drawing.Size(562, 355); + this.settingsTabControl.TabIndex = 1; + // + // generalSettingsTabPage + // + this.generalSettingsTabPage.Controls.Add(this.fileAssociationGroupBox); + this.generalSettingsTabPage.Controls.Add(this.commentsGroupBox); + this.generalSettingsTabPage.Controls.Add(this.displayGroupBox); + this.generalSettingsTabPage.Controls.Add(this.stayOnTopCheckBox); + this.generalSettingsTabPage.Location = new System.Drawing.Point(4, 22); + this.generalSettingsTabPage.Name = "generalSettingsTabPage"; + this.generalSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); + this.generalSettingsTabPage.Size = new System.Drawing.Size(554, 329); + this.generalSettingsTabPage.TabIndex = 0; + this.generalSettingsTabPage.Text = "General"; + this.generalSettingsTabPage.UseVisualStyleBackColor = true; + // + // fileAssociationGroupBox + // + this.fileAssociationGroupBox.Controls.Add(this.removeAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.createAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.associationInfoLabel); + this.fileAssociationGroupBox.Location = new System.Drawing.Point(6, 231); + this.fileAssociationGroupBox.Name = "fileAssociationGroupBox"; + this.fileAssociationGroupBox.Size = new System.Drawing.Size(542, 85); + this.fileAssociationGroupBox.TabIndex = 4; + this.fileAssociationGroupBox.TabStop = false; + this.fileAssociationGroupBox.Text = "RCNET File Association"; + // + // removeAssociationButton + // + this.removeAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.removeAssociationButton.Location = new System.Drawing.Point(146, 52); + this.removeAssociationButton.Name = "removeAssociationButton"; + this.removeAssociationButton.Size = new System.Drawing.Size(135, 23); + this.removeAssociationButton.TabIndex = 2; + this.removeAssociationButton.Text = "&Remove Association"; + this.removeAssociationButton.UseVisualStyleBackColor = true; + this.removeAssociationButton.Click += new System.EventHandler(this.removeAssociationButton_Click); + // + // createAssociationButton + // + this.createAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.createAssociationButton.Location = new System.Drawing.Point(9, 52); + this.createAssociationButton.Name = "createAssociationButton"; + this.createAssociationButton.Size = new System.Drawing.Size(131, 23); + this.createAssociationButton.TabIndex = 1; + this.createAssociationButton.Text = "Create &Association"; + this.createAssociationButton.UseVisualStyleBackColor = true; + this.createAssociationButton.Click += new System.EventHandler(this.createAssociationButton_Click); + // + // associationInfoLabel + // + this.associationInfoLabel.Location = new System.Drawing.Point(6, 21); + this.associationInfoLabel.Name = "associationInfoLabel"; + this.associationInfoLabel.Size = new System.Drawing.Size(525, 28); + this.associationInfoLabel.TabIndex = 0; + this.associationInfoLabel.Text = "RCNET files can be associated with ReClass.NET. When you double-click a RCNET fil" + + "e, they will automatically be opened by ReClass.NET."; + // + // commentsGroupBox + // + this.commentsGroupBox.Controls.Add(this.showPluginInfoCheckBox); + this.commentsGroupBox.Controls.Add(this.showStringCheckBox); + this.commentsGroupBox.Controls.Add(this.showSymbolsCheckBox); + this.commentsGroupBox.Controls.Add(this.showRttiCheckBox); + this.commentsGroupBox.Controls.Add(this.showPointerCheckBox); + this.commentsGroupBox.Controls.Add(this.showIntegerCheckBox); + this.commentsGroupBox.Controls.Add(this.showFloatCheckBox); + this.commentsGroupBox.Location = new System.Drawing.Point(6, 39); + this.commentsGroupBox.Name = "commentsGroupBox"; + this.commentsGroupBox.Size = new System.Drawing.Size(265, 186); + this.commentsGroupBox.TabIndex = 3; + this.commentsGroupBox.TabStop = false; + this.commentsGroupBox.Text = "Node Comments"; + // + // showPluginInfoCheckBox + // + this.showPluginInfoCheckBox.AutoSize = true; + this.showPluginInfoCheckBox.Location = new System.Drawing.Point(6, 157); + this.showPluginInfoCheckBox.Name = "showPluginInfoCheckBox"; + this.showPluginInfoCheckBox.Size = new System.Drawing.Size(111, 17); + this.showPluginInfoCheckBox.TabIndex = 6; + this.showPluginInfoCheckBox.Text = "Show Plugin Infos"; + this.showPluginInfoCheckBox.UseVisualStyleBackColor = true; + // + // showStringCheckBox + // + this.showStringCheckBox.AutoSize = true; + this.showStringCheckBox.Location = new System.Drawing.Point(6, 134); + this.showStringCheckBox.Name = "showStringCheckBox"; + this.showStringCheckBox.Size = new System.Drawing.Size(88, 17); + this.showStringCheckBox.TabIndex = 5; + this.showStringCheckBox.Text = "Show Strings"; + this.showStringCheckBox.UseVisualStyleBackColor = true; + // + // showSymbolsCheckBox + // + this.showSymbolsCheckBox.AutoSize = true; + this.showSymbolsCheckBox.Location = new System.Drawing.Point(6, 111); + this.showSymbolsCheckBox.Name = "showSymbolsCheckBox"; + this.showSymbolsCheckBox.Size = new System.Drawing.Size(130, 17); + this.showSymbolsCheckBox.TabIndex = 4; + this.showSymbolsCheckBox.Text = "Show Debug Symbols"; + this.showSymbolsCheckBox.UseVisualStyleBackColor = true; + // + // showRttiCheckBox + // + this.showRttiCheckBox.AutoSize = true; + this.showRttiCheckBox.Location = new System.Drawing.Point(6, 88); + this.showRttiCheckBox.Name = "showRttiCheckBox"; + this.showRttiCheckBox.Size = new System.Drawing.Size(81, 17); + this.showRttiCheckBox.TabIndex = 3; + this.showRttiCheckBox.Text = "Show RTTI"; + this.showRttiCheckBox.UseVisualStyleBackColor = true; + // + // showPointerCheckBox + // + this.showPointerCheckBox.AutoSize = true; + this.showPointerCheckBox.Location = new System.Drawing.Point(6, 65); + this.showPointerCheckBox.Name = "showPointerCheckBox"; + this.showPointerCheckBox.Size = new System.Drawing.Size(94, 17); + this.showPointerCheckBox.TabIndex = 2; + this.showPointerCheckBox.Text = "Show Pointers"; + this.showPointerCheckBox.UseVisualStyleBackColor = true; + // + // showIntegerCheckBox + // + this.showIntegerCheckBox.AutoSize = true; + this.showIntegerCheckBox.Location = new System.Drawing.Point(6, 42); + this.showIntegerCheckBox.Name = "showIntegerCheckBox"; + this.showIntegerCheckBox.Size = new System.Drawing.Size(124, 17); + this.showIntegerCheckBox.TabIndex = 1; + this.showIntegerCheckBox.Text = "Show Integer Values"; + this.showIntegerCheckBox.UseVisualStyleBackColor = true; + // + // showFloatCheckBox + // + this.showFloatCheckBox.AutoSize = true; + this.showFloatCheckBox.Location = new System.Drawing.Point(6, 19); + this.showFloatCheckBox.Name = "showFloatCheckBox"; + this.showFloatCheckBox.Size = new System.Drawing.Size(114, 17); + this.showFloatCheckBox.TabIndex = 0; + this.showFloatCheckBox.Text = "Show Float Values"; + this.showFloatCheckBox.UseVisualStyleBackColor = true; + // + // displayGroupBox + // + this.displayGroupBox.Controls.Add(this.highlightChangedValuesCheckBox); + this.displayGroupBox.Controls.Add(this.showTextCheckBox); + this.displayGroupBox.Controls.Add(this.showNodeOffsetCheckBox); + this.displayGroupBox.Controls.Add(this.showNodeAddressCheckBox); + this.displayGroupBox.Location = new System.Drawing.Point(283, 39); + this.displayGroupBox.Name = "displayGroupBox"; + this.displayGroupBox.Size = new System.Drawing.Size(265, 113); + this.displayGroupBox.TabIndex = 2; + this.displayGroupBox.TabStop = false; + this.displayGroupBox.Text = "Display"; + // + // highlightChangedValuesCheckBox + // + this.highlightChangedValuesCheckBox.AutoSize = true; + this.highlightChangedValuesCheckBox.Location = new System.Drawing.Point(6, 88); + this.highlightChangedValuesCheckBox.Name = "highlightChangedValuesCheckBox"; + this.highlightChangedValuesCheckBox.Size = new System.Drawing.Size(148, 17); + this.highlightChangedValuesCheckBox.TabIndex = 3; + this.highlightChangedValuesCheckBox.Text = "Highlight Changed Values"; + this.highlightChangedValuesCheckBox.UseVisualStyleBackColor = true; + // + // showTextCheckBox + // + this.showTextCheckBox.AutoSize = true; + this.showTextCheckBox.Location = new System.Drawing.Point(6, 65); + this.showTextCheckBox.Name = "showTextCheckBox"; + this.showTextCheckBox.Size = new System.Drawing.Size(166, 17); + this.showTextCheckBox.TabIndex = 2; + this.showTextCheckBox.Text = "Show Textual Representation"; + this.showTextCheckBox.UseVisualStyleBackColor = true; + // + // showNodeOffsetCheckBox + // + this.showNodeOffsetCheckBox.AutoSize = true; + this.showNodeOffsetCheckBox.Location = new System.Drawing.Point(6, 42); + this.showNodeOffsetCheckBox.Name = "showNodeOffsetCheckBox"; + this.showNodeOffsetCheckBox.Size = new System.Drawing.Size(113, 17); + this.showNodeOffsetCheckBox.TabIndex = 1; + this.showNodeOffsetCheckBox.Text = "Show Node Offset"; + this.showNodeOffsetCheckBox.UseVisualStyleBackColor = true; + // + // showNodeAddressCheckBox + // + this.showNodeAddressCheckBox.AutoSize = true; + this.showNodeAddressCheckBox.Location = new System.Drawing.Point(6, 19); + this.showNodeAddressCheckBox.Name = "showNodeAddressCheckBox"; + this.showNodeAddressCheckBox.Size = new System.Drawing.Size(123, 17); + this.showNodeAddressCheckBox.TabIndex = 0; + this.showNodeAddressCheckBox.Text = "Show Node Address"; + this.showNodeAddressCheckBox.UseVisualStyleBackColor = true; + // + // stayOnTopCheckBox + // + this.stayOnTopCheckBox.AutoSize = true; + this.stayOnTopCheckBox.Location = new System.Drawing.Point(6, 6); + this.stayOnTopCheckBox.Name = "stayOnTopCheckBox"; + this.stayOnTopCheckBox.Size = new System.Drawing.Size(187, 17); + this.stayOnTopCheckBox.TabIndex = 1; + this.stayOnTopCheckBox.Text = "Force ReClass.NET to stay on top"; + this.stayOnTopCheckBox.UseVisualStyleBackColor = true; + // + // colorsSettingTabPage + // + this.colorsSettingTabPage.Controls.Add(this.nodeColorGroupBox); + this.colorsSettingTabPage.Controls.Add(this.backgroundLabel); + this.colorsSettingTabPage.Controls.Add(this.backgroundColorBox); + this.colorsSettingTabPage.Location = new System.Drawing.Point(4, 22); + this.colorsSettingTabPage.Name = "colorsSettingTabPage"; + this.colorsSettingTabPage.Padding = new System.Windows.Forms.Padding(3); + this.colorsSettingTabPage.Size = new System.Drawing.Size(554, 329); + this.colorsSettingTabPage.TabIndex = 1; + this.colorsSettingTabPage.Text = "Colors"; + this.colorsSettingTabPage.UseVisualStyleBackColor = true; + // + // nodeColorGroupBox + // + this.nodeColorGroupBox.Controls.Add(this.nodeValueLabel); + this.nodeColorGroupBox.Controls.Add(this.nodePluginLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeHexValueColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodePluginColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeHexValueLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeVTableLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeOffsetColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeVTableColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeOffsetLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeTextLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeAddressColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeTextColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeAddressLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeCommentLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeHiddenColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeCommentColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeHiddenLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeIndexLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeSelectedColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeIndexColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeSelectedLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeTypeColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeValueColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeTypeLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeNameLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeNameColorBox); + this.nodeColorGroupBox.Location = new System.Drawing.Point(9, 43); + this.nodeColorGroupBox.Name = "nodeColorGroupBox"; + this.nodeColorGroupBox.Size = new System.Drawing.Size(539, 225); + this.nodeColorGroupBox.TabIndex = 28; + this.nodeColorGroupBox.TabStop = false; + this.nodeColorGroupBox.Text = "Node Colors"; + // + // nodeValueLabel + // + this.nodeValueLabel.AutoSize = true; + this.nodeValueLabel.Location = new System.Drawing.Point(9, 198); + this.nodeValueLabel.Name = "nodeValueLabel"; + this.nodeValueLabel.Size = new System.Drawing.Size(64, 13); + this.nodeValueLabel.TabIndex = 17; + this.nodeValueLabel.Text = "Value Color:"; + // + // nodePluginLabel + // + this.nodePluginLabel.AutoSize = true; + this.nodePluginLabel.Location = new System.Drawing.Point(286, 172); + this.nodePluginLabel.Name = "nodePluginLabel"; + this.nodePluginLabel.Size = new System.Drawing.Size(87, 13); + this.nodePluginLabel.TabIndex = 27; + this.nodePluginLabel.Text = "Plugin Info Color:"; + // + // nodeHexValueColorBox + // + this.nodeHexValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeHexValueColorBox.Location = new System.Drawing.Point(133, 117); + this.nodeHexValueColorBox.Name = "nodeHexValueColorBox"; + this.nodeHexValueColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeHexValueColorBox.TabIndex = 2; + // + // nodePluginColorBox + // + this.nodePluginColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodePluginColorBox.Location = new System.Drawing.Point(410, 169); + this.nodePluginColorBox.Name = "nodePluginColorBox"; + this.nodePluginColorBox.Size = new System.Drawing.Size(123, 20); + this.nodePluginColorBox.TabIndex = 26; + // + // nodeHexValueLabel + // + this.nodeHexValueLabel.AutoSize = true; + this.nodeHexValueLabel.Location = new System.Drawing.Point(9, 120); + this.nodeHexValueLabel.Name = "nodeHexValueLabel"; + this.nodeHexValueLabel.Size = new System.Drawing.Size(86, 13); + this.nodeHexValueLabel.TabIndex = 3; + this.nodeHexValueLabel.Text = "Hex Value Color:"; + // + // nodeVTableLabel + // + this.nodeVTableLabel.AutoSize = true; + this.nodeVTableLabel.Location = new System.Drawing.Point(286, 94); + this.nodeVTableLabel.Name = "nodeVTableLabel"; + this.nodeVTableLabel.Size = new System.Drawing.Size(71, 13); + this.nodeVTableLabel.TabIndex = 25; + this.nodeVTableLabel.Text = "VTable Color:"; + // + // nodeOffsetColorBox + // + this.nodeOffsetColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeOffsetColorBox.Location = new System.Drawing.Point(133, 91); + this.nodeOffsetColorBox.Name = "nodeOffsetColorBox"; + this.nodeOffsetColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeOffsetColorBox.TabIndex = 4; + // + // nodeVTableColorBox + // + this.nodeVTableColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeVTableColorBox.Location = new System.Drawing.Point(410, 91); + this.nodeVTableColorBox.Name = "nodeVTableColorBox"; + this.nodeVTableColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeVTableColorBox.TabIndex = 24; + // + // nodeOffsetLabel + // + this.nodeOffsetLabel.AutoSize = true; + this.nodeOffsetLabel.Location = new System.Drawing.Point(9, 94); + this.nodeOffsetLabel.Name = "nodeOffsetLabel"; + this.nodeOffsetLabel.Size = new System.Drawing.Size(65, 13); + this.nodeOffsetLabel.TabIndex = 5; + this.nodeOffsetLabel.Text = "Offset Color:"; + // + // nodeTextLabel + // + this.nodeTextLabel.AutoSize = true; + this.nodeTextLabel.Location = new System.Drawing.Point(286, 146); + this.nodeTextLabel.Name = "nodeTextLabel"; + this.nodeTextLabel.Size = new System.Drawing.Size(58, 13); + this.nodeTextLabel.TabIndex = 23; + this.nodeTextLabel.Text = "Text Color:"; + // + // nodeAddressColorBox + // + this.nodeAddressColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeAddressColorBox.Location = new System.Drawing.Point(133, 65); + this.nodeAddressColorBox.Name = "nodeAddressColorBox"; + this.nodeAddressColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeAddressColorBox.TabIndex = 6; + // + // nodeTextColorBox + // + this.nodeTextColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeTextColorBox.Location = new System.Drawing.Point(410, 143); + this.nodeTextColorBox.Name = "nodeTextColorBox"; + this.nodeTextColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeTextColorBox.TabIndex = 22; + // + // nodeAddressLabel + // + this.nodeAddressLabel.AutoSize = true; + this.nodeAddressLabel.Location = new System.Drawing.Point(9, 68); + this.nodeAddressLabel.Name = "nodeAddressLabel"; + this.nodeAddressLabel.Size = new System.Drawing.Size(75, 13); + this.nodeAddressLabel.TabIndex = 7; + this.nodeAddressLabel.Text = "Address Color:"; + // + // nodeCommentLabel + // + this.nodeCommentLabel.AutoSize = true; + this.nodeCommentLabel.Location = new System.Drawing.Point(286, 120); + this.nodeCommentLabel.Name = "nodeCommentLabel"; + this.nodeCommentLabel.Size = new System.Drawing.Size(81, 13); + this.nodeCommentLabel.TabIndex = 21; + this.nodeCommentLabel.Text = "Comment Color:"; + // + // nodeHiddenColorBox + // + this.nodeHiddenColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeHiddenColorBox.Location = new System.Drawing.Point(410, 18); + this.nodeHiddenColorBox.Name = "nodeHiddenColorBox"; + this.nodeHiddenColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeHiddenColorBox.TabIndex = 8; + // + // nodeCommentColorBox + // + this.nodeCommentColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeCommentColorBox.Location = new System.Drawing.Point(410, 117); + this.nodeCommentColorBox.Name = "nodeCommentColorBox"; + this.nodeCommentColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeCommentColorBox.TabIndex = 20; + // + // nodeHiddenLabel + // + this.nodeHiddenLabel.AutoSize = true; + this.nodeHiddenLabel.Location = new System.Drawing.Point(286, 21); + this.nodeHiddenLabel.Name = "nodeHiddenLabel"; + this.nodeHiddenLabel.Size = new System.Drawing.Size(71, 13); + this.nodeHiddenLabel.TabIndex = 9; + this.nodeHiddenLabel.Text = "Hidden Color:"; + // + // nodeIndexLabel + // + this.nodeIndexLabel.AutoSize = true; + this.nodeIndexLabel.Location = new System.Drawing.Point(286, 68); + this.nodeIndexLabel.Name = "nodeIndexLabel"; + this.nodeIndexLabel.Size = new System.Drawing.Size(63, 13); + this.nodeIndexLabel.TabIndex = 19; + this.nodeIndexLabel.Text = "Index Color:"; + // + // nodeSelectedColorBox + // + this.nodeSelectedColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeSelectedColorBox.Location = new System.Drawing.Point(133, 18); + this.nodeSelectedColorBox.Name = "nodeSelectedColorBox"; + this.nodeSelectedColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeSelectedColorBox.TabIndex = 10; + // + // nodeIndexColorBox + // + this.nodeIndexColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeIndexColorBox.Location = new System.Drawing.Point(410, 65); + this.nodeIndexColorBox.Name = "nodeIndexColorBox"; + this.nodeIndexColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeIndexColorBox.TabIndex = 18; + // + // nodeSelectedLabel + // + this.nodeSelectedLabel.AutoSize = true; + this.nodeSelectedLabel.Location = new System.Drawing.Point(9, 21); + this.nodeSelectedLabel.Name = "nodeSelectedLabel"; + this.nodeSelectedLabel.Size = new System.Drawing.Size(79, 13); + this.nodeSelectedLabel.TabIndex = 11; + this.nodeSelectedLabel.Text = "Selected Color:"; + // + // nodeTypeColorBox + // + this.nodeTypeColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeTypeColorBox.Location = new System.Drawing.Point(133, 143); + this.nodeTypeColorBox.Name = "nodeTypeColorBox"; + this.nodeTypeColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeTypeColorBox.TabIndex = 12; + // + // nodeValueColorBox + // + this.nodeValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeValueColorBox.Location = new System.Drawing.Point(133, 195); + this.nodeValueColorBox.Name = "nodeValueColorBox"; + this.nodeValueColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeValueColorBox.TabIndex = 16; + // + // nodeTypeLabel + // + this.nodeTypeLabel.AutoSize = true; + this.nodeTypeLabel.Location = new System.Drawing.Point(9, 146); + this.nodeTypeLabel.Name = "nodeTypeLabel"; + this.nodeTypeLabel.Size = new System.Drawing.Size(61, 13); + this.nodeTypeLabel.TabIndex = 13; + this.nodeTypeLabel.Text = "Type Color:"; + // + // nodeNameLabel + // + this.nodeNameLabel.AutoSize = true; + this.nodeNameLabel.Location = new System.Drawing.Point(9, 172); + this.nodeNameLabel.Name = "nodeNameLabel"; + this.nodeNameLabel.Size = new System.Drawing.Size(65, 13); + this.nodeNameLabel.TabIndex = 15; + this.nodeNameLabel.Text = "Name Color:"; + // + // nodeNameColorBox + // + this.nodeNameColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeNameColorBox.Location = new System.Drawing.Point(133, 169); + this.nodeNameColorBox.Name = "nodeNameColorBox"; + this.nodeNameColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeNameColorBox.TabIndex = 14; + // + // backgroundLabel + // + this.backgroundLabel.AutoSize = true; + this.backgroundLabel.Location = new System.Drawing.Point(6, 14); + this.backgroundLabel.Name = "backgroundLabel"; + this.backgroundLabel.Size = new System.Drawing.Size(161, 13); + this.backgroundLabel.TabIndex = 1; + this.backgroundLabel.Text = "Memory View Background Color:"; + // + // backgroundColorBox + // + this.backgroundColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.backgroundColorBox.Location = new System.Drawing.Point(175, 11); + this.backgroundColorBox.Name = "backgroundColorBox"; + this.backgroundColorBox.Size = new System.Drawing.Size(123, 20); + this.backgroundColorBox.TabIndex = 0; + // + // typeDefinitionsSettingsTabPage + // + this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.label1); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextPtrSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextPtrSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextPtrSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextPtrSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.paddingSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.paddingSettingsTextBox); + this.typeDefinitionsSettingsTabPage.Location = new System.Drawing.Point(4, 22); + this.typeDefinitionsSettingsTabPage.Name = "typeDefinitionsSettingsTabPage"; + this.typeDefinitionsSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); + this.typeDefinitionsSettingsTabPage.Size = new System.Drawing.Size(554, 329); + this.typeDefinitionsSettingsTabPage.TabIndex = 2; + this.typeDefinitionsSettingsTabPage.Text = "Type Definitions"; + this.typeDefinitionsSettingsTabPage.UseVisualStyleBackColor = true; + // + // boolSettingsLabel + // + this.boolSettingsLabel.AutoSize = true; + this.boolSettingsLabel.Location = new System.Drawing.Point(6, 57); + this.boolSettingsLabel.Name = "boolSettingsLabel"; + this.boolSettingsLabel.Size = new System.Drawing.Size(31, 13); + this.boolSettingsLabel.TabIndex = 46; + this.boolSettingsLabel.Text = "Bool:"; + // + // boolSettingsTextBox + // + this.boolSettingsTextBox.Location = new System.Drawing.Point(98, 54); + this.boolSettingsTextBox.Name = "boolSettingsTextBox"; + this.boolSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.boolSettingsTextBox.TabIndex = 45; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(214, 13); + this.label1.TabIndex = 44; + this.label1.Text = "These types are used to generate the code:"; + // + // functionPtrSettingsLabel + // + this.functionPtrSettingsLabel.AutoSize = true; + this.functionPtrSettingsLabel.Location = new System.Drawing.Point(254, 277); + this.functionPtrSettingsLabel.Name = "functionPtrSettingsLabel"; + this.functionPtrSettingsLabel.Size = new System.Drawing.Size(87, 13); + this.functionPtrSettingsLabel.TabIndex = 43; + this.functionPtrSettingsLabel.Text = "Function Pointer:"; + // + // functionPtrSettingsTextBox + // + this.functionPtrSettingsTextBox.Location = new System.Drawing.Point(346, 274); + this.functionPtrSettingsTextBox.Name = "functionPtrSettingsTextBox"; + this.functionPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.functionPtrSettingsTextBox.TabIndex = 42; + // + // utf16TextPtrSettingsLabel + // + this.utf16TextPtrSettingsLabel.AutoSize = true; + this.utf16TextPtrSettingsLabel.Location = new System.Drawing.Point(254, 255); + this.utf16TextPtrSettingsLabel.Name = "utf16TextPtrSettingsLabel"; + this.utf16TextPtrSettingsLabel.Size = new System.Drawing.Size(79, 13); + this.utf16TextPtrSettingsLabel.TabIndex = 41; + this.utf16TextPtrSettingsLabel.Text = "UTF16 Pointer:"; + // + // utf16TextPtrSettingsTextBox + // + this.utf16TextPtrSettingsTextBox.Location = new System.Drawing.Point(346, 252); + this.utf16TextPtrSettingsTextBox.Name = "utf16TextPtrSettingsTextBox"; + this.utf16TextPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.utf16TextPtrSettingsTextBox.TabIndex = 40; + // + // utf16TextSettingsLabel + // + this.utf16TextSettingsLabel.AutoSize = true; + this.utf16TextSettingsLabel.Location = new System.Drawing.Point(254, 233); + this.utf16TextSettingsLabel.Name = "utf16TextSettingsLabel"; + this.utf16TextSettingsLabel.Size = new System.Drawing.Size(43, 13); + this.utf16TextSettingsLabel.TabIndex = 39; + this.utf16TextSettingsLabel.Text = "UTF16:"; + // + // utf16TextSettingsTextBox + // + this.utf16TextSettingsTextBox.Location = new System.Drawing.Point(346, 230); + this.utf16TextSettingsTextBox.Name = "utf16TextSettingsTextBox"; + this.utf16TextSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.utf16TextSettingsTextBox.TabIndex = 38; + // + // utf8TextPtrSettingsLabel + // + this.utf8TextPtrSettingsLabel.AutoSize = true; + this.utf8TextPtrSettingsLabel.Location = new System.Drawing.Point(254, 211); + this.utf8TextPtrSettingsLabel.Name = "utf8TextPtrSettingsLabel"; + this.utf8TextPtrSettingsLabel.Size = new System.Drawing.Size(73, 13); + this.utf8TextPtrSettingsLabel.TabIndex = 37; + this.utf8TextPtrSettingsLabel.Text = "UTF8 Pointer:"; + // + // utf8TextPtrSettingsTextBox + // + this.utf8TextPtrSettingsTextBox.Location = new System.Drawing.Point(346, 208); + this.utf8TextPtrSettingsTextBox.Name = "utf8TextPtrSettingsTextBox"; + this.utf8TextPtrSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.utf8TextPtrSettingsTextBox.TabIndex = 36; + // + // utf8TextSettingsLabel + // + this.utf8TextSettingsLabel.AutoSize = true; + this.utf8TextSettingsLabel.Location = new System.Drawing.Point(254, 189); + this.utf8TextSettingsLabel.Name = "utf8TextSettingsLabel"; + this.utf8TextSettingsLabel.Size = new System.Drawing.Size(37, 13); + this.utf8TextSettingsLabel.TabIndex = 35; + this.utf8TextSettingsLabel.Text = "UTF8:"; + // + // utf8TextSettingsTextBox + // + this.utf8TextSettingsTextBox.Location = new System.Drawing.Point(346, 186); + this.utf8TextSettingsTextBox.Name = "utf8TextSettingsTextBox"; + this.utf8TextSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.utf8TextSettingsTextBox.TabIndex = 34; + // + // matrix3x3SettingsLabel + // + this.matrix3x3SettingsLabel.AutoSize = true; + this.matrix3x3SettingsLabel.Location = new System.Drawing.Point(254, 123); + this.matrix3x3SettingsLabel.Name = "matrix3x3SettingsLabel"; + this.matrix3x3SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix3x3SettingsLabel.TabIndex = 33; + this.matrix3x3SettingsLabel.Text = "Matrix (3x3):"; + // + // matrix3x3SettingsTextBox + // + this.matrix3x3SettingsTextBox.Location = new System.Drawing.Point(346, 120); + this.matrix3x3SettingsTextBox.Name = "matrix3x3SettingsTextBox"; + this.matrix3x3SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix3x3SettingsTextBox.TabIndex = 32; + // + // matrix3x4SettingsLabel + // + this.matrix3x4SettingsLabel.AutoSize = true; + this.matrix3x4SettingsLabel.Location = new System.Drawing.Point(254, 145); + this.matrix3x4SettingsLabel.Name = "matrix3x4SettingsLabel"; + this.matrix3x4SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix3x4SettingsLabel.TabIndex = 31; + this.matrix3x4SettingsLabel.Text = "Matrix (3x4):"; + // + // matrix3x4SettingsTextBox + // + this.matrix3x4SettingsTextBox.Location = new System.Drawing.Point(346, 142); + this.matrix3x4SettingsTextBox.Name = "matrix3x4SettingsTextBox"; + this.matrix3x4SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix3x4SettingsTextBox.TabIndex = 30; + // + // matrix4x4SettingsLabel + // + this.matrix4x4SettingsLabel.AutoSize = true; + this.matrix4x4SettingsLabel.Location = new System.Drawing.Point(254, 167); + this.matrix4x4SettingsLabel.Name = "matrix4x4SettingsLabel"; + this.matrix4x4SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix4x4SettingsLabel.TabIndex = 29; + this.matrix4x4SettingsLabel.Text = "Matrix (4x4):"; + // + // matrix4x4SettingsTextBox + // + this.matrix4x4SettingsTextBox.Location = new System.Drawing.Point(346, 164); + this.matrix4x4SettingsTextBox.Name = "matrix4x4SettingsTextBox"; + this.matrix4x4SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix4x4SettingsTextBox.TabIndex = 28; + // + // vector2SettingsLabel + // + this.vector2SettingsLabel.AutoSize = true; + this.vector2SettingsLabel.Location = new System.Drawing.Point(254, 57); + this.vector2SettingsLabel.Name = "vector2SettingsLabel"; + this.vector2SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector2SettingsLabel.TabIndex = 27; + this.vector2SettingsLabel.Text = "Vector2:"; + // + // vector2SettingsTextBox + // + this.vector2SettingsTextBox.Location = new System.Drawing.Point(346, 54); + this.vector2SettingsTextBox.Name = "vector2SettingsTextBox"; + this.vector2SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.vector2SettingsTextBox.TabIndex = 26; + // + // vector3SettingsLabel + // + this.vector3SettingsLabel.AutoSize = true; + this.vector3SettingsLabel.Location = new System.Drawing.Point(254, 79); + this.vector3SettingsLabel.Name = "vector3SettingsLabel"; + this.vector3SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector3SettingsLabel.TabIndex = 25; + this.vector3SettingsLabel.Text = "Vector3:"; + // + // vector3SettingsTextBox + // + this.vector3SettingsTextBox.Location = new System.Drawing.Point(346, 76); + this.vector3SettingsTextBox.Name = "vector3SettingsTextBox"; + this.vector3SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.vector3SettingsTextBox.TabIndex = 24; + // + // vector4SettingsLabel + // + this.vector4SettingsLabel.AutoSize = true; + this.vector4SettingsLabel.Location = new System.Drawing.Point(254, 101); + this.vector4SettingsLabel.Name = "vector4SettingsLabel"; + this.vector4SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector4SettingsLabel.TabIndex = 23; + this.vector4SettingsLabel.Text = "Vector4:"; + // + // vector4SettingsTextBox + // + this.vector4SettingsTextBox.Location = new System.Drawing.Point(346, 98); + this.vector4SettingsTextBox.Name = "vector4SettingsTextBox"; + this.vector4SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.vector4SettingsTextBox.TabIndex = 22; + // + // doubleSettingsLabel + // + this.doubleSettingsLabel.AutoSize = true; + this.doubleSettingsLabel.Location = new System.Drawing.Point(6, 277); + this.doubleSettingsLabel.Name = "doubleSettingsLabel"; + this.doubleSettingsLabel.Size = new System.Drawing.Size(44, 13); + this.doubleSettingsLabel.TabIndex = 21; + this.doubleSettingsLabel.Text = "Double:"; + // + // doubleSettingsTextBox + // + this.doubleSettingsTextBox.Location = new System.Drawing.Point(98, 274); + this.doubleSettingsTextBox.Name = "doubleSettingsTextBox"; + this.doubleSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.doubleSettingsTextBox.TabIndex = 20; + // + // floatSettingsLabel + // + this.floatSettingsLabel.AutoSize = true; + this.floatSettingsLabel.Location = new System.Drawing.Point(6, 255); + this.floatSettingsLabel.Name = "floatSettingsLabel"; + this.floatSettingsLabel.Size = new System.Drawing.Size(33, 13); + this.floatSettingsLabel.TabIndex = 19; + this.floatSettingsLabel.Text = "Float:"; + // + // floatSettingsTextBox + // + this.floatSettingsTextBox.Location = new System.Drawing.Point(98, 252); + this.floatSettingsTextBox.Name = "floatSettingsTextBox"; + this.floatSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.floatSettingsTextBox.TabIndex = 18; + // + // uint64SettingsLabel + // + this.uint64SettingsLabel.AutoSize = true; + this.uint64SettingsLabel.Location = new System.Drawing.Point(6, 233); + this.uint64SettingsLabel.Name = "uint64SettingsLabel"; + this.uint64SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint64SettingsLabel.TabIndex = 17; + this.uint64SettingsLabel.Text = "UInt64:"; + // + // uint64SettingsTextBox + // + this.uint64SettingsTextBox.Location = new System.Drawing.Point(98, 230); + this.uint64SettingsTextBox.Name = "uint64SettingsTextBox"; + this.uint64SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.uint64SettingsTextBox.TabIndex = 16; + // + // uint32SettingsLabel + // + this.uint32SettingsLabel.AutoSize = true; + this.uint32SettingsLabel.Location = new System.Drawing.Point(6, 211); + this.uint32SettingsLabel.Name = "uint32SettingsLabel"; + this.uint32SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint32SettingsLabel.TabIndex = 15; + this.uint32SettingsLabel.Text = "UInt32:"; + // + // uint32SettingsTextBox + // + this.uint32SettingsTextBox.Location = new System.Drawing.Point(98, 208); + this.uint32SettingsTextBox.Name = "uint32SettingsTextBox"; + this.uint32SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.uint32SettingsTextBox.TabIndex = 14; + // + // uint16SettingsLabel + // + this.uint16SettingsLabel.AutoSize = true; + this.uint16SettingsLabel.Location = new System.Drawing.Point(6, 189); + this.uint16SettingsLabel.Name = "uint16SettingsLabel"; + this.uint16SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint16SettingsLabel.TabIndex = 13; + this.uint16SettingsLabel.Text = "UInt16:"; + // + // uint16SettingsTextBox + // + this.uint16SettingsTextBox.Location = new System.Drawing.Point(98, 186); + this.uint16SettingsTextBox.Name = "uint16SettingsTextBox"; + this.uint16SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.uint16SettingsTextBox.TabIndex = 12; + // + // uint8SettingsLabel + // + this.uint8SettingsLabel.AutoSize = true; + this.uint8SettingsLabel.Location = new System.Drawing.Point(6, 167); + this.uint8SettingsLabel.Name = "uint8SettingsLabel"; + this.uint8SettingsLabel.Size = new System.Drawing.Size(36, 13); + this.uint8SettingsLabel.TabIndex = 11; + this.uint8SettingsLabel.Text = "UInt8:"; + // + // uint8SettingsTextBox + // + this.uint8SettingsTextBox.Location = new System.Drawing.Point(98, 164); + this.uint8SettingsTextBox.Name = "uint8SettingsTextBox"; + this.uint8SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.uint8SettingsTextBox.TabIndex = 10; + // + // int64SettingsLabel + // + this.int64SettingsLabel.AutoSize = true; + this.int64SettingsLabel.Location = new System.Drawing.Point(6, 145); + this.int64SettingsLabel.Name = "int64SettingsLabel"; + this.int64SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int64SettingsLabel.TabIndex = 9; + this.int64SettingsLabel.Text = "Int64:"; + // + // int64SettingsTextBox + // + this.int64SettingsTextBox.Location = new System.Drawing.Point(98, 142); + this.int64SettingsTextBox.Name = "int64SettingsTextBox"; + this.int64SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.int64SettingsTextBox.TabIndex = 8; + // + // int32SettingsLabel + // + this.int32SettingsLabel.AutoSize = true; + this.int32SettingsLabel.Location = new System.Drawing.Point(6, 123); + this.int32SettingsLabel.Name = "int32SettingsLabel"; + this.int32SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int32SettingsLabel.TabIndex = 7; + this.int32SettingsLabel.Text = "Int32:"; + // + // int32SettingsTextBox + // + this.int32SettingsTextBox.Location = new System.Drawing.Point(98, 120); + this.int32SettingsTextBox.Name = "int32SettingsTextBox"; + this.int32SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.int32SettingsTextBox.TabIndex = 6; + // + // int16SettingsLabel + // + this.int16SettingsLabel.AutoSize = true; + this.int16SettingsLabel.Location = new System.Drawing.Point(6, 101); + this.int16SettingsLabel.Name = "int16SettingsLabel"; + this.int16SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int16SettingsLabel.TabIndex = 5; + this.int16SettingsLabel.Text = "Int16:"; + // + // int16SettingsTextBox + // + this.int16SettingsTextBox.Location = new System.Drawing.Point(98, 98); + this.int16SettingsTextBox.Name = "int16SettingsTextBox"; + this.int16SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.int16SettingsTextBox.TabIndex = 4; + // + // int8SettingsLabel + // + this.int8SettingsLabel.AutoSize = true; + this.int8SettingsLabel.Location = new System.Drawing.Point(6, 79); + this.int8SettingsLabel.Name = "int8SettingsLabel"; + this.int8SettingsLabel.Size = new System.Drawing.Size(28, 13); + this.int8SettingsLabel.TabIndex = 3; + this.int8SettingsLabel.Text = "Int8:"; + // + // int8SettingsTextBox + // + this.int8SettingsTextBox.Location = new System.Drawing.Point(98, 76); + this.int8SettingsTextBox.Name = "int8SettingsTextBox"; + this.int8SettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.int8SettingsTextBox.TabIndex = 2; + // + // paddingSettingsLabel + // + this.paddingSettingsLabel.AutoSize = true; + this.paddingSettingsLabel.Location = new System.Drawing.Point(6, 35); + this.paddingSettingsLabel.Name = "paddingSettingsLabel"; + this.paddingSettingsLabel.Size = new System.Drawing.Size(49, 13); + this.paddingSettingsLabel.TabIndex = 1; + this.paddingSettingsLabel.Text = "Padding:"; + // + // paddingSettingsTextBox + // + this.paddingSettingsTextBox.Location = new System.Drawing.Point(98, 32); + this.paddingSettingsTextBox.Name = "paddingSettingsTextBox"; + this.paddingSettingsTextBox.Size = new System.Drawing.Size(120, 20); + this.paddingSettingsTextBox.TabIndex = 0; + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Cogs; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(586, 48); + this.bannerBox.TabIndex = 2; + this.bannerBox.Text = "Configure the global settings."; + this.bannerBox.Title = "Settings"; + // + // SettingsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(586, 427); + this.Controls.Add(this.bannerBox); + this.Controls.Add(this.settingsTabControl); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SettingsForm"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ReClass.NET - Settings"; + this.settingsTabControl.ResumeLayout(false); + this.generalSettingsTabPage.ResumeLayout(false); + this.generalSettingsTabPage.PerformLayout(); + this.fileAssociationGroupBox.ResumeLayout(false); + this.commentsGroupBox.ResumeLayout(false); + this.commentsGroupBox.PerformLayout(); + this.displayGroupBox.ResumeLayout(false); + this.displayGroupBox.PerformLayout(); + this.colorsSettingTabPage.ResumeLayout(false); + this.colorsSettingTabPage.PerformLayout(); + this.nodeColorGroupBox.ResumeLayout(false); + this.nodeColorGroupBox.PerformLayout(); + this.typeDefinitionsSettingsTabPage.ResumeLayout(false); + this.typeDefinitionsSettingsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.TabControl settingsTabControl; + private System.Windows.Forms.TabPage generalSettingsTabPage; + private System.Windows.Forms.TabPage colorsSettingTabPage; + private System.Windows.Forms.TabPage typeDefinitionsSettingsTabPage; + private ReClassNET.UI.SettingsCheckBox stayOnTopCheckBox; + private System.Windows.Forms.GroupBox displayGroupBox; + private ReClassNET.UI.SettingsCheckBox showNodeAddressCheckBox; + private ReClassNET.UI.SettingsCheckBox showTextCheckBox; + private ReClassNET.UI.SettingsCheckBox showNodeOffsetCheckBox; + private ReClassNET.UI.SettingsCheckBox highlightChangedValuesCheckBox; + private System.Windows.Forms.GroupBox commentsGroupBox; + private ReClassNET.UI.SettingsCheckBox showRttiCheckBox; + private ReClassNET.UI.SettingsCheckBox showPointerCheckBox; + private ReClassNET.UI.SettingsCheckBox showIntegerCheckBox; + private ReClassNET.UI.SettingsCheckBox showFloatCheckBox; + private ReClassNET.UI.SettingsCheckBox showPluginInfoCheckBox; + private ReClassNET.UI.SettingsCheckBox showStringCheckBox; + private ReClassNET.UI.SettingsCheckBox showSymbolsCheckBox; + private UI.ColorBox backgroundColorBox; + private System.Windows.Forms.Label nodeSelectedLabel; + private UI.ColorBox nodeSelectedColorBox; + private System.Windows.Forms.Label nodeHiddenLabel; + private UI.ColorBox nodeHiddenColorBox; + private System.Windows.Forms.Label nodeAddressLabel; + private UI.ColorBox nodeAddressColorBox; + private System.Windows.Forms.Label nodeOffsetLabel; + private UI.ColorBox nodeOffsetColorBox; + private System.Windows.Forms.Label nodeHexValueLabel; + private UI.ColorBox nodeHexValueColorBox; + private System.Windows.Forms.Label backgroundLabel; + private System.Windows.Forms.Label nodeValueLabel; + private UI.ColorBox nodeValueColorBox; + private System.Windows.Forms.Label nodeNameLabel; + private UI.ColorBox nodeNameColorBox; + private System.Windows.Forms.Label nodeTypeLabel; + private UI.ColorBox nodeTypeColorBox; + private System.Windows.Forms.Label nodeVTableLabel; + private UI.ColorBox nodeVTableColorBox; + private System.Windows.Forms.Label nodeTextLabel; + private UI.ColorBox nodeTextColorBox; + private System.Windows.Forms.Label nodeCommentLabel; + private UI.ColorBox nodeCommentColorBox; + private System.Windows.Forms.Label nodeIndexLabel; + private UI.ColorBox nodeIndexColorBox; + private System.Windows.Forms.Label nodePluginLabel; + private UI.ColorBox nodePluginColorBox; + private System.Windows.Forms.Label floatSettingsLabel; + private UI.SettingsTextBox floatSettingsTextBox; + private System.Windows.Forms.Label uint64SettingsLabel; + private UI.SettingsTextBox uint64SettingsTextBox; + private System.Windows.Forms.Label uint32SettingsLabel; + private UI.SettingsTextBox uint32SettingsTextBox; + private System.Windows.Forms.Label uint16SettingsLabel; + private UI.SettingsTextBox uint16SettingsTextBox; + private System.Windows.Forms.Label uint8SettingsLabel; + private UI.SettingsTextBox uint8SettingsTextBox; + private System.Windows.Forms.Label int64SettingsLabel; + private UI.SettingsTextBox int64SettingsTextBox; + private System.Windows.Forms.Label int32SettingsLabel; + private UI.SettingsTextBox int32SettingsTextBox; + private System.Windows.Forms.Label int16SettingsLabel; + private UI.SettingsTextBox int16SettingsTextBox; + private System.Windows.Forms.Label int8SettingsLabel; + private UI.SettingsTextBox int8SettingsTextBox; + private System.Windows.Forms.Label paddingSettingsLabel; + private UI.SettingsTextBox paddingSettingsTextBox; + private System.Windows.Forms.Label functionPtrSettingsLabel; + private UI.SettingsTextBox functionPtrSettingsTextBox; + private System.Windows.Forms.Label utf16TextPtrSettingsLabel; + private UI.SettingsTextBox utf16TextPtrSettingsTextBox; + private System.Windows.Forms.Label utf16TextSettingsLabel; + private UI.SettingsTextBox utf16TextSettingsTextBox; + private System.Windows.Forms.Label utf8TextPtrSettingsLabel; + private UI.SettingsTextBox utf8TextPtrSettingsTextBox; + private System.Windows.Forms.Label utf8TextSettingsLabel; + private UI.SettingsTextBox utf8TextSettingsTextBox; + private System.Windows.Forms.Label matrix3x3SettingsLabel; + private UI.SettingsTextBox matrix3x3SettingsTextBox; + private System.Windows.Forms.Label matrix3x4SettingsLabel; + private UI.SettingsTextBox matrix3x4SettingsTextBox; + private System.Windows.Forms.Label matrix4x4SettingsLabel; + private UI.SettingsTextBox matrix4x4SettingsTextBox; + private System.Windows.Forms.Label vector2SettingsLabel; + private UI.SettingsTextBox vector2SettingsTextBox; + private System.Windows.Forms.Label vector3SettingsLabel; + private UI.SettingsTextBox vector3SettingsTextBox; + private System.Windows.Forms.Label vector4SettingsLabel; + private UI.SettingsTextBox vector4SettingsTextBox; + private System.Windows.Forms.Label doubleSettingsLabel; + private UI.SettingsTextBox doubleSettingsTextBox; + private System.Windows.Forms.GroupBox nodeColorGroupBox; + private System.Windows.Forms.Label label1; + private UI.BannerBox bannerBox; + private System.Windows.Forms.Label boolSettingsLabel; + private UI.SettingsTextBox boolSettingsTextBox; + private System.Windows.Forms.GroupBox fileAssociationGroupBox; + private System.Windows.Forms.Button removeAssociationButton; + private System.Windows.Forms.Button createAssociationButton; + private System.Windows.Forms.Label associationInfoLabel; + } } \ No newline at end of file diff --git a/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs similarity index 97% rename from Forms/SettingsForm.cs rename to ReClass.NET/Forms/SettingsForm.cs index dec15079..7e133e2e 100644 --- a/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -1,195 +1,195 @@ -using System; -using System.Diagnostics.Contracts; -using System.Windows.Forms; -using ReClassNET.Native; -using ReClassNET.UI; -using ReClassNET.Util; - -namespace ReClassNET.Forms -{ - public partial class SettingsForm : IconForm - { - private readonly Settings settings; - - public SettingsForm(Settings settings) - { - Contract.Requires(settings != null); - - this.settings = settings; - - InitializeComponent(); - - var imageList = new ImageList(); - imageList.Images.Add(Properties.Resources.B16x16_Gear); - imageList.Images.Add(Properties.Resources.B16x16_Color_Wheel); - imageList.Images.Add(Properties.Resources.B16x16_Settings_Edit); - - settingsTabControl.ImageList = imageList; - generalSettingsTabPage.ImageIndex = 0; - colorsSettingTabPage.ImageIndex = 1; - typeDefinitionsSettingsTabPage.ImageIndex = 2; - - backgroundColorBox.Color = System.Drawing.Color.Red; - - SetBindings(); - - if (NativeMethods.IsUnix()) - { - fileAssociationGroupBox.Enabled = false; - } - else - { - NativeMethodsWindows.SetButtonShield(createAssociationButton, true); - NativeMethodsWindows.SetButtonShield(removeAssociationButton, true); - } - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GlobalWindowManager.AddWindow(this); - } - - protected override void OnFormClosed(FormClosedEventArgs e) - { - base.OnFormClosed(e); - - GlobalWindowManager.RemoveWindow(this); - } - - private void createAssociationButton_Click(object sender, EventArgs e) - { - WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtRegister}"); - } - - private void removeAssociationButton_Click(object sender, EventArgs e) - { - WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtUnregister}"); - } - - private void SetBindings() - { - SetGeneralBindings(); - SetColorBindings(); - SetTypedefinitionBindings(); - } - - private void SetGeneralBindings() - { - stayOnTopCheckBox.Source = settings; - stayOnTopCheckBox.SettingName = nameof(Settings.StayOnTop); - stayOnTopCheckBox.CheckedChanged += (sender, e) => - { - GlobalWindowManager.Windows.ForEach(w => w.TopMost = stayOnTopCheckBox.Checked); - }; - - showNodeAddressCheckBox.Source = settings; - showNodeAddressCheckBox.SettingName = nameof(Settings.ShowNodeAddress); - showNodeOffsetCheckBox.Source = settings; - showNodeOffsetCheckBox.SettingName = nameof(Settings.ShowNodeOffset); - showTextCheckBox.Source = settings; - showTextCheckBox.SettingName = nameof(Settings.ShowNodeText); - highlightChangedValuesCheckBox.Source = settings; - highlightChangedValuesCheckBox.SettingName = nameof(Settings.HighlightChangedValues); - - showFloatCheckBox.Source = settings; - showFloatCheckBox.SettingName = nameof(Settings.ShowCommentFloat); - showIntegerCheckBox.Source = settings; - showIntegerCheckBox.SettingName = nameof(Settings.ShowCommentInteger); - showPointerCheckBox.Source = settings; - showPointerCheckBox.SettingName = nameof(Settings.ShowCommentPointer); - showRttiCheckBox.Source = settings; - showRttiCheckBox.SettingName = nameof(Settings.ShowCommentRtti); - showSymbolsCheckBox.Source = settings; - showSymbolsCheckBox.SettingName = nameof(Settings.ShowCommentSymbol); - showStringCheckBox.Source = settings; - showStringCheckBox.SettingName = nameof(Settings.ShowCommentString); - showPluginInfoCheckBox.Source = settings; - showPluginInfoCheckBox.SettingName = nameof(Settings.ShowCommentPluginInfo); - } - - private void SetColorBindings() - { - backgroundColorBox.Source = settings; - backgroundColorBox.SettingName = nameof(Settings.BackgroundColor); - - nodeSelectedColorBox.Source = settings; - nodeSelectedColorBox.SettingName = nameof(Settings.SelectedColor); - nodeHiddenColorBox.Source = settings; - nodeHiddenColorBox.SettingName = nameof(Settings.HiddenColor); - nodeAddressColorBox.Source = settings; - nodeAddressColorBox.SettingName = nameof(Settings.AddressColor); - nodeOffsetColorBox.Source = settings; - nodeOffsetColorBox.SettingName = nameof(Settings.OffsetColor); - nodeHexValueColorBox.Source = settings; - nodeHexValueColorBox.SettingName = nameof(Settings.HexColor); - nodeTypeColorBox.Source = settings; - nodeTypeColorBox.SettingName = nameof(Settings.TypeColor); - nodeNameColorBox.Source = settings; - nodeNameColorBox.SettingName = nameof(Settings.NameColor); - nodeValueColorBox.Source = settings; - nodeValueColorBox.SettingName = nameof(Settings.ValueColor); - nodeIndexColorBox.Source = settings; - nodeIndexColorBox.SettingName = nameof(Settings.IndexColor); - nodeVTableColorBox.Source = settings; - nodeVTableColorBox.SettingName = nameof(Settings.VTableColor); - nodeCommentColorBox.Source = settings; - nodeCommentColorBox.SettingName = nameof(Settings.CommentColor); - nodeTextColorBox.Source = settings; - nodeTextColorBox.SettingName = nameof(Settings.TextColor); - nodePluginColorBox.Source = settings; - nodePluginColorBox.SettingName = nameof(Settings.PluginColor); - } - - private void SetTypedefinitionBindings() - { - paddingSettingsTextBox.Source = settings; - paddingSettingsTextBox.SettingName = nameof(Settings.TypePadding); - boolSettingsTextBox.Source = settings; - boolSettingsTextBox.SettingName = nameof(Settings.TypeBool); - int8SettingsTextBox.Source = settings; - int8SettingsTextBox.SettingName = nameof(Settings.TypeInt8); - int16SettingsTextBox.Source = settings; - int16SettingsTextBox.SettingName = nameof(Settings.TypeInt16); - int32SettingsTextBox.Source = settings; - int32SettingsTextBox.SettingName = nameof(Settings.TypeInt32); - int64SettingsTextBox.Source = settings; - int64SettingsTextBox.SettingName = nameof(Settings.TypeInt64); - uint8SettingsTextBox.Source = settings; - uint8SettingsTextBox.SettingName = nameof(Settings.TypeUInt8); - uint16SettingsTextBox.Source = settings; - uint16SettingsTextBox.SettingName = nameof(Settings.TypeUInt16); - uint32SettingsTextBox.Source = settings; - uint32SettingsTextBox.SettingName = nameof(Settings.TypeUInt32); - uint64SettingsTextBox.Source = settings; - uint64SettingsTextBox.SettingName = nameof(Settings.TypeUInt64); - floatSettingsTextBox.Source = settings; - floatSettingsTextBox.SettingName = nameof(Settings.TypeFloat); - doubleSettingsTextBox.Source = settings; - doubleSettingsTextBox.SettingName = nameof(Settings.TypeDouble); - vector2SettingsTextBox.Source = settings; - vector2SettingsTextBox.SettingName = nameof(Settings.TypeVector2); - vector3SettingsTextBox.Source = settings; - vector3SettingsTextBox.SettingName = nameof(Settings.TypeVector3); - vector4SettingsTextBox.Source = settings; - vector4SettingsTextBox.SettingName = nameof(Settings.TypeVector4); - matrix3x3SettingsTextBox.Source = settings; - matrix3x3SettingsTextBox.SettingName = nameof(Settings.TypeMatrix3x3); - matrix3x4SettingsTextBox.Source = settings; - matrix3x4SettingsTextBox.SettingName = nameof(Settings.TypeMatrix3x4); - matrix4x4SettingsTextBox.Source = settings; - matrix4x4SettingsTextBox.SettingName = nameof(Settings.TypeMatrix4x4); - utf8TextSettingsTextBox.Source = settings; - utf8TextSettingsTextBox.SettingName = nameof(Settings.TypeUTF8Text); - utf8TextPtrSettingsTextBox.Source = settings; - utf8TextPtrSettingsTextBox.SettingName = nameof(Settings.TypeUTF8TextPtr); - utf16TextSettingsTextBox.Source = settings; - utf16TextSettingsTextBox.SettingName = nameof(Settings.TypeUTF16Text); - utf16TextPtrSettingsTextBox.Source = settings; - utf16TextPtrSettingsTextBox.SettingName = nameof(Settings.TypeUTF16TextPtr); - functionPtrSettingsTextBox.Source = settings; - functionPtrSettingsTextBox.SettingName = nameof(Settings.TypeFunctionPtr); - } - } -} +using System; +using System.Diagnostics.Contracts; +using System.Windows.Forms; +using ReClassNET.Native; +using ReClassNET.UI; +using ReClassNET.Util; + +namespace ReClassNET.Forms +{ + public partial class SettingsForm : IconForm + { + private readonly Settings settings; + + public SettingsForm(Settings settings) + { + Contract.Requires(settings != null); + + this.settings = settings; + + InitializeComponent(); + + var imageList = new ImageList(); + imageList.Images.Add(Properties.Resources.B16x16_Gear); + imageList.Images.Add(Properties.Resources.B16x16_Color_Wheel); + imageList.Images.Add(Properties.Resources.B16x16_Settings_Edit); + + settingsTabControl.ImageList = imageList; + generalSettingsTabPage.ImageIndex = 0; + colorsSettingTabPage.ImageIndex = 1; + typeDefinitionsSettingsTabPage.ImageIndex = 2; + + backgroundColorBox.Color = System.Drawing.Color.Red; + + SetBindings(); + + if (NativeMethods.IsUnix()) + { + fileAssociationGroupBox.Enabled = false; + } + else + { + NativeMethodsWindows.SetButtonShield(createAssociationButton, true); + NativeMethodsWindows.SetButtonShield(removeAssociationButton, true); + } + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + + private void createAssociationButton_Click(object sender, EventArgs e) + { + WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtRegister}"); + } + + private void removeAssociationButton_Click(object sender, EventArgs e) + { + WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtUnregister}"); + } + + private void SetBindings() + { + SetGeneralBindings(); + SetColorBindings(); + SetTypedefinitionBindings(); + } + + private void SetGeneralBindings() + { + stayOnTopCheckBox.Source = settings; + stayOnTopCheckBox.SettingName = nameof(Settings.StayOnTop); + stayOnTopCheckBox.CheckedChanged += (sender, e) => + { + GlobalWindowManager.Windows.ForEach(w => w.TopMost = stayOnTopCheckBox.Checked); + }; + + showNodeAddressCheckBox.Source = settings; + showNodeAddressCheckBox.SettingName = nameof(Settings.ShowNodeAddress); + showNodeOffsetCheckBox.Source = settings; + showNodeOffsetCheckBox.SettingName = nameof(Settings.ShowNodeOffset); + showTextCheckBox.Source = settings; + showTextCheckBox.SettingName = nameof(Settings.ShowNodeText); + highlightChangedValuesCheckBox.Source = settings; + highlightChangedValuesCheckBox.SettingName = nameof(Settings.HighlightChangedValues); + + showFloatCheckBox.Source = settings; + showFloatCheckBox.SettingName = nameof(Settings.ShowCommentFloat); + showIntegerCheckBox.Source = settings; + showIntegerCheckBox.SettingName = nameof(Settings.ShowCommentInteger); + showPointerCheckBox.Source = settings; + showPointerCheckBox.SettingName = nameof(Settings.ShowCommentPointer); + showRttiCheckBox.Source = settings; + showRttiCheckBox.SettingName = nameof(Settings.ShowCommentRtti); + showSymbolsCheckBox.Source = settings; + showSymbolsCheckBox.SettingName = nameof(Settings.ShowCommentSymbol); + showStringCheckBox.Source = settings; + showStringCheckBox.SettingName = nameof(Settings.ShowCommentString); + showPluginInfoCheckBox.Source = settings; + showPluginInfoCheckBox.SettingName = nameof(Settings.ShowCommentPluginInfo); + } + + private void SetColorBindings() + { + backgroundColorBox.Source = settings; + backgroundColorBox.SettingName = nameof(Settings.BackgroundColor); + + nodeSelectedColorBox.Source = settings; + nodeSelectedColorBox.SettingName = nameof(Settings.SelectedColor); + nodeHiddenColorBox.Source = settings; + nodeHiddenColorBox.SettingName = nameof(Settings.HiddenColor); + nodeAddressColorBox.Source = settings; + nodeAddressColorBox.SettingName = nameof(Settings.AddressColor); + nodeOffsetColorBox.Source = settings; + nodeOffsetColorBox.SettingName = nameof(Settings.OffsetColor); + nodeHexValueColorBox.Source = settings; + nodeHexValueColorBox.SettingName = nameof(Settings.HexColor); + nodeTypeColorBox.Source = settings; + nodeTypeColorBox.SettingName = nameof(Settings.TypeColor); + nodeNameColorBox.Source = settings; + nodeNameColorBox.SettingName = nameof(Settings.NameColor); + nodeValueColorBox.Source = settings; + nodeValueColorBox.SettingName = nameof(Settings.ValueColor); + nodeIndexColorBox.Source = settings; + nodeIndexColorBox.SettingName = nameof(Settings.IndexColor); + nodeVTableColorBox.Source = settings; + nodeVTableColorBox.SettingName = nameof(Settings.VTableColor); + nodeCommentColorBox.Source = settings; + nodeCommentColorBox.SettingName = nameof(Settings.CommentColor); + nodeTextColorBox.Source = settings; + nodeTextColorBox.SettingName = nameof(Settings.TextColor); + nodePluginColorBox.Source = settings; + nodePluginColorBox.SettingName = nameof(Settings.PluginColor); + } + + private void SetTypedefinitionBindings() + { + paddingSettingsTextBox.Source = settings; + paddingSettingsTextBox.SettingName = nameof(Settings.TypePadding); + boolSettingsTextBox.Source = settings; + boolSettingsTextBox.SettingName = nameof(Settings.TypeBool); + int8SettingsTextBox.Source = settings; + int8SettingsTextBox.SettingName = nameof(Settings.TypeInt8); + int16SettingsTextBox.Source = settings; + int16SettingsTextBox.SettingName = nameof(Settings.TypeInt16); + int32SettingsTextBox.Source = settings; + int32SettingsTextBox.SettingName = nameof(Settings.TypeInt32); + int64SettingsTextBox.Source = settings; + int64SettingsTextBox.SettingName = nameof(Settings.TypeInt64); + uint8SettingsTextBox.Source = settings; + uint8SettingsTextBox.SettingName = nameof(Settings.TypeUInt8); + uint16SettingsTextBox.Source = settings; + uint16SettingsTextBox.SettingName = nameof(Settings.TypeUInt16); + uint32SettingsTextBox.Source = settings; + uint32SettingsTextBox.SettingName = nameof(Settings.TypeUInt32); + uint64SettingsTextBox.Source = settings; + uint64SettingsTextBox.SettingName = nameof(Settings.TypeUInt64); + floatSettingsTextBox.Source = settings; + floatSettingsTextBox.SettingName = nameof(Settings.TypeFloat); + doubleSettingsTextBox.Source = settings; + doubleSettingsTextBox.SettingName = nameof(Settings.TypeDouble); + vector2SettingsTextBox.Source = settings; + vector2SettingsTextBox.SettingName = nameof(Settings.TypeVector2); + vector3SettingsTextBox.Source = settings; + vector3SettingsTextBox.SettingName = nameof(Settings.TypeVector3); + vector4SettingsTextBox.Source = settings; + vector4SettingsTextBox.SettingName = nameof(Settings.TypeVector4); + matrix3x3SettingsTextBox.Source = settings; + matrix3x3SettingsTextBox.SettingName = nameof(Settings.TypeMatrix3x3); + matrix3x4SettingsTextBox.Source = settings; + matrix3x4SettingsTextBox.SettingName = nameof(Settings.TypeMatrix3x4); + matrix4x4SettingsTextBox.Source = settings; + matrix4x4SettingsTextBox.SettingName = nameof(Settings.TypeMatrix4x4); + utf8TextSettingsTextBox.Source = settings; + utf8TextSettingsTextBox.SettingName = nameof(Settings.TypeUTF8Text); + utf8TextPtrSettingsTextBox.Source = settings; + utf8TextPtrSettingsTextBox.SettingName = nameof(Settings.TypeUTF8TextPtr); + utf16TextSettingsTextBox.Source = settings; + utf16TextSettingsTextBox.SettingName = nameof(Settings.TypeUTF16Text); + utf16TextPtrSettingsTextBox.Source = settings; + utf16TextPtrSettingsTextBox.SettingName = nameof(Settings.TypeUTF16TextPtr); + functionPtrSettingsTextBox.Source = settings; + functionPtrSettingsTextBox.SettingName = nameof(Settings.TypeFunctionPtr); + } + } +} diff --git a/Forms/SettingsForm.resx b/ReClass.NET/Forms/SettingsForm.resx similarity index 100% rename from Forms/SettingsForm.resx rename to ReClass.NET/Forms/SettingsForm.resx diff --git a/Input/KeyboardHotkey.cs b/ReClass.NET/Input/KeyboardHotkey.cs similarity index 100% rename from Input/KeyboardHotkey.cs rename to ReClass.NET/Input/KeyboardHotkey.cs diff --git a/Input/KeyboardInput.cs b/ReClass.NET/Input/KeyboardInput.cs similarity index 100% rename from Input/KeyboardInput.cs rename to ReClass.NET/Input/KeyboardInput.cs diff --git a/Logger/BaseLogger.cs b/ReClass.NET/Logger/BaseLogger.cs similarity index 100% rename from Logger/BaseLogger.cs rename to ReClass.NET/Logger/BaseLogger.cs diff --git a/Logger/GuiLogger.cs b/ReClass.NET/Logger/GuiLogger.cs similarity index 100% rename from Logger/GuiLogger.cs rename to ReClass.NET/Logger/GuiLogger.cs diff --git a/Logger/ILogger.cs b/ReClass.NET/Logger/ILogger.cs similarity index 100% rename from Logger/ILogger.cs rename to ReClass.NET/Logger/ILogger.cs diff --git a/Logger/LogLevel.cs b/ReClass.NET/Logger/LogLevel.cs similarity index 100% rename from Logger/LogLevel.cs rename to ReClass.NET/Logger/LogLevel.cs diff --git a/Logger/NullLogger.cs b/ReClass.NET/Logger/NullLogger.cs similarity index 100% rename from Logger/NullLogger.cs rename to ReClass.NET/Logger/NullLogger.cs diff --git a/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs similarity index 100% rename from Memory/Disassembler.cs rename to ReClass.NET/Memory/Disassembler.cs diff --git a/Memory/Dumper.cs b/ReClass.NET/Memory/Dumper.cs similarity index 100% rename from Memory/Dumper.cs rename to ReClass.NET/Memory/Dumper.cs diff --git a/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs similarity index 100% rename from Memory/MemoryBuffer.cs rename to ReClass.NET/Memory/MemoryBuffer.cs diff --git a/Memory/Module.cs b/ReClass.NET/Memory/Module.cs similarity index 100% rename from Memory/Module.cs rename to ReClass.NET/Memory/Module.cs diff --git a/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs similarity index 100% rename from Memory/NodeDissector.cs rename to ReClass.NET/Memory/NodeDissector.cs diff --git a/Memory/ProcessInfo.cs b/ReClass.NET/Memory/ProcessInfo.cs similarity index 100% rename from Memory/ProcessInfo.cs rename to ReClass.NET/Memory/ProcessInfo.cs diff --git a/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs similarity index 100% rename from Memory/RemoteProcess.cs rename to ReClass.NET/Memory/RemoteProcess.cs diff --git a/Memory/Section.cs b/ReClass.NET/Memory/Section.cs similarity index 100% rename from Memory/Section.cs rename to ReClass.NET/Memory/Section.cs diff --git a/Memory/UnionDataType.cs b/ReClass.NET/Memory/UnionDataType.cs similarity index 100% rename from Memory/UnionDataType.cs rename to ReClass.NET/Memory/UnionDataType.cs diff --git a/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs similarity index 100% rename from MemoryScanner/BytePattern.cs rename to ReClass.NET/MemoryScanner/BytePattern.cs diff --git a/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs diff --git a/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/ByteMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs diff --git a/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/DoubleMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs diff --git a/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/FloatMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs diff --git a/MemoryScanner/Comparer/IScanComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs similarity index 100% rename from MemoryScanner/Comparer/IScanComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs diff --git a/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/IntegerMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs diff --git a/MemoryScanner/Comparer/InvalidCompareTypeException.cs b/ReClass.NET/MemoryScanner/Comparer/InvalidCompareTypeException.cs similarity index 100% rename from MemoryScanner/Comparer/InvalidCompareTypeException.cs rename to ReClass.NET/MemoryScanner/Comparer/InvalidCompareTypeException.cs diff --git a/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/LongMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs diff --git a/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/ShortMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs diff --git a/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs similarity index 100% rename from MemoryScanner/Comparer/StringMemoryComparer.cs rename to ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs diff --git a/MemoryScanner/InputCorrelatedScanner.cs b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs similarity index 100% rename from MemoryScanner/InputCorrelatedScanner.cs rename to ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs diff --git a/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs similarity index 100% rename from MemoryScanner/MemoryRecord.cs rename to ReClass.NET/MemoryScanner/MemoryRecord.cs diff --git a/MemoryScanner/ScanCompareType.cs b/ReClass.NET/MemoryScanner/ScanCompareType.cs similarity index 100% rename from MemoryScanner/ScanCompareType.cs rename to ReClass.NET/MemoryScanner/ScanCompareType.cs diff --git a/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs similarity index 100% rename from MemoryScanner/ScanResult.cs rename to ReClass.NET/MemoryScanner/ScanResult.cs diff --git a/MemoryScanner/ScanResultBlock.cs b/ReClass.NET/MemoryScanner/ScanResultBlock.cs similarity index 100% rename from MemoryScanner/ScanResultBlock.cs rename to ReClass.NET/MemoryScanner/ScanResultBlock.cs diff --git a/MemoryScanner/ScanResultStore.cs b/ReClass.NET/MemoryScanner/ScanResultStore.cs similarity index 100% rename from MemoryScanner/ScanResultStore.cs rename to ReClass.NET/MemoryScanner/ScanResultStore.cs diff --git a/MemoryScanner/ScanRoundMode.cs b/ReClass.NET/MemoryScanner/ScanRoundMode.cs similarity index 100% rename from MemoryScanner/ScanRoundMode.cs rename to ReClass.NET/MemoryScanner/ScanRoundMode.cs diff --git a/MemoryScanner/ScanSettings.cs b/ReClass.NET/MemoryScanner/ScanSettings.cs similarity index 100% rename from MemoryScanner/ScanSettings.cs rename to ReClass.NET/MemoryScanner/ScanSettings.cs diff --git a/MemoryScanner/ScanValueType.cs b/ReClass.NET/MemoryScanner/ScanValueType.cs similarity index 100% rename from MemoryScanner/ScanValueType.cs rename to ReClass.NET/MemoryScanner/ScanValueType.cs diff --git a/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs similarity index 100% rename from MemoryScanner/Scanner.cs rename to ReClass.NET/MemoryScanner/Scanner.cs diff --git a/MemoryScanner/ScannerContext.cs b/ReClass.NET/MemoryScanner/ScannerContext.cs similarity index 100% rename from MemoryScanner/ScannerContext.cs rename to ReClass.NET/MemoryScanner/ScannerContext.cs diff --git a/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs similarity index 100% rename from MemoryScanner/ScannerWorker.cs rename to ReClass.NET/MemoryScanner/ScannerWorker.cs diff --git a/Native/INativeMethods.cs b/ReClass.NET/Native/INativeMethods.cs similarity index 100% rename from Native/INativeMethods.cs rename to ReClass.NET/Native/INativeMethods.cs diff --git a/Native/NativeMethods.Unix.cs b/ReClass.NET/Native/NativeMethods.Unix.cs similarity index 100% rename from Native/NativeMethods.Unix.cs rename to ReClass.NET/Native/NativeMethods.Unix.cs diff --git a/Native/NativeMethods.Windows.cs b/ReClass.NET/Native/NativeMethods.Windows.cs similarity index 100% rename from Native/NativeMethods.Windows.cs rename to ReClass.NET/Native/NativeMethods.Windows.cs diff --git a/Native/NativeMethods.cs b/ReClass.NET/Native/NativeMethods.cs similarity index 100% rename from Native/NativeMethods.cs rename to ReClass.NET/Native/NativeMethods.cs diff --git a/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs similarity index 100% rename from Nodes/BaseArrayNode.cs rename to ReClass.NET/Nodes/BaseArrayNode.cs diff --git a/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs similarity index 100% rename from Nodes/BaseContainerNode.cs rename to ReClass.NET/Nodes/BaseContainerNode.cs diff --git a/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs similarity index 100% rename from Nodes/BaseFunctionNode.cs rename to ReClass.NET/Nodes/BaseFunctionNode.cs diff --git a/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs similarity index 100% rename from Nodes/BaseFunctionPtrNode.cs rename to ReClass.NET/Nodes/BaseFunctionPtrNode.cs diff --git a/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs similarity index 100% rename from Nodes/BaseHexCommentNode.cs rename to ReClass.NET/Nodes/BaseHexCommentNode.cs diff --git a/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs similarity index 100% rename from Nodes/BaseHexNode.cs rename to ReClass.NET/Nodes/BaseHexNode.cs diff --git a/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs similarity index 100% rename from Nodes/BaseMatrixNode.cs rename to ReClass.NET/Nodes/BaseMatrixNode.cs diff --git a/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs similarity index 100% rename from Nodes/BaseNode.cs rename to ReClass.NET/Nodes/BaseNode.cs diff --git a/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs similarity index 100% rename from Nodes/BaseNumericNode.cs rename to ReClass.NET/Nodes/BaseNumericNode.cs diff --git a/Nodes/BaseReferenceNode.cs b/ReClass.NET/Nodes/BaseReferenceNode.cs similarity index 100% rename from Nodes/BaseReferenceNode.cs rename to ReClass.NET/Nodes/BaseReferenceNode.cs diff --git a/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs similarity index 100% rename from Nodes/BaseTextNode.cs rename to ReClass.NET/Nodes/BaseTextNode.cs diff --git a/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs similarity index 100% rename from Nodes/BaseTextPtrNode.cs rename to ReClass.NET/Nodes/BaseTextPtrNode.cs diff --git a/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs similarity index 100% rename from Nodes/BitFieldNode.cs rename to ReClass.NET/Nodes/BitFieldNode.cs diff --git a/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs similarity index 96% rename from Nodes/BoolNode.cs rename to ReClass.NET/Nodes/BoolNode.cs index d1555a7e..2ec5bde0 100644 --- a/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -1,68 +1,68 @@ -using System.Drawing; -using ReClassNET.UI; - -namespace ReClassNET.Nodes -{ - public class BoolNode : BaseNumericNode - { - /// Size of the node in bytes. - public override int MemorySize => 1; - - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. - public override Size Draw(ViewInfo view, int x, int y) - { - if (IsHidden) - { - return DrawHidden(view, x, y); - } - - DrawInvalidMemoryIndicator(view, y); - - var origX = x; - - AddSelection(view, x, y, view.Font.Height); - - x += TextPadding + Icons.Dimensions; - - x = AddAddressOffset(view, x, y); - - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bool") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; - - var value = view.Memory.ReadByte(Offset); - x = AddText(view, x, y, view.Settings.ValueColor, 0, value == 0 ? "false" : "true") + view.Font.Width; - - x = AddComment(view, x, y); - - AddTypeDrop(view, y); - AddDelete(view, y); - - return new Size(x - origX, view.Font.Height); - } - - public override int CalculateDrawnHeight(ViewInfo view) - { - return IsHidden ? HiddenHeight : view.Font.Height; - } - - /// Updates the node from the given spot and sets the value. - /// The spot. - public override void Update(HotSpot spot) - { - base.Update(spot); - - if (spot.Id == 0) - { - if (bool.TryParse(spot.Text, out var val)) - { - spot.Memory.Process.WriteRemoteMemory(spot.Address, (byte)(val ? 1 : 0)); - } - } - } - } -} +using System.Drawing; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class BoolNode : BaseNumericNode + { + /// Size of the node in bytes. + public override int MemorySize => 1; + + /// Draws this node. + /// The view information. + /// The x coordinate. + /// The y coordinate. + /// The pixel size the node occupies. + public override Size Draw(ViewInfo view, int x, int y) + { + if (IsHidden) + { + return DrawHidden(view, x, y); + } + + DrawInvalidMemoryIndicator(view, y); + + var origX = x; + + AddSelection(view, x, y, view.Font.Height); + + x += TextPadding + Icons.Dimensions; + + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bool") + view.Font.Width; + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; + + var value = view.Memory.ReadByte(Offset); + x = AddText(view, x, y, view.Settings.ValueColor, 0, value == 0 ? "false" : "true") + view.Font.Width; + + x = AddComment(view, x, y); + + AddTypeDrop(view, y); + AddDelete(view, y); + + return new Size(x - origX, view.Font.Height); + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + return IsHidden ? HiddenHeight : view.Font.Height; + } + + /// Updates the node from the given spot and sets the value. + /// The spot. + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0) + { + if (bool.TryParse(spot.Text, out var val)) + { + spot.Memory.Process.WriteRemoteMemory(spot.Address, (byte)(val ? 1 : 0)); + } + } + } + } +} diff --git a/Nodes/ClassInstanceArrayNode.cs b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs similarity index 100% rename from Nodes/ClassInstanceArrayNode.cs rename to ReClass.NET/Nodes/ClassInstanceArrayNode.cs diff --git a/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs similarity index 100% rename from Nodes/ClassInstanceNode.cs rename to ReClass.NET/Nodes/ClassInstanceNode.cs diff --git a/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs similarity index 100% rename from Nodes/ClassNode.cs rename to ReClass.NET/Nodes/ClassNode.cs diff --git a/Nodes/ClassPtrArrayNode.cs b/ReClass.NET/Nodes/ClassPtrArrayNode.cs similarity index 100% rename from Nodes/ClassPtrArrayNode.cs rename to ReClass.NET/Nodes/ClassPtrArrayNode.cs diff --git a/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs similarity index 100% rename from Nodes/ClassPtrNode.cs rename to ReClass.NET/Nodes/ClassPtrNode.cs diff --git a/Nodes/ClassUtil.cs b/ReClass.NET/Nodes/ClassUtil.cs similarity index 100% rename from Nodes/ClassUtil.cs rename to ReClass.NET/Nodes/ClassUtil.cs diff --git a/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs similarity index 100% rename from Nodes/DoubleNode.cs rename to ReClass.NET/Nodes/DoubleNode.cs diff --git a/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs similarity index 100% rename from Nodes/FloatNode.cs rename to ReClass.NET/Nodes/FloatNode.cs diff --git a/Nodes/FunctionNode.Tokenizer.cs b/ReClass.NET/Nodes/FunctionNode.Tokenizer.cs similarity index 100% rename from Nodes/FunctionNode.Tokenizer.cs rename to ReClass.NET/Nodes/FunctionNode.Tokenizer.cs diff --git a/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs similarity index 100% rename from Nodes/FunctionNode.cs rename to ReClass.NET/Nodes/FunctionNode.cs diff --git a/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs similarity index 100% rename from Nodes/FunctionPtrNode.cs rename to ReClass.NET/Nodes/FunctionPtrNode.cs diff --git a/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs similarity index 100% rename from Nodes/Hex16Node.cs rename to ReClass.NET/Nodes/Hex16Node.cs diff --git a/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs similarity index 100% rename from Nodes/Hex32Node.cs rename to ReClass.NET/Nodes/Hex32Node.cs diff --git a/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs similarity index 100% rename from Nodes/Hex64Node.cs rename to ReClass.NET/Nodes/Hex64Node.cs diff --git a/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs similarity index 100% rename from Nodes/Hex8Node.cs rename to ReClass.NET/Nodes/Hex8Node.cs diff --git a/Nodes/INodeInfoReader.cs b/ReClass.NET/Nodes/INodeInfoReader.cs similarity index 100% rename from Nodes/INodeInfoReader.cs rename to ReClass.NET/Nodes/INodeInfoReader.cs diff --git a/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs similarity index 100% rename from Nodes/Int16Node.cs rename to ReClass.NET/Nodes/Int16Node.cs diff --git a/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs similarity index 100% rename from Nodes/Int32Node.cs rename to ReClass.NET/Nodes/Int32Node.cs diff --git a/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs similarity index 100% rename from Nodes/Int64Node.cs rename to ReClass.NET/Nodes/Int64Node.cs diff --git a/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs similarity index 100% rename from Nodes/Int8Node.cs rename to ReClass.NET/Nodes/Int8Node.cs diff --git a/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs similarity index 100% rename from Nodes/Matrix3x3Node.cs rename to ReClass.NET/Nodes/Matrix3x3Node.cs diff --git a/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs similarity index 100% rename from Nodes/Matrix3x4Node.cs rename to ReClass.NET/Nodes/Matrix3x4Node.cs diff --git a/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs similarity index 100% rename from Nodes/Matrix4x4Node.cs rename to ReClass.NET/Nodes/Matrix4x4Node.cs diff --git a/Nodes/NodeUuid.cs b/ReClass.NET/Nodes/NodeUuid.cs similarity index 100% rename from Nodes/NodeUuid.cs rename to ReClass.NET/Nodes/NodeUuid.cs diff --git a/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs similarity index 100% rename from Nodes/UInt16Node.cs rename to ReClass.NET/Nodes/UInt16Node.cs diff --git a/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs similarity index 100% rename from Nodes/UInt32Node.cs rename to ReClass.NET/Nodes/UInt32Node.cs diff --git a/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs similarity index 100% rename from Nodes/UInt64Node.cs rename to ReClass.NET/Nodes/UInt64Node.cs diff --git a/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs similarity index 100% rename from Nodes/UInt8Node.cs rename to ReClass.NET/Nodes/UInt8Node.cs diff --git a/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs similarity index 100% rename from Nodes/UTF16TextNode.cs rename to ReClass.NET/Nodes/UTF16TextNode.cs diff --git a/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs similarity index 100% rename from Nodes/UTF16TextPtrNode.cs rename to ReClass.NET/Nodes/UTF16TextPtrNode.cs diff --git a/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs similarity index 100% rename from Nodes/UTF32TextNode.cs rename to ReClass.NET/Nodes/UTF32TextNode.cs diff --git a/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs similarity index 100% rename from Nodes/UTF32TextPtrNode.cs rename to ReClass.NET/Nodes/UTF32TextPtrNode.cs diff --git a/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs similarity index 100% rename from Nodes/UTF8TextNode.cs rename to ReClass.NET/Nodes/UTF8TextNode.cs diff --git a/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs similarity index 100% rename from Nodes/UTF8TextPtrNode.cs rename to ReClass.NET/Nodes/UTF8TextPtrNode.cs diff --git a/Nodes/VMethodNode.cs b/ReClass.NET/Nodes/VMethodNode.cs similarity index 100% rename from Nodes/VMethodNode.cs rename to ReClass.NET/Nodes/VMethodNode.cs diff --git a/Nodes/VTableNode.cs b/ReClass.NET/Nodes/VTableNode.cs similarity index 100% rename from Nodes/VTableNode.cs rename to ReClass.NET/Nodes/VTableNode.cs diff --git a/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs similarity index 100% rename from Nodes/Vector2Node.cs rename to ReClass.NET/Nodes/Vector2Node.cs diff --git a/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs similarity index 100% rename from Nodes/Vector3Node.cs rename to ReClass.NET/Nodes/Vector3Node.cs diff --git a/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs similarity index 100% rename from Nodes/Vector4Node.cs rename to ReClass.NET/Nodes/Vector4Node.cs diff --git a/Plugins/DefaultPluginHost.cs b/ReClass.NET/Plugins/DefaultPluginHost.cs similarity index 100% rename from Plugins/DefaultPluginHost.cs rename to ReClass.NET/Plugins/DefaultPluginHost.cs diff --git a/Plugins/IPluginHost.cs b/ReClass.NET/Plugins/IPluginHost.cs similarity index 100% rename from Plugins/IPluginHost.cs rename to ReClass.NET/Plugins/IPluginHost.cs diff --git a/Plugins/Plugin.cs b/ReClass.NET/Plugins/Plugin.cs similarity index 100% rename from Plugins/Plugin.cs rename to ReClass.NET/Plugins/Plugin.cs diff --git a/Plugins/PluginInfo.cs b/ReClass.NET/Plugins/PluginInfo.cs similarity index 100% rename from Plugins/PluginInfo.cs rename to ReClass.NET/Plugins/PluginInfo.cs diff --git a/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs similarity index 100% rename from Plugins/PluginManager.cs rename to ReClass.NET/Plugins/PluginManager.cs diff --git a/Program.cs b/ReClass.NET/Program.cs similarity index 100% rename from Program.cs rename to ReClass.NET/Program.cs diff --git a/Properties/AssemblyInfo.cs b/ReClass.NET/Properties/AssemblyInfo.cs similarity index 100% rename from Properties/AssemblyInfo.cs rename to ReClass.NET/Properties/AssemblyInfo.cs diff --git a/Properties/Resources.Designer.cs b/ReClass.NET/Properties/Resources.Designer.cs similarity index 97% rename from Properties/Resources.Designer.cs rename to ReClass.NET/Properties/Resources.Designer.cs index 6e22a44e..af837845 100644 --- a/Properties/Resources.Designer.cs +++ b/ReClass.NET/Properties/Resources.Designer.cs @@ -1,1323 +1,1323 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace ReClassNET.Properties { - using System; - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ReClassNET.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Accept { - get { - object obj = ResourceManager.GetObject("B16x16_Accept", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Array_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Array_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Arrow_Refresh { - get { - object obj = ResourceManager.GetObject("B16x16_Arrow_Refresh", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_1024 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_1024", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_2048 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_2048", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_256 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_256", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_4 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_4096 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_4096", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_64 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_8 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_X { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_X", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Array { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Array", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Bits { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Bits", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Bool { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Bool", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Class_Add { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Class_Add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Class_Instance { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Class_Instance", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Class_Pointer { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Class_Pointer", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Class_Remove { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Class_Remove", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Delete { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Double { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Double", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Drop_Down { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Drop_Down", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Float { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Float", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Function { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Function", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Function_Pointer { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Function_Pointer", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Hex_16 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Hex_16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Hex_32 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Hex_32", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Hex_64 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Hex_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Hex_8 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Hex_8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_1024 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_1024", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_2048 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_2048", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_256 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_256", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_4 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_4096 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_4096", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_64 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_8 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_X { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_X", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Int_16 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Int_16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Int_32 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Int_32", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Int_64 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Int_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Int_8 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Int_8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Matrix_3x3 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Matrix_3x3", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Matrix_3x4 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Matrix_3x4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Matrix_4x4 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Matrix_4x4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Pointer_Array { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Pointer_Array", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Text { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Text", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Text_Pointer { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Text_Pointer", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UInt_16 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UInt_16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UInt_32 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UInt_32", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UInt_64 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UInt_64", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UInt_8 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UInt_8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UText { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UText", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_UText_Pointer { - get { - object obj = ResourceManager.GetObject("B16x16_Button_UText_Pointer", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Vector_2 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Vector_2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Vector_3 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Vector_3", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_Vector_4 { - get { - object obj = ResourceManager.GetObject("B16x16_Button_Vector_4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Button_VTable { - get { - object obj = ResourceManager.GetObject("B16x16_Button_VTable", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Camera { - get { - object obj = ResourceManager.GetObject("B16x16_Camera", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Canvas_Size { - get { - object obj = ResourceManager.GetObject("B16x16_Canvas_Size", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Category { - get { - object obj = ResourceManager.GetObject("B16x16_Category", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Chart_Delete { - get { - object obj = ResourceManager.GetObject("B16x16_Chart_Delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Class_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Class_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Closed_Icon { - get { - object obj = ResourceManager.GetObject("B16x16_Closed_Icon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Cogs { - get { - object obj = ResourceManager.GetObject("B16x16_Cogs", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Color_Wheel { - get { - object obj = ResourceManager.GetObject("B16x16_Color_Wheel", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Control_Pause { - get { - object obj = ResourceManager.GetObject("B16x16_Control_Pause", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Control_Play { - get { - object obj = ResourceManager.GetObject("B16x16_Control_Play", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Control_Stop { - get { - object obj = ResourceManager.GetObject("B16x16_Control_Stop", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Custom_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Custom_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Double_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Double_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Drive_Go { - get { - object obj = ResourceManager.GetObject("B16x16_Drive_Go", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Enum_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Enum_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Error { - get { - object obj = ResourceManager.GetObject("B16x16_Error", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Exchange_Button { - get { - object obj = ResourceManager.GetObject("B16x16_Exchange_Button", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Eye { - get { - object obj = ResourceManager.GetObject("B16x16_Eye", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Find_Access { - get { - object obj = ResourceManager.GetObject("B16x16_Find_Access", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Find_Write { - get { - object obj = ResourceManager.GetObject("B16x16_Find_Write", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Float_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Float_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Folder { - get { - object obj = ResourceManager.GetObject("B16x16_Folder", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Folder_Add { - get { - object obj = ResourceManager.GetObject("B16x16_Folder_Add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Function_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Function_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Gear { - get { - object obj = ResourceManager.GetObject("B16x16_Gear", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Help { - get { - object obj = ResourceManager.GetObject("B16x16_Help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Information { - get { - object obj = ResourceManager.GetObject("B16x16_Information", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Interface_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Interface_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Left_Button { - get { - object obj = ResourceManager.GetObject("B16x16_Left_Button", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Magnifier { - get { - object obj = ResourceManager.GetObject("B16x16_Magnifier", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Magnifier_Arrow { - get { - object obj = ResourceManager.GetObject("B16x16_Magnifier_Arrow", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Magnifier_Remove { - get { - object obj = ResourceManager.GetObject("B16x16_Magnifier_Remove", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Matrix_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Matrix_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Open_Icon { - get { - object obj = ResourceManager.GetObject("B16x16_Open_Icon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Code { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Code", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Code_Add { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Code_Add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Code_Cpp { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Code_Cpp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Code_Csharp { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Code_Csharp", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Copy { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Copy", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_Paste { - get { - object obj = ResourceManager.GetObject("B16x16_Page_Paste", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Page_White_Stack { - get { - object obj = ResourceManager.GetObject("B16x16_Page_White_Stack", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Pdb { - get { - object obj = ResourceManager.GetObject("B16x16_Pdb", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Plugin { - get { - object obj = ResourceManager.GetObject("B16x16_Plugin", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Pointer_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Pointer_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Quit { - get { - object obj = ResourceManager.GetObject("B16x16_Quit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Redo { - get { - object obj = ResourceManager.GetObject("B16x16_Redo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Right_Button { - get { - object obj = ResourceManager.GetObject("B16x16_Right_Button", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Save { - get { - object obj = ResourceManager.GetObject("B16x16_Save", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Save_As { - get { - object obj = ResourceManager.GetObject("B16x16_Save_As", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Settings_Edit { - get { - object obj = ResourceManager.GetObject("B16x16_Settings_Edit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Signed_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Signed_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Table_Gear { - get { - object obj = ResourceManager.GetObject("B16x16_Table_Gear", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Text_List_Bullets { - get { - object obj = ResourceManager.GetObject("B16x16_Text_List_Bullets", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Text_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Text_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Textfield_Rename { - get { - object obj = ResourceManager.GetObject("B16x16_Textfield_Rename", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Tree_Collapse { - get { - object obj = ResourceManager.GetObject("B16x16_Tree_Collapse", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Tree_Expand { - get { - object obj = ResourceManager.GetObject("B16x16_Tree_Expand", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Undo { - get { - object obj = ResourceManager.GetObject("B16x16_Undo", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Unsigned_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Unsigned_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Vector_Type { - get { - object obj = ResourceManager.GetObject("B16x16_Vector_Type", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B16x16_Warning { - get { - object obj = ResourceManager.GetObject("B16x16_Warning", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_3D_Glasses { - get { - object obj = ResourceManager.GetObject("B32x32_3D_Glasses", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Canvas_Size { - get { - object obj = ResourceManager.GetObject("B32x32_Canvas_Size", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Cogs { - get { - object obj = ResourceManager.GetObject("B32x32_Cogs", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Eye { - get { - object obj = ResourceManager.GetObject("B32x32_Eye", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Magnifier { - get { - object obj = ResourceManager.GetObject("B32x32_Magnifier", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Page_Code { - get { - object obj = ResourceManager.GetObject("B32x32_Page_Code", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap B32x32_Plugin { - get { - object obj = ResourceManager.GetObject("B32x32_Plugin", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/10/11 21:28:28 - /// ähnelt. - /// - internal static string BuildDate { - get { - return ResourceManager.GetString("BuildDate", resourceCulture); - } - } - - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). - /// - internal static System.Drawing.Icon ReClassNet { - get { - object obj = ResourceManager.GetObject("ReClassNet", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - } -} +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace ReClassNET.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ReClassNET.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Accept { + get { + object obj = ResourceManager.GetObject("B16x16_Accept", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Array_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Array_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Arrow_Refresh { + get { + object obj = ResourceManager.GetObject("B16x16_Arrow_Refresh", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_1024 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_1024", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_2048 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_2048", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_256 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_256", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_4 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_4096 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_4096", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_64 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_8 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_8", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Add_Bytes_X { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Add_Bytes_X", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Array { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Array", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Bits { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Bits", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Bool { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Bool", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Class_Add { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Class_Add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Class_Instance { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Class_Instance", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Class_Pointer { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Class_Pointer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Class_Remove { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Class_Remove", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Delete { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Double { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Double", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Drop_Down { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Drop_Down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Float { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Float", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Function { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Function", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Function_Pointer { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Function_Pointer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Hex_16 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Hex_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Hex_32 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Hex_32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Hex_64 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Hex_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Hex_8 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Hex_8", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_1024 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_1024", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_2048 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_2048", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_256 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_256", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_4 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_4096 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_4096", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_64 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_8 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_8", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Insert_Bytes_X { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Insert_Bytes_X", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Int_16 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Int_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Int_32 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Int_32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Int_64 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Int_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Int_8 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Int_8", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Matrix_3x3 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Matrix_3x3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Matrix_3x4 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Matrix_3x4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Matrix_4x4 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Matrix_4x4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Pointer_Array { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Pointer_Array", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Text { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Text", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Text_Pointer { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Text_Pointer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UInt_16 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UInt_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UInt_32 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UInt_32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UInt_64 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UInt_64", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UInt_8 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UInt_8", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UText { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UText", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_UText_Pointer { + get { + object obj = ResourceManager.GetObject("B16x16_Button_UText_Pointer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Vector_2 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Vector_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Vector_3 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Vector_3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Vector_4 { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Vector_4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_VTable { + get { + object obj = ResourceManager.GetObject("B16x16_Button_VTable", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Camera { + get { + object obj = ResourceManager.GetObject("B16x16_Camera", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Canvas_Size { + get { + object obj = ResourceManager.GetObject("B16x16_Canvas_Size", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Category { + get { + object obj = ResourceManager.GetObject("B16x16_Category", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Chart_Delete { + get { + object obj = ResourceManager.GetObject("B16x16_Chart_Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Class_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Class_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Closed_Icon { + get { + object obj = ResourceManager.GetObject("B16x16_Closed_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Cogs { + get { + object obj = ResourceManager.GetObject("B16x16_Cogs", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Color_Wheel { + get { + object obj = ResourceManager.GetObject("B16x16_Color_Wheel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Control_Pause { + get { + object obj = ResourceManager.GetObject("B16x16_Control_Pause", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Control_Play { + get { + object obj = ResourceManager.GetObject("B16x16_Control_Play", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Control_Stop { + get { + object obj = ResourceManager.GetObject("B16x16_Control_Stop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Custom_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Custom_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Double_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Double_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Drive_Go { + get { + object obj = ResourceManager.GetObject("B16x16_Drive_Go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Enum_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Enum_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Error { + get { + object obj = ResourceManager.GetObject("B16x16_Error", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Exchange_Button { + get { + object obj = ResourceManager.GetObject("B16x16_Exchange_Button", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Eye { + get { + object obj = ResourceManager.GetObject("B16x16_Eye", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Find_Access { + get { + object obj = ResourceManager.GetObject("B16x16_Find_Access", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Find_Write { + get { + object obj = ResourceManager.GetObject("B16x16_Find_Write", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Float_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Float_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Folder { + get { + object obj = ResourceManager.GetObject("B16x16_Folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Folder_Add { + get { + object obj = ResourceManager.GetObject("B16x16_Folder_Add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Function_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Function_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Gear { + get { + object obj = ResourceManager.GetObject("B16x16_Gear", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Help { + get { + object obj = ResourceManager.GetObject("B16x16_Help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Information { + get { + object obj = ResourceManager.GetObject("B16x16_Information", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Interface_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Interface_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Left_Button { + get { + object obj = ResourceManager.GetObject("B16x16_Left_Button", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Magnifier { + get { + object obj = ResourceManager.GetObject("B16x16_Magnifier", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Magnifier_Arrow { + get { + object obj = ResourceManager.GetObject("B16x16_Magnifier_Arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Magnifier_Remove { + get { + object obj = ResourceManager.GetObject("B16x16_Magnifier_Remove", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Matrix_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Matrix_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Open_Icon { + get { + object obj = ResourceManager.GetObject("B16x16_Open_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Code { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Code", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Code_Add { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Code_Add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Code_Cpp { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Code_Cpp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Code_Csharp { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Code_Csharp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Copy { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Copy", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_Paste { + get { + object obj = ResourceManager.GetObject("B16x16_Page_Paste", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Page_White_Stack { + get { + object obj = ResourceManager.GetObject("B16x16_Page_White_Stack", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Pdb { + get { + object obj = ResourceManager.GetObject("B16x16_Pdb", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Plugin { + get { + object obj = ResourceManager.GetObject("B16x16_Plugin", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Pointer_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Pointer_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Quit { + get { + object obj = ResourceManager.GetObject("B16x16_Quit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Redo { + get { + object obj = ResourceManager.GetObject("B16x16_Redo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Right_Button { + get { + object obj = ResourceManager.GetObject("B16x16_Right_Button", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Save { + get { + object obj = ResourceManager.GetObject("B16x16_Save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Save_As { + get { + object obj = ResourceManager.GetObject("B16x16_Save_As", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Settings_Edit { + get { + object obj = ResourceManager.GetObject("B16x16_Settings_Edit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Signed_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Signed_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Table_Gear { + get { + object obj = ResourceManager.GetObject("B16x16_Table_Gear", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Text_List_Bullets { + get { + object obj = ResourceManager.GetObject("B16x16_Text_List_Bullets", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Text_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Text_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Textfield_Rename { + get { + object obj = ResourceManager.GetObject("B16x16_Textfield_Rename", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Tree_Collapse { + get { + object obj = ResourceManager.GetObject("B16x16_Tree_Collapse", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Tree_Expand { + get { + object obj = ResourceManager.GetObject("B16x16_Tree_Expand", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Undo { + get { + object obj = ResourceManager.GetObject("B16x16_Undo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Unsigned_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Unsigned_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Vector_Type { + get { + object obj = ResourceManager.GetObject("B16x16_Vector_Type", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Warning { + get { + object obj = ResourceManager.GetObject("B16x16_Warning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_3D_Glasses { + get { + object obj = ResourceManager.GetObject("B32x32_3D_Glasses", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Canvas_Size { + get { + object obj = ResourceManager.GetObject("B32x32_Canvas_Size", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Cogs { + get { + object obj = ResourceManager.GetObject("B32x32_Cogs", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Eye { + get { + object obj = ResourceManager.GetObject("B32x32_Eye", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Magnifier { + get { + object obj = ResourceManager.GetObject("B32x32_Magnifier", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Page_Code { + get { + object obj = ResourceManager.GetObject("B32x32_Page_Code", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B32x32_Plugin { + get { + object obj = ResourceManager.GetObject("B32x32_Plugin", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die 2017/10/11 21:28:28 + /// ähnelt. + /// + internal static string BuildDate { + get { + return ResourceManager.GetString("BuildDate", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon ReClassNet { + get { + object obj = ResourceManager.GetObject("ReClassNet", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/ReClass.NET/Properties/Resources.resx similarity index 98% rename from Properties/Resources.resx rename to ReClass.NET/Properties/Resources.resx index ce8838dc..274ddc13 100644 --- a/Properties/Resources.resx +++ b/ReClass.NET/Properties/Resources.resx @@ -1,499 +1,499 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Images\B16x16_Tree_Collapse.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Plugin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Class_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Table_Gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Pointer_Array.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Enum_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Chart_Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_VTable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_4096.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Hex_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Plugin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_4096.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Settings_Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Closed_Icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Class_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Text_List_Bullets.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Code_Csharp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UText.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Interface_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Matrix_3x4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Folder_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Int_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UText_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_256.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Text_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Bits.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Pointer_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Double_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Array_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Custom_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UInt_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Code.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Arrow_Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Matrix_3x3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Code_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Hex_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Tree_Expand.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Int_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Page_Code.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Pdb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_2048.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Class_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Control_Play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Array.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Class_Instance.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Quit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Int_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Matrix_4x4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Camera.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Bool.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Control_Stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Class_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Cogs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Float_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Drive_Go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_2048.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Right_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UInt_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Textfield_Rename.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Magnifier_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Unsigned_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Text_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Vector_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Signed_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Function_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Hex_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Save_As.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Vector_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Open_Icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Left_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Icon\ReClassNet.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\BuildDate.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 - - - ..\Resources\Images\B16x16_Button_Add_Bytes_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_256.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UInt_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_1024.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_1024.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_Code_Cpp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Color_Wheel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Category.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Page_White_Stack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Insert_Bytes_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Vector_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Accept.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Function.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Vector_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Control_Pause.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Exchange_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Cogs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Drop_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_UInt_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Hex_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Int_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Float.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Function_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Double.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Matrix_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Button_Add_Bytes_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Find_Access.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Find_Write.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Magnifier_Arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_3D_Glasses.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B32x32_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Images\B16x16_Undo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Images\B16x16_Tree_Collapse.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Plugin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Class_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Table_Gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Pointer_Array.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Enum_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Chart_Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_VTable.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_4096.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Hex_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Plugin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_4096.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Settings_Edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Closed_Icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Class_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Text_List_Bullets.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Code_Csharp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UText.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Interface_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Matrix_3x4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Folder_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Int_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UText_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_256.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Text_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Bits.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Pointer_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Double_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Array_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Custom_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UInt_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Code.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Arrow_Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Matrix_3x3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Code_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Hex_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Tree_Expand.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Int_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Page_Code.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Pdb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_2048.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Class_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Control_Play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Array.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Class_Instance.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Quit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Int_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Matrix_4x4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Camera.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Bool.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Control_Stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Class_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Cogs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Float_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Drive_Go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_2048.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Right_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UInt_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Textfield_Rename.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Magnifier_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Unsigned_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Text_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Vector_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Signed_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Function_Pointer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Hex_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Save_As.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Vector_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Open_Icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Left_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icon\ReClassNet.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BuildDate.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + + + ..\Resources\Images\B16x16_Button_Add_Bytes_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_256.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UInt_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_1024.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_1024.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_Code_Cpp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Color_Wheel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Category.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Page_White_Stack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Insert_Bytes_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Vector_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Accept.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Function.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Vector_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Control_Pause.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Exchange_Button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Cogs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Drop_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_UInt_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Hex_64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Int_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Float.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Function_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Double.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Matrix_Type.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_Add_Bytes_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Find_Access.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Find_Write.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Magnifier_Arrow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_3D_Glasses.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Eye.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B32x32_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Canvas_Size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Redo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Undo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/ReClass.NET/Properties/Settings.Designer.cs similarity index 100% rename from Properties/Settings.Designer.cs rename to ReClass.NET/Properties/Settings.Designer.cs diff --git a/Properties/Settings.settings b/ReClass.NET/Properties/Settings.settings similarity index 100% rename from Properties/Settings.settings rename to ReClass.NET/Properties/Settings.settings diff --git a/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj similarity index 97% rename from ReClass.NET.csproj rename to ReClass.NET/ReClass.NET.csproj index f8d3dee7..5789fe3d 100644 --- a/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,939 +1,939 @@ - - - - - Debug - x86 - {BFB8917D-E9B4-463F-A6E8-612C35728C78} - WinExe - Properties - ReClassNET - ReClass.NET - v4.6.1 - 512 - true - - - 0 - - - x86 - true - full - false - bin\x86\Debug\ - TRACE;DEBUG;RECLASSNET32 - prompt - 4 - false - False - False - True - False - False - False - True - True - True - True - True - True - True - True - False - True - False - True - False - False - False - False - True - False - True - True - True - False - False - - - - - - - - True - False - False - True - Full - %28none%29 - 3 - - - x86 - pdbonly - true - bin\x86\Release\ - TRACE;RECLASSNET32;RELEASE - prompt - 4 - - - x64 - true - full - false - bin\x64\Debug\ - TRACE;DEBUG;RECLASSNET64 - prompt - 4 - false - - - x64 - pdbonly - true - bin\x64\Release\ - TRACE;RECLASSNET64;RELEASE - prompt - 4 - - - Resources\Icon\ReClassNet.ico - - - - False - Dependencies\ColorCode.dll - - - Dependencies\Dia2Lib.dll - True - - - False - Dependencies\Microsoft.ExceptionMessageBox.dll - - - - - packages\System.Data.SQLite.Core.1.0.105.2\lib\net46\System.Data.SQLite.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - FoundCodeForm.cs - - - Form - - - InputBytesForm.cs - - - - Form - - - InputCorrelatorForm.cs - - - Form - - - ScannerForm.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Component - - - True - True - Resources.resx - - - - - - - - - - - Form - - - AboutForm.cs - - - - - - UserControl - - - ClassNodeView.cs - - - Form - - - CodeForm.cs - - - UserControl - - - ColorBox.cs - - - Component - - - Form - - - Form - - - LogForm.cs - - - UserControl - - - DualValueBox.cs - - - - UserControl - - - HotkeyBox.cs - - - Component - - - - - Component - - - UserControl - - - MemoryRecordList.cs - - - MemoryViewControl.cs - - - - - - - - - - - - - - - - - - Form - - - PluginForm.cs - - - Form - - - SettingsForm.cs - - - - - - Component - - - - Form - - - MainForm.cs - - - - - - - - - - - - UserControl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - ProcessBrowserForm.cs - - - Form - - - ProcessInfoForm.cs - - - - - - - - - - - - - - UserControl - - - - - - - - Component - - - Component - - - - - - - - - - - - - - AboutForm.cs - - - CodeForm.cs - - - FoundCodeForm.cs - - - InputBytesForm.cs - - - InputCorrelatorForm.cs - - - ScannerForm.cs - - - ClassNodeView.cs - Designer - - - LogForm.cs - - - MainForm.cs - Designer - - - ColorBox.cs - - - DualValueBox.cs - - - HotkeyBox.cs - - - MemoryRecordList.cs - - - MemoryViewControl.cs - - - PluginForm.cs - - - ProcessBrowserForm.cs - - - ProcessInfoForm.cs - - - SettingsForm.cs - - - ResXFileCodeGenerator - Designer - Resources.Designer.cs - - - - Designer - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" - - - - - Missing file: "{0}". - - - - + + + + + Debug + x86 + {BFB8917D-E9B4-463F-A6E8-612C35728C78} + WinExe + Properties + ReClassNET + ReClass.NET + v4.6.1 + 512 + true + + + 0 + + + x86 + true + full + false + bin\x86\Debug\ + TRACE;DEBUG;RECLASSNET32 + prompt + 4 + false + False + False + True + False + False + False + True + True + True + True + True + True + True + True + False + True + False + True + False + False + False + False + True + False + True + True + True + False + False + + + + + + + + True + False + False + True + Full + %28none%29 + 3 + + + x86 + pdbonly + true + bin\x86\Release\ + TRACE;RECLASSNET32;RELEASE + prompt + 4 + + + x64 + true + full + false + bin\x64\Debug\ + TRACE;DEBUG;RECLASSNET64 + prompt + 4 + false + + + x64 + pdbonly + true + bin\x64\Release\ + TRACE;RECLASSNET64;RELEASE + prompt + 4 + + + Resources\Icon\ReClassNet.ico + + + + False + Dependencies\ColorCode.dll + + + Dependencies\Dia2Lib.dll + True + + + False + Dependencies\Microsoft.ExceptionMessageBox.dll + + + + + packages\System.Data.SQLite.Core.1.0.105.2\lib\net46\System.Data.SQLite.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + FoundCodeForm.cs + + + Form + + + InputBytesForm.cs + + + + Form + + + InputCorrelatorForm.cs + + + Form + + + ScannerForm.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + True + True + Resources.resx + + + + + + + + + + + Form + + + AboutForm.cs + + + + + + UserControl + + + ClassNodeView.cs + + + Form + + + CodeForm.cs + + + UserControl + + + ColorBox.cs + + + Component + + + Form + + + Form + + + LogForm.cs + + + UserControl + + + DualValueBox.cs + + + + UserControl + + + HotkeyBox.cs + + + Component + + + + + Component + + + UserControl + + + MemoryRecordList.cs + + + MemoryViewControl.cs + + + + + + + + + + + + + + + + + + Form + + + PluginForm.cs + + + Form + + + SettingsForm.cs + + + + + + Component + + + + Form + + + MainForm.cs + + + + + + + + + + + + UserControl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + ProcessBrowserForm.cs + + + Form + + + ProcessInfoForm.cs + + + + + + + + + + + + + + UserControl + + + + + + + + Component + + + Component + + + + + + + + + + + + + + AboutForm.cs + + + CodeForm.cs + + + FoundCodeForm.cs + + + InputBytesForm.cs + + + InputCorrelatorForm.cs + + + ScannerForm.cs + + + ClassNodeView.cs + Designer + + + LogForm.cs + + + MainForm.cs + Designer + + + ColorBox.cs + + + DualValueBox.cs + + + HotkeyBox.cs + + + MemoryRecordList.cs + + + MemoryViewControl.cs + + + PluginForm.cs + + + ProcessBrowserForm.cs + + + ProcessInfoForm.cs + + + SettingsForm.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" + + + + + Missing file: "{0}". + + + + \ No newline at end of file diff --git a/ReClassNetProject.cs b/ReClass.NET/ReClassNetProject.cs similarity index 100% rename from ReClassNetProject.cs rename to ReClass.NET/ReClassNetProject.cs diff --git a/ReClass.NET/Resources/BuildDate.txt b/ReClass.NET/Resources/BuildDate.txt new file mode 100644 index 0000000000000000000000000000000000000000..92b8bc30a136f7885edcbe585748a93a1ac1ef42 GIT binary patch literal 44 qcmezW&xpZ*!H~h6K_5sOfJt)(1t8m!!HU6@!5Byy17&#`xEKJhk_FZP literal 0 HcmV?d00001 diff --git a/Resources/Icon/ReClassNet.ico b/ReClass.NET/Resources/Icon/ReClassNet.ico similarity index 100% rename from Resources/Icon/ReClassNet.ico rename to ReClass.NET/Resources/Icon/ReClassNet.ico diff --git a/Resources/Icon/icon.pdn b/ReClass.NET/Resources/Icon/icon.pdn similarity index 100% rename from Resources/Icon/icon.pdn rename to ReClass.NET/Resources/Icon/icon.pdn diff --git a/Resources/Icon/icon_128.png b/ReClass.NET/Resources/Icon/icon_128.png similarity index 100% rename from Resources/Icon/icon_128.png rename to ReClass.NET/Resources/Icon/icon_128.png diff --git a/Resources/Icon/icon_16.png b/ReClass.NET/Resources/Icon/icon_16.png similarity index 100% rename from Resources/Icon/icon_16.png rename to ReClass.NET/Resources/Icon/icon_16.png diff --git a/Resources/Icon/icon_256.png b/ReClass.NET/Resources/Icon/icon_256.png similarity index 100% rename from Resources/Icon/icon_256.png rename to ReClass.NET/Resources/Icon/icon_256.png diff --git a/Resources/Icon/icon_32.png b/ReClass.NET/Resources/Icon/icon_32.png similarity index 100% rename from Resources/Icon/icon_32.png rename to ReClass.NET/Resources/Icon/icon_32.png diff --git a/Resources/Icon/icon_48.png b/ReClass.NET/Resources/Icon/icon_48.png similarity index 100% rename from Resources/Icon/icon_48.png rename to ReClass.NET/Resources/Icon/icon_48.png diff --git a/Resources/Icon/icon_64.png b/ReClass.NET/Resources/Icon/icon_64.png similarity index 100% rename from Resources/Icon/icon_64.png rename to ReClass.NET/Resources/Icon/icon_64.png diff --git a/Resources/Icon/icon_96.png b/ReClass.NET/Resources/Icon/icon_96.png similarity index 100% rename from Resources/Icon/icon_96.png rename to ReClass.NET/Resources/Icon/icon_96.png diff --git a/Resources/Images/B16x16_Accept.png b/ReClass.NET/Resources/Images/B16x16_Accept.png similarity index 100% rename from Resources/Images/B16x16_Accept.png rename to ReClass.NET/Resources/Images/B16x16_Accept.png diff --git a/Resources/Images/B16x16_Array_Type.png b/ReClass.NET/Resources/Images/B16x16_Array_Type.png similarity index 100% rename from Resources/Images/B16x16_Array_Type.png rename to ReClass.NET/Resources/Images/B16x16_Array_Type.png diff --git a/Resources/Images/B16x16_Arrow_Refresh.png b/ReClass.NET/Resources/Images/B16x16_Arrow_Refresh.png similarity index 100% rename from Resources/Images/B16x16_Arrow_Refresh.png rename to ReClass.NET/Resources/Images/B16x16_Arrow_Refresh.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_1024.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_1024.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_1024.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_1024.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_2048.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_2048.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_2048.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_2048.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_256.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_256.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_256.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_256.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_4.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_4.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_4.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_4.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_4096.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_4096.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_4096.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_4096.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_64.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_64.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_64.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_64.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_8.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_8.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_8.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_8.png diff --git a/Resources/Images/B16x16_Button_Add_Bytes_X.png b/ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_X.png similarity index 100% rename from Resources/Images/B16x16_Button_Add_Bytes_X.png rename to ReClass.NET/Resources/Images/B16x16_Button_Add_Bytes_X.png diff --git a/Resources/Images/B16x16_Button_Array.png b/ReClass.NET/Resources/Images/B16x16_Button_Array.png similarity index 100% rename from Resources/Images/B16x16_Button_Array.png rename to ReClass.NET/Resources/Images/B16x16_Button_Array.png diff --git a/Resources/Images/B16x16_Button_Bits.png b/ReClass.NET/Resources/Images/B16x16_Button_Bits.png similarity index 100% rename from Resources/Images/B16x16_Button_Bits.png rename to ReClass.NET/Resources/Images/B16x16_Button_Bits.png diff --git a/Resources/Images/B16x16_Button_Bool.png b/ReClass.NET/Resources/Images/B16x16_Button_Bool.png similarity index 100% rename from Resources/Images/B16x16_Button_Bool.png rename to ReClass.NET/Resources/Images/B16x16_Button_Bool.png diff --git a/Resources/Images/B16x16_Button_Class_Add.png b/ReClass.NET/Resources/Images/B16x16_Button_Class_Add.png similarity index 100% rename from Resources/Images/B16x16_Button_Class_Add.png rename to ReClass.NET/Resources/Images/B16x16_Button_Class_Add.png diff --git a/Resources/Images/B16x16_Button_Class_Instance.png b/ReClass.NET/Resources/Images/B16x16_Button_Class_Instance.png similarity index 100% rename from Resources/Images/B16x16_Button_Class_Instance.png rename to ReClass.NET/Resources/Images/B16x16_Button_Class_Instance.png diff --git a/Resources/Images/B16x16_Button_Class_Pointer.png b/ReClass.NET/Resources/Images/B16x16_Button_Class_Pointer.png similarity index 100% rename from Resources/Images/B16x16_Button_Class_Pointer.png rename to ReClass.NET/Resources/Images/B16x16_Button_Class_Pointer.png diff --git a/Resources/Images/B16x16_Button_Class_Remove.png b/ReClass.NET/Resources/Images/B16x16_Button_Class_Remove.png similarity index 100% rename from Resources/Images/B16x16_Button_Class_Remove.png rename to ReClass.NET/Resources/Images/B16x16_Button_Class_Remove.png diff --git a/Resources/Images/B16x16_Button_Delete.png b/ReClass.NET/Resources/Images/B16x16_Button_Delete.png similarity index 100% rename from Resources/Images/B16x16_Button_Delete.png rename to ReClass.NET/Resources/Images/B16x16_Button_Delete.png diff --git a/Resources/Images/B16x16_Button_Double.png b/ReClass.NET/Resources/Images/B16x16_Button_Double.png similarity index 100% rename from Resources/Images/B16x16_Button_Double.png rename to ReClass.NET/Resources/Images/B16x16_Button_Double.png diff --git a/Resources/Images/B16x16_Button_Drop_Down.png b/ReClass.NET/Resources/Images/B16x16_Button_Drop_Down.png similarity index 100% rename from Resources/Images/B16x16_Button_Drop_Down.png rename to ReClass.NET/Resources/Images/B16x16_Button_Drop_Down.png diff --git a/Resources/Images/B16x16_Button_Float.png b/ReClass.NET/Resources/Images/B16x16_Button_Float.png similarity index 100% rename from Resources/Images/B16x16_Button_Float.png rename to ReClass.NET/Resources/Images/B16x16_Button_Float.png diff --git a/Resources/Images/B16x16_Button_Function.png b/ReClass.NET/Resources/Images/B16x16_Button_Function.png similarity index 100% rename from Resources/Images/B16x16_Button_Function.png rename to ReClass.NET/Resources/Images/B16x16_Button_Function.png diff --git a/Resources/Images/B16x16_Button_Function_Pointer.png b/ReClass.NET/Resources/Images/B16x16_Button_Function_Pointer.png similarity index 100% rename from Resources/Images/B16x16_Button_Function_Pointer.png rename to ReClass.NET/Resources/Images/B16x16_Button_Function_Pointer.png diff --git a/Resources/Images/B16x16_Button_Hex_16.png b/ReClass.NET/Resources/Images/B16x16_Button_Hex_16.png similarity index 100% rename from Resources/Images/B16x16_Button_Hex_16.png rename to ReClass.NET/Resources/Images/B16x16_Button_Hex_16.png diff --git a/Resources/Images/B16x16_Button_Hex_32.png b/ReClass.NET/Resources/Images/B16x16_Button_Hex_32.png similarity index 100% rename from Resources/Images/B16x16_Button_Hex_32.png rename to ReClass.NET/Resources/Images/B16x16_Button_Hex_32.png diff --git a/Resources/Images/B16x16_Button_Hex_64.png b/ReClass.NET/Resources/Images/B16x16_Button_Hex_64.png similarity index 100% rename from Resources/Images/B16x16_Button_Hex_64.png rename to ReClass.NET/Resources/Images/B16x16_Button_Hex_64.png diff --git a/Resources/Images/B16x16_Button_Hex_8.png b/ReClass.NET/Resources/Images/B16x16_Button_Hex_8.png similarity index 100% rename from Resources/Images/B16x16_Button_Hex_8.png rename to ReClass.NET/Resources/Images/B16x16_Button_Hex_8.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_1024.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_1024.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_1024.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_1024.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_2048.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_2048.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_2048.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_2048.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_256.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_256.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_256.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_256.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_4.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_4.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_4.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_4.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_4096.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_4096.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_4096.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_4096.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_64.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_64.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_64.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_64.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_8.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_8.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_8.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_8.png diff --git a/Resources/Images/B16x16_Button_Insert_Bytes_X.png b/ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_X.png similarity index 100% rename from Resources/Images/B16x16_Button_Insert_Bytes_X.png rename to ReClass.NET/Resources/Images/B16x16_Button_Insert_Bytes_X.png diff --git a/Resources/Images/B16x16_Button_Int_16.png b/ReClass.NET/Resources/Images/B16x16_Button_Int_16.png similarity index 100% rename from Resources/Images/B16x16_Button_Int_16.png rename to ReClass.NET/Resources/Images/B16x16_Button_Int_16.png diff --git a/Resources/Images/B16x16_Button_Int_32.png b/ReClass.NET/Resources/Images/B16x16_Button_Int_32.png similarity index 100% rename from Resources/Images/B16x16_Button_Int_32.png rename to ReClass.NET/Resources/Images/B16x16_Button_Int_32.png diff --git a/Resources/Images/B16x16_Button_Int_64.png b/ReClass.NET/Resources/Images/B16x16_Button_Int_64.png similarity index 100% rename from Resources/Images/B16x16_Button_Int_64.png rename to ReClass.NET/Resources/Images/B16x16_Button_Int_64.png diff --git a/Resources/Images/B16x16_Button_Int_8.png b/ReClass.NET/Resources/Images/B16x16_Button_Int_8.png similarity index 100% rename from Resources/Images/B16x16_Button_Int_8.png rename to ReClass.NET/Resources/Images/B16x16_Button_Int_8.png diff --git a/Resources/Images/B16x16_Button_Matrix_3x3.png b/ReClass.NET/Resources/Images/B16x16_Button_Matrix_3x3.png similarity index 100% rename from Resources/Images/B16x16_Button_Matrix_3x3.png rename to ReClass.NET/Resources/Images/B16x16_Button_Matrix_3x3.png diff --git a/Resources/Images/B16x16_Button_Matrix_3x4.png b/ReClass.NET/Resources/Images/B16x16_Button_Matrix_3x4.png similarity index 100% rename from Resources/Images/B16x16_Button_Matrix_3x4.png rename to ReClass.NET/Resources/Images/B16x16_Button_Matrix_3x4.png diff --git a/Resources/Images/B16x16_Button_Matrix_4x4.png b/ReClass.NET/Resources/Images/B16x16_Button_Matrix_4x4.png similarity index 100% rename from Resources/Images/B16x16_Button_Matrix_4x4.png rename to ReClass.NET/Resources/Images/B16x16_Button_Matrix_4x4.png diff --git a/Resources/Images/B16x16_Button_Pointer_Array.png b/ReClass.NET/Resources/Images/B16x16_Button_Pointer_Array.png similarity index 100% rename from Resources/Images/B16x16_Button_Pointer_Array.png rename to ReClass.NET/Resources/Images/B16x16_Button_Pointer_Array.png diff --git a/Resources/Images/B16x16_Button_Text.png b/ReClass.NET/Resources/Images/B16x16_Button_Text.png similarity index 100% rename from Resources/Images/B16x16_Button_Text.png rename to ReClass.NET/Resources/Images/B16x16_Button_Text.png diff --git a/Resources/Images/B16x16_Button_Text_Pointer.png b/ReClass.NET/Resources/Images/B16x16_Button_Text_Pointer.png similarity index 100% rename from Resources/Images/B16x16_Button_Text_Pointer.png rename to ReClass.NET/Resources/Images/B16x16_Button_Text_Pointer.png diff --git a/Resources/Images/B16x16_Button_UInt_16.png b/ReClass.NET/Resources/Images/B16x16_Button_UInt_16.png similarity index 100% rename from Resources/Images/B16x16_Button_UInt_16.png rename to ReClass.NET/Resources/Images/B16x16_Button_UInt_16.png diff --git a/Resources/Images/B16x16_Button_UInt_32.png b/ReClass.NET/Resources/Images/B16x16_Button_UInt_32.png similarity index 100% rename from Resources/Images/B16x16_Button_UInt_32.png rename to ReClass.NET/Resources/Images/B16x16_Button_UInt_32.png diff --git a/Resources/Images/B16x16_Button_UInt_64.png b/ReClass.NET/Resources/Images/B16x16_Button_UInt_64.png similarity index 100% rename from Resources/Images/B16x16_Button_UInt_64.png rename to ReClass.NET/Resources/Images/B16x16_Button_UInt_64.png diff --git a/Resources/Images/B16x16_Button_UInt_8.png b/ReClass.NET/Resources/Images/B16x16_Button_UInt_8.png similarity index 100% rename from Resources/Images/B16x16_Button_UInt_8.png rename to ReClass.NET/Resources/Images/B16x16_Button_UInt_8.png diff --git a/Resources/Images/B16x16_Button_UText.png b/ReClass.NET/Resources/Images/B16x16_Button_UText.png similarity index 100% rename from Resources/Images/B16x16_Button_UText.png rename to ReClass.NET/Resources/Images/B16x16_Button_UText.png diff --git a/Resources/Images/B16x16_Button_UText_Pointer.png b/ReClass.NET/Resources/Images/B16x16_Button_UText_Pointer.png similarity index 100% rename from Resources/Images/B16x16_Button_UText_Pointer.png rename to ReClass.NET/Resources/Images/B16x16_Button_UText_Pointer.png diff --git a/Resources/Images/B16x16_Button_VTable.png b/ReClass.NET/Resources/Images/B16x16_Button_VTable.png similarity index 100% rename from Resources/Images/B16x16_Button_VTable.png rename to ReClass.NET/Resources/Images/B16x16_Button_VTable.png diff --git a/Resources/Images/B16x16_Button_Vector_2.png b/ReClass.NET/Resources/Images/B16x16_Button_Vector_2.png similarity index 100% rename from Resources/Images/B16x16_Button_Vector_2.png rename to ReClass.NET/Resources/Images/B16x16_Button_Vector_2.png diff --git a/Resources/Images/B16x16_Button_Vector_3.png b/ReClass.NET/Resources/Images/B16x16_Button_Vector_3.png similarity index 100% rename from Resources/Images/B16x16_Button_Vector_3.png rename to ReClass.NET/Resources/Images/B16x16_Button_Vector_3.png diff --git a/Resources/Images/B16x16_Button_Vector_4.png b/ReClass.NET/Resources/Images/B16x16_Button_Vector_4.png similarity index 100% rename from Resources/Images/B16x16_Button_Vector_4.png rename to ReClass.NET/Resources/Images/B16x16_Button_Vector_4.png diff --git a/Resources/Images/B16x16_Camera.png b/ReClass.NET/Resources/Images/B16x16_Camera.png similarity index 100% rename from Resources/Images/B16x16_Camera.png rename to ReClass.NET/Resources/Images/B16x16_Camera.png diff --git a/Resources/Images/B16x16_Canvas_Size.png b/ReClass.NET/Resources/Images/B16x16_Canvas_Size.png similarity index 100% rename from Resources/Images/B16x16_Canvas_Size.png rename to ReClass.NET/Resources/Images/B16x16_Canvas_Size.png diff --git a/Resources/Images/B16x16_Category.png b/ReClass.NET/Resources/Images/B16x16_Category.png similarity index 100% rename from Resources/Images/B16x16_Category.png rename to ReClass.NET/Resources/Images/B16x16_Category.png diff --git a/Resources/Images/B16x16_Chart_Delete.png b/ReClass.NET/Resources/Images/B16x16_Chart_Delete.png similarity index 100% rename from Resources/Images/B16x16_Chart_Delete.png rename to ReClass.NET/Resources/Images/B16x16_Chart_Delete.png diff --git a/Resources/Images/B16x16_Class_Type.png b/ReClass.NET/Resources/Images/B16x16_Class_Type.png similarity index 100% rename from Resources/Images/B16x16_Class_Type.png rename to ReClass.NET/Resources/Images/B16x16_Class_Type.png diff --git a/Resources/Images/B16x16_Closed_Icon.png b/ReClass.NET/Resources/Images/B16x16_Closed_Icon.png similarity index 100% rename from Resources/Images/B16x16_Closed_Icon.png rename to ReClass.NET/Resources/Images/B16x16_Closed_Icon.png diff --git a/Resources/Images/B16x16_Cogs.png b/ReClass.NET/Resources/Images/B16x16_Cogs.png similarity index 100% rename from Resources/Images/B16x16_Cogs.png rename to ReClass.NET/Resources/Images/B16x16_Cogs.png diff --git a/Resources/Images/B16x16_Color_Wheel.png b/ReClass.NET/Resources/Images/B16x16_Color_Wheel.png similarity index 100% rename from Resources/Images/B16x16_Color_Wheel.png rename to ReClass.NET/Resources/Images/B16x16_Color_Wheel.png diff --git a/Resources/Images/B16x16_Control_Pause.png b/ReClass.NET/Resources/Images/B16x16_Control_Pause.png similarity index 100% rename from Resources/Images/B16x16_Control_Pause.png rename to ReClass.NET/Resources/Images/B16x16_Control_Pause.png diff --git a/Resources/Images/B16x16_Control_Play.png b/ReClass.NET/Resources/Images/B16x16_Control_Play.png similarity index 100% rename from Resources/Images/B16x16_Control_Play.png rename to ReClass.NET/Resources/Images/B16x16_Control_Play.png diff --git a/Resources/Images/B16x16_Control_Stop.png b/ReClass.NET/Resources/Images/B16x16_Control_Stop.png similarity index 100% rename from Resources/Images/B16x16_Control_Stop.png rename to ReClass.NET/Resources/Images/B16x16_Control_Stop.png diff --git a/Resources/Images/B16x16_Custom_Type.png b/ReClass.NET/Resources/Images/B16x16_Custom_Type.png similarity index 100% rename from Resources/Images/B16x16_Custom_Type.png rename to ReClass.NET/Resources/Images/B16x16_Custom_Type.png diff --git a/Resources/Images/B16x16_Double_Type.png b/ReClass.NET/Resources/Images/B16x16_Double_Type.png similarity index 100% rename from Resources/Images/B16x16_Double_Type.png rename to ReClass.NET/Resources/Images/B16x16_Double_Type.png diff --git a/Resources/Images/B16x16_Drive_Go.png b/ReClass.NET/Resources/Images/B16x16_Drive_Go.png similarity index 100% rename from Resources/Images/B16x16_Drive_Go.png rename to ReClass.NET/Resources/Images/B16x16_Drive_Go.png diff --git a/Resources/Images/B16x16_Enum_Type.png b/ReClass.NET/Resources/Images/B16x16_Enum_Type.png similarity index 100% rename from Resources/Images/B16x16_Enum_Type.png rename to ReClass.NET/Resources/Images/B16x16_Enum_Type.png diff --git a/Resources/Images/B16x16_Error.png b/ReClass.NET/Resources/Images/B16x16_Error.png similarity index 100% rename from Resources/Images/B16x16_Error.png rename to ReClass.NET/Resources/Images/B16x16_Error.png diff --git a/Resources/Images/B16x16_Exchange_Button.png b/ReClass.NET/Resources/Images/B16x16_Exchange_Button.png similarity index 100% rename from Resources/Images/B16x16_Exchange_Button.png rename to ReClass.NET/Resources/Images/B16x16_Exchange_Button.png diff --git a/Resources/Images/B16x16_Eye.png b/ReClass.NET/Resources/Images/B16x16_Eye.png similarity index 100% rename from Resources/Images/B16x16_Eye.png rename to ReClass.NET/Resources/Images/B16x16_Eye.png diff --git a/Resources/Images/B16x16_Find_Access.png b/ReClass.NET/Resources/Images/B16x16_Find_Access.png similarity index 100% rename from Resources/Images/B16x16_Find_Access.png rename to ReClass.NET/Resources/Images/B16x16_Find_Access.png diff --git a/Resources/Images/B16x16_Find_Write.png b/ReClass.NET/Resources/Images/B16x16_Find_Write.png similarity index 100% rename from Resources/Images/B16x16_Find_Write.png rename to ReClass.NET/Resources/Images/B16x16_Find_Write.png diff --git a/Resources/Images/B16x16_Float_Type.png b/ReClass.NET/Resources/Images/B16x16_Float_Type.png similarity index 100% rename from Resources/Images/B16x16_Float_Type.png rename to ReClass.NET/Resources/Images/B16x16_Float_Type.png diff --git a/Resources/Images/B16x16_Folder.png b/ReClass.NET/Resources/Images/B16x16_Folder.png similarity index 100% rename from Resources/Images/B16x16_Folder.png rename to ReClass.NET/Resources/Images/B16x16_Folder.png diff --git a/Resources/Images/B16x16_Folder_Add.png b/ReClass.NET/Resources/Images/B16x16_Folder_Add.png similarity index 100% rename from Resources/Images/B16x16_Folder_Add.png rename to ReClass.NET/Resources/Images/B16x16_Folder_Add.png diff --git a/Resources/Images/B16x16_Function_Type.png b/ReClass.NET/Resources/Images/B16x16_Function_Type.png similarity index 100% rename from Resources/Images/B16x16_Function_Type.png rename to ReClass.NET/Resources/Images/B16x16_Function_Type.png diff --git a/Resources/Images/B16x16_Gear.png b/ReClass.NET/Resources/Images/B16x16_Gear.png similarity index 100% rename from Resources/Images/B16x16_Gear.png rename to ReClass.NET/Resources/Images/B16x16_Gear.png diff --git a/Resources/Images/B16x16_Help.png b/ReClass.NET/Resources/Images/B16x16_Help.png similarity index 100% rename from Resources/Images/B16x16_Help.png rename to ReClass.NET/Resources/Images/B16x16_Help.png diff --git a/Resources/Images/B16x16_Information.png b/ReClass.NET/Resources/Images/B16x16_Information.png similarity index 100% rename from Resources/Images/B16x16_Information.png rename to ReClass.NET/Resources/Images/B16x16_Information.png diff --git a/Resources/Images/B16x16_Interface_Type.png b/ReClass.NET/Resources/Images/B16x16_Interface_Type.png similarity index 100% rename from Resources/Images/B16x16_Interface_Type.png rename to ReClass.NET/Resources/Images/B16x16_Interface_Type.png diff --git a/Resources/Images/B16x16_Left_Button.png b/ReClass.NET/Resources/Images/B16x16_Left_Button.png similarity index 100% rename from Resources/Images/B16x16_Left_Button.png rename to ReClass.NET/Resources/Images/B16x16_Left_Button.png diff --git a/Resources/Images/B16x16_Magnifier.png b/ReClass.NET/Resources/Images/B16x16_Magnifier.png similarity index 100% rename from Resources/Images/B16x16_Magnifier.png rename to ReClass.NET/Resources/Images/B16x16_Magnifier.png diff --git a/Resources/Images/B16x16_Magnifier_Arrow.png b/ReClass.NET/Resources/Images/B16x16_Magnifier_Arrow.png similarity index 100% rename from Resources/Images/B16x16_Magnifier_Arrow.png rename to ReClass.NET/Resources/Images/B16x16_Magnifier_Arrow.png diff --git a/Resources/Images/B16x16_Magnifier_Remove.png b/ReClass.NET/Resources/Images/B16x16_Magnifier_Remove.png similarity index 100% rename from Resources/Images/B16x16_Magnifier_Remove.png rename to ReClass.NET/Resources/Images/B16x16_Magnifier_Remove.png diff --git a/Resources/Images/B16x16_Matrix_Type.png b/ReClass.NET/Resources/Images/B16x16_Matrix_Type.png similarity index 100% rename from Resources/Images/B16x16_Matrix_Type.png rename to ReClass.NET/Resources/Images/B16x16_Matrix_Type.png diff --git a/Resources/Images/B16x16_Open_Icon.png b/ReClass.NET/Resources/Images/B16x16_Open_Icon.png similarity index 100% rename from Resources/Images/B16x16_Open_Icon.png rename to ReClass.NET/Resources/Images/B16x16_Open_Icon.png diff --git a/Resources/Images/B16x16_Page_Code.png b/ReClass.NET/Resources/Images/B16x16_Page_Code.png similarity index 100% rename from Resources/Images/B16x16_Page_Code.png rename to ReClass.NET/Resources/Images/B16x16_Page_Code.png diff --git a/Resources/Images/B16x16_Page_Code_Add.png b/ReClass.NET/Resources/Images/B16x16_Page_Code_Add.png similarity index 100% rename from Resources/Images/B16x16_Page_Code_Add.png rename to ReClass.NET/Resources/Images/B16x16_Page_Code_Add.png diff --git a/Resources/Images/B16x16_Page_Code_Cpp.png b/ReClass.NET/Resources/Images/B16x16_Page_Code_Cpp.png similarity index 100% rename from Resources/Images/B16x16_Page_Code_Cpp.png rename to ReClass.NET/Resources/Images/B16x16_Page_Code_Cpp.png diff --git a/Resources/Images/B16x16_Page_Code_Csharp.png b/ReClass.NET/Resources/Images/B16x16_Page_Code_Csharp.png similarity index 100% rename from Resources/Images/B16x16_Page_Code_Csharp.png rename to ReClass.NET/Resources/Images/B16x16_Page_Code_Csharp.png diff --git a/Resources/Images/B16x16_Page_Copy.png b/ReClass.NET/Resources/Images/B16x16_Page_Copy.png similarity index 100% rename from Resources/Images/B16x16_Page_Copy.png rename to ReClass.NET/Resources/Images/B16x16_Page_Copy.png diff --git a/Resources/Images/B16x16_Page_Paste.png b/ReClass.NET/Resources/Images/B16x16_Page_Paste.png similarity index 100% rename from Resources/Images/B16x16_Page_Paste.png rename to ReClass.NET/Resources/Images/B16x16_Page_Paste.png diff --git a/Resources/Images/B16x16_Page_White_Stack.png b/ReClass.NET/Resources/Images/B16x16_Page_White_Stack.png similarity index 100% rename from Resources/Images/B16x16_Page_White_Stack.png rename to ReClass.NET/Resources/Images/B16x16_Page_White_Stack.png diff --git a/Resources/Images/B16x16_Pdb.png b/ReClass.NET/Resources/Images/B16x16_Pdb.png similarity index 100% rename from Resources/Images/B16x16_Pdb.png rename to ReClass.NET/Resources/Images/B16x16_Pdb.png diff --git a/Resources/Images/B16x16_Plugin.png b/ReClass.NET/Resources/Images/B16x16_Plugin.png similarity index 100% rename from Resources/Images/B16x16_Plugin.png rename to ReClass.NET/Resources/Images/B16x16_Plugin.png diff --git a/Resources/Images/B16x16_Pointer_Type.png b/ReClass.NET/Resources/Images/B16x16_Pointer_Type.png similarity index 100% rename from Resources/Images/B16x16_Pointer_Type.png rename to ReClass.NET/Resources/Images/B16x16_Pointer_Type.png diff --git a/Resources/Images/B16x16_Quit.png b/ReClass.NET/Resources/Images/B16x16_Quit.png similarity index 100% rename from Resources/Images/B16x16_Quit.png rename to ReClass.NET/Resources/Images/B16x16_Quit.png diff --git a/Resources/Images/B16x16_Redo.png b/ReClass.NET/Resources/Images/B16x16_Redo.png similarity index 100% rename from Resources/Images/B16x16_Redo.png rename to ReClass.NET/Resources/Images/B16x16_Redo.png diff --git a/Resources/Images/B16x16_Right_Button.png b/ReClass.NET/Resources/Images/B16x16_Right_Button.png similarity index 100% rename from Resources/Images/B16x16_Right_Button.png rename to ReClass.NET/Resources/Images/B16x16_Right_Button.png diff --git a/Resources/Images/B16x16_Save.png b/ReClass.NET/Resources/Images/B16x16_Save.png similarity index 100% rename from Resources/Images/B16x16_Save.png rename to ReClass.NET/Resources/Images/B16x16_Save.png diff --git a/Resources/Images/B16x16_Save_As.png b/ReClass.NET/Resources/Images/B16x16_Save_As.png similarity index 100% rename from Resources/Images/B16x16_Save_As.png rename to ReClass.NET/Resources/Images/B16x16_Save_As.png diff --git a/Resources/Images/B16x16_Settings_Edit.png b/ReClass.NET/Resources/Images/B16x16_Settings_Edit.png similarity index 100% rename from Resources/Images/B16x16_Settings_Edit.png rename to ReClass.NET/Resources/Images/B16x16_Settings_Edit.png diff --git a/Resources/Images/B16x16_Signed_Type.png b/ReClass.NET/Resources/Images/B16x16_Signed_Type.png similarity index 100% rename from Resources/Images/B16x16_Signed_Type.png rename to ReClass.NET/Resources/Images/B16x16_Signed_Type.png diff --git a/Resources/Images/B16x16_Table_Gear.png b/ReClass.NET/Resources/Images/B16x16_Table_Gear.png similarity index 100% rename from Resources/Images/B16x16_Table_Gear.png rename to ReClass.NET/Resources/Images/B16x16_Table_Gear.png diff --git a/Resources/Images/B16x16_Text_List_Bullets.png b/ReClass.NET/Resources/Images/B16x16_Text_List_Bullets.png similarity index 100% rename from Resources/Images/B16x16_Text_List_Bullets.png rename to ReClass.NET/Resources/Images/B16x16_Text_List_Bullets.png diff --git a/Resources/Images/B16x16_Text_Type.png b/ReClass.NET/Resources/Images/B16x16_Text_Type.png similarity index 100% rename from Resources/Images/B16x16_Text_Type.png rename to ReClass.NET/Resources/Images/B16x16_Text_Type.png diff --git a/Resources/Images/B16x16_Textfield_Rename.png b/ReClass.NET/Resources/Images/B16x16_Textfield_Rename.png similarity index 100% rename from Resources/Images/B16x16_Textfield_Rename.png rename to ReClass.NET/Resources/Images/B16x16_Textfield_Rename.png diff --git a/Resources/Images/B16x16_Tree_Collapse.png b/ReClass.NET/Resources/Images/B16x16_Tree_Collapse.png similarity index 100% rename from Resources/Images/B16x16_Tree_Collapse.png rename to ReClass.NET/Resources/Images/B16x16_Tree_Collapse.png diff --git a/Resources/Images/B16x16_Tree_Expand.png b/ReClass.NET/Resources/Images/B16x16_Tree_Expand.png similarity index 100% rename from Resources/Images/B16x16_Tree_Expand.png rename to ReClass.NET/Resources/Images/B16x16_Tree_Expand.png diff --git a/Resources/Images/B16x16_Undo.png b/ReClass.NET/Resources/Images/B16x16_Undo.png similarity index 100% rename from Resources/Images/B16x16_Undo.png rename to ReClass.NET/Resources/Images/B16x16_Undo.png diff --git a/Resources/Images/B16x16_Unsigned_Type.png b/ReClass.NET/Resources/Images/B16x16_Unsigned_Type.png similarity index 100% rename from Resources/Images/B16x16_Unsigned_Type.png rename to ReClass.NET/Resources/Images/B16x16_Unsigned_Type.png diff --git a/Resources/Images/B16x16_Vector_Type.png b/ReClass.NET/Resources/Images/B16x16_Vector_Type.png similarity index 100% rename from Resources/Images/B16x16_Vector_Type.png rename to ReClass.NET/Resources/Images/B16x16_Vector_Type.png diff --git a/Resources/Images/B16x16_Warning.png b/ReClass.NET/Resources/Images/B16x16_Warning.png similarity index 100% rename from Resources/Images/B16x16_Warning.png rename to ReClass.NET/Resources/Images/B16x16_Warning.png diff --git a/Resources/Images/B32x32_3D_Glasses.png b/ReClass.NET/Resources/Images/B32x32_3D_Glasses.png similarity index 100% rename from Resources/Images/B32x32_3D_Glasses.png rename to ReClass.NET/Resources/Images/B32x32_3D_Glasses.png diff --git a/Resources/Images/B32x32_Bug.png b/ReClass.NET/Resources/Images/B32x32_Bug.png similarity index 100% rename from Resources/Images/B32x32_Bug.png rename to ReClass.NET/Resources/Images/B32x32_Bug.png diff --git a/Resources/Images/B32x32_Canvas_Size.png b/ReClass.NET/Resources/Images/B32x32_Canvas_Size.png similarity index 100% rename from Resources/Images/B32x32_Canvas_Size.png rename to ReClass.NET/Resources/Images/B32x32_Canvas_Size.png diff --git a/Resources/Images/B32x32_Cogs.png b/ReClass.NET/Resources/Images/B32x32_Cogs.png similarity index 100% rename from Resources/Images/B32x32_Cogs.png rename to ReClass.NET/Resources/Images/B32x32_Cogs.png diff --git a/Resources/Images/B32x32_Eye.png b/ReClass.NET/Resources/Images/B32x32_Eye.png similarity index 100% rename from Resources/Images/B32x32_Eye.png rename to ReClass.NET/Resources/Images/B32x32_Eye.png diff --git a/Resources/Images/B32x32_Magnifier.png b/ReClass.NET/Resources/Images/B32x32_Magnifier.png similarity index 100% rename from Resources/Images/B32x32_Magnifier.png rename to ReClass.NET/Resources/Images/B32x32_Magnifier.png diff --git a/Resources/Images/B32x32_Page_Code.png b/ReClass.NET/Resources/Images/B32x32_Page_Code.png similarity index 100% rename from Resources/Images/B32x32_Page_Code.png rename to ReClass.NET/Resources/Images/B32x32_Page_Code.png diff --git a/Resources/Images/B32x32_Plugin.png b/ReClass.NET/Resources/Images/B32x32_Plugin.png similarity index 100% rename from Resources/Images/B32x32_Plugin.png rename to ReClass.NET/Resources/Images/B32x32_Plugin.png diff --git a/Settings.cs b/ReClass.NET/Settings.cs similarity index 96% rename from Settings.cs rename to ReClass.NET/Settings.cs index 359a7499..948b8a00 100644 --- a/Settings.cs +++ b/ReClass.NET/Settings.cs @@ -1,242 +1,242 @@ -using System; -using System.Diagnostics.Contracts; -using System.Drawing; -using System.IO; -using System.Xml; -using System.Xml.Schema; -using System.Xml.Serialization; -using ReClassNET.Util; - -namespace ReClassNET -{ - public class Settings - { - public static Settings Load() - { - EnsureSettingsDirectoryAvailable(); - - try - { - var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); - - if (File.Exists(path)) - { - using (var sr = new StreamReader(path)) - { - return (Settings)new XmlSerializer(typeof(Settings)).Deserialize(sr); - } - } - } - catch - { - - } - - return new Settings(); - } - - public static void Save(Settings settings) - { - Contract.Requires(settings != null); - - EnsureSettingsDirectoryAvailable(); - - var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); - - using (var sr = new StreamWriter(path)) - { - new XmlSerializer(typeof(Settings)).Serialize(sr, settings); - } - } - - private static void EnsureSettingsDirectoryAvailable() - { - try - { - if (Directory.Exists(PathUtil.SettingsFolderPath) == false) - { - Directory.CreateDirectory(PathUtil.SettingsFolderPath); - } - } - catch (Exception) - { - - } - } - - // Application Settings - - public string LastProcess { get; set; } = string.Empty; - - public bool StayOnTop { get; set; } = false; - - // Node Drawing Settings - - public bool ShowNodeAddress { get; set; } = true; - - public bool ShowNodeOffset { get; set; } = true; - - public bool ShowNodeText { get; set; } = true; - - public bool HighlightChangedValues { get; set; } = true; - - // Comment Drawing Settings - - public bool ShowCommentFloat { get; set; } = true; - - public bool ShowCommentInteger { get; set; } = true; - - public bool ShowCommentPointer { get; set; } = true; - - public bool ShowCommentRtti { get; set; } = true; - - public bool ShowCommentSymbol { get; set; } = true; - - public bool ShowCommentString { get; set; } = true; - - public bool ShowCommentPluginInfo { get; set; } = true; - - // Colors - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color BackgroundColor { get; set; } = Color.FromArgb(255, 255, 255); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color SelectedColor { get; set; } = Color.FromArgb(240, 240, 240); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color HiddenColor { get; set; } = Color.FromArgb(240, 240, 240); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color OffsetColor { get; set; } = Color.FromArgb(255, 0, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color AddressColor { get; set; } = Color.FromArgb(0, 200, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color HexColor { get; set; } = Color.FromArgb(0, 0, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color TypeColor { get; set; } = Color.FromArgb(0, 0, 255); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color NameColor { get; set; } = Color.FromArgb(32, 32, 128); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color ValueColor { get; set; } = Color.FromArgb(255, 128, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color IndexColor { get; set; } = Color.FromArgb(32, 200, 200); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color CommentColor { get; set; } = Color.FromArgb(0, 200, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color TextColor { get; set; } = Color.FromArgb(0, 0, 255); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color VTableColor { get; set; } = Color.FromArgb(0, 255, 0); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color PluginColor { get; set; } = Color.FromArgb(255, 0, 255); - - [XmlElement(Type = typeof(XmlColorWrapper))] - public Color CustomColor { get; set; } = Color.FromArgb(64, 128, 64); - - private static readonly Color[] highlightColors = { - Color.Aqua, Color.Aquamarine, Color.Blue, Color.BlueViolet, Color.Chartreuse, Color.Crimson, Color.LawnGreen, Color.Magenta - }; - [XmlIgnore] - public Color HighlightColor => highlightColors[Program.GlobalRandom.Next(highlightColors.Length)]; - - // Type Definitions - - public string TypePadding { get; set; } = "char"; - - public string TypeBool { get; set; } = "bool"; - - public string TypeInt8 { get; set; } = "int8_t"; - public string TypeInt16 { get; set; } = "int16_t"; - public string TypeInt32 { get; set; } = "int32_t"; - public string TypeInt64 { get; set; } = "int64_t"; - - public string TypeUInt8 { get; set; } = "uint8_t"; - public string TypeUInt16 { get; set; } = "uint16_t"; - public string TypeUInt32 { get; set; } = "uint32_t"; - public string TypeUInt64 { get; set; } = "uint64_t"; - - public string TypeFloat { get; set; } = "float"; - public string TypeDouble { get; set; } = "double"; - - public string TypeVector2 { get; set; } = "Vector2"; - public string TypeVector3 { get; set; } = "Vector3"; - public string TypeVector4 { get; set; } = "Vector4"; - - public string TypeMatrix3x3 { get; set; } = "Matrix3x3"; - public string TypeMatrix3x4 { get; set; } = "Matrix3x4"; - public string TypeMatrix4x4 { get; set; } = "Matrix4x4"; - - public string TypeUTF8Text { get; set; } = "char"; - public string TypeUTF8TextPtr { get; set; } = "char*"; - public string TypeUTF16Text { get; set; } = "wchar_t"; // Should be char16_t, but this type isn't well supported at the moment. - public string TypeUTF16TextPtr { get; set; } = "wchar_t*"; - public string TypeUTF32Text { get; set; } = "char32_t"; - public string TypeUTF32PtrText { get; set; } = "char32_t*"; - - public string TypeFunctionPtr { get; set; } = "void*"; - - public Settings Clone() => MemberwiseClone() as Settings; - } - - public class XmlColorWrapper : IXmlSerializable - { - private Color color; - - public XmlColorWrapper() - : this(Color.Empty) - { - - } - - public XmlColorWrapper(Color color) - { - this.color = color; - } - - public XmlSchema GetSchema() - { - return null; - } - - public void ReadXml(XmlReader reader) - { - color = Color.FromArgb((int)(0xFF000000 | reader.ReadElementContentAsInt())); - } - - public void WriteXml(XmlWriter writer) - { - writer.WriteString(color.ToRgb().ToString()); - } - - - public static implicit operator XmlColorWrapper(Color color) - { - if (color != Color.Empty) - { - return new XmlColorWrapper(color); - } - - return null; - } - - public static implicit operator Color(XmlColorWrapper wrapper) - { - if (wrapper != null) - { - return wrapper.color; - } - - return Color.Empty; - } - } -} +using System; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.IO; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; +using ReClassNET.Util; + +namespace ReClassNET +{ + public class Settings + { + public static Settings Load() + { + EnsureSettingsDirectoryAvailable(); + + try + { + var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); + + if (File.Exists(path)) + { + using (var sr = new StreamReader(path)) + { + return (Settings)new XmlSerializer(typeof(Settings)).Deserialize(sr); + } + } + } + catch + { + + } + + return new Settings(); + } + + public static void Save(Settings settings) + { + Contract.Requires(settings != null); + + EnsureSettingsDirectoryAvailable(); + + var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); + + using (var sr = new StreamWriter(path)) + { + new XmlSerializer(typeof(Settings)).Serialize(sr, settings); + } + } + + private static void EnsureSettingsDirectoryAvailable() + { + try + { + if (Directory.Exists(PathUtil.SettingsFolderPath) == false) + { + Directory.CreateDirectory(PathUtil.SettingsFolderPath); + } + } + catch (Exception) + { + + } + } + + // Application Settings + + public string LastProcess { get; set; } = string.Empty; + + public bool StayOnTop { get; set; } = false; + + // Node Drawing Settings + + public bool ShowNodeAddress { get; set; } = true; + + public bool ShowNodeOffset { get; set; } = true; + + public bool ShowNodeText { get; set; } = true; + + public bool HighlightChangedValues { get; set; } = true; + + // Comment Drawing Settings + + public bool ShowCommentFloat { get; set; } = true; + + public bool ShowCommentInteger { get; set; } = true; + + public bool ShowCommentPointer { get; set; } = true; + + public bool ShowCommentRtti { get; set; } = true; + + public bool ShowCommentSymbol { get; set; } = true; + + public bool ShowCommentString { get; set; } = true; + + public bool ShowCommentPluginInfo { get; set; } = true; + + // Colors + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color BackgroundColor { get; set; } = Color.FromArgb(255, 255, 255); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color SelectedColor { get; set; } = Color.FromArgb(240, 240, 240); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color HiddenColor { get; set; } = Color.FromArgb(240, 240, 240); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color OffsetColor { get; set; } = Color.FromArgb(255, 0, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color AddressColor { get; set; } = Color.FromArgb(0, 200, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color HexColor { get; set; } = Color.FromArgb(0, 0, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color TypeColor { get; set; } = Color.FromArgb(0, 0, 255); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color NameColor { get; set; } = Color.FromArgb(32, 32, 128); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color ValueColor { get; set; } = Color.FromArgb(255, 128, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color IndexColor { get; set; } = Color.FromArgb(32, 200, 200); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color CommentColor { get; set; } = Color.FromArgb(0, 200, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color TextColor { get; set; } = Color.FromArgb(0, 0, 255); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color VTableColor { get; set; } = Color.FromArgb(0, 255, 0); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color PluginColor { get; set; } = Color.FromArgb(255, 0, 255); + + [XmlElement(Type = typeof(XmlColorWrapper))] + public Color CustomColor { get; set; } = Color.FromArgb(64, 128, 64); + + private static readonly Color[] highlightColors = { + Color.Aqua, Color.Aquamarine, Color.Blue, Color.BlueViolet, Color.Chartreuse, Color.Crimson, Color.LawnGreen, Color.Magenta + }; + [XmlIgnore] + public Color HighlightColor => highlightColors[Program.GlobalRandom.Next(highlightColors.Length)]; + + // Type Definitions + + public string TypePadding { get; set; } = "char"; + + public string TypeBool { get; set; } = "bool"; + + public string TypeInt8 { get; set; } = "int8_t"; + public string TypeInt16 { get; set; } = "int16_t"; + public string TypeInt32 { get; set; } = "int32_t"; + public string TypeInt64 { get; set; } = "int64_t"; + + public string TypeUInt8 { get; set; } = "uint8_t"; + public string TypeUInt16 { get; set; } = "uint16_t"; + public string TypeUInt32 { get; set; } = "uint32_t"; + public string TypeUInt64 { get; set; } = "uint64_t"; + + public string TypeFloat { get; set; } = "float"; + public string TypeDouble { get; set; } = "double"; + + public string TypeVector2 { get; set; } = "Vector2"; + public string TypeVector3 { get; set; } = "Vector3"; + public string TypeVector4 { get; set; } = "Vector4"; + + public string TypeMatrix3x3 { get; set; } = "Matrix3x3"; + public string TypeMatrix3x4 { get; set; } = "Matrix3x4"; + public string TypeMatrix4x4 { get; set; } = "Matrix4x4"; + + public string TypeUTF8Text { get; set; } = "char"; + public string TypeUTF8TextPtr { get; set; } = "char*"; + public string TypeUTF16Text { get; set; } = "wchar_t"; // Should be char16_t, but this type isn't well supported at the moment. + public string TypeUTF16TextPtr { get; set; } = "wchar_t*"; + public string TypeUTF32Text { get; set; } = "char32_t"; + public string TypeUTF32PtrText { get; set; } = "char32_t*"; + + public string TypeFunctionPtr { get; set; } = "void*"; + + public Settings Clone() => MemberwiseClone() as Settings; + } + + public class XmlColorWrapper : IXmlSerializable + { + private Color color; + + public XmlColorWrapper() + : this(Color.Empty) + { + + } + + public XmlColorWrapper(Color color) + { + this.color = color; + } + + public XmlSchema GetSchema() + { + return null; + } + + public void ReadXml(XmlReader reader) + { + color = Color.FromArgb((int)(0xFF000000 | reader.ReadElementContentAsInt())); + } + + public void WriteXml(XmlWriter writer) + { + writer.WriteString(color.ToRgb().ToString()); + } + + + public static implicit operator XmlColorWrapper(Color color) + { + if (color != Color.Empty) + { + return new XmlColorWrapper(color); + } + + return null; + } + + public static implicit operator Color(XmlColorWrapper wrapper) + { + if (wrapper != null) + { + return wrapper.color; + } + + return Color.Empty; + } + } +} diff --git a/Symbols/ComDisposableWrapper.cs b/ReClass.NET/Symbols/ComDisposableWrapper.cs similarity index 100% rename from Symbols/ComDisposableWrapper.cs rename to ReClass.NET/Symbols/ComDisposableWrapper.cs diff --git a/Symbols/SymbolReader.cs b/ReClass.NET/Symbols/SymbolReader.cs similarity index 100% rename from Symbols/SymbolReader.cs rename to ReClass.NET/Symbols/SymbolReader.cs diff --git a/Symbols/SymbolStore.cs b/ReClass.NET/Symbols/SymbolStore.cs similarity index 100% rename from Symbols/SymbolStore.cs rename to ReClass.NET/Symbols/SymbolStore.cs diff --git a/UI/BannerBox.cs b/ReClass.NET/UI/BannerBox.cs similarity index 100% rename from UI/BannerBox.cs rename to ReClass.NET/UI/BannerBox.cs diff --git a/UI/BannerFactory.cs b/ReClass.NET/UI/BannerFactory.cs similarity index 100% rename from UI/BannerFactory.cs rename to ReClass.NET/UI/BannerFactory.cs diff --git a/UI/ClassNodeView.Designer.cs b/ReClass.NET/UI/ClassNodeView.Designer.cs similarity index 100% rename from UI/ClassNodeView.Designer.cs rename to ReClass.NET/UI/ClassNodeView.Designer.cs diff --git a/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs similarity index 100% rename from UI/ClassNodeView.cs rename to ReClass.NET/UI/ClassNodeView.cs diff --git a/UI/ClassNodeView.resx b/ReClass.NET/UI/ClassNodeView.resx similarity index 100% rename from UI/ClassNodeView.resx rename to ReClass.NET/UI/ClassNodeView.resx diff --git a/UI/ColorBox.Designer.cs b/ReClass.NET/UI/ColorBox.Designer.cs similarity index 100% rename from UI/ColorBox.Designer.cs rename to ReClass.NET/UI/ColorBox.Designer.cs diff --git a/UI/ColorBox.cs b/ReClass.NET/UI/ColorBox.cs similarity index 100% rename from UI/ColorBox.cs rename to ReClass.NET/UI/ColorBox.cs diff --git a/UI/ColorBox.resx b/ReClass.NET/UI/ColorBox.resx similarity index 100% rename from UI/ColorBox.resx rename to ReClass.NET/UI/ColorBox.resx diff --git a/UI/CustomToolStripItems.cs b/ReClass.NET/UI/CustomToolStripItems.cs similarity index 100% rename from UI/CustomToolStripItems.cs rename to ReClass.NET/UI/CustomToolStripItems.cs diff --git a/UI/CustomToolStripProfessionalRenderer.cs b/ReClass.NET/UI/CustomToolStripProfessionalRenderer.cs similarity index 100% rename from UI/CustomToolStripProfessionalRenderer.cs rename to ReClass.NET/UI/CustomToolStripProfessionalRenderer.cs diff --git a/UI/DpiUtil.cs b/ReClass.NET/UI/DpiUtil.cs similarity index 100% rename from UI/DpiUtil.cs rename to ReClass.NET/UI/DpiUtil.cs diff --git a/UI/DualValueBox.Designer.cs b/ReClass.NET/UI/DualValueBox.Designer.cs similarity index 100% rename from UI/DualValueBox.Designer.cs rename to ReClass.NET/UI/DualValueBox.Designer.cs diff --git a/UI/DualValueBox.cs b/ReClass.NET/UI/DualValueBox.cs similarity index 100% rename from UI/DualValueBox.cs rename to ReClass.NET/UI/DualValueBox.cs diff --git a/UI/DualValueBox.resx b/ReClass.NET/UI/DualValueBox.resx similarity index 100% rename from UI/DualValueBox.resx rename to ReClass.NET/UI/DualValueBox.resx diff --git a/UI/EnumDescriptionDisplay.cs b/ReClass.NET/UI/EnumDescriptionDisplay.cs similarity index 100% rename from UI/EnumDescriptionDisplay.cs rename to ReClass.NET/UI/EnumDescriptionDisplay.cs diff --git a/UI/FontEx.cs b/ReClass.NET/UI/FontEx.cs similarity index 100% rename from UI/FontEx.cs rename to ReClass.NET/UI/FontEx.cs diff --git a/UI/GlobalWindowManager.cs b/ReClass.NET/UI/GlobalWindowManager.cs similarity index 100% rename from UI/GlobalWindowManager.cs rename to ReClass.NET/UI/GlobalWindowManager.cs diff --git a/UI/HotSpot.cs b/ReClass.NET/UI/HotSpot.cs similarity index 100% rename from UI/HotSpot.cs rename to ReClass.NET/UI/HotSpot.cs diff --git a/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs similarity index 100% rename from UI/HotSpotTextBox.cs rename to ReClass.NET/UI/HotSpotTextBox.cs diff --git a/UI/HotkeyBox.Designer.cs b/ReClass.NET/UI/HotkeyBox.Designer.cs similarity index 100% rename from UI/HotkeyBox.Designer.cs rename to ReClass.NET/UI/HotkeyBox.Designer.cs diff --git a/UI/HotkeyBox.cs b/ReClass.NET/UI/HotkeyBox.cs similarity index 100% rename from UI/HotkeyBox.cs rename to ReClass.NET/UI/HotkeyBox.cs diff --git a/UI/HotkeyBox.resx b/ReClass.NET/UI/HotkeyBox.resx similarity index 100% rename from UI/HotkeyBox.resx rename to ReClass.NET/UI/HotkeyBox.resx diff --git a/UI/ISettingsBindable.cs b/ReClass.NET/UI/ISettingsBindable.cs similarity index 100% rename from UI/ISettingsBindable.cs rename to ReClass.NET/UI/ISettingsBindable.cs diff --git a/UI/IconButton.cs b/ReClass.NET/UI/IconButton.cs similarity index 100% rename from UI/IconButton.cs rename to ReClass.NET/UI/IconButton.cs diff --git a/UI/Icons.cs b/ReClass.NET/UI/Icons.cs similarity index 100% rename from UI/Icons.cs rename to ReClass.NET/UI/Icons.cs diff --git a/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs similarity index 100% rename from UI/LinkedWindowFeatures.cs rename to ReClass.NET/UI/LinkedWindowFeatures.cs diff --git a/UI/MemoryPreviewPopUp.cs b/ReClass.NET/UI/MemoryPreviewPopUp.cs similarity index 100% rename from UI/MemoryPreviewPopUp.cs rename to ReClass.NET/UI/MemoryPreviewPopUp.cs diff --git a/UI/MemoryRecordList.Designer.cs b/ReClass.NET/UI/MemoryRecordList.Designer.cs similarity index 100% rename from UI/MemoryRecordList.Designer.cs rename to ReClass.NET/UI/MemoryRecordList.Designer.cs diff --git a/UI/MemoryRecordList.cs b/ReClass.NET/UI/MemoryRecordList.cs similarity index 100% rename from UI/MemoryRecordList.cs rename to ReClass.NET/UI/MemoryRecordList.cs diff --git a/UI/MemoryRecordList.resx b/ReClass.NET/UI/MemoryRecordList.resx similarity index 100% rename from UI/MemoryRecordList.resx rename to ReClass.NET/UI/MemoryRecordList.resx diff --git a/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs similarity index 98% rename from UI/MemoryViewControl.Designer.cs rename to ReClass.NET/UI/MemoryViewControl.Designer.cs index 54babb78..87c87199 100644 --- a/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -1,922 +1,922 @@ -namespace ReClassNET.UI -{ - partial class MemoryViewControl - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Komponenten-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.hex64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.int64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.uInt64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.boolToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.bitsToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.floatToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.doubleToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.vector4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vector3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vector2ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.matrix4x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.matrix3x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.matrix3x3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.uTF8TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF8TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF16TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF16TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.classInstanceToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.classPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.arrayToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.arrayOfPointersToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vTablePointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.functionPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.functionToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.addBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insertBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.insert4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.createClassFromNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.dissectNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.searchForEqualValuesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.findOutWhatAccessesThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.copyNodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pasteNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.repaintTimer = new System.Windows.Forms.Timer(this.components); - this.editBox = new ReClassNET.UI.HotSpotTextBox(); - this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); - this.selectedNodeContextMenuStrip.SuspendLayout(); - this.SuspendLayout(); - // - // selectedNodeContextMenuStrip - // - this.selectedNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.changeTypeToolStripMenuItem, - this.addBytesToolStripMenuItem, - this.insertBytesToolStripMenuItem, - this.toolStripSeparator1, - this.createClassFromNodesToolStripMenuItem, - this.toolStripSeparator13, - this.dissectNodesToolStripMenuItem, - this.toolStripSeparator2, - this.searchForEqualValuesToolStripMenuItem, - this.toolStripSeparator15, - this.findOutWhatAccessesThisAddressToolStripMenuItem, - this.findOutWhatWritesToThisAddressToolStripMenuItem, - this.toolStripSeparator14, - this.copyNodeToolStripMenuItem, - this.pasteNodesToolStripMenuItem, - this.removeToolStripMenuItem, - this.toolStripSeparator12, - this.copyAddressToolStripMenuItem, - this.toolStripSeparator16, - this.showCodeOfClassToolStripMenuItem}); - this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 354); - this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); - // - // changeTypeToolStripMenuItem - // - this.changeTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.hex64ToolStripMenuItem, - this.hex32ToolStripMenuItem, - this.hex16ToolStripMenuItem, - this.hex8ToolStripMenuItem, - this.toolStripSeparator3, - this.int64ToolStripMenuItem, - this.int32ToolStripMenuItem, - this.int16ToolStripMenuItem, - this.int8ToolStripMenuItem, - this.toolStripSeparator4, - this.uInt64ToolStripMenuItem, - this.uInt32ToolStripMenuItem, - this.uInt16ToolStripMenuItem, - this.uInt8ToolStripMenuItem, - this.toolStripSeparator5, - this.boolToolStripMenuItem, - this.bitsToolStripMenuItem, - this.toolStripSeparator11, - this.floatToolStripMenuItem, - this.doubleToolStripMenuItem, - this.toolStripSeparator6, - this.vector4ToolStripMenuItem, - this.vector3ToolStripMenuItem, - this.vector2ToolStripMenuItem, - this.toolStripSeparator7, - this.matrix4x4ToolStripMenuItem, - this.matrix3x4ToolStripMenuItem, - this.matrix3x3ToolStripMenuItem, - this.toolStripSeparator8, - this.uTF8TextToolStripMenuItem, - this.uTF8TextPointerToolStripMenuItem, - this.uTF16TextToolStripMenuItem, - this.uTF16TextPointerToolStripMenuItem, - this.toolStripSeparator9, - this.classInstanceToolStripMenuItem, - this.classPointerToolStripMenuItem, - this.toolStripSeparator10, - this.arrayToolStripMenuItem, - this.arrayOfPointersToolStripMenuItem, - this.vTablePointerToolStripMenuItem, - this.functionPointerToolStripMenuItem, - this.functionToolStripMenuItem}); - this.changeTypeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Exchange_Button; - this.changeTypeToolStripMenuItem.Name = "changeTypeToolStripMenuItem"; - this.changeTypeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.changeTypeToolStripMenuItem.Text = "Change Type"; - // - // hex64ToolStripMenuItem - // - this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; - this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.hex64ToolStripMenuItem.Text = "Hex 64"; - this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); - this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex32ToolStripMenuItem - // - this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; - this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.hex32ToolStripMenuItem.Text = "Hex 32"; - this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); - this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex16ToolStripMenuItem - // - this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; - this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.hex16ToolStripMenuItem.Text = "Hex 16"; - this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); - this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex8ToolStripMenuItem - // - this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; - this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.hex8ToolStripMenuItem.Text = "Hex 8"; - this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); - this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); - // - // int64ToolStripMenuItem - // - this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; - this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.int64ToolStripMenuItem.Text = "Int 64"; - this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); - this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int32ToolStripMenuItem - // - this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; - this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.int32ToolStripMenuItem.Text = "Int 32"; - this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); - this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int16ToolStripMenuItem - // - this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; - this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.int16ToolStripMenuItem.Text = "Int 16"; - this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); - this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int8ToolStripMenuItem - // - this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; - this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.int8ToolStripMenuItem.Text = "Int 8"; - this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); - this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); - // - // uInt64ToolStripMenuItem - // - this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; - this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uInt64ToolStripMenuItem.Text = "UInt 64"; - this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); - this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt32ToolStripMenuItem - // - this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; - this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uInt32ToolStripMenuItem.Text = "UInt 32"; - this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); - this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt16ToolStripMenuItem - // - this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; - this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uInt16ToolStripMenuItem.Text = "UInt 16"; - this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); - this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt8ToolStripMenuItem - // - this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; - this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uInt8ToolStripMenuItem.Text = "UInt 8"; - this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); - this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); - // - // boolToolStripMenuItem - // - this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; - this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.boolToolStripMenuItem.Text = "Bool"; - this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); - this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // bitsToolStripMenuItem - // - this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; - this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.bitsToolStripMenuItem.Text = "Bits"; - this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); - this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); - // - // floatToolStripMenuItem - // - this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; - this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.floatToolStripMenuItem.Text = "Float"; - this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); - this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // doubleToolStripMenuItem - // - this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; - this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.doubleToolStripMenuItem.Text = "Double"; - this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); - this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); - // - // vector4ToolStripMenuItem - // - this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; - this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.vector4ToolStripMenuItem.Text = "Vector 4"; - this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); - this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vector3ToolStripMenuItem - // - this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; - this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.vector3ToolStripMenuItem.Text = "Vector 3"; - this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); - this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vector2ToolStripMenuItem - // - this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; - this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.vector2ToolStripMenuItem.Text = "Vector 2"; - this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); - this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); - // - // matrix4x4ToolStripMenuItem - // - this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; - this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; - this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); - this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // matrix3x4ToolStripMenuItem - // - this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; - this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; - this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); - this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // matrix3x3ToolStripMenuItem - // - this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; - this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; - this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); - this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); - // - // uTF8TextToolStripMenuItem - // - this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; - this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; - this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); - this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF8TextPointerToolStripMenuItem - // - this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; - this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; - this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); - this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF16TextToolStripMenuItem - // - this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; - this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; - this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); - this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF16TextPointerToolStripMenuItem - // - this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; - this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; - this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); - this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); - // - // classInstanceToolStripMenuItem - // - this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; - this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.classInstanceToolStripMenuItem.Text = "Class Instance"; - this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); - this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // classPointerToolStripMenuItem - // - this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; - this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.classPointerToolStripMenuItem.Text = "Class Pointer"; - this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); - this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); - // - // arrayToolStripMenuItem - // - this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; - this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.arrayToolStripMenuItem.Text = "Array of Classes"; - this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); - this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // arrayOfPointersToolStripMenuItem - // - this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; - this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; - this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); - this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vTablePointerToolStripMenuItem - // - this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; - this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; - this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); - this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // functionPointerToolStripMenuItem - // - this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; - this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.functionPointerToolStripMenuItem.Text = "Function Pointer"; - this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); - this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // functionToolStripMenuItem - // - this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; - this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); - this.functionToolStripMenuItem.Text = "Function"; - this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); - this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // addBytesToolStripMenuItem - // - this.addBytesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.add4BytesToolStripMenuItem, - this.add8BytesToolStripMenuItem, - this.add64BytesToolStripMenuItem, - this.add256BytesToolStripMenuItem, - this.add1024BytesToolStripMenuItem, - this.add2048BytesToolStripMenuItem, - this.add4096BytesToolStripMenuItem}); - this.addBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; - this.addBytesToolStripMenuItem.Name = "addBytesToolStripMenuItem"; - this.addBytesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.addBytesToolStripMenuItem.Text = "Add Bytes"; - // - // add4BytesToolStripMenuItem - // - this.add4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4; - this.add4BytesToolStripMenuItem.Name = "add4BytesToolStripMenuItem"; - this.add4BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add4BytesToolStripMenuItem.Text = "Add 4 Bytes"; - this.add4BytesToolStripMenuItem.Value = 4; - this.add4BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add8BytesToolStripMenuItem - // - this.add8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_8; - this.add8BytesToolStripMenuItem.Name = "add8BytesToolStripMenuItem"; - this.add8BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add8BytesToolStripMenuItem.Text = "Add 8 Bytes"; - this.add8BytesToolStripMenuItem.Value = 8; - this.add8BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add64BytesToolStripMenuItem - // - this.add64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_64; - this.add64BytesToolStripMenuItem.Name = "add64BytesToolStripMenuItem"; - this.add64BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add64BytesToolStripMenuItem.Text = "Add 64 Bytes"; - this.add64BytesToolStripMenuItem.Value = 64; - this.add64BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add256BytesToolStripMenuItem - // - this.add256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_256; - this.add256BytesToolStripMenuItem.Name = "add256BytesToolStripMenuItem"; - this.add256BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add256BytesToolStripMenuItem.Text = "Add 256 Bytes"; - this.add256BytesToolStripMenuItem.Value = 256; - this.add256BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add1024BytesToolStripMenuItem - // - this.add1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_1024; - this.add1024BytesToolStripMenuItem.Name = "add1024BytesToolStripMenuItem"; - this.add1024BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add1024BytesToolStripMenuItem.Text = "Add 1024 Bytes"; - this.add1024BytesToolStripMenuItem.Value = 1024; - this.add1024BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add2048BytesToolStripMenuItem - // - this.add2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_2048; - this.add2048BytesToolStripMenuItem.Name = "add2048BytesToolStripMenuItem"; - this.add2048BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add2048BytesToolStripMenuItem.Text = "Add 2048 Bytes"; - this.add2048BytesToolStripMenuItem.Value = 2048; - this.add2048BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // add4096BytesToolStripMenuItem - // - this.add4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4096; - this.add4096BytesToolStripMenuItem.Name = "add4096BytesToolStripMenuItem"; - this.add4096BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); - this.add4096BytesToolStripMenuItem.Text = "Add 4096 Bytes"; - this.add4096BytesToolStripMenuItem.Value = 4096; - this.add4096BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); - // - // insertBytesToolStripMenuItem - // - this.insertBytesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.insert4BytesToolStripMenuItem, - this.insert8BytesToolStripMenuItem, - this.insert64BytesToolStripMenuItem, - this.insert256BytesToolStripMenuItem, - this.insert1024BytesToolStripMenuItem, - this.insert2048BytesToolStripMenuItem, - this.insert4096BytesToolStripMenuItem}); - this.insertBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; - this.insertBytesToolStripMenuItem.Name = "insertBytesToolStripMenuItem"; - this.insertBytesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.insertBytesToolStripMenuItem.Text = "Insert Bytes"; - // - // insert4BytesToolStripMenuItem - // - this.insert4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4; - this.insert4BytesToolStripMenuItem.Name = "insert4BytesToolStripMenuItem"; - this.insert4BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert4BytesToolStripMenuItem.Text = "Insert 4 Bytes"; - this.insert4BytesToolStripMenuItem.Value = 4; - this.insert4BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert8BytesToolStripMenuItem - // - this.insert8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_8; - this.insert8BytesToolStripMenuItem.Name = "insert8BytesToolStripMenuItem"; - this.insert8BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert8BytesToolStripMenuItem.Text = "Insert 8 Bytes"; - this.insert8BytesToolStripMenuItem.Value = 8; - this.insert8BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert64BytesToolStripMenuItem - // - this.insert64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_64; - this.insert64BytesToolStripMenuItem.Name = "insert64BytesToolStripMenuItem"; - this.insert64BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert64BytesToolStripMenuItem.Text = "Insert 64 Bytes"; - this.insert64BytesToolStripMenuItem.Value = 64; - this.insert64BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert256BytesToolStripMenuItem - // - this.insert256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_256; - this.insert256BytesToolStripMenuItem.Name = "insert256BytesToolStripMenuItem"; - this.insert256BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert256BytesToolStripMenuItem.Text = "Insert 256 Bytes"; - this.insert256BytesToolStripMenuItem.Value = 256; - this.insert256BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert1024BytesToolStripMenuItem - // - this.insert1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_1024; - this.insert1024BytesToolStripMenuItem.Name = "insert1024BytesToolStripMenuItem"; - this.insert1024BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert1024BytesToolStripMenuItem.Text = "Insert 1024 Bytes"; - this.insert1024BytesToolStripMenuItem.Value = 1024; - this.insert1024BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert2048BytesToolStripMenuItem - // - this.insert2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_2048; - this.insert2048BytesToolStripMenuItem.Name = "insert2048BytesToolStripMenuItem"; - this.insert2048BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert2048BytesToolStripMenuItem.Text = "Insert 2048 Bytes"; - this.insert2048BytesToolStripMenuItem.Value = 2048; - this.insert2048BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // insert4096BytesToolStripMenuItem - // - this.insert4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4096; - this.insert4096BytesToolStripMenuItem.Name = "insert4096BytesToolStripMenuItem"; - this.insert4096BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); - this.insert4096BytesToolStripMenuItem.Text = "Insert 4096 Bytes"; - this.insert4096BytesToolStripMenuItem.Value = 4096; - this.insert4096BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(266, 6); - // - // createClassFromNodesToolStripMenuItem - // - this.createClassFromNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; - this.createClassFromNodesToolStripMenuItem.Name = "createClassFromNodesToolStripMenuItem"; - this.createClassFromNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.createClassFromNodesToolStripMenuItem.Text = "Create Class from Nodes"; - this.createClassFromNodesToolStripMenuItem.Click += new System.EventHandler(this.createClassFromNodesToolStripMenuItem_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(266, 6); - // - // dissectNodesToolStripMenuItem - // - this.dissectNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Camera; - this.dissectNodesToolStripMenuItem.Name = "dissectNodesToolStripMenuItem"; - this.dissectNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.dissectNodesToolStripMenuItem.Text = "Dissect Node(s)"; - this.dissectNodesToolStripMenuItem.Click += new System.EventHandler(this.dissectNodesToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(266, 6); - // - // searchForEqualValuesToolStripMenuItem - // - this.searchForEqualValuesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.searchForEqualValuesToolStripMenuItem.Name = "searchForEqualValuesToolStripMenuItem"; - this.searchForEqualValuesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.searchForEqualValuesToolStripMenuItem.Text = "Search for equal values..."; - this.searchForEqualValuesToolStripMenuItem.Click += new System.EventHandler(this.searchForEqualValuesToolStripMenuItem_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(266, 6); - // - // findOutWhatAccessesThisAddressToolStripMenuItem - // - this.findOutWhatAccessesThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Access; - this.findOutWhatAccessesThisAddressToolStripMenuItem.Name = "findOutWhatAccessesThisAddressToolStripMenuItem"; - this.findOutWhatAccessesThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.findOutWhatAccessesThisAddressToolStripMenuItem.Text = "Find out what accesses this address..."; - this.findOutWhatAccessesThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatAccessesThisAddressToolStripMenuItem_Click); - // - // findOutWhatWritesToThisAddressToolStripMenuItem - // - this.findOutWhatWritesToThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Write; - this.findOutWhatWritesToThisAddressToolStripMenuItem.Name = "findOutWhatWritesToThisAddressToolStripMenuItem"; - this.findOutWhatWritesToThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.findOutWhatWritesToThisAddressToolStripMenuItem.Text = "Find out what writes to this address..."; - this.findOutWhatWritesToThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatWritesToThisAddressToolStripMenuItem_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(266, 6); - // - // copyNodeToolStripMenuItem - // - this.copyNodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; - this.copyNodeToolStripMenuItem.Name = "copyNodeToolStripMenuItem"; - this.copyNodeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.copyNodeToolStripMenuItem.Text = "Copy Node(s)"; - this.copyNodeToolStripMenuItem.Click += new System.EventHandler(this.copyNodeToolStripMenuItem_Click); - // - // pasteNodesToolStripMenuItem - // - this.pasteNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Paste; - this.pasteNodesToolStripMenuItem.Name = "pasteNodesToolStripMenuItem"; - this.pasteNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.pasteNodesToolStripMenuItem.Text = "Paste Node(s)"; - this.pasteNodesToolStripMenuItem.Click += new System.EventHandler(this.pasteNodesToolStripMenuItem_Click); - // - // removeToolStripMenuItem - // - this.removeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; - this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; - this.removeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.removeToolStripMenuItem.Text = "Remove Node(s)"; - this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(266, 6); - // - // copyAddressToolStripMenuItem - // - this.copyAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; - this.copyAddressToolStripMenuItem.Name = "copyAddressToolStripMenuItem"; - this.copyAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.copyAddressToolStripMenuItem.Text = "Copy Address"; - this.copyAddressToolStripMenuItem.Click += new System.EventHandler(this.copyAddressToolStripMenuItem_Click); - // - // showCodeOfClassToolStripMenuItem - // - this.showCodeOfClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; - this.showCodeOfClassToolStripMenuItem.Name = "showCodeOfClassToolStripMenuItem"; - this.showCodeOfClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.showCodeOfClassToolStripMenuItem.Text = "Show C++ Code of Class"; - this.showCodeOfClassToolStripMenuItem.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem_Click); - // - // repaintTimer - // - this.repaintTimer.Enabled = true; - this.repaintTimer.Interval = 250; - this.repaintTimer.Tick += new System.EventHandler(this.repaintTimer_Tick); - // - // editBox - // - this.editBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.editBox.Location = new System.Drawing.Point(36, 81); - this.editBox.MinimumWidth = 0; - this.editBox.Name = "editBox"; - this.editBox.Size = new System.Drawing.Size(100, 13); - this.editBox.TabIndex = 1; - this.editBox.TabStop = false; - this.editBox.Visible = false; - this.editBox.Committed += new System.EventHandler(this.editBox_Committed); - // - // nodeInfoToolTip - // - this.nodeInfoToolTip.ShowAlways = true; - // - // toolStripSeparator16 - // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(266, 6); - // - // MemoryViewControl - // - this.Controls.Add(this.editBox); - this.DoubleBuffered = true; - this.Name = "MemoryViewControl"; - this.Size = new System.Drawing.Size(150, 162); - this.selectedNodeContextMenuStrip.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.ContextMenuStrip selectedNodeContextMenuStrip; - private System.Windows.Forms.ToolStripMenuItem changeTypeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addBytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add4096BytesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem insertBytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; - private System.Windows.Forms.Timer repaintTimer; - private HotSpotTextBox editBox; - private System.Windows.Forms.ToolTip nodeInfoToolTip; - private UI.TypeToolStripMenuItem hex64ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex32ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex16ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private UI.TypeToolStripMenuItem int64ToolStripMenuItem; - private UI.TypeToolStripMenuItem int32ToolStripMenuItem; - private UI.TypeToolStripMenuItem int16ToolStripMenuItem; - private UI.TypeToolStripMenuItem int8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private UI.TypeToolStripMenuItem uInt64ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt32ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt16ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private UI.TypeToolStripMenuItem floatToolStripMenuItem; - private UI.TypeToolStripMenuItem doubleToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private UI.TypeToolStripMenuItem vector4ToolStripMenuItem; - private UI.TypeToolStripMenuItem vector3ToolStripMenuItem; - private UI.TypeToolStripMenuItem vector2ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private UI.TypeToolStripMenuItem matrix4x4ToolStripMenuItem; - private UI.TypeToolStripMenuItem matrix3x4ToolStripMenuItem; - private UI.TypeToolStripMenuItem matrix3x3ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private UI.TypeToolStripMenuItem uTF8TextToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF8TextPointerToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF16TextToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF16TextPointerToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private UI.TypeToolStripMenuItem classInstanceToolStripMenuItem; - private UI.TypeToolStripMenuItem classPointerToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private UI.TypeToolStripMenuItem arrayToolStripMenuItem; - private UI.TypeToolStripMenuItem vTablePointerToolStripMenuItem; - private UI.TypeToolStripMenuItem functionPointerToolStripMenuItem; - private UI.TypeToolStripMenuItem arrayOfPointersToolStripMenuItem; - private UI.TypeToolStripMenuItem bitsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private System.Windows.Forms.ToolStripMenuItem copyNodeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem pasteNodesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; - private System.Windows.Forms.ToolStripMenuItem dissectNodesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem createClassFromNodesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private UI.TypeToolStripMenuItem boolToolStripMenuItem; - private UI.TypeToolStripMenuItem functionToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private System.Windows.Forms.ToolStripMenuItem searchForEqualValuesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; - private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; - } -} +namespace ReClassNET.UI +{ + partial class MemoryViewControl + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Komponenten-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.hex64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.hex32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.hex16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.hex8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.int64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.int32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.int16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.int8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.uInt64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uInt32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uInt16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uInt8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.boolToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.bitsToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.floatToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.doubleToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.vector4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.vector3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.vector2ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.matrix4x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.matrix3x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.matrix3x3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.uTF8TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uTF8TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uTF16TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.uTF16TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.classInstanceToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.classPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.arrayToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.arrayOfPointersToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.vTablePointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.functionPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.functionToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); + this.addBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insertBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.insert4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.createClassFromNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.dissectNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.searchForEqualValuesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.findOutWhatAccessesThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.copyNodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.repaintTimer = new System.Windows.Forms.Timer(this.components); + this.editBox = new ReClassNET.UI.HotSpotTextBox(); + this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.selectedNodeContextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // selectedNodeContextMenuStrip + // + this.selectedNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.changeTypeToolStripMenuItem, + this.addBytesToolStripMenuItem, + this.insertBytesToolStripMenuItem, + this.toolStripSeparator1, + this.createClassFromNodesToolStripMenuItem, + this.toolStripSeparator13, + this.dissectNodesToolStripMenuItem, + this.toolStripSeparator2, + this.searchForEqualValuesToolStripMenuItem, + this.toolStripSeparator15, + this.findOutWhatAccessesThisAddressToolStripMenuItem, + this.findOutWhatWritesToThisAddressToolStripMenuItem, + this.toolStripSeparator14, + this.copyNodeToolStripMenuItem, + this.pasteNodesToolStripMenuItem, + this.removeToolStripMenuItem, + this.toolStripSeparator12, + this.copyAddressToolStripMenuItem, + this.toolStripSeparator16, + this.showCodeOfClassToolStripMenuItem}); + this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 354); + this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); + // + // changeTypeToolStripMenuItem + // + this.changeTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.hex64ToolStripMenuItem, + this.hex32ToolStripMenuItem, + this.hex16ToolStripMenuItem, + this.hex8ToolStripMenuItem, + this.toolStripSeparator3, + this.int64ToolStripMenuItem, + this.int32ToolStripMenuItem, + this.int16ToolStripMenuItem, + this.int8ToolStripMenuItem, + this.toolStripSeparator4, + this.uInt64ToolStripMenuItem, + this.uInt32ToolStripMenuItem, + this.uInt16ToolStripMenuItem, + this.uInt8ToolStripMenuItem, + this.toolStripSeparator5, + this.boolToolStripMenuItem, + this.bitsToolStripMenuItem, + this.toolStripSeparator11, + this.floatToolStripMenuItem, + this.doubleToolStripMenuItem, + this.toolStripSeparator6, + this.vector4ToolStripMenuItem, + this.vector3ToolStripMenuItem, + this.vector2ToolStripMenuItem, + this.toolStripSeparator7, + this.matrix4x4ToolStripMenuItem, + this.matrix3x4ToolStripMenuItem, + this.matrix3x3ToolStripMenuItem, + this.toolStripSeparator8, + this.uTF8TextToolStripMenuItem, + this.uTF8TextPointerToolStripMenuItem, + this.uTF16TextToolStripMenuItem, + this.uTF16TextPointerToolStripMenuItem, + this.toolStripSeparator9, + this.classInstanceToolStripMenuItem, + this.classPointerToolStripMenuItem, + this.toolStripSeparator10, + this.arrayToolStripMenuItem, + this.arrayOfPointersToolStripMenuItem, + this.vTablePointerToolStripMenuItem, + this.functionPointerToolStripMenuItem, + this.functionToolStripMenuItem}); + this.changeTypeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Exchange_Button; + this.changeTypeToolStripMenuItem.Name = "changeTypeToolStripMenuItem"; + this.changeTypeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.changeTypeToolStripMenuItem.Text = "Change Type"; + // + // hex64ToolStripMenuItem + // + this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; + this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; + this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex64ToolStripMenuItem.Text = "Hex 64"; + this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); + this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // hex32ToolStripMenuItem + // + this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; + this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; + this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex32ToolStripMenuItem.Text = "Hex 32"; + this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); + this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // hex16ToolStripMenuItem + // + this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; + this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; + this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex16ToolStripMenuItem.Text = "Hex 16"; + this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); + this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // hex8ToolStripMenuItem + // + this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; + this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; + this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex8ToolStripMenuItem.Text = "Hex 8"; + this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); + this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); + // + // int64ToolStripMenuItem + // + this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; + this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; + this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int64ToolStripMenuItem.Text = "Int 64"; + this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); + this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // int32ToolStripMenuItem + // + this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; + this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; + this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int32ToolStripMenuItem.Text = "Int 32"; + this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); + this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // int16ToolStripMenuItem + // + this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; + this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; + this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int16ToolStripMenuItem.Text = "Int 16"; + this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); + this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // int8ToolStripMenuItem + // + this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; + this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; + this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int8ToolStripMenuItem.Text = "Int 8"; + this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); + this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); + // + // uInt64ToolStripMenuItem + // + this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; + this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; + this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt64ToolStripMenuItem.Text = "UInt 64"; + this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); + this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uInt32ToolStripMenuItem + // + this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; + this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; + this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt32ToolStripMenuItem.Text = "UInt 32"; + this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); + this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uInt16ToolStripMenuItem + // + this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; + this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; + this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt16ToolStripMenuItem.Text = "UInt 16"; + this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); + this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uInt8ToolStripMenuItem + // + this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; + this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; + this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt8ToolStripMenuItem.Text = "UInt 8"; + this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); + this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); + // + // boolToolStripMenuItem + // + this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; + this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; + this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.boolToolStripMenuItem.Text = "Bool"; + this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); + this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // bitsToolStripMenuItem + // + this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; + this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; + this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.bitsToolStripMenuItem.Text = "Bits"; + this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); + this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); + // + // floatToolStripMenuItem + // + this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; + this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; + this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.floatToolStripMenuItem.Text = "Float"; + this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); + this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // doubleToolStripMenuItem + // + this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; + this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; + this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.doubleToolStripMenuItem.Text = "Double"; + this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); + this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); + // + // vector4ToolStripMenuItem + // + this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; + this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; + this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector4ToolStripMenuItem.Text = "Vector 4"; + this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); + this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // vector3ToolStripMenuItem + // + this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; + this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; + this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector3ToolStripMenuItem.Text = "Vector 3"; + this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); + this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // vector2ToolStripMenuItem + // + this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; + this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; + this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector2ToolStripMenuItem.Text = "Vector 2"; + this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); + this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); + // + // matrix4x4ToolStripMenuItem + // + this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; + this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; + this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; + this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); + this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // matrix3x4ToolStripMenuItem + // + this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; + this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; + this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; + this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); + this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // matrix3x3ToolStripMenuItem + // + this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; + this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; + this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; + this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); + this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); + // + // uTF8TextToolStripMenuItem + // + this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; + this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; + this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; + this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); + this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uTF8TextPointerToolStripMenuItem + // + this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; + this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; + this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; + this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); + this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uTF16TextToolStripMenuItem + // + this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; + this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; + this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; + this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); + this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // uTF16TextPointerToolStripMenuItem + // + this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; + this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; + this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; + this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); + this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); + // + // classInstanceToolStripMenuItem + // + this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; + this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; + this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classInstanceToolStripMenuItem.Text = "Class Instance"; + this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); + this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // classPointerToolStripMenuItem + // + this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; + this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; + this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classPointerToolStripMenuItem.Text = "Class Pointer"; + this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); + this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); + // + // arrayToolStripMenuItem + // + this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; + this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; + this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayToolStripMenuItem.Text = "Array of Classes"; + this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); + this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // arrayOfPointersToolStripMenuItem + // + this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; + this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; + this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; + this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); + this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // vTablePointerToolStripMenuItem + // + this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; + this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; + this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; + this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); + this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // functionPointerToolStripMenuItem + // + this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; + this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; + this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionPointerToolStripMenuItem.Text = "Function Pointer"; + this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); + this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // functionToolStripMenuItem + // + this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; + this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; + this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionToolStripMenuItem.Text = "Function"; + this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); + this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); + // + // addBytesToolStripMenuItem + // + this.addBytesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.add4BytesToolStripMenuItem, + this.add8BytesToolStripMenuItem, + this.add64BytesToolStripMenuItem, + this.add256BytesToolStripMenuItem, + this.add1024BytesToolStripMenuItem, + this.add2048BytesToolStripMenuItem, + this.add4096BytesToolStripMenuItem}); + this.addBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_X; + this.addBytesToolStripMenuItem.Name = "addBytesToolStripMenuItem"; + this.addBytesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.addBytesToolStripMenuItem.Text = "Add Bytes"; + // + // add4BytesToolStripMenuItem + // + this.add4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4; + this.add4BytesToolStripMenuItem.Name = "add4BytesToolStripMenuItem"; + this.add4BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add4BytesToolStripMenuItem.Text = "Add 4 Bytes"; + this.add4BytesToolStripMenuItem.Value = 4; + this.add4BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add8BytesToolStripMenuItem + // + this.add8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_8; + this.add8BytesToolStripMenuItem.Name = "add8BytesToolStripMenuItem"; + this.add8BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add8BytesToolStripMenuItem.Text = "Add 8 Bytes"; + this.add8BytesToolStripMenuItem.Value = 8; + this.add8BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add64BytesToolStripMenuItem + // + this.add64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_64; + this.add64BytesToolStripMenuItem.Name = "add64BytesToolStripMenuItem"; + this.add64BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add64BytesToolStripMenuItem.Text = "Add 64 Bytes"; + this.add64BytesToolStripMenuItem.Value = 64; + this.add64BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add256BytesToolStripMenuItem + // + this.add256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_256; + this.add256BytesToolStripMenuItem.Name = "add256BytesToolStripMenuItem"; + this.add256BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add256BytesToolStripMenuItem.Text = "Add 256 Bytes"; + this.add256BytesToolStripMenuItem.Value = 256; + this.add256BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add1024BytesToolStripMenuItem + // + this.add1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_1024; + this.add1024BytesToolStripMenuItem.Name = "add1024BytesToolStripMenuItem"; + this.add1024BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add1024BytesToolStripMenuItem.Text = "Add 1024 Bytes"; + this.add1024BytesToolStripMenuItem.Value = 1024; + this.add1024BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add2048BytesToolStripMenuItem + // + this.add2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_2048; + this.add2048BytesToolStripMenuItem.Name = "add2048BytesToolStripMenuItem"; + this.add2048BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add2048BytesToolStripMenuItem.Text = "Add 2048 Bytes"; + this.add2048BytesToolStripMenuItem.Value = 2048; + this.add2048BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // add4096BytesToolStripMenuItem + // + this.add4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add_Bytes_4096; + this.add4096BytesToolStripMenuItem.Name = "add4096BytesToolStripMenuItem"; + this.add4096BytesToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.add4096BytesToolStripMenuItem.Text = "Add 4096 Bytes"; + this.add4096BytesToolStripMenuItem.Value = 4096; + this.add4096BytesToolStripMenuItem.Click += new System.EventHandler(this.addBytesToolStripMenuItem_Click); + // + // insertBytesToolStripMenuItem + // + this.insertBytesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.insert4BytesToolStripMenuItem, + this.insert8BytesToolStripMenuItem, + this.insert64BytesToolStripMenuItem, + this.insert256BytesToolStripMenuItem, + this.insert1024BytesToolStripMenuItem, + this.insert2048BytesToolStripMenuItem, + this.insert4096BytesToolStripMenuItem}); + this.insertBytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_X; + this.insertBytesToolStripMenuItem.Name = "insertBytesToolStripMenuItem"; + this.insertBytesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.insertBytesToolStripMenuItem.Text = "Insert Bytes"; + // + // insert4BytesToolStripMenuItem + // + this.insert4BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4; + this.insert4BytesToolStripMenuItem.Name = "insert4BytesToolStripMenuItem"; + this.insert4BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert4BytesToolStripMenuItem.Text = "Insert 4 Bytes"; + this.insert4BytesToolStripMenuItem.Value = 4; + this.insert4BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert8BytesToolStripMenuItem + // + this.insert8BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_8; + this.insert8BytesToolStripMenuItem.Name = "insert8BytesToolStripMenuItem"; + this.insert8BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert8BytesToolStripMenuItem.Text = "Insert 8 Bytes"; + this.insert8BytesToolStripMenuItem.Value = 8; + this.insert8BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert64BytesToolStripMenuItem + // + this.insert64BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_64; + this.insert64BytesToolStripMenuItem.Name = "insert64BytesToolStripMenuItem"; + this.insert64BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert64BytesToolStripMenuItem.Text = "Insert 64 Bytes"; + this.insert64BytesToolStripMenuItem.Value = 64; + this.insert64BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert256BytesToolStripMenuItem + // + this.insert256BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_256; + this.insert256BytesToolStripMenuItem.Name = "insert256BytesToolStripMenuItem"; + this.insert256BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert256BytesToolStripMenuItem.Text = "Insert 256 Bytes"; + this.insert256BytesToolStripMenuItem.Value = 256; + this.insert256BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert1024BytesToolStripMenuItem + // + this.insert1024BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_1024; + this.insert1024BytesToolStripMenuItem.Name = "insert1024BytesToolStripMenuItem"; + this.insert1024BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert1024BytesToolStripMenuItem.Text = "Insert 1024 Bytes"; + this.insert1024BytesToolStripMenuItem.Value = 1024; + this.insert1024BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert2048BytesToolStripMenuItem + // + this.insert2048BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_2048; + this.insert2048BytesToolStripMenuItem.Name = "insert2048BytesToolStripMenuItem"; + this.insert2048BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert2048BytesToolStripMenuItem.Text = "Insert 2048 Bytes"; + this.insert2048BytesToolStripMenuItem.Value = 2048; + this.insert2048BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // insert4096BytesToolStripMenuItem + // + this.insert4096BytesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Insert_Bytes_4096; + this.insert4096BytesToolStripMenuItem.Name = "insert4096BytesToolStripMenuItem"; + this.insert4096BytesToolStripMenuItem.Size = new System.Drawing.Size(161, 22); + this.insert4096BytesToolStripMenuItem.Text = "Insert 4096 Bytes"; + this.insert4096BytesToolStripMenuItem.Value = 4096; + this.insert4096BytesToolStripMenuItem.Click += new System.EventHandler(this.insertBytesToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(266, 6); + // + // createClassFromNodesToolStripMenuItem + // + this.createClassFromNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; + this.createClassFromNodesToolStripMenuItem.Name = "createClassFromNodesToolStripMenuItem"; + this.createClassFromNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.createClassFromNodesToolStripMenuItem.Text = "Create Class from Nodes"; + this.createClassFromNodesToolStripMenuItem.Click += new System.EventHandler(this.createClassFromNodesToolStripMenuItem_Click); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(266, 6); + // + // dissectNodesToolStripMenuItem + // + this.dissectNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Camera; + this.dissectNodesToolStripMenuItem.Name = "dissectNodesToolStripMenuItem"; + this.dissectNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.dissectNodesToolStripMenuItem.Text = "Dissect Node(s)"; + this.dissectNodesToolStripMenuItem.Click += new System.EventHandler(this.dissectNodesToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(266, 6); + // + // searchForEqualValuesToolStripMenuItem + // + this.searchForEqualValuesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.searchForEqualValuesToolStripMenuItem.Name = "searchForEqualValuesToolStripMenuItem"; + this.searchForEqualValuesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.searchForEqualValuesToolStripMenuItem.Text = "Search for equal values..."; + this.searchForEqualValuesToolStripMenuItem.Click += new System.EventHandler(this.searchForEqualValuesToolStripMenuItem_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(266, 6); + // + // findOutWhatAccessesThisAddressToolStripMenuItem + // + this.findOutWhatAccessesThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Access; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Name = "findOutWhatAccessesThisAddressToolStripMenuItem"; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.findOutWhatAccessesThisAddressToolStripMenuItem.Text = "Find out what accesses this address..."; + this.findOutWhatAccessesThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatAccessesThisAddressToolStripMenuItem_Click); + // + // findOutWhatWritesToThisAddressToolStripMenuItem + // + this.findOutWhatWritesToThisAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Find_Write; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Name = "findOutWhatWritesToThisAddressToolStripMenuItem"; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.findOutWhatWritesToThisAddressToolStripMenuItem.Text = "Find out what writes to this address..."; + this.findOutWhatWritesToThisAddressToolStripMenuItem.Click += new System.EventHandler(this.findOutWhatWritesToThisAddressToolStripMenuItem_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(266, 6); + // + // copyNodeToolStripMenuItem + // + this.copyNodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; + this.copyNodeToolStripMenuItem.Name = "copyNodeToolStripMenuItem"; + this.copyNodeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.copyNodeToolStripMenuItem.Text = "Copy Node(s)"; + this.copyNodeToolStripMenuItem.Click += new System.EventHandler(this.copyNodeToolStripMenuItem_Click); + // + // pasteNodesToolStripMenuItem + // + this.pasteNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Paste; + this.pasteNodesToolStripMenuItem.Name = "pasteNodesToolStripMenuItem"; + this.pasteNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.pasteNodesToolStripMenuItem.Text = "Paste Node(s)"; + this.pasteNodesToolStripMenuItem.Click += new System.EventHandler(this.pasteNodesToolStripMenuItem_Click); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.removeToolStripMenuItem.Text = "Remove Node(s)"; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(266, 6); + // + // copyAddressToolStripMenuItem + // + this.copyAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; + this.copyAddressToolStripMenuItem.Name = "copyAddressToolStripMenuItem"; + this.copyAddressToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.copyAddressToolStripMenuItem.Text = "Copy Address"; + this.copyAddressToolStripMenuItem.Click += new System.EventHandler(this.copyAddressToolStripMenuItem_Click); + // + // showCodeOfClassToolStripMenuItem + // + this.showCodeOfClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; + this.showCodeOfClassToolStripMenuItem.Name = "showCodeOfClassToolStripMenuItem"; + this.showCodeOfClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.showCodeOfClassToolStripMenuItem.Text = "Show C++ Code of Class"; + this.showCodeOfClassToolStripMenuItem.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem_Click); + // + // repaintTimer + // + this.repaintTimer.Enabled = true; + this.repaintTimer.Interval = 250; + this.repaintTimer.Tick += new System.EventHandler(this.repaintTimer_Tick); + // + // editBox + // + this.editBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.editBox.Location = new System.Drawing.Point(36, 81); + this.editBox.MinimumWidth = 0; + this.editBox.Name = "editBox"; + this.editBox.Size = new System.Drawing.Size(100, 13); + this.editBox.TabIndex = 1; + this.editBox.TabStop = false; + this.editBox.Visible = false; + this.editBox.Committed += new System.EventHandler(this.editBox_Committed); + // + // nodeInfoToolTip + // + this.nodeInfoToolTip.ShowAlways = true; + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(266, 6); + // + // MemoryViewControl + // + this.Controls.Add(this.editBox); + this.DoubleBuffered = true; + this.Name = "MemoryViewControl"; + this.Size = new System.Drawing.Size(150, 162); + this.selectedNodeContextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip selectedNodeContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem changeTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addBytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add4BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add8BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add64BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add256BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add1024BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add2048BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem add4096BytesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem insertBytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert4BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert8BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert64BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert256BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; + private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; + private System.Windows.Forms.Timer repaintTimer; + private HotSpotTextBox editBox; + private System.Windows.Forms.ToolTip nodeInfoToolTip; + private UI.TypeToolStripMenuItem hex64ToolStripMenuItem; + private UI.TypeToolStripMenuItem hex32ToolStripMenuItem; + private UI.TypeToolStripMenuItem hex16ToolStripMenuItem; + private UI.TypeToolStripMenuItem hex8ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private UI.TypeToolStripMenuItem int64ToolStripMenuItem; + private UI.TypeToolStripMenuItem int32ToolStripMenuItem; + private UI.TypeToolStripMenuItem int16ToolStripMenuItem; + private UI.TypeToolStripMenuItem int8ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private UI.TypeToolStripMenuItem uInt64ToolStripMenuItem; + private UI.TypeToolStripMenuItem uInt32ToolStripMenuItem; + private UI.TypeToolStripMenuItem uInt16ToolStripMenuItem; + private UI.TypeToolStripMenuItem uInt8ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private UI.TypeToolStripMenuItem floatToolStripMenuItem; + private UI.TypeToolStripMenuItem doubleToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private UI.TypeToolStripMenuItem vector4ToolStripMenuItem; + private UI.TypeToolStripMenuItem vector3ToolStripMenuItem; + private UI.TypeToolStripMenuItem vector2ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private UI.TypeToolStripMenuItem matrix4x4ToolStripMenuItem; + private UI.TypeToolStripMenuItem matrix3x4ToolStripMenuItem; + private UI.TypeToolStripMenuItem matrix3x3ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private UI.TypeToolStripMenuItem uTF8TextToolStripMenuItem; + private UI.TypeToolStripMenuItem uTF8TextPointerToolStripMenuItem; + private UI.TypeToolStripMenuItem uTF16TextToolStripMenuItem; + private UI.TypeToolStripMenuItem uTF16TextPointerToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private UI.TypeToolStripMenuItem classInstanceToolStripMenuItem; + private UI.TypeToolStripMenuItem classPointerToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private UI.TypeToolStripMenuItem arrayToolStripMenuItem; + private UI.TypeToolStripMenuItem vTablePointerToolStripMenuItem; + private UI.TypeToolStripMenuItem functionPointerToolStripMenuItem; + private UI.TypeToolStripMenuItem arrayOfPointersToolStripMenuItem; + private UI.TypeToolStripMenuItem bitsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.ToolStripMenuItem copyNodeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem dissectNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem createClassFromNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private UI.TypeToolStripMenuItem boolToolStripMenuItem; + private UI.TypeToolStripMenuItem functionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem searchForEqualValuesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + } +} diff --git a/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs similarity index 100% rename from UI/MemoryViewControl.cs rename to ReClass.NET/UI/MemoryViewControl.cs diff --git a/UI/MemoryViewControl.resx b/ReClass.NET/UI/MemoryViewControl.resx similarity index 100% rename from UI/MemoryViewControl.resx rename to ReClass.NET/UI/MemoryViewControl.resx diff --git a/UI/ScrollableCustomControl.cs b/ReClass.NET/UI/ScrollableCustomControl.cs similarity index 100% rename from UI/ScrollableCustomControl.cs rename to ReClass.NET/UI/ScrollableCustomControl.cs diff --git a/UI/SettingsCheckBox.cs b/ReClass.NET/UI/SettingsCheckBox.cs similarity index 100% rename from UI/SettingsCheckBox.cs rename to ReClass.NET/UI/SettingsCheckBox.cs diff --git a/UI/SettingsTextBox.cs b/ReClass.NET/UI/SettingsTextBox.cs similarity index 100% rename from UI/SettingsTextBox.cs rename to ReClass.NET/UI/SettingsTextBox.cs diff --git a/UI/ViewInfo.cs b/ReClass.NET/UI/ViewInfo.cs similarity index 100% rename from UI/ViewInfo.cs rename to ReClass.NET/UI/ViewInfo.cs diff --git a/Util/CircularBuffer.cs b/ReClass.NET/Util/CircularBuffer.cs similarity index 100% rename from Util/CircularBuffer.cs rename to ReClass.NET/Util/CircularBuffer.cs diff --git a/Util/CommandLineArgs.cs b/ReClass.NET/Util/CommandLineArgs.cs similarity index 100% rename from Util/CommandLineArgs.cs rename to ReClass.NET/Util/CommandLineArgs.cs diff --git a/Util/Extension.BinaryReaderWriter.cs b/ReClass.NET/Util/Extension.BinaryReaderWriter.cs similarity index 100% rename from Util/Extension.BinaryReaderWriter.cs rename to ReClass.NET/Util/Extension.BinaryReaderWriter.cs diff --git a/Util/Extension.DataGridView.cs b/ReClass.NET/Util/Extension.DataGridView.cs similarity index 100% rename from Util/Extension.DataGridView.cs rename to ReClass.NET/Util/Extension.DataGridView.cs diff --git a/Util/Extension.Dictionary.cs b/ReClass.NET/Util/Extension.Dictionary.cs similarity index 100% rename from Util/Extension.Dictionary.cs rename to ReClass.NET/Util/Extension.Dictionary.cs diff --git a/Util/Extension.Encoding.cs b/ReClass.NET/Util/Extension.Encoding.cs similarity index 100% rename from Util/Extension.Encoding.cs rename to ReClass.NET/Util/Extension.Encoding.cs diff --git a/Util/Extension.FloatingPoint.cs b/ReClass.NET/Util/Extension.FloatingPoint.cs similarity index 100% rename from Util/Extension.FloatingPoint.cs rename to ReClass.NET/Util/Extension.FloatingPoint.cs diff --git a/Util/Extension.Graphics.cs b/ReClass.NET/Util/Extension.Graphics.cs similarity index 100% rename from Util/Extension.Graphics.cs rename to ReClass.NET/Util/Extension.Graphics.cs diff --git a/Util/Extension.IntPtr.cs b/ReClass.NET/Util/Extension.IntPtr.cs similarity index 100% rename from Util/Extension.IntPtr.cs rename to ReClass.NET/Util/Extension.IntPtr.cs diff --git a/Util/Extension.Linq.cs b/ReClass.NET/Util/Extension.Linq.cs similarity index 100% rename from Util/Extension.Linq.cs rename to ReClass.NET/Util/Extension.Linq.cs diff --git a/Util/Extension.RichTextBox.cs b/ReClass.NET/Util/Extension.RichTextBox.cs similarity index 100% rename from Util/Extension.RichTextBox.cs rename to ReClass.NET/Util/Extension.RichTextBox.cs diff --git a/Util/Extension.Size.cs b/ReClass.NET/Util/Extension.Size.cs similarity index 100% rename from Util/Extension.Size.cs rename to ReClass.NET/Util/Extension.Size.cs diff --git a/Util/Extension.String.cs b/ReClass.NET/Util/Extension.String.cs similarity index 100% rename from Util/Extension.String.cs rename to ReClass.NET/Util/Extension.String.cs diff --git a/Util/Extension.StringReader.cs b/ReClass.NET/Util/Extension.StringReader.cs similarity index 100% rename from Util/Extension.StringReader.cs rename to ReClass.NET/Util/Extension.StringReader.cs diff --git a/Util/Extensions.cs b/ReClass.NET/Util/Extensions.cs similarity index 100% rename from Util/Extensions.cs rename to ReClass.NET/Util/Extensions.cs diff --git a/Util/GrowingList.cs b/ReClass.NET/Util/GrowingList.cs similarity index 100% rename from Util/GrowingList.cs rename to ReClass.NET/Util/GrowingList.cs diff --git a/Util/IntPtrComparer.cs b/ReClass.NET/Util/IntPtrComparer.cs similarity index 100% rename from Util/IntPtrComparer.cs rename to ReClass.NET/Util/IntPtrComparer.cs diff --git a/Util/PathUtil.cs b/ReClass.NET/Util/PathUtil.cs similarity index 100% rename from Util/PathUtil.cs rename to ReClass.NET/Util/PathUtil.cs diff --git a/Util/Rtf/RtfBuilder.RtfFormatLock.cs b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs similarity index 100% rename from Util/Rtf/RtfBuilder.RtfFormatLock.cs rename to ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs diff --git a/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs similarity index 100% rename from Util/Rtf/RtfBuilder.RtfFormatWrapper.cs rename to ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs diff --git a/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs similarity index 100% rename from Util/Rtf/RtfBuilder.cs rename to ReClass.NET/Util/Rtf/RtfBuilder.cs diff --git a/Util/Rtf/RtfFont.cs b/ReClass.NET/Util/Rtf/RtfFont.cs similarity index 100% rename from Util/Rtf/RtfFont.cs rename to ReClass.NET/Util/Rtf/RtfFont.cs diff --git a/Util/Util.cs b/ReClass.NET/Util/Util.cs similarity index 100% rename from Util/Util.cs rename to ReClass.NET/Util/Util.cs diff --git a/Util/ValueTypeWrapper.cs b/ReClass.NET/Util/ValueTypeWrapper.cs similarity index 100% rename from Util/ValueTypeWrapper.cs rename to ReClass.NET/Util/ValueTypeWrapper.cs diff --git a/Util/WinUtil.cs b/ReClass.NET/Util/WinUtil.cs similarity index 100% rename from Util/WinUtil.cs rename to ReClass.NET/Util/WinUtil.cs diff --git a/packages.config b/ReClass.NET/packages.config similarity index 100% rename from packages.config rename to ReClass.NET/packages.config From fc8a38f3bad942f0384cd99f4b1cf361ce213543 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 17 Oct 2017 23:16:47 +0200 Subject: [PATCH 155/777] Moved project in subfolder (2). --- ReClass.NET/ReClass.NET.csproj | 16 ++++++++-------- ReClass.NET/Resources/BuildDate.txt | Bin 44 -> 0 bytes 2 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 ReClass.NET/Resources/BuildDate.txt diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 5789fe3d..d856c1d0 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -21,7 +21,7 @@ true full false - bin\x86\Debug\ + ..\bin\x86\Debug\ TRACE;DEBUG;RECLASSNET32 prompt 4 @@ -74,7 +74,7 @@ x86 pdbonly true - bin\x86\Release\ + ..\bin\x86\Release\ TRACE;RECLASSNET32;RELEASE prompt 4 @@ -84,7 +84,7 @@ true full false - bin\x64\Debug\ + ..\bin\x64\Debug\ TRACE;DEBUG;RECLASSNET64 prompt 4 @@ -94,7 +94,7 @@ x64 pdbonly true - bin\x64\Release\ + ..\bin\x64\Release\ TRACE;RECLASSNET64;RELEASE prompt 4 @@ -105,15 +105,15 @@ False - Dependencies\ColorCode.dll + ..\Dependencies\ColorCode.dll - Dependencies\Dia2Lib.dll + ..\Dependencies\Dia2Lib.dll True False - Dependencies\Microsoft.ExceptionMessageBox.dll + ..\Dependencies\Microsoft.ExceptionMessageBox.dll @@ -537,7 +537,7 @@ - + diff --git a/ReClass.NET/Resources/BuildDate.txt b/ReClass.NET/Resources/BuildDate.txt deleted file mode 100644 index 92b8bc30a136f7885edcbe585748a93a1ac1ef42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 qcmezW&xpZ*!H~h6K_5sOfJt)(1t8m!!HU6@!5Byy17&#`xEKJhk_FZP From 6875520e529bddbe1f8086ae8b4f17348c667085 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 18 Oct 2017 21:42:09 +0200 Subject: [PATCH 156/777] Renamed attribute. TODO: Change value to "platform" in the future. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs | 2 +- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs | 2 +- ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index d90a27b0..af90e143 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -43,7 +43,7 @@ public void Load(Stream input, ILogger logger) } //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; - var platform = document.Root.Attribute(XmlTypeAttribute)?.Value; + var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; if (platform != Constants.Platform) { logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index cd93c30b..e1b1786b 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -32,7 +32,7 @@ public void Save(Stream output, ILogger logger) new XElement( XmlRootElement, new XAttribute(XmlVersionAttribute, Version1), - new XAttribute(XmlTypeAttribute, Constants.Platform), + new XAttribute(XmlPlatformAttribute, Constants.Platform), new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)) ) ); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index 3c520204..61cc2642 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -24,6 +24,7 @@ public partial class ReClassNetFile : IReClassImport, IReClassExport public const string XmlNodeElement = "node"; public const string XmlMethodElement = "method"; public const string XmlVersionAttribute = "version"; + public const string XmlPlatformAttribute = "type"; public const string XmlUuidAttribute = "uuid"; public const string XmlNameAttribute = "name"; public const string XmlCommentAttribute = "comment"; From 5cd8695f8920605f82c3d3241c68349536d38493 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 18 Oct 2017 22:29:41 +0200 Subject: [PATCH 157/777] Updated .gitignore. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8df17fb3..3a3e6d33 100644 --- a/.gitignore +++ b/.gitignore @@ -251,4 +251,4 @@ paket-files/ .idea/ *.sln.iml -/Resources/BuildDate.txt +/ReClass.NET/Resources/BuildDate.txt From 69359f3cbc038f6e83fb6cfaea47e92df9d05ea7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 18 Oct 2017 22:37:36 +0200 Subject: [PATCH 158/777] Added launcher. --- NativeCore/Unix/NativeCore.Unix.vcxproj | 56 +-------- NativeCore/Windows/NativeCore.vcxproj | 8 +- ReClass.NET.sln | 40 ++++-- ReClass.NET/Constants.cs | 4 + .../ReClass/ReClassNetFile.Constants.cs | 33 +++++ .../DataExchange/ReClass/ReClassNetFile.cs | 28 ----- ReClass.NET/Forms/SettingsForm.cs | 4 +- ReClass.NET/Program.cs | 13 -- ReClass.NET/ReClass.NET.csproj | 9 +- ReClass.NET/Util/PathUtil.cs | 9 ++ ReClass.NET_Launcher/App.config | 6 + .../DataExchange/ReClass/ReClassNetFile.cs | 41 ++++++ ReClass.NET_Launcher/Native/.keep | 0 ReClass.NET_Launcher/Program.cs | 117 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 ++++++ .../ReClass.NET_Launcher.csproj | 92 ++++++++++++++ ReClass.NET_Launcher/ReClassNet.ico | Bin 0 -> 223285 bytes ReClass.NET_Launcher/Util/.keep | 0 18 files changed, 381 insertions(+), 115 deletions(-) create mode 100644 ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs create mode 100644 ReClass.NET_Launcher/App.config create mode 100644 ReClass.NET_Launcher/DataExchange/ReClass/ReClassNetFile.cs create mode 100644 ReClass.NET_Launcher/Native/.keep create mode 100644 ReClass.NET_Launcher/Program.cs create mode 100644 ReClass.NET_Launcher/Properties/AssemblyInfo.cs create mode 100644 ReClass.NET_Launcher/ReClass.NET_Launcher.csproj create mode 100644 ReClass.NET_Launcher/ReClassNet.ico create mode 100644 ReClass.NET_Launcher/Util/.keep diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index e6e9e769..36a8aa95 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -1,14 +1,6 @@  - - Debug - ARM - - - Release - ARM - Debug x86 @@ -37,14 +29,6 @@ {D51BCBC9-82E9-4017-911E-C93873C4EA2B} - - true - DynamicLibrary - - - false - DynamicLibrary - true DynamicLibrary @@ -66,44 +50,30 @@ - - NativeCore - .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ - - - NativeCore - .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ - NativeCore .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ NativeCore .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ NativeCore .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ NativeCore .so - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c false - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c false /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c @@ -128,24 +98,6 @@ - - - true - c++1y - - - stdc++fs - - - - - true - c++1y - - - stdc++fs - - true diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index cca7ae67..1462b796 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -72,25 +72,25 @@ true $(ProjectName) - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ ..\Dependencies\beaengine\include;$(IncludePath) true $(ProjectName) - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ ..\Dependencies\beaengine\include;$(IncludePath) false $(ProjectName) - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ ..\Dependencies\beaengine\include;$(IncludePath) false $(ProjectName) - $(SolutionDir)bin\$(PlatformTarget)\$(Configuration)\ + $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ ..\Dependencies\beaengine\include;$(IncludePath) diff --git a/ReClass.NET.sln b/ReClass.NET.sln index 30520c36..2e43f55f 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -1,10 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2002 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET", "ReClass.NET\ReClass.NET.csproj", "{BFB8917D-E9B4-463F-A6E8-612C35728C78}" ProjectSection(ProjectDependencies) = postProject + {16591D29-2370-428A-BA11-87E38D0F3551} = {16591D29-2370-428A-BA11-87E38D0F3551} {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} = {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} EndProjectSection EndProject @@ -12,50 +13,65 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeCore", "NativeCore\Wi EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeCore.Unix", "NativeCore\Unix\NativeCore.Unix.vcxproj", "{48C5258A-FA49-4173-AEE5-0FCA5190DFF2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET_Launcher", "ReClass.NET_Launcher\ReClass.NET_Launcher.csproj", "{16591D29-2370-428A-BA11-87E38D0F3551}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|ARM = Debug|ARM + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|ARM = Release|ARM + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|ARM.ActiveCfg = Debug|x86 + {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|Any CPU.ActiveCfg = Debug|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x64.ActiveCfg = Debug|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x64.Build.0 = Debug|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x86.ActiveCfg = Debug|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x86.Build.0 = Debug|x86 - {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|ARM.ActiveCfg = Release|x86 + {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|Any CPU.ActiveCfg = Release|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x64.ActiveCfg = Release|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x64.Build.0 = Release|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x86.ActiveCfg = Release|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x86.Build.0 = Release|x86 - {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|ARM.ActiveCfg = Debug|Win32 + {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|Any CPU.ActiveCfg = Debug|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x64.ActiveCfg = Debug|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x64.Build.0 = Debug|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x86.ActiveCfg = Debug|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x86.Build.0 = Debug|Win32 - {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|ARM.ActiveCfg = Release|Win32 + {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|Any CPU.ActiveCfg = Release|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x64.ActiveCfg = Release|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x64.Build.0 = Release|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x86.ActiveCfg = Release|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x86.Build.0 = Release|Win32 - {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|ARM.ActiveCfg = Debug|ARM - {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|ARM.Build.0 = Debug|ARM + {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|Any CPU.ActiveCfg = Debug|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x64.ActiveCfg = Debug|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x64.Build.0 = Debug|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x86.ActiveCfg = Debug|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x86.Build.0 = Debug|x86 - {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|ARM.ActiveCfg = Release|ARM - {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|ARM.Build.0 = Release|ARM + {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|Any CPU.ActiveCfg = Release|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x64.ActiveCfg = Release|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x64.Build.0 = Release|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x86.ActiveCfg = Release|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x86.Build.0 = Release|x86 + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x64.ActiveCfg = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x64.Build.0 = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x86.ActiveCfg = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x86.Build.0 = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|Any CPU.Build.0 = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x64.ActiveCfg = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x64.Build.0 = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.ActiveCfg = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BDFC9557-8E89-44A1-97D7-A830F2A52938} + EndGlobalSection EndGlobal diff --git a/ReClass.NET/Constants.cs b/ReClass.NET/Constants.cs index 979c46d4..76357fc7 100644 --- a/ReClass.NET/Constants.cs +++ b/ReClass.NET/Constants.cs @@ -4,8 +4,12 @@ internal class Constants { public const string ApplicationName = "ReClass.NET"; + public const string ApplicationExecutableName = ApplicationName + ".exe"; + public const string ApplicationVersion = "1.1"; + public const string LauncherExecutableName = ApplicationName + "_Launcher.exe"; + public const string Author = "KN4CK3R"; public const string HomepageUrl = "https://github.com/KN4CK3R/ReClass.NET"; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs new file mode 100644 index 00000000..bd6cc1b2 --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs @@ -0,0 +1,33 @@ +namespace ReClassNET.DataExchange.ReClass +{ + public partial class ReClassNetFile + { + public const string FormatName = "ReClass.NET File"; + public const string FileExtension = ".rcnet"; + public const string FileExtensionId = "rcnetfile"; + + private const string Version1 = "1"; + + private const string DataFileName = "Data.xml"; + + private const string SerialisationClassName = "__Serialization_Class__"; + + public const string XmlRootElement = "reclass"; + public const string XmlClassesElement = "classes"; + public const string XmlClassElement = "class"; + public const string XmlNodeElement = "node"; + public const string XmlMethodElement = "method"; + public const string XmlVersionAttribute = "version"; + public const string XmlPlatformAttribute = "type"; + public const string XmlUuidAttribute = "uuid"; + public const string XmlNameAttribute = "name"; + public const string XmlCommentAttribute = "comment"; + public const string XmlAddressAttribute = "address"; + public const string XmlTypeAttribute = "type"; + public const string XmlReferenceAttribute = "reference"; + public const string XmlCountAttribute = "count"; + public const string XmlBitsAttribute = "bits"; + public const string XmlLengthAttribute = "length"; + public const string XmlSignatureAttribute = "signature"; + } +} diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index 61cc2642..3200764d 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -8,34 +8,6 @@ namespace ReClassNET.DataExchange.ReClass { public partial class ReClassNetFile : IReClassImport, IReClassExport { - public const string FormatName = "ReClass.NET File"; - public const string FileExtension = ".rcnet"; - public const string FileExtensionId = "rcnetfile"; - - private const string Version1 = "1"; - - private const string DataFileName = "Data.xml"; - - private const string SerialisationClassName = "__Serialization_Class__"; - - public const string XmlRootElement = "reclass"; - public const string XmlClassesElement = "classes"; - public const string XmlClassElement = "class"; - public const string XmlNodeElement = "node"; - public const string XmlMethodElement = "method"; - public const string XmlVersionAttribute = "version"; - public const string XmlPlatformAttribute = "type"; - public const string XmlUuidAttribute = "uuid"; - public const string XmlNameAttribute = "name"; - public const string XmlCommentAttribute = "comment"; - public const string XmlAddressAttribute = "address"; - public const string XmlTypeAttribute = "type"; - public const string XmlReferenceAttribute = "reference"; - public const string XmlCountAttribute = "count"; - public const string XmlBitsAttribute = "bits"; - public const string XmlLengthAttribute = "length"; - public const string XmlSignatureAttribute = "signature"; - private readonly ReClassNetProject project; public ReClassNetFile(ReClassNetProject project) diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index 7e133e2e..c6e26792 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -60,12 +60,12 @@ protected override void OnFormClosed(FormClosedEventArgs e) private void createAssociationButton_Click(object sender, EventArgs e) { - WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtRegister}"); + WinUtil.RunElevated(PathUtil.LauncherExecutablePath, $"-{Constants.CommandLineOptions.FileExtRegister}"); } private void removeAssociationButton_Click(object sender, EventArgs e) { - WinUtil.RunElevated(PathUtil.ExecutablePath, $"-{Constants.CommandLineOptions.FileExtUnregister}"); + WinUtil.RunElevated(PathUtil.LauncherExecutablePath, $"-{Constants.CommandLineOptions.FileExtUnregister}"); } private void SetBindings() diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index 882a273b..b5b18064 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -41,19 +41,6 @@ static void Main(string[] args) CommandLineArgs = new CommandLineArgs(args); - if (CommandLineArgs[Constants.CommandLineOptions.FileExtRegister] != null) - { - NativeMethods.RegisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId, PathUtil.ExecutablePath, Constants.ApplicationName); - - return; - } - if (CommandLineArgs[Constants.CommandLineOptions.FileExtUnregister] != null) - { - NativeMethods.UnregisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId); - - return; - } - try { DpiUtil.ConfigureProcess(); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index d856c1d0..88564ed6 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -21,7 +21,7 @@ true full false - ..\bin\x86\Debug\ + ..\bin\Debug\x86\ TRACE;DEBUG;RECLASSNET32 prompt 4 @@ -74,7 +74,7 @@ x86 pdbonly true - ..\bin\x86\Release\ + ..\bin\Release\x86\ TRACE;RECLASSNET32;RELEASE prompt 4 @@ -84,7 +84,7 @@ true full false - ..\bin\x64\Debug\ + ..\bin\Debug\x64\ TRACE;DEBUG;RECLASSNET64 prompt 4 @@ -94,7 +94,7 @@ x64 pdbonly true - ..\bin\x64\Release\ + ..\bin\Release\x64\ TRACE;RECLASSNET64;RELEASE prompt 4 @@ -148,6 +148,7 @@ + diff --git a/ReClass.NET/Util/PathUtil.cs b/ReClass.NET/Util/PathUtil.cs index cb32593f..977da60d 100644 --- a/ReClass.NET/Util/PathUtil.cs +++ b/ReClass.NET/Util/PathUtil.cs @@ -71,6 +71,15 @@ public class PathUtil /// %localappdata%\ReClass.NET\ public static string SettingsFolderPath => settingsFolderPath.Value; + private static readonly Lazy launcherExecutablePath = new Lazy(() => + { + var path = Path.Combine(Directory.GetParent(ExecutableFolderPath).FullName, Constants.LauncherExecutableName); + return !File.Exists(path) ? null : path; + }); + + /// Gets the full pathname of the launcher executable. + public static string LauncherExecutablePath => launcherExecutablePath.Value; + /// Converts a file url to a normal path. /// URL of the file. /// The path part of the URL. diff --git a/ReClass.NET_Launcher/App.config b/ReClass.NET_Launcher/App.config new file mode 100644 index 00000000..731f6de6 --- /dev/null +++ b/ReClass.NET_Launcher/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ReClass.NET_Launcher/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET_Launcher/DataExchange/ReClass/ReClassNetFile.cs new file mode 100644 index 00000000..75671b8e --- /dev/null +++ b/ReClass.NET_Launcher/DataExchange/ReClass/ReClassNetFile.cs @@ -0,0 +1,41 @@ +using System; +using System.Diagnostics.Contracts; +using System.IO; +using System.IO.Compression; +using System.Xml.Linq; + +namespace ReClassNET.DataExchange.ReClass +{ + public partial class ReClassNetFile + { + /// Reads a platform from the ReClass.NET file. + /// Thrown if the format of the file is incorrect. + /// Full path of the file. + /// The platform as string. + public static string ReadPlatform(string path) + { + Contract.Requires(path != null); + + using (var fs = new FileStream(path, FileMode.Open)) + { + using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) + { + var dataEntry = archive.GetEntry(DataFileName); + if (dataEntry == null) + { + throw new FormatException(); + } + using (var entryStream = dataEntry.Open()) + { + var document = XDocument.Load(entryStream); + + //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + var platform = document.Root?.Attribute(XmlPlatformAttribute)?.Value; + + return platform; + } + } + } + } + } +} diff --git a/ReClass.NET_Launcher/Native/.keep b/ReClass.NET_Launcher/Native/.keep new file mode 100644 index 00000000..e69de29b diff --git a/ReClass.NET_Launcher/Program.cs b/ReClass.NET_Launcher/Program.cs new file mode 100644 index 00000000..8c160e3e --- /dev/null +++ b/ReClass.NET_Launcher/Program.cs @@ -0,0 +1,117 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Windows.Forms; +using ReClassNET; +using ReClassNET.DataExchange.ReClass; +using ReClassNET.Native; +using ReClassNET.Util; + +namespace ReClassNET_Launcher +{ + static class Program + { + [STAThread] + static void Main(string[] args) + { + var commandLineArgs = new CommandLineArgs(args); + + // Register the files with the launcher. + if (commandLineArgs[Constants.CommandLineOptions.FileExtRegister] != null) + { + NativeMethods.RegisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId, PathUtil.ExecutablePath, Constants.ApplicationName); + + return; + } + if (commandLineArgs[Constants.CommandLineOptions.FileExtUnregister] != null) + { + NativeMethods.UnregisterExtension(ReClassNetFile.FileExtension, ReClassNetFile.FileExtensionId); + + return; + } + + var is64Bit = IntPtr.Size == 8; + + // If there is a file in the commandline, read the platform. + if (commandLineArgs.FileName != null) + { + try + { + is64Bit = ReClassNetFile.ReadPlatform(commandLineArgs.FileName) == "x64"; + } + catch (Exception) + { + + } + } + + // And finally start the real ReClass.NET. + var applicationPath = Path.Combine(PathUtil.ExecutableFolderPath, is64Bit ? "x64" : "x86", Constants.ApplicationExecutableName); + + try + { + var processStartInfo = new ProcessStartInfo + { + FileName = applicationPath, + UseShellExecute = true, + WindowStyle = ProcessWindowStyle.Normal + }; + var arguments = GetCommandLineWithoutExecutablePath(); + if (arguments != null) + { + processStartInfo.Arguments = arguments; + } + + Process.Start(processStartInfo); + } + catch (Exception) + { + MessageBox.Show($"Could not start '{applicationPath}'.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// Gets command line without the executable path. + /// If empty null else the command line parameters. + private static string GetCommandLineWithoutExecutablePath() + { + var commandLine = Environment.CommandLine; + + if (string.IsNullOrEmpty(commandLine)) + { + return null; + } + + var arguments = string.Empty; + int argIndex; + + if (commandLine[0] == '"') + { + var secondDoublequoteIndex = -1; + for (var i = 1; i < commandLine.Length; ++i) + { + if (commandLine[i] == '\\') + { + ++i; + continue; + } + if (commandLine[i] == '"') + { + secondDoublequoteIndex = i + 1; + break; + } + } + argIndex = secondDoublequoteIndex; + } + else + { + argIndex = commandLine.IndexOf(" ", StringComparison.Ordinal); + } + if (argIndex != -1) + { + arguments = commandLine.Substring(argIndex + 1); + } + + return arguments == string.Empty ? null : arguments; + } + } +} diff --git a/ReClass.NET_Launcher/Properties/AssemblyInfo.cs b/ReClass.NET_Launcher/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..efc03093 --- /dev/null +++ b/ReClass.NET_Launcher/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("ReClass.NET Launcher")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ReClass.NET")] +[assembly: AssemblyCopyright("KN4CK3R")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("16591d29-2370-428a-ba11-87e38d0f3551")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj new file mode 100644 index 00000000..0f4eccaf --- /dev/null +++ b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj @@ -0,0 +1,92 @@ + + + + + Debug + AnyCPU + {16591D29-2370-428A-BA11-87E38D0F3551} + WinExe + ReClassNET_Launcher + ReClass.NET_Launcher + v4.6.1 + 512 + true + + + AnyCPU + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + false + + + ReClassNet.ico + + + + + + + + + + + + + + Constants.cs + + + DataExchange\ReClass\ReClassNetFile.Constants.cs + + + Native\INativeMethods.cs + + + Native\NativeMethods.cs + + + Native\NativeMethods.Unix.cs + + + Native\NativeMethods.Windows.cs + + + Util\Extension.IntPtr.cs + + + Util\PathUtil.cs + + + Util\CommandLineArgs.cs + + + Util\WinUtil.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ReClass.NET_Launcher/ReClassNet.ico b/ReClass.NET_Launcher/ReClassNet.ico new file mode 100644 index 0000000000000000000000000000000000000000..d65d683a1377ad81ce3ad3504f4d0295d564ce53 GIT binary patch literal 223285 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�CvPJr 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: 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%0A3Ulcuo;P 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 literal 0 HcmV?d00001 diff --git a/ReClass.NET_Launcher/Util/.keep b/ReClass.NET_Launcher/Util/.keep new file mode 100644 index 00000000..e69de29b From 4babcaa0090bd56da4b4832c5d3100bbab7ac495 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 19 Oct 2017 17:34:39 +0200 Subject: [PATCH 159/777] Fixed package path. --- ReClass.NET/ReClass.NET.csproj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 88564ed6..5b39b3a2 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -118,7 +118,7 @@ - packages\System.Data.SQLite.Core.1.0.105.2\lib\net46\System.Data.SQLite.dll + ..\packages\System.Data.SQLite.Core.1.0.105.2\lib\net46\System.Data.SQLite.dll @@ -923,12 +923,11 @@ powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" - Missing file: "{0}". - + 0F xx */ -/* */ -/* */ -/* =============================================================================== */ -void (__bea_callspec__ *opcode_map2[])(PDISASM) = { - G6_ , G7_ , lar_GvEw , lsl_GvEw , FailDecode, syscall_ , clts_ , sysret_ , invd_ , wbinvd_ , FailDecode, ud2_ , FailDecode, nop_Ev , femms_ , FailDecode, - movups_VW , movups_WV , movlps_VM , movlps_MV , unpcklps_ , unpckhps_ , movhps_VM , movhps_MV , G16_ , hint_nop , bndcl_GvEv, bndcn_GvEv, hint_nop , hint_nop , hint_nop , nop_Ev , - mov_RdCd , mov_RdDd , mov_CdRd , mov_DdRd , FailDecode, FailDecode, FailDecode, FailDecode, movaps_VW , movaps_WV , cvtpi2ps_ , movntps_ , cvttps2pi_, cvtps2pi_ , ucomiss_VW, comiss_VW , - wrmsr_ , rdtsc_ , rdmsr_ , rdpmc_ , sysenter_ , sysexit_ , FailDecode, FailDecode,Esc_tableA4, FailDecode,Esc_tableA5, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - cmovo_ , cmovno_ , cmovb_ , cmovnb_ , cmove_ , cmovne_ , cmovbe_ , cmovnbe_ , cmovs_ , cmovns_ , cmovp_ , cmovnp_ , cmovl_ , cmovnl_ , cmovle_ , cmovnle_ , - movmskps_ , sqrtps_VW , rsqrtps_ , rcpps_ , andps_VW , andnps_VW , orps_VW , xorps_VW , addps_VW , mulps_VW , cvtps2pd_ , cvtdq2ps_ , subps_VW , minps_VW , divps_VW , maxps_VW , - punpcklbw_, punpcklwd_, punpckldq_, packsswb_ , pcmpgtb_ , pcmpgtw_ , pcmpgtd_ , packuswb_ , punpckhbw_, punpckhwd_, punpckhdq_, packssdw_ ,punpcklqdq_,punpckhqdq_, movd_PE , movq_PQ , - pshufw_ , G12_ , G13_ , G14_ , pcmpeqb_ , pcmpeqw_ , pcmpeqd_ , emms_ , vmread_ , vmwrite_ , FailDecode, FailDecode, haddpd_VW , hsubpd_VW , movd_EP , movq_QP , - jo_near , jno_near , jc_near , jnc_near , je_near , jne_near , jbe_near , ja_near , js_near , jns_near , jp_near , jnp_near , jl_near , jnl_near , jle_near , jnle_near , - seto_ , setno_ , setb_ , setnb_ , sete_ , setne_ , setbe_ , setnbe_ , sets_ , setns_ , setp_ , setnp_ , setnge_ , setge_ , setle_ , setnle_ , - push_fs , pop_fs , cpuid_ , bt_EvGv ,shld_EvGvIb,shld_EvGvCL, FailDecode, FailDecode, push_gs , pop_gs , rsm_ , bts_EvGv ,shrd_EvGvIb,shrd_EvGvCL, G15_ , imul_GvEv , - cmpx_EbGb , cmpx_EvGv , lss_Mp , btr_EvGv , lfs_Mp , lgs_Mp , movzx_GvEb, movzx_GvEw, popcnt_ , ud2_ , G8_EvIb , btc_EvGv , bsf_GvEv , bsr_GvEv , movsx_GvEb, movsx_GvEw, - xadd_EbGb , xadd_EvGv , cmpps_VW , movnti_ , pinsrw_ , pextrw_ , shufps_ , G9_ , bswap_eax , bswap_ecx , bswap_edx , bswap_ebx , bswap_esp , bswap_ebp , bswap_esi , bswap_edi , - addsubpd_ , psrlw_ , psrld_ , psrlq_ , paddq_ , pmullw_ , movq_WV , pmovmskb_ , psubusb_ , psubusw_ , pminub_ , pand_ , paddusb_ , paddusw_ , pmaxub_ , pandn_ , - pavgb_ , psraw_ , psrad_ , pavgw_ , pmulhuw_ , pmulhw_ , cvtpd2dq_ , movntq_ , psubsb_ , psubsw_ , pminsw_ , por_ , paddsb_ , paddsw_ , pmaxsw_ , pxor_ , - lddqu_ , psllw_ , pslld_ , psllq_ , pmuludq_ , pmaddwd_ , psadbw_ , maskmovq_ , psubb_ , psubw_ , psubd_ , psubq_ , paddb_ , paddw_ , paddd_ , FailDecode, - }; - -/* =============================================================================== */ -/* */ -/* */ -/* 3 BYTES OPCODE MAP --> 0F 38 xx */ -/* */ -/* */ -/* =============================================================================== */ - void (__bea_callspec__ *opcode_map3[])(PDISASM) = { - pshufb_ , phaddw_ , phaddd_ , phaddsw_ , pmaddubsw_, phsubw_ , phsubd_ , phsubsw_ , psignb_ , psignw_ , psignd_ , pmulhrsw_ , FailDecode, FailDecode, FailDecode, FailDecode, - pblendvb_ , FailDecode, FailDecode, FailDecode, blendvps_ , blendvpd_ , FailDecode, ptest_ , FailDecode, FailDecode, FailDecode, FailDecode, pabsb_ , pabsw_ , pabsd_ , FailDecode, - pmovsxbw_ , pmovsxbd_ , pmovsxbq_ , pmovsxwd_ , pmovsxwq_ , pmovsxdq_ , FailDecode, FailDecode, pmuldq_ , pcmpeqq_ , movntdqa_ , packusdw_ , FailDecode, FailDecode, FailDecode, FailDecode, - pmovzxbw_ , pmovzxbd_ , pmovzxbq_ , pmovzxwd_ , pmovzxwq_ , pmovzxdq_ , FailDecode, pcmpgtq_ , pminsb_ , pminsd_ , pminuw_ , pminud_ , pmaxsb_ , pmaxsd_ , pmaxuw_ , pmaxud_ , - pmulld_ ,phminposuw_, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, aesimc , aesenc , aesenclast, aesdec , aesdeclast, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - crc32_GvEb, crc32_GvEv, andn_GyEy , G17_ , FailDecode, bzhi_GyEy , adcx_GyEy , bextr_GyEy, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - }; - -/* =============================================================================== */ -/* */ -/* */ -/* 3 BYTES OPCODE MAP --> 0F 3A xx */ -/* */ -/* */ -/* =============================================================================== */ - void (__bea_callspec__ *opcode_map4[])(PDISASM) = { - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, roundps_ , roundpd_ , roundss_ , roundsd_ , blendps_ , blendpd_ , pblendw_ , palignr_ , - FailDecode, FailDecode, FailDecode, FailDecode, pextrb_ , pextrw2_ , pextrd_ , extractps_, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - pinsrb_ , insertps_ , pinsrd_ , FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - dpps_ , dppd_ , mpsadbw_ , FailDecode, pclmulqdq_, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - pcmpestrm_, pcmpestri_, pcmpistrm_, pcmpistri_, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, aeskeygen , - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, FailDecode, - }; - - -void (__bea_callspec__ *ModRM_0[])(ARGTYPE*, PDISASM) = { - Addr_EAX, - Addr_ECX, - Addr_EDX, - Addr_EBX, - Addr_SIB, - Addr_disp32, - Addr_ESI, - Addr_EDI, - }; - - void (__bea_callspec__ *ModRM_1[])(ARGTYPE*, PDISASM) = { - Addr_EAX_disp8, - Addr_ECX_disp8, - Addr_EDX_disp8, - Addr_EBX_disp8, - Addr_SIB_disp8, - Addr_EBP_disp8, - Addr_ESI_disp8, - Addr_EDI_disp8, - }; - - void (__bea_callspec__ *ModRM_2[])(ARGTYPE*, PDISASM) = { - Addr_EAX_disp32, - Addr_ECX_disp32, - Addr_EDX_disp32, - Addr_EBX_disp32, - Addr_SIB_disp32, - Addr_EBP_disp32, - Addr_ESI_disp32, - Addr_EDI_disp32, - }; - - void (__bea_callspec__ *ModRM_3[])(ARGTYPE*, PDISASM) = { - _rEAX, - _rECX, - _rEDX, - _rEBX, - _rESP, - _rEBP, - _rESI, - _rEDI, - }; - -size_t (__bea_callspec__ *SIB[])(ARGTYPE*, size_t, PDISASM) = { - SIB_0, - SIB_1, - SIB_2, - SIB_3, - }; diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_AES.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_AES.c deleted file mode 100644 index d4aa707a..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_AES.c +++ /dev/null @@ -1,266 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0x 0f 38 db - * ==================================================================== */ -void __bea_callspec__ aesimc(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaesimc "); - #endif - - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.MemDecoration = Arg2_m128i_xmm; - GV.SSE_ = 0; - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aesimc "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - (*pMyDisasm).Argument2.ArgSize = 128; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 dc - * ==================================================================== */ -void __bea_callspec__ aesenc(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaesenc "); - #endif - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128i_xmm; - GV.SSE_ = 0; - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aesenc "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 dd - * ==================================================================== */ -void __bea_callspec__ aesenclast(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaesenclast "); - #endif - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128i_xmm; - GV.SSE_ = 0; - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aesenclast "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 de - * ==================================================================== */ -void __bea_callspec__ aesdec(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaesdec "); - #endif - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128i_xmm; - GV.SSE_ = 0; - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aesdec "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 df - * ==================================================================== */ -void __bea_callspec__ aesdeclast(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaesdeclast "); - #endif - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128i_xmm; - GV.SSE_ = 0; - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aesdeclast "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 3a df - * ==================================================================== */ -void __bea_callspec__ aeskeygen(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaeskeygenassist "); - #endif - - GV.SSE_ = 1; - GxEx(pMyDisasm); - /*fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm);*/ - GV.MemDecoration = Arg2_m128i_xmm; - GV.SSE_ = 0; - GV.ImmediatSize = 8; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128i_xmm; - (*pMyDisasm).Instruction.Category = AES_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aeskeygenassist "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - } - - } - else { - FailDecode(pMyDisasm); - } - -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_A_M.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_A_M.c deleted file mode 100644 index c9cf6609..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_A_M.c +++ /dev/null @@ -1,7134 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ aaa_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Archi == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aaa "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - GV.EIP_++; - }; -} - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ aad_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Archi == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aad "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - if (!Security(1, pMyDisasm)) return; - GV.ImmediatSize = 8; - if (*((UInt8*)(UIntPtr) (GV.EIP_+1)) != 0x0A) { - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_+1))); - #endif - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - GV.EIP_+=2; - }; -} - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ aam_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Archi == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aam "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - if (!Security(1, pMyDisasm)) return; - GV.ImmediatSize = 8; - if (*((UInt8*)(UIntPtr) (GV.EIP_+1)) != 0x0A) { - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_+1))); - #endif - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - GV.EIP_+=2; - }; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ aas_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Archi == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "aas "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - GV.EIP_++; - }; -} - -/* ======================================= - * 0Fh 38h F6h - * large integer operation (adc and mul extensions) - * ======================================= */ -void __bea_callspec__ adcx_GyEy(PDISASM pMyDisasm) -{ - - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adox "); - #endif - if (GV.OperandSize != 64) GV.OperandSize = 32; - GvEv(pMyDisasm); - FillFlags(pMyDisasm,124); - } - /* ========= 0xf2 */ - else if (GV.PrefRepne == 1) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mulx "); - #endif - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg3qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg3dword; - } - else { - GV.MemDecoration = Arg3word; - } - GyEy(pMyDisasm); - - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - - if (GV.REX.W_ == 0x0) { - (*pMyDisasm).Argument4.ArgType = REGISTER_TYPE + GENERAL_REG + REGS[2]; - (*pMyDisasm).Argument4.ArgSize = 32; - } - else if (GV.REX.W_ == 0x1) { - (*pMyDisasm).Argument4.ArgType = REGISTER_TYPE + GENERAL_REG + REGS[2]; - (*pMyDisasm).Argument4.ArgSize = 64; - } - (*pMyDisasm).Argument2.AccessMode = WRITE; - FillFlags(pMyDisasm,125); - } - else { - FailDecode(pMyDisasm); - } - } - - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adcx "); - #endif - if (GV.OperandSize != 64) GV.OperandSize = 32; - GvEv(pMyDisasm); - FillFlags(pMyDisasm,123); - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ======================================= - * 00h - * ======================================= */ -void __bea_callspec__ add_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 01h - * ======================================= */ -void __bea_callspec__ add_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 02h - * ======================================= */ -void __bea_callspec__ add_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 03h - * ======================================= */ -void __bea_callspec__ add_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 04h - * ======================================= */ -void __bea_callspec__ add_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 05h - * ======================================= */ -void __bea_callspec__ add_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,5); -} - -/* ======================================= - * 10h - * ======================================= */ -void __bea_callspec__ adc_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 11h - * ======================================= */ -void __bea_callspec__ adc_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 12h - * ======================================= */ -void __bea_callspec__ adc_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 13h - * ======================================= */ -void __bea_callspec__ adc_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 14h - * ======================================= */ -void __bea_callspec__ adc_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 15h - * ======================================= */ -void __bea_callspec__ adc_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,4); -} - -/* ======================================= - * 20h - * ======================================= */ -void __bea_callspec__ and_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * 21h - * ======================================= */ -void __bea_callspec__ and_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * 22h - * ======================================= */ -void __bea_callspec__ and_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * 23h - * ======================================= */ -void __bea_callspec__ and_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * 0fh 38h f2h - * ======================================= */ -void __bea_callspec__ andn_GyEy(PDISASM pMyDisasm) -{ - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "andn "); - #endif - - GV.MemDecoration = Arg3dword; - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.MemDecoration = Arg3qword; - GV.OperandSize = 64; - } - } - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - - FillFlags(pMyDisasm,126); - - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ======================================= - * 24h - * ======================================= */ -void __bea_callspec__ and_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * 25h - * ======================================= */ -void __bea_callspec__ and_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,6); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ arpl_(PDISASM pMyDisasm) -{ - - if (GV.Architecture == 64) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsxd "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,69); - } - else { - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "arpl "); - #endif - GV.OperandSize = 16; - EvGv(pMyDisasm); - GV.OperandSize = 32; - FillFlags(pMyDisasm,7); - } - -} - -/* ======================================= - * 0fh 38h f7h - * ======================================= */ -void __bea_callspec__ bextr_GyEy(PDISASM pMyDisasm) -{ - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bextr "); - #endif - - GV.MemDecoration = Arg2dword; - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.MemDecoration = Arg2qword; - GV.OperandSize = 64; - } - } - GxEx(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument3, pMyDisasm); - - FillFlags(pMyDisasm,127); - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ======================================= - * 62h - * ======================================= */ -void __bea_callspec__ bound_(PDISASM pMyDisasm) -{ - - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bound "); - #endif - GvEv(pMyDisasm); - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,8); - } - -} - -/* ======================================= - * 0fh 1ah - * ======================================= */ -void __bea_callspec__ bndcl_GvEv(PDISASM pMyDisasm) -{ - - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndcl "); - #endif - GV.MPX_ = 1; - GvEv(pMyDisasm); - GV.MPX_ = 0; - (*pMyDisasm).Argument1.AccessMode = READ; - - } - /* ========= 0xf2 */ - else if (GV.PrefRepne == 1) { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndcu "); - #endif - GV.MPX_ = 1; - GvEv(pMyDisasm); - GV.MPX_ = 0; - (*pMyDisasm).Argument1.AccessMode = READ; - - } - /* ========= 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndmov "); - #endif - GV.MPX_ = 1; - GvEv(pMyDisasm); - GV.MPX_ = 0; - if (GV.MOD_ != 3) { - if (GV.Architecture == 64) { - GV.MemDecoration = Arg2dqword; - } - else { - GV.MemDecoration = Arg2qword; - } - } - - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ======================================= - * 0fh 1bh - * ======================================= */ -void __bea_callspec__ bndcn_GvEv(PDISASM pMyDisasm) -{ - - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndmk "); - #endif - GV.MPX_ = 1; - GvEv(pMyDisasm); - GV.MPX_ = 0; - (*pMyDisasm).Argument1.AccessMode = READ; - - } - /* ========= 0xf2 */ - else if (GV.PrefRepne == 1) { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndcn "); - #endif - GV.MPX_ = 1; - GvEv(pMyDisasm); - GV.MPX_ = 0; - (*pMyDisasm).Argument1.AccessMode = READ; - } - /* ========= 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndmov "); - #endif - GV.MPX_ = 1; - EvGv(pMyDisasm); - GV.MPX_ = 0; - if (GV.MOD_ != 3) { - if (GV.Architecture == 64) { - GV.MemDecoration = Arg1dqword; - } - else { - GV.MemDecoration = Arg1qword; - } - } - - } - else { - (*pMyDisasm).Instruction.Category = MPX_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bndstx "); - #endif - GV.MPX_ = 1; - EvGv(pMyDisasm); - GV.MPX_ = 0; - } - -} - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_eax(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_ecx(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_edx(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_ebx(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_esp(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_ebp(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_esi(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - - -/* ======================================= - * 0fc8h - * ======================================= */ -void __bea_callspec__ bswap_edi(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bswap "); - #endif - if (GV.OperandSize == 64) { - (*pMyDisasm).Argument1.ArgSize = 64; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - } - } - else if (GV.OperandSize == 32){ - (*pMyDisasm).Argument1.ArgSize = 32; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - } - } - else { - (*pMyDisasm).Argument1.ArgSize = 16; - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+8]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - } - } - GV.EIP_++; - FillFlags(pMyDisasm,10); - -} - -/* ======================================= - * 0fbch - * ======================================= */ -void __bea_callspec__ bsf_GvEv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bsf "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,9); -} - -/* ======================================= - * 0fbdh - * ======================================= */ -void __bea_callspec__ bsr_GvEv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bsr "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,9); -} - -/* ======================================= - * 0fbbh - * ======================================= */ -void __bea_callspec__ btc_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "btc "); - #endif - EvGv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,11); -} - -/* ======================================= - * 0fa3h - * ======================================= */ -void __bea_callspec__ bt_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bt "); - #endif - EvGv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,11); -} - -/* ======================================= - * 0fb3h - * ======================================= */ -void __bea_callspec__ btr_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "btr "); - #endif - EvGv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,11); -} - -/* ======================================= - * 0fabh - * ======================================= */ -void __bea_callspec__ bts_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bts "); - #endif - EvGv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,11); -} - - -/* ======================================= - * 0fh 38h f5h - * ======================================= */ -void __bea_callspec__ bzhi_GyEy(PDISASM pMyDisasm) -{ - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bzhi "); - #endif - - GV.MemDecoration = Arg2dword; - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.MemDecoration = Arg2qword; - GV.OperandSize = 64; - } - } - GxEx(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument3, pMyDisasm); - - FillFlags(pMyDisasm,128); - - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ======================================= - * e8h - * ======================================= */ -void __bea_callspec__ call_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = CallType; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "call "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1))+5+GV.NB_PREFIX; - CalculateRelativeAddress(&MyAddress,(Int64) MyNumber, pMyDisasm); - (*pMyDisasm).Instruction.AddrValue = MyAddress; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - if (MyAddress >= 0x80000000) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1))+3+GV.NB_PREFIX; - CalculateRelativeAddress(&MyAddress,(Int64) MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ callf_(PDISASM pMyDisasm) -{ - UInt32 MyNumber; - UInt64 MyAddress; - size_t i = 0; - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = CallType; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lcall "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic,"\x24"); - #endif - i++; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "call far "); - #endif - } - if (GV.OperandSize ==32) { - if (!Security(7, pMyDisasm)) return; - MyNumber = *((UInt16*)(UIntPtr) (GV.EIP_+5)); - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.4X",(Int64) MyNumber); - #endif - } - else { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((UInt16*)(UIntPtr) (GV.EIP_+3)); - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.4X",(Int64) MyNumber); - #endif - } - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic+i, " , \x24"); - #endif - i+=4; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic+i, " : "); - #endif - i+=3; - } - MyAddress = MyNumber*16; - MyNumber = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - if (GV.OperandSize == 16) { - MyNumber = MyNumber & 0xffff; - } - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.8X",(Int64) MyNumber); - #endif - if (GV.OperandSize == 32) { - GV.EIP_+=7; - } - else { - GV.EIP_+=5; - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - (*pMyDisasm).Instruction.AddrValue = MyAddress + MyNumber; - } -} - -/* ======================================= - * 99h - * ======================================= */ -void __bea_callspec__ cdq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - if (GV.OperandSize == 64) { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cqto "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cqo "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize ==32) { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cltd "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cdq "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cwtd "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cwd "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ clts_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "clts "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+CR_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 17); - GV.EIP_++; -} - - -/* ======================================= - * F5h - * ======================================= */ -void __bea_callspec__ cmc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmc "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 18); - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovo_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovo "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovno_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovno "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovb "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovnb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovnb "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmove_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmove "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovne_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovne "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovbe_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovbe "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovnbe_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovnbe "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovs_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovs "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovns_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovns "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovp_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovp "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovnp_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovnp "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovl_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovl "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovnl_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovnl "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovle_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovle "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmovnle_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmovnle "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm, 19); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmpx_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpxchg "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,22); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cmpx_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpxchg "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,22); -} - -/* ======================================= - * 38h - * ======================================= */ -void __bea_callspec__ cmp_EbGb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - EbGb(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * 39h - * ======================================= */ -void __bea_callspec__ cmp_EvGv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - EvGv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * 3ah - * ======================================= */ -void __bea_callspec__ cmp_GbEb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - GbEb(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * 3bh - * ======================================= */ -void __bea_callspec__ cmp_GvEv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - GvEv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * 3ch - * ======================================= */ -void __bea_callspec__ cmp_ALIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - ALIb(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * 3dh - * ======================================= */ -void __bea_callspec__ cmp_eAX_Iv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - eAX_Iv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm,20); -} - -/* ======================================= - * a6h - * ======================================= */ -void __bea_callspec__ cmpsb_(PDISASM pMyDisasm) -{ - - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsb "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - FillFlags(pMyDisasm,21); - GV.EIP_++; -} - -/* ======================================= - * a7h - * ======================================= */ -void __bea_callspec__ cmps_(PDISASM pMyDisasm) -{ - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - if (GV.Architecture == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsq "); - #endif - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsd "); - #endif - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsw "); - #endif - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - FillFlags(pMyDisasm,21); - GV.EIP_++; -} - -/* ======================================= - * 98h - * ======================================= */ -void __bea_callspec__ cwde_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - if (GV.OperandSize == 64) { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cltq "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cdqe "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cwtl "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cwde "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cbtw "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cbw "); - #endif - } - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; -} - -/* ======================================= - * f8h - * ======================================= */ -void __bea_callspec__ clc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "clc "); - #endif - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 14); - GV.EIP_++; -} - -/* ======================================= - * f8h - * ======================================= */ -void __bea_callspec__ cld_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cld "); - #endif - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 15); - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ cli_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cli "); - #endif - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 16); - GV.EIP_++; -} - -/* ======================================= - * 0fa2h - * ======================================= */ -void __bea_callspec__ cpuid_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2+REG3; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cpuid "); - #endif - (*pMyDisasm).Argument1.ArgSize = 32; - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ daa_(PDISASM pMyDisasm) -{ - - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "daa "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - FillFlags(pMyDisasm,28); - GV.EIP_++; - } - -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ das_(PDISASM pMyDisasm) -{ - - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "das "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - FillFlags(pMyDisasm,29); - GV.EIP_++; - } - -} - -/* ======================================= - * 48h - * ======================================= */ -void __bea_callspec__ dec_eax(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 0; - GV.REX.X_ = 0; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 49h - * ======================================= */ -void __bea_callspec__ dec_ecx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 0; - GV.REX.X_ = 0; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4ah - * ======================================= */ -void __bea_callspec__ dec_edx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 0; - GV.REX.X_ = 1; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4bh - * ======================================= */ -void __bea_callspec__ dec_ebx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 0; - GV.REX.X_ = 1; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4ch - * ======================================= */ -void __bea_callspec__ dec_esp(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 1; - GV.REX.X_ = 0; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4dh - * ======================================= */ -void __bea_callspec__ dec_ebp(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 1; - GV.REX.X_ = 0; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4eh - * ======================================= */ -void __bea_callspec__ dec_esi(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 1; - GV.REX.X_ = 1; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 4fh - * ======================================= */ -void __bea_callspec__ dec_edi(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 1; - GV.REX.R_ = 1; - GV.REX.X_ = 1; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.OperandSize = 64; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 30); - } -} - -/* ======================================= - * 0c8h - * ======================================= */ -void __bea_callspec__ enter_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "enter "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber (pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic,"%.4X",(Int64) *((UInt16*)(UIntPtr) (GV.EIP_+1))); - #endif - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber (pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_+3))); - #endif - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - GV.EIP_+=4; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ femms_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = AMD_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "femms "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ hlt_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "hlt "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ invd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "invd "); - #endif - GV.EIP_++; -} - -/* ======================================= - * 40h - * ======================================= */ -void __bea_callspec__ inc_eax(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 0; - GV.REX.X_ = 0; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 41h - * ======================================= */ -void __bea_callspec__ inc_ecx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 0; - GV.REX.X_ = 0; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 42h - * ======================================= */ -void __bea_callspec__ inc_edx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 0; - GV.REX.X_ = 1; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 43h - * ======================================= */ -void __bea_callspec__ inc_ebx(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 0; - GV.REX.X_ = 1; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 44h - * ======================================= */ -void __bea_callspec__ inc_esp(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 1; - GV.REX.X_ = 0; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 45h - * ======================================= */ -void __bea_callspec__ inc_ebp(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 1; - GV.REX.X_ = 0; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 46h - * ======================================= */ -void __bea_callspec__ inc_esi(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 1; - GV.REX.X_ = 1; - GV.REX.B_ = 0; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} - -/* ======================================= - * 47h - * ======================================= */ -void __bea_callspec__ inc_edi(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - if (!Security(0, pMyDisasm)) return; - GV.REX.W_ = 0; - GV.REX.R_ = 1; - GV.REX.X_ = 1; - GV.REX.B_ = 1; - GV.REX.state = InUsePrefix; - GV.EIP_++; - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; - - } - else { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+0]; - (*pMyDisasm).Argument1.ArgSize = 16; - } - GV.EIP_++; - FillFlags(pMyDisasm, 40); - } -} -/* ======================================= - * 0xcf - * ======================================= */ -void __bea_callspec__ iret_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = RetType; - if (GV.OperandSize ==64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "iretq "); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "iretd "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "iretw "); - #endif - } - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ in_ALDX(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "in "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers8Bits[0]); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ in_ALIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "in "); - #endif - ALIb(pMyDisasm); -} - -/* ======================================= - * 0xe5 - * ======================================= */ -void __bea_callspec__ in_eAX_Ib(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "in "); - #endif - if (!Security(1, pMyDisasm)) return; - GV.ImmediatSize = 8; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_+1))); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_+=2; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ insb_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "insb "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; - FillFlags(pMyDisasm, 41); - - -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ ins_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - if (GV.OperandSize >= 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "insd "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; - FillFlags(pMyDisasm, 41); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "insw "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; - FillFlags(pMyDisasm, 41); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ into_(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "into "); - #endif - GV.EIP_++; - FillFlags(pMyDisasm, 43); - } -} - -/* ======================================= - * 0edh - * ======================================= */ -void __bea_callspec__ in_eAX(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "in "); - #endif - if (GV.OperandSize >=32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 16; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 16; - } - GV.EIP_++; -} - -/* ======================================= - * 0cdh - * ======================================= */ -void __bea_callspec__ int_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "int "); - #endif - if (!Security(1, pMyDisasm)) return; - GV.ImmediatSize = 8; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_+1))); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument1.ArgSize = 8; - GV.EIP_+=2; - FillFlags(pMyDisasm, 42); -} - -/* ======================================= - * 0f1h - * ======================================= */ -void __bea_callspec__ int1_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "int1 "); - #endif - GV.EIP_++; - FillFlags(pMyDisasm, 42); -} - -/* ======================================= - * 0cch - * ======================================= */ -void __bea_callspec__ int3_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "int3 "); - #endif - GV.EIP_++; - FillFlags(pMyDisasm, 42); -} - -/* ======================================= - * 69h - * ======================================= */ -void __bea_callspec__ imul_GvEvIv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "imul "); - #endif - if (GV.OperandSize >= 32) { - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else { - GV.MemDecoration = Arg2dword; - } - GV.ImmediatSize = 32; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+6; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt32*)(UIntPtr) (GV.EIP_- 4)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.8X",(Int64) *((UInt32*)(UIntPtr) (GV.EIP_- 4))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 32; - - FillFlags(pMyDisasm, 38); - } - else { - GV.MemDecoration = Arg2word; - GV.ImmediatSize = 16; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+4; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt16*)(UIntPtr) (GV.EIP_- 2)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.4X",(Int64) *((UInt16*)(UIntPtr) (GV.EIP_- 2))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 16; - - FillFlags(pMyDisasm, 38); - } -} - -/* ======================================= - * 6bh - * ======================================= */ -void __bea_callspec__ imul_GvEvIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "imul "); - #endif - if (GV.OperandSize >= 32) { - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else { - GV.MemDecoration = Arg2dword; - } - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - FillFlags(pMyDisasm, 38); - } - else { - GV.MemDecoration = Arg2word; - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - FillFlags(pMyDisasm, 38); - } -} - -/* ======================================= - * 0fafh - * ======================================= */ -void __bea_callspec__ imul_GvEv(PDISASM pMyDisasm) -{ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "imul "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,38); -} - -/* ======================================= - * 70h - * ======================================= */ -void __bea_callspec__ jo_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JO; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jo "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,116); -} - -/* ======================================= - * 71h - * ======================================= */ -void __bea_callspec__ jno_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNO; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jno "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,116); -} - -/* ======================================= - * 72h - * ======================================= */ -void __bea_callspec__ jc_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JC; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jc "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,117); -} - -/* ======================================= - * 73h - * ======================================= */ -void __bea_callspec__ jnc_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNC; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnc "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,117); -} -/* ======================================= - * 74h - * ======================================= */ -void __bea_callspec__ je_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "je "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,118); -} - -/* ======================================= - * 75h - * ======================================= */ -void __bea_callspec__ jne_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jne "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,49); -} - -/* ======================================= - * 76h - * ======================================= */ -void __bea_callspec__ jbe_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNA; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jbe "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,119); -} - -/* ======================================= - * 77h - * ======================================= */ -void __bea_callspec__ jnbe_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JA; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnbe "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,119); -} - -/* ======================================= - * 78h - * ======================================= */ -void __bea_callspec__ js_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "js "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,120); -} - -/* ======================================= - * 79h - * ======================================= */ -void __bea_callspec__ jns_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jns "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,120); -} - -/* ======================================= - * 7ah - * ======================================= */ -void __bea_callspec__ jp_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JP; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jp "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,121); -} - -/* ======================================= - * 7bh - * ======================================= */ -void __bea_callspec__ jnp_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNP; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnp "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,121); -} - -/* ======================================= - * 7ch - * ======================================= */ -void __bea_callspec__ jl_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jl "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,122); -} - -/* ======================================= - * 7dh - * ======================================= */ -void __bea_callspec__ jnl_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnl "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,122); -} - -/* ======================================= - * 7eh - * ======================================= */ -void __bea_callspec__ jle_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNG; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jle "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,115); -} - -/* ======================================= - * 7fh - * ======================================= */ -void __bea_callspec__ jnle_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - signed long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JG; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnle "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,115); -} - - -/* ======================================= - * 0f80h - * ======================================= */ -void __bea_callspec__ jo_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JO; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jo "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,116); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,116); - } -} - - -/* ======================================= - * 0f81h - * ======================================= */ -void __bea_callspec__ jno_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNO; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jno "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,116); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,116); - } -} - -/* ======================================= - * 0f82h - * ======================================= */ -void __bea_callspec__ jc_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JC; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jc "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,117); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,117); - } -} - -/* ======================================= - * 0f83h - * ======================================= */ -void __bea_callspec__ jnc_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNC; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnc "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,117); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,117); - } -} - -/* ======================================= - * 0f84h - * ======================================= */ -void __bea_callspec__ je_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JE; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "je "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,118); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} - -/* ======================================= - * 0f85h - * ======================================= */ -void __bea_callspec__ jne_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNE; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jne "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,49); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} -/* ======================================= - * 0f86h - * ======================================= */ -void __bea_callspec__ jbe_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNA; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jbe "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,49); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} - - -/* ======================================= - * 0f87h - * ======================================= */ -void __bea_callspec__ ja_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JA; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ja "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,119); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,119); - } -} - -/* ======================================= - * 0f88h - * ======================================= */ -void __bea_callspec__ js_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JS; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "js "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,120); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} - -/* ======================================= - * 0f89h - * ======================================= */ -void __bea_callspec__ jns_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNS; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jns "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,120); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} - -/* ======================================= - * 0f8ah - * ======================================= */ -void __bea_callspec__ jp_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JP; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jp "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,121); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,49); - } -} - -/* ======================================= - * 0f8bh - * ======================================= */ -void __bea_callspec__ jnp_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNP; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnp "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,121); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,121); - } -} - -/* ======================================= - * 0f8ch - * ======================================= */ -void __bea_callspec__ jl_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JL; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jl "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,122); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,122); - } -} - -/* ======================================= - * 0f8dh - * ======================================= */ -void __bea_callspec__ jnl_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNL; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jnl "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,122); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,122); - } -} - -/* ======================================= - * 0f8eh - * ======================================= */ -void __bea_callspec__ jle_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - Int32 MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNG; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jng "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,115); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,115); - } -} - -/* ======================================= - * 0f8fh - * ======================================= */ -void __bea_callspec__ jnle_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - Int64 MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JG; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jg "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+6+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,115); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+4+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,115); - } -} - -/* ======================================= - * 0e3h - * ======================================= */ -void __bea_callspec__ jecxz_(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - Int64 MyNumber; - if ((*pMyDisasm).Prefix.CSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.CSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchNotTaken = InUsePrefix; - } - if ((*pMyDisasm).Prefix.DSPrefix == InUsePrefix) { - (*pMyDisasm).Prefix.DSPrefix = NotUsedPrefix; - (*pMyDisasm).Prefix.BranchTaken = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JECXZ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - if (GV.AddressSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jrcxz "); - #endif - } - else if (GV.AddressSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jecxz "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jcxz "); - #endif - } - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,49); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,49); - } -} - -/* ======================================= - * 0e9h - * ======================================= */ -void __bea_callspec__ jmp_near(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JmpType; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jmp "); - #endif - if (GV.OperandSize >= 32) { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((Int32*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+5+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=5; - FillFlags(pMyDisasm,51); - } - else { - if (!Security(3, pMyDisasm)) return; - MyNumber = *((Int16*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+3+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=3; - FillFlags(pMyDisasm,51); - } -} - - -/* ======================================= - * 0ebh - * ======================================= */ -void __bea_callspec__ jmp_short(PDISASM pMyDisasm) -{ - UInt64 MyAddress = 0; - signed long MyNumber = 0; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JmpType; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jmp "); - #endif - if (!Security(1, pMyDisasm)) return; - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (GV.OperandSize == 16) MyAddress = MyAddress & 0xffff; - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm,49); -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ jmp_far(PDISASM pMyDisasm) -{ - UInt32 MyNumber; - UInt64 MyAddress; - size_t i = 0; - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JmpType; - (*pMyDisasm).Argument1.AccessMode = READ; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ljmp "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic,"\x24"); - #endif - i++; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jmp far "); - #endif - } - if (GV.OperandSize ==32) { - if (!Security(7, pMyDisasm)) return; - MyNumber = *((UInt16*)(UIntPtr) (GV.EIP_+5)); - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.4X",(Int64) MyNumber); - #endif - } - else { - if (!Security(5, pMyDisasm)) return; - MyNumber = *((UInt16*)(UIntPtr) (GV.EIP_+3)); - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.4X",(Int64) MyNumber); - #endif - } - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic+i, " , \x24"); - #endif - i+=4; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic+i, " : "); - #endif - i+=3; - } - MyAddress = MyNumber*16; - MyNumber = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - if (GV.OperandSize == 16) { - MyNumber = MyNumber & 0xffff; - } - #ifndef BEA_LIGHT_DISASSEMBLY - i += CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i, "%.8X",(Int64) MyNumber); - #endif - if (GV.OperandSize == 32) { - GV.EIP_+=7; - } - else { - GV.EIP_+=5; - } - (*pMyDisasm).Instruction.AddrValue = MyAddress + MyNumber; - FillFlags(pMyDisasm,51); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lahf_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lahf "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lar_GvEw(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lar "); - #endif - GvEw(pMyDisasm); - FillFlags(pMyDisasm, 53); -} - -/* ======================================= - * 0c5h - * ======================================= */ -void __bea_callspec__ lds_GvM(PDISASM pMyDisasm) -{ - /* if MOD == 11b, invalid instruction */ - - if (GV.Architecture == 64) { - - /* VEX2Bytes prefix */ - - if (!Security(1, pMyDisasm)) return; - GV.REX.R_ = ~((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 7) & 0x1; - GV.VEX.vvvv = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0xF; - GV.VEX.L = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 2) & 0x1; - GV.VEX.pp = ((*((UInt8*)(UIntPtr) (GV.EIP_+1)))) & 0x3; - GV.VEX.mmmmm = 0x0; - - GV.REX.state = InUsePrefix; - GV.VEX.state = InUsePrefix; - GV.VEX.opcode = 0xc5; - - if (GV.VEX.pp == 0x0) { - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.EIP_+=2; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.pp == 0x1) { - /* 66h */ - GV.EIP_+=1; - PrefOpSize(pMyDisasm); - } - else if (GV.VEX.pp == 0x2) { - /* F3h */ - GV.EIP_+=1; - PrefREPE(pMyDisasm); - } - else if (GV.VEX.pp == 0x3) { - /* F2h */ - GV.EIP_+=1; - PrefREPNE(pMyDisasm); - } - - /* FailDecode(pMyDisasm); */ - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SEGMENT_REGISTER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lds "); - #endif - if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2fword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } -} - -/* ======================================= - * 0c9h - * ======================================= */ -void __bea_callspec__ leave_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "leave "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG4; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG5; - (*pMyDisasm).Argument2.ArgSize = 32; - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lea_GvM(PDISASM pMyDisasm) -{ - - /* if MOD == 11b, invalid instruction */ - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lea "); - #endif - if (GV.OperandSize >= 32) { - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else { - GV.MemDecoration = Arg2dword; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - (*pMyDisasm).Argument2.AccessMode = 0; - -} - -/* ======================================= - * 0c4h - * ======================================= */ -void __bea_callspec__ les_GvM(PDISASM pMyDisasm) -{ - - if (GV.Architecture == 64) { - - /* VEX3Bytes prefix */ - - if (!Security(1, pMyDisasm)) return; - GV.REX.B_ = ~((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 5) & 0x1; - GV.REX.X_ = ~((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x1; - GV.REX.R_ = ~((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 7) & 0x1; - GV.VEX.mmmmm = (*((UInt8*)(UIntPtr) (GV.EIP_+1))) & 0x1F; - - if (!Security(2, pMyDisasm)) return; - GV.REX.W_ = ((*((UInt8*)(UIntPtr) (GV.EIP_+2))) >> 7) & 0x1; - GV.VEX.vvvv = ((*((UInt8*)(UIntPtr) (GV.EIP_+2))) >> 3) & 0xF; - GV.VEX.L = ((*((UInt8*)(UIntPtr) (GV.EIP_+2))) >> 2) & 0x1; - GV.VEX.pp = ((*((UInt8*)(UIntPtr) (GV.EIP_+2)))) & 0x3; - - GV.REX.state = InUsePrefix; - GV.VEX.state = InUsePrefix; - GV.VEX.opcode = 0xc4; - - - if (GV.VEX.pp == 0x0) { - GV.NB_PREFIX++; - (*pMyDisasm).Prefix.Number++; - GV.EIP_+=3; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - - if (GV.VEX.mmmmm == 0x1) { - (void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x2) { - (void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x3) { - (void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - - - } - if (GV.VEX.pp == 0x1) { - /* 66h */ - GV.EIP_+=2; - PrefOpSize(pMyDisasm); - } - else if (GV.VEX.pp == 0x2) { - /* F3h */ - GV.EIP_+=2; - PrefREPE(pMyDisasm); - } - else if (GV.VEX.pp == 0x3) { - /* F2h */ - GV.EIP_+=2; - PrefREPNE(pMyDisasm); - } - - GV.OperandSize = 32; - - - /* FailDecode(pMyDisasm); */ - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SEGMENT_REGISTER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "les "); - #endif - if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2fword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } -} - -/* ======================================= - * 0ach - * ======================================= */ -void __bea_callspec__ lodsb_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lodsb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6; - GV.EIP_++; - FillFlags(pMyDisasm, 59); -} - -/* ======================================= - * 0adh - * ======================================= */ -void __bea_callspec__ lodsw_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lodsq "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6; - GV.EIP_++; - FillFlags(pMyDisasm, 59); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lodsd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6; - GV.EIP_++; - FillFlags(pMyDisasm, 59); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lodsw "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6; - GV.EIP_++; - FillFlags(pMyDisasm, 59); - } -} - -/* ======================================= - * 0e2h - * ======================================= */ -void __bea_callspec__ loop_(PDISASM pMyDisasm) -{ - signed long MyNumber; - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "loop "); - #endif - if (!Security(1, pMyDisasm)) return; - if (GV.OperandSize >= 32) { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 60); - } - else { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 60); - } -} - -/* ======================================= - * 0xe0 - * ======================================= */ -void __bea_callspec__ loopne_(PDISASM pMyDisasm) -{ - signed long MyNumber; - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JNE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "loopne "); - #endif - if (!Security(1, pMyDisasm)) return; - if (GV.OperandSize >= 32) { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 61); - } - else { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 61); - - } -} - -/* ======================================= - * 0xe1 - * ======================================= */ -void __bea_callspec__ loope_(PDISASM pMyDisasm) -{ - signed long MyNumber; - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "loope "); - #endif - if (!Security(1, pMyDisasm)) return; - if (GV.OperandSize >= 32) { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - if (MyAddress >= W64LIT (0x100000000)) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - } - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 61); - } - else { - MyNumber = *((Int8*)(UIntPtr) (GV.EIP_+1)); - CalculateRelativeAddress(&MyAddress,(Int64) GV.NB_PREFIX+2+MyNumber, pMyDisasm); - MyAddress = MyAddress & 0xffff; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+RELATIVE_; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG1; - (*pMyDisasm).Instruction.AddrValue = MyAddress; - GV.EIP_+=2; - FillFlags(pMyDisasm, 61); - - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lsl_GvEw(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lsl "); - #endif - GvEw(pMyDisasm); - FillFlags(pMyDisasm, 62); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lss_Mp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SEGMENT_REGISTER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lss "); - #endif - GvEv(pMyDisasm); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lfs_Mp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SEGMENT_REGISTER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lfs "); - #endif - GvEv(pMyDisasm); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ lgs_Mp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SEGMENT_REGISTER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lgs "); - #endif - GvEv(pMyDisasm); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ mov_RdCd(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - if (GV.MOD_== 3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.CR_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.CR_ = 0; - FillFlags(pMyDisasm,67); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ mov_RdDd(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - if (GV.MOD_== 3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.DR_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.DR_ = 0; - FillFlags(pMyDisasm,67); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ mov_CdRd(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_== 3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.CR_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.CR_ = 0; - FillFlags(pMyDisasm,67); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ mov_DdRd(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_== 3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.DR_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.DR_ = 0; - FillFlags(pMyDisasm,67); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * 88h - * ======================================= */ -void __bea_callspec__ mov_EbGb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - EbGb(pMyDisasm); -} - -/* ======================================= - * 89h - * ======================================= */ -void __bea_callspec__ mov_EvGv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - EvGv(pMyDisasm); -} - -/* ======================================= - * 8ah - * ======================================= */ -void __bea_callspec__ mov_GbEb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GbEb(pMyDisasm); -} - -/* ======================================= - * 8bh - * ======================================= */ -void __bea_callspec__ mov_GvEv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GvEv(pMyDisasm); -} - -/* ======================================= - * 0a0h - * ======================================= */ -void __bea_callspec__ mov_ALOb(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.MemDecoration = Arg2byte; - GV.RM_ = 5; - GV.MOD_= 0; - - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE ; - (*pMyDisasm).Argument2.ArgSize = 8; - if (GV.AddressSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - else if (GV.AddressSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers8Bits[0]); - #endif - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers8Bits[0+8]); - #endif - } - -} - -/* ======================================= - * 0a1h - * ======================================= */ -void __bea_callspec__ mov_eAXOv(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.RM_ = 5; - GV.MOD_= 0; - if (GV.AddressSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - else if (GV.AddressSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Argument2.Memory.Displacement = (Int64)MyAddress; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - } - else { - GV.MemDecoration = Arg2word; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG8; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0+8]); - #endif - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0+8]); - #endif - } - else { - GV.MemDecoration = Arg2word; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0+8]); - #endif - } - } - - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE ; - if (GV.MemDecoration == 104) { - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.MemDecoration == 103) { - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else if (GV.MemDecoration == 102) { - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - -} - -/* ======================================= - * 0a2h - * ======================================= */ -void __bea_callspec__ mov_ObAL(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.MemDecoration = Arg1byte; - GV.RM_ = 5; - GV.MOD_= 0; - - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE ; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgSize = 8; - if (GV.AddressSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - else if (GV.AddressSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[0]); - #endif - } - else { - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[0+8]); - #endif - } - -} - -/* ======================================= - * 0a3h - * ======================================= */ -void __bea_callspec__ mov_OveAX(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.RM_ = 5; - GV.MOD_= 0; - if (GV.AddressSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - else if (GV.AddressSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument1.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Argument1.Memory.Displacement = (Int64)MyAddress; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[0]); - #endif - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0]); - #endif - } - else { - GV.MemDecoration = Arg1word; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0]); - #endif - } - } - else { - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG8; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[0+8]); - #endif - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0+8]); - #endif - } - else { - GV.MemDecoration = Arg1word; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0+8]); - #endif - } - } - - - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE ; - if (GV.MemDecoration == Arg1qword) { - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.MemDecoration == Arg1dword) { - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else if (GV.MemDecoration == Arg1word) { - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - -/* ======================================= - * 0b0h - * ======================================= */ -void __bea_callspec__ mov_ALIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - ALIb(pMyDisasm); -} - -/* ======================================= - * 0b1h - * ======================================= */ -void __bea_callspec__ mov_CLIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[1]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b2h - * ======================================= */ -void __bea_callspec__ mov_DLIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b3h - * ======================================= */ -void __bea_callspec__ mov_BLIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b4h - * ======================================= */ -void __bea_callspec__ mov_AHIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgPosition = HighPosition; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b5h - * ======================================= */ -void __bea_callspec__ mov_CHIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[5]); - #endif - (*pMyDisasm).Argument1.ArgPosition = HighPosition; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b6h - * ======================================= */ -void __bea_callspec__ mov_DHIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[6]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument1.ArgPosition = HighPosition; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * 0b7h - * ======================================= */ -void __bea_callspec__ mov_BHIb(PDISASM pMyDisasm) -{ - long MyNumber; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers8BitsLegacy[7]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - (*pMyDisasm).Argument1.ArgPosition = HighPosition; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - - -/* ======================================= - * 0a4h - * ======================================= */ -void __bea_callspec__ movs_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsb "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 68); -} - -/* ======================================= - * 0a5h - * ======================================= */ -void __bea_callspec__ movsw_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsq "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 68); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsd "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 68); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsw "); - #endif - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG6+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 68); - } -} - -/* ======================================= - * 0fb6h - * ======================================= */ -void __bea_callspec__ movzx_GvEb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movzx "); - #endif - GvEb(pMyDisasm); -} - - -/* ======================================= - * 0fbeh - * ======================================= */ -void __bea_callspec__ movsx_GvEb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsx "); - #endif - GvEb(pMyDisasm); -} - -/* ======================================= - * 0fbfh - * ======================================= */ -void __bea_callspec__ movsx_GvEw(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsx "); - #endif - GvEw(pMyDisasm); -} - -/* ======================================= - * 0fb7h - * ======================================= */ -void __bea_callspec__ movzx_GvEw(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movzx "); - #endif - GvEw(pMyDisasm); -} - -/* ======================================= - * 0b8h - * ======================================= */ -void __bea_callspec__ mov_EAX(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION + DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE + ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE + GENERAL_REG + REG0; - if (GV.OperandSize == 64) { - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG8; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0+8]); - #endif - } - } - -} - -/* ======================================= - * 0b9h - * ======================================= */ -void __bea_callspec__ mov_ECX(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG9; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0bah - * ======================================= */ -void __bea_callspec__ mov_EDX(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG10; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0bbh - * ======================================= */ -void __bea_callspec__ mov_EBX(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG11; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0bch - * ======================================= */ -void __bea_callspec__ mov_ESP(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG4; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG12; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0bdh - * ======================================= */ -void __bea_callspec__ mov_EBP(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG5; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG13; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0beh - * ======================================= */ -void __bea_callspec__ mov_ESI(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG6; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG14; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6+0+8]); - #endif - } - } - -} - -/* ======================================= - * 0bfh - * ======================================= */ -void __bea_callspec__ mov_EDI(PDISASM pMyDisasm) -{ - UInt64 MyAddress; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - if (GV.OperandSize == 64) { - if (!Security(9, pMyDisasm)) return; - MyAddress = *((UInt64 *)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.16llX",(Int64) MyAddress); - #endif - GV.EIP_+=9; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - MyAddress = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.8X",(Int64) MyAddress); - #endif - GV.EIP_+=5; - (*pMyDisasm).Instruction.Immediat = (Int64)MyAddress; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - if (!Security(3, pMyDisasm)) return; - MyAddress = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument2.ArgMnemonic, "%.4X",(Int64) MyAddress); - #endif - GV.EIP_+=3; - (*pMyDisasm).Instruction.Immediat = (Int64) MyAddress; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - if (GV.REX.B_ == 0) { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG7; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+0]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7+0]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7+0]); - #endif - } - } - else { - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG15; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+0+8]); - #endif - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7+0+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((char*) (*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7+0+8]); - #endif - } - } - -} -/* ======================================= - * 0c6h-Group 11 - * ======================================= */ -void __bea_callspec__ mov_EbIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - EbIb(pMyDisasm); - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * 0c7h-Group 11 - * ======================================= */ -void __bea_callspec__ mov_EvIv(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - EvIv(pMyDisasm); - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * 08ch - * ======================================= */ -void __bea_callspec__ mov_EwSreg(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.MemDecoration = Arg1word; - GV.OperandSize = 16; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.SEG_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SEG_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+2; -} - -/* ======================================= - * 08eh - * ======================================= */ -void __bea_callspec__ mov_SregEw(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mov "); - #endif - GV.MemDecoration = Arg2word; - GV.OperandSize = 16; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.SEG_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SEG_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_CLMUL.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_CLMUL.c deleted file mode 100644 index 22960ee6..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_CLMUL.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0x 0f 3a 44 - * ==================================================================== */ -void __bea_callspec__ pclmulqdq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = CLMUL_INSTRUCTION; - - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - - if ((*pMyDisasm).Instruction.Immediat == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pclmullqlqdq "); - #endif - } - else if ((*pMyDisasm).Instruction.Immediat == 0x01 ) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pclmulhqlqdq "); - #endif - } - else if ((*pMyDisasm).Instruction.Immediat == 0x10 ) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pclmullqhqdq "); - #endif - } - else if ((*pMyDisasm).Instruction.Immediat == 0x011 ) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pclmulhqhqdq "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pclmulqdq "); - #endif - GV.third_arg = 1; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - } - } - else { - FailDecode(pMyDisasm); - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_FPU.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_FPU.c deleted file mode 100644 index c5eb280e..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_FPU.c +++ /dev/null @@ -1,1785 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ D8_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - GV.MemDecoration = Arg2dword; - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fadd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fmul "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcom "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 3) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomp "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 4) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsub "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdiv "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fadd "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fmul "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcom "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomp "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsub "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubr "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xf0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdiv "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivr "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ D9_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fld "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fst "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2multibytes; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldenv "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldcw "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg1multibytes; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstenv "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstcw "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fld "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxch "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if ((MyMODRM & 0xf) ==0) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fnop "); - #endif - } - else if (((MyMODRM & 0xf) >=0x8) && ((MyMODRM & 0xf) <=0xf)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp1 "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if ((MyMODRM & 0xf) ==0) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fchs "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==1) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fabs "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==4) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ftst "); - #endif - } - else if ((MyMODRM & 0xf) ==5) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxam "); - #endif - } - else if ((MyMODRM & 0xf) ==8) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fld1 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - - } - else if ((MyMODRM & 0xf) ==9) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldl2t "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xa) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldl2e "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xb) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldpi "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xc) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldlg2 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - - else if ((MyMODRM & 0xf) ==0xd) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldln2 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xe) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOAD_CONSTANTS; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fldz "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 80; - } - - else { - FailDecode(pMyDisasm); - } - } - else if ((MyMODRM & 0xf0) == 0xf0) { - if ((MyMODRM & 0xf) ==0) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOGARITHMIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "f2xm1 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==1) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOGARITHMIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fyl2x "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==2) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+TRIGONOMETRIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fptan "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==3) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+TRIGONOMETRIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fpatan "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==4) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxtract "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==5) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fprem1 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==6) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdecstp "); - #endif - } - else if ((MyMODRM & 0xf) ==7) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fincstp "); - #endif - } - else if ((MyMODRM & 0xf) ==8) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fprem "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==9) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOGARITHMIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fyl2xp1 "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xa) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsqrt "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xb) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+TRIGONOMETRIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsincos "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xc) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "frndint "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xd) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+LOGARITHMIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fscale "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xe) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+TRIGONOMETRIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsin "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf) ==0xf) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+TRIGONOMETRIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcos "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DA_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fiadd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fimul "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ficom "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ficomp "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisub "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisubr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fidiv "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fidivr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovb "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmove "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovbe "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovu "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - - } - else if (MyMODRM == 0xe9) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fucompp "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DB_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fild "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisttp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fist "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fistp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2tbyte; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fld "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg1tbyte; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovnb "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovne "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovnbe "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcmovnu "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xe0) { - - if ((MyMODRM & 0xf) ==0) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+UNSUPPORTED_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fneni "); - #endif - } - else if ((MyMODRM & 0xf) ==1) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+UNSUPPORTED_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fndisi "); - #endif - } - else if ((MyMODRM & 0xf) ==2) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fnclex "); - #endif - } - else if ((MyMODRM & 0xf) ==3) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fninit "); - #endif - } - else if ((MyMODRM & 0xf) ==4) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+UNSUPPORTED_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fnsetpm "); - #endif - } - else if ((MyMODRM & 0xf) ==5) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "frstpm "); - #endif - } - else if (((MyMODRM & 0xf) >=0x8) && ((MyMODRM & 0xf) <=0xf)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fucomi "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else if ((MyMODRM & 0xf0) == 0xf0) { - if (((MyMODRM & 0xf) >=0x0) && ((MyMODRM & 0xf) <=0x7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomi "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DC_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fadd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fmul "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcom "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomp "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - (*pMyDisasm).Argument1.AccessMode = READ; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsub "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdiv "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fadd "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fmul "); - #endif - (*pMyDisasm).Argument1.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcom2 "); - #endif - - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomp3 "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubr "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsub "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xf0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivr "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdiv "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - - } - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DD_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fld "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg1qword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisttp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg1qword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fst "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg1qword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2multibytes; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "frstor "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 108*8; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg1multibytes; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsave "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 108*8; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstsw "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG; - (*pMyDisasm).Argument2.ArgSize = 16; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ffree "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxch4 "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fst "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fucom "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fucomp "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - - } - - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DE_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fiadd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fimul "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ficom "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ficomp "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisub "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisubr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fidiv "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fidivr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "faddp "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fmulp "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomp5 "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (MyMODRM == 0xd9){ - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcompp "); - #endif - } - else { - FailDecode(pMyDisasm); - } - - - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubrp "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fsubp "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xf0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivrp "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fdivp "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - - } - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ DF_(PDISASM pMyDisasm) -{ - long MyMODRM; - char (*pRegistersFPU)[8][8] ; - - GV.DECALAGE_EIP = 0; - if (!Security(1, pMyDisasm)) {return;} - MyMODRM = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - pRegistersFPU = &RegistersFPU_Masm; - if (GV.SYNTAX_ == NasmSyntax) { - pRegistersFPU = &RegistersFPU_Nasm; - } - if (MyMODRM <= 0xbf) { - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fild "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 1) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fisttp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fist "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fistp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2multibytes; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fbld "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fild "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg1multibytes; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fbstp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else if (GV.REGOPCODE == 7) { - GV.MemDecoration = Arg1qword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fistp "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if ((MyMODRM & 0xf0) == 0xc0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ffreep "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxch7 "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - } - else if ((MyMODRM & 0xf0) == 0xd0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp8 "); - #endif - } - else { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstp9 "); - #endif - (*pMyDisasm).Argument2.AccessMode = WRITE; - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument1.ArgSize = 80; - - } - else if ((MyMODRM & 0xf0) == 0xe0) { - if (MyMODRM == 0xe0) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fstsw "); - #endif - } - else if ((MyMODRM & 0xf) >=8) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fucomip "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - - - else { - FailDecode(pMyDisasm); - } - } - - else if ((MyMODRM & 0xf0) == 0xf0) { - if (((MyMODRM & 0xf) >=0) && ((MyMODRM & 0xf) <=7)) { - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fcomip "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, (*pRegistersFPU)[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 80; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, (*pRegistersFPU)[(MyMODRM & 0xf)%8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+REGS[(MyMODRM & 0xf)%8]; - (*pMyDisasm).Argument2.ArgSize = 80; - } - else { - FailDecode(pMyDisasm); - } - - } - else { - FailDecode(pMyDisasm); - } - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp1.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp1.c deleted file mode 100644 index c939bcb1..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp1.c +++ /dev/null @@ -1,297 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 80h - * ==================================================================== */ -void __bea_callspec__ G1_EbIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EbIb(pMyDisasm); - if (GV.REGOPCODE == 0) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - FillFlags(pMyDisasm, 5); - } - else if (GV.REGOPCODE == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - FillFlags(pMyDisasm, 74); - } - else if (GV.REGOPCODE == 2) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - FillFlags(pMyDisasm, 4); - } - else if (GV.REGOPCODE == 3) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - FillFlags(pMyDisasm, 93); - } - else if (GV.REGOPCODE == 4) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - FillFlags(pMyDisasm, 6); - } - else if (GV.REGOPCODE == 5) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - FillFlags(pMyDisasm, 103); - } - - else if (GV.REGOPCODE == 6) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - FillFlags(pMyDisasm, 113); - } - - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - FillFlags(pMyDisasm, 20); - (*pMyDisasm).Argument1.AccessMode = READ; - } -} - -/* ==================================================================== - * 82h - * ==================================================================== */ -void __bea_callspec__ G1_EbIb2(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - G1_EbIb(pMyDisasm); - } -} - -/* ==================================================================== - * 81h - * ==================================================================== */ -void __bea_callspec__ G1_EvIv(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EvIv(pMyDisasm); - if (GV.REGOPCODE == 0) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - FillFlags(pMyDisasm, 5); - } - else if (GV.REGOPCODE == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - FillFlags(pMyDisasm, 74); - } - else if (GV.REGOPCODE == 2) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - FillFlags(pMyDisasm, 4); - } - else if (GV.REGOPCODE == 3) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - FillFlags(pMyDisasm, 93); - } - else if (GV.REGOPCODE == 4) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - FillFlags(pMyDisasm, 6); - } - else if (GV.REGOPCODE == 5) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - FillFlags(pMyDisasm, 103); - } - - else if (GV.REGOPCODE == 6) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - FillFlags(pMyDisasm, 113); - } - - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - FillFlags(pMyDisasm, 20); - (*pMyDisasm).Argument1.AccessMode = READ; - } -} - -/* ==================================================================== - * 83h - * ==================================================================== */ -void __bea_callspec__ G1_EvIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EvIb(pMyDisasm); - if (GV.REGOPCODE == 0) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "add "); - #endif - FillFlags(pMyDisasm, 5); - } - else if (GV.REGOPCODE == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - FillFlags(pMyDisasm, 74); - } - else if (GV.REGOPCODE == 2) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "adc "); - #endif - FillFlags(pMyDisasm, 4); - } - else if (GV.REGOPCODE == 3) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - FillFlags(pMyDisasm, 93); - } - else if (GV.REGOPCODE == 4) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "and "); - #endif - FillFlags(pMyDisasm, 6); - } - else if (GV.REGOPCODE == 5) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - FillFlags(pMyDisasm, 103); - } - - else if (GV.REGOPCODE == 6) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - FillFlags(pMyDisasm, 113); - } - - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmp "); - #endif - FillFlags(pMyDisasm, 20); - (*pMyDisasm).Argument1.AccessMode = READ; - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp12.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp12.c deleted file mode 100644 index d0d90305..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp12.c +++ /dev/null @@ -1,195 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G12_(PDISASM pMyDisasm) -{ - long MyNumber; - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 2) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - else if (GV.REGOPCODE == 4) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psraw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psraw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - - } - else if (GV.REGOPCODE == 6) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllw "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - - else { - FailDecode(pMyDisasm); - } - -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp13.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp13.c deleted file mode 100644 index b01a132d..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp13.c +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G13_(PDISASM pMyDisasm) -{ - long MyNumber; - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 2) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrld "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrld "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - else if (GV.REGOPCODE == 4) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrad "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrad "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - - } - else if (GV.REGOPCODE == 6) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pslld "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pslld "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - - else { - FailDecode(pMyDisasm); - } - -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp14.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp14.c deleted file mode 100644 index 801e114e..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp14.c +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G14_(PDISASM pMyDisasm) -{ - long MyNumber; - - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 2) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - else if (GV.REGOPCODE == 3) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrldq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - FailDecode(pMyDisasm); - } - - } - else if (GV.REGOPCODE == 6) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1qword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - } - else if (GV.REGOPCODE == 7) { - if (GV.OperandSize == 16) { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHIFT_ROTATE; - GV.MemDecoration = Arg1dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pslldq "); - #endif - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_-1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Instruction.Immediat = MyNumber; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - } - else { - FailDecode(pMyDisasm); - } - - } - else { - FailDecode(pMyDisasm); - } - -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp15.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp15.c deleted file mode 100644 index 1489d0ab..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp15.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G15_(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg1multibytes; - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxsave "); - #endif - (*pMyDisasm).Argument1.ArgSize = 512; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+MMX_REG+SSE_REG; - (*pMyDisasm).Argument2.ArgSize = 512; - } - else { - FailDecode(pMyDisasm); - } - } - else if (GV.REGOPCODE == 1) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2multibytes; - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "fxrstor "); - #endif - (*pMyDisasm).Argument2.ArgSize = 512; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+MMX_REG+SSE_REG; - (*pMyDisasm).Argument1.ArgSize = 512; - } - else { - FailDecode(pMyDisasm); - } - - } - else if (GV.REGOPCODE == 2) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ldmxcsr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG1; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - FailDecode(pMyDisasm); - } - - } - else if (GV.REGOPCODE == 3) { - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg1dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stmxcsr "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - FailDecode(pMyDisasm); - } - - } - - else if (GV.REGOPCODE == 4) { - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg1multibytes; - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xsave "); - #endif - (*pMyDisasm).Argument1.ArgSize = 512; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+FPU_REG+MMX_REG+SSE_REG; - (*pMyDisasm).Argument2.ArgSize = 512; - } - else { - FailDecode(pMyDisasm); - } - } - - else if (GV.REGOPCODE == 5) { - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lfence "); - #endif - } - else { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg2multibytes; - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xrstor "); - #endif - (*pMyDisasm).Argument2.ArgSize = 512; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+FPU_REG+MMX_REG+SSE_REG; - (*pMyDisasm).Argument1.ArgSize = 512; - } - - } - else if (GV.REGOPCODE == 6) { - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mfence "); - #endif - } - else { - FailDecode(pMyDisasm); - } - } - else if (GV.REGOPCODE == 7) { - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sfence "); - #endif - } - else { - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "clflush "); - #endif - } - - } - - else { - FailDecode(pMyDisasm); - } - GV.EIP_+= GV.DECALAGE_EIP+2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp16.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp16.c deleted file mode 100644 index 58cad51a..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp16.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G16_(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "prefetchNTA "); - #endif - } - else { - FailDecode(pMyDisasm); - } - } - else if (GV.REGOPCODE == 1) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "prefetchT0 "); - #endif - } - else { - FailDecode(pMyDisasm); - } - - } - else if (GV.REGOPCODE == 2) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "prefetchT1 "); - #endif - } - else { - FailDecode(pMyDisasm); - } - - } - else if (GV.REGOPCODE == 3) { - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.MOD_!= 0x3) { - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "prefetchT2 "); - #endif - } - else { - FailDecode(pMyDisasm); - } - - } - - else { - FailDecode(pMyDisasm); - } - GV.EIP_+= GV.DECALAGE_EIP+2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp17.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp17.c deleted file mode 100644 index 0153d44f..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp17.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . - * - * @author : beaengine@gmail.com - */ - -/* ==================================================================== - * - * ==================================================================== */ -void __bea_callspec__ G17_(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 1) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blsr "); - #endif - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - GV.MemDecoration = Arg2qword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - else { - GV.MemDecoration = Arg2dword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - } - - } - else { - FailDecode(pMyDisasm); - } - } - else if (GV.REGOPCODE == 2) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blmsk "); - #endif - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - GV.MemDecoration = Arg2qword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - else { - GV.MemDecoration = Arg2dword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - } - - } - else { - FailDecode(pMyDisasm); - } - } - else if (GV.REGOPCODE == 3) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blsi "); - #endif - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - GV.MemDecoration = Arg2qword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - else { - GV.MemDecoration = Arg2dword; - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument1, pMyDisasm); - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - } - - } - else { - FailDecode(pMyDisasm); - } - } - else { - FailDecode(pMyDisasm); - } - GV.EIP_+= GV.DECALAGE_EIP + 2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp2.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp2.c deleted file mode 100644 index b1fc8105..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp2.c +++ /dev/null @@ -1,461 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0c0h - * ==================================================================== */ -void __bea_callspec__ G2_EbIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EbIb(pMyDisasm); - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 92); - } -} - - -/* ==================================================================== - * 0c1h - * ==================================================================== */ -void __bea_callspec__ G2_EvIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EvIb(pMyDisasm); - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 92); - } -} - -/* ==================================================================== - * 0d0h - * ==================================================================== */ -void __bea_callspec__ G2_Eb1(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, "1 "); - #endif - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.Immediat = 1; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 87); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 87); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 80); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 80); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 91); - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * 0d1h - * ==================================================================== */ -void __bea_callspec__ G2_Ev1(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, "1 "); - #endif - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.Immediat = 1; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 87); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 87); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 80); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 80); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 91); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 91); - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * 0d2h - * ==================================================================== */ -void __bea_callspec__ G2_EbCL(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[1]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 8; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 92); - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} - - -/* ==================================================================== - * 0d3h - * ==================================================================== */ -void __bea_callspec__ G2_EvCL(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[1]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 8; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rol "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ror "); - #endif - FillFlags(pMyDisasm, 88); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcl "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcr "); - #endif - FillFlags(pMyDisasm, 81); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shl "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shr "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sal "); - #endif - FillFlags(pMyDisasm, 92); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sar "); - #endif - FillFlags(pMyDisasm, 92); - } - GV.EIP_ += GV.DECALAGE_EIP+2; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp3.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp3.c deleted file mode 100644 index 2e2433c6..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp3.c +++ /dev/null @@ -1,257 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0f6h - * ==================================================================== */ -void __bea_callspec__ G3_Eb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - EbIb(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 104); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - EbIb(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 104); - } - else if (GV.REGOPCODE == 2) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "not "); - #endif - Eb(pMyDisasm); - FillFlags(pMyDisasm, 73); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "neg "); - #endif - Eb(pMyDisasm); - FillFlags(pMyDisasm, 71); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mul "); - #endif - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0; - FillFlags(pMyDisasm, 70); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "imul "); - #endif - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 8; - FillFlags(pMyDisasm, 38); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "div "); - #endif - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 8; - FillFlags(pMyDisasm, 31); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "idiv "); - #endif - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0; - FillFlags(pMyDisasm, 37); - } -} - -/* ==================================================================== - * 0f7h - * ==================================================================== */ -void __bea_callspec__ G3_Ev(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - EvIv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 104); - } - else if (GV.REGOPCODE == 1) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - EvIv(pMyDisasm); - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 104); - } - else if (GV.REGOPCODE == 2) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "not "); - #endif - Ev(pMyDisasm); - FillFlags(pMyDisasm, 73); - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "neg "); - #endif - Ev(pMyDisasm); - FillFlags(pMyDisasm, 71); - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mul "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - GV.MemDecoration = Arg2word; - (*pMyDisasm).Argument1.ArgSize = 16; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - FillFlags(pMyDisasm, 70); - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "imul "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - GV.MemDecoration = Arg2word; - (*pMyDisasm).Argument1.ArgSize = 16; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - FillFlags(pMyDisasm, 38); - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "div "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - GV.MemDecoration = Arg2word; - (*pMyDisasm).Argument1.ArgSize = 16; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - FillFlags(pMyDisasm, 31); - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "idiv "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - GV.MemDecoration = Arg2word; - (*pMyDisasm).Argument1.ArgSize = 16; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - FillFlags(pMyDisasm, 37); - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp4.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp4.c deleted file mode 100644 index 4e430b9b..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp4.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0feh - * ==================================================================== */ -void __bea_callspec__ G4_Eb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - Eb(pMyDisasm); - FillFlags(pMyDisasm, 40); - } - else if (GV.REGOPCODE == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - Eb(pMyDisasm); - FillFlags(pMyDisasm, 30); - } - else { - FailDecode(pMyDisasm); - } -} - diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp5.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp5.c deleted file mode 100644 index f7ad8040..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp5.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0ffh - * ==================================================================== */ -void __bea_callspec__ G5_Ev(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "inc "); - #endif - Ev(pMyDisasm); - FillFlags(pMyDisasm, 40); - } - else if (GV.REGOPCODE == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dec "); - #endif - Ev(pMyDisasm); - FillFlags(pMyDisasm, 30); - } - else if (GV.REGOPCODE == 2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = CallType; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "call "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - } - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } - else if (GV.REGOPCODE == 3) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = CallType; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lcall "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "call far "); - #endif - } - GV.MemDecoration = Arg1fword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } - else if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JmpType; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jmp "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - } - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg1qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 5) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = JmpType; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ljmp "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "jmp far "); - #endif - } - GV.MemDecoration = Arg1fword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - } - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - } - else { - GV.MemDecoration = Arg2word; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = GV.OperandSize; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } - else { - FailDecode(pMyDisasm); - } -} - diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp6.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp6.c deleted file mode 100644 index af09f7a4..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp6.c +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0f00h - * ==================================================================== */ -void __bea_callspec__ G6_(PDISASM pMyDisasm) -{ - Int32 OperandSizeOld = 0; - - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - OperandSizeOld = GV.OperandSize; - GV.OperandSize = 16; - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - - if (GV.REGOPCODE == 0) { - if ((OperandSizeOld == 64) && (GV.MOD_== 0x3)) { - GV.OperandSize = OperandSizeOld; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sldt "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 32; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 1) { - if ((OperandSizeOld == 64) && (GV.MOD_== 0x3)) { - GV.OperandSize = OperandSizeOld; - } - else { - GV.MemDecoration = Arg1word; - } - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "str "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG3; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 2) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lldt "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG1; - (*pMyDisasm).Argument1.ArgSize = 16; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 3) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ltr "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG3; - (*pMyDisasm).Argument1.ArgSize = 16; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "verr "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 5) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "verw "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.OperandSize = OperandSizeOld; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 6) { - FailDecode(pMyDisasm); - GV.OperandSize = OperandSizeOld; - } - else { - FailDecode(pMyDisasm); - GV.OperandSize = OperandSizeOld; - } -} - diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp7.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp7.c deleted file mode 100644 index 9236def2..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp7.c +++ /dev/null @@ -1,287 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0f01h - * ==================================================================== */ -void __bea_callspec__ G7_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - GV.RM_ = (*((UInt8*)(UIntPtr) (GV.EIP_+1))) & 0x7; - if (GV.REGOPCODE == 0) { - if (GV.MOD_== 0x3) { - if (GV.RM_ == 0x1) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmcall "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x2) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmlaunch "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x3) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmresume "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x4) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmxoff "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - else { - GV.MemDecoration = Arg1fword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sgdt "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 48; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else if (GV.REGOPCODE == 1) { - if (GV.MOD_== 0x3) { - if (GV.RM_ == 0x00) { - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+AGENT_SYNCHRONISATION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "monitor "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x01) { - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+AGENT_SYNCHRONISATION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mwait "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x2) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "clac "); - #endif - FillFlags(pMyDisasm,129); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - else { - GV.MemDecoration = Arg1fword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sidt "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG2; - (*pMyDisasm).Argument2.ArgSize = 48; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else if (GV.REGOPCODE == 2) { - if (GV.MOD_== 0x3) { - if (GV.RM_ == 0x0) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xgetbv "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x1) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xsetbv "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - else { - GV.MemDecoration = Arg2fword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lgdt "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 48; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else if (GV.REGOPCODE == 3) { - if (GV.MOD_== 0x3) { - if (GV.RM_ == 0x0) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmrun "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x1) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmmcall "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x2) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmload "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x3) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmsave "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x4) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stgi "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x5) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "clgi "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x6) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "skinit "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.RM_ == 0x7) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "invlpga "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - else { - GV.MemDecoration = Arg2fword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lidt "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+MEMORY_MANAGEMENT_REG+REG2; - (*pMyDisasm).Argument1.ArgSize = 48; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - - else if (GV.REGOPCODE == 4) { - GV.MemDecoration = Arg2word; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "smsw "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+CR_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - - else if (GV.REGOPCODE == 6) { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lmsw "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+CR_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else if (GV.REGOPCODE == 7) { - if (GV.MOD_== 0x3) { - if (GV.Architecture == 64) { - if (GV.RM_ == 0x0) { - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "swapgs "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - else { - if (GV.RM_ == 0x1) { - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rdtscp "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - } - } - else { - GV.MemDecoration = Arg2byte; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "invlpg "); - #endif - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else { - FailDecode(pMyDisasm); - } - - -} - diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp8.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp8.c deleted file mode 100644 index cd0447ec..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp8.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 0fbah - * ==================================================================== */ -void __bea_callspec__ G8_EvIb(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - EvIb(pMyDisasm); - if (GV.REGOPCODE == 4) { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bt "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 11); - } - else if (GV.REGOPCODE == 5) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "bts "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 11); - } - else if (GV.REGOPCODE == 6) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "btr "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 11); - } - else if (GV.REGOPCODE == 7) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "btc "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 11); - } - else { - FailDecode(pMyDisasm); - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp9.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp9.c deleted file mode 100644 index 2519c86c..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_Grp9.c +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - - -/* ==================================================================== - * 0fc7h - * ==================================================================== */ -void __bea_callspec__ G9_(PDISASM pMyDisasm) -{ - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - if (GV.REGOPCODE == 1) { - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpxchg16b "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 128; - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 23); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpxchg8b "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument1.AccessMode = READ; - FillFlags(pMyDisasm, 23); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - } - else if (GV.REGOPCODE == 6) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - if (GV.OperandSize == 16) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmclear "); - #endif - } - else if (GV.PrefRepe == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmxon "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmptrld "); - #endif - } - GV.EIP_ += GV.DECALAGE_EIP+2; - - } - else if (GV.REGOPCODE == 7) { - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmptrst "); - #endif - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_MMX.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_MMX.c deleted file mode 100644 index c59217bf..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_MMX.c +++ /dev/null @@ -1,1722 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -void __bea_callspec__ emms_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+STATE_MANAGEMENT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "emms "); - #endif - GV.EIP_++; -} - -/* ==================================================================== - * 0x 0f 7e - * ==================================================================== */ -void __bea_callspec__ movd_EP(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+DATA_TRANSFER; - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg1dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movd "); - #endif - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else { - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg1dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movd "); - #endif - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } -} - - -/* ==================================================================== - * 0x 0f 6e - * ==================================================================== */ -void __bea_callspec__ movd_PE(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+DATA_TRANSFER; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movd "); - #endif - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - else { - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movd "); - #endif - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } -} - - - -/* ==================================================================== - * 0x 0f 6f - * ==================================================================== */ -void __bea_callspec__ movq_PQ(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+DATA_TRANSFER; - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movdqu "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movdqa "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 7f - * ==================================================================== */ -void __bea_callspec__ movq_QP(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+DATA_TRANSFER; - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movdqu "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movdqa "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - GV.MMX_ = 1; - ExGx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d6 - * ==================================================================== */ -void __bea_callspec__ movq_WV(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+DATA_TRANSFER; - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movdq2q "); - #endif - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq2dq "); - #endif - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movq "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 1c - * ==================================================================== */ -void __bea_callspec__ pabsb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 38 1e - * ==================================================================== */ -void __bea_callspec__ pabsd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsd "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 38 1d - * ==================================================================== */ -void __bea_callspec__ pabsw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pabsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 63 - * ==================================================================== */ -void __bea_callspec__ packsswb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packsswb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packsswb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 6b - * ==================================================================== */ -void __bea_callspec__ packssdw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packssdw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packssdw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 67 - * ==================================================================== */ -void __bea_callspec__ packuswb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packuswb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packuswb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f fc - * ==================================================================== */ -void __bea_callspec__ paddb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f fd - * ==================================================================== */ -void __bea_callspec__ paddw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f fe - * ==================================================================== */ -void __bea_callspec__ paddd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddd "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f ec - * ==================================================================== */ -void __bea_callspec__ paddsb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddsb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddsb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f ed - * ==================================================================== */ -void __bea_callspec__ paddsw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f dc - * ==================================================================== */ -void __bea_callspec__ paddusb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddusb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddusb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f dd - * ==================================================================== */ -void __bea_callspec__ paddusw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddusw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddusw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f db - * ==================================================================== */ -void __bea_callspec__ pand_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+LOGICAL_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pand "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pand "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} -/* ==================================================================== - * 0x 0f df - * ==================================================================== */ -void __bea_callspec__ pandn_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+LOGICAL_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pandn "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pandn "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 74 - * ==================================================================== */ -void __bea_callspec__ pcmpeqb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 75 - * ==================================================================== */ -void __bea_callspec__ pcmpeqw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 76 - * ==================================================================== */ -void __bea_callspec__ pcmpeqd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 64 - * ==================================================================== */ -void __bea_callspec__ pcmpgtb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 65 - * ==================================================================== */ -void __bea_callspec__ pcmpgtw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 66 - * ==================================================================== */ -void __bea_callspec__ pcmpgtd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+COMPARISON_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f e5 - * ==================================================================== */ -void __bea_callspec__ pmulhw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d5 - * ==================================================================== */ -void __bea_callspec__ pmullw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmullw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmullw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f5 - * ==================================================================== */ -void __bea_callspec__ pmaddwd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaddwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaddwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f eb - * ==================================================================== */ -void __bea_callspec__ por_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+LOGICAL_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "por "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "por "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f1 - * ==================================================================== */ -void __bea_callspec__ psllw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f2 - * ==================================================================== */ -void __bea_callspec__ pslld_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pslld "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pslld "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f3 - * ==================================================================== */ -void __bea_callspec__ psllq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psllq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d1 - * ==================================================================== */ -void __bea_callspec__ psrlw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d2 - * ==================================================================== */ -void __bea_callspec__ psrld_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrld "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrld "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d3 - * ==================================================================== */ -void __bea_callspec__ psrlq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrlq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f e1 - * ==================================================================== */ -void __bea_callspec__ psraw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psraw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psraw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f e2 - * ==================================================================== */ -void __bea_callspec__ psrad_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+SHIFT_ROTATE; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrad "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psrad "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f8 - * ==================================================================== */ -void __bea_callspec__ psubb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f f9 - * ==================================================================== */ -void __bea_callspec__ psubw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f fa - * ==================================================================== */ -void __bea_callspec__ psubd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f e8 - * ==================================================================== */ -void __bea_callspec__ psubsb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubsb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubsb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f e9 - * ==================================================================== */ -void __bea_callspec__ psubsw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubsw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubsw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d8 - * ==================================================================== */ -void __bea_callspec__ psubusb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubusb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubusb "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f d9 - * ==================================================================== */ -void __bea_callspec__ psubusw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubusw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubusw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 68 - * ==================================================================== */ -void __bea_callspec__ punpckhbw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhbw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhbw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 69 - * ==================================================================== */ -void __bea_callspec__ punpckhwd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 6a - * ==================================================================== */ -void __bea_callspec__ punpckhdq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhdq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhdq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 60 - * ==================================================================== */ -void __bea_callspec__ punpcklbw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpcklbw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpcklbw "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 61 - * ==================================================================== */ -void __bea_callspec__ punpcklwd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpcklwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpcklwd "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 62 - * ==================================================================== */ -void __bea_callspec__ punpckldq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+CONVERSION_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckldq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckldq "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - -/* ==================================================================== - * 0x 0f ef - * ==================================================================== */ -void __bea_callspec__ pxor_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = MMX_INSTRUCTION+LOGICAL_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pxor "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pxor "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_N_Z.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_N_Z.c deleted file mode 100644 index df572ed2..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_N_Z.c +++ /dev/null @@ -1,3692 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * 90h - * ==================================================================== */ -void __bea_callspec__ nop_(PDISASM pMyDisasm) -{ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pause "); - #endif - GV.EIP_++; - } - else { - if (GV.REX.B_ == 1) { - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[0+8]); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0+8]); - #endif - - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0+8]); - #endif - - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - - } - else { - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "nop "); - #endif - GV.EIP_++; - } - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ nop_Ev(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "nop "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - } - else { - GV.MemDecoration = Arg2word; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument2.AccessMode = 0; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ hint_nop(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "hint_nop "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - } - else { - GV.MemDecoration = Arg2word; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; -} - -/* ======================================= - * 08h - * ======================================= */ -void __bea_callspec__ or_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,74); -} - -/* ======================================= - * 09h - * ======================================= */ -void __bea_callspec__ or_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,74); -} - -/* ======================================= - * 0ah - * ======================================= */ -void __bea_callspec__ or_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,74); -} - -/* ======================================= - * 0bh - * ======================================= */ -void __bea_callspec__ or_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,74); -} - -/* ======================================= - * 0ch - * ======================================= */ -void __bea_callspec__ or_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,74); -} - -/* ======================================= - * 0dh - * ======================================= */ -void __bea_callspec__ or_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "or "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,74); -} - - -/* ======================================= - * 06eh - * ======================================= */ -void __bea_callspec__ outsb_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "outsb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_++; - FillFlags(pMyDisasm, 76); -} - -/* ======================================= - * 06fh - * ======================================= */ -void __bea_callspec__ outsw_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - if (GV.OperandSize >= 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "outsd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 32; - GV.EIP_++; - FillFlags(pMyDisasm, 76); - } - - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "outsw "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG6; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; - FillFlags(pMyDisasm, 76); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ out_IbAL(PDISASM pMyDisasm) -{ - long MyNumber; - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "out "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.Immediat = MyNumber; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ += 2; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ out_Ib_eAX(PDISASM pMyDisasm) -{ - long MyNumber; - - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "out "); - #endif - if (!Security(2, pMyDisasm)) return; - GV.ImmediatSize = 8; - MyNumber = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic,"%.2X",(Int64) MyNumber); - #endif - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.Immediat = MyNumber; - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgSize = 16; - } - GV.EIP_ += 2; -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ out_DXAL(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "out "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers8Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgSize = 8; - GV.EIP_ ++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ out_DXeAX(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+InOutINSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "out "); - #endif - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2]); - #endif - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgSize = 16; - } - GV.EIP_ ++; -} - -/* ======================================= - * 8fh - * ======================================= */ -void __bea_callspec__ pop_Ev(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - GV.REGOPCODE = ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 3) & 0x7; - if (GV.REGOPCODE == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - GV.MemDecoration = Arg1qword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg1dword; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } - else { - GV.MemDecoration = Arg1word; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * 58h - * ======================================= */ -void __bea_callspec__ pop_eax(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 59h - * ======================================= */ -void __bea_callspec__ pop_ecx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[1+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[1+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5ah - * ======================================= */ -void __bea_callspec__ pop_edx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[2+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[2+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5bh - * ======================================= */ -void __bea_callspec__ pop_ebx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[3+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[3+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5ch - * ======================================= */ -void __bea_callspec__ pop_esp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[4+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[4+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5dh - * ======================================= */ -void __bea_callspec__ pop_ebp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[5+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[5+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5eh - * ======================================= */ -void __bea_callspec__ pop_esi(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[6+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[6+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 5fh - * ======================================= */ -void __bea_callspec__ pop_edi(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[7+0+8]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+8]; - } - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[7+0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ pop_es(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[0]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[0]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ pop_ss(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[2]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[2]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ pop_ds(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[3]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[3]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ pop_fs(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[4]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[4]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ pop_gs(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pop "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[5]); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[5]; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * 9dh - * ======================================= */ -void __bea_callspec__ popfd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - - if (GV.Architecture == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popfq "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popfd "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popf "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } -} - -/* ======================================= - * 9dh - * ======================================= */ -void __bea_callspec__ popad_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popad "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2+REG3+REG4+REG5+REG6+REG7; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popa "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2+REG3+REG4+REG5+REG6+REG7; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_es(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_ss(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[2]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_ds(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[3]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[3]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_fs(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[4]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[4]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_gs(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[5]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[5]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ push_cs(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument1.ArgMnemonic, RegistersSEG[1]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SEGMENT_REG+REGS[1]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - GV.EIP_++; - } -} - - - -/* ======================================= - * 50h - * ======================================= */ -void __bea_callspec__ push_eax(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[0]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 51h - * ======================================= */ -void __bea_callspec__ push_ecx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[1+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[1+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[1+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[1+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[1]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 52h - * ======================================= */ -void __bea_callspec__ push_edx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[2+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[2+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[2+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[2]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 53h - * ======================================= */ -void __bea_callspec__ push_ebx(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[3+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[3+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[3+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[3+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[3]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 54h - * ======================================= */ -void __bea_callspec__ push_esp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[4+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[4+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[4+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[4+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[4]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 55h - * ======================================= */ -void __bea_callspec__ push_ebp(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[5+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[5+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[5+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[5+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[5]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 56h - * ======================================= */ -void __bea_callspec__ push_esi(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[6+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[6+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[6+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[6+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[6]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - -/* ======================================= - * 57h - * ======================================= */ -void __bea_callspec__ push_edi(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (GV.REX.B_ == 0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[7+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[7+0+8]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7+8]; - } - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[7+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy((char*) &(*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[7+0]); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REGS[7]; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgSize = 16; - } - } - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; -} - - -/* ======================================= - * 68h - * ======================================= */ -void __bea_callspec__ push_Iv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (GV.Architecture == 64) { - if (!Security(5, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.8X",(Int64)*((UInt32*)(UIntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 32; - (*pMyDisasm).Instruction.Immediat = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_ += 5; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } - else if (GV.OperandSize == 32) { - if (!Security(5, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.8X",(Int64)*((UInt32*)(UIntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 32; - (*pMyDisasm).Instruction.Immediat = *((UInt32*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_ += 5; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } - else { - if (!Security(3, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.4X",(Int64)*((UInt16*)(UIntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 16; - (*pMyDisasm).Instruction.Immediat = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_ += 3; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - } -} - -/* ======================================= - * 6ah - * ======================================= */ -void __bea_callspec__ push_Ib(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "push "); - #endif - if (!Security(1, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument2.ArgMnemonic,"%.8X",(Int64)*((Int8*)(IntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 8; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_ += 2; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Argument2.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = REGISTER_TYPE+GENERAL_REG+REG4; - -} - - -/* ======================================= - * 9ch - * ======================================= */ -void __bea_callspec__ pushfd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - - if (GV.Architecture == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pushfq "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pushfd "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pushf "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - FillFlags(pMyDisasm, 78); - } -} - - -/* ======================================= - * 60h - * ======================================= */ -void __bea_callspec__ pushad_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - - if (GV.Architecture == 64) { - FailDecode(pMyDisasm); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pushad "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2+REG3+REG4+REG5+REG6+REG7; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pusha "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2+REG3+REG4+REG5+REG6+REG7; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; - } -} - -/* ======================================= - * 0c2h - * ======================================= */ -void __bea_callspec__ retn_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = RetType; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "retn "); - #endif - if (!Security(3, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic,"%.4X",(Int64)*((UInt16*)(UIntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 16; - (*pMyDisasm).Instruction.Immediat = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_+=3; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; -} - -/* ======================================= - * 0c3h - * ======================================= */ -void __bea_callspec__ ret_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = RetType; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ret "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ retf_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = RetType; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lret "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "retf "); - #endif - } - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "retf "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG4; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ retf_Iw(PDISASM pMyDisasm) -{ - int i = 0; - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+CONTROL_TRANSFER; - (*pMyDisasm).Instruction.BranchType = RetType; - if (GV.SYNTAX_ == ATSyntax) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lret "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "retf "); - #endif - } - if (!Security(3, pMyDisasm)) return; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) &(*pMyDisasm).Argument1.ArgMnemonic+i,"%.4X",(Int64)*((UInt16*)(UIntPtr) (GV.EIP_+1))); - #endif - GV.ImmediatSize = 16; - (*pMyDisasm).Instruction.Immediat = *((UInt16*)(UIntPtr) (GV.EIP_+1)); - GV.EIP_+=3; - (*pMyDisasm).Argument1.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG4; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ rdtsc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rdtsc "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 32; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ rdmsr_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rdmsr "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 32; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ rdpmc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rdpmc "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG2; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument2.ArgSize = 32; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ rsm_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rsm "); - #endif - GV.EIP_++; - FillFlags(pMyDisasm, 89); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ sysenter_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sysenter "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ sysexit_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sysexit "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ sahf_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sahf "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 8; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ salc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = UNDOCUMENTED_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "salc "); - #endif - GV.EIP_++; -} - - -/* ======================================= - * 0ach - * ======================================= */ -void __bea_callspec__ scasb_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "scasb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 94); -} - -/* ======================================= - * 0adh - * ======================================= */ -void __bea_callspec__ scas_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "scasq "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 94); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "scasd "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 94); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "scasw "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument1.AccessMode = READ; - (*pMyDisasm).Argument2.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument2.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 94); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ stc_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stc "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 98); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ sti_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sti "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 100); -} - - -/* ======================================= - * 0aah - * ======================================= */ -void __bea_callspec__ stos_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stosb "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 8; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 101); -} - -/* ======================================= - * 0abh - * ======================================= */ -void __bea_callspec__ stosw_(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.RepnePrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepnePrefix = InUsePrefix; - } - if ((*pMyDisasm).Prefix.RepPrefix == SuperfluousPrefix) { - (*pMyDisasm).Prefix.RepPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+STRING_INSTRUCTION; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stosq "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 64; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 101); - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stosd "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 32; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 101); - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "stosw "); - #endif - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgSize = 16; - (*pMyDisasm).Argument1.ArgType = MEMORY_TYPE; - (*pMyDisasm).Argument1.Memory.BaseRegister = REG7; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Instruction.ImplicitModifiedRegs = GENERAL_REG+REG7; - GV.EIP_++; - FillFlags(pMyDisasm, 101); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ syscall_(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION+CONTROL_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "syscall "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG1+REG11; - (*pMyDisasm).Argument1.ArgSize = 64; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ sysret_(PDISASM pMyDisasm) -{ - if (GV.Architecture == 64) { - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sysret "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1+REG11; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else { - FailDecode(pMyDisasm); - } -} - - - -/* ======================================= - * 18h - * ======================================= */ -void __bea_callspec__ sbb_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 19h - * ======================================= */ -void __bea_callspec__ sbb_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 1ah - * ======================================= */ -void __bea_callspec__ sbb_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 1bh - * ======================================= */ -void __bea_callspec__ sbb_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 1ch - * ======================================= */ -void __bea_callspec__ sbb_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 1dh - * ======================================= */ -void __bea_callspec__ sbb_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sbb "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,93); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ seto_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "seto "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f91h - * ======================================= */ -void __bea_callspec__ setno_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setno "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setb "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setnb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setnb "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ sete_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sete "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setne_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setne "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setbe_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setbe "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setnbe_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setnbe "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ sets_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sets "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setns_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setns "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setp_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setp "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setnp_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setnp "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setge_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setnl "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setnge_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setl "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setle_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setle "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - -/* ======================================= - * 0f90h - * ======================================= */ -void __bea_callspec__ setnle_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "setnle "); - #endif - GV.MemDecoration = Arg1byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 32; - GV.EIP_+= GV.DECALAGE_EIP+2; - FillFlags(pMyDisasm,95); -} - - -/* ======================================= - * 0fa4h - * ======================================= */ -void __bea_callspec__ shld_EvGvIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shld "); - #endif - GV.ImmediatSize = 8; - EvGv(pMyDisasm); - GV.EIP_+= 1; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.8X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - FillFlags(pMyDisasm, 97); -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ shld_EvGvCL(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shld "); - #endif - EvGv(pMyDisasm); - GV.third_arg = 2; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument3.ArgMnemonic, Registers8Bits[1]); - #endif - (*pMyDisasm).Argument3.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument3.ArgSize = 8; - FillFlags(pMyDisasm, 97); -} - -/* ======================================= - * 0fach - * ======================================= */ -void __bea_callspec__ shrd_EvGvIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shrd "); - #endif - GV.ImmediatSize = 8; - EvGv(pMyDisasm); - GV.EIP_+= 1; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.8X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - FillFlags(pMyDisasm, 97); -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ shrd_EvGvCL(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+SHIFT_ROTATE; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shrd "); - #endif - EvGv(pMyDisasm); - GV.third_arg = 2; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument3.ArgMnemonic, Registers8Bits[1]); - #endif - (*pMyDisasm).Argument3.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - (*pMyDisasm).Argument3.ArgSize = 8; - FillFlags(pMyDisasm, 97); -} - - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ std_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+FLAG_CONTROL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "std "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+SPECIAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 1; - FillFlags(pMyDisasm, 99); -} - - -/* ======================================= - * 28h - * ======================================= */ -void __bea_callspec__ sub_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 29h - * ======================================= */ -void __bea_callspec__ sub_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 2ah - * ======================================= */ -void __bea_callspec__ sub_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 2bh - * ======================================= */ -void __bea_callspec__ sub_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 2ch - * ======================================= */ -void __bea_callspec__ sub_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 2dh - * ======================================= */ -void __bea_callspec__ sub_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sub "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,103); -} - -/* ======================================= - * 84h - * ======================================= */ -void __bea_callspec__ test_EbGb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - EbGb(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * 85h - * ======================================= */ -void __bea_callspec__ test_EvGv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - EvGv(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * 86h - * ======================================= */ -void __bea_callspec__ test_GbEb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GbEb(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * 87h - * ======================================= */ -void __bea_callspec__ test_GvEv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - GvEv(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * 88h - * ======================================= */ -void __bea_callspec__ test_ALIb(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - ALIb(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * 89h - * ======================================= */ -void __bea_callspec__ test_eAX_Iv(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+BIT_UInt8; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "test "); - #endif - (*pMyDisasm).Argument1.AccessMode = READ; - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,104); -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ ud2_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ud2 "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ vmread_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmread "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - } - EvGv(pMyDisasm); - if (GV.Architecture == 64) { - GV.OperandSize = 32; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ vmwrite_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = VM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vmwrite "); - #endif - if (GV.Architecture == 64) { - GV.OperandSize = 64; - } - GvEv(pMyDisasm); - if (GV.Architecture == 64) { - GV.OperandSize = 32; - } -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ wbinvd_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "wbinvd "); - #endif - GV.EIP_++; -} - -/* ======================================= - * 9Bh - * ======================================= */ -void __bea_callspec__ wait_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = FPU_INSTRUCTION+FPUCONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "wait "); - #endif - GV.EIP_++; -} - -/* ======================================= - * - * ======================================= */ -void __bea_callspec__ wrmsr_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SYSTEM_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "wrmsr "); - #endif - GV.EIP_++; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG0+REG1+REG2; - (*pMyDisasm).Argument2.ArgSize = 32; -} - - -/* ======================================= - * 0fc0h - * ======================================= */ -void __bea_callspec__ xadd_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xadd "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,110); -} - -/* ======================================= - * 0fc1h - * ======================================= */ -void __bea_callspec__ xadd_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xadd "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,110); -} - -/* ======================================= - * 91h - * ======================================= */ -void __bea_callspec__ xchg_ecx(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG1; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[1+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[1]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[1+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[1]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[1+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[1]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 92h - * ======================================= */ -void __bea_callspec__ xchg_edx(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG2; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[2+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[2]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[2+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[2]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[2]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 93h - * ======================================= */ -void __bea_callspec__ xchg_ebx(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[3+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[3]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[3+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[3]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[3+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[3]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 94h - * ======================================= */ -void __bea_callspec__ xchg_esp(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG4; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[4+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[4]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[4+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[4]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[4+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[4]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 95h - * ======================================= */ -void __bea_callspec__ xchg_ebp(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG5; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[5+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[5]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[5+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[5]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[5+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[5]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 96h - * ======================================= */ -void __bea_callspec__ xchg_esi(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG6; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[6+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[6]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[6+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[6]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[6+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[6]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - - -/* ======================================= - * 97h - * ======================================= */ -void __bea_callspec__ xchg_edi(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG7; - if (GV.OperandSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers64Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[7+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers64Bits[7]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 64; - (*pMyDisasm).Argument2.ArgSize = 64; - } - else if (GV.OperandSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers32Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[7+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers32Bits[7]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 32; - (*pMyDisasm).Argument2.ArgSize = 32; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument1.ArgMnemonic, Registers16Bits[0]); - #endif - if (GV.REX.B_ == 1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[7+8]); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Argument2.ArgMnemonic, Registers16Bits[7]); - #endif - } - GV.EIP_++; - (*pMyDisasm).Argument2.AccessMode = WRITE; - (*pMyDisasm).Argument1.ArgSize = 16; - (*pMyDisasm).Argument2.ArgSize = 16; - } -} - -/* ======================================= - * 0d7h - * ======================================= */ -void __bea_callspec__ xlat_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+MISCELLANEOUS_INSTRUCTION; - if (GV.AddressSize == 64) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xlatb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - (*pMyDisasm).Argument2.ArgSize = 64; - GV.EIP_++; - } - else if (GV.AddressSize == 32) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xlatb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - (*pMyDisasm).Argument2.ArgSize = 32; - GV.EIP_++; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xlatb "); - #endif - (*pMyDisasm).Argument1.ArgType = REGISTER_TYPE+GENERAL_REG+REG0; - (*pMyDisasm).Argument1.ArgSize = 8; - (*pMyDisasm).Argument2.ArgType = REGISTER_TYPE+GENERAL_REG+REG3; - (*pMyDisasm).Argument2.ArgSize = 16; - GV.EIP_++; - } -} - - -/* ======================================= - * 30h - * ======================================= */ -void __bea_callspec__ xor_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,113); -} - -/* ======================================= - * 31h - * ======================================= */ -void __bea_callspec__ xor_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,113); -} - -/* ======================================= - * 32h - * ======================================= */ -void __bea_callspec__ xor_GbEb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - GbEb(pMyDisasm); - FillFlags(pMyDisasm,113); -} - -/* ======================================= - * 33h - * ======================================= */ -void __bea_callspec__ xor_GvEv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,113); -} - -/* ======================================= - * 34h - * ======================================= */ -void __bea_callspec__ xor_ALIb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - ALIb(pMyDisasm); - FillFlags(pMyDisasm,113); -} - -/* ======================================= - * 35h - * ======================================= */ -void __bea_callspec__ xor_eAX_Iv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xor "); - #endif - eAX_Iv(pMyDisasm); - FillFlags(pMyDisasm,113); -} - - -/* ======================================= - * 86h - * ======================================= */ -void __bea_callspec__ xchg_EbGb(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - EbGb(pMyDisasm); - FillFlags(pMyDisasm,113); - (*pMyDisasm).Argument2.AccessMode = WRITE; -} - -/* ======================================= - * 87h - * ======================================= */ -void __bea_callspec__ xchg_EvGv(PDISASM pMyDisasm) -{ - if ((*pMyDisasm).Prefix.LockPrefix == InvalidPrefix) { - (*pMyDisasm).Prefix.LockPrefix = InUsePrefix; - } - (*pMyDisasm).Instruction.Category = GENERAL_PURPOSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xchg "); - #endif - EvGv(pMyDisasm); - FillFlags(pMyDisasm,113); - (*pMyDisasm).Argument2.AccessMode = WRITE; -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_SSE.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_SSE.c deleted file mode 100644 index 9cb0f557..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_SSE.c +++ /dev/null @@ -1,5565 +0,0 @@ -/* - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . - * - * @author : beaengine@gmail.com - -/* ==================================================================== - * 0x 0f 58 - * ==================================================================== */ -void __bea_callspec__ addps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddsd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3qword; - GV.SSE_ = 0; - - /* FillFlags(pMyDisasm,125); */ - - } - else { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddss "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3dword; - GV.SSE_ = 0; - - - /* FillFlags(pMyDisasm,125); */ - - } - else { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddpd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128d_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256d_ymm; - GV.AVX_ = 0; - - } - - /* FillFlags(pMyDisasm,125); */ - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddps "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } -} - -/* ==================================================================== - * 0x 0f d0 - * ==================================================================== */ -void __bea_callspec__ addsubpd_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+SIMD_FP_PACKED; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddsubps "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - /* FillFlags(pMyDisasm,125); */ - - } - else { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_PACKED; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addsubps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - (*pMyDisasm).Argument2.ArgSize = 128; - } - } - - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+SIMD_FP_PACKED; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vaddsubpd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128d_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256d_ymm; - GV.AVX_ = 0; - - } - - /* FillFlags(pMyDisasm,125); */ - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_PACKED; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "addsubpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - (*pMyDisasm).Argument2.ArgSize = 128; - } - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 55 - * ==================================================================== */ -void __bea_callspec__ andnps_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vandnpd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128d_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256d_ymm; - GV.AVX_ = 0; - - } - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "andnpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vandnps "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - - } - else { - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "andnps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } -} - - -/* ==================================================================== - * 0x 0f 54 - * ==================================================================== */ -void __bea_callspec__ andps_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vandpd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128d_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256d_ymm; - GV.AVX_ = 0; - - } - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "andpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } - else { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vandps "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.OperandSize = 64; - } - } - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - - } - else { - - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "andps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - } -} - - -/* ==================================================================== - * 0x 0f 3a 0d - * ==================================================================== */ -void __bea_callspec__ blendpd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vblendpd "); - #endif - - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.MemDecoration = Arg2_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GxEx(pMyDisasm); - GV.MemDecoration = Arg2_m256_ymm; - GV.AVX_ = 0; - - } - - GV.ImmediatSize = 8; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blendpd "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - } - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 0c - * ==================================================================== */ -void __bea_callspec__ blendps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vblendps "); - #endif - - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.MemDecoration = Arg2_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GxEx(pMyDisasm); - GV.MemDecoration = Arg2_m256_ymm; - GV.AVX_ = 0; - - } - - GV.ImmediatSize = 8; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blendps "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - } - - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 15 - * ==================================================================== */ -void __bea_callspec__ blendvpd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vblendvpd "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.ERROR_OPCODE = UD_; - } - } - UInt8 Imm8; - if (GV.VEX.L == 0) { - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - Imm8 = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - fillRegister((Imm8 >> 4) & 0xF, &(*pMyDisasm).Argument4, pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - Imm8 = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - fillRegister((Imm8 >> 4) & 0xF, &(*pMyDisasm).Argument4, pMyDisasm); - GV.AVX_ = 0; - - } - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blendvpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - (*pMyDisasm).Argument3.ArgType = REGISTER_TYPE + SSE_REG + REG0; - (*pMyDisasm).Argument3.ArgSize = 128; - } - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 38 14 - * ==================================================================== */ -void __bea_callspec__ blendvps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vblendvps "); - #endif - - if (GV.VEX.opcode == 0xc4) { - /* using VEX3Bytes */ - if (GV.REX.W_ == 0x1) { - GV.ERROR_OPCODE = UD_; - } - } - UInt8 Imm8; - if (GV.VEX.L == 0) { - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - Imm8 = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - fillRegister((Imm8 >> 4) & 0xF, &(*pMyDisasm).Argument4, pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - Imm8 = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - fillRegister((Imm8 >> 4) & 0xF, &(*pMyDisasm).Argument4, pMyDisasm); - GV.AVX_ = 0; - - } - - } - else { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_BLENDING_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "blendvps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - (*pMyDisasm).Argument3.ArgType = REGISTER_TYPE + SSE_REG + REG0; - (*pMyDisasm).Argument3.ArgSize = 128; - } - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f c2 - * ==================================================================== */ -void __bea_callspec__ cmpps_VW(PDISASM pMyDisasm) -{ - - /* ========= 0xf2 */ - GV.ImmediatSize = 8; - if (GV.PrefRepne == 1) { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + COMPARISON_INSTRUCTION; - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vcmpsd "); - #endif*/ - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3qword; - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument4.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument4.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x1F; - - char pseudoOpcodes[0x20][16] = { - "vcmpeqsd ", - "vcmpltsd ", - "vcmplesd ", - "vcmpunordsd ", - "vcmpneqsd ", - "vcmpnltsd ", - "vcmpnlesd ", - "vcmpordsd ", - "vcmpeq_uqsd ", - "vcmpngesd ", - "vcmpngtsd ", - "vcmpfalsesd ", - "vcmpneq_oqsd ", - "vcmpgesd ", - "vcmpgtsd ", - "vcmptruesd ", - "vcmpeq_ossd ", - "vcmplt_oqsd ", - "vcmple_oqsd ", - "vcmpunord_ssd ", - "vcmpneq_ussd ", - "vcmpnlt_uqsd ", - "vcmpnle_uqsd ", - "vcmpord_ssd ", - "vcmpeq_ussd ", - "vcmpnge_uqsd ", - "vcmpngt_uqsd ", - "vcmpfalse_ossd ", - "vcmpneq_ossd ", - "vcmpge_oqsd ", - "vcmpgt_oqsd ", - "vcmptrue_ussd " - }; - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, pseudoOpcodes[Imm8]); - #endif - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsd "); - #endif*/ - - - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x7; - - if (Imm8 == 0x0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpeqsd "); - #endif - } - else if (Imm8 == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpltsd "); - #endif - } - else if (Imm8 == 0x2) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmplesd "); - #endif - } - else if (Imm8 == 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpunordsd "); - #endif - } - else if (Imm8 == 0x4) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpneqsd "); - #endif - } - else if (Imm8 == 0x5) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnltsd "); - #endif - } - else if (Imm8 == 0x6) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnlesd "); - #endif - } - else if (Imm8 == 0x7) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpordsd "); - #endif - } - } - - - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + COMPARISON_INSTRUCTION; - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vcmpss "); - #endif*/ - - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3dword; - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument4.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument4.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x1F; - - char pseudoOpcodes[0x20][16] = { - "vcmpeqss ", - "vcmpltss ", - "vcmpless ", - "vcmpunordss ", - "vcmpneqss ", - "vcmpnltss ", - "vcmpnless ", - "vcmpordss ", - "vcmpeq_uqss ", - "vcmpngess ", - "vcmpngtss ", - "vcmpfalsess ", - "vcmpneq_oqss ", - "vcmpgess ", - "vcmpgtss ", - "vcmptruess ", - "vcmpeq_osss ", - "vcmplt_oqss ", - "vcmple_oqss ", - "vcmpunord_sss ", - "vcmpneq_usss ", - "vcmpnlt_uqss ", - "vcmpnle_uqss ", - "vcmpord_sss ", - "vcmpeq_usss ", - "vcmpnge_uqss ", - "vcmpngt_uqss ", - "vcmpfalse_osss ", - "vcmpneq_osss ", - "vcmpge_oqss", - "vcmpgt_oqss ", - "vcmptrue_usss " - }; - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, pseudoOpcodes[Imm8]); - #endif - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpsd "); - #endif*/ - - - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x7; - - if (Imm8 == 0x0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpeqss "); - #endif - } - else if (Imm8 == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpltss "); - #endif - } - else if (Imm8 == 0x2) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpless "); - #endif - } - else if (Imm8 == 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpunordss "); - #endif - } - else if (Imm8 == 0x4) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpneqss "); - #endif - } - else if (Imm8 == 0x5) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnltss "); - #endif - } - else if (Imm8 == 0x6) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnless "); - #endif - } - else if (Imm8 == 0x7) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpordsd "); - #endif - } - } - - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + COMPARISON_INSTRUCTION; - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vcmppd "); - #endif*/ - - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument4.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument4.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x1F; - - char pseudoOpcodes[0x20][16] = { - "vcmpeqpd ", - "vcmpltpd ", - "vcmplepd ", - "vcmpunordpd ", - "vcmpneqpd ", - "vcmpnltpd ", - "vcmpnlepd ", - "vcmpordpd ", - "vcmpeq_uqpd ", - "vcmpngepd ", - "vcmpngtpd ", - "vcmpfalsepd ", - "vcmpneq_oqpd ", - "vcmpgepd ", - "vcmpgtpd ", - "vcmptruepd ", - "vcmpeq_ospd ", - "vcmplt_oqpd ", - "vcmple_oqpd ", - "vcmpunord_spd ", - "vcmpneq_uspd ", - "vcmpnlt_uqpd ", - "vcmpnle_uqpd ", - "vcmpord_spd ", - "vcmpeq_uspd ", - "vcmpnge_uqpd ", - "vcmpngt_uqpd ", - "vcmpfalse_ospd ", - "vcmpneq_ospd ", - "vcmpge_oqpd ", - "vcmpgt_oqpd ", - "vcmptrue_uspd " - }; - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, pseudoOpcodes[Imm8]); - #endif - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128d_xmm; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmppd "); - #endif*/ - - - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x7; - - if (Imm8 == 0x0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpeqpd "); - #endif - } - else if (Imm8 == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpltpd "); - #endif - } - else if (Imm8 == 0x2) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmplepd "); - #endif - } - else if (Imm8 == 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpunordpd "); - #endif - } - else if (Imm8 == 0x4) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpneqpd "); - #endif - } - else if (Imm8 == 0x5) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnltpd "); - #endif - } - else if (Imm8 == 0x6) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnlepd "); - #endif - } - else if (Imm8 == 0x7) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpordpd "); - #endif - } - } - } - else { - - - if (GV.VEX.state == InUsePrefix) { - (*pMyDisasm).Instruction.Category = AVX_INSTRUCTION + COMPARISON_INSTRUCTION; - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "vcmpps "); - #endif*/ - - if (GV.VEX.L == 0) { - GV.SSE_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m128_xmm; - GV.SSE_ = 0; - } - else { - GV.AVX_ = 1; - GyEy(pMyDisasm); - fillRegister(~GV.VEX.vvvv & 0xF, &(*pMyDisasm).Argument2, pMyDisasm); - GV.MemDecoration = Arg3_m256_ymm; - GV.AVX_ = 0; - - } - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument4.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument4.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x1F; - - char pseudoOpcodes[0x20][16] = { - "vcmpeqps ", - "vcmpltps ", - "vcmpleps ", - "vcmpunordps ", - "vcmpneqps ", - "vcmpnltps ", - "vcmpnleps ", - "vcmpordps ", - "vcmpeq_uqps ", - "vcmpngeps ", - "vcmpngtps ", - "vcmpfalseps ", - "vcmpneq_oqps ", - "vcmpgeps ", - "vcmpgtps ", - "vcmptrueps ", - "vcmpeq_osps ", - "vcmplt_oqps ", - "vcmple_oqps ", - "vcmpunord_sps ", - "vcmpneq_usps ", - "vcmpnlt_uqps ", - "vcmpnle_uqps ", - "vcmpord_sps ", - "vcmpeq_usps ", - "vcmpnge_uqps ", - "vcmpngt_uqps ", - "vcmpfalse_osps ", - "vcmpneq_osps ", - "vcmpge_oqps ", - "vcmpgt_oqps ", - "vcmptrue_usps " - }; - - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, pseudoOpcodes[Imm8]); - #endif - - /* FillFlags(pMyDisasm,125); */ - - } - else { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2_m128_xmm; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - - /* use pseudo-opcode instead */ - /*#ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmppd "); - #endif*/ - - - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - UInt8 Imm8; - Imm8 = (*pMyDisasm).Instruction.Immediat & 0x7; - - if (Imm8 == 0x0) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpeqps "); - #endif - } - else if (Imm8 == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpltps "); - #endif - } - else if (Imm8 == 0x2) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpleps "); - #endif - } - else if (Imm8 == 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpunordps "); - #endif - } - else if (Imm8 == 0x4) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpneqps "); - #endif - } - else if (Imm8 == 0x5) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnltps "); - #endif - } - else if (Imm8 == 0x6) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpnleps "); - #endif - } - else if (Imm8 == 0x7) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cmpordps "); - #endif - } - } - } - - -} - - -/* ==================================================================== - * 0x 0f 38 f0 - * ==================================================================== */ -void __bea_callspec__ crc32_GvEb(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+ACCELERATOR_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "crc32 "); - #endif - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 64; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2byte; - GV.OperandSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.OperandSize = 32; - } - else { - GV.MemDecoration = Arg2byte; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - } - - if (GV.OperandSize == 16) { - GV.OperandSize = 32; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 16; - } - else { - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 f1 - * ==================================================================== */ -void __bea_callspec__ crc32_GvEv(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+ACCELERATOR_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "crc32 "); - #endif - - if (GV.OperandSize == 64) { - GV.MemDecoration = Arg2qword; - } - else if (GV.OperandSize == 32) { - GV.MemDecoration = Arg2dword; - } - else { - GV.MemDecoration = Arg2word; - } - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - - if (GV.OperandSize == 16) { - GV.OperandSize = 32; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.OperandSize = 16; - } - else { - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - } - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 2f - * ==================================================================== */ -void __bea_callspec__ comiss_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "comisd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "comiss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 5a - * ==================================================================== */ -void __bea_callspec__ cvtps2pd_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtsd2ss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtss2sd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtpd2ps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtps2pd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 5b - * ==================================================================== */ -void __bea_callspec__ cvtdq2ps_(PDISASM pMyDisasm) -{ - /* ========== 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttps2dq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtps2dq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtdq2ps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 2a - * ==================================================================== */ -void __bea_callspec__ cvtpi2ps_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtsi2sd "); - #endif - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtsi2ss "); - #endif - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtpi2pd "); - #endif - GV.MemDecoration = Arg2qword; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtpi2ps "); - #endif - GV.MemDecoration = Arg2qword; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } -} - - -/* ==================================================================== - * 0x 0f 2d - * ==================================================================== */ -void __bea_callspec__ cvtps2pi_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtsd2si "); - #endif - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtss2si "); - #endif - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2dword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2dword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtpd2pi "); - #endif - GV.MemDecoration = Arg2dqword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtps2pi "); - #endif - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } -} - - -/* ==================================================================== - * 0x 0f 2c - * ==================================================================== */ -void __bea_callspec__ cvttps2pi_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttsd2si "); - #endif - if (GV.REX.W_ == 1) { - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttss2si "); - #endif - GV.MemDecoration = Arg2dword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_+= GV.DECALAGE_EIP+2; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttpd2pi "); - #endif - GV.MemDecoration = Arg2dqword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttps2pi "); - #endif - GV.MemDecoration = Arg2qword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } -} - - -/* ==================================================================== - * 0x 0f e6 - * ==================================================================== */ -void __bea_callspec__ cvtpd2dq_(PDISASM pMyDisasm) -{ - /* ========== 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtpd2dq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvtdq2pd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "cvttpd2dq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 3a 41 - * ==================================================================== */ -void __bea_callspec__ dppd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+DOT_PRODUCT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dppd "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ==================================================================== - * 0x 0f 3a 40 - * ==================================================================== */ -void __bea_callspec__ dpps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+DOT_PRODUCT; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "dpps "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 5e - * ==================================================================== */ -void __bea_callspec__ divps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "divsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "divss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "divpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "divps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 17 - * ==================================================================== */ -void __bea_callspec__ extractps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "extractps "); - #endif - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 7c - * ==================================================================== */ -void __bea_callspec__ haddpd_VW(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_HORIZONTAL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "haddpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_HORIZONTAL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "haddps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 7d - * ==================================================================== */ -void __bea_callspec__ hsubpd_VW(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_HORIZONTAL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "hsubpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SIMD_FP_HORIZONTAL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "hsubps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 21 - * ==================================================================== */ -void __bea_callspec__ insertps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "insertps "); - #endif - GV.SSE_ = 1; - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - GV.MemDecoration = Arg2qword; - } - else { - GV.MemDecoration = Arg2dword; - } - - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - - - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - - -/* ==================================================================== - * 0x 0f f0 - * ==================================================================== */ -void __bea_callspec__ lddqu_(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+SPECIALIZED_128bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "lddqu "); - #endif - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_+= GV.DECALAGE_EIP+2; - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f f7 - * ==================================================================== */ -void __bea_callspec__ maskmovq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maskmovdqu "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maskmovq "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 5f - * ==================================================================== */ -void __bea_callspec__ maxps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maxsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maxss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maxpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "maxps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 5d - * ==================================================================== */ -void __bea_callspec__ minps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "minsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "minss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "minpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "minps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 28 - * ==================================================================== */ -void __bea_callspec__ movaps_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movapd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movaps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 29 - * ==================================================================== */ -void __bea_callspec__ movaps_WV(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movapd "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movaps "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 16 - * ==================================================================== */ -void __bea_callspec__ movhps_VM(PDISASM pMyDisasm) -{ - - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movshdup "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movhpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+DATA_TRANSFER; - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movlhps "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movhps "); - #endif - } - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 17 - * ==================================================================== */ -void __bea_callspec__ movhps_MV(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movhpd "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movhps "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 12 - * ==================================================================== */ -void __bea_callspec__ movlps_VM(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movddup "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE3_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsldup "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movlpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+DATA_TRANSFER; - if (GV.MOD_== 0x3) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movhlps "); - #endif - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movlps "); - #endif - } - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 13 - * ==================================================================== */ -void __bea_callspec__ movlps_MV(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movlpd "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movlps "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 50 - * ==================================================================== */ -void __bea_callspec__ movmskps_(PDISASM pMyDisasm) -{ - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_!= 0x3) { - FailDecode(pMyDisasm); - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movmskpd "); - #endif - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movmskps "); - #endif - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - - } -} - - -/* ==================================================================== - * 0x 0f 38 2a - * ==================================================================== */ -void __bea_callspec__ movntdqa_(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+STREAMING_LOAD; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movntdqa "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f c3 - * ==================================================================== */ -void __bea_callspec__ movnti_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movnti "); - #endif - EvGv(pMyDisasm); - -} - - -/* ==================================================================== - * 0x 0f 2b - * ==================================================================== */ -void __bea_callspec__ movntps_(PDISASM pMyDisasm) -{ - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - FailDecode(pMyDisasm); - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movntpd "); - #endif - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - - } - else { - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movntps "); - #endif - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - - } -} - - -/* ==================================================================== - * 0x 0f e7 - * ==================================================================== */ -void __bea_callspec__ movntq_(PDISASM pMyDisasm) -{ - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - FailDecode(pMyDisasm); - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movntdq "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+CACHEABILITY_CONTROL; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movntq "); - #endif - GV.MMX_ = 1; - ExGx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 10 - * ==================================================================== */ -void __bea_callspec__ movups_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movupd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movups "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - - -/* ==================================================================== - * 0x 0f 11 - * ==================================================================== */ -void __bea_callspec__ movups_WV(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg1qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movsd "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg1dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movss "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movupd "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg1dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "movups "); - #endif - GV.SSE_ = 1; - ExGx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 42 - * ==================================================================== */ -void __bea_callspec__ mpsadbw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+SAD_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mpsadbw "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 59 - * ==================================================================== */ -void __bea_callspec__ mulps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mulsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mulss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mulpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "mulps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 56 - * ==================================================================== */ -void __bea_callspec__ orps_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "orpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "orps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 2b - * ==================================================================== */ -void __bea_callspec__ packusdw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "packusdw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f d4 - * ==================================================================== */ -void __bea_callspec__ paddq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "paddq "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f e0 - * ==================================================================== */ -void __bea_callspec__ pavgb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pavgb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pavgb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f e3 - * ==================================================================== */ -void __bea_callspec__ pavgw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pavgw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pavgw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 0f - * ==================================================================== */ -void __bea_callspec__ palignr_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "palignr "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "palignr "); - #endif - GV.ImmediatSize = 8; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } -} - - -/* ==================================================================== - * 0x 0f 38 10 - * ==================================================================== */ -void __bea_callspec__ pblendvb_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_BLENDING_INSTRUCTION; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pblendvb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pblendvb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 0e - * ==================================================================== */ -void __bea_callspec__ pblendw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+SAD_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pblendw "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 38 29 - * ==================================================================== */ -void __bea_callspec__ pcmpeqq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_EQUALITY; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpeqq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 61 - * ==================================================================== */ -void __bea_callspec__ pcmpestri_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpestri "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 60 - * ==================================================================== */ -void __bea_callspec__ pcmpestrm_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpestrm "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 63 - * ==================================================================== */ -void __bea_callspec__ pcmpistri_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpistri "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 62 - * ==================================================================== */ -void __bea_callspec__ pcmpistrm_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpestrm "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 38 37 - * ==================================================================== */ -void __bea_callspec__ pcmpgtq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pcmpgtq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 14 - * ==================================================================== */ -void __bea_callspec__ pextrb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrb "); - #endif - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1byte; - } - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 16 - * ==================================================================== */ -void __bea_callspec__ pextrd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - if (GV.REX.W_ == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrq "); - #endif - GV.MemDecoration = Arg1qword; - GV.OperandSize = 64; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrd "); - #endif - GV.MemDecoration = Arg1dword; - } - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ==================================================================== - * 0x 0f c5 - * ==================================================================== */ -void __bea_callspec__ pextrw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrw "); - #endif - GV.MemDecoration = Arg2dqword; - GV.ImmediatSize = 8; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrw "); - #endif - GV.MemDecoration = Arg2dqword; - GV.ImmediatSize = 8; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - -} - -/* ==================================================================== - * 0x 0f 3a 15 - * ==================================================================== */ -void __bea_callspec__ pextrw2_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pextrw "); - #endif - GV.MOD_= ((*((UInt8*)(UIntPtr) (GV.EIP_+1))) >> 6) & 0x3; - if (GV.MOD_== 0x3) { - GV.MemDecoration = Arg1dword; - } - else { - GV.MemDecoration = Arg1word; - } - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 38 02 - * ==================================================================== */ -void __bea_callspec__ phaddd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddd "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 03 - * ==================================================================== */ -void __bea_callspec__ phaddsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 01 - * ==================================================================== */ -void __bea_callspec__ phaddw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phaddw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 41 - * ==================================================================== */ -void __bea_callspec__ phminposuw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+HORIZONTAL_SEARCH; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phminposuw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 05 - * ==================================================================== */ -void __bea_callspec__ phsubw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 06 - * ==================================================================== */ -void __bea_callspec__ phsubd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubd "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 07 - * ==================================================================== */ -void __bea_callspec__ phsubsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "phsubsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 20 - * ==================================================================== */ -void __bea_callspec__ pinsrb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2byte; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pinsrb "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 3a 22 - * ==================================================================== */ -void __bea_callspec__ pinsrd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+INSERTION_EXTRACTION; - if (GV.REX.W_ == 0x1) { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pinsrq "); - #endif - GV.MemDecoration = Arg1qword; - } - else { - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pinsrd "); - #endif - GV.MemDecoration = Arg1dword; - } - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f c4 - * ==================================================================== */ -void __bea_callspec__ pinsrw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pinsrw "); - #endif - GV.MemDecoration = Arg2word; - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.SSE_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - - } - else { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pinsrw "); - #endif - GV.MemDecoration = Arg2word; - GV.ImmediatSize = 8; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 1; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.MMX_ = 0; - GV.EIP_ += GV.DECALAGE_EIP+3; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - -} - - -/* ==================================================================== - * 0x 0f 38 3c - * ==================================================================== */ -void __bea_callspec__ pmaxsb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxsb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 3d - * ==================================================================== */ -void __bea_callspec__ pmaxsd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 3e - * ==================================================================== */ -void __bea_callspec__ pmaxuw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxuw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 3f - * ==================================================================== */ -void __bea_callspec__ pmaxud_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxud "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 38 - * ==================================================================== */ -void __bea_callspec__ pminsb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminsb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 39 - * ==================================================================== */ -void __bea_callspec__ pminsd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 3a - * ==================================================================== */ -void __bea_callspec__ pminuw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminuw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - -/* ==================================================================== - * 0x 0f 38 3b - * ==================================================================== */ -void __bea_callspec__ pminud_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_MINMAX; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminud "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f da - * ==================================================================== */ -void __bea_callspec__ pminub_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminub "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminub "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f de - * ==================================================================== */ -void __bea_callspec__ pmaxub_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxub "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxub "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f ea - * ==================================================================== */ -void __bea_callspec__ pminsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pminsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f ee - * ==================================================================== */ -void __bea_callspec__ pmaxsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaxsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 04 - * ==================================================================== */ -void __bea_callspec__ pmaddubsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaddubsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmaddubsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f d7 - * ==================================================================== */ -void __bea_callspec__ pmovmskb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovmskb "); - #endif - GV.MemDecoration = Arg2dqword; - GV.SSE_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.SSE_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - else { - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovmskb "); - #endif - GV.MemDecoration = Arg2qword; - GV.MMX_ = 1; - MOD_RM(&(*pMyDisasm).Argument2, pMyDisasm); - GV.MMX_ = 0; - Reg_Opcode(&(*pMyDisasm).Argument1, pMyDisasm); - GV.EIP_ += GV.DECALAGE_EIP+2; - } - -} - - -/* ==================================================================== - * 0x 0f 38 21 - * ==================================================================== */ -void __bea_callspec__ pmovsxbd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxbd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 22 - * ==================================================================== */ -void __bea_callspec__ pmovsxbq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxbq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 20 - * ==================================================================== */ -void __bea_callspec__ pmovsxbw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxbw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 25 - * ==================================================================== */ -void __bea_callspec__ pmovsxdq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxdq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 23 - * ==================================================================== */ -void __bea_callspec__ pmovsxwd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxwd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 24 - * ==================================================================== */ -void __bea_callspec__ pmovsxwq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovsxwq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 31 - * ==================================================================== */ -void __bea_callspec__ pmovzxbd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxbd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 32 - * ==================================================================== */ -void __bea_callspec__ pmovzxbq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxbq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 30 - * ==================================================================== */ -void __bea_callspec__ pmovzxbw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxbw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 35 - * ==================================================================== */ -void __bea_callspec__ pmovzxdq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxdq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 33 - * ==================================================================== */ -void __bea_callspec__ pmovzxwd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxwd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 34 - * ==================================================================== */ -void __bea_callspec__ pmovzxwq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+CONVERSION_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmovzxwq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 28 - * ==================================================================== */ -void __bea_callspec__ pmuldq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmuldq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 40 - * ==================================================================== */ -void __bea_callspec__ pmulld_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulld "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 38 0b - * ==================================================================== */ -void __bea_callspec__ pmulhrsw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhrsw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhrsw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f e4 - * ==================================================================== */ -void __bea_callspec__ pmulhuw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhuw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmulhuw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f f4 - * ==================================================================== */ -void __bea_callspec__ pmuludq_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmuludq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pmuludq "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ======================================= - * 0x 0f b8 - * ======================================= */ -void __bea_callspec__ popcnt_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE42_INSTRUCTION+DATA_TRANSFER; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "popcnt "); - #endif - GvEv(pMyDisasm); - FillFlags(pMyDisasm,114); -} - - -/* ==================================================================== - * 0x 0f f6 - * ==================================================================== */ -void __bea_callspec__ psadbw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SIMD64bits; - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psadbw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psadbw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 00 - * ==================================================================== */ -void __bea_callspec__ pshufb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshufb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshufb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 70 - * ==================================================================== */ -void __bea_callspec__ pshufw_(PDISASM pMyDisasm) -{ - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - /* ========= 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshufhw "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - /* ========= 0xf2 */ - else if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshuflw "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshufd "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - GV.MemDecoration = Arg2qword; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "pshufw "); - #endif - GV.ImmediatSize = 8; - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } -} - -/* ==================================================================== - * 0x 0f 38 08 - * ==================================================================== */ -void __bea_callspec__ psignb_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignb "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignb "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 0a - * ==================================================================== */ -void __bea_callspec__ psignd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignd "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 09 - * ==================================================================== */ -void __bea_callspec__ psignw_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignw "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSSE3_INSTRUCTION+PACKED_SIGN; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psignw "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f fb - * ==================================================================== */ -void __bea_callspec__ psubq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "psubq "); - #endif - GV.MMX_ = 1; - GxEx(pMyDisasm); - GV.MMX_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 38 17 - * ==================================================================== */ -void __bea_callspec__ ptest_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+PACKED_TEST; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ptest "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ==================================================================== - * 0x 0f 6c - * ==================================================================== */ -void __bea_callspec__ punpcklqdq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpcklqdq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } - -} - -/* ==================================================================== - * 0x 0f 6d - * ==================================================================== */ -void __bea_callspec__ punpckhqdq_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SIMD128bits; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "punpckhqdq "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - FailDecode(pMyDisasm); - } - -} - - -/* ==================================================================== - * 0x 0f 53 - * ==================================================================== */ -void __bea_callspec__ rcpps_(PDISASM pMyDisasm) -{ - /* ========== 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcpss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rcpps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 3a 09 - * ==================================================================== */ -void __bea_callspec__ roundpd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ROUND_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "roundpd "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 3a 08 - * ==================================================================== */ -void __bea_callspec__ roundps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ROUND_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "roundps "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 3a 0b - * ==================================================================== */ -void __bea_callspec__ roundsd_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ROUND_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "roundsd "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 3a 0a - * ==================================================================== */ -void __bea_callspec__ roundss_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE41_INSTRUCTION+ROUND_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "roundss "); - #endif - GV.ImmediatSize = 8; - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - - } - else { - FailDecode(pMyDisasm); - } -} - - -/* ==================================================================== - * 0x 0f 52 - * ==================================================================== */ -void __bea_callspec__ rsqrtps_(PDISASM pMyDisasm) -{ - /* ========== 0xf3 */ - if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rsqrtss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "rsqrtps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f c6 - * ==================================================================== */ -void __bea_callspec__ shufps_(PDISASM pMyDisasm) -{ - - /* ========== 0x66 */ - GV.ImmediatSize = 8; - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shufpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "shufps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - (*pMyDisasm).Argument1.AccessMode = READ; - GV.EIP_++; - if (!Security(0, pMyDisasm)) return; - GV.third_arg = 1; - (*pMyDisasm).Instruction.Immediat = *((UInt8*)(UIntPtr) (GV.EIP_- 1)); - #ifndef BEA_LIGHT_DISASSEMBLY - (void) CopyFormattedNumber(pMyDisasm, (char*) (*pMyDisasm).Argument3.ArgMnemonic, "%.2X",(Int64) *((UInt8*)(UIntPtr) (GV.EIP_- 1))); - #endif - (*pMyDisasm).Argument3.ArgType = CONSTANT_TYPE+ABSOLUTE_; - (*pMyDisasm).Argument3.ArgSize = 8; - -} - - -/* ==================================================================== - * 0x 0f 51 - * ==================================================================== */ -void __bea_callspec__ sqrtps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sqrtsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sqrtss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sqrtpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "sqrtps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 5c - * ==================================================================== */ -void __bea_callspec__ subps_VW(PDISASM pMyDisasm) -{ - /* ========= 0xf2 */ - if (GV.PrefRepne == 1) { - (*pMyDisasm).Prefix.RepnePrefix = MandatoryPrefix; - GV.MemDecoration = Arg2qword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "subsd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========= 0xf3 */ - else if (GV.PrefRepe == 1) { - (*pMyDisasm).Prefix.RepPrefix = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "subss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - /* ========== 0x66 */ - else if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "subpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+ARITHMETIC_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "subps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 2e - * ==================================================================== */ -void __bea_callspec__ ucomiss_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ucomisd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+COMPARISON_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "ucomiss "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 15 - * ==================================================================== */ -void __bea_callspec__ unpckhps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if (GV.OperandSize == 16) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "unpckhpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "unpckhps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - -/* ==================================================================== - * 0x 0f 14 - * ==================================================================== */ -void __bea_callspec__ unpcklps_(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "unpcklpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+SHUFFLE_UNPACK; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "unpcklps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} - - -/* ==================================================================== - * 0x 0f 57 - * ==================================================================== */ -void __bea_callspec__ xorps_VW(PDISASM pMyDisasm) -{ - /* ========== 0x66 */ - if ((*pMyDisasm).Prefix.OperandSize == InUsePrefix) { - GV.OperandSize = GV.OriginalOperandSize; - (*pMyDisasm).Prefix.OperandSize = MandatoryPrefix; - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE2_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xorpd "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } - else { - GV.MemDecoration = Arg2dqword; - (*pMyDisasm).Instruction.Category = SSE_INSTRUCTION+LOGICAL_INSTRUCTION; - #ifndef BEA_LIGHT_DISASSEMBLY - (void) strcpy ((*pMyDisasm).Instruction.Mnemonic, "xorps "); - #endif - GV.SSE_ = 1; - GxEx(pMyDisasm); - GV.SSE_ = 0; - } -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_prefixes.c b/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_prefixes.c deleted file mode 100644 index a7aaf3ff..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/instr_set/opcodes_prefixes.c +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* ==================================================================== - * Legacy Prefix F0h-Group 1 - * ==================================================================== */ -void __bea_callspec__ PrefLock(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.LockPrefix = InvalidPrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - GV.OperandSize = 32; -} - -/* ==================================================================== - * Legacy Prefix F2h-Group 1 - * ==================================================================== */ -void __bea_callspec__ PrefREPNE(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.RepnePrefix = SuperfluousPrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - GV.PrefRepne = 1; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - if (GV.VEX.state != InUsePrefix) { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x1) { - (void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x2) { - (void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x3) { - (void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - GV.PrefRepne = 0; -} - -/* ==================================================================== - * Legacy Prefix F3h-Group 1 - * ==================================================================== */ -void __bea_callspec__ PrefREPE(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.RepPrefix = SuperfluousPrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - GV.PrefRepe = 1; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - if (GV.VEX.state != InUsePrefix) { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x1) { - (void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x2) { - (void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x3) { - (void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - GV.PrefRepe = 0; -} - -/* ==================================================================== - * Legacy Prefix 2Eh-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGCS(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.CSPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Legacy Prefix 3Eh-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGDS(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.DSPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Legacy Prefix 26h-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGES(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.ESPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Legacy Prefix 64h-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGFS(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.FSPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - GV.SEGMENTFS = 1; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Legacy Prefix 65h-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGGS(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.GSPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - - -/* ==================================================================== - * Legacy Prefix 36h-Group 2 - * ==================================================================== */ -void __bea_callspec__ PrefSEGSS(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.SSPrefix = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Legacy Prefix 66h-Group 3 - * ==================================================================== */ -void __bea_callspec__ PrefOpSize(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.OperandSize = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - GV.OriginalOperandSize = GV.OperandSize; /* if GV.OperandSize is used as a mandatory prefix, keep the real operandsize value */ - if (GV.Architecture == 16) { - GV.OperandSize = 32; - } - else { - if (GV.OperandSize != 64) { - GV.OperandSize = 16; - } - } - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - if (GV.VEX.state != InUsePrefix) { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x1) { - (void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x2) { - (void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else if (GV.VEX.mmmmm == 0x3) { - (void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - else { - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - } - if (GV.Architecture == 16) { - GV.OperandSize = 16; - } - else { - GV.OperandSize = 32; - } -} - -/* ==================================================================== - * Legacy Prefix 67h-Group 4 - * ==================================================================== */ -void __bea_callspec__ PrefAdSize(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - (*pMyDisasm).Prefix.AddressSize = InUsePrefix; - GV.EIP_++; - (*pMyDisasm).Prefix.Number++; - GV.NB_PREFIX++; - if (GV.Architecture == 16) { - GV.AddressSize = GV.AddressSize << 1; - } - else { - GV.AddressSize = GV.AddressSize >> 1; - } - - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); - (void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); - if (GV.Architecture == 16) { - GV.AddressSize = GV.AddressSize >> 1; - } - else { - GV.AddressSize = GV.AddressSize << 1; - } - -} - -/* ==================================================================== - * Escape Prefix 0Fh-two bytes opcodes - * ==================================================================== */ -void __bea_callspec__ Esc_2byte(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - GV.EIP_++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F00; - (void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} - -/* ==================================================================== - * Escape Prefix 0F38h-three bytes opcodes - * ==================================================================== */ -void __bea_callspec__ Esc_tableA4(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - GV.EIP_++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F3800; - (void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} -/* ==================================================================== - * Escape Prefix 0F3Ah-three bytes opcodes - * ==================================================================== */ -void __bea_callspec__ Esc_tableA5(PDISASM pMyDisasm) -{ - if (!Security(0, pMyDisasm)) return; - GV.EIP_++; - (*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F3A00; - (void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); -} diff --git a/NativeCore/Dependencies/beaengine/src/Includes/internal_datas.h b/NativeCore/Dependencies/beaengine/src/Includes/internal_datas.h deleted file mode 100644 index bf1b3086..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/internal_datas.h +++ /dev/null @@ -1,734 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - -/* Define prefix GV aka GlobalVariable - used instead of global internal variables to make BeaEngine thread-safe */ - -#define GV (*pMyDisasm).Reserved_ - -/* Define constants to identify the position and type of decoration used in case of memory argument */ - - - -EFLStruct EFLAGS_TABLE[] = { - /*OF, SF , ZF , AF , PF , CF , TF , IF , DF , NT , RF , ? */ - {UN_, UN_, UN_, MO_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 0-AAA */ - {UN_, MO_, MO_, UN_, MO_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 1-AAD */ - {UN_, MO_, MO_, UN_, MO_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 2-AAM */ - {UN_, UN_, UN_, MO_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 3-AAS */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 4-ADC */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 5-ADD */ - {RE_, MO_, MO_, UN_, MO_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 6-AND */ - {0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 7-ARPL */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 8-BOUND */ - {UN_, UN_, MO_, UN_, UN_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 9-BSF/BSR */ - - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 10-BSWAP */ - {UN_, UN_, UN_, UN_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 11-BT/BTS/BTR/BTC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 12-CALL */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 13-CBW */ - {0 , 0 , 0 , 0 , 0 , RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 14-CLC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , RE_, 0 , 0 , 0}, /* 15-CLD */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , RE_, 0 , 0 , 0 , 0}, /* 16-CLI */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 17-CLTS */ - {0 , 0 , 0 , 0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 18-CMC */ - {TE_, TE_, TE_, 0 , TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 19-CMOVcc */ - - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 20-CMP */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 21-CMPS */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 22-CMPXCHG */ - {0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 23-CMPXCHGG8B */ - {RE_, RE_, MO_, RE_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 24-COMSID */ - {RE_, RE_, MO_, RE_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 25-COMISS */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 26-CPUID */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 27-CWD */ - {UN_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 28-DAA */ - {UN_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 29-DAS */ - - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 30-DEC */ - {UN_, UN_, UN_, UN_, UN_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 31-DIV */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 32-ENTER */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 33-ESC */ - {0 , 0 , TE_, 0 , TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 34-FCMOV */ - {0 , 0 , MO_, 0 , MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 35-FCOMI FCOMIP FUCMI FUCMIP */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 36-HLT */ - {UN_, UN_, UN_, UN_, UN_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 37-IDIV */ - {MO_, UN_, UN_, UN_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 38-IMUL */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 39-IN */ - - {MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 40-INC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , TE_, 0 , 0 , 0}, /* 41-INS */ - {0 , 0 , 0 , 0 , 0 , 0 , RE_, 0 , 0 , RE_, 0 , 0}, /* 42-INT */ - {TE_, 0 , 0 , 0 , 0 , 0 , RE_, 0 , 0 , RE_, 0 , 0}, /* 43-INTO */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 44-INVD */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 45-INVLPG */ - {RE_, RE_, MO_, RE_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 46-UCOMSID */ - {RE_, RE_, MO_, RE_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 47-UCOMISS */ - {PR_, PR_, PR_, PR_, PR_, PR_, PR_, PR_, PR_, TE_, 0 , 0}, /* 48-IRET */ - {TE_, TE_, TE_, 0 , TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 49-Jcc */ - - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 50-JCXZ */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 51-JMP */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 52-LAHF */ - {0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 53-LAR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 54-LDS LES LSS LFS LGS */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 55-LEA */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 56-LEAVE */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 57-LGDT LIDT LLDT LMSW */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 58-LOCK */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , TE_, 0 , 0 , 0}, /* 59-LODS */ - - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 60-LOOP */ - {0 , 0 , TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 61-LOOPE LOOPNE */ - {0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 62-LSL */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 63-LTR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 64-MONITOR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 65-MWAIT */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 66-MOV */ - {UN_, UN_, UN_, UN_, UN_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 67-MOV control, debug, test */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , TE_, 0 , 0 , 0}, /* 68-MOVS */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 69-MOVSX MOVZX */ - - {MO_, UN_, UN_, UN_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 70-MUL */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 71-NEG */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 72-NOP */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 73-NOT */ - {RE_, MO_, MO_, UN_, MO_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 74-OR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 75-OUT */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , TE_, 0 , 0 , 0}, /* 76-OUTS */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 77-POP POPA */ - {PR_, PR_, PR_, PR_, PR_, PR_, PR_, PR_, PR_, PR_, 0 , 0}, /* 78-POPF */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 79-PUSH PUSHA PUSHF */ - - {MO_, 0 , 0 , 0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 80-RCL RCR 1 */ - {UN_, 0 , 0 , 0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 81-RCL RCR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 82-RDMSR */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 83-RDPMC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 84-RDTSC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 85-REP REPE REPNE */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 86-RET */ - {MO_, 0 , 0 , 0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 87-ROL ROR 1 */ - {UN_, 0 , 0 , 0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 88-ROL ROR */ - {MO_, MO_, MO_, MO_, MO_, MO_, MO_, MO_, MO_, MO_, MO_, 0}, /* 89-RSM */ - - {0 , PR_, PR_, PR_, PR_, PR_, 0 , 0 , 0 , 0 , 0 , 0}, /* 90-SAHF */ - {MO_, MO_, MO_, 0 , MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 91-SAL SAR SHL SHR 1 */ - {0 , MO_, MO_, 0 , MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 92-SAL SAR SHL SHR */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 93-SBB */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 94-SCAS */ - {TE_, TE_, TE_, 0 , TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 95-SETcc */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 96-SGDT SIDT SLDT SMSW */ - {UN_, MO_, MO_, UN_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 97-SHLD SHRD */ - {0 , 0 , 0 , 0 , 0 , SE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 98-STC */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , SE_, 0 , 0 , 0}, /* 99-STD */ - - {0 , 0 , 0 , 0 , 0 , 0 , 0 , SE_, 0 , 0 , 0 , 0}, /* 100-STI */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 101-STOS */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 102-STR */ - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 103-SUB */ - {RE_, MO_, MO_, UN_, MO_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 104-TEST */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 105-UD2 */ - {0 , 0 , MO_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 106-VERR VERRW */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 107-WAIT */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 108-WBINVD */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 109-WRMSR */ - - {MO_, MO_, MO_, MO_, MO_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 110-XADD */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 111-XCHG */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 112-XLAT */ - {RE_, MO_, MO_, UN_, MO_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 113-XOR */ - - {RE_, RE_, MO_, RE_, RE_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 114-POPCNT */ - - {TE_, TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /*115 -jg jnle jng jle http://ref.x86asm.net/coder.html */ - {TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /*116 -jo jno http://ref.x86asm.net/coder.html */ - {0 , 0 , 0 , 0 , 0 , TE_, 0 , 0 , 0 , 0 , 0 , 0}, /*117 -jc jnc jb jnb jnae jae http://ref.x86asm.net/coder.html */ - {0 , 0 , TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /*118 -jz jnz je jne http://ref.x86asm.net/coder.html */ - {0 , 0 , TE_, 0 , 0 , TE_, 0 , 0 , 0 , 0 , 0 , 0}, /*119 -jbe jnbe jna ja http://ref.x86asm.net/coder.html */ - - {0 , TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 120 - js jns http://ref.x86asm.net/coder.html */ - {0 , 0 , 0 , 0 , TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 121 - jp jpe jnp jpo http://ref.x86asm.net/coder.html */ - {TE_, TE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 122 - jl jnge jnl jge http://ref.x86asm.net/coder.html */ - {UN_, UN_, UN_, UN_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 123 - adcx */ - {MO_, UN_, UN_, UN_, UN_, UN_, 0 , 0 , 0 , 0 , 0 , 0}, /* 124 - adox */ - {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, /* 125 - mulx */ - {RE_, MO_, MO_, UN_, UN_, RE_, 0 , 0 , 0 , 0 , 0 , 0}, /* 126 - andn */ - {RE_, UN_, MO_, UN_, UN_, RE_, RE_, RE_, RE_, RE_, RE_, 0}, /* 127 - bextr */ - {RE_, MO_, MO_, UN_, UN_, MO_, 0 , 0 , 0 , 0 , 0 , 0}, /* 128 - bzhi */ - {0 , 0 , 0 , RE_, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0} /* 129 - clac */ - /*OF, SF , ZF , AF , PF , CF , TF , IF , DF , NT , RF , Align */ - }; -/* ===================================================== - * To make a tabulation between mnemonic and first argument - * ===================================================== */ -char space_tab[11][16] = { - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - -}; -/* ===================================================== - * Segment registers - * ===================================================== */ -char SegmentRegs[7][4] = { - "??:", /* +0 */ - "es:", /* +1 */ - "ds:", /* +2 */ - "fs:", /* +3 */ - "gs:", /* +4 */ - "cs:", /* +5 */ - "ss:", /* +6 */ -}; - -#define Arg1byte 1 -#define Arg1word 2 -#define Arg1dword 3 -#define Arg1qword 4 -#define Arg1multibytes 5 -#define Arg1tbyte 6 -#define Arg1fword 7 -#define Arg1dqword 8 -#define Arg1_m128_xmm 9 -#define Arg1_m256_ymm 10 -#define Arg1_m128i_xmm 11 -#define Arg1_m128d_xmm 12 -#define Arg1_m256d_ymm 13 - -#define Arg2byte 101 -#define Arg2word 102 -#define Arg2dword 103 -#define Arg2qword 104 -#define Arg2multibytes 105 -#define Arg2tbyte 106 -#define Arg2fword 107 -#define Arg2dqword 108 -#define Arg2_m128_xmm 109 -#define Arg2_m256_ymm 110 -#define Arg2_m128i_xmm 111 -#define Arg2_m128d_xmm 112 -#define Arg2_m256d_ymm 113 - -#define Arg3byte 201 -#define Arg3word 202 -#define Arg3dword 203 -#define Arg3qword 204 -#define Arg3multibytes 205 -#define Arg3tbyte 206 -#define Arg3fword 207 -#define Arg3dqword 208 -#define Arg3_m128_xmm 209 -#define Arg3_m256_ymm 210 -#define Arg3_m128i_xmm 211 -#define Arg3_m128d_xmm 212 -#define Arg3_m256d_ymm 213 - -#define Arg4byte 301 -#define Arg4word 302 -#define Arg4dword 303 -#define Arg4qword 304 -#define Arg4multibytes 305 -#define Arg4tbyte 306 -#define Arg4fword 307 -#define Arg4dqword 308 -#define Arg4_m128_xmm 309 -#define Arg4_m256_ymm 310 -#define Arg4_m128i_xmm 311 -#define Arg4_m128d_xmm 312 -#define Arg4_m256d_ymm 313 - -#define nbMemoryTypes 13 - -/* ===================================================== - * Intrinsic representation of prefixes - * ===================================================== */ -char IntrinsicPrefixes[nbMemoryTypes][16] = { - "m8 ", /* GV.MemDecoration == 1 */ - "m16 ", /* GV.MemDecoration == 2 */ - "m32 ", /* GV.MemDecoration == 3 */ - "m64 ", /* GV.MemDecoration == 4 */ - " ", /* GV.MemDecoration == 5 (multibytes) */ - "tword ", /* GV.MemDecoration == 6 */ - " ", /* GV.MemDecoration == 7 (fword) */ - "m128 ", /* GV.MemDecoration == 8 (dqword) */ - "m128 ", /* GV.MemDecoration == 9 */ - "m256 ", /* GV.MemDecoration == 10 */ - "m128i ", /* GV.MemDecoration == 11 */ - "m128d ", /* GV.MemDecoration == 12 */ - "m256d " /* GV.MemDecoration == 13 */ -}; - -/* ===================================================== - * AT&T Suffixes - * ===================================================== */ -char ATSuffixes[nbMemoryTypes][4] = { - "b ", /* GV.MemDecoration == 1 */ - "w ", /* GV.MemDecoration == 2 */ - "l ", /* GV.MemDecoration == 3 */ - "q ", /* GV.MemDecoration == 4 */ - " ", /* GV.MemDecoration == 5 (multibytes) */ - "t ", /* GV.MemDecoration == 6 */ - " ", /* GV.MemDecoration == 7 (fword) */ - " ", /* GV.MemDecoration == 8 (dqword) */ - " ", /* GV.MemDecoration == 9 */ - " ", /* GV.MemDecoration == 10 */ - " ", /* GV.MemDecoration == 11 */ - " ", /* GV.MemDecoration == 12 */ - " " /* GV.MemDecoration == 13 */ -}; - -/* ===================================================== - * MASM Prefixes for MemoryType - * ===================================================== */ - -char MasmPrefixes[nbMemoryTypes][16] = { - "byte ptr ", /* GV.MemDecoration == 1 - 8 bits long */ - "word ptr ", /* GV.MemDecoration == 2 - 16 bits long */ - "dword ptr ", /* GV.MemDecoration == 3 - 32 bits long */ - "qword ptr ", /* GV.MemDecoration == 4 - 64 bits long */ - " ", /* GV.MemDecoration == 5 - (multibytes) */ - "tbyte ptr ", /* GV.MemDecoration == 6 - 80 bits long */ - "fword ptr ", /* GV.MemDecoration == 7 - 48 bits long */ - "dqword ptr ", /* GV.MemDecoration == 8 - 128 bits long */ - "xmmword ptr ", /* GV.MemDecoration == 9 - 128 bits long XMM registers */ - "ymmword ptr ", /* GV.MemDecoration == 10 - 256 bits long YMM registers*/ - "xmmword ptr ", /* GV.MemDecoration == 11 - 128 bits long XMM registers */ - "xmmword ptr ", /* GV.MemDecoration == 12 - 128 bits long XMM registers */ - "ymmword ptr " /* GV.MemDecoration == 13 - 256 bits long YMM registers */ -}; - -/* ===================================================== - * NASM Prefixes for MemoryType - * ===================================================== */ -char NasmPrefixes[nbMemoryTypes][8] = { - "byte ", /* GV.MemDecoration == 1 */ - "word ", /* GV.MemDecoration == 2 */ - "", /* GV.MemDecoration == 3 */ - "qword ", /* GV.MemDecoration == 4 */ - "", /* GV.MemDecoration == 5 (multibytes) */ - "tword ", /* GV.MemDecoration == 6 */ - "", /* GV.MemDecoration == 7 (fword) */ - "", /* GV.MemDecoration == 8 (dqword) */ - "", /* GV.MemDecoration == 9 */ - "", /* GV.MemDecoration == 10 */ - "", /* GV.MemDecoration == 11 */ - "", /* GV.MemDecoration == 12 */ - "" /* GV.MemDecoration == 13 */ -}; - - - -/* ===================================================== - * GOASM Prefixes for MemoryType - * ===================================================== */ -char GoAsmPrefixes[nbMemoryTypes][4] = { - "b ", /* GV.MemDecoration == 1 */ - "w ", /* GV.MemDecoration == 2 */ - "d ", /* GV.MemDecoration == 3 */ - "q ", /* GV.MemDecoration == 4 */ - " ", /* GV.MemDecoration == 5 (multibytes) */ - "t ", /* GV.MemDecoration == 6 */ - " ", /* GV.MemDecoration == 7 (fword) */ - " ", /* GV.MemDecoration == 8 (dqword) */ - " ", /* GV.MemDecoration == 9 */ - " ", /* GV.MemDecoration == 10 */ - " ", /* GV.MemDecoration == 11 */ - " ", /* GV.MemDecoration == 12 */ - " " /* GV.MemDecoration == 13 */ -}; - - -/* ===================================================== - * Segment registers - * ===================================================== */ -char RegistersSEG[16][8] = { - "es", /* +0 */ - "cs", /* +1 */ - "ss", /* +2 */ - "ds", /* +3 */ - "fs", /* +4 */ - "gs", /* +5 */ - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", - "seg?", -}; - - - -/* ===================================================== - * MPX Registers - * ===================================================== */ -char RegistersMPX[16][8] = { - "bnd0", /* +0 */ - "bnd1", /* +1 */ - "bnd2", /* +2 */ - "bnd3", /* +3 */ - "bnd4?", /* wrong register */ - "bnd5?", /* wrong register */ - "bnd6?", /* wrong register */ - "bnd7?", /* wrong register */ - "bnd8?", /* wrong register */ - "bnd9?", /* wrong register */ - "bnd10?", /* wrong register */ - "bnd11?", /* wrong register */ - "bnd12?", /* wrong register */ - "bnd13?", /* wrong register */ - "bnd14?", /* wrong register */ - "bnd15?" /* wrong register */ -}; - -/* ===================================================== - * FPU Registers - * ===================================================== */ -char RegistersFPU_Masm[8][8] = { - "st(0)", /* +0 */ - "st(1)", /* +1 */ - "st(2)", /* +2 */ - "st(3)", /* +3 */ - "st(4)", /* +4 */ - "st(5)", /* +5 */ - "st(6)", /* +6 */ - "st(7)", /* +7 */ -}; - -char RegistersFPU_Nasm[8][8] = { - "st0", /* +0 */ - "st1", /* +1 */ - "st2", /* +2 */ - "st3", /* +3 */ - "st4", /* +4 */ - "st5", /* +5 */ - "st6", /* +6 */ - "st7", /* +7 */ -}; - -/* ===================================================== - * debug registers - * ===================================================== */ -char RegistersDR[16][8] = { - "dr0", /* +0 */ - "dr1", /* +1 */ - "dr2", /* +2 */ - "dr3", /* +3 */ - "dr4", /* +4 */ - "dr5", /* +5 */ - "dr6", /* +6 */ - "dr7", /* +7 */ - "dr8", /* +8 */ - "dr9", /* +9 */ - "dr10", /* +10 */ - "dr11", /* +11 */ - "dr12", /* +12 */ - "dr13", /* +13 */ - "dr14", /* +14 */ - "dr15", /* +15 */ -}; - -/* ===================================================== - * debug registers-AT&T syntax - * ===================================================== */ -char RegistersDR_AT[16][8] = { - "db0", /* +0 */ - "db1", /* +1 */ - "db2", /* +2 */ - "db3", /* +3 */ - "db4", /* +4 */ - "db5", /* +5 */ - "db6", /* +6 */ - "db7", /* +7 */ - "db8", /* +8 */ - "db9", /* +9 */ - "db10", /* +10 */ - "db11", /* +11 */ - "db12", /* +12 */ - "db13", /* +13 */ - "db14", /* +14 */ - "db15", /* +15 */ -}; - - -/* ===================================================== - * control registers - * ===================================================== */ -char RegistersCR[16][8] = { - "cr0", /* +0 */ - "cr1", /* +1 */ - "cr2", /* +2 */ - "cr3", /* +3 */ - "cr4", /* +4 */ - "cr5", /* +5 */ - "cr6", /* +6 */ - "cr7", /* +7 */ - "cr8", /* +8 */ - "cr9", /* +9 */ - "cr10", /* +10 */ - "cr11", /* +11 */ - "cr12", /* +12 */ - "cr13", /* +13 */ - "cr14", /* +14 */ - "cr15", /* +15 */ -}; - - - -/* ===================================================== - * 64 bits registers - * ===================================================== */ -char Registers64Bits[16][4] = { - "rax", /* +0 */ - "rcx", /* +1 */ - "rdx", /* +2 */ - "rbx", /* +3 */ - "rsp", /* +4 */ - "rbp", /* +5 */ - "rsi", /* +6 */ - "rdi", /* +7 */ - "r8", /* +8 */ - "r9", /* +9 */ - "r10", /* +10 */ - "r11", /* +11 */ - "r12", /* +12 */ - "r13", /* +13 */ - "r14", /* +14 */ - "r15", /* +15 */ -}; - -/* ===================================================== - * 32 bits registers - * ===================================================== */ -char Registers32Bits[16][8] = { - "eax", - "ecx", - "edx", - "ebx", - "esp", - "ebp", - "esi", - "edi", - "r8d", - "r9d", - "r10d", - "r11d", - "r12d", - "r13d", - "r14d", - "r15d", -}; - -/* ===================================================== - * 16 bits registers - * ===================================================== */ -char Registers16Bits[16][8] = { - "ax", - "cx", - "dx", - "bx", - "sp", - "bp", - "si", - "di", - "r8w", - "r9w", - "r10w", - "r11w", - "r12w", - "r13w", - "r14w", - "r15w", -}; -/* ===================================================== - * 8 bits registers - * ===================================================== */ -char Registers8BitsLegacy[8][4] = { - "al", - "cl", - "dl", - "bl", - "ah", - "ch", - "dh", - "bh", -}; - -Int32 REGS8BITS[] = { - REG0, - REG1, - REG2, - REG3, - REG0, - REG1, - REG2, - REG3, -}; - -/* ===================================================== - * 8 bits registers - * ===================================================== */ -char Registers8Bits[16][8] = { - "al", - "cl", - "dl", - "bl", - "spl", - "bpl", - "sil", - "dil", - "r8L", - "r9L", - "r10L", - "r11L", - "r12L", - "r13L", - "r14L", - "r15L", -}; -/* ===================================================== - * MMX Registers - * ===================================================== */ -char RegistersMMX[8][4] = { - "mm0", - "mm1", - "mm2", - "mm3", - "mm4", - "mm5", - "mm6", - "mm7", -}; - -/* ===================================================== - * SSE Registers - * ===================================================== */ -char RegistersSSE[16][8] = { - "xmm0", - "xmm1", - "xmm2", - "xmm3", - "xmm4", - "xmm5", - "xmm6", - "xmm7", - "xmm8", /* SSE3, SSSE3, SSE4 */ - "xmm9", /* SSE3, SSSE3, SSE4 */ - "xmm10", /* SSE3, SSSE3, SSE4 */ - "xmm11", /* SSE3, SSSE3, SSE4 */ - "xmm12", /* SSE3, SSSE3, SSE4 */ - "xmm13", /* SSE3, SSSE3, SSE4 */ - "xmm14", /* SSE3, SSSE3, SSE4 */ - "xmm15", /* SSE3, SSSE3, SSE4 */ -}; - -/* ===================================================== - * AVX 256 bits Registers - * ===================================================== */ -char RegistersAVX[16][8] = { - "ymm0", - "ymm1", - "ymm2", - "ymm3", - "ymm4", - "ymm5", - "ymm6", - "ymm7", - "ymm8", - "ymm9", - "ymm10", - "ymm11", - "ymm12", - "ymm13", - "ymm14", - "ymm15", -}; - -/* ===================================================== - * AVX 256 bits Registers - * ===================================================== */ -char RegistersAVX512[32][8] = { - "zmm0", - "zmm1", - "zmm2", - "zmm3", - "zmm4", - "zmm5", - "zmm6", - "zmm7", - "zmm8", - "zmm9", - "zmm10", - "zmm11", - "zmm12", - "zmm13", - "zmm14", - "zmm15", - "zmm16", - "zmm17", - "zmm18", - "zmm19", - "zmm20", - "zmm21", - "zmm22", - "zmm23", - "zmm24", - "zmm25", - "zmm26", - "zmm27", - "zmm28", - "zmm29", - "zmm30", - "zmm31", -}; - -Int32 REGS[] = { - REG0, /* REG0 */ - REG1, /* REG1 */ - REG2, /* REG2 */ - REG3, /* REG3 */ - REG4, /* REG4 */ - REG5, /* REG5 */ - REG6, /* REG6 */ - REG7, /* REG7 */ - REG8, /* REG8 */ - REG9, /* REG9 */ - REG10, /* REG10 */ - REG11, /* REG11 */ - REG12, /* REG12 */ - REG13, /* REG13 */ - REG14, /* REG14 */ - REG15, /* REG15 */ -}; - -char BXSI_[] = "bx+si"; -char BXDI_[] = "bx+di"; -char BPSI_[] = "bp+si"; -char BPDI_[] = "bp+di"; - - - diff --git a/NativeCore/Dependencies/beaengine/src/Includes/protos.h b/NativeCore/Dependencies/beaengine/src/Includes/protos.h deleted file mode 100644 index 1928b71e..00000000 --- a/NativeCore/Dependencies/beaengine/src/Includes/protos.h +++ /dev/null @@ -1,717 +0,0 @@ -/* Copyright 2006-2009, BeatriX - * File coded by BeatriX - * - * This file is part of BeaEngine. - * - * BeaEngine is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * BeaEngine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with BeaEngine. If not, see . */ - - -/* ====================================== Routines_MODRM */ -void __bea_callspec__ MOD_RM(ARGTYPE*, PDISASM); -void __bea_callspec__ fillRegister(int, ARGTYPE*, PDISASM); -void __bea_callspec__ Reg_Opcode(ARGTYPE*, PDISASM); - -void __bea_callspec__ Addr_EAX(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ECX(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDX(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EBX(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_SIB(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ESI(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDI(ARGTYPE*, PDISASM); - -void __bea_callspec__ Addr_EAX_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ECX_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDX_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EBX_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_SIB_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EBP_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ESI_disp8(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDI_disp8(ARGTYPE*, PDISASM); - -void __bea_callspec__ Addr_EAX_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ECX_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDX_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EBX_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_SIB_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EBP_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_ESI_disp32(ARGTYPE*, PDISASM); -void __bea_callspec__ Addr_EDI_disp32(ARGTYPE*, PDISASM); - -void __bea_callspec__ _rEAX(ARGTYPE*, PDISASM); -void __bea_callspec__ _rECX(ARGTYPE*, PDISASM); -void __bea_callspec__ _rEDX(ARGTYPE*, PDISASM); -void __bea_callspec__ _rEBX(ARGTYPE*, PDISASM); -void __bea_callspec__ _rESP(ARGTYPE*, PDISASM); -void __bea_callspec__ _rEBP(ARGTYPE*, PDISASM); -void __bea_callspec__ _rESI(ARGTYPE*, PDISASM); -void __bea_callspec__ _rEDI(ARGTYPE*, PDISASM); - -size_t __bea_callspec__ SIB_0(ARGTYPE*, size_t, PDISASM); -size_t __bea_callspec__ SIB_1(ARGTYPE*, size_t, PDISASM); -size_t __bea_callspec__ SIB_2(ARGTYPE*, size_t, PDISASM); -size_t __bea_callspec__ SIB_3(ARGTYPE*, size_t, PDISASM); - -/* ====================================== Routines_Disasm */ -void __bea_callspec__ CompleteInstructionFields (PDISASM); -void __bea_callspec__ EbGb(PDISASM); -void __bea_callspec__ EvGv(PDISASM); -void __bea_callspec__ EvIb(PDISASM); -void __bea_callspec__ ExGx(PDISASM); -void __bea_callspec__ EvIv(PDISASM); -void __bea_callspec__ EbIb(PDISASM); -void __bea_callspec__ Eb(PDISASM); -void __bea_callspec__ Ev(PDISASM); -void __bea_callspec__ GvEv(PDISASM); -void __bea_callspec__ GyEy(PDISASM); -void __bea_callspec__ GvEb(PDISASM); -void __bea_callspec__ GxEx(PDISASM); -void __bea_callspec__ GvEw(PDISASM); -void __bea_callspec__ GbEb(PDISASM); -void __bea_callspec__ ALIb(PDISASM); -void __bea_callspec__ eAX_Iv(PDISASM); -int __bea_callspec__ AnalyzeOpcode (PDISASM); -int __bea_callspec__ Security(int, PDISASM); -void __bea_callspec__ CalculateRelativeAddress(UInt64 *, Int64, PDISASM); -size_t __bea_callspec__ CopyFormattedNumber(PDISASM, char*, const char*, Int64); -void __bea_callspec__ BuildCompleteInstruction(PDISASM); -void __bea_callspec__ BuildCompleteInstructionATSyntax(PDISASM); -int __bea_callspec__ InitVariables (PDISASM); -void __bea_callspec__ FillFlags(PDISASM, int); -void __bea_callspec__ FillSegmentsRegisters (PDISASM); -void __bea_callspec__ FixArgSizeForMemoryOperand (PDISASM); -void __bea_callspec__ FixREXPrefixes (PDISASM); - -/* ====================================== opcodes_prefix */ -void __bea_callspec__ PrefLock(PDISASM); -void __bea_callspec__ PrefREPNE(PDISASM); -void __bea_callspec__ PrefREPE(PDISASM); -void __bea_callspec__ PrefSEGCS(PDISASM); -void __bea_callspec__ PrefSEGDS(PDISASM); -void __bea_callspec__ PrefSEGES(PDISASM); -void __bea_callspec__ PrefSEGFS(PDISASM); -void __bea_callspec__ PrefSEGGS(PDISASM); -void __bea_callspec__ PrefSEGSS(PDISASM); -void __bea_callspec__ PrefOpSize(PDISASM); -void __bea_callspec__ PrefAdSize(PDISASM); -void __bea_callspec__ Esc_2byte(PDISASM); -void __bea_callspec__ Esc_tableA4(PDISASM); -void __bea_callspec__ Esc_tableA5(PDISASM); - - -/* ====================================== opcodes_A_M */ -void __bea_callspec__ FailDecode(PDISASM); -void __bea_callspec__ aaa_(PDISASM); -void __bea_callspec__ aad_(PDISASM); -void __bea_callspec__ aas_(PDISASM); -void __bea_callspec__ aam_(PDISASM); -void __bea_callspec__ adcx_GyEy(PDISASM); -void __bea_callspec__ add_EbGb(PDISASM); -void __bea_callspec__ add_EvGv(PDISASM); -void __bea_callspec__ add_GbEb(PDISASM); -void __bea_callspec__ add_GvEv(PDISASM); -void __bea_callspec__ add_ALIb(PDISASM); -void __bea_callspec__ add_eAX_Iv(PDISASM); -void __bea_callspec__ adc_ALIb(PDISASM); -void __bea_callspec__ adc_eAX_Iv(PDISASM); -void __bea_callspec__ adc_EbGb(PDISASM); -void __bea_callspec__ adc_EvGv(PDISASM); -void __bea_callspec__ adc_GbEb(PDISASM); -void __bea_callspec__ adc_GvEv(PDISASM); -void __bea_callspec__ and_EbGb(PDISASM); -void __bea_callspec__ and_ALIb(PDISASM); -void __bea_callspec__ and_eAX_Iv(PDISASM); -void __bea_callspec__ and_EvGv(PDISASM); -void __bea_callspec__ and_GbEb(PDISASM); -void __bea_callspec__ and_GvEv(PDISASM); -void __bea_callspec__ andn_GyEy(PDISASM); -void __bea_callspec__ arpl_(PDISASM); -void __bea_callspec__ bextr_GyEy(PDISASM); -void __bea_callspec__ bndcl_GvEv(PDISASM); -void __bea_callspec__ bndcn_GvEv(PDISASM); -void __bea_callspec__ bound_(PDISASM); -void __bea_callspec__ bswap_eax(PDISASM); -void __bea_callspec__ bswap_ebp(PDISASM); -void __bea_callspec__ bswap_ebx(PDISASM); -void __bea_callspec__ bswap_ecx(PDISASM); -void __bea_callspec__ bswap_edi(PDISASM); -void __bea_callspec__ bswap_edx(PDISASM); -void __bea_callspec__ bswap_esi(PDISASM); -void __bea_callspec__ bswap_esp(PDISASM); -void __bea_callspec__ bsf_GvEv(PDISASM); -void __bea_callspec__ bsr_GvEv(PDISASM); -void __bea_callspec__ btc_EvGv(PDISASM); -void __bea_callspec__ btr_EvGv(PDISASM); -void __bea_callspec__ bt_EvGv(PDISASM); -void __bea_callspec__ bts_EvGv(PDISASM); -void __bea_callspec__ bzhi_GyEy(PDISASM); -void __bea_callspec__ callf_(PDISASM); -void __bea_callspec__ call_(PDISASM); -void __bea_callspec__ cdq_(PDISASM); -void __bea_callspec__ clts_(PDISASM); -void __bea_callspec__ cmc_(PDISASM); -void __bea_callspec__ cmovo_(PDISASM); -void __bea_callspec__ cmovno_(PDISASM); -void __bea_callspec__ cmovb_(PDISASM); -void __bea_callspec__ cmovnb_(PDISASM); -void __bea_callspec__ cmove_(PDISASM); -void __bea_callspec__ cmovne_(PDISASM); -void __bea_callspec__ cmovbe_(PDISASM); -void __bea_callspec__ cmovnbe_(PDISASM); -void __bea_callspec__ cmovs_(PDISASM); -void __bea_callspec__ cmovns_(PDISASM); -void __bea_callspec__ cmovp_(PDISASM); -void __bea_callspec__ cmovnp_(PDISASM); -void __bea_callspec__ cmovl_(PDISASM); -void __bea_callspec__ cmovnl_(PDISASM); -void __bea_callspec__ cmovle_(PDISASM); -void __bea_callspec__ cmovnle_(PDISASM); -void __bea_callspec__ cmpx_EbGb(PDISASM); -void __bea_callspec__ cmpx_EvGv(PDISASM); -void __bea_callspec__ cmp_EbGb(PDISASM); -void __bea_callspec__ cmp_EvGv(PDISASM); -void __bea_callspec__ cmp_GbEb(PDISASM); -void __bea_callspec__ cmp_GvEv(PDISASM); -void __bea_callspec__ cmp_ALIb(PDISASM); -void __bea_callspec__ cmp_eAX_Iv(PDISASM); -void __bea_callspec__ cmpsb_(PDISASM); -void __bea_callspec__ cmps_(PDISASM); -void __bea_callspec__ cwde_(PDISASM); -void __bea_callspec__ clc_(PDISASM); -void __bea_callspec__ cld_(PDISASM); -void __bea_callspec__ cli_(PDISASM); -void __bea_callspec__ cpuid_(PDISASM); -void __bea_callspec__ daa_(PDISASM); -void __bea_callspec__ das_(PDISASM); -void __bea_callspec__ dec_eax(PDISASM); -void __bea_callspec__ dec_ecx(PDISASM); -void __bea_callspec__ dec_edx(PDISASM); -void __bea_callspec__ dec_ebx(PDISASM); -void __bea_callspec__ dec_esp(PDISASM); -void __bea_callspec__ dec_ebp(PDISASM); -void __bea_callspec__ dec_esi(PDISASM); -void __bea_callspec__ dec_edi(PDISASM); -void __bea_callspec__ enter_(PDISASM); -void __bea_callspec__ femms_(PDISASM); -void __bea_callspec__ hlt_(PDISASM); -void __bea_callspec__ invd_(PDISASM); -void __bea_callspec__ inc_eax(PDISASM); -void __bea_callspec__ inc_ecx(PDISASM); -void __bea_callspec__ inc_edx(PDISASM); -void __bea_callspec__ inc_ebx(PDISASM); -void __bea_callspec__ inc_esp(PDISASM); -void __bea_callspec__ inc_ebp(PDISASM); -void __bea_callspec__ inc_esi(PDISASM); -void __bea_callspec__ inc_edi(PDISASM); -void __bea_callspec__ iret_(PDISASM); -void __bea_callspec__ in_ALDX(PDISASM); -void __bea_callspec__ in_ALIb(PDISASM); -void __bea_callspec__ in_eAX_Ib(PDISASM); -void __bea_callspec__ insb_(PDISASM); -void __bea_callspec__ ins_(PDISASM); -void __bea_callspec__ into_(PDISASM); -void __bea_callspec__ in_eAX(PDISASM); -void __bea_callspec__ int_(PDISASM); -void __bea_callspec__ int1_(PDISASM); -void __bea_callspec__ int3_(PDISASM); -void __bea_callspec__ imul_GvEvIv(PDISASM); -void __bea_callspec__ imul_GvEv(PDISASM); -void __bea_callspec__ imul_GvEvIb(PDISASM); -void __bea_callspec__ jo_(PDISASM); -void __bea_callspec__ jno_(PDISASM); -void __bea_callspec__ jc_(PDISASM); -void __bea_callspec__ jnc_(PDISASM); -void __bea_callspec__ je_(PDISASM); -void __bea_callspec__ jne_(PDISASM); -void __bea_callspec__ jbe_(PDISASM); -void __bea_callspec__ jnbe_(PDISASM); -void __bea_callspec__ js_(PDISASM); -void __bea_callspec__ jns_(PDISASM); -void __bea_callspec__ jp_(PDISASM); -void __bea_callspec__ jnp_(PDISASM); -void __bea_callspec__ jl_(PDISASM); -void __bea_callspec__ jnl_(PDISASM); -void __bea_callspec__ jle_(PDISASM); -void __bea_callspec__ jnle_(PDISASM); -void __bea_callspec__ jo_near(PDISASM); -void __bea_callspec__ jno_near(PDISASM); -void __bea_callspec__ jc_near(PDISASM); -void __bea_callspec__ jnc_near(PDISASM); -void __bea_callspec__ je_near(PDISASM); -void __bea_callspec__ jne_near(PDISASM); -void __bea_callspec__ jbe_near(PDISASM); -void __bea_callspec__ ja_near(PDISASM); -void __bea_callspec__ js_near(PDISASM); -void __bea_callspec__ jns_near(PDISASM); -void __bea_callspec__ jp_near(PDISASM); -void __bea_callspec__ jnp_near(PDISASM); -void __bea_callspec__ jl_near(PDISASM); -void __bea_callspec__ jnl_near(PDISASM); -void __bea_callspec__ jle_near(PDISASM); -void __bea_callspec__ jnle_near(PDISASM); -void __bea_callspec__ jecxz_(PDISASM); -void __bea_callspec__ jmp_near(PDISASM); -void __bea_callspec__ jmp_far(PDISASM); -void __bea_callspec__ jmp_short(PDISASM); -void __bea_callspec__ lahf_(PDISASM); -void __bea_callspec__ lar_GvEw(PDISASM); -void __bea_callspec__ lds_GvM(PDISASM); -void __bea_callspec__ leave_(PDISASM); -void __bea_callspec__ lea_GvM(PDISASM); -void __bea_callspec__ les_GvM(PDISASM); -void __bea_callspec__ lodsb_(PDISASM); -void __bea_callspec__ lodsw_(PDISASM); -void __bea_callspec__ loop_(PDISASM); -void __bea_callspec__ loope_(PDISASM); -void __bea_callspec__ loopne_(PDISASM); -void __bea_callspec__ lsl_GvEw(PDISASM); -void __bea_callspec__ lss_Mp(PDISASM); -void __bea_callspec__ lfs_Mp(PDISASM); -void __bea_callspec__ lgs_Mp(PDISASM); -void __bea_callspec__ mov_RdCd(PDISASM); -void __bea_callspec__ mov_RdDd(PDISASM); -void __bea_callspec__ mov_CdRd(PDISASM); -void __bea_callspec__ mov_DdRd(PDISASM); -void __bea_callspec__ mov_EbGb(PDISASM); -void __bea_callspec__ mov_EvGv(PDISASM); -void __bea_callspec__ mov_GbEb(PDISASM); -void __bea_callspec__ mov_GvEv(PDISASM); -void __bea_callspec__ mov_ALOb(PDISASM); -void __bea_callspec__ mov_eAXOv(PDISASM); -void __bea_callspec__ mov_ObAL(PDISASM); -void __bea_callspec__ mov_OveAX(PDISASM); -void __bea_callspec__ mov_ALIb(PDISASM); -void __bea_callspec__ mov_CLIb(PDISASM); -void __bea_callspec__ mov_DLIb(PDISASM); -void __bea_callspec__ mov_BLIb(PDISASM); -void __bea_callspec__ mov_AHIb(PDISASM); -void __bea_callspec__ mov_CHIb(PDISASM); -void __bea_callspec__ mov_DHIb(PDISASM); -void __bea_callspec__ mov_BHIb(PDISASM); -void __bea_callspec__ movs_(PDISASM); -void __bea_callspec__ movsw_(PDISASM); -void __bea_callspec__ movzx_GvEb(PDISASM); -void __bea_callspec__ movsx_GvEb(PDISASM); -void __bea_callspec__ movzx_GvEw(PDISASM); -void __bea_callspec__ movsx_GvEw(PDISASM); -void __bea_callspec__ mov_EAX(PDISASM); -void __bea_callspec__ mov_ECX(PDISASM); -void __bea_callspec__ mov_EDX(PDISASM); -void __bea_callspec__ mov_EBX(PDISASM); -void __bea_callspec__ mov_ESP(PDISASM); -void __bea_callspec__ mov_EBP(PDISASM); -void __bea_callspec__ mov_ESI(PDISASM); -void __bea_callspec__ mov_EDI(PDISASM); -void __bea_callspec__ mov_EbIb(PDISASM); -void __bea_callspec__ mov_EvIv(PDISASM); -void __bea_callspec__ mov_EwSreg(PDISASM); -void __bea_callspec__ mov_SregEw(PDISASM); - -/* ====================================== opcodes_N_Z */ -void __bea_callspec__ nop_(PDISASM); -void __bea_callspec__ nop_Ev(PDISASM); -void __bea_callspec__ hint_nop(PDISASM); -void __bea_callspec__ or_EbGb(PDISASM); -void __bea_callspec__ or_EvGv(PDISASM); -void __bea_callspec__ or_GbEb(PDISASM); -void __bea_callspec__ or_GvEv(PDISASM); -void __bea_callspec__ or_ALIb(PDISASM); -void __bea_callspec__ or_eAX_Iv(PDISASM); -void __bea_callspec__ outsb_(PDISASM); -void __bea_callspec__ outsw_(PDISASM); -void __bea_callspec__ out_IbAL(PDISASM); -void __bea_callspec__ out_Ib_eAX(PDISASM); -void __bea_callspec__ out_DXAL(PDISASM); -void __bea_callspec__ out_DXeAX(PDISASM); -void __bea_callspec__ pop_Ev(PDISASM); -void __bea_callspec__ pop_eax(PDISASM); -void __bea_callspec__ pop_ecx(PDISASM); -void __bea_callspec__ pop_edx(PDISASM); -void __bea_callspec__ pop_ebx(PDISASM); -void __bea_callspec__ pop_esp(PDISASM); -void __bea_callspec__ pop_ebp(PDISASM); -void __bea_callspec__ pop_esi(PDISASM); -void __bea_callspec__ pop_edi(PDISASM); -void __bea_callspec__ pop_ds(PDISASM); -void __bea_callspec__ pop_es(PDISASM); -void __bea_callspec__ pop_fs(PDISASM); -void __bea_callspec__ pop_gs(PDISASM); -void __bea_callspec__ pop_ss(PDISASM); -void __bea_callspec__ popfd_(PDISASM); -void __bea_callspec__ popad_(PDISASM); -void __bea_callspec__ push_eax(PDISASM); -void __bea_callspec__ push_ecx(PDISASM); -void __bea_callspec__ push_edx(PDISASM); -void __bea_callspec__ push_ebx(PDISASM); -void __bea_callspec__ push_esp(PDISASM); -void __bea_callspec__ push_ebp(PDISASM); -void __bea_callspec__ push_esi(PDISASM); -void __bea_callspec__ push_edi(PDISASM); -void __bea_callspec__ push_cs(PDISASM); -void __bea_callspec__ push_ds(PDISASM); -void __bea_callspec__ push_es(PDISASM); -void __bea_callspec__ push_fs(PDISASM); -void __bea_callspec__ push_gs(PDISASM); -void __bea_callspec__ push_ss(PDISASM); -void __bea_callspec__ pushfd_(PDISASM); -void __bea_callspec__ pushad_(PDISASM); -void __bea_callspec__ push_Iv(PDISASM); -void __bea_callspec__ push_Ib(PDISASM); -void __bea_callspec__ pushfd_(PDISASM); -void __bea_callspec__ pushad_(PDISASM); -void __bea_callspec__ retn_(PDISASM); -void __bea_callspec__ ret_(PDISASM); -void __bea_callspec__ retf_(PDISASM); -void __bea_callspec__ retf_Iw(PDISASM); -void __bea_callspec__ rdtsc_(PDISASM); -void __bea_callspec__ rdmsr_(PDISASM); -void __bea_callspec__ rdpmc_(PDISASM); -void __bea_callspec__ rsm_(PDISASM); -void __bea_callspec__ sysenter_(PDISASM); -void __bea_callspec__ sysexit_(PDISASM); -void __bea_callspec__ sahf_(PDISASM); -void __bea_callspec__ salc_(PDISASM); -void __bea_callspec__ scasb_(PDISASM); -void __bea_callspec__ scas_(PDISASM); -void __bea_callspec__ stc_(PDISASM); -void __bea_callspec__ sti_(PDISASM); -void __bea_callspec__ stos_(PDISASM); -void __bea_callspec__ stosw_(PDISASM); -void __bea_callspec__ syscall_(PDISASM); -void __bea_callspec__ sysret_(PDISASM); -void __bea_callspec__ sbb_EbGb(PDISASM); -void __bea_callspec__ sbb_EvGv(PDISASM); -void __bea_callspec__ sbb_GbEb(PDISASM); -void __bea_callspec__ sbb_GvEv(PDISASM); -void __bea_callspec__ sbb_ALIb(PDISASM); -void __bea_callspec__ sbb_eAX_Iv(PDISASM); -void __bea_callspec__ seto_(PDISASM); -void __bea_callspec__ setno_(PDISASM); -void __bea_callspec__ setb_(PDISASM); -void __bea_callspec__ setnb_(PDISASM); -void __bea_callspec__ sete_(PDISASM); -void __bea_callspec__ setne_(PDISASM); -void __bea_callspec__ setbe_(PDISASM); -void __bea_callspec__ setnbe_(PDISASM); -void __bea_callspec__ sets_(PDISASM); -void __bea_callspec__ setns_(PDISASM); -void __bea_callspec__ setp_(PDISASM); -void __bea_callspec__ setnp_(PDISASM); -void __bea_callspec__ setnge_(PDISASM); -void __bea_callspec__ setge_(PDISASM); -void __bea_callspec__ setle_(PDISASM); -void __bea_callspec__ setnle_(PDISASM); -void __bea_callspec__ shld_EvGvIb(PDISASM); -void __bea_callspec__ shld_EvGvCL(PDISASM); -void __bea_callspec__ shrd_EvGvIb(PDISASM); -void __bea_callspec__ shrd_EvGvCL(PDISASM); -void __bea_callspec__ std_(PDISASM); -void __bea_callspec__ sub_ALIb(PDISASM); -void __bea_callspec__ sub_eAX_Iv(PDISASM); -void __bea_callspec__ sub_EbGb(PDISASM); -void __bea_callspec__ sub_EvGv(PDISASM); -void __bea_callspec__ sub_GbEb(PDISASM); -void __bea_callspec__ sub_GvEv(PDISASM); -void __bea_callspec__ test_ALIb(PDISASM); -void __bea_callspec__ test_eAX_Iv(PDISASM); -void __bea_callspec__ test_EbGb(PDISASM); -void __bea_callspec__ test_EvGv(PDISASM); -void __bea_callspec__ test_GbEb(PDISASM); -void __bea_callspec__ test_GvEv(PDISASM); -void __bea_callspec__ ud2_(PDISASM); -void __bea_callspec__ vmread_(PDISASM); -void __bea_callspec__ vmwrite_(PDISASM); -void __bea_callspec__ wbinvd_(PDISASM); -void __bea_callspec__ wait_(PDISASM); -void __bea_callspec__ wrmsr_(PDISASM); -void __bea_callspec__ xadd_EbGb(PDISASM); -void __bea_callspec__ xadd_EvGv(PDISASM); -void __bea_callspec__ xchg_EbGb(PDISASM); -void __bea_callspec__ xchg_ebp(PDISASM); -void __bea_callspec__ xchg_ebx(PDISASM); -void __bea_callspec__ xchg_ecx(PDISASM); -void __bea_callspec__ xchg_edi(PDISASM); -void __bea_callspec__ xchg_edx(PDISASM); -void __bea_callspec__ xchg_esi(PDISASM); -void __bea_callspec__ xchg_esp(PDISASM); -void __bea_callspec__ xchg_EvGv(PDISASM); -void __bea_callspec__ xlat_(PDISASM); -void __bea_callspec__ xor_ALIb(PDISASM); -void __bea_callspec__ xor_eAX_Iv(PDISASM); -void __bea_callspec__ xor_EbGb(PDISASM); -void __bea_callspec__ xor_EvGv(PDISASM); -void __bea_callspec__ xor_GbEb(PDISASM); -void __bea_callspec__ xor_GvEv(PDISASM); - -/* ====================================== opcodes_Grp1 */ -void __bea_callspec__ G1_EbIb(PDISASM); -void __bea_callspec__ G1_EbIb2(PDISASM); -void __bea_callspec__ G1_EvIv(PDISASM); -void __bea_callspec__ G1_EvIb(PDISASM); - -/* ====================================== opcodes_Grp2 */ -void __bea_callspec__ G2_EbIb(PDISASM); -void __bea_callspec__ G2_EvIb(PDISASM); -void __bea_callspec__ G2_Ev1(PDISASM); -void __bea_callspec__ G2_Eb1(PDISASM); -void __bea_callspec__ G2_EbCL(PDISASM); -void __bea_callspec__ G2_EvCL(PDISASM); - -/* ====================================== opcodes_Grp3 */ -void __bea_callspec__ G3_Eb(PDISASM); -void __bea_callspec__ G3_Ev(PDISASM); - -/* ====================================== opcodes_Grp4 */ -void __bea_callspec__ G4_Eb(PDISASM); - -/* ====================================== opcodes_Grp5 */ -void __bea_callspec__ G5_Ev(PDISASM); - -/* ====================================== opcodes_Grp6 */ -void __bea_callspec__ G6_(PDISASM); - -/* ====================================== opcodes_Grp7 */ -void __bea_callspec__ G7_(PDISASM); - -/* ====================================== opcodes_Grp8 */ -void __bea_callspec__ G8_EvIb(PDISASM); - -/* ====================================== opcodes_Grp9 */ -void __bea_callspec__ G9_(PDISASM); - -/* ====================================== opcodes_Grp12 */ -void __bea_callspec__ G12_(PDISASM); - -/* ====================================== opcodes_Grp13 */ -void __bea_callspec__ G13_(PDISASM); - -/* ====================================== opcodes_Grp14 */ -void __bea_callspec__ G14_(PDISASM); - -/* ====================================== opcodes_Grp15 */ -void __bea_callspec__ G15_(PDISASM); - -/* ====================================== opcodes_Grp16 */ -void __bea_callspec__ G16_(PDISASM); - -/* ====================================== opcodes_Grp17 */ -void __bea_callspec__ G17_(PDISASM); - - -/* ====================================== opcodes_FPU */ -void __bea_callspec__ D8_(PDISASM); -void __bea_callspec__ D9_(PDISASM); -void __bea_callspec__ DA_(PDISASM); -void __bea_callspec__ DB_(PDISASM); -void __bea_callspec__ DC_(PDISASM); -void __bea_callspec__ DD_(PDISASM); -void __bea_callspec__ DE_(PDISASM); -void __bea_callspec__ DF_(PDISASM); - -/* ====================================== opcodes_MMX */ -void __bea_callspec__ emms_(PDISASM); -void __bea_callspec__ movd_EP(PDISASM); -void __bea_callspec__ movd_PE(PDISASM); -void __bea_callspec__ movq_PQ(PDISASM); -void __bea_callspec__ movq_QP(PDISASM); -void __bea_callspec__ movq_WV(PDISASM); -void __bea_callspec__ pabsb_(PDISASM); -void __bea_callspec__ pabsd_(PDISASM); -void __bea_callspec__ pabsw_(PDISASM); -void __bea_callspec__ packssdw_(PDISASM); -void __bea_callspec__ packsswb_(PDISASM); -void __bea_callspec__ packuswb_(PDISASM); -void __bea_callspec__ paddb_(PDISASM); -void __bea_callspec__ paddd_(PDISASM); -void __bea_callspec__ paddsb_(PDISASM); -void __bea_callspec__ paddsw_(PDISASM); -void __bea_callspec__ paddusb_(PDISASM); -void __bea_callspec__ paddusw_(PDISASM); -void __bea_callspec__ paddw_(PDISASM); -void __bea_callspec__ pandn_(PDISASM); -void __bea_callspec__ pand_(PDISASM); -void __bea_callspec__ pcmpeqb_(PDISASM); -void __bea_callspec__ pcmpeqd_(PDISASM); -void __bea_callspec__ pcmpeqw_(PDISASM); -void __bea_callspec__ pcmpgtb_(PDISASM); -void __bea_callspec__ pcmpgtd_(PDISASM); -void __bea_callspec__ pcmpgtw_(PDISASM); -void __bea_callspec__ pmulhw_(PDISASM); -void __bea_callspec__ pmullw_(PDISASM); -void __bea_callspec__ pmaddwd_(PDISASM); -void __bea_callspec__ por_(PDISASM); -void __bea_callspec__ pslld_(PDISASM); -void __bea_callspec__ psllq_(PDISASM); -void __bea_callspec__ psllw_(PDISASM); -void __bea_callspec__ psrld_(PDISASM); -void __bea_callspec__ psrlq_(PDISASM); -void __bea_callspec__ psrlw_(PDISASM); -void __bea_callspec__ psrad_(PDISASM); -void __bea_callspec__ psraw_(PDISASM); -void __bea_callspec__ psubb_(PDISASM); -void __bea_callspec__ psubd_(PDISASM); -void __bea_callspec__ psubsb_(PDISASM); -void __bea_callspec__ psubsw_(PDISASM); -void __bea_callspec__ psubusb_(PDISASM); -void __bea_callspec__ psubusw_(PDISASM); -void __bea_callspec__ psubw_(PDISASM); -void __bea_callspec__ punpckhbw_(PDISASM); -void __bea_callspec__ punpckhdq_(PDISASM); -void __bea_callspec__ punpckhwd_(PDISASM); -void __bea_callspec__ punpcklbw_(PDISASM); -void __bea_callspec__ punpckldq_(PDISASM); -void __bea_callspec__ punpcklwd_(PDISASM); -void __bea_callspec__ pxor_(PDISASM); - -/* ====================================== opcodes_SSE */ -void __bea_callspec__ addps_VW(PDISASM); -void __bea_callspec__ addsubpd_(PDISASM); -void __bea_callspec__ andnps_VW(PDISASM); -void __bea_callspec__ andps_VW(PDISASM); -void __bea_callspec__ blendpd_(PDISASM); -void __bea_callspec__ blendps_(PDISASM); -void __bea_callspec__ blendvpd_(PDISASM); -void __bea_callspec__ blendvps_(PDISASM); -void __bea_callspec__ cmpps_VW(PDISASM); -void __bea_callspec__ crc32_GvEb(PDISASM); -void __bea_callspec__ crc32_GvEv(PDISASM); -void __bea_callspec__ comiss_VW(PDISASM); -void __bea_callspec__ cvtdq2ps_(PDISASM); -void __bea_callspec__ cvtpd2dq_(PDISASM); -void __bea_callspec__ cvtpi2ps_(PDISASM); -void __bea_callspec__ cvtps2pd_(PDISASM); -void __bea_callspec__ cvtps2pi_(PDISASM); -void __bea_callspec__ cvttps2pi_(PDISASM); -void __bea_callspec__ dppd_(PDISASM); -void __bea_callspec__ dpps_(PDISASM); -void __bea_callspec__ divps_VW(PDISASM); -void __bea_callspec__ extractps_(PDISASM); -void __bea_callspec__ haddpd_VW(PDISASM); -void __bea_callspec__ hsubpd_VW(PDISASM); -void __bea_callspec__ insertps_(PDISASM); -void __bea_callspec__ lddqu_(PDISASM); -void __bea_callspec__ maskmovq_(PDISASM); -void __bea_callspec__ maxps_VW(PDISASM); -void __bea_callspec__ minps_VW(PDISASM); -void __bea_callspec__ movaps_VW(PDISASM); -void __bea_callspec__ movaps_WV(PDISASM); -void __bea_callspec__ movhps_MV(PDISASM); -void __bea_callspec__ movhps_VM(PDISASM); -void __bea_callspec__ movlps_MV(PDISASM); -void __bea_callspec__ movlps_VM(PDISASM); -void __bea_callspec__ movmskps_(PDISASM); -void __bea_callspec__ movntdqa_(PDISASM); -void __bea_callspec__ movnti_(PDISASM); -void __bea_callspec__ movntps_(PDISASM); -void __bea_callspec__ movntq_(PDISASM); -void __bea_callspec__ movups_VW(PDISASM); -void __bea_callspec__ movups_WV(PDISASM); -void __bea_callspec__ mpsadbw_(PDISASM); -void __bea_callspec__ mulps_VW(PDISASM); -void __bea_callspec__ orps_VW(PDISASM); -void __bea_callspec__ packusdw_(PDISASM); -void __bea_callspec__ paddq_(PDISASM); -void __bea_callspec__ pavgb_(PDISASM); -void __bea_callspec__ pavgw_(PDISASM); -void __bea_callspec__ palignr_(PDISASM); -void __bea_callspec__ pblendvb_(PDISASM); -void __bea_callspec__ pblendw_(PDISASM); -void __bea_callspec__ pcmpeqq_(PDISASM); -void __bea_callspec__ pcmpestri_(PDISASM); -void __bea_callspec__ pcmpestrm_(PDISASM); -void __bea_callspec__ pcmpgtq_(PDISASM); -void __bea_callspec__ pcmpistri_(PDISASM); -void __bea_callspec__ pcmpistrm_(PDISASM); -void __bea_callspec__ pextrb_(PDISASM); -void __bea_callspec__ pextrd_(PDISASM); -void __bea_callspec__ pextrw2_(PDISASM); -void __bea_callspec__ pextrw_(PDISASM); -void __bea_callspec__ phaddd_(PDISASM); -void __bea_callspec__ phaddsw_(PDISASM); -void __bea_callspec__ phaddw_(PDISASM); -void __bea_callspec__ phminposuw_(PDISASM); -void __bea_callspec__ phsubd_(PDISASM); -void __bea_callspec__ phsubsw_(PDISASM); -void __bea_callspec__ phsubw_(PDISASM); -void __bea_callspec__ pinsrb_(PDISASM); -void __bea_callspec__ pinsrd_(PDISASM); -void __bea_callspec__ pinsrw_(PDISASM); -void __bea_callspec__ pmaxsb_(PDISASM); -void __bea_callspec__ pmaxsd_(PDISASM); -void __bea_callspec__ pmaxsw_(PDISASM); -void __bea_callspec__ pmaxub_(PDISASM); -void __bea_callspec__ pmaxud_(PDISASM); -void __bea_callspec__ pmaxuw_(PDISASM); -void __bea_callspec__ pminsb_(PDISASM); -void __bea_callspec__ pminsd_(PDISASM); -void __bea_callspec__ pminsw_(PDISASM); -void __bea_callspec__ pminub_(PDISASM); -void __bea_callspec__ pminud_(PDISASM); -void __bea_callspec__ pminuw_(PDISASM); -void __bea_callspec__ pmaddubsw_(PDISASM); -void __bea_callspec__ pmovmskb_(PDISASM); -void __bea_callspec__ pmovsxbd_(PDISASM); -void __bea_callspec__ pmovsxbq_(PDISASM); -void __bea_callspec__ pmovsxbw_(PDISASM); -void __bea_callspec__ pmovsxdq_(PDISASM); -void __bea_callspec__ pmovsxwd_(PDISASM); -void __bea_callspec__ pmovsxwq_(PDISASM); -void __bea_callspec__ pmovzxbd_(PDISASM); -void __bea_callspec__ pmovzxbq_(PDISASM); -void __bea_callspec__ pmovzxbw_(PDISASM); -void __bea_callspec__ pmovzxdq_(PDISASM); -void __bea_callspec__ pmovzxwd_(PDISASM); -void __bea_callspec__ pmovzxwq_(PDISASM); -void __bea_callspec__ pmuldq_(PDISASM); -void __bea_callspec__ pmulhrsw_(PDISASM); -void __bea_callspec__ pmulhuw_(PDISASM); -void __bea_callspec__ pmulhw_(PDISASM); -void __bea_callspec__ pmulld_(PDISASM); -void __bea_callspec__ pmullw_(PDISASM); -void __bea_callspec__ pmuludq_(PDISASM); -void __bea_callspec__ popcnt_(PDISASM); -void __bea_callspec__ psadbw_(PDISASM); -void __bea_callspec__ pshufb_(PDISASM); -void __bea_callspec__ pshufw_(PDISASM); -void __bea_callspec__ psignb_(PDISASM); -void __bea_callspec__ psignd_(PDISASM); -void __bea_callspec__ psignw_(PDISASM); -void __bea_callspec__ psubq_(PDISASM); -void __bea_callspec__ ptest_(PDISASM); -void __bea_callspec__ punpcklqdq_(PDISASM); -void __bea_callspec__ punpckhqdq_(PDISASM); -void __bea_callspec__ rcpps_(PDISASM); -void __bea_callspec__ roundpd_(PDISASM); -void __bea_callspec__ roundps_(PDISASM); -void __bea_callspec__ roundsd_(PDISASM); -void __bea_callspec__ roundss_(PDISASM); -void __bea_callspec__ rsqrtps_(PDISASM); -void __bea_callspec__ shufps_(PDISASM); -void __bea_callspec__ sqrtps_VW(PDISASM); -void __bea_callspec__ subps_VW(PDISASM); -void __bea_callspec__ ucomiss_VW(PDISASM); -void __bea_callspec__ unpckhps_(PDISASM); -void __bea_callspec__ unpcklps_(PDISASM); -void __bea_callspec__ xorps_VW(PDISASM); - -/* ====================================== opcodes_AES */ -void __bea_callspec__ aesimc(PDISASM); -void __bea_callspec__ aesdec(PDISASM); -void __bea_callspec__ aesdeclast(PDISASM); -void __bea_callspec__ aesenc(PDISASM); -void __bea_callspec__ aesenclast(PDISASM); -void __bea_callspec__ aeskeygen(PDISASM); - -/* ====================================== opcodes_CLMUL */ -void __bea_callspec__ pclmulqdq_(PDISASM); diff --git a/NativeCore/Dependencies/distorm/include/distorm.h b/NativeCore/Dependencies/distorm/include/distorm.h new file mode 100644 index 00000000..10071646 --- /dev/null +++ b/NativeCore/Dependencies/distorm/include/distorm.h @@ -0,0 +1,482 @@ +/* diStorm 3.3.3 */ + +/* +distorm.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef DISTORM_H +#define DISTORM_H + +/* + * 64 bit offsets support: + * If the diStorm library you use was compiled with 64 bits offsets, + * make sure you compile your own code with the following macro set: + * SUPPORT_64BIT_OFFSET + * Otherwise comment it out, or you will get a linker error of an unresolved symbol... + * Turned on by default! + */ + +#if !(defined(DISTORM_STATIC) || defined(DISTORM_DYNAMIC)) + /* Define this macro for outer projects by default. */ + #define SUPPORT_64BIT_OFFSET +#endif + +/* TINYC has a problem with some 64bits library functions, so ignore 64 bit offsets. */ +#ifdef __TINYC__ + #undef SUPPORT_64BIT_OFFSET +#endif + +/* If your compiler doesn't support stdint.h, define your own 64 bits type. */ +#ifdef SUPPORT_64BIT_OFFSET + #ifdef _MSC_VER + #define OFFSET_INTEGER unsigned __int64 + #else + #include + #define OFFSET_INTEGER uint64_t + #endif +#else + /* 32 bit offsets are used. */ + #define OFFSET_INTEGER unsigned long +#endif + +#ifdef _MSC_VER +/* Since MSVC isn't shipped with stdint.h, we will have our own: */ +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +#endif + +/* Support C++ compilers */ +#ifdef __cplusplus + extern "C" { +#endif + + +/* *** Helper Macros *** */ + +/* Get the ISC of the instruction, used with the definitions below. */ +#define META_GET_ISC(meta) (((meta) >> 3) & 0x1f) +#define META_SET_ISC(di, isc) (((di)->meta) |= ((isc) << 3)) +/* Get the flow control flags of the instruction, see 'features for decompose' below. */ +#define META_GET_FC(meta) ((meta) & 0x7) + +/* Get the target address of a branching instruction. O_PC operand type. */ +#define INSTRUCTION_GET_TARGET(di) ((_OffsetType)(((di)->addr + (di)->imm.addr + (di)->size))) +/* Get the target address of a RIP-relative memory indirection. */ +#define INSTRUCTION_GET_RIP_TARGET(di) ((_OffsetType)(((di)->addr + (di)->disp + (di)->size))) + +/* + * Operand Size or Adderss size are stored inside the flags: + * 00 - 16 bits + * 01 - 32 bits + * 10 - 64 bits + * 11 - reserved + * + * If you call these set-macros more than once, you will have to clean the bits before doing so. + */ +#define FLAG_SET_OPSIZE(di, size) ((di->flags) |= (((size) & 3) << 8)) +#define FLAG_SET_ADDRSIZE(di, size) ((di->flags) |= (((size) & 3) << 10)) +#define FLAG_GET_OPSIZE(flags) (((flags) >> 8) & 3) +#define FLAG_GET_ADDRSIZE(flags) (((flags) >> 10) & 3) +/* To get the LOCK/REPNZ/REP prefixes. */ +#define FLAG_GET_PREFIX(flags) ((flags) & 7) +/* Indicates whether the instruction is privileged. */ +#define FLAG_GET_PRIVILEGED(flags) (((flags) & FLAG_PRIVILEGED_INSTRUCTION) != 0) + +/* + * Macros to extract segment registers from 'segment': + */ +#define SEGMENT_DEFAULT 0x80 +#define SEGMENT_SET(di, seg) ((di->segment) |= seg) +#define SEGMENT_GET(segment) (((segment) == R_NONE) ? R_NONE : ((segment) & 0x7f)) +#define SEGMENT_IS_DEFAULT(segment) (((segment) & SEGMENT_DEFAULT) == SEGMENT_DEFAULT) + + +/* Decodes modes of the disassembler, 16 bits or 32 bits or 64 bits for AMD64, x86-64. */ +typedef enum { Decode16Bits = 0, Decode32Bits = 1, Decode64Bits = 2 } _DecodeType; + +typedef OFFSET_INTEGER _OffsetType; + +typedef struct { + _OffsetType codeOffset, nextOffset; /* nextOffset is OUT only. */ + const uint8_t* code; + int codeLen; /* Using signed integer makes it easier to detect an underflow. */ + _DecodeType dt; + unsigned int features; +} _CodeInfo; + +typedef enum { O_NONE, O_REG, O_IMM, O_IMM1, O_IMM2, O_DISP, O_SMEM, O_MEM, O_PC, O_PTR } _OperandType; + +typedef union { + /* Used by O_IMM: */ + int8_t sbyte; + uint8_t byte; + int16_t sword; + uint16_t word; + int32_t sdword; + uint32_t dword; + int64_t sqword; /* All immediates are SIGN-EXTENDED to 64 bits! */ + uint64_t qword; + + /* Used by O_PC: (Use GET_TARGET_ADDR).*/ + _OffsetType addr; /* It's a relative offset as for now. */ + + /* Used by O_PTR: */ + struct { + uint16_t seg; + /* Can be 16 or 32 bits, size is in ops[n].size. */ + uint32_t off; + } ptr; + + /* Used by O_IMM1 (i1) and O_IMM2 (i2). ENTER instruction only. */ + struct { + uint32_t i1; + uint32_t i2; + } ex; +} _Value; + +typedef struct { + /* Type of operand: + O_NONE: operand is to be ignored. + O_REG: index holds global register index. + O_IMM: instruction.imm. + O_IMM1: instruction.imm.ex.i1. + O_IMM2: instruction.imm.ex.i2. + O_DISP: memory dereference with displacement only, instruction.disp. + O_SMEM: simple memory dereference with optional displacement (a single register memory dereference). + O_MEM: complex memory dereference (optional fields: s/i/b/disp). + O_PC: the relative address of a branch instruction (instruction.imm.addr). + O_PTR: the absolute target address of a far branch instruction (instruction.imm.ptr.seg/off). + */ + uint8_t type; /* _OperandType */ + + /* Index of: + O_REG: holds global register index + O_SMEM: holds the 'base' register. E.G: [ECX], [EBX+0x1234] are both in operand.index. + O_MEM: holds the 'index' register. E.G: [EAX*4] is in operand.index. + */ + uint8_t index; + + /* Size in bits of: + O_REG: register + O_IMM: instruction.imm + O_IMM1: instruction.imm.ex.i1 + O_IMM2: instruction.imm.ex.i2 + O_DISP: instruction.disp + O_SMEM: size of indirection. + O_MEM: size of indirection. + O_PC: size of the relative offset + O_PTR: size of instruction.imm.ptr.off (16 or 32) + */ + uint16_t size; +} _Operand; + +#define OPCODE_ID_NONE 0 +/* Instruction could not be disassembled. */ +#define FLAG_NOT_DECODABLE ((uint16_t)-1) +/* The instruction locks memory access. */ +#define FLAG_LOCK (1 << 0) +/* The instruction is prefixed with a REPNZ. */ +#define FLAG_REPNZ (1 << 1) +/* The instruction is prefixed with a REP, this can be a REPZ, it depends on the specific instruction. */ +#define FLAG_REP (1 << 2) +/* Indicates there is a hint taken for Jcc instructions only. */ +#define FLAG_HINT_TAKEN (1 << 3) +/* Indicates there is a hint non-taken for Jcc instructions only. */ +#define FLAG_HINT_NOT_TAKEN (1 << 4) +/* The Imm value is signed extended (E.G in 64 bit decoding mode, a 32 bit imm is usually sign extended into 64 bit imm). */ +#define FLAG_IMM_SIGNED (1 << 5) +/* The destination operand is writable. */ +#define FLAG_DST_WR (1 << 6) +/* The instruction uses RIP-relative indirection. */ +#define FLAG_RIP_RELATIVE (1 << 7) + +/* See flag FLAG_GET_XXX macros above. */ + +/* The instruction is privileged and can only be used from Ring0. */ +#define FLAG_PRIVILEGED_INSTRUCTION (1 << 15) + +/* No register was defined. */ +#define R_NONE ((uint8_t)-1) + +#define REGS64_BASE 0 +#define REGS32_BASE 16 +#define REGS16_BASE 32 +#define REGS8_BASE 48 +#define REGS8_REX_BASE 64 +#define SREGS_BASE 68 +#define FPUREGS_BASE 75 +#define MMXREGS_BASE 83 +#define SSEREGS_BASE 91 +#define AVXREGS_BASE 107 +#define CREGS_BASE 123 +#define DREGS_BASE 132 + +#define OPERANDS_NO (4) + +typedef struct { + /* Used by ops[n].type == O_IMM/O_IMM1&O_IMM2/O_PTR/O_PC. Its size is ops[n].size. */ + _Value imm; + /* Used by ops[n].type == O_SMEM/O_MEM/O_DISP. Its size is dispSize. */ + uint64_t disp; + /* Virtual address of first byte of instruction. */ + _OffsetType addr; + /* General flags of instruction, holds prefixes and more, if FLAG_NOT_DECODABLE, instruction is invalid. */ + uint16_t flags; + /* Unused prefixes mask, for each bit that is set that prefix is not used (LSB is byte [addr + 0]). */ + uint16_t unusedPrefixesMask; + /* Mask of registers that were used in the operands, only used for quick look up, in order to know *some* operand uses that register class. */ + uint32_t usedRegistersMask; + /* ID of opcode in the global opcode table. Use for mnemonic look up. */ + uint16_t opcode; + /* Up to four operands per instruction, ignored if ops[n].type == O_NONE. */ + _Operand ops[OPERANDS_NO]; + /* Size of the whole instruction in bytes. */ + uint8_t size; + /* Segment information of memory indirection, default segment, or overriden one, can be -1. Use SEGMENT macros. */ + uint8_t segment; + /* Used by ops[n].type == O_MEM. Base global register index (might be R_NONE), scale size (2/4/8), ignored for 0 or 1. */ + uint8_t base, scale; + uint8_t dispSize; + /* Meta defines the instruction set class, and the flow control flags. Use META macros. */ + uint8_t meta; + /* The CPU flags that the instruction operates upon. */ + uint16_t modifiedFlagsMask, testedFlagsMask, undefinedFlagsMask; +} _DInst; + +#ifndef DISTORM_LIGHT + +/* Static size of strings. Do not change this value. Keep Python wrapper in sync. */ +#define MAX_TEXT_SIZE (48) +typedef struct { + unsigned int length; + unsigned char p[MAX_TEXT_SIZE]; /* p is a null terminated string. */ +} _WString; + +/* + * Old decoded instruction structure in text format. + * Used only for backward compatibility with diStorm64. + * This structure holds all information the disassembler generates per instruction. + */ +typedef struct { + _WString mnemonic; /* Mnemonic of decoded instruction, prefixed if required by REP, LOCK etc. */ + _WString operands; /* Operands of the decoded instruction, up to 3 operands, comma-seperated. */ + _WString instructionHex; /* Hex dump - little endian, including prefixes. */ + unsigned int size; /* Size of decoded instruction in bytes. */ + _OffsetType offset; /* Start offset of the decoded instruction. */ +} _DecodedInst; + +#endif /* DISTORM_LIGHT */ + +/* Register masks for quick look up, each mask indicates one of a register-class that is being used in some operand. */ +#define RM_AX 1 /* AL, AH, AX, EAX, RAX */ +#define RM_CX 2 /* CL, CH, CX, ECX, RCX */ +#define RM_DX 4 /* DL, DH, DX, EDX, RDX */ +#define RM_BX 8 /* BL, BH, BX, EBX, RBX */ +#define RM_SP 0x10 /* SPL, SP, ESP, RSP */ +#define RM_BP 0x20 /* BPL, BP, EBP, RBP */ +#define RM_SI 0x40 /* SIL, SI, ESI, RSI */ +#define RM_DI 0x80 /* DIL, DI, EDI, RDI */ +#define RM_FPU 0x100 /* ST(0) - ST(7) */ +#define RM_MMX 0x200 /* MM0 - MM7 */ +#define RM_SSE 0x400 /* XMM0 - XMM15 */ +#define RM_AVX 0x800 /* YMM0 - YMM15 */ +#define RM_CR 0x1000 /* CR0, CR2, CR3, CR4, CR8 */ +#define RM_DR 0x2000 /* DR0, DR1, DR2, DR3, DR6, DR7 */ +#define RM_R8 0x4000 /* R8B, R8W, R8D, R8 */ +#define RM_R9 0x8000 /* R9B, R9W, R9D, R9 */ +#define RM_R10 0x10000 /* R10B, R10W, R10D, R10 */ +#define RM_R11 0x20000 /* R11B, R11W, R11D, R11 */ +#define RM_R12 0x40000 /* R12B, R12W, R12D, R12 */ +#define RM_R13 0x80000 /* R13B, R13W, R13D, R13 */ +#define RM_R14 0x100000 /* R14B, R14W, R14D, R14 */ +#define RM_R15 0x200000 /* R15B, R15W, R15D, R15 */ + +/* RIP should be checked using the 'flags' field and FLAG_RIP_RELATIVE. + * Segments should be checked using the segment macros. + * For now R8 - R15 are not supported and non general purpose registers map into same RM. + */ + +/* CPU flags that instructions modify, test or undefine (are EFLAGS compatible!). */ +#define D_CF 1 /* Carry */ +#define D_PF 4 /* Parity */ +#define D_AF 0x10 /* Auxiliary */ +#define D_ZF 0x40 /* Zero */ +#define D_SF 0x80 /* Sign */ +#define D_IF 0x200 /* Interrupt */ +#define D_DF 0x400 /* Direction */ +#define D_OF 0x800 /* Overflow */ + +/* + * Instructions Set classes: + * if you want a better understanding of the available classes, look at disOps project, file: x86sets.py. + */ +/* Indicates the instruction belongs to the General Integer set. */ +#define ISC_INTEGER 1 +/* Indicates the instruction belongs to the 387 FPU set. */ +#define ISC_FPU 2 +/* Indicates the instruction belongs to the P6 set. */ +#define ISC_P6 3 +/* Indicates the instruction belongs to the MMX set. */ +#define ISC_MMX 4 +/* Indicates the instruction belongs to the SSE set. */ +#define ISC_SSE 5 +/* Indicates the instruction belongs to the SSE2 set. */ +#define ISC_SSE2 6 +/* Indicates the instruction belongs to the SSE3 set. */ +#define ISC_SSE3 7 +/* Indicates the instruction belongs to the SSSE3 set. */ +#define ISC_SSSE3 8 +/* Indicates the instruction belongs to the SSE4.1 set. */ +#define ISC_SSE4_1 9 +/* Indicates the instruction belongs to the SSE4.2 set. */ +#define ISC_SSE4_2 10 +/* Indicates the instruction belongs to the AMD's SSE4.A set. */ +#define ISC_SSE4_A 11 +/* Indicates the instruction belongs to the 3DNow! set. */ +#define ISC_3DNOW 12 +/* Indicates the instruction belongs to the 3DNow! Extensions set. */ +#define ISC_3DNOWEXT 13 +/* Indicates the instruction belongs to the VMX (Intel) set. */ +#define ISC_VMX 14 +/* Indicates the instruction belongs to the SVM (AMD) set. */ +#define ISC_SVM 15 +/* Indicates the instruction belongs to the AVX (Intel) set. */ +#define ISC_AVX 16 +/* Indicates the instruction belongs to the FMA (Intel) set. */ +#define ISC_FMA 17 +/* Indicates the instruction belongs to the AES/AVX (Intel) set. */ +#define ISC_AES 18 +/* Indicates the instruction belongs to the CLMUL (Intel) set. */ +#define ISC_CLMUL 19 + +/* Features for decompose: */ +#define DF_NONE 0 +/* The decoder will limit addresses to a maximum of 16 bits. */ +#define DF_MAXIMUM_ADDR16 1 +/* The decoder will limit addresses to a maximum of 32 bits. */ +#define DF_MAXIMUM_ADDR32 2 +/* The decoder will return only flow control instructions (and filter the others internally). */ +#define DF_RETURN_FC_ONLY 4 +/* The decoder will stop and return to the caller when the instruction 'CALL' (near and far) was decoded. */ +#define DF_STOP_ON_CALL 8 +/* The decoder will stop and return to the caller when the instruction 'RET' (near and far) was decoded. */ +#define DF_STOP_ON_RET 0x10 +/* The decoder will stop and return to the caller when the instruction system-call/ret was decoded. */ +#define DF_STOP_ON_SYS 0x20 +/* The decoder will stop and return to the caller when any of the branch 'JMP', (near and far) instructions were decoded. */ +#define DF_STOP_ON_UNC_BRANCH 0x40 +/* The decoder will stop and return to the caller when any of the conditional branch instruction were decoded. */ +#define DF_STOP_ON_CND_BRANCH 0x80 +/* The decoder will stop and return to the caller when the instruction 'INT' (INT, INT1, INTO, INT 3) was decoded. */ +#define DF_STOP_ON_INT 0x100 +/* The decoder will stop and return to the caller when any of the 'CMOVxx' instruction was decoded. */ +#define DF_STOP_ON_CMOV 0x200 +/* The decoder will stop and return to the caller when any flow control instruction was decoded. */ +#define DF_STOP_ON_FLOW_CONTROL (DF_STOP_ON_CALL | DF_STOP_ON_RET | DF_STOP_ON_SYS | DF_STOP_ON_UNC_BRANCH | DF_STOP_ON_CND_BRANCH | DF_STOP_ON_INT | DF_STOP_ON_CMOV) + +/* Indicates the instruction is not a flow-control instruction. */ +#define FC_NONE 0 +/* Indicates the instruction is one of: CALL, CALL FAR. */ +#define FC_CALL 1 +/* Indicates the instruction is one of: RET, IRET, RETF. */ +#define FC_RET 2 +/* Indicates the instruction is one of: SYSCALL, SYSRET, SYSENTER, SYSEXIT. */ +#define FC_SYS 3 +/* Indicates the instruction is one of: JMP, JMP FAR. */ +#define FC_UNC_BRANCH 4 +/* + * Indicates the instruction is one of: + * JCXZ, JO, JNO, JB, JAE, JZ, JNZ, JBE, JA, JS, JNS, JP, JNP, JL, JGE, JLE, JG, LOOP, LOOPZ, LOOPNZ. + */ +#define FC_CND_BRANCH 5 +/* Indiciates the instruction is one of: INT, INT1, INT 3, INTO, UD2. */ +#define FC_INT 6 +/* Indicates the instruction is one of: CMOVxx. */ +#define FC_CMOV 7 + +/* Return code of the decoding function. */ +typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR, DECRES_FILTERED } _DecodeResult; + +/* Define the following interface functions only for outer projects. */ +#if !(defined(DISTORM_STATIC) || defined(DISTORM_DYNAMIC)) + +/* distorm_decode + * Input: + * offset - Origin of the given code (virtual address that is), NOT an offset in code. + * code - Pointer to the code buffer to be disassembled. + * length - Amount of bytes that should be decoded from the code buffer. + * dt - Decoding mode, 16 bits (Decode16Bits), 32 bits (Decode32Bits) or AMD64 (Decode64Bits). + * result - Array of type _DecodeInst which will be used by this function in order to return the disassembled instructions. + * maxInstructions - The maximum number of entries in the result array that you pass to this function, so it won't exceed its bound. + * usedInstructionsCount - Number of the instruction that successfully were disassembled and written to the result array. + * Output: usedInstructionsCount will hold the number of entries used in the result array + * and the result array itself will be filled with the disassembled instructions. + * Return: DECRES_SUCCESS on success (no more to disassemble), DECRES_INPUTERR on input error (null code buffer, invalid decoding mode, etc...), + * DECRES_MEMORYERR when there are not enough entries to use in the result array, BUT YOU STILL have to check for usedInstructionsCount! + * Side-Effects: Even if the return code is DECRES_MEMORYERR, there might STILL be data in the + * array you passed, this function will try to use as much entries as possible! + * Notes: 1)The minimal size of maxInstructions is 15. + * 2)You will have to synchronize the offset,code and length by yourself if you pass code fragments and not a complete code block! + */ + +/* distorm_decompose + * See more documentation online at the GitHub project's wiki. + * + */ +#ifdef SUPPORT_64BIT_OFFSET + + _DecodeResult distorm_decompose64(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount); + #define distorm_decompose distorm_decompose64 + +#ifndef DISTORM_LIGHT + /* If distorm-light is defined, we won't export these text-formatting functionality. */ + _DecodeResult distorm_decode64(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount); + void distorm_format64(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result); + #define distorm_decode distorm_decode64 + #define distorm_format distorm_format64 +#endif /*DISTORM_LIGHT*/ + +#else /*SUPPORT_64BIT_OFFSET*/ + + _DecodeResult distorm_decompose32(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount); + #define distorm_decompose distorm_decompose32 + +#ifndef DISTORM_LIGHT + /* If distorm-light is defined, we won't export these text-formatting functionality. */ + _DecodeResult distorm_decode32(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount); + void distorm_format32(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result); + #define distorm_decode distorm_decode32 + #define distorm_format distorm_format32 +#endif /*DISTORM_LIGHT*/ + +#endif + +/* + * distorm_version + * Input: + * none + * + * Output: unsigned int - version of compiled library. + */ +unsigned int distorm_version(); + +#endif /* DISTORM_STATIC */ + +#ifdef __cplusplus +} /* End Of Extern */ +#endif + +#endif /* DISTORM_H */ diff --git a/NativeCore/Dependencies/distorm/include/mnemonics.h b/NativeCore/Dependencies/distorm/include/mnemonics.h new file mode 100644 index 00000000..ef9889c8 --- /dev/null +++ b/NativeCore/Dependencies/distorm/include/mnemonics.h @@ -0,0 +1,301 @@ +/* +mnemonics.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef MNEMONICS_H +#define MNEMONICS_H + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef DISTORM_LIGHT + +typedef struct WMnemonic { + unsigned char length; + unsigned char p[1]; /* p is a null terminated string, which contains 'length' characters. */ +} _WMnemonic; + +typedef struct WRegister { + unsigned int length; + unsigned char p[6]; /* p is a null terminated string. */ +} _WRegister; + +extern const unsigned char _MNEMONICS[]; +extern const _WRegister _REGISTERS[]; + +#endif /* DISTORM_LIGHT */ + +#ifdef __cplusplus +} /* End Of Extern */ +#endif + +#define GET_REGISTER_NAME(r) (unsigned char*)_REGISTERS[(r)].p +#define GET_MNEMONIC_NAME(m) ((_WMnemonic*)&_MNEMONICS[(m)])->p + + typedef enum { + I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3132, + I_ADDPS = 3125, I_ADDSD = 3146, I_ADDSS = 3139, I_ADDSUBPD = 6416, I_ADDSUBPS = 6426, + I_AESDEC = 9231, I_AESDECLAST = 9248, I_AESENC = 9189, I_AESENCLAST = 9206, + I_AESIMC = 9172, I_AESKEYGENASSIST = 9817, I_AND = 41, I_ANDNPD = 3043, I_ANDNPS = 3035, + I_ANDPD = 3012, I_ANDPS = 3005, I_ARPL = 111, I_BLENDPD = 9394, I_BLENDPS = 9375, + I_BLENDVPD = 7641, I_BLENDVPS = 7631, I_BOUND = 104, I_BSF = 4368, I_BSR = 4380, + I_BSWAP = 960, I_BT = 872, I_BTC = 934, I_BTR = 912, I_BTS = 887, I_CALL = 456, + I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLC = 492, I_CLD = 512, + I_CLFLUSH = 4351, I_CLGI = 1855, I_CLI = 502, I_CLTS = 541, I_CMC = 487, I_CMOVA = 694, + I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, I_CMOVGE = 738, + I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, I_CMOVNS = 708, + I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, I_CMOVZ = 671, + I_CMP = 71, I_CMPEQPD = 4471, I_CMPEQPS = 4392, I_CMPEQSD = 4629, I_CMPEQSS = 4550, + I_CMPLEPD = 4489, I_CMPLEPS = 4410, I_CMPLESD = 4647, I_CMPLESS = 4568, I_CMPLTPD = 4480, + I_CMPLTPS = 4401, I_CMPLTSD = 4638, I_CMPLTSS = 4559, I_CMPNEQPD = 4510, I_CMPNEQPS = 4431, + I_CMPNEQSD = 4668, I_CMPNEQSS = 4589, I_CMPNLEPD = 4530, I_CMPNLEPS = 4451, + I_CMPNLESD = 4688, I_CMPNLESS = 4609, I_CMPNLTPD = 4520, I_CMPNLTPS = 4441, + I_CMPNLTSD = 4678, I_CMPNLTSS = 4599, I_CMPORDPD = 4540, I_CMPORDPS = 4461, + I_CMPORDSD = 4698, I_CMPORDSS = 4619, I_CMPS = 301, I_CMPUNORDPD = 4498, I_CMPUNORDPS = 4419, + I_CMPUNORDSD = 4656, I_CMPUNORDSS = 4577, I_CMPXCHG = 898, I_CMPXCHG16B = 6395, + I_CMPXCHG8B = 6384, I_COMISD = 2801, I_COMISS = 2793, I_CPUID = 865, I_CQO = 255, + I_CRC32 = 9280, I_CVTDQ2PD = 6809, I_CVTDQ2PS = 3329, I_CVTPD2DQ = 6819, I_CVTPD2PI = 2703, + I_CVTPD2PS = 3255, I_CVTPH2PS = 4183, I_CVTPI2PD = 2517, I_CVTPI2PS = 2507, + I_CVTPS2DQ = 3339, I_CVTPS2PD = 3245, I_CVTPS2PH = 4193, I_CVTPS2PI = 2693, + I_CVTSD2SI = 2723, I_CVTSD2SS = 3275, I_CVTSI2SD = 2537, I_CVTSI2SS = 2527, + I_CVTSS2SD = 3265, I_CVTSS2SI = 2713, I_CVTTPD2DQ = 6798, I_CVTTPD2PI = 2636, + I_CVTTPS2DQ = 3349, I_CVTTPS2PI = 2625, I_CVTTSD2SI = 2658, I_CVTTSS2SI = 2647, + I_CWD = 245, I_CWDE = 233, I_DAA = 46, I_DAS = 56, I_DEC = 86, I_DIV = 1646, + I_DIVPD = 3521, I_DIVPS = 3514, I_DIVSD = 3535, I_DIVSS = 3528, I_DPPD = 9637, + I_DPPS = 9624, I_EMMS = 4122, I_ENTER = 340, I_EXTRACTPS = 9502, I_EXTRQ = 4158, + I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, I_FADDP = 1549, I_FBLD = 1601, + I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7311, I_FCMOVB = 1376, I_FCMOVBE = 1392, + I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, I_FCMOVNE = 1454, I_FCMOVNU = 1473, + I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, I_FCOMIP = 1623, I_FCOMP = 1041, + I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, I_FDIV = 1061, I_FDIVP = 1594, + I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, I_FEMMS = 574, I_FENI = 1482, + I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, I_FICOMP = 1338, I_FIDIV = 1361, + I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, I_FINCSTP = 1247, I_FINIT = 7326, + I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, I_FISUB = 1346, I_FISUBR = 1353, + I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, I_FLDENV = 1090, I_FLDL2E = 1155, + I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, I_FLDPI = 1163, I_FLDZ = 1186, + I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7303, I_FNINIT = 7318, I_FNOP = 1111, + I_FNSAVE = 7333, I_FNSTCW = 7288, I_FNSTENV = 7271, I_FNSTSW = 7348, I_FPATAN = 1213, + I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, I_FRNDINT = 1288, I_FRSTOR = 1519, + I_FSAVE = 7341, I_FSCALE = 1297, I_FSETPM = 1496, I_FSIN = 1305, I_FSINCOS = 1279, + I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7296, I_FSTENV = 7280, I_FSTP = 1084, + I_FSTSW = 7356, I_FSUB = 1048, I_FSUBP = 1579, I_FSUBR = 1054, I_FSUBRP = 1571, + I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, I_FUCOMIP = 1614, I_FUCOMP = 1541, + I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, I_FXRSTOR = 9914, I_FXRSTOR64 = 9923, + I_FXSAVE = 9886, I_FXSAVE64 = 9894, I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, + I_GETSEC = 633, I_HADDPD = 4203, I_HADDPS = 4211, I_HLT = 482, I_HSUBPD = 4237, + I_HSUBPS = 4245, I_IDIV = 1651, I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, + I_INSERTPS = 9569, I_INSERTQ = 4165, I_INT = 367, I_INT_3 = 360, I_INT1 = 476, + I_INTO = 372, I_INVD = 555, I_INVEPT = 8306, I_INVLPG = 1727, I_INVLPGA = 1869, + I_INVPCID = 8323, I_INVVPID = 8314, I_IRET = 378, I_JA = 166, I_JAE = 147, + I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, I_JG = 202, I_JGE = 192, + I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, I_JNO = 138, I_JNP = 183, + I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, I_JRCXZ = 440, I_JS = 170, + I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7016, I_LDMXCSR = 9944, I_LDS = 335, + I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4287, I_LFS = 917, I_LGDT = 1703, + I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, I_LODS = 313, I_LOOP = 421, + I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, I_LTR = 1674, I_LZCNT = 4385, + I_MASKMOVDQU = 7141, I_MASKMOVQ = 7131, I_MAXPD = 3581, I_MAXPS = 3574, I_MAXSD = 3595, + I_MAXSS = 3588, I_MFENCE = 4313, I_MINPD = 3461, I_MINPS = 3454, I_MINSD = 3475, + I_MINSS = 3468, I_MONITOR = 1771, I_MOV = 218, I_MOVAPD = 2481, I_MOVAPS = 2473, + I_MOVBE = 9273, I_MOVD = 3942, I_MOVDDUP = 2208, I_MOVDQ2Q = 6544, I_MOVDQA = 3968, + I_MOVDQU = 3976, I_MOVHLPS = 2173, I_MOVHPD = 2367, I_MOVHPS = 2359, I_MOVLHPS = 2350, + I_MOVLPD = 2190, I_MOVLPS = 2182, I_MOVMSKPD = 2837, I_MOVMSKPS = 2827, I_MOVNTDQ = 6871, + I_MOVNTDQA = 7917, I_MOVNTI = 952, I_MOVNTPD = 2578, I_MOVNTPS = 2569, I_MOVNTQ = 6863, + I_MOVNTSD = 2596, I_MOVNTSS = 2587, I_MOVQ = 3948, I_MOVQ2DQ = 6535, I_MOVS = 295, + I_MOVSD = 2132, I_MOVSHDUP = 2375, I_MOVSLDUP = 2198, I_MOVSS = 2125, I_MOVSX = 939, + I_MOVSXD = 10027, I_MOVUPD = 2117, I_MOVUPS = 2109, I_MOVZX = 927, I_MPSADBW = 9650, + I_MUL = 1641, I_MULPD = 3192, I_MULPS = 3185, I_MULSD = 3206, I_MULSS = 3199, + I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, I_NOT = 1631, I_OR = 27, I_ORPD = 3075, + I_ORPS = 3069, I_OUT = 451, I_OUTS = 128, I_PABSB = 7710, I_PABSD = 7740, I_PABSW = 7725, + I_PACKSSDW = 3871, I_PACKSSWB = 3703, I_PACKUSDW = 7938, I_PACKUSWB = 3781, + I_PADDB = 7226, I_PADDD = 7256, I_PADDQ = 6503, I_PADDSB = 6952, I_PADDSW = 6969, + I_PADDUSB = 6642, I_PADDUSW = 6661, I_PADDW = 7241, I_PALIGNR = 9432, I_PAND = 6629, + I_PANDN = 6687, I_PAUSE = 10035, I_PAVGB = 6702, I_PAVGUSB = 2100, I_PAVGW = 6747, + I_PBLENDVB = 7621, I_PBLENDW = 9413, I_PCLMULQDQ = 9669, I_PCMPEQB = 4065, + I_PCMPEQD = 4103, I_PCMPEQQ = 7898, I_PCMPEQW = 4084, I_PCMPESTRI = 9748, + I_PCMPESTRM = 9725, I_PCMPGTB = 3724, I_PCMPGTD = 3762, I_PCMPGTQ = 8109, + I_PCMPGTW = 3743, I_PCMPISTRI = 9794, I_PCMPISTRM = 9771, I_PEXTRB = 9451, + I_PEXTRD = 9468, I_PEXTRQ = 9476, I_PEXTRW = 6333, I_PF2ID = 1936, I_PF2IW = 1929, + I_PFACC = 2050, I_PFADD = 1999, I_PFCMPEQ = 2057, I_PFCMPGE = 1960, I_PFCMPGT = 2006, + I_PFMAX = 2015, I_PFMIN = 1969, I_PFMUL = 2066, I_PFNACC = 1943, I_PFPNACC = 1951, + I_PFRCP = 1976, I_PFRCPIT1 = 2022, I_PFRCPIT2 = 2073, I_PFRSQIT1 = 2032, I_PFRSQRT = 1983, + I_PFSUB = 1992, I_PFSUBR = 2042, I_PHADDD = 7397, I_PHADDSW = 7414, I_PHADDW = 7380, + I_PHMINPOSUW = 8281, I_PHSUBD = 7473, I_PHSUBSW = 7490, I_PHSUBW = 7456, I_PI2FD = 1922, + I_PI2FW = 1915, I_PINSRB = 9552, I_PINSRD = 9590, I_PINSRQ = 9598, I_PINSRW = 6316, + I_PMADDUBSW = 7433, I_PMADDWD = 7095, I_PMAXSB = 8196, I_PMAXSD = 8213, I_PMAXSW = 6986, + I_PMAXUB = 6670, I_PMAXUD = 8247, I_PMAXUW = 8230, I_PMINSB = 8128, I_PMINSD = 8145, + I_PMINSW = 6924, I_PMINUB = 6612, I_PMINUD = 8179, I_PMINUW = 8162, I_PMOVMSKB = 6553, + I_PMOVSXBD = 7776, I_PMOVSXBQ = 7797, I_PMOVSXBW = 7755, I_PMOVSXDQ = 7860, + I_PMOVSXWD = 7818, I_PMOVSXWQ = 7839, I_PMOVZXBD = 8004, I_PMOVZXBQ = 8025, + I_PMOVZXBW = 7983, I_PMOVZXDQ = 8088, I_PMOVZXWD = 8046, I_PMOVZXWQ = 8067, + I_PMULDQ = 7881, I_PMULHRSW = 7560, I_PMULHRW = 2083, I_PMULHUW = 6762, I_PMULHW = 6781, + I_PMULLD = 8264, I_PMULLW = 6518, I_PMULUDQ = 7076, I_POP = 22, I_POPA = 98, + I_POPCNT = 4360, I_POPF = 277, I_POR = 6941, I_PREFETCH = 1894, I_PREFETCHNTA = 2424, + I_PREFETCHT0 = 2437, I_PREFETCHT1 = 2449, I_PREFETCHT2 = 2461, I_PREFETCHW = 1904, + I_PSADBW = 7114, I_PSHUFB = 7363, I_PSHUFD = 4010, I_PSHUFHW = 4018, I_PSHUFLW = 4027, + I_PSHUFW = 4002, I_PSIGNB = 7509, I_PSIGND = 7543, I_PSIGNW = 7526, I_PSLLD = 7046, + I_PSLLDQ = 9869, I_PSLLQ = 7061, I_PSLLW = 7031, I_PSRAD = 6732, I_PSRAW = 6717, + I_PSRLD = 6473, I_PSRLDQ = 9852, I_PSRLQ = 6488, I_PSRLW = 6458, I_PSUBB = 7166, + I_PSUBD = 7196, I_PSUBQ = 7211, I_PSUBSB = 6890, I_PSUBSW = 6907, I_PSUBUSB = 6574, + I_PSUBUSW = 6593, I_PSUBW = 7181, I_PSWAPD = 2092, I_PTEST = 7651, I_PUNPCKHBW = 3802, + I_PUNPCKHDQ = 3848, I_PUNPCKHQDQ = 3917, I_PUNPCKHWD = 3825, I_PUNPCKLBW = 3634, + I_PUNPCKLDQ = 3680, I_PUNPCKLQDQ = 3892, I_PUNPCKLWD = 3657, I_PUSH = 16, + I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7003, I_RCL = 977, I_RCPPS = 2975, I_RCPSS = 2982, + I_RCR = 982, I_RDFSBASE = 9904, I_RDGSBASE = 9934, I_RDMSR = 600, I_RDPMC = 607, + I_RDRAND = 10048, I_RDTSC = 593, I_RDTSCP = 1886, I_RET = 325, I_RETF = 354, + I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9318, I_ROUNDPS = 9299, I_ROUNDSD = 9356, + I_ROUNDSS = 9337, I_RSM = 882, I_RSQRTPS = 2937, I_RSQRTSS = 2946, I_SAHF = 283, + I_SAL = 997, I_SALC = 394, I_SAR = 1002, I_SBB = 36, I_SCAS = 319, I_SETA = 807, + I_SETAE = 780, I_SETB = 774, I_SETBE = 800, I_SETG = 859, I_SETGE = 845, I_SETL = 839, + I_SETLE = 852, I_SETNO = 767, I_SETNP = 832, I_SETNS = 819, I_SETNZ = 793, + I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4343, I_SGDT = 1691, + I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6358, I_SHUFPS = 6350, + I_SIDT = 1697, I_SKINIT = 1861, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2877, + I_SQRTPS = 2869, I_SQRTSD = 2893, I_SQRTSS = 2885, I_STC = 497, I_STD = 517, + I_STGI = 1849, I_STI = 507, I_STMXCSR = 9973, I_STOS = 307, I_STR = 1663, I_SUB = 51, + I_SUBPD = 3401, I_SUBPS = 3394, I_SUBSD = 3415, I_SUBSS = 3408, I_SWAPGS = 1878, + I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, I_TEST = 206, + I_TZCNT = 4373, I_UCOMISD = 2764, I_UCOMISS = 2755, I_UD2 = 569, I_UNPCKHPD = 2318, + I_UNPCKHPS = 2308, I_UNPCKLPD = 2276, I_UNPCKLPS = 2266, I_VADDPD = 3161, + I_VADDPS = 3153, I_VADDSD = 3177, I_VADDSS = 3169, I_VADDSUBPD = 6436, I_VADDSUBPS = 6447, + I_VAESDEC = 9239, I_VAESDECLAST = 9260, I_VAESENC = 9197, I_VAESENCLAST = 9218, + I_VAESIMC = 9180, I_VAESKEYGENASSIST = 9834, I_VANDNPD = 3060, I_VANDNPS = 3051, + I_VANDPD = 3027, I_VANDPS = 3019, I_VBLENDPD = 9403, I_VBLENDPS = 9384, I_VBLENDVPD = 9703, + I_VBLENDVPS = 9692, I_VBROADCASTF128 = 7694, I_VBROADCASTSD = 7680, I_VBROADCASTSS = 7666, + I_VCMPEQPD = 5110, I_VCMPEQPS = 4708, I_VCMPEQSD = 5914, I_VCMPEQSS = 5512, + I_VCMPEQ_OSPD = 5291, I_VCMPEQ_OSPS = 4889, I_VCMPEQ_OSSD = 6095, I_VCMPEQ_OSSS = 5693, + I_VCMPEQ_UQPD = 5197, I_VCMPEQ_UQPS = 4795, I_VCMPEQ_UQSD = 6001, I_VCMPEQ_UQSS = 5599, + I_VCMPEQ_USPD = 5400, I_VCMPEQ_USPS = 4998, I_VCMPEQ_USSD = 6204, I_VCMPEQ_USSS = 5802, + I_VCMPFALSEPD = 5232, I_VCMPFALSEPS = 4830, I_VCMPFALSESD = 6036, I_VCMPFALSESS = 5634, + I_VCMPFALSE_OSPD = 5441, I_VCMPFALSE_OSPS = 5039, I_VCMPFALSE_OSSD = 6245, + I_VCMPFALSE_OSSS = 5843, I_VCMPGEPD = 5259, I_VCMPGEPS = 4857, I_VCMPGESD = 6063, + I_VCMPGESS = 5661, I_VCMPGE_OQPD = 5471, I_VCMPGE_OQPS = 5069, I_VCMPGE_OQSD = 6275, + I_VCMPGE_OQSS = 5873, I_VCMPGTPD = 5269, I_VCMPGTPS = 4867, I_VCMPGTSD = 6073, + I_VCMPGTSS = 5671, I_VCMPGT_OQPD = 5484, I_VCMPGT_OQPS = 5082, I_VCMPGT_OQSD = 6288, + I_VCMPGT_OQSS = 5886, I_VCMPLEPD = 5130, I_VCMPLEPS = 4728, I_VCMPLESD = 5934, + I_VCMPLESS = 5532, I_VCMPLE_OQPD = 5317, I_VCMPLE_OQPS = 4915, I_VCMPLE_OQSD = 6121, + I_VCMPLE_OQSS = 5719, I_VCMPLTPD = 5120, I_VCMPLTPS = 4718, I_VCMPLTSD = 5924, + I_VCMPLTSS = 5522, I_VCMPLT_OQPD = 5304, I_VCMPLT_OQPS = 4902, I_VCMPLT_OQSD = 6108, + I_VCMPLT_OQSS = 5706, I_VCMPNEQPD = 5153, I_VCMPNEQPS = 4751, I_VCMPNEQSD = 5957, + I_VCMPNEQSS = 5555, I_VCMPNEQ_OQPD = 5245, I_VCMPNEQ_OQPS = 4843, I_VCMPNEQ_OQSD = 6049, + I_VCMPNEQ_OQSS = 5647, I_VCMPNEQ_OSPD = 5457, I_VCMPNEQ_OSPS = 5055, I_VCMPNEQ_OSSD = 6261, + I_VCMPNEQ_OSSS = 5859, I_VCMPNEQ_USPD = 5345, I_VCMPNEQ_USPS = 4943, I_VCMPNEQ_USSD = 6149, + I_VCMPNEQ_USSS = 5747, I_VCMPNGEPD = 5210, I_VCMPNGEPS = 4808, I_VCMPNGESD = 6014, + I_VCMPNGESS = 5612, I_VCMPNGE_UQPD = 5413, I_VCMPNGE_UQPS = 5011, I_VCMPNGE_UQSD = 6217, + I_VCMPNGE_UQSS = 5815, I_VCMPNGTPD = 5221, I_VCMPNGTPS = 4819, I_VCMPNGTSD = 6025, + I_VCMPNGTSS = 5623, I_VCMPNGT_UQPD = 5427, I_VCMPNGT_UQPS = 5025, I_VCMPNGT_UQSD = 6231, + I_VCMPNGT_UQSS = 5829, I_VCMPNLEPD = 5175, I_VCMPNLEPS = 4773, I_VCMPNLESD = 5979, + I_VCMPNLESS = 5577, I_VCMPNLE_UQPD = 5373, I_VCMPNLE_UQPS = 4971, I_VCMPNLE_UQSD = 6177, + I_VCMPNLE_UQSS = 5775, I_VCMPNLTPD = 5164, I_VCMPNLTPS = 4762, I_VCMPNLTSD = 5968, + I_VCMPNLTSS = 5566, I_VCMPNLT_UQPD = 5359, I_VCMPNLT_UQPS = 4957, I_VCMPNLT_UQSD = 6163, + I_VCMPNLT_UQSS = 5761, I_VCMPORDPD = 5186, I_VCMPORDPS = 4784, I_VCMPORDSD = 5990, + I_VCMPORDSS = 5588, I_VCMPORD_SPD = 5387, I_VCMPORD_SPS = 4985, I_VCMPORD_SSD = 6191, + I_VCMPORD_SSS = 5789, I_VCMPTRUEPD = 5279, I_VCMPTRUEPS = 4877, I_VCMPTRUESD = 6083, + I_VCMPTRUESS = 5681, I_VCMPTRUE_USPD = 5497, I_VCMPTRUE_USPS = 5095, I_VCMPTRUE_USSD = 6301, + I_VCMPTRUE_USSS = 5899, I_VCMPUNORDPD = 5140, I_VCMPUNORDPS = 4738, I_VCMPUNORDSD = 5944, + I_VCMPUNORDSS = 5542, I_VCMPUNORD_SPD = 5330, I_VCMPUNORD_SPS = 4928, I_VCMPUNORD_SSD = 6134, + I_VCMPUNORD_SSS = 5732, I_VCOMISD = 2818, I_VCOMISS = 2809, I_VCVTDQ2PD = 6841, + I_VCVTDQ2PS = 3360, I_VCVTPD2DQ = 6852, I_VCVTPD2PS = 3296, I_VCVTPS2DQ = 3371, + I_VCVTPS2PD = 3285, I_VCVTSD2SI = 2744, I_VCVTSD2SS = 3318, I_VCVTSI2SD = 2558, + I_VCVTSI2SS = 2547, I_VCVTSS2SD = 3307, I_VCVTSS2SI = 2733, I_VCVTTPD2DQ = 6829, + I_VCVTTPS2DQ = 3382, I_VCVTTSD2SI = 2681, I_VCVTTSS2SI = 2669, I_VDIVPD = 3550, + I_VDIVPS = 3542, I_VDIVSD = 3566, I_VDIVSS = 3558, I_VDPPD = 9643, I_VDPPS = 9630, + I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9538, I_VEXTRACTPS = 9513, + I_VFMADD132PD = 8409, I_VFMADD132PS = 8396, I_VFMADD132SD = 8435, I_VFMADD132SS = 8422, + I_VFMADD213PD = 8689, I_VFMADD213PS = 8676, I_VFMADD213SD = 8715, I_VFMADD213SS = 8702, + I_VFMADD231PD = 8969, I_VFMADD231PS = 8956, I_VFMADD231SD = 8995, I_VFMADD231SS = 8982, + I_VFMADDSUB132PD = 8348, I_VFMADDSUB132PS = 8332, I_VFMADDSUB213PD = 8628, + I_VFMADDSUB213PS = 8612, I_VFMADDSUB231PD = 8908, I_VFMADDSUB231PS = 8892, + I_VFMSUB132PD = 8461, I_VFMSUB132PS = 8448, I_VFMSUB132SD = 8487, I_VFMSUB132SS = 8474, + I_VFMSUB213PD = 8741, I_VFMSUB213PS = 8728, I_VFMSUB213SD = 8767, I_VFMSUB213SS = 8754, + I_VFMSUB231PD = 9021, I_VFMSUB231PS = 9008, I_VFMSUB231SD = 9047, I_VFMSUB231SS = 9034, + I_VFMSUBADD132PD = 8380, I_VFMSUBADD132PS = 8364, I_VFMSUBADD213PD = 8660, + I_VFMSUBADD213PS = 8644, I_VFMSUBADD231PD = 8940, I_VFMSUBADD231PS = 8924, + I_VFNMADD132PD = 8514, I_VFNMADD132PS = 8500, I_VFNMADD132SD = 8542, I_VFNMADD132SS = 8528, + I_VFNMADD213PD = 8794, I_VFNMADD213PS = 8780, I_VFNMADD213SD = 8822, I_VFNMADD213SS = 8808, + I_VFNMADD231PD = 9074, I_VFNMADD231PS = 9060, I_VFNMADD231SD = 9102, I_VFNMADD231SS = 9088, + I_VFNMSUB132PD = 8570, I_VFNMSUB132PS = 8556, I_VFNMSUB132SD = 8598, I_VFNMSUB132SS = 8584, + I_VFNMSUB213PD = 8850, I_VFNMSUB213PS = 8836, I_VFNMSUB213SD = 8878, I_VFNMSUB213SS = 8864, + I_VFNMSUB231PD = 9130, I_VFNMSUB231PS = 9116, I_VFNMSUB231SD = 9158, I_VFNMSUB231SS = 9144, + I_VHADDPD = 4219, I_VHADDPS = 4228, I_VHSUBPD = 4253, I_VHSUBPS = 4262, I_VINSERTF128 = 9525, + I_VINSERTPS = 9579, I_VLDDQU = 7023, I_VLDMXCSR = 9963, I_VMASKMOVDQU = 7153, + I_VMASKMOVPD = 7971, I_VMASKMOVPS = 7959, I_VMAXPD = 3610, I_VMAXPS = 3602, + I_VMAXSD = 3626, I_VMAXSS = 3618, I_VMCALL = 1735, I_VMCLEAR = 10011, I_VMFUNC = 1803, + I_VMINPD = 3490, I_VMINPS = 3482, I_VMINSD = 3506, I_VMINSS = 3498, I_VMLAUNCH = 1743, + I_VMLOAD = 1833, I_VMMCALL = 1824, I_VMOVAPD = 2498, I_VMOVAPS = 2489, I_VMOVD = 3954, + I_VMOVDDUP = 2256, I_VMOVDQA = 3984, I_VMOVDQU = 3993, I_VMOVHLPS = 2217, + I_VMOVHPD = 2404, I_VMOVHPS = 2395, I_VMOVLHPS = 2385, I_VMOVLPD = 2236, I_VMOVLPS = 2227, + I_VMOVMSKPD = 2858, I_VMOVMSKPS = 2847, I_VMOVNTDQ = 6880, I_VMOVNTDQA = 7927, + I_VMOVNTPD = 2615, I_VMOVNTPS = 2605, I_VMOVQ = 3961, I_VMOVSD = 2165, I_VMOVSHDUP = 2413, + I_VMOVSLDUP = 2245, I_VMOVSS = 2157, I_VMOVUPD = 2148, I_VMOVUPS = 2139, I_VMPSADBW = 9659, + I_VMPTRLD = 10002, I_VMPTRST = 6407, I_VMREAD = 4150, I_VMRESUME = 1753, I_VMRUN = 1817, + I_VMSAVE = 1841, I_VMULPD = 3221, I_VMULPS = 3213, I_VMULSD = 3237, I_VMULSS = 3229, + I_VMWRITE = 4174, I_VMXOFF = 1763, I_VMXON = 10020, I_VORPD = 3088, I_VORPS = 3081, + I_VPABSB = 7717, I_VPABSD = 7747, I_VPABSW = 7732, I_VPACKSSDW = 3881, I_VPACKSSWB = 3713, + I_VPACKUSDW = 7948, I_VPACKUSWB = 3791, I_VPADDB = 7233, I_VPADDD = 7263, + I_VPADDQ = 6510, I_VPADDSB = 6960, I_VPADDSW = 6977, I_VPADDUSW = 6651, I_VPADDW = 7248, + I_VPALIGNR = 9441, I_VPAND = 6635, I_VPANDN = 6694, I_VPAVGB = 6709, I_VPAVGW = 6754, + I_VPBLENDVB = 9714, I_VPBLENDW = 9422, I_VPCLMULQDQ = 9680, I_VPCMPEQB = 4074, + I_VPCMPEQD = 4112, I_VPCMPEQQ = 7907, I_VPCMPEQW = 4093, I_VPCMPESTRI = 9759, + I_VPCMPESTRM = 9736, I_VPCMPGTB = 3733, I_VPCMPGTD = 3771, I_VPCMPGTQ = 8118, + I_VPCMPGTW = 3752, I_VPCMPISTRI = 9805, I_VPCMPISTRM = 9782, I_VPERM2F128 = 9287, + I_VPERMILPD = 7592, I_VPERMILPS = 7581, I_VPEXTRB = 9459, I_VPEXTRD = 9484, + I_VPEXTRQ = 9493, I_VPEXTRW = 6341, I_VPHADDD = 7405, I_VPHADDSW = 7423, I_VPHADDW = 7388, + I_VPHMINPOSUW = 8293, I_VPHSUBD = 7481, I_VPHSUBSW = 7499, I_VPHSUBW = 7464, + I_VPINSRB = 9560, I_VPINSRD = 9606, I_VPINSRQ = 9615, I_VPINSRW = 6324, I_VPMADDUBSW = 7444, + I_VPMADDWD = 7104, I_VPMAXSB = 8204, I_VPMAXSD = 8221, I_VPMAXSW = 6994, I_VPMAXUB = 6678, + I_VPMAXUD = 8255, I_VPMAXUW = 8238, I_VPMINSB = 8136, I_VPMINSD = 8153, I_VPMINSW = 6932, + I_VPMINUB = 6620, I_VPMINUD = 8187, I_VPMINUW = 8170, I_VPMOVMSKB = 6563, + I_VPMOVSXBD = 7786, I_VPMOVSXBQ = 7807, I_VPMOVSXBW = 7765, I_VPMOVSXDQ = 7870, + I_VPMOVSXWD = 7828, I_VPMOVSXWQ = 7849, I_VPMOVZXBD = 8014, I_VPMOVZXBQ = 8035, + I_VPMOVZXBW = 7993, I_VPMOVZXDQ = 8098, I_VPMOVZXWD = 8056, I_VPMOVZXWQ = 8077, + I_VPMULDQ = 7889, I_VPMULHRSW = 7570, I_VPMULHUW = 6771, I_VPMULHW = 6789, + I_VPMULLD = 8272, I_VPMULLW = 6526, I_VPMULUDQ = 7085, I_VPOR = 6946, I_VPSADBW = 7122, + I_VPSHUFB = 7371, I_VPSHUFD = 4036, I_VPSHUFHW = 4045, I_VPSHUFLW = 4055, + I_VPSIGNB = 7517, I_VPSIGND = 7551, I_VPSIGNW = 7534, I_VPSLLD = 7053, I_VPSLLDQ = 9877, + I_VPSLLQ = 7068, I_VPSLLW = 7038, I_VPSRAD = 6739, I_VPSRAW = 6724, I_VPSRLD = 6480, + I_VPSRLDQ = 9860, I_VPSRLQ = 6495, I_VPSRLW = 6465, I_VPSUBB = 7173, I_VPSUBD = 7203, + I_VPSUBQ = 7218, I_VPSUBSB = 6898, I_VPSUBSW = 6915, I_VPSUBUSB = 6583, I_VPSUBUSW = 6602, + I_VPSUBW = 7188, I_VPTEST = 7658, I_VPUNPCKHBW = 3813, I_VPUNPCKHDQ = 3859, + I_VPUNPCKHQDQ = 3929, I_VPUNPCKHWD = 3836, I_VPUNPCKLBW = 3645, I_VPUNPCKLDQ = 3691, + I_VPUNPCKLQDQ = 3904, I_VPUNPCKLWD = 3668, I_VPXOR = 7009, I_VRCPPS = 2989, + I_VRCPSS = 2997, I_VROUNDPD = 9327, I_VROUNDPS = 9308, I_VROUNDSD = 9365, + I_VROUNDSS = 9346, I_VRSQRTPS = 2955, I_VRSQRTSS = 2965, I_VSHUFPD = 6375, + I_VSHUFPS = 6366, I_VSQRTPD = 2910, I_VSQRTPS = 2901, I_VSQRTSD = 2928, I_VSQRTSS = 2919, + I_VSTMXCSR = 9992, I_VSUBPD = 3430, I_VSUBPS = 3422, I_VSUBSD = 3446, I_VSUBSS = 3438, + I_VTESTPD = 7612, I_VTESTPS = 7603, I_VUCOMISD = 2783, I_VUCOMISS = 2773, + I_VUNPCKHPD = 2339, I_VUNPCKHPS = 2328, I_VUNPCKLPD = 2297, I_VUNPCKLPS = 2286, + I_VXORPD = 3117, I_VXORPS = 3109, I_VZEROALL = 4140, I_VZEROUPPER = 4128, + I_WAIT = 10042, I_WBINVD = 561, I_WRFSBASE = 9953, I_WRGSBASE = 9982, I_WRMSR = 586, + I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1811, + I_XGETBV = 1787, I_XLAT = 400, I_XOR = 61, I_XORPD = 3102, I_XORPS = 3095, + I_XRSTOR = 4295, I_XRSTOR64 = 4303, I_XSAVE = 4271, I_XSAVE64 = 4278, I_XSAVEOPT = 4321, + I_XSAVEOPT64 = 4331, I_XSETBV = 1795, I__3DNOW = 10056 + } _InstructionType; + +typedef enum { + R_RAX, R_RCX, R_RDX, R_RBX, R_RSP, R_RBP, R_RSI, R_RDI, R_R8, R_R9, R_R10, R_R11, R_R12, R_R13, R_R14, R_R15, + R_EAX, R_ECX, R_EDX, R_EBX, R_ESP, R_EBP, R_ESI, R_EDI, R_R8D, R_R9D, R_R10D, R_R11D, R_R12D, R_R13D, R_R14D, R_R15D, + R_AX, R_CX, R_DX, R_BX, R_SP, R_BP, R_SI, R_DI, R_R8W, R_R9W, R_R10W, R_R11W, R_R12W, R_R13W, R_R14W, R_R15W, + R_AL, R_CL, R_DL, R_BL, R_AH, R_CH, R_DH, R_BH, R_R8B, R_R9B, R_R10B, R_R11B, R_R12B, R_R13B, R_R14B, R_R15B, + R_SPL, R_BPL, R_SIL, R_DIL, + R_ES, R_CS, R_SS, R_DS, R_FS, R_GS, + R_RIP, + R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7, + R_MM0, R_MM1, R_MM2, R_MM3, R_MM4, R_MM5, R_MM6, R_MM7, + R_XMM0, R_XMM1, R_XMM2, R_XMM3, R_XMM4, R_XMM5, R_XMM6, R_XMM7, R_XMM8, R_XMM9, R_XMM10, R_XMM11, R_XMM12, R_XMM13, R_XMM14, R_XMM15, + R_YMM0, R_YMM1, R_YMM2, R_YMM3, R_YMM4, R_YMM5, R_YMM6, R_YMM7, R_YMM8, R_YMM9, R_YMM10, R_YMM11, R_YMM12, R_YMM13, R_YMM14, R_YMM15, + R_CR0, R_UNUSED0, R_CR2, R_CR3, R_CR4, R_UNUSED1, R_UNUSED2, R_UNUSED3, R_CR8, + R_DR0, R_DR1, R_DR2, R_DR3, R_UNUSED4, R_UNUSED5, R_DR6, R_DR7 +} _RegisterType; + +#endif /* MNEMONICS_H */ diff --git a/NativeCore/Dependencies/distorm/src/config.h b/NativeCore/Dependencies/distorm/src/config.h new file mode 100644 index 00000000..164536f2 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/config.h @@ -0,0 +1,169 @@ +/* +config.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef CONFIG_H +#define CONFIG_H + +/* diStorm version number. */ +#define __DISTORMV__ 0x030304 + +#include /* memset, memcpy - can be easily self implemented for libc independency. */ + +#include "../include/distorm.h" + + +/* + * 64 bit offsets support: + * This macro should be defined from compiler command line flags, e.g: -DSUPPORT_64BIT_OFFSET + * Note: make sure that the caller (library user) defines it too! + */ +/* #define SUPPORT_64BIT_OFFSET */ + +/* + * If you compile diStorm as a dynamic library (.dll or .so) file, make sure you uncomment the next line. + * So the interface functions will be exported, otherwise they are useable only for static library. + * For example, this macro is being set for compiling diStorm as a .dll for Python with CTypes. + */ +/* #define DISTORM_DYNAMIC */ + +/* + * If DISTORM_LIGHT is defined, everything involved in formatting the instructions + * as text will be excluded from compilation. + * distorm_decode(..) and distorm_format(..) will not be available. + * This will decrease the size of the executable and leave you with decomposition functionality only. + * + * Note: it should be either set in the preprocessor definitions manually or in command line -D switch. + * #define DISTORM_LIGHT + */ + +/* + * diStorm now supports little/big endian CPU's. + * It should detect the endianness according to predefined macro's of the compiler. + * If you don't use GCC/MSVC you will have to define it on your own. + */ + +/* These macros are used in order to make the code portable. */ +#ifdef __GNUC__ + +#include + +#define _DLLEXPORT_ +#define _FASTCALL_ +#define _INLINE_ static +/* GCC ignores this directive... */ +/*#define _FASTCALL_ __attribute__((__fastcall__))*/ + +/* Set endianity (supposed to be LE though): */ +#ifdef __BIG_ENDIAN__ + #define BE_SYSTEM +#endif + +/* End of __GCC__ */ + +#elif __WATCOMC__ + +#include + +#define _DLLEXPORT_ +#define _FASTCALL_ +#define _INLINE_ __inline + +/* End of __WATCOMC__ */ + +#elif __DMC__ + +#include + +#define _DLLEXPORT_ +#define _FASTCALL_ +#define _INLINE_ __inline + +/* End of __DMC__ */ + +#elif __TINYC__ + +#include + +#define _DLLEXPORT_ +#define _FASTCALL_ +#define _INLINE_ + +/* End of __TINYC__ */ + +#elif _MSC_VER + +/* stdint alternative is defined in distorm.h */ + +#define _DLLEXPORT_ __declspec(dllexport) +#define _FASTCALL_ __fastcall +#define _INLINE_ __inline + +/* Set endianity (supposed to be LE though): */ +#if !defined(_M_IX86) && !defined(_M_X64) + #define BE_SYSTEM +#endif + +#endif /* #elif _MSC_VER */ + +/* If the library isn't compiled as a dynamic library don't export any functions. */ +#ifndef DISTORM_DYNAMIC +#undef _DLLEXPORT_ +#define _DLLEXPORT_ +#endif + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +/* Define stream read functions for big endian systems. */ +#ifdef BE_SYSTEM +/* + * These functions can read from the stream safely! + * Swap endianity of input to little endian. + */ +static _INLINE_ int16_t RSHORT(const uint8_t *s) +{ + return s[0] | (s[1] << 8); +} +static _INLINE_ uint16_t RUSHORT(const uint8_t *s) +{ + return s[0] | (s[1] << 8); +} +static _INLINE_ int32_t RLONG(const uint8_t *s) +{ + return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24); +} +static _INLINE_ uint32_t RULONG(const uint8_t *s) +{ + return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24); +} +static _INLINE_ int64_t RLLONG(const uint8_t *s) +{ + return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24) | ((uint64_t)s[4] << 32) | ((uint64_t)s[5] << 40) | ((uint64_t)s[6] << 48) | ((uint64_t)s[7] << 56); +} +static _INLINE_ uint64_t RULLONG(const uint8_t *s) +{ + return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24) | ((uint64_t)s[4] << 32) | ((uint64_t)s[5] << 40) | ((uint64_t)s[6] << 48) | ((uint64_t)s[7] << 56); +} +#else +/* Little endian macro's will just make the cast. */ +#define RSHORT(x) *(int16_t *)x +#define RUSHORT(x) *(uint16_t *)x +#define RLONG(x) *(int32_t *)x +#define RULONG(x) *(uint32_t *)x +#define RLLONG(x) *(int64_t *)x +#define RULLONG(x) *(uint64_t *)x +#endif + +#endif /* CONFIG_H */ diff --git a/NativeCore/Dependencies/distorm/src/decoder.c b/NativeCore/Dependencies/distorm/src/decoder.c new file mode 100644 index 00000000..b76f7105 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/decoder.c @@ -0,0 +1,650 @@ +/* +decoder.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "decoder.h" +#include "instructions.h" +#include "insts.h" +#include "prefix.h" +#include "x86defs.h" +#include "operands.h" +#include "insts.h" +#include "../include/mnemonics.h" + + +/* Instruction Prefixes - Opcode - ModR/M - SIB - Displacement - Immediate */ + +static _DecodeType decode_get_effective_addr_size(_DecodeType dt, _iflags decodedPrefixes) +{ + /* + * This table is to map from the current decoding mode to an effective address size: + * Decode16 -> Decode32 + * Decode32 -> Decode16 + * Decode64 -> Decode32 + */ + static _DecodeType AddrSizeTable[] = {Decode32Bits, Decode16Bits, Decode32Bits}; + + /* Switch to non default mode if prefix exists, only for ADDRESS SIZE. */ + if (decodedPrefixes & INST_PRE_ADDR_SIZE) dt = AddrSizeTable[dt]; + return dt; +} + +static _DecodeType decode_get_effective_op_size(_DecodeType dt, _iflags decodedPrefixes, unsigned int rex, _iflags instFlags) +{ + /* + * This table is to map from the current decoding mode to an effective operand size: + * Decode16 -> Decode32 + * Decode32 -> Decode16 + * Decode64 -> Decode16 + * Not that in 64bits it's a bit more complicated, because of REX and promoted instructions. + */ + static _DecodeType OpSizeTable[] = {Decode32Bits, Decode16Bits, Decode16Bits}; + + if (decodedPrefixes & INST_PRE_OP_SIZE) return OpSizeTable[dt]; + + if (dt == Decode64Bits) { + /* + * REX Prefix toggles data size to 64 bits. + * Operand size prefix toggles data size to 16. + * Default data size is 32 bits. + * Promoted instructions are 64 bits if they don't require a REX perfix. + * Non promoted instructions are 64 bits if the REX prefix exists. + */ + /* Automatically promoted instructions have only INST_64BITS SET! */ + if (((instFlags & (INST_64BITS | INST_PRE_REX)) == INST_64BITS) || + /* Other instructions in 64 bits can be promoted only with a REX prefix. */ + ((decodedPrefixes & INST_PRE_REX) && (rex & PREFIX_EX_W))) dt = Decode64Bits; + else dt = Decode32Bits; /* Default. */ + } + return dt; +} + +/* A helper macro to convert from diStorm's CPU flags to EFLAGS. */ +#define CONVERT_FLAGS_TO_EFLAGS(dst, src, field) dst->field = ((src->field & D_COMPACT_SAME_FLAGS) | \ + ((src->field & D_COMPACT_IF) ? D_IF : 0) | \ + ((src->field & D_COMPACT_DF) ? D_DF : 0) | \ + ((src->field & D_COMPACT_OF) ? D_OF : 0)); + +static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, _DInst* di) +{ + /* Remember whether the instruction is privileged. */ + uint16_t privilegedFlag = 0; + + /* The ModR/M byte of the current instruction. */ + unsigned int modrm = 0; + + /* The REX/VEX prefix byte value. */ + unsigned int vrex = ps->vrex; + + /* + * Backup original input, so we can use it later if a problem occurs + * (like not enough data for decoding, invalid opcode, etc). + */ + const uint8_t* startCode = ci->code; + + /* Holds the info about the current found instruction. */ + _InstInfo* ii = NULL; + _InstInfo iip; /* Privileged instruction cache. */ + _InstSharedInfo* isi = NULL; + + /* Used only for special CMP instructions which have pseudo opcodes suffix. */ + unsigned char cmpType = 0; + + /* + * Indicates whether it is right to LOCK the instruction by decoding its first operand. + * Only then you know if it's ok to output the LOCK prefix's text... + * Used for first operand only. + */ + int lockable = FALSE; + + /* Calculate (and cache) effective-operand-size and effective-address-size only once. */ + _DecodeType effOpSz, effAdrSz; + _iflags instFlags; + + ii = inst_lookup(ci, ps); + if (ii == NULL) goto _Undecodable; + isi = &InstSharedInfoTable[ii->sharedIndex]; + instFlags = FlagsTable[isi->flagsIndex]; + privilegedFlag = ii->opcodeId & OPCODE_ID_PRIVILEGED; + + if (privilegedFlag) { + /* + * Copy the privileged instruction info so we can remove the privileged bit + * from the opcodeId field. This makes sure we're not modifying the tables + * in case we lookup this privileged instruction later. + */ + iip = *ii; + iip.opcodeId &= ~OPCODE_ID_PRIVILEGED; + ii = &iip; + } + + /* + * If both REX and OpSize are available we will have to disable the OpSize, because REX has precedence. + * However, only if REX.W is set ! + * We had to wait with this test, since the operand size may be a mandatory prefix, + * and we know it only after prefetching. + */ + if ((ps->prefixExtType == PET_REX) && + (ps->decodedPrefixes & INST_PRE_OP_SIZE) && + (!ps->isOpSizeMandatory) && + (vrex & PREFIX_EX_W)) { + ps->decodedPrefixes &= ~INST_PRE_OP_SIZE; + prefixes_ignore(ps, PFXIDX_OP_SIZE); + } + + /* + * In this point we know the instruction we are about to decode and its operands (unless, it's an invalid one!), + * so it makes it the right time for decoding-type suitability testing. + * Which practically means, don't allow 32 bits instructions in 16 bits decoding mode, but do allow + * 16 bits instructions in 32 bits decoding mode, of course... + + * NOTE: Make sure the instruction set for 32 bits has explicitly this specific flag set. + * NOTE2: Make sure the instruction set for 64 bits has explicitly this specific flag set. + + * If this is the case, drop what we've got and restart all over after DB'ing that byte. + + * Though, don't drop an instruction which is also supported in 16 and 32 bits. + */ + + /* ! ! ! DISABLED UNTIL FURTHER NOTICE ! ! ! Decode16Bits CAN NOW DECODE 32 BITS INSTRUCTIONS ! ! !*/ + /* if (ii && (dt == Decode16Bits) && (instFlags & INST_32BITS) && (~instFlags & INST_16BITS)) ii = NULL; */ + + /* Drop instructions which are invalid in 64 bits. */ + if ((ci->dt == Decode64Bits) && (instFlags & INST_INVALID_64BITS)) goto _Undecodable; + + /* If it's only a 64 bits instruction drop it in other decoding modes. */ + if ((ci->dt != Decode64Bits) && (instFlags & INST_64BITS_FETCH)) goto _Undecodable; + + if (instFlags & INST_MODRM_REQUIRED) { + /* If the ModRM byte is not part of the opcode, skip the last byte code, so code points now to ModRM. */ + if (~instFlags & INST_MODRM_INCLUDED) { + ci->code++; + if (--ci->codeLen < 0) goto _Undecodable; + } + modrm = *ci->code; + + /* Some instructions enforce that reg=000, so validate that. (Specifically EXTRQ). */ + if ((instFlags & INST_FORCE_REG0) && (((modrm >> 3) & 7) != 0)) goto _Undecodable; + /* Some instructions enforce that mod=11, so validate that. */ + if ((instFlags & INST_MODRR_REQUIRED) && (modrm < INST_DIVIDED_MODRM)) goto _Undecodable; + } + + ci->code++; /* Skip the last byte we just read (either last opcode's byte code or a ModRM). */ + + /* Cache the effective operand-size and address-size. */ + effOpSz = decode_get_effective_op_size(ci->dt, ps->decodedPrefixes, vrex, instFlags); + effAdrSz = decode_get_effective_addr_size(ci->dt, ps->decodedPrefixes); + + memset(di, 0, sizeof(_DInst)); + di->base = R_NONE; + + /* + * Try to extract the next operand only if the latter exists. + * For example, if there is not first operand, no reason to try to extract second operand... + * I decided that a for-break is better for readability in this specific case than goto. + * Note: do-while with a constant 0 makes the compiler warning about it. + */ + for (;;) { + if (isi->d != OT_NONE) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->d, ONT_1, modrm, ps, effOpSz, effAdrSz, &lockable)) goto _Undecodable; + } else break; + + if (isi->s != OT_NONE) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->s, ONT_2, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; + } else break; + + /* Use third operand, only if the flags says this InstInfo requires it. */ + if (instFlags & INST_USE_OP3) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op3, ONT_3, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; + } else break; + + /* Support for a fourth operand is added for (i.e:) INSERTQ instruction. */ + if (instFlags & INST_USE_OP4) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op4, ONT_4, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; + } + break; + } /* Continue here after all operands were extracted. */ + + /* If it were a 3DNow! instruction, we will have to find the instruction itself now that we got its operands extracted. */ + if (instFlags & INST_3DNOW_FETCH) { + ii = inst_lookup_3dnow(ci); + if (ii == NULL) goto _Undecodable; + isi = &InstSharedInfoTable[ii->sharedIndex]; + instFlags = FlagsTable[isi->flagsIndex]; + } + + /* Check whether pseudo opcode is needed, only for CMP instructions: */ + if (instFlags & INST_PSEUDO_OPCODE) { + if (--ci->codeLen < 0) goto _Undecodable; + cmpType = *ci->code; + ci->code++; + if (instFlags & INST_PRE_VEX) { + /* AVX Comparison type must be between 0 to 32, otherwise Reserved. */ + if (cmpType >= INST_VCMP_MAX_RANGE) goto _Undecodable; + } else { + /* SSE Comparison type must be between 0 to 8, otherwise Reserved. */ + if (cmpType >= INST_CMP_MAX_RANGE) goto _Undecodable; + } + } + + /* + * There's a limit of 15 bytes on instruction length. The only way to violate + * this limit is by putting redundant prefixes before an instruction. + * start points to first prefix if any, otherwise it points to instruction first byte. + */ + if ((ci->code - ps->start) > INST_MAXIMUM_SIZE) goto _Undecodable; /* Drop instruction. */ + + /* + * If we reached here the instruction was fully decoded, we located the instruction in the DB and extracted operands. + * Use the correct mnemonic according to the DT. + * If we are in 32 bits decoding mode it doesn't necessarily mean we will choose mnemonic2, alas, + * it means that if there is a mnemonic2, it will be used. + */ + + /* Start with prefix LOCK. */ + if ((lockable == TRUE) && (instFlags & INST_PRE_LOCK)) { + ps->usedPrefixes |= INST_PRE_LOCK; + di->flags |= FLAG_LOCK; + } else if ((instFlags & INST_PRE_REPNZ) && (ps->decodedPrefixes & INST_PRE_REPNZ)) { + ps->usedPrefixes |= INST_PRE_REPNZ; + di->flags |= FLAG_REPNZ; + } else if ((instFlags & INST_PRE_REP) && (ps->decodedPrefixes & INST_PRE_REP)) { + ps->usedPrefixes |= INST_PRE_REP; + di->flags |= FLAG_REP; + } + + /* If it's JeCXZ the ADDR_SIZE prefix affects them. */ + if ((instFlags & (INST_PRE_ADDR_SIZE | INST_USE_EXMNEMONIC)) == (INST_PRE_ADDR_SIZE | INST_USE_EXMNEMONIC)) { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + if (effAdrSz == Decode16Bits) di->opcode = ii->opcodeId; + else if (effAdrSz == Decode32Bits) di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + /* Ignore REX.W in 64bits, JECXZ is promoted. */ + else /* Decode64Bits */ di->opcode = ((_InstInfoEx*)ii)->opcodeId3; + } + + /* LOOPxx instructions are also native instruction, but they are special case ones, ADDR_SIZE prefix affects them. */ + else if ((instFlags & (INST_PRE_ADDR_SIZE | INST_NATIVE)) == (INST_PRE_ADDR_SIZE | INST_NATIVE)) { + di->opcode = ii->opcodeId; + + /* If LOOPxx gets here from 64bits, it must be Decode32Bits because Address Size prefix is set. */ + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + } + /* + * Note: + * If the instruction is prefixed by operand size we will format it in the non-default decoding mode! + * So there might be a situation that an instruction of 32 bit gets formatted in 16 bits decoding mode. + * Both ways should end up with a correct and expected formatting of the text. + */ + else if (effOpSz == Decode16Bits) { /* Decode16Bits */ + + /* Set operand size. */ + FLAG_SET_OPSIZE(di, Decode16Bits); + + /* + * If it's a special instruction which has two mnemonics, then use the 16 bits one + update usedPrefixes. + * Note: use 16 bits mnemonic if that instruction supports 32 bit or 64 bit explicitly. + */ + if ((instFlags & INST_USE_EXMNEMONIC) && ((instFlags & (INST_32BITS | INST_64BITS)) == 0)) ps->usedPrefixes |= INST_PRE_OP_SIZE; + di->opcode = ii->opcodeId; + } else if (effOpSz == Decode32Bits) { /* Decode32Bits */ + + /* Set operand size. */ + FLAG_SET_OPSIZE(di, Decode32Bits); + + /* Give a chance for special mnemonic instruction in 32 bits decoding. */ + if (instFlags & INST_USE_EXMNEMONIC) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* Is it a special instruction which has another mnemonic for mod=11 ? */ + if (instFlags & INST_MNEMONIC_MODRM_BASED) { + if (modrm >= INST_DIVIDED_MODRM) di->opcode = ii->opcodeId; + else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + } else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + } else di->opcode = ii->opcodeId; + } else { /* Decode64Bits, note that some instructions might be decoded in Decode32Bits above. */ + + /* Set operand size. */ + FLAG_SET_OPSIZE(di, Decode64Bits); + + if (instFlags & (INST_USE_EXMNEMONIC | INST_USE_EXMNEMONIC2)) { + /* + * We shouldn't be here for MODRM based mnemonics with a MOD=11, + * because they must not use REX (otherwise it will get to the wrong instruction which share same opcode). + * See XRSTOR and XSAVEOPT. + */ + if ((instFlags & INST_MNEMONIC_MODRM_BASED) && (modrm >= INST_DIVIDED_MODRM)) goto _Undecodable; + + /* Use third mnemonic, for 64 bits. */ + if ((instFlags & INST_USE_EXMNEMONIC2) && (vrex & PREFIX_EX_W)) { + ps->usedPrefixes |= INST_PRE_REX; + di->opcode = ((_InstInfoEx*)ii)->opcodeId3; + } else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; /* Use second mnemonic. */ + } else di->opcode = ii->opcodeId; + } + + /* If it's a native instruction use OpSize Prefix. */ + if ((instFlags & INST_NATIVE) && (ps->decodedPrefixes & INST_PRE_OP_SIZE)) ps->usedPrefixes |= INST_PRE_OP_SIZE; + + /* Check VEX mnemonics: */ + if ((instFlags & INST_PRE_VEX) && + (((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXW_BASED) && (vrex & PREFIX_EX_W)) || + ((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXL_BASED) && (vrex & PREFIX_EX_L)))) { + di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + } + + /* Or is it a special CMP instruction which needs a pseudo opcode suffix ? */ + if (instFlags & INST_PSEUDO_OPCODE) { + /* + * The opcodeId is the offset to the FIRST pseudo compare mnemonic, + * we will have to fix it so it offsets into the corrected mnemonic. + * Therefore, we use another table to fix the offset. + */ + if (instFlags & INST_PRE_VEX) { + /* Use the AVX pseudo compare mnemonics table. */ + di->opcode = ii->opcodeId + VCmpMnemonicOffsets[cmpType]; + } else { + /* Use the SSE pseudo compare mnemonics table. */ + di->opcode = ii->opcodeId + CmpMnemonicOffsets[cmpType]; + } + } + + /* + * Store the address size inside the flags. + * This is necessary for the caller to know the size of rSP when using PUSHA for example. + */ + FLAG_SET_ADDRSIZE(di, effAdrSz); + + /* Copy DST_WR flag. */ + if (instFlags & INST_DST_WR) di->flags |= FLAG_DST_WR; + + /* Set the unused prefixes mask. */ + di->unusedPrefixesMask = prefixes_set_unused_mask(ps); + + /* Fix privileged. Assumes the privilegedFlag is 0x8000 only. */ + di->flags |= privilegedFlag; + + /* Copy instruction meta. */ + di->meta = isi->meta; + if (di->segment == 0) di->segment = R_NONE; + + /* Take into account the O_MEM base register for the mask. */ + if (di->base != R_NONE) di->usedRegistersMask |= _REGISTERTORCLASS[di->base]; + + /* Copy CPU affected flags. */ + CONVERT_FLAGS_TO_EFLAGS(di, isi, modifiedFlagsMask); + CONVERT_FLAGS_TO_EFLAGS(di, isi, testedFlagsMask); + CONVERT_FLAGS_TO_EFLAGS(di, isi, undefinedFlagsMask); + + /* Calculate the size of the instruction we've just decoded. */ + di->size = (uint8_t)((ci->code - startCode) & 0xff); + return DECRES_SUCCESS; + +_Undecodable: /* If the instruction couldn't be decoded for some reason, drop the first byte. */ + memset(di, 0, sizeof(_DInst)); + di->base = R_NONE; + + di->size = 1; + /* Clean prefixes just in case... */ + ps->usedPrefixes = 0; + + /* Special case for WAIT instruction: If it's dropped, you have to return a valid instruction! */ + if (*startCode == INST_WAIT_INDEX) { + di->opcode = I_WAIT; + META_SET_ISC(di, ISC_INTEGER); + return DECRES_SUCCESS; + } + + /* Mark that we didn't manage to decode the instruction well, caller will drop it. */ + return DECRES_INPUTERR; +} + +/* + * decode_internal + * + * supportOldIntr - Since now we work with new structure instead of the old _DecodedInst, we are still interested in backward compatibility. + * So although, the array is now of type _DInst, we want to read it in jumps of the old array element's size. + * This is in order to save memory allocation for conversion between the new and the old structures. + * It really means we can do the conversion in-place now. + */ +_DecodeResult decode_internal(_CodeInfo* _ci, int supportOldIntr, _DInst result[], unsigned int maxResultCount, unsigned int* usedInstructionsCount) +{ + _PrefixState ps; + unsigned int prefixSize; + _CodeInfo ci; + unsigned int features; + unsigned int mfc; + + _OffsetType codeOffset = _ci->codeOffset; + const uint8_t* code = _ci->code; + int codeLen = _ci->codeLen; + + /* + * This is used for printing only, it is the real offset of where the whole instruction begins. + * We need this variable in addition to codeOffset, because prefixes might change the real offset an instruction begins at. + * So we keep track of both. + */ + _OffsetType startInstOffset = 0; + + const uint8_t* p; + + /* Current working decoded instruction in results. */ + unsigned int nextPos = 0; + _DInst *pdi = NULL; + + _OffsetType addrMask = (_OffsetType)-1; + + _DecodeResult decodeResult; + +#ifdef DISTORM_LIGHT + supportOldIntr; /* Unreferenced. */ + + /* + * Only truncate address if we are using the decompose interface. + * Otherwise, we use the textual interface which needs full addresses for formatting bytes output. + * So distorm_format will truncate later. + */ + if (_ci->features & DF_MAXIMUM_ADDR32) addrMask = 0xffffffff; + else if (_ci->features & DF_MAXIMUM_ADDR16) addrMask = 0xffff; +#endif + + /* No entries are used yet. */ + *usedInstructionsCount = 0; + ci.dt = _ci->dt; + _ci->nextOffset = codeOffset; + + /* Decode instructions as long as we have what to decode/enough room in entries. */ + while (codeLen > 0) { + + /* startInstOffset holds the displayed offset of current instruction. */ + startInstOffset = codeOffset; + + memset(&ps, 0, (size_t)((char*)&ps.pfxIndexer[0] - (char*)&ps)); + memset(ps.pfxIndexer, PFXIDX_NONE, sizeof(int) * PFXIDX_MAX); + ps.start = code; + ps.last = code; + prefixSize = 0; + + if (prefixes_is_valid(*code, ci.dt)) { + prefixes_decode(code, codeLen, &ps, ci.dt); + /* Count prefixes, start points to first prefix. */ + prefixSize = (unsigned int)(ps.last - ps.start); + /* + * It might be that we will just notice that we ran out of bytes, or only prefixes + * so we will have to drop everything and halt. + * Also take into consideration of flow control instruction filter. + */ + codeLen -= prefixSize; + if ((codeLen == 0) || (prefixSize == INST_MAXIMUM_SIZE)) { + if (~_ci->features & DF_RETURN_FC_ONLY) { + /* Make sure there is enough room. */ + if (nextPos + (ps.last - code) > maxResultCount) return DECRES_MEMORYERR; + + for (p = code; p < ps.last; p++, startInstOffset++) { + /* Use next entry. */ +#ifndef DISTORM_LIGHT + if (supportOldIntr) { + pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); + } + else +#endif /* DISTORM_LIGHT */ + { + pdi = &result[nextPos]; + } + nextPos++; + memset(pdi, 0, sizeof(_DInst)); + + pdi->flags = FLAG_NOT_DECODABLE; + pdi->imm.byte = *p; + pdi->size = 1; + pdi->addr = startInstOffset & addrMask; + } + *usedInstructionsCount = nextPos; /* Include them all. */ + } + if (codeLen == 0) break; /* Bye bye, out of bytes. */ + } + code += prefixSize; + codeOffset += prefixSize; + + /* If we got only prefixes continue to next instruction. */ + if (prefixSize == INST_MAXIMUM_SIZE) continue; + } + + /* + * Now we decode the instruction and only then we do further prefixes handling. + * This is because the instruction could not be decoded at all, or an instruction requires + * a mandatory prefix, or some of the prefixes were useless, etc... + + * Even if there were a mandatory prefix, we already took into account its size as a normal prefix. + * so prefixSize includes that, and the returned size in pdi is simply the size of the real(=without prefixes) instruction. + */ + if (ci.dt == Decode64Bits) { + if (ps.decodedPrefixes & INST_PRE_REX) { + /* REX prefix must precede first byte of instruction. */ + if (ps.rexPos != (code - 1)) { + ps.decodedPrefixes &= ~INST_PRE_REX; + ps.prefixExtType = PET_NONE; + prefixes_ignore(&ps, PFXIDX_REX); + } + /* + * We will disable operand size prefix, + * if it exists only after decoding the instruction, since it might be a mandatory prefix. + * This will be done after calling inst_lookup in decode_inst. + */ + } + /* In 64 bits, segment overrides of CS, DS, ES and SS are ignored. So don't take'em into account. */ + if (ps.decodedPrefixes & INST_PRE_SEGOVRD_MASK32) { + ps.decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK32; + prefixes_ignore(&ps, PFXIDX_SEG); + } + } + + /* Make sure there is at least one more entry to use, for the upcoming instruction. */ + if (nextPos + 1 > maxResultCount) return DECRES_MEMORYERR; +#ifndef DISTORM_LIGHT + if (supportOldIntr) { + pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); + } + else +#endif /* DISTORM_LIGHT */ + { + pdi = &result[nextPos]; + } + nextPos++; + + /* + * The reason we copy these two again is because we have to keep track on the input ourselves. + * There might be a case when an instruction is invalid, and then it will be counted as one byte only. + * But that instruction already read a byte or two from the stream and only then returned the error. + * Thus, we end up unsynchronized on the stream. + * This way, we are totally safe, because we keep track after the call to decode_inst, using the returned size. + */ + ci.code = code; + ci.codeLen = codeLen; + /* Nobody uses codeOffset in the decoder itself, so spare it. */ + + decodeResult = decode_inst(&ci, &ps, pdi); + + /* See if we need to filter this instruction. */ + if ((_ci->features & DF_RETURN_FC_ONLY) && (META_GET_FC(pdi->meta) == FC_NONE)) decodeResult = DECRES_FILTERED; + + /* Set address to the beginning of the instruction. */ + pdi->addr = startInstOffset & addrMask; + /* pdi->disp &= addrMask; */ + + if ((decodeResult == DECRES_INPUTERR) && (ps.decodedPrefixes & INST_PRE_VEX)) { + if (ps.prefixExtType == PET_VEX3BYTES) { + prefixSize -= 2; + codeLen += 2; + } else if (ps.prefixExtType == PET_VEX2BYTES) { + prefixSize -= 1; + codeLen += 1; + } + ps.last = ps.start + prefixSize - 1; + code = ps.last + 1; + codeOffset = startInstOffset + prefixSize; + } else { + /* Advance to next instruction. */ + codeLen -= pdi->size; + codeOffset += pdi->size; + code += pdi->size; + + /* Instruction's size should include prefixes. */ + pdi->size += (uint8_t)prefixSize; + } + + /* Drop all prefixes and the instruction itself, because the instruction wasn't successfully decoded. */ + if ((decodeResult == DECRES_INPUTERR) && (~_ci->features & DF_RETURN_FC_ONLY)) { + nextPos--; /* Undo last result. */ + if ((prefixSize + 1) > 0) { /* 1 for the first instruction's byte. */ + if ((nextPos + prefixSize + 1) > maxResultCount) return DECRES_MEMORYERR; + + for (p = ps.start; p < ps.last + 1; p++, startInstOffset++) { + /* Use next entry. */ +#ifndef DISTORM_LIGHT + if (supportOldIntr) { + pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); + } + else +#endif /* DISTORM_LIGHT */ + { + pdi = &result[nextPos]; + } + nextPos++; + + memset(pdi, 0, sizeof(_DInst)); + pdi->flags = FLAG_NOT_DECODABLE; + pdi->imm.byte = *p; + pdi->size = 1; + pdi->addr = startInstOffset & addrMask; + } + } + } else if (decodeResult == DECRES_FILTERED) nextPos--; /* Return it to pool, since it was filtered. */ + + /* Alright, the caller can read, at least, up to this one. */ + *usedInstructionsCount = nextPos; + /* Fix next offset. */ + _ci->nextOffset = codeOffset; + + /* Check whether we need to stop on any flow control instruction. */ + features = _ci->features; + mfc = META_GET_FC(pdi->meta); + if ((decodeResult == DECRES_SUCCESS) && (features & DF_STOP_ON_FLOW_CONTROL)) { + if (((features & DF_STOP_ON_CALL) && (mfc == FC_CALL)) || + ((features & DF_STOP_ON_RET) && (mfc == FC_RET)) || + ((features & DF_STOP_ON_SYS) && (mfc == FC_SYS)) || + ((features & DF_STOP_ON_UNC_BRANCH) && (mfc == FC_UNC_BRANCH)) || + ((features & DF_STOP_ON_CND_BRANCH) && (mfc == FC_CND_BRANCH)) || + ((features & DF_STOP_ON_INT) && (mfc == FC_INT)) || + ((features & DF_STOP_ON_CMOV) && (mfc == FC_CMOV))) + return DECRES_SUCCESS; + } + } + + return DECRES_SUCCESS; +} diff --git a/NativeCore/Dependencies/distorm/src/decoder.h b/NativeCore/Dependencies/distorm/src/decoder.h new file mode 100644 index 00000000..2f9961a5 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/decoder.h @@ -0,0 +1,33 @@ +/* +decoder.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2011 Gil Dabah + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + + +#ifndef DECODER_H +#define DECODER_H + +#include "config.h" + +typedef unsigned int _iflags; + +_DecodeResult decode_internal(_CodeInfo* ci, int supportOldIntr, _DInst result[], unsigned int maxResultCount, unsigned int* usedInstructionsCount); + +#endif /* DECODER_H */ diff --git a/NativeCore/Dependencies/distorm/src/distorm.c b/NativeCore/Dependencies/distorm/src/distorm.c new file mode 100644 index 00000000..f4bc9d81 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/distorm.c @@ -0,0 +1,413 @@ +/* +distorm.c + +diStorm3 C Library Interface +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "../include/distorm.h" +#include "config.h" +#include "decoder.h" +#include "x86defs.h" +#include "textdefs.h" +#include "wstring.h" +#include "../include/mnemonics.h" + +/* C DLL EXPORTS */ +#ifdef SUPPORT_64BIT_OFFSET + _DLLEXPORT_ _DecodeResult distorm_decompose64(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount) +#else + _DLLEXPORT_ _DecodeResult distorm_decompose32(_CodeInfo* ci, _DInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount) +#endif +{ + if (usedInstructionsCount == NULL) { + return DECRES_SUCCESS; + } + + /* DECRES_SUCCESS still may indicate we may have something in the result, so zero it first thing. */ + *usedInstructionsCount = 0; + + if ((ci == NULL) || + (ci->codeLen < 0) || + ((ci->dt != Decode16Bits) && (ci->dt != Decode32Bits) && (ci->dt != Decode64Bits)) || + (ci->code == NULL) || + (result == NULL) || + ((ci->features & (DF_MAXIMUM_ADDR16 | DF_MAXIMUM_ADDR32)) == (DF_MAXIMUM_ADDR16 | DF_MAXIMUM_ADDR32))) + { + return DECRES_INPUTERR; + } + + /* Assume length=0 is success. */ + if (ci->codeLen == 0) { + return DECRES_SUCCESS; + } + + return decode_internal(ci, FALSE, result, maxInstructions, usedInstructionsCount); +} + +#ifndef DISTORM_LIGHT + +/* Helper function to concatenate an explicit size when it's unknown from the operands. */ +static void distorm_format_size(_WString* str, const _DInst* di, int opNum) +{ + int isSizingRequired = 0; + /* + * We only have to output the size explicitly if it's not clear from the operands. + * For example: + * mov al, [0x1234] -> The size is 8, we know it from the AL register operand. + * mov [0x1234], 0x11 -> Now we don't know the size. Pam pam pam + * + * If given operand number is higher than 2, then output the size anyways. + */ + isSizingRequired = ((opNum >= 2) || ((di->ops[0].type != O_REG) && (di->ops[1].type != O_REG))); + + /* Still not sure? Try some special instructions. */ + if (!isSizingRequired) { + /* + * INS/OUTS are exception, because DX is a port specifier and not a real src/dst register. + * A few exceptions that always requires sizing: + * MOVZX, MOVSX, MOVSXD. + * ROL, ROR, RCL, RCR, SHL, SHR, SAL, SAR. + * SHLD, SHRD. + */ + switch (di->opcode) + { + case I_INS: + case I_OUTS: + case I_MOVZX: + case I_MOVSX: + case I_MOVSXD: + case I_ROL: + case I_ROR: + case I_RCL: + case I_RCR: + case I_SHL: + case I_SHR: + case I_SAL: + case I_SAR: + case I_SHLD: + case I_SHRD: + isSizingRequired = 1; + break; + default: /* Instruction doesn't require sizing. */ break; + } + } + + if (isSizingRequired) + { + switch (di->ops[opNum].size) + { + case 0: break; /* OT_MEM's unknown size. */ + case 8: strcat_WSN(str, "BYTE "); break; + case 16: strcat_WSN(str, "WORD "); break; + case 32: strcat_WSN(str, "DWORD "); break; + case 64: strcat_WSN(str, "QWORD "); break; + case 80: strcat_WSN(str, "TBYTE "); break; + case 128: strcat_WSN(str, "DQWORD "); break; + case 256: strcat_WSN(str, "YWORD "); break; + default: /* Big oh uh if it gets here. */ break; + } + } +} + +static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t addrMask) +{ + int64_t tmpDisp64; + + if (di->dispSize) { + chrcat_WS(str, ((int64_t)di->disp < 0) ? MINUS_DISP_CHR : PLUS_DISP_CHR); + if ((int64_t)di->disp < 0) tmpDisp64 = -(int64_t)di->disp; + else tmpDisp64 = di->disp; + tmpDisp64 &= addrMask; + str_code_hqw(str, (uint8_t*)&tmpDisp64); + } +} + +#ifdef SUPPORT_64BIT_OFFSET + _DLLEXPORT_ void distorm_format64(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result) +#else + _DLLEXPORT_ void distorm_format32(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result) +#endif +{ + _WString* str; + unsigned int i, isDefault; + int64_t tmpDisp64; + uint64_t addrMask = (uint64_t)-1; + uint8_t segment; + const _WMnemonic* mnemonic; + + /* Set address mask, when default is for 64bits addresses. */ + if (ci->features & DF_MAXIMUM_ADDR32) addrMask = 0xffffffff; + else if (ci->features & DF_MAXIMUM_ADDR16) addrMask = 0xffff; + + /* Copy other fields. */ + result->size = di->size; + result->offset = di->addr; + + if (di->flags == FLAG_NOT_DECODABLE) { + str = &result->mnemonic; + result->offset &= addrMask; + strclear_WS(&result->operands); + strcpy_WSN(str, "DB "); + str_code_hb(str, di->imm.byte); + strclear_WS(&result->instructionHex); + str_hex_b(&result->instructionHex, di->imm.byte); + return; /* Skip to next instruction. */ + } + + str = &result->instructionHex; + strclear_WS(str); + /* Gotta have full address for (di->addr - ci->codeOffset) to work in all modes. */ + for (i = 0; i < di->size; i++) + str_hex_b(str, ci->code[(unsigned int)(di->addr - ci->codeOffset + i)]); + + /* Truncate address now. */ + result->offset &= addrMask; + + str = &result->mnemonic; + switch (FLAG_GET_PREFIX(di->flags)) + { + case FLAG_LOCK: + strcpy_WSN(str, "LOCK "); + break; + case FLAG_REP: + /* REP prefix for CMPS and SCAS is really a REPZ. */ + if ((di->opcode == I_CMPS) || (di->opcode == I_SCAS)) strcpy_WSN(str, "REPZ "); + else strcpy_WSN(str, "REP "); + break; + case FLAG_REPNZ: + strcpy_WSN(str, "REPNZ "); + break; + default: + /* Init mnemonic string, cause next touch is concatenation. */ + strclear_WS(str); + break; + } + + mnemonic = (const _WMnemonic*)&_MNEMONICS[di->opcode]; + memcpy((int8_t*)&str->p[str->length], mnemonic->p, mnemonic->length + 1); + str->length += mnemonic->length; + + /* Format operands: */ + str = &result->operands; + strclear_WS(str); + + /* Special treatment for String instructions. */ + if ((META_GET_ISC(di->meta) == ISC_INTEGER) && + ((di->opcode == I_MOVS) || + (di->opcode == I_CMPS) || + (di->opcode == I_STOS) || + (di->opcode == I_LODS) || + (di->opcode == I_SCAS))) + { + /* + * No operands are needed if the address size is the default one, + * and no segment is overridden, so add the suffix letter, + * to indicate size of operation and continue to next instruction. + */ + if ((FLAG_GET_ADDRSIZE(di->flags) == ci->dt) && (SEGMENT_IS_DEFAULT(di->segment))) { + str = &result->mnemonic; + switch (di->ops[0].size) + { + case 8: chrcat_WS(str, 'B'); break; + case 16: chrcat_WS(str, 'W'); break; + case 32: chrcat_WS(str, 'D'); break; + case 64: chrcat_WS(str, 'Q'); break; + } + return; + } + } + + for (i = 0; ((i < OPERANDS_NO) && (di->ops[i].type != O_NONE)); i++) { + if (i > 0) strcat_WSN(str, ", "); + switch (di->ops[i].type) + { + case O_REG: + strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); + break; + case O_IMM: + /* If the instruction is 'push', show explicit size (except byte imm). */ + if ((di->opcode == I_PUSH) && (di->ops[i].size != 8)) distorm_format_size(str, di, i); + /* Special fix for negative sign extended immediates. */ + if ((di->flags & FLAG_IMM_SIGNED) && (di->ops[i].size == 8)) { + if (di->imm.sbyte < 0) { + chrcat_WS(str, MINUS_DISP_CHR); + str_code_hb(str, -di->imm.sbyte); + break; + } + } + if (di->ops[i].size == 64) str_code_hqw(str, (uint8_t*)&di->imm.qword); + else str_code_hdw(str, di->imm.dword); + break; + case O_IMM1: + str_code_hdw(str, di->imm.ex.i1); + break; + case O_IMM2: + str_code_hdw(str, di->imm.ex.i2); + break; + case O_DISP: + distorm_format_size(str, di, i); + chrcat_WS(str, OPEN_CHR); + if ((SEGMENT_GET(di->segment) != R_NONE) && !SEGMENT_IS_DEFAULT(di->segment)) { + strcat_WS(str, (const _WString*)&_REGISTERS[SEGMENT_GET(di->segment)]); + chrcat_WS(str, SEG_OFF_CHR); + } + tmpDisp64 = di->disp & addrMask; + str_code_hqw(str, (uint8_t*)&tmpDisp64); + chrcat_WS(str, CLOSE_CHR); + break; + case O_SMEM: + distorm_format_size(str, di, i); + chrcat_WS(str, OPEN_CHR); + + /* + * This is where we need to take special care for String instructions. + * If we got here, it means we need to explicitly show their operands. + * The problem with CMPS and MOVS is that they have two(!) memory operands. + * So we have to complete it ourselves, since the structure supplies only the segment that can be overridden. + * And make the rest of the String operations explicit. + */ + segment = SEGMENT_GET(di->segment); + isDefault = SEGMENT_IS_DEFAULT(di->segment); + switch (di->opcode) + { + case I_MOVS: + isDefault = FALSE; + if (i == 0) segment = R_ES; + break; + case I_CMPS: + isDefault = FALSE; + if (i == 1) segment = R_ES; + break; + case I_INS: + case I_LODS: + case I_STOS: + case I_SCAS: isDefault = FALSE; break; + } + if (!isDefault && (segment != R_NONE)) { + strcat_WS(str, (const _WString*)&_REGISTERS[segment]); + chrcat_WS(str, SEG_OFF_CHR); + } + + strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); + + distorm_format_signed_disp(str, di, addrMask); + chrcat_WS(str, CLOSE_CHR); + break; + case O_MEM: + distorm_format_size(str, di, i); + chrcat_WS(str, OPEN_CHR); + if ((SEGMENT_GET(di->segment) != R_NONE) && !SEGMENT_IS_DEFAULT(di->segment)) { + strcat_WS(str, (const _WString*)&_REGISTERS[SEGMENT_GET(di->segment)]); + chrcat_WS(str, SEG_OFF_CHR); + } + if (di->base != R_NONE) { + strcat_WS(str, (const _WString*)&_REGISTERS[di->base]); + chrcat_WS(str, PLUS_DISP_CHR); + } + strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); + if (di->scale != 0) { + chrcat_WS(str, '*'); + if (di->scale == 2) chrcat_WS(str, '2'); + else if (di->scale == 4) chrcat_WS(str, '4'); + else /* if (di->scale == 8) */ chrcat_WS(str, '8'); + } + + distorm_format_signed_disp(str, di, addrMask); + chrcat_WS(str, CLOSE_CHR); + break; + case O_PC: +#ifdef SUPPORT_64BIT_OFFSET + str_off64(str, (di->imm.sqword + di->addr + di->size) & addrMask); +#else + str_code_hdw(str, ((_OffsetType)di->imm.sdword + di->addr + di->size) & (uint32_t)addrMask); +#endif + break; + case O_PTR: + str_code_hdw(str, di->imm.ptr.seg); + chrcat_WS(str, SEG_OFF_CHR); + str_code_hdw(str, di->imm.ptr.off); + break; + } + } + + if (di->flags & FLAG_HINT_TAKEN) strcat_WSN(str, " ;TAKEN"); + else if (di->flags & FLAG_HINT_NOT_TAKEN) strcat_WSN(str, " ;NOT TAKEN"); +} + +#ifdef SUPPORT_64BIT_OFFSET + _DLLEXPORT_ _DecodeResult distorm_decode64(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount) +#else + _DLLEXPORT_ _DecodeResult distorm_decode32(_OffsetType codeOffset, const unsigned char* code, int codeLen, _DecodeType dt, _DecodedInst result[], unsigned int maxInstructions, unsigned int* usedInstructionsCount) +#endif +{ + _DecodeResult res; + _DInst di; + _CodeInfo ci; + unsigned int instsCount = 0, i; + + *usedInstructionsCount = 0; + + /* I use codeLen as a signed variable in order to ease detection of underflow... and besides - */ + if (codeLen < 0) { + return DECRES_INPUTERR; + } + + if ((dt != Decode16Bits) && (dt != Decode32Bits) && (dt != Decode64Bits)) { + return DECRES_INPUTERR; + } + + if (code == NULL || result == NULL) { + return DECRES_INPUTERR; + } + + /* Assume length=0 is success. */ + if (codeLen == 0) { + return DECRES_SUCCESS; + } + + /* + * We have to format the result into text. But the interal decoder works with the new structure of _DInst. + * Therefore, we will pass the result array(!) from the caller and the interal decoder will fill it in with _DInst's. + * Then we will copy each result to a temporary structure, and use it to reformat that specific result. + * + * This is all done to save memory allocation and to work on the same result array in-place!!! + * It's a bit ugly, I have to admit, but worth it. + */ + + ci.codeOffset = codeOffset; + ci.code = code; + ci.codeLen = codeLen; + ci.dt = dt; + ci.features = DF_NONE; + if (dt == Decode16Bits) ci.features = DF_MAXIMUM_ADDR16; + else if (dt == Decode32Bits) ci.features = DF_MAXIMUM_ADDR32; + + res = decode_internal(&ci, TRUE, (_DInst*)result, maxInstructions, &instsCount); + for (i = 0; i < instsCount; i++) { + if ((*usedInstructionsCount + i) >= maxInstructions) return DECRES_MEMORYERR; + + /* Copy the current decomposed result to a temp structure, so we can override the result with text. */ + memcpy(&di, (char*)result + (i * sizeof(_DecodedInst)), sizeof(_DInst)); +#ifdef SUPPORT_64BIT_OFFSET + distorm_format64(&ci, &di, &result[i]); +#else + distorm_format32(&ci, &di, &result[i]); +#endif + } + + *usedInstructionsCount = instsCount; + return res; +} + +#endif /* DISTORM_LIGHT */ + +_DLLEXPORT_ unsigned int distorm_version() +{ + return __DISTORMV__; +} diff --git a/NativeCore/Dependencies/distorm/src/instructions.c b/NativeCore/Dependencies/distorm/src/instructions.c new file mode 100644 index 00000000..0f120de6 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/instructions.c @@ -0,0 +1,597 @@ +/* +instructions.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "instructions.h" + +#include "insts.h" +#include "prefix.h" +#include "x86defs.h" +#include "../include/mnemonics.h" + + +/* Helper macros to extract the type or index from an inst-node value. */ +#define INST_NODE_INDEX(n) ((n) & 0x1fff) +#define INST_NODE_TYPE(n) ((n) >> 13) + +/* Helper macro to read the actual flags that are associated with an inst-info. */ +#define INST_INFO_FLAGS(ii) (FlagsTable[InstSharedInfoTable[(ii)->sharedIndex].flagsIndex]) + +/* +I use the trie data structure as I found it most fitting to a disassembler mechanism. +When you read a byte and have to decide if it's enough or you should read more bytes, 'till you get to the instruction information. +It's really fast because you POP the instruction info in top 3 iterates on the DB, because an instruction can be formed from two bytes + 3 bits reg from the ModR/M byte. +For a simple explanation, check this out: +http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Tree/Trie/ +Further reading: http://en.wikipedia.org/wiki/Trie + +The first GATE (array you read off a trie data structure), as I call them, is statically allocated by the compiler. +The second and third gates if used are being allocated dynamically by the instructions-insertion functionality. + +How would such a thing look in memory, say we support 4 instructions with 3 bytes top (means 2 dynamically allocated gates). + +-> +|-------| 0, +|0| -------------------------------> |-------| +|1|RET | 1, |0|AND | +|2| -----> |-------| |1|XOR | +|3|INT3 | |0|PUSH | |2|OR | 0,3, +|-------| |1|POP | |3| --------->|-------| + |2|PUSHF| |-------| |0|ROR | + |3|POPF | |1|ROL | + |-------| |2|SHR | + |3|SHL | + |-------| + +Of course, this is NOT how Intel instructions set looks!!! +but I just wanted to give a small demonstration. +Now the instructions you get from such a trie DB goes like this: + +0, 0 - AND +0, 1 - XOR +0, 2 - OR +0, 3, 0, ROR +0, 3, 1, ROL +0, 3, 2, SHR +0, 3, 3, SHL +1 - RET +2, 0 - PUSH +2, 1 - POP +2, 2 - PUSHF +2, 3 - POPF +3 - INT3 + +I guess it's clear by now. +So now, if you read 0, you know that you have to enter the second gate(list) with the second byte specifying the index. +But if you read 1, you know that you go to an instruction (in this case, a RET). +That's why there's an Instruction-Node structure, it tells you whether you got to an instruction or another list +so you should keep on reading byte). + +In Intel, you could go through 4 gates at top, because there are instructions which are built from 2 bytes and another smaller list +for the REG part, or newest SSE4 instructions which use 4 bytes for opcode. +Therefore, Intel's first gate is 256 long, and other gates are 256 (/72) or 8 long, yes, it costs pretty much a lot of memory +for non-used defined instructions, but I think that it still rocks. +*/ + +/* + * A helper function to look up the correct inst-info structure. + * It does one fetch from the index-table, and then another to get the inst-info. + * Note that it takes care about basic inst-info or inst-info-ex. + * The caller should worry about boundary checks and whether it accesses a last-level table. + */ +static _InstInfo* inst_get_info(_InstNode in, int index) +{ + int instIndex = 0; + + in = InstructionsTree[INST_NODE_INDEX(in) + index]; + if (in == INT_NOTEXISTS) return NULL; + + instIndex = INST_NODE_INDEX(in); + return INST_NODE_TYPE(in) == INT_INFO ? &InstInfos[instIndex] : (_InstInfo*)&InstInfosEx[instIndex]; +} + +/* + * This function is responsible to return the instruction information of the first found in code. + * It returns the _InstInfo of the found instruction, otherwise NULL. + * code should point to the ModR/M byte upon exit (if used), or after the instruction binary code itself. + * This function is NOT decoding-type dependant, it is up to the caller to see whether the instruction is valid. + * Get the instruction info, using a Trie data structure. + * + * Sometimes normal prefixes become mandatory prefixes, which means they are now part of the instruction opcode bytes. + + * This is a bit tricky now, + * if the first byte is a REP (F3) prefix, we will have to give a chance to an SSE instruction. + * If an instruction doesn't exist, we will make it as a prefix and re-locateinst. + * A case such that a REP prefix is being changed into an instruction byte and also an SSE instruction will not be found can't happen, + * simply because there are no collisions between string instruction and SSE instructions (they are escaped). + + * As for S/SSE2/3, check for F2 and 66 as well. + + * In 64 bits, we have to make sure that we will skip the REX prefix, if it exists. + * There's a specific case, where a 66 is mandatory but it was dropped because REG.W was used, + * but it doesn't behave as an operand size prefix but as a mandatory, so we will have to take it into account. + + * For example (64 bits decoding mode): + * 66 98 CBW + * 48 98 CDQE + * 66 48 98: db 0x66; CDQE + * Shows that operand size is dropped. + + * Now, it's a mandatory prefix and NOT an operand size one. + * 66480f2dc0 db 0x48; CVTPD2PI XMM0, XMM0 + * Although this instruction doesn't require a REX.W, it just shows, that even if it did - it doesn't matter. + * REX.W is dropped because it's not required, but the decode function disabled the operand size even so. + */ +static _InstInfo* inst_lookup_prefixed(_InstNode in, _PrefixState* ps) +{ + int checkOpSize = FALSE; + int index = 0; + _InstInfo* ii = NULL; + + /* Check prefixes of current decoded instruction (None, 0x66, 0xf3, 0xf2). */ + switch (ps->decodedPrefixes & (INST_PRE_OP_SIZE | INST_PRE_REPS)) + { + case 0: + /* Non-prefixed, index = 0. */ + index = 0; + break; + case INST_PRE_OP_SIZE: + /* 0x66, index = 1. */ + index = 1; + /* Mark that we used it as a mandatory prefix. */ + ps->isOpSizeMandatory = TRUE; + ps->decodedPrefixes &= ~INST_PRE_OP_SIZE; + break; + case INST_PRE_REP: + /* 0xf3, index = 2. */ + index = 2; + ps->decodedPrefixes &= ~INST_PRE_REP; + break; + case INST_PRE_REPNZ: + /* 0xf2, index = 3. */ + index = 3; + ps->decodedPrefixes &= ~INST_PRE_REPNZ; + break; + default: + /* + * Now we got a problem, since there are a few mandatory prefixes at once. + * There is only one case when it's ok, when the operand size prefix is for real (not mandatory). + * Otherwise we will have to return NULL, since the instruction is illegal. + * Therefore we will start with REPNZ and REP prefixes, + * try to get the instruction and only then check for the operand size prefix. + */ + + /* If both REPNZ and REP are together, it's illegal for sure. */ + if ((ps->decodedPrefixes & INST_PRE_REPS) == INST_PRE_REPS) return NULL; + + /* Now we know it's either REPNZ+OPSIZE or REP+OPSIZE, so examine the instruction. */ + if (ps->decodedPrefixes & INST_PRE_REPNZ) { + index = 3; + ps->decodedPrefixes &= ~INST_PRE_REPNZ; + } else if (ps->decodedPrefixes & INST_PRE_REP) { + index = 2; + ps->decodedPrefixes &= ~INST_PRE_REP; + } + /* Mark to verify the operand-size prefix of the fetched instruction below. */ + checkOpSize = TRUE; + break; + } + + /* Fetch the inst-info from the index. */ + ii = inst_get_info(in, index); + + if (checkOpSize) { + /* If the instruction doesn't support operand size prefix, then it's illegal. */ + if ((ii == NULL) || (~INST_INFO_FLAGS(ii) & INST_PRE_OP_SIZE)) return NULL; + } + + /* If there was a prefix, but the instruction wasn't found. Try to fall back to use the normal instruction. */ + if (ii == NULL) ii = inst_get_info(in, 0); + return ii; +} + +/* A helper function to look up special VEX instructions. + * See if it's a MOD based instruction and fix index if required. + * Only after a first lookup (that was done by caller), we can tell if we need to fix the index. + * Because these are coupled instructions + * (which means that the base instruction hints about the other instruction). + * Note that caller should check if it's a MOD dependent instruction before getting in here. + */ +static _InstInfo* inst_vex_mod_lookup(_CodeInfo* ci, _InstNode in, _InstInfo* ii, unsigned int index) +{ + /* Advance to read the MOD from ModRM byte. */ + ci->code += 1; + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + if (*ci->code < INST_DIVIDED_MODRM) { + /* MOD is not 11, therefore change the index to 8 - 12 range in the prefixed table. */ + index += 4; + /* Make a second lookup for this special instruction. */ + return inst_get_info(in, index); + } + /* Return the original one, in case we didn't find a suited instruction. */ + return ii; +} + +static _InstInfo* inst_vex_lookup(_CodeInfo* ci, _PrefixState* ps) +{ + _InstNode in = 0; + unsigned int pp = 0, start = 0; + unsigned int index = 4; /* VEX instructions start at index 4 in the Prefixed table. */ + uint8_t vex = *ps->vexPos, vex2 = 0, v = 0; + int instType = 0, instIndex = 0; + + /* The VEX instruction will #ud if any of 66, f0, f2, f3, REX prefixes precede. */ + _iflags illegal = (INST_PRE_OP_SIZE | INST_PRE_LOCK | INST_PRE_REP | INST_PRE_REPNZ | INST_PRE_REX); + if ((ps->decodedPrefixes & illegal) != 0) return NULL; + + /* Read the some fields from the VEX prefix we need to extract the instruction. */ + if (ps->prefixExtType == PET_VEX2BYTES) { + ps->vexV = v = (~vex >> 3) & 0xf; + pp = vex & 3; + /* Implied leading 0x0f byte by default for 2 bytes VEX prefix. */ + start = 1; + } else { /* PET_VEX3BYTES */ + start = vex & 0x1f; + vex2 = *(ps->vexPos + 1); + ps->vexV = v = (~vex2 >> 3) & 0xf; + pp = vex2 & 3; + } + + /* start can be either 1 (0x0f), 2 (0x0f, 0x038) or 3 (0x0f, 0x3a), otherwise it's illegal. */ + switch (start) + { + case 1: in = Table_0F; break; + case 2: in = Table_0F_38; break; + case 3: in = Table_0F_3A; break; + default: return NULL; + } + + /* pp is actually the implied mandatory prefix, apply it to the index. */ + index += pp; /* (None, 0x66, 0xf3, 0xf2) */ + + /* Read a byte from the stream. */ + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + + in = InstructionsTree[INST_NODE_INDEX(in) + *ci->code]; + if (in == INT_NOTEXISTS) return NULL; + + instType = INST_NODE_TYPE(in); + instIndex = INST_NODE_INDEX(in); + + /* + * If we started with 0f38 or 0f3a so it's a prefixed table, + * therefore it's surely a VEXed instruction (because of a high index). + * However, starting with 0f, could also lead immediately to a prefixed table for some bytes. + * it might return NULL, if the index is invalid. + */ + if (instType == INT_LIST_PREFIXED) { + _InstInfo* ii = inst_get_info(in, index); + /* See if the instruction is dependent on MOD. */ + if ((ii != NULL) && (((_InstInfoEx*)ii)->flagsEx & INST_MODRR_BASED)) { + ii = inst_vex_mod_lookup(ci, in, ii, index); + } + return ii; + } + + /* + * If we reached here, obviously we started with 0f. VEXed instructions must be nodes of a prefixed table. + * But since we found an instruction (or divided one), just return NULL. + * They cannot lead to a VEXed instruction. + */ + if ((instType == INT_INFO) || (instType == INT_INFOEX) || (instType == INT_LIST_DIVIDED)) return NULL; + + /* Now we are left with handling either GROUP or FULL tables, therefore we will read another byte from the stream. */ + ci->code += 1; + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + + if (instType == INT_LIST_GROUP) { + in = InstructionsTree[instIndex + ((*ci->code >> 3) & 7)]; + /* Continue below to check prefixed table. */ + } else if (instType == INT_LIST_FULL) { + in = InstructionsTree[instIndex + *ci->code]; + /* Continue below to check prefixed table. */ + } + + /* Now that we got to the last table in the trie, check for a prefixed table. */ + if (INST_NODE_TYPE(in) == INT_LIST_PREFIXED) { + _InstInfo* ii = inst_get_info(in, index); + /* See if the instruction is dependent on MOD. */ + if ((ii != NULL) && (((_InstInfoEx*)ii)->flagsEx & INST_MODRR_BASED)) { + ii = inst_vex_mod_lookup(ci, in, ii, index); + } + return ii; + } + + /* No VEXed instruction was found. */ + return NULL; +} + +_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) +{ + unsigned int tmpIndex0 = 0, tmpIndex1 = 0, tmpIndex2 = 0, rex = ps->vrex; + int instType = 0; + _InstNode in = 0; + _InstInfo* ii = NULL; + int isWaitIncluded = FALSE; + + /* See whether we have to handle a VEX prefixed instruction. */ + if (ps->decodedPrefixes & INST_PRE_VEX) { + ii = inst_vex_lookup(ci, ps); + if (ii != NULL) { + /* Make sure that VEX.L exists when forced. */ + if ((((_InstInfoEx*)ii)->flagsEx & INST_FORCE_VEXL) && (~ps->vrex & PREFIX_EX_L)) return NULL; + /* If the instruction doesn't use VEX.vvvv it must be zero. */ + if ((((_InstInfoEx*)ii)->flagsEx & INST_VEX_V_UNUSED) && ps->vexV) return NULL; + } + return ii; + } + + /* Read first byte. */ + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + tmpIndex0 = *ci->code; + + /* Check for special 0x9b, WAIT instruction, which can be part of some instructions(x87). */ + if (tmpIndex0 == INST_WAIT_INDEX) { + /* Only OCST_1dBYTES get a chance to include this byte as part of the opcode. */ + isWaitIncluded = TRUE; + + /* Ignore all prefixes, since they are useless and operate on the WAIT instruction itself. */ + prefixes_ignore_all(ps); + + /* Move to next code byte as a new whole instruction. */ + ci->code += 1; + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; /* Faster to return NULL, it will be detected as WAIT later anyway. */ + /* Since we got a WAIT prefix, we re-read the first byte. */ + tmpIndex0 = *ci->code; + } + + /* Walk first byte in InstructionsTree root. */ + in = InstructionsTree[tmpIndex0]; + if (in == INT_NOTEXISTS) return NULL; + instType = INST_NODE_TYPE(in); + + /* Single byte instruction (OCST_1BYTE). */ + if ((instType < INT_INFOS) && (!isWaitIncluded)) { + /* Some single byte instructions need extra treatment. */ + switch (tmpIndex0) + { + case INST_ARPL_INDEX: + /* + * ARPL/MOVSXD share the same opcode, and both have different operands and mnemonics, of course. + * Practically, I couldn't come up with a comfortable way to merge the operands' types of ARPL/MOVSXD. + * And since the DB can't be patched dynamically, because the DB has to be multi-threaded compliant, + * I have no choice but to check for ARPL/MOVSXD right here - "right about now, the funk soul brother, check it out now, the funk soul brother...", fatboy slim + */ + if (ci->dt == Decode64Bits) { + return &II_MOVSXD; + } /* else ARPL will be returned because its defined in the DB already. */ + break; + + case INST_NOP_INDEX: /* Nopnopnop */ + /* Check for Pause, since it's prefixed with 0xf3, which is not a real mandatory prefix. */ + if (ps->decodedPrefixes & INST_PRE_REP) { + /* Flag this prefix as used. */ + ps->usedPrefixes |= INST_PRE_REP; + return &II_PAUSE; + } + + /* + * Treat NOP/XCHG specially. + * If we're not in 64bits restore XCHG to NOP, since in the DB it's XCHG. + * Else if we're in 64bits examine REX, if exists, and decide which instruction should go to output. + * 48 90 XCHG RAX, RAX is a true NOP (eat REX in this case because it's valid). + * 90 XCHG EAX, EAX is a true NOP (and not high dword of RAX = 0 although it should be a 32 bits operation). + * Note that if the REX.B is used, then the register is not RAX anymore but R8, which means it's not a NOP. + */ + if (rex & PREFIX_EX_W) ps->usedPrefixes |= INST_PRE_REX; + if ((ci->dt != Decode64Bits) || (~rex & PREFIX_EX_B)) return &II_NOP; + break; + + case INST_LEA_INDEX: + /* Ignore segment override prefixes for LEA instruction. */ + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + /* Update unused mask for ignoring segment prefix. */ + prefixes_ignore(ps, PFXIDX_SEG); + break; + } + + /* Return the 1 byte instruction we found. */ + return instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + } + + /* Read second byte, still doesn't mean all of its bits are used (I.E: ModRM). */ + ci->code += 1; + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + tmpIndex1 = *ci->code; + + /* Try single byte instruction + reg bits (OCST_13BYTES). */ + if ((instType == INT_LIST_GROUP) && (!isWaitIncluded)) return inst_get_info(in, (tmpIndex1 >> 3) & 7); + + /* Try single byte instruction + reg byte OR one whole byte (OCST_1dBYTES). */ + if (instType == INT_LIST_DIVIDED) { + + /* Checking for inst by REG bits is higher priority if it's found not to be divided instruction. */ + { + _InstNode in2 = InstructionsTree[INST_NODE_INDEX(in) + ((tmpIndex1 >> 3) & 7)]; + /* + * Do NOT check for NULL here, since we do a bit of a guess work, + * hence we don't override 'in', cause we might still need it. + */ + instType = INST_NODE_TYPE(in2); + + if (instType == INT_INFO) ii = &InstInfos[INST_NODE_INDEX(in2)]; + else if (instType == INT_INFOEX) ii = (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in2)]; + if ((ii != NULL) && (INST_INFO_FLAGS(ii) & INST_NOT_DIVIDED)) return ii; + /* ii is reset below. */ + } + + /* Continue normally because of wait prefix. */ + if (tmpIndex1 < INST_DIVIDED_MODRM) { + /* An instruction which requires a ModR/M byte. Thus it's 1.3 bytes long instruction. */ + tmpIndex1 = (tmpIndex1 >> 3) & 7; /* Isolate the 3 REG/OPCODE bits. */ + } else { /* Normal 2 bytes instruction. */ + /* + * Divided instructions can't be in the range of 0x8-0xc0. + * That's because 0-8 are used for 3 bits group. + * And 0xc0-0xff are used for not-divided instruction. + * So the in between range is omitted, thus saving some more place in the tables. + */ + tmpIndex1 -= INST_DIVIDED_MODRM - 8; + } + + in = InstructionsTree[INST_NODE_INDEX(in) + tmpIndex1]; + if (in == INT_NOTEXISTS) return NULL; + instType = INST_NODE_TYPE(in); + + if (instType < INT_INFOS) { + /* If the instruction doesn't support the wait (marked as opsize) as part of the opcode, it's illegal. */ + ii = instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + if ((~INST_INFO_FLAGS(ii) & INST_PRE_OP_SIZE) && (isWaitIncluded)) return NULL; + return ii; + } + /* + * If we got here the instruction can support the wait prefix, so see if it was part of the stream. + * Examine prefixed table, specially used for 0x9b, since it's optional. + * No Wait: index = 0. + * Wait Exists, index = 1. + */ + return inst_get_info(in, isWaitIncluded); + } + + /* Don't allow to continue if WAIT is part of the opcode, because there are no instructions that include it. */ + if (isWaitIncluded) return NULL; + + /* Try 2 bytes long instruction (doesn't include ModRM byte). */ + if (instType == INT_LIST_FULL) { + in = InstructionsTree[INST_NODE_INDEX(in) + tmpIndex1]; + if (in == INT_NOTEXISTS) return NULL; + instType = INST_NODE_TYPE(in); + + /* This is where we check if we just read two escape bytes in a row, which means it is a 3DNow! instruction. */ + if ((tmpIndex0 == _3DNOW_ESCAPE_BYTE) && (tmpIndex1 == _3DNOW_ESCAPE_BYTE)) return &II_3DNOW; + + /* 2 bytes instruction (OCST_2BYTES). */ + if (instType < INT_INFOS) + return instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + + /* + * 2 bytes + mandatory prefix. + * Mandatory prefixes can be anywhere in the prefixes. + * There cannot be more than one mandatory prefix, unless it's a normal operand size prefix. + */ + if (instType == INT_LIST_PREFIXED) return inst_lookup_prefixed(in, ps); + } + + /* Read third byte, still doesn't mean all of its bits are used (I.E: ModRM). */ + ci->code += 1; + ci->codeLen -= 1; + if (ci->codeLen < 0) return NULL; + tmpIndex2 = *ci->code; + + /* Try 2 bytes + reg instruction (OCST_23BYTES). */ + if (instType == INT_LIST_GROUP) { + in = InstructionsTree[INST_NODE_INDEX(in) + ((tmpIndex2 >> 3) & 7)]; + if (in == INT_NOTEXISTS) return NULL; + instType = INST_NODE_TYPE(in); + + if (instType < INT_INFOS) + return instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + + /* It has to be a prefixed table then. */ + ii = inst_lookup_prefixed(in, ps); + /* RDRAND and VMPTRLD share same 2.3 bytes opcode, and alternate on the MOD bits. See insts.h for more info. */ + if ((ii != NULL) && (ii->opcodeId == I_VMPTRLD) && (tmpIndex1 >= INST_DIVIDED_MODRM)) return &II_RDRAND; + return ii; + } + + /* Try 2 bytes + divided range (OCST_2dBYTES). */ + if (instType == INT_LIST_DIVIDED) { + _InstNode in2 = InstructionsTree[INST_NODE_INDEX(in) + ((tmpIndex2 >> 3) & 7)]; + /* + * Do NOT check for NULL here, since we do a bit of a guess work, + * hence we don't override 'in', cause we might still need it. + */ + instType = INST_NODE_TYPE(in2); + + if (instType == INT_INFO) ii = &InstInfos[INST_NODE_INDEX(in2)]; + else if (instType == INT_INFOEX) ii = (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in2)]; + + /* + * OCST_2dBYTES is complex, because there are a few instructions which are not divided in some special cases. + * If the instruction wasn't divided (but still it must be a 2.3 because we are in divided category) + * or it was an official 2.3 (because its index was less than 0xc0) - + * Then it means the instruction should be using the REG bits, otherwise give a chance to range 0xc0-0xff. + */ + /* If we found an instruction only by its REG bits, AND it is not divided, then return it. */ + if ((ii != NULL) && (INST_INFO_FLAGS(ii) & INST_NOT_DIVIDED)) return ii; + /* Otherwise, if the range is above 0xc0, try the special divided range (range 0x8-0xc0 is omitted). */ + if (tmpIndex2 >= INST_DIVIDED_MODRM) return inst_get_info(in, tmpIndex2 - INST_DIVIDED_MODRM + 8); + + /* It might be that we got here without touching ii in the above if statements, then it becomes an invalid instruction prolly. */ + return ii; + } + + /* Try 3 full bytes (OCST_3BYTES - no ModRM byte). */ + if (instType == INT_LIST_FULL) { + /* OCST_3BYTES. */ + in = InstructionsTree[INST_NODE_INDEX(in) + tmpIndex2]; + if (in == INT_NOTEXISTS) return NULL; + instType = INST_NODE_TYPE(in); + + if (instType < INT_INFOS) + return instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + + if (instType == INT_LIST_PREFIXED) return inst_lookup_prefixed(in, ps); + } + + /* Kahtchinggg, damn. */ + return NULL; +} + +/* +* 3DNow! instruction handling: + +* This is used when we encounter a 3DNow! instruction. +* We can't really locate a 3DNow! instruction before we see two escaped bytes, +* 0x0f, 0x0f. Then we have to extract operands which are, dest=mmx register, src=mmx register or quadword indirection. +* When we are finished with the extraction of operands we can resume to locate the instruction by reading another byte +* which tells us which 3DNow instruction we really tracked down... +* So in order to tell the extract operands function which operands the 3DNow! instruction require, we need to set up some +* generic instruction info for 3DNow! instructions. + +* In the inst_lookup itself, when we read an OCST_3BYTES which the two first bytes are 0x0f and 0x0f. +* we will return this special generic II for the specific operands we are interested in (MM, MM64). +* Then after extracting the operand, we'll call a completion routine for locating the instruction +* which will be called only for 3DNow! instructions, distinguished by a flag, and it will read the last byte of the 3 bytes. +* +* The id of this opcode should not be used, the following function should change it anyway. +*/ +_InstInfo* inst_lookup_3dnow(_CodeInfo* ci) +{ + /* Start off from the two escape bytes gates... which is 3DNow! table.*/ + _InstNode in = Table_0F_0F; + + int index; + + /* Make sure we can read a byte off the stream. */ + if (ci->codeLen < 1) return NULL; + + index = *ci->code; + + ci->codeLen -= 1; + ci->code += 1; + return inst_get_info(in, index); +} diff --git a/NativeCore/Dependencies/distorm/src/instructions.h b/NativeCore/Dependencies/distorm/src/instructions.h new file mode 100644 index 00000000..b8d8a64a --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/instructions.h @@ -0,0 +1,463 @@ +/* +instructions.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef INSTRUCTIONS_H +#define INSTRUCTIONS_H + +#include "config.h" +#include "prefix.h" + + +/* + * Operand type possibilities: + * Note "_FULL" suffix indicates to decode the operand as 16 bits or 32 bits depends on DecodeType - + * actually, it depends on the decoding mode, unless there's an operand/address size prefix. + * For example, the code: 33 c0 could be decoded/executed as XOR AX, AX or XOR EAX, EAX. + */ +typedef enum OpType { + /* No operand is set */ + OT_NONE = 0, + + /* Read a byte(8 bits) immediate */ + OT_IMM8, + /* Force a read of a word(16 bits) immediate, used by ret only */ + OT_IMM16, + /* Read a word/dword immediate */ + OT_IMM_FULL, + /* Read a double-word(32 bits) immediate */ + OT_IMM32, + + /* Read a signed extended byte(8 bits) immediate */ + OT_SEIMM8, + + /* + * Special immediates for instructions which have more than one immediate, + * which is an exception from standard instruction format. + * As to version v1.0: ENTER, INSERTQ, EXTRQ are the only problematic ones. + */ + /* 16 bits immediate using the first imm-slot */ + OT_IMM16_1, + /* 8 bits immediate using the first imm-slot */ + OT_IMM8_1, + /* 8 bits immediate using the second imm-slot */ + OT_IMM8_2, + + /* Use a 8bit register */ + OT_REG8, + /* Use a 16bit register */ + OT_REG16, + /* Use a 16/32/64bit register */ + OT_REG_FULL, + /* Use a 32bit register */ + OT_REG32, + /* + * If used with REX the reg operand size becomes 64 bits, otherwise 32 bits. + * VMX instructions are promoted automatically without a REX prefix. + */ + OT_REG32_64, + /* Used only by MOV CR/DR(n). Promoted with REX onlly. */ + OT_FREG32_64_RM, + + /* Use or read (indirection) a 8bit register or immediate byte */ + OT_RM8, + /* Some instructions force 16 bits (mov sreg, rm16) */ + OT_RM16, + /* Use or read a 16/32/64bit register or immediate word/dword/qword */ + OT_RM_FULL, + /* + * 32 or 64 bits (with REX) operand size indirection memory operand. + * Some instructions are promoted automatically without a REX prefix. + */ + OT_RM32_64, + /* 16 or 32 bits RM. This is used only with MOVZXD instruction in 64bits. */ + OT_RM16_32, + /* Same as OT_RMXX but POINTS to 16 bits [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM16, + /* Same as OT_RMXX but POINTS to 32 bits (single precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM32, + /* Same as OT_RMXX but POINTS to 64 bits (double precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM64, + /* Same as OT_RMXX but POINTS to 80 bits (extended precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM80, + + /* + * Special operand type for SSE4 where the ModR/M might + * be a 32 bits register or 8 bits memory indirection operand. + */ + OT_R32_M8, + /* + * Special ModR/M for PINSRW, which need a 16 bits memory operand or 32 bits register. + * In 16 bits decoding mode R32 becomes R16, operand size cannot affect this. + */ + OT_R32_M16, + /* + * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or + * a 8 bits memory indirection operand. + */ + OT_R32_64_M8, + /* + * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or + * a 16 bits memory indirection operand. + */ + OT_R32_64_M16, + /* + * Special operand type for MOV reg16/32/64/mem16, segReg 8C /r. and SMSW. + * It supports all decoding modes, but if used as a memory indirection it's a 16 bit ModR/M indirection. + */ + OT_RFULL_M16, + + /* Use a control register */ + OT_CREG, + /* Use a debug register */ + OT_DREG, + /* Use a segment register */ + OT_SREG, + /* + * SEG is encoded in the flags of the opcode itself! + * This is used for specific "push SS" where SS is a segment where + * each "push SS" has an absolutely different opcode byte. + * We need this to detect whether an operand size prefix is used. + */ + OT_SEG, + + /* Use AL */ + OT_ACC8, + /* Use AX (FSTSW) */ + OT_ACC16, + /* Use AX/EAX/RAX */ + OT_ACC_FULL, + /* Use AX/EAX, no REX is possible for RAX, used only with IN/OUT which don't support 64 bit registers */ + OT_ACC_FULL_NOT64, + + /* + * Read one word (seg), and a word/dword/qword (depends on operand size) from memory. + * JMP FAR [EBX] means EBX point to 16:32 ptr. + */ + OT_MEM16_FULL, + /* Read one word (seg) and a word/dword/qword (depends on operand size), usually SEG:OFF, JMP 1234:1234 */ + OT_PTR16_FULL, + /* Read one word (limit) and a dword/qword (limit) (depends on operand size), used by SGDT, SIDT, LGDT, LIDT. */ + OT_MEM16_3264, + + /* Read a byte(8 bits) immediate and calculate it relatively to the current offset of the instruction being decoded */ + OT_RELCB, + /* Read a word/dword immediate and calculate it relatively to the current offset of the instruction being decoded */ + OT_RELC_FULL, + + /* Use general memory indirection, with varying sizes: */ + OT_MEM, + /* Used when a memory indirection is required, but if the mod field is 11, this operand will be ignored. */ + OT_MEM_OPT, + OT_MEM32, + /* Memory dereference for MOVNTI, either 32 or 64 bits (with REX). */ + OT_MEM32_64, + OT_MEM64, + OT_MEM128, + /* Used for cmpxchg8b/16b. */ + OT_MEM64_128, + + /* Read an immediate as an absolute address, size is known by instruction, used by MOV (memory offset) only */ + OT_MOFFS8, + OT_MOFFS_FULL, + /* Use an immediate of 1, as for SHR R/M, 1 */ + OT_CONST1, + /* Use CL, as for SHR R/M, CL */ + OT_REGCL, + + /* + * Instruction-Block for one byte long instructions, used by INC/DEC/PUSH/POP/XCHG, + * REG is extracted from the value of opcode + * Use a 8bit register + */ + OT_IB_RB, + /* Use a 16/32/64bit register */ + OT_IB_R_FULL, + + /* Use [(r)SI] as INDIRECTION, for repeatable instructions */ + OT_REGI_ESI, + /* Use [(r)DI] as INDIRECTION, for repeatable instructions */ + OT_REGI_EDI, + /* Use [(r)BX + AL] as INDIRECTIOM, used by XLAT only */ + OT_REGI_EBXAL, + /* Use [(r)AX] as INDIRECTION, used by AMD's SVM instructions */ + OT_REGI_EAX, + /* Use DX, as for OUTS DX, BYTE [SI] */ + OT_REGDX, + /* Use ECX in INVLPGA instruction */ + OT_REGECX, + + /* FPU registers: */ + OT_FPU_SI, /* ST(i) */ + OT_FPU_SSI, /* ST(0), ST(i) */ + OT_FPU_SIS, /* ST(i), ST(0) */ + + /* MMX registers: */ + OT_MM, + /* Extract the MMX register from the RM bits this time (used when the REG bits are used for opcode extension) */ + OT_MM_RM, + /* ModR/M points to 32 bits MMX variable */ + OT_MM32, + /* ModR/M points to 32 bits MMX variable */ + OT_MM64, + + /* SSE registers: */ + OT_XMM, + /* Extract the SSE register from the RM bits this time (used when the REG bits are used for opcode extension) */ + OT_XMM_RM, + /* ModR/M points to 16 bits SSE variable */ + OT_XMM16, + /* ModR/M points to 32 bits SSE variable */ + OT_XMM32, + /* ModR/M points to 64 bits SSE variable */ + OT_XMM64, + /* ModR/M points to 128 bits SSE variable */ + OT_XMM128, + /* Implied XMM0 register as operand, used in SSE4. */ + OT_REGXMM0, + + /* AVX operands: */ + + /* ModR/M for 32 bits. */ + OT_RM32, + /* Reg32/Reg64 (prefix width) or Mem8. */ + OT_REG32_64_M8, + /* Reg32/Reg64 (prefix width) or Mem16. */ + OT_REG32_64_M16, + /* Reg32/Reg 64 depends on prefix width only. */ + OT_WREG32_64, + /* RM32/RM64 depends on prefix width only. */ + OT_WRM32_64, + /* XMM or Mem32/Mem64 depends on perfix width only. */ + OT_WXMM32_64, + /* XMM is encoded in VEX.VVVV. */ + OT_VXMM, + /* XMM is encoded in the high nibble of an immediate byte. */ + OT_XMM_IMM, + /* YMM/XMM is dependent on VEX.L. */ + OT_YXMM, + /* YMM/XMM (depends on prefix length) is encoded in the high nibble of an immediate byte. */ + OT_YXMM_IMM, + /* YMM is encoded in reg. */ + OT_YMM, + /* YMM or Mem256. */ + OT_YMM256, + /* YMM is encoded in VEX.VVVV. */ + OT_VYMM, + /* YMM/XMM is dependent on VEX.L, and encoded in VEX.VVVV. */ + OT_VYXMM, + /* YMM/XMM or Mem64/Mem256 is dependent on VEX.L. */ + OT_YXMM64_256, + /* YMM/XMM or Mem128/Mem256 is dependent on VEX.L. */ + OT_YXMM128_256, + /* XMM or Mem64/Mem256 is dependent on VEX.L. */ + OT_LXMM64_128, + /* Mem128/Mem256 is dependent on VEX.L. */ + OT_LMEM128_256 +} _OpType; + +/* Flags for instruction: */ + +/* Empty flags indicator: */ +#define INST_FLAGS_NONE (0) +/* The instruction we are going to decode requires ModR/M encoding. */ +#define INST_MODRM_REQUIRED (1) +/* Special treatment for instructions which are in the divided-category but still needs the whole byte for ModR/M... */ +#define INST_NOT_DIVIDED (1 << 1) +/* + * Used explicitly in repeatable instructions, + * which needs a suffix letter in their mnemonic to specify operation-size (depend on operands). + */ +#define INST_16BITS (1 << 2) +/* If the opcode is supported by 80286 and upper models (16/32 bits). */ +#define INST_32BITS (1 << 3) +/* + * Prefix flags (6 types: lock/rep, seg override, addr-size, oper-size, REX, VEX) + * There are several specific instructions that can follow LOCK prefix, + * note that they must be using a memory operand form, otherwise they generate an exception. + */ +#define INST_PRE_LOCK (1 << 4) +/* REPNZ prefix for string instructions only - means an instruction can follow it. */ +#define INST_PRE_REPNZ (1 << 5) +/* REP prefix for string instructions only - means an instruction can follow it. */ +#define INST_PRE_REP (1 << 6) +/* CS override prefix. */ +#define INST_PRE_CS (1 << 7) +/* SS override prefix. */ +#define INST_PRE_SS (1 << 8) +/* DS override prefix. */ +#define INST_PRE_DS (1 << 9) +/* ES override prefix. */ +#define INST_PRE_ES (1 << 10) +/* FS override prefix. Funky Segment :) */ +#define INST_PRE_FS (1 << 11) +/* GS override prefix. Groovy Segment, of course not, duh ! */ +#define INST_PRE_GS (1 << 12) +/* Switch operand size from 32 to 16 and vice versa. */ +#define INST_PRE_OP_SIZE (1 << 13) +/* Switch address size from 32 to 16 and vice versa. */ +#define INST_PRE_ADDR_SIZE (1 << 14) +/* Native instructions which needs suffix letter to indicate their operation-size (and don't depend on operands). */ +#define INST_NATIVE (1 << 15) +/* Use extended mnemonic, means it's an _InstInfoEx structure, which contains another mnemonic for 32 bits specifically. */ +#define INST_USE_EXMNEMONIC (1 << 16) +/* Use third operand, means it's an _InstInfoEx structure, which contains another operand for special instructions. */ +#define INST_USE_OP3 (1 << 17) +/* Use fourth operand, means it's an _InstInfoEx structure, which contains another operand for special instructions. */ +#define INST_USE_OP4 (1 << 18) +/* The instruction's mnemonic depends on the mod value of the ModR/M byte (mod=11, mod!=11). */ +#define INST_MNEMONIC_MODRM_BASED (1 << 19) +/* The instruction uses a ModR/M byte which the MOD must be 11 (for registers operands only). */ +#define INST_MODRR_REQUIRED (1 << 20) +/* The way of 3DNow! instructions are built, we have to handle their locating specially. Suffix imm8 tells which instruction it is. */ +#define INST_3DNOW_FETCH (1 << 21) +/* The instruction needs two suffixes, one for the comparison type (imm8) and the second for its operation size indication (second mnemonic). */ +#define INST_PSEUDO_OPCODE (1 << 22) +/* Invalid instruction at 64 bits decoding mode. */ +#define INST_INVALID_64BITS (1 << 23) +/* Specific instruction can be promoted to 64 bits (without REX, it is promoted automatically). */ +#define INST_64BITS (1 << 24) +/* Indicates the instruction must be REX prefixed in order to use 64 bits operands. */ +#define INST_PRE_REX (1 << 25) +/* Third mnemonic is set. */ +#define INST_USE_EXMNEMONIC2 (1 << 26) +/* Instruction is only valid in 64 bits decoding mode. */ +#define INST_64BITS_FETCH (1 << 27) +/* Forces that the ModRM-REG/Opcode field will be 0. (For EXTRQ). */ +#define INST_FORCE_REG0 (1 << 28) +/* Indicates that instruction is encoded with a VEX prefix. */ +#define INST_PRE_VEX (1 << 29) +/* Indicates that the instruction is encoded with a ModRM byte (REG field specifically). */ +#define INST_MODRM_INCLUDED (1 << 30) +/* Indicates that the first (/destination) operand of the instruction is writable. */ +#define INST_DST_WR (1 << 31) + +#define INST_PRE_REPS (INST_PRE_REPNZ | INST_PRE_REP) +#define INST_PRE_LOKREP_MASK (INST_PRE_LOCK | INST_PRE_REPNZ | INST_PRE_REP) +#define INST_PRE_SEGOVRD_MASK32 (INST_PRE_CS | INST_PRE_SS | INST_PRE_DS | INST_PRE_ES) +#define INST_PRE_SEGOVRD_MASK64 (INST_PRE_FS | INST_PRE_GS) +#define INST_PRE_SEGOVRD_MASK (INST_PRE_SEGOVRD_MASK32 | INST_PRE_SEGOVRD_MASK64) + +/* Extended flags for VEX: */ +/* Indicates that the instruction might have VEX.L encoded. */ +#define INST_VEX_L (1) +/* Indicates that the instruction might have VEX.W encoded. */ +#define INST_VEX_W (1 << 1) +/* Indicates that the mnemonic of the instruction is based on the VEX.W bit. */ +#define INST_MNEMONIC_VEXW_BASED (1 << 2) +/* Indicates that the mnemonic of the instruction is based on the VEX.L bit. */ +#define INST_MNEMONIC_VEXL_BASED (1 << 3) +/* Forces the instruction to be encoded with VEX.L, otherwise it's undefined. */ +#define INST_FORCE_VEXL (1 << 4) +/* + * Indicates that the instruction is based on the MOD field of the ModRM byte. + * (MOD==11: got the right instruction, else skip +4 in prefixed table for the correct instruction). + */ +#define INST_MODRR_BASED (1 << 5) +/* Indicates that the instruction doesn't use the VVVV field of the VEX prefix, if it does then it's undecodable. */ +#define INST_VEX_V_UNUSED (1 << 6) + +/* Indication that the instruction is privileged (Ring 0), this should be checked on the opcodeId field. */ +#define OPCODE_ID_PRIVILEGED ((uint16_t)0x8000) + +/* + * Indicates which operand is being decoded. + * Destination (1st), Source (2nd), op3 (3rd), op4 (4th). + * Used to set the operands' fields in the _DInst structure! + */ +typedef enum {ONT_NONE = -1, ONT_1 = 0, ONT_2 = 1, ONT_3 = 2, ONT_4 = 3} _OperandNumberType; + +/* CPU Flags that instructions modify, test or undefine, in compacted form (CF,PF,AF,ZF,SF are 1:1 map to EFLAGS). */ +#define D_COMPACT_CF 1 /* Carry */ +#define D_COMPACT_PF 4 /* Parity */ +#define D_COMPACT_AF 0x10 /* Auxiliary */ +#define D_COMPACT_ZF 0x40 /* Zero */ +#define D_COMPACT_SF 0x80 /* Sign */ +/* The following flags have to be translated to EFLAGS. */ +#define D_COMPACT_IF 2 /* Interrupt */ +#define D_COMPACT_DF 8 /* Direction */ +#define D_COMPACT_OF 0x20 /* Overflow */ + +/* The mask of flags that are already compatible with EFLAGS. */ +#define D_COMPACT_SAME_FLAGS (D_COMPACT_CF | D_COMPACT_PF | D_COMPACT_AF | D_COMPACT_ZF | D_COMPACT_SF) + +/* + * In order to save more space for storing the DB statically, + * I came up with another level of shared info. + * Because I saw that most of the information that instructions use repeats itself. + * + * Info about the instruction, source/dest types, meta and flags. + * _InstInfo points to a table of _InstSharedInfo. + */ +typedef struct { + uint8_t flagsIndex; /* An index into FlagsTables */ + uint8_t s, d; /* OpType. */ + uint8_t meta; /* Hi 5 bits = Instruction set class | Lo 3 bits = flow control flags. */ + /* + * The following are CPU flag masks that the instruction changes. + * The flags are compacted so 8 bits representation is enough. + * They will be expanded in runtime to be compatible to EFLAGS. + */ + uint8_t modifiedFlagsMask; + uint8_t testedFlagsMask; + uint8_t undefinedFlagsMask; +} _InstSharedInfo; + +/* + * This structure is used for the instructions DB and NOT for the disassembled result code! + * This is the BASE structure, there are extensions to this structure below. + */ +typedef struct { + uint16_t sharedIndex; /* An index into the SharedInfoTable. */ + uint16_t opcodeId; /* The opcodeId is really a byte-offset into the mnemonics table. MSB is a privileged indication. */ +} _InstInfo; + +/* + * There are merely few instructions which need a second mnemonic for 32 bits. + * Or a third for 64 bits. Therefore sometimes the second mnemonic is empty but not the third. + * In all decoding modes the first mnemonic is the default. + * A flag will indicate it uses another mnemonic. + * + * There are a couple of (SSE4) instructions in the whole DB which need both op3 and 3rd mnemonic for 64bits, + * therefore, I decided to make the extended structure contain all extra info in the same structure. + * There are a few instructions (SHLD/SHRD/IMUL and SSE too) which use third operand (or a fourth). + * A flag will indicate it uses a third/fourth operand. + */ +typedef struct { + /* Base structure (doesn't get accessed directly from code). */ + _InstInfo BASE; + + /* Extended starts here. */ + uint8_t flagsEx; /* 8 bits are enough, in the future we might make it a bigger integer. */ + uint8_t op3, op4; /* OpType. */ + uint16_t opcodeId2, opcodeId3; +} _InstInfoEx; + +/* Trie data structure node type: */ +typedef enum { + INT_NOTEXISTS = 0, /* Not exists. */ + INT_INFO = 1, /* It's an instruction info. */ + INT_INFOEX, + INT_LIST_GROUP, + INT_LIST_FULL, + INT_LIST_DIVIDED, + INT_LIST_PREFIXED +} _InstNodeType; + +/* Used to check instType < INT_INFOS, means we got an inst-info. Cause it has to be only one of them. */ +#define INT_INFOS (INT_LIST_GROUP) + +/* Instruction node is treated as { int index:13; int type:3; } */ +typedef uint16_t _InstNode; + +_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps); +_InstInfo* inst_lookup_3dnow(_CodeInfo* ci); + +#endif /* INSTRUCTIONS_H */ diff --git a/NativeCore/Dependencies/distorm/src/insts.c b/NativeCore/Dependencies/distorm/src/insts.c new file mode 100644 index 00000000..a081a2d4 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/insts.c @@ -0,0 +1,7939 @@ +/* +insts.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "config.h" +#include "insts.h" +#include "instructions.h" + + +/* +* GENERATED BY disOps at Sun Jul 09 21:22:14 2017 +*/ + +_InstInfo II_MOVSXD = /*II*/{ 0x1d3, 10027 }; +_InstInfo II_NOP = /*II*/{ 0x53, 581 }; +_InstInfo II_PAUSE = /*II*/{ 0x88, 10035 }; +_InstInfo II_WAIT = /*II*/{ 0x53, 10042 }; +_InstInfo II_RDRAND = /*II*/{ 0x1d4, 10048 }; +_InstInfo II_3DNOW = /*II*/{ 0x1d5, 10056 }; + +_iflags FlagsTable[101] = { + 0x80000011, + 0x80000000, + 0x800400, + 0x80800400, + 0x800080, + 0x800100, + 0x80800100, + 0x800200, + 0x80800200, + 0x800000, + 0x1, + 0x0, + 0x80800000, + 0x1000000, + 0x81000000, + 0x808000, + 0x800001, + 0x80020001, + 0x1002000, + 0x60, + 0x64, + 0x80000001, + 0x4010000, + 0x1008000, + 0x80000060, + 0x83000064, + 0x3000064, + 0x83000000, + 0x3008000, + 0x200, + 0xc000, + 0x4014000, + 0x8, + 0x81000009, + 0x9, + 0x80000009, + 0x1000808, + 0x81000808, + 0x80020009, + 0x1001008, + 0x81001008, + 0x80000019, + 0x3000009, + 0x83000009, + 0x83000008, + 0xc0000011, + 0x40000001, + 0xc0800011, + 0x40800001, + 0xc0000019, + 0xc1000001, + 0xc0000001, + 0xc0000003, + 0x41000000, + 0x40000000, + 0x40000008, + 0x40000009, + 0x41000001, + 0x43000001, + 0x40000003, + 0x48000000, + 0x200009, + 0x20000009, + 0x60020009, + 0x60000009, + 0x80090009, + 0x200b0009, + 0x20020009, + 0x80100009, + 0x21100009, + 0x87000009, + 0x20009, + 0x20000008, + 0x1000009, + 0x10020009, + 0x160009, + 0x100009, + 0x47000009, + 0x47090009, + 0x40090009, + 0x80002009, + 0xc0000009, + 0x2001, + 0x80002001, + 0x410009, + 0x20420009, + 0x20060009, + 0x120009, + 0x21020009, + 0xc7000019, + 0x20100009, + 0xc0002009, + 0x40002008, + 0xc0000000, + 0xc0002008, + 0x4020009, + 0x40100009, + 0x60120009, + 0x41000009, + 0x83000001, + 0x200001 +}; + +_InstNode Table_0F = 256; +_InstNode Table_0F_0F = 1440; +_InstNode Table_0F_38 = 1896; +_InstNode Table_0F_3A = 2152; + +_InstInfo InstInfos[1246] = { + /*II_00*/{ 0x0, 11 }, + /*II_01*/{ 0x1, 11 }, + /*II_02*/{ 0x2, 11 }, + /*II_03*/{ 0x3, 11 }, + /*II_04*/{ 0x4, 11 }, + /*II_05*/{ 0x5, 11 }, + /*II_06*/{ 0x6, 16 }, + /*II_07*/{ 0x7, 22 }, + /*II_08*/{ 0x8, 27 }, + /*II_09*/{ 0x9, 27 }, + /*II_0A*/{ 0xa, 27 }, + /*II_0B*/{ 0xb, 27 }, + /*II_0C*/{ 0xc, 27 }, + /*II_0D*/{ 0xd, 27 }, + /*II_0E*/{ 0xe, 16 }, + /*II_10*/{ 0xf, 31 }, + /*II_11*/{ 0x10, 31 }, + /*II_12*/{ 0x11, 31 }, + /*II_13*/{ 0x12, 31 }, + /*II_14*/{ 0x13, 31 }, + /*II_15*/{ 0x14, 31 }, + /*II_16*/{ 0x15, 16 }, + /*II_17*/{ 0x16, 22 }, + /*II_18*/{ 0xf, 36 }, + /*II_19*/{ 0x10, 36 }, + /*II_1A*/{ 0x11, 36 }, + /*II_1B*/{ 0x12, 36 }, + /*II_1C*/{ 0x13, 36 }, + /*II_1D*/{ 0x14, 36 }, + /*II_1E*/{ 0x17, 16 }, + /*II_1F*/{ 0x18, 22 }, + /*II_20*/{ 0x19, 41 }, + /*II_21*/{ 0x1a, 41 }, + /*II_22*/{ 0x1b, 41 }, + /*II_23*/{ 0x1c, 41 }, + /*II_24*/{ 0x1d, 41 }, + /*II_25*/{ 0x1e, 41 }, + /*II_27*/{ 0x1f, 46 }, + /*II_28*/{ 0x0, 51 }, + /*II_29*/{ 0x1, 51 }, + /*II_2A*/{ 0x2, 51 }, + /*II_2B*/{ 0x3, 51 }, + /*II_2C*/{ 0x4, 51 }, + /*II_2D*/{ 0x5, 51 }, + /*II_2F*/{ 0x1f, 56 }, + /*II_30*/{ 0x20, 61 }, + /*II_31*/{ 0x21, 61 }, + /*II_32*/{ 0x22, 61 }, + /*II_33*/{ 0x23, 61 }, + /*II_34*/{ 0x24, 61 }, + /*II_35*/{ 0x25, 61 }, + /*II_37*/{ 0x26, 66 }, + /*II_38*/{ 0x27, 71 }, + /*II_39*/{ 0x28, 71 }, + /*II_3A*/{ 0x29, 71 }, + /*II_3B*/{ 0x2a, 71 }, + /*II_3C*/{ 0x2b, 71 }, + /*II_3D*/{ 0x2c, 71 }, + /*II_3F*/{ 0x26, 76 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_40*/{ 0x2d, 81 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_48*/{ 0x2d, 86 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_50*/{ 0x2e, 16 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_58*/{ 0x2f, 22 }, + /*II_60*/{ 0x30, 91 }, + /*II_61*/{ 0x30, 98 }, + /*II_62*/{ 0x31, 104 }, + /*II_63*/{ 0x32, 111 }, + /*II_68*/{ 0x33, 16 }, + /*II_6A*/{ 0x35, 16 }, + /*II_6C*/{ 0x36, 32891 }, + /*II_6D*/{ 0x37, 32891 }, + /*II_6E*/{ 0x38, 32896 }, + /*II_6F*/{ 0x39, 32896 }, + /*II_70*/{ 0x3a, 134 }, + /*II_71*/{ 0x3a, 138 }, + /*II_72*/{ 0x3b, 143 }, + /*II_73*/{ 0x3b, 147 }, + /*II_74*/{ 0x3c, 152 }, + /*II_75*/{ 0x3c, 156 }, + /*II_76*/{ 0x3d, 161 }, + /*II_77*/{ 0x3d, 166 }, + /*II_78*/{ 0x3e, 170 }, + /*II_79*/{ 0x3e, 174 }, + /*II_7A*/{ 0x3f, 179 }, + /*II_7B*/{ 0x3f, 183 }, + /*II_7C*/{ 0x40, 188 }, + /*II_7D*/{ 0x40, 192 }, + /*II_7E*/{ 0x41, 197 }, + /*II_7F*/{ 0x41, 202 }, + /*II_84*/{ 0x42, 206 }, + /*II_85*/{ 0x43, 206 }, + /*II_86*/{ 0x44, 212 }, + /*II_87*/{ 0x45, 212 }, + /*II_88*/{ 0x46, 218 }, + /*II_89*/{ 0x47, 218 }, + /*II_8A*/{ 0x48, 218 }, + /*II_8B*/{ 0x49, 218 }, + /*II_8C*/{ 0x4a, 218 }, + /*II_8D*/{ 0x4b, 223 }, + /*II_8E*/{ 0x4c, 218 }, + /*II_90*/{ 0x4d, 212 }, + /*II_91*/{ 0x4d, 212 }, + /*II_92*/{ 0x4d, 212 }, + /*II_93*/{ 0x4d, 212 }, + /*II_94*/{ 0x4d, 212 }, + /*II_95*/{ 0x4d, 212 }, + /*II_96*/{ 0x4d, 212 }, + /*II_97*/{ 0x4d, 212 }, + /*II_9A*/{ 0x4f, 260 }, + /*II_9C*/{ 0x50, 270 }, + /*II_9D*/{ 0x51, 277 }, + /*II_9E*/{ 0x52, 283 }, + /*II_9F*/{ 0x53, 289 }, + /*II_A0*/{ 0x54, 218 }, + /*II_A1*/{ 0x55, 218 }, + /*II_A2*/{ 0x56, 218 }, + /*II_A3*/{ 0x57, 218 }, + /*II_A4*/{ 0x58, 295 }, + /*II_A5*/{ 0x59, 295 }, + /*II_A6*/{ 0x5a, 301 }, + /*II_A7*/{ 0x5b, 301 }, + /*II_A8*/{ 0x5c, 206 }, + /*II_A9*/{ 0x5d, 206 }, + /*II_AA*/{ 0x5e, 307 }, + /*II_AB*/{ 0x5f, 307 }, + /*II_AC*/{ 0x60, 313 }, + /*II_AD*/{ 0x61, 313 }, + /*II_AE*/{ 0x62, 319 }, + /*II_AF*/{ 0x63, 319 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B0*/{ 0x64, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_B8*/{ 0x65, 218 }, + /*II_C2*/{ 0x66, 325 }, + /*II_C3*/{ 0x67, 325 }, + /*II_C4*/{ 0x68, 330 }, + /*II_C5*/{ 0x68, 335 }, + /*II_C8*/{ 0x69, 340 }, + /*II_C9*/{ 0x6a, 347 }, + /*II_CA*/{ 0x6b, 354 }, + /*II_CB*/{ 0x6c, 354 }, + /*II_CC*/{ 0x6d, 360 }, + /*II_CD*/{ 0x6e, 367 }, + /*II_CE*/{ 0x6f, 372 }, + /*II_CF*/{ 0x70, 33146 }, + /*II_D4*/{ 0x71, 384 }, + /*II_D5*/{ 0x71, 389 }, + /*II_D6*/{ 0x72, 394 }, + /*II_D7*/{ 0x73, 400 }, + /*II_E0*/{ 0x74, 406 }, + /*II_E1*/{ 0x74, 414 }, + /*II_E2*/{ 0x75, 421 }, + /*II_E4*/{ 0x77, 33215 }, + /*II_E5*/{ 0x78, 33215 }, + /*II_E6*/{ 0x79, 33219 }, + /*II_E7*/{ 0x7a, 33219 }, + /*II_E8*/{ 0x7b, 456 }, + /*II_E9*/{ 0x7c, 462 }, + /*II_EA*/{ 0x7d, 467 }, + /*II_EB*/{ 0x7e, 462 }, + /*II_EC*/{ 0x7f, 33215 }, + /*II_ED*/{ 0x80, 33215 }, + /*II_EE*/{ 0x81, 33219 }, + /*II_EF*/{ 0x82, 33219 }, + /*II_F1*/{ 0x6d, 476 }, + /*II_F4*/{ 0x53, 33250 }, + /*II_F5*/{ 0x83, 487 }, + /*II_F8*/{ 0x83, 492 }, + /*II_F9*/{ 0x83, 497 }, + /*II_FA*/{ 0x84, 33270 }, + /*II_FB*/{ 0x84, 33275 }, + /*II_FC*/{ 0x85, 512 }, + /*II_FD*/{ 0x85, 517 }, + /*II_0F_02*/{ 0x86, 522 }, + /*II_0F_03*/{ 0x86, 527 }, + /*II_0F_05*/{ 0x87, 532 }, + /*II_0F_06*/{ 0x88, 33309 }, + /*II_0F_07*/{ 0x87, 547 }, + /*II_0F_08*/{ 0x88, 33323 }, + /*II_0F_09*/{ 0x88, 33329 }, + /*II_0F_0B*/{ 0x89, 569 }, + /*II_0F_0E*/{ 0x8a, 574 }, + /*II_0F_1F*/{ 0x8b, 581 }, + /*II_0F_20*/{ 0x8c, 32986 }, + /*II_0F_21*/{ 0x8d, 32986 }, + /*II_0F_22*/{ 0x8e, 32986 }, + /*II_0F_23*/{ 0x8f, 32986 }, + /*II_0F_30*/{ 0x88, 33354 }, + /*II_0F_31*/{ 0x88, 33361 }, + /*II_0F_32*/{ 0x88, 33368 }, + /*II_0F_33*/{ 0x88, 33375 }, + /*II_0F_34*/{ 0x87, 614 }, + /*II_0F_35*/{ 0x87, 624 }, + /*II_0F_37*/{ 0x90, 633 }, + /*II_0F_40*/{ 0x91, 641 }, + /*II_0F_41*/{ 0x91, 648 }, + /*II_0F_42*/{ 0x92, 656 }, + /*II_0F_43*/{ 0x92, 663 }, + /*II_0F_44*/{ 0x93, 671 }, + /*II_0F_45*/{ 0x93, 678 }, + /*II_0F_46*/{ 0x94, 686 }, + /*II_0F_47*/{ 0x94, 694 }, + /*II_0F_48*/{ 0x95, 701 }, + /*II_0F_49*/{ 0x95, 708 }, + /*II_0F_4A*/{ 0x96, 716 }, + /*II_0F_4B*/{ 0x96, 723 }, + /*II_0F_4C*/{ 0x97, 731 }, + /*II_0F_4D*/{ 0x97, 738 }, + /*II_0F_4E*/{ 0x98, 746 }, + /*II_0F_4F*/{ 0x98, 754 }, + /*II_0F_80*/{ 0x99, 134 }, + /*II_0F_81*/{ 0x99, 138 }, + /*II_0F_82*/{ 0x9a, 143 }, + /*II_0F_83*/{ 0x9a, 147 }, + /*II_0F_84*/{ 0x9b, 152 }, + /*II_0F_85*/{ 0x9b, 156 }, + /*II_0F_86*/{ 0x9c, 161 }, + /*II_0F_87*/{ 0x9c, 166 }, + /*II_0F_88*/{ 0x9d, 170 }, + /*II_0F_89*/{ 0x9d, 174 }, + /*II_0F_8A*/{ 0x9e, 179 }, + /*II_0F_8B*/{ 0x9e, 183 }, + /*II_0F_8C*/{ 0x9f, 188 }, + /*II_0F_8D*/{ 0x9f, 192 }, + /*II_0F_8E*/{ 0xa0, 197 }, + /*II_0F_8F*/{ 0xa0, 202 }, + /*II_0F_90*/{ 0xa1, 761 }, + /*II_0F_91*/{ 0xa1, 767 }, + /*II_0F_92*/{ 0xa2, 774 }, + /*II_0F_93*/{ 0xa2, 780 }, + /*II_0F_94*/{ 0xa3, 787 }, + /*II_0F_95*/{ 0xa3, 793 }, + /*II_0F_96*/{ 0xa4, 800 }, + /*II_0F_97*/{ 0xa4, 807 }, + /*II_0F_98*/{ 0xa5, 813 }, + /*II_0F_99*/{ 0xa5, 819 }, + /*II_0F_9A*/{ 0xa6, 826 }, + /*II_0F_9B*/{ 0xa6, 832 }, + /*II_0F_9C*/{ 0xa7, 839 }, + /*II_0F_9D*/{ 0xa7, 845 }, + /*II_0F_9E*/{ 0xa8, 852 }, + /*II_0F_9F*/{ 0xa8, 859 }, + /*II_0F_A0*/{ 0xa9, 16 }, + /*II_0F_A1*/{ 0xaa, 22 }, + /*II_0F_A2*/{ 0x88, 865 }, + /*II_0F_A3*/{ 0xab, 872 }, + /*II_0F_A8*/{ 0xad, 16 }, + /*II_0F_A9*/{ 0xae, 22 }, + /*II_0F_AA*/{ 0xaf, 882 }, + /*II_0F_AB*/{ 0xb0, 887 }, + /*II_0F_AF*/{ 0xb1, 117 }, + /*II_0F_B0*/{ 0xb2, 898 }, + /*II_0F_B1*/{ 0xb3, 898 }, + /*II_0F_B2*/{ 0xb4, 907 }, + /*II_0F_B3*/{ 0xb0, 912 }, + /*II_0F_B4*/{ 0xb4, 917 }, + /*II_0F_B5*/{ 0xb4, 922 }, + /*II_0F_B6*/{ 0xb5, 927 }, + /*II_0F_B7*/{ 0xb6, 927 }, + /*II_0F_B9*/{ 0x89, 569 }, + /*II_0F_BB*/{ 0xb0, 934 }, + /*II_0F_BE*/{ 0xb5, 939 }, + /*II_0F_BF*/{ 0xb6, 939 }, + /*II_0F_C0*/{ 0xb2, 946 }, + /*II_0F_C1*/{ 0xb3, 946 }, + /*II_0F_C3*/{ 0xb7, 952 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_0F_C8*/{ 0xb8, 960 }, + /*II_80_00*/{ 0xb9, 11 }, + /*II_80_01*/{ 0xba, 27 }, + /*II_80_02*/{ 0xbb, 31 }, + /*II_80_03*/{ 0xbb, 36 }, + /*II_80_04*/{ 0xbc, 41 }, + /*II_80_05*/{ 0xb9, 51 }, + /*II_80_06*/{ 0xbd, 61 }, + /*II_80_07*/{ 0xbe, 71 }, + /*II_81_00*/{ 0xbf, 11 }, + /*II_81_01*/{ 0xc0, 27 }, + /*II_81_02*/{ 0xc1, 31 }, + /*II_81_03*/{ 0xc1, 36 }, + /*II_81_04*/{ 0xc2, 41 }, + /*II_81_05*/{ 0xbf, 51 }, + /*II_81_06*/{ 0xc3, 61 }, + /*II_81_07*/{ 0xc4, 71 }, + /*II_82_00*/{ 0xc5, 11 }, + /*II_82_01*/{ 0xc6, 27 }, + /*II_82_02*/{ 0xc7, 31 }, + /*II_82_03*/{ 0xc7, 36 }, + /*II_82_04*/{ 0xc8, 41 }, + /*II_82_05*/{ 0xc5, 51 }, + /*II_82_06*/{ 0xc9, 61 }, + /*II_82_07*/{ 0xca, 71 }, + /*II_83_00*/{ 0xcb, 11 }, + /*II_83_01*/{ 0xcc, 27 }, + /*II_83_02*/{ 0xcd, 31 }, + /*II_83_03*/{ 0xcd, 36 }, + /*II_83_04*/{ 0xce, 41 }, + /*II_83_05*/{ 0xcb, 51 }, + /*II_83_06*/{ 0xcf, 61 }, + /*II_83_07*/{ 0xd0, 71 }, + /*II_8F_00*/{ 0xd1, 22 }, + /*II_C0_00*/{ 0xd2, 967 }, + /*II_C0_01*/{ 0xd2, 972 }, + /*II_C0_02*/{ 0xd3, 977 }, + /*II_C0_03*/{ 0xd3, 982 }, + /*II_C0_04*/{ 0xd4, 987 }, + /*II_C0_05*/{ 0xd4, 992 }, + /*II_C0_06*/{ 0xd4, 997 }, + /*II_C0_07*/{ 0xd4, 1002 }, + /*II_C1_00*/{ 0xd5, 967 }, + /*II_C1_01*/{ 0xd5, 972 }, + /*II_C1_02*/{ 0xd6, 977 }, + /*II_C1_03*/{ 0xd6, 982 }, + /*II_C1_04*/{ 0xd7, 987 }, + /*II_C1_05*/{ 0xd7, 992 }, + /*II_C1_06*/{ 0xd7, 997 }, + /*II_C1_07*/{ 0xd7, 1002 }, + /*II_C6_00*/{ 0xd8, 218 }, + /*II_C6_F8*/{ 0xd9, 1007 }, + /*II_C7_00*/{ 0xda, 218 }, + /*II_C7_F8*/{ 0xdb, 1015 }, + /*II_D0_00*/{ 0xdc, 967 }, + /*II_D0_01*/{ 0xdc, 972 }, + /*II_D0_02*/{ 0xdd, 977 }, + /*II_D0_03*/{ 0xdd, 982 }, + /*II_D0_04*/{ 0xde, 987 }, + /*II_D0_05*/{ 0xde, 992 }, + /*II_D0_06*/{ 0xde, 997 }, + /*II_D0_07*/{ 0xde, 1002 }, + /*II_D1_00*/{ 0xdf, 967 }, + /*II_D1_01*/{ 0xdf, 972 }, + /*II_D1_02*/{ 0xe0, 977 }, + /*II_D1_03*/{ 0xe0, 982 }, + /*II_D1_04*/{ 0xe1, 987 }, + /*II_D1_05*/{ 0xe1, 992 }, + /*II_D1_06*/{ 0xe1, 997 }, + /*II_D1_07*/{ 0xe1, 1002 }, + /*II_D2_00*/{ 0xe2, 967 }, + /*II_D2_01*/{ 0xe2, 972 }, + /*II_D2_02*/{ 0xe3, 977 }, + /*II_D2_03*/{ 0xe3, 982 }, + /*II_D2_04*/{ 0xe4, 987 }, + /*II_D2_05*/{ 0xe4, 992 }, + /*II_D2_06*/{ 0xe4, 997 }, + /*II_D2_07*/{ 0xe4, 1002 }, + /*II_D3_00*/{ 0xe5, 967 }, + /*II_D3_01*/{ 0xe5, 972 }, + /*II_D3_02*/{ 0xe6, 977 }, + /*II_D3_03*/{ 0xe6, 982 }, + /*II_D3_04*/{ 0xe7, 987 }, + /*II_D3_05*/{ 0xe7, 992 }, + /*II_D3_06*/{ 0xe7, 997 }, + /*II_D3_07*/{ 0xe7, 1002 }, + /*II_D8_00*/{ 0xe8, 1023 }, + /*II_D8_01*/{ 0xe8, 1029 }, + /*II_D8_02*/{ 0xe8, 1035 }, + /*II_D8_03*/{ 0xe8, 1041 }, + /*II_D8_04*/{ 0xe8, 1048 }, + /*II_D8_05*/{ 0xe8, 1054 }, + /*II_D8_06*/{ 0xe8, 1061 }, + /*II_D8_07*/{ 0xe8, 1067 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C0*/{ 0xe9, 1023 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_C8*/{ 0xe9, 1029 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D0*/{ 0xea, 1035 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D9*/{ 0xeb, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_D8*/{ 0xea, 1041 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E0*/{ 0xe9, 1048 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_E8*/{ 0xe9, 1054 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F0*/{ 0xe9, 1061 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D8_F8*/{ 0xe9, 1067 }, + /*II_D9_00*/{ 0xe8, 1074 }, + /*II_D9_02*/{ 0xec, 1079 }, + /*II_D9_03*/{ 0xec, 1084 }, + /*II_D9_04*/{ 0xed, 1090 }, + /*II_D9_05*/{ 0xee, 1098 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C0*/{ 0xea, 1074 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C9*/{ 0xeb, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_C8*/{ 0xea, 1105 }, + /*II_D9_D0*/{ 0xeb, 1111 }, + /*II_D9_E0*/{ 0xeb, 1117 }, + /*II_D9_E1*/{ 0xeb, 1123 }, + /*II_D9_E4*/{ 0xeb, 1129 }, + /*II_D9_E5*/{ 0xeb, 1135 }, + /*II_D9_E8*/{ 0xeb, 1141 }, + /*II_D9_E9*/{ 0xeb, 1147 }, + /*II_D9_EA*/{ 0xeb, 1155 }, + /*II_D9_EB*/{ 0xeb, 1163 }, + /*II_D9_EC*/{ 0xeb, 1170 }, + /*II_D9_ED*/{ 0xeb, 1178 }, + /*II_D9_EE*/{ 0xeb, 1186 }, + /*II_D9_F0*/{ 0xeb, 1192 }, + /*II_D9_F1*/{ 0xeb, 1199 }, + /*II_D9_F2*/{ 0xeb, 1206 }, + /*II_D9_F3*/{ 0xeb, 1213 }, + /*II_D9_F4*/{ 0xeb, 1221 }, + /*II_D9_F5*/{ 0xeb, 1230 }, + /*II_D9_F6*/{ 0xeb, 1238 }, + /*II_D9_F7*/{ 0xeb, 1247 }, + /*II_D9_F8*/{ 0xeb, 1256 }, + /*II_D9_F9*/{ 0xeb, 1263 }, + /*II_D9_FA*/{ 0xeb, 1272 }, + /*II_D9_FB*/{ 0xeb, 1279 }, + /*II_D9_FC*/{ 0xeb, 1288 }, + /*II_D9_FD*/{ 0xeb, 1297 }, + /*II_D9_FE*/{ 0xeb, 1305 }, + /*II_D9_FF*/{ 0xeb, 1311 }, + /*II_DA_00*/{ 0xe8, 1317 }, + /*II_DA_01*/{ 0xe8, 1324 }, + /*II_DA_02*/{ 0xe8, 1331 }, + /*II_DA_03*/{ 0xe8, 1338 }, + /*II_DA_04*/{ 0xe8, 1346 }, + /*II_DA_05*/{ 0xe8, 1353 }, + /*II_DA_06*/{ 0xe8, 1361 }, + /*II_DA_07*/{ 0xe8, 1368 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C0*/{ 0xef, 1376 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_C8*/{ 0xf0, 1384 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D0*/{ 0xf1, 1392 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_D8*/{ 0xf2, 1401 }, + /*II_DA_E9*/{ 0xeb, 1409 }, + /*II_DB_00*/{ 0xe8, 1418 }, + /*II_DB_01*/{ 0xf3, 1424 }, + /*II_DB_02*/{ 0xec, 1432 }, + /*II_DB_03*/{ 0xec, 1438 }, + /*II_DB_05*/{ 0xf4, 1074 }, + /*II_DB_07*/{ 0xf5, 1084 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C0*/{ 0xef, 1445 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_C8*/{ 0xf0, 1454 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D0*/{ 0xf1, 1463 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_D8*/{ 0xf2, 1473 }, + /*II_DB_E0*/{ 0xeb, 1482 }, + /*II_DB_E1*/{ 0xeb, 1488 }, + /*II_DB_E4*/{ 0xeb, 1496 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_E8*/{ 0xf6, 1504 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DB_F0*/{ 0xf7, 1512 }, + /*II_DC_00*/{ 0xf8, 1023 }, + /*II_DC_01*/{ 0xf8, 1029 }, + /*II_DC_02*/{ 0xf8, 1035 }, + /*II_DC_03*/{ 0xf8, 1041 }, + /*II_DC_04*/{ 0xf8, 1048 }, + /*II_DC_05*/{ 0xf8, 1054 }, + /*II_DC_06*/{ 0xf8, 1061 }, + /*II_DC_07*/{ 0xf8, 1067 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C0*/{ 0xf9, 1023 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_C8*/{ 0xf9, 1029 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E0*/{ 0xf9, 1054 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_E8*/{ 0xf9, 1048 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F0*/{ 0xf9, 1067 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DC_F8*/{ 0xf9, 1061 }, + /*II_DD_00*/{ 0xf8, 1074 }, + /*II_DD_01*/{ 0xfa, 1424 }, + /*II_DD_02*/{ 0xfb, 1079 }, + /*II_DD_03*/{ 0xfb, 1084 }, + /*II_DD_04*/{ 0xed, 1519 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_C0*/{ 0xea, 1527 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D0*/{ 0xea, 1079 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_D8*/{ 0xea, 1084 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E1*/{ 0xeb, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E0*/{ 0xf9, 1534 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E9*/{ 0xeb, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DD_E8*/{ 0xea, 1541 }, + /*II_DE_00*/{ 0xee, 1317 }, + /*II_DE_01*/{ 0xee, 1324 }, + /*II_DE_02*/{ 0xee, 1331 }, + /*II_DE_03*/{ 0xee, 1338 }, + /*II_DE_04*/{ 0xee, 1346 }, + /*II_DE_05*/{ 0xee, 1353 }, + /*II_DE_06*/{ 0xee, 1361 }, + /*II_DE_07*/{ 0xee, 1368 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C1*/{ 0xeb, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C0*/{ 0xf9, 1549 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C9*/{ 0xeb, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_C8*/{ 0xf9, 1556 }, + /*II_DE_D9*/{ 0xeb, 1563 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E1*/{ 0xeb, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E0*/{ 0xf9, 1571 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E9*/{ 0xeb, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_E8*/{ 0xf9, 1579 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F1*/{ 0xeb, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F0*/{ 0xf9, 1586 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F9*/{ 0xeb, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DE_F8*/{ 0xf9, 1594 }, + /*II_DF_00*/{ 0xee, 1418 }, + /*II_DF_01*/{ 0xfc, 1424 }, + /*II_DF_02*/{ 0xfd, 1432 }, + /*II_DF_03*/{ 0xfd, 1438 }, + /*II_DF_04*/{ 0xf4, 1601 }, + /*II_DF_05*/{ 0xf8, 1418 }, + /*II_DF_06*/{ 0xf5, 1607 }, + /*II_DF_07*/{ 0xfb, 1438 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_E8*/{ 0xf6, 1614 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_DF_F0*/{ 0xf6, 1623 }, + /*II_F6_00*/{ 0xfe, 206 }, + /*II_F6_02*/{ 0xff, 1631 }, + /*II_F6_03*/{ 0x100, 1636 }, + /*II_F6_04*/{ 0x101, 1641 }, + /*II_F6_05*/{ 0x101, 117 }, + /*II_F6_06*/{ 0x102, 1646 }, + /*II_F6_07*/{ 0x102, 1651 }, + /*II_F7_00*/{ 0x103, 206 }, + /*II_F7_02*/{ 0x104, 1631 }, + /*II_F7_03*/{ 0x105, 1636 }, + /*II_F7_04*/{ 0x106, 1641 }, + /*II_F7_05*/{ 0x106, 117 }, + /*II_F7_06*/{ 0x107, 1646 }, + /*II_F7_07*/{ 0x107, 1651 }, + /*II_FE_00*/{ 0x108, 81 }, + /*II_FE_01*/{ 0x108, 86 }, + /*II_FF_00*/{ 0x109, 81 }, + /*II_FF_01*/{ 0x109, 86 }, + /*II_FF_02*/{ 0x10a, 456 }, + /*II_FF_03*/{ 0x10b, 260 }, + /*II_FF_04*/{ 0x10c, 462 }, + /*II_FF_05*/{ 0x10d, 467 }, + /*II_FF_06*/{ 0x10e, 16 }, + /*II_0F_00_00*/{ 0x10f, 1657 }, + /*II_0F_00_01*/{ 0x110, 1663 }, + /*II_0F_00_02*/{ 0x110, 34436 }, + /*II_0F_00_03*/{ 0x111, 34442 }, + /*II_0F_00_04*/{ 0x112, 1679 }, + /*II_0F_00_05*/{ 0x112, 1685 }, + /*II_0F_01_00*/{ 0x113, 1691 }, + /*II_0F_01_01*/{ 0x113, 1697 }, + /*II_0F_01_02*/{ 0x113, 34471 }, + /*II_0F_01_03*/{ 0x113, 34477 }, + /*II_0F_01_04*/{ 0x114, 1715 }, + /*II_0F_01_06*/{ 0x115, 34489 }, + /*II_0F_01_07*/{ 0x116, 34495 }, + /*II_0F_01_C1*/{ 0x117, 1735 }, + /*II_0F_01_C2*/{ 0x117, 1743 }, + /*II_0F_01_C3*/{ 0x117, 1753 }, + /*II_0F_01_C4*/{ 0x117, 1763 }, + /*II_0F_01_C8*/{ 0x118, 1771 }, + /*II_0F_01_C9*/{ 0x118, 1780 }, + /*II_0F_01_D0*/{ 0x88, 1787 }, + /*II_0F_01_D1*/{ 0x88, 1795 }, + /*II_0F_01_D4*/{ 0x117, 1803 }, + /*II_0F_01_D5*/{ 0x119, 1811 }, + /*II_0F_01_D8*/{ 0x11a, 1817 }, + /*II_0F_01_D9*/{ 0x11b, 1824 }, + /*II_0F_01_DA*/{ 0x11c, 1833 }, + /*II_0F_01_DB*/{ 0x11c, 1841 }, + /*II_0F_01_DC*/{ 0x11b, 1849 }, + /*II_0F_01_DD*/{ 0x11b, 1855 }, + /*II_0F_01_DE*/{ 0x11c, 1861 }, + /*II_0F_01_DF*/{ 0x11d, 1869 }, + /*II_0F_01_F8*/{ 0x11e, 1878 }, + /*II_0F_01_F9*/{ 0x11e, 1886 }, + /*II_0F_0D_00*/{ 0x11f, 1894 }, + /*II_0F_0D_01*/{ 0x11f, 1904 }, + /*II_0F_0F_0C*/{ 0x120, 1915 }, + /*II_0F_0F_0D*/{ 0x121, 1922 }, + /*II_0F_0F_1C*/{ 0x120, 1929 }, + /*II_0F_0F_1D*/{ 0x121, 1936 }, + /*II_0F_0F_8A*/{ 0x120, 1943 }, + /*II_0F_0F_8E*/{ 0x120, 1951 }, + /*II_0F_0F_90*/{ 0x121, 1960 }, + /*II_0F_0F_94*/{ 0x121, 1969 }, + /*II_0F_0F_96*/{ 0x121, 1976 }, + /*II_0F_0F_97*/{ 0x121, 1983 }, + /*II_0F_0F_9A*/{ 0x121, 1992 }, + /*II_0F_0F_9E*/{ 0x121, 1999 }, + /*II_0F_0F_A0*/{ 0x121, 2006 }, + /*II_0F_0F_A4*/{ 0x121, 2015 }, + /*II_0F_0F_A6*/{ 0x121, 2022 }, + /*II_0F_0F_A7*/{ 0x121, 2032 }, + /*II_0F_0F_AA*/{ 0x121, 2042 }, + /*II_0F_0F_AE*/{ 0x121, 2050 }, + /*II_0F_0F_B0*/{ 0x121, 2057 }, + /*II_0F_0F_B4*/{ 0x121, 2066 }, + /*II_0F_0F_B6*/{ 0x121, 2073 }, + /*II_0F_0F_B7*/{ 0x121, 2083 }, + /*II_0F_0F_BB*/{ 0x120, 2092 }, + /*II_0F_0F_BF*/{ 0x121, 2100 }, + /*II_0F_10*/{ 0x122, 2109 }, + /*II_66_0F_10*/{ 0x123, 2117 }, + /*II_F3_0F_10*/{ 0x124, 2125 }, + /*II_F2_0F_10*/{ 0x125, 2132 }, + /*II_0F_11*/{ 0x12a, 2109 }, + /*II_66_0F_11*/{ 0x12b, 2117 }, + /*II_F3_0F_11*/{ 0x12c, 2125 }, + /*II_F2_0F_11*/{ 0x12d, 2132 }, + /*II_66_0F_12*/{ 0x132, 2190 }, + /*II_F3_0F_12*/{ 0x133, 2198 }, + /*II_F2_0F_12*/{ 0x133, 2208 }, + /*II_0F_13*/{ 0x137, 2182 }, + /*II_66_0F_13*/{ 0x138, 2190 }, + /*II_0F_14*/{ 0x13a, 2266 }, + /*II_66_0F_14*/{ 0x13b, 2276 }, + /*II_0F_15*/{ 0x13a, 2308 }, + /*II_66_0F_15*/{ 0x13b, 2318 }, + /*II_66_0F_16*/{ 0x132, 2367 }, + /*II_F3_0F_16*/{ 0x13d, 2375 }, + /*II_0F_17*/{ 0x137, 2359 }, + /*II_66_0F_17*/{ 0x138, 2367 }, + /*II_0F_18_00*/{ 0x13e, 2424 }, + /*II_0F_18_01*/{ 0x13e, 2437 }, + /*II_0F_18_02*/{ 0x13e, 2449 }, + /*II_0F_18_03*/{ 0x13e, 2461 }, + /*II_0F_28*/{ 0x122, 2473 }, + /*II_66_0F_28*/{ 0x123, 2481 }, + /*II_0F_29*/{ 0x12a, 2473 }, + /*II_66_0F_29*/{ 0x12b, 2481 }, + /*II_0F_2A*/{ 0x13f, 2507 }, + /*II_66_0F_2A*/{ 0x140, 2517 }, + /*II_F3_0F_2A*/{ 0x141, 2527 }, + /*II_F2_0F_2A*/{ 0x142, 2537 }, + /*II_0F_2B*/{ 0x143, 2569 }, + /*II_66_0F_2B*/{ 0x144, 2578 }, + /*II_F3_0F_2B*/{ 0x145, 2587 }, + /*II_F2_0F_2B*/{ 0x146, 2596 }, + /*II_0F_2C*/{ 0x148, 2625 }, + /*II_66_0F_2C*/{ 0x149, 2636 }, + /*II_F3_0F_2C*/{ 0x14a, 2647 }, + /*II_F2_0F_2C*/{ 0x14b, 2658 }, + /*II_0F_2D*/{ 0x148, 2693 }, + /*II_66_0F_2D*/{ 0x13b, 2703 }, + /*II_F3_0F_2D*/{ 0x14a, 2713 }, + /*II_F2_0F_2D*/{ 0x14b, 2723 }, + /*II_0F_2E*/{ 0x14d, 2755 }, + /*II_66_0F_2E*/{ 0x14e, 2764 }, + /*II_0F_2F*/{ 0x14d, 2793 }, + /*II_66_0F_2F*/{ 0x14e, 2801 }, + /*II_0F_50*/{ 0x151, 2827 }, + /*II_66_0F_50*/{ 0x152, 2837 }, + /*II_0F_51*/{ 0x13a, 2869 }, + /*II_66_0F_51*/{ 0x13b, 2877 }, + /*II_F3_0F_51*/{ 0x154, 2885 }, + /*II_F2_0F_51*/{ 0x14e, 2893 }, + /*II_0F_52*/{ 0x13a, 2937 }, + /*II_F3_0F_52*/{ 0x154, 2946 }, + /*II_0F_53*/{ 0x13a, 2975 }, + /*II_F3_0F_53*/{ 0x154, 2982 }, + /*II_0F_54*/{ 0x13a, 3005 }, + /*II_66_0F_54*/{ 0x13b, 3012 }, + /*II_0F_55*/{ 0x13a, 3035 }, + /*II_66_0F_55*/{ 0x13b, 3043 }, + /*II_0F_56*/{ 0x13a, 3069 }, + /*II_66_0F_56*/{ 0x13b, 3075 }, + /*II_0F_57*/{ 0x13a, 3095 }, + /*II_66_0F_57*/{ 0x13b, 3102 }, + /*II_0F_58*/{ 0x13a, 3125 }, + /*II_66_0F_58*/{ 0x13b, 3132 }, + /*II_F3_0F_58*/{ 0x154, 3139 }, + /*II_F2_0F_58*/{ 0x14e, 3146 }, + /*II_0F_59*/{ 0x13a, 3185 }, + /*II_66_0F_59*/{ 0x13b, 3192 }, + /*II_F3_0F_59*/{ 0x154, 3199 }, + /*II_F2_0F_59*/{ 0x14e, 3206 }, + /*II_0F_5A*/{ 0x14e, 3245 }, + /*II_66_0F_5A*/{ 0x13b, 3255 }, + /*II_F3_0F_5A*/{ 0x155, 3265 }, + /*II_F2_0F_5A*/{ 0x14e, 3275 }, + /*II_0F_5B*/{ 0x13b, 3329 }, + /*II_66_0F_5B*/{ 0x13b, 3339 }, + /*II_F3_0F_5B*/{ 0x13b, 3349 }, + /*II_0F_5C*/{ 0x13a, 3394 }, + /*II_66_0F_5C*/{ 0x13b, 3401 }, + /*II_F3_0F_5C*/{ 0x154, 3408 }, + /*II_F2_0F_5C*/{ 0x14e, 3415 }, + /*II_0F_5D*/{ 0x13a, 3454 }, + /*II_66_0F_5D*/{ 0x13b, 3461 }, + /*II_F3_0F_5D*/{ 0x154, 3468 }, + /*II_F2_0F_5D*/{ 0x14e, 3475 }, + /*II_0F_5E*/{ 0x13a, 3514 }, + /*II_66_0F_5E*/{ 0x13b, 3521 }, + /*II_F3_0F_5E*/{ 0x154, 3528 }, + /*II_F2_0F_5E*/{ 0x14e, 3535 }, + /*II_0F_5F*/{ 0x13a, 3574 }, + /*II_66_0F_5F*/{ 0x13b, 3581 }, + /*II_F3_0F_5F*/{ 0x154, 3588 }, + /*II_F2_0F_5F*/{ 0x14e, 3595 }, + /*II_0F_60*/{ 0x158, 3634 }, + /*II_66_0F_60*/{ 0x13b, 3634 }, + /*II_0F_61*/{ 0x158, 3657 }, + /*II_66_0F_61*/{ 0x13b, 3657 }, + /*II_0F_62*/{ 0x158, 3680 }, + /*II_66_0F_62*/{ 0x13b, 3680 }, + /*II_0F_63*/{ 0x159, 3703 }, + /*II_66_0F_63*/{ 0x13b, 3703 }, + /*II_0F_64*/{ 0x159, 3724 }, + /*II_66_0F_64*/{ 0x13b, 3724 }, + /*II_0F_65*/{ 0x159, 3743 }, + /*II_66_0F_65*/{ 0x13b, 3743 }, + /*II_0F_66*/{ 0x159, 3762 }, + /*II_66_0F_66*/{ 0x13b, 3762 }, + /*II_0F_67*/{ 0x159, 3781 }, + /*II_66_0F_67*/{ 0x13b, 3781 }, + /*II_0F_68*/{ 0x159, 3802 }, + /*II_66_0F_68*/{ 0x13b, 3802 }, + /*II_0F_69*/{ 0x159, 3825 }, + /*II_66_0F_69*/{ 0x13b, 3825 }, + /*II_0F_6A*/{ 0x159, 3848 }, + /*II_66_0F_6A*/{ 0x13b, 3848 }, + /*II_0F_6B*/{ 0x159, 3871 }, + /*II_66_0F_6B*/{ 0x13b, 3871 }, + /*II_66_0F_6C*/{ 0x13b, 3892 }, + /*II_66_0F_6D*/{ 0x13b, 3917 }, + /*II_0F_6F*/{ 0x15d, 3948 }, + /*II_66_0F_6F*/{ 0x123, 3968 }, + /*II_F3_0F_6F*/{ 0x123, 3976 }, + /*II_0F_74*/{ 0x159, 4065 }, + /*II_66_0F_74*/{ 0x13b, 4065 }, + /*II_0F_75*/{ 0x159, 4084 }, + /*II_66_0F_75*/{ 0x13b, 4084 }, + /*II_0F_76*/{ 0x159, 4103 }, + /*II_66_0F_76*/{ 0x13b, 4103 }, + /*II_0F_77*/{ 0x161, 4122 }, + /*II_0F_78*/{ 0x163, 4150 }, + /*II_0F_79*/{ 0x166, 4174 }, + /*II_66_0F_79*/{ 0x167, 4158 }, + /*II_F2_0F_79*/{ 0x168, 4165 }, + /*II_0F_7A_30*/{ 0x169, 4183 }, + /*II_0F_7A_31*/{ 0x16a, 4193 }, + /*II_66_0F_7C*/{ 0x16b, 4203 }, + /*II_F2_0F_7C*/{ 0x16b, 4211 }, + /*II_66_0F_7D*/{ 0x16b, 4237 }, + /*II_F2_0F_7D*/{ 0x16b, 4245 }, + /*II_F3_0F_7E*/{ 0x125, 3948 }, + /*II_0F_7F*/{ 0x16f, 3948 }, + /*II_66_0F_7F*/{ 0x12b, 3968 }, + /*II_F3_0F_7F*/{ 0x12b, 3976 }, + /*II_F3_0F_B8*/{ 0x173, 4360 }, + /*II_0F_BA_04*/{ 0x174, 872 }, + /*II_0F_BA_05*/{ 0x175, 887 }, + /*II_0F_BA_06*/{ 0x175, 912 }, + /*II_0F_BA_07*/{ 0x175, 934 }, + /*II_0F_BC*/{ 0x176, 4368 }, + /*II_F3_0F_BC*/{ 0x177, 4373 }, + /*II_0F_BD*/{ 0x176, 4380 }, + /*II_F3_0F_BD*/{ 0x178, 4385 }, + /*II_0F_C7_07*/{ 0x188, 6407 }, + /*II_66_0F_D0*/{ 0x16b, 6416 }, + /*II_F2_0F_D0*/{ 0x16b, 6426 }, + /*II_0F_D1*/{ 0x159, 6458 }, + /*II_66_0F_D1*/{ 0x13b, 6458 }, + /*II_0F_D2*/{ 0x159, 6473 }, + /*II_66_0F_D2*/{ 0x13b, 6473 }, + /*II_0F_D3*/{ 0x159, 6488 }, + /*II_66_0F_D3*/{ 0x13b, 6488 }, + /*II_0F_D4*/{ 0x14e, 6503 }, + /*II_66_0F_D4*/{ 0x13b, 6503 }, + /*II_0F_D5*/{ 0x159, 6518 }, + /*II_66_0F_D5*/{ 0x13b, 6518 }, + /*II_66_0F_D6*/{ 0x12d, 3948 }, + /*II_F3_0F_D6*/{ 0x189, 6535 }, + /*II_F2_0F_D6*/{ 0x18a, 6544 }, + /*II_0F_D7*/{ 0x18c, 6553 }, + /*II_66_0F_D7*/{ 0x18d, 6553 }, + /*II_0F_D8*/{ 0x159, 6574 }, + /*II_66_0F_D8*/{ 0x13b, 6574 }, + /*II_0F_D9*/{ 0x159, 6593 }, + /*II_66_0F_D9*/{ 0x13b, 6593 }, + /*II_0F_DA*/{ 0x18f, 6612 }, + /*II_66_0F_DA*/{ 0x13b, 6612 }, + /*II_0F_DB*/{ 0x159, 6629 }, + /*II_66_0F_DB*/{ 0x13b, 6629 }, + /*II_0F_DC*/{ 0x159, 6642 }, + /*II_66_0F_DC*/{ 0x13b, 6642 }, + /*II_0F_DD*/{ 0x159, 6661 }, + /*II_66_0F_DD*/{ 0x13b, 6661 }, + /*II_0F_DE*/{ 0x18f, 6670 }, + /*II_66_0F_DE*/{ 0x13b, 6670 }, + /*II_0F_DF*/{ 0x159, 6687 }, + /*II_66_0F_DF*/{ 0x13b, 6687 }, + /*II_0F_E0*/{ 0x18f, 6702 }, + /*II_66_0F_E0*/{ 0x13b, 6702 }, + /*II_0F_E1*/{ 0x159, 6717 }, + /*II_66_0F_E1*/{ 0x13b, 6717 }, + /*II_0F_E2*/{ 0x159, 6732 }, + /*II_66_0F_E2*/{ 0x13b, 6732 }, + /*II_0F_E3*/{ 0x18f, 6747 }, + /*II_66_0F_E3*/{ 0x13b, 6747 }, + /*II_0F_E4*/{ 0x18f, 6762 }, + /*II_66_0F_E4*/{ 0x13b, 6762 }, + /*II_0F_E5*/{ 0x159, 6781 }, + /*II_66_0F_E5*/{ 0x13b, 6781 }, + /*II_66_0F_E6*/{ 0x13b, 6798 }, + /*II_F3_0F_E6*/{ 0x14e, 6809 }, + /*II_F2_0F_E6*/{ 0x13b, 6819 }, + /*II_0F_E7*/{ 0x190, 6863 }, + /*II_66_0F_E7*/{ 0x144, 6871 }, + /*II_0F_E8*/{ 0x159, 6890 }, + /*II_66_0F_E8*/{ 0x13b, 6890 }, + /*II_0F_E9*/{ 0x159, 6907 }, + /*II_66_0F_E9*/{ 0x13b, 6907 }, + /*II_0F_EA*/{ 0x18f, 6924 }, + /*II_66_0F_EA*/{ 0x13b, 6924 }, + /*II_0F_EB*/{ 0x159, 6941 }, + /*II_66_0F_EB*/{ 0x13b, 6941 }, + /*II_0F_EC*/{ 0x159, 6952 }, + /*II_66_0F_EC*/{ 0x13b, 6952 }, + /*II_0F_ED*/{ 0x159, 6969 }, + /*II_66_0F_ED*/{ 0x13b, 6969 }, + /*II_0F_EE*/{ 0x18f, 6986 }, + /*II_66_0F_EE*/{ 0x13b, 6986 }, + /*II_0F_EF*/{ 0x159, 7003 }, + /*II_66_0F_EF*/{ 0x13b, 7003 }, + /*II_F2_0F_F0*/{ 0x191, 7016 }, + /*II_0F_F1*/{ 0x159, 7031 }, + /*II_66_0F_F1*/{ 0x13b, 7031 }, + /*II_0F_F2*/{ 0x159, 7046 }, + /*II_66_0F_F2*/{ 0x13b, 7046 }, + /*II_0F_F3*/{ 0x159, 7061 }, + /*II_66_0F_F3*/{ 0x13b, 7061 }, + /*II_0F_F4*/{ 0x193, 7076 }, + /*II_66_0F_F4*/{ 0x13b, 7076 }, + /*II_0F_F5*/{ 0x159, 7095 }, + /*II_66_0F_F5*/{ 0x13b, 7095 }, + /*II_0F_F6*/{ 0x18f, 7114 }, + /*II_66_0F_F6*/{ 0x13b, 7114 }, + /*II_0F_F7*/{ 0x194, 7131 }, + /*II_66_0F_F7*/{ 0x195, 7141 }, + /*II_0F_F8*/{ 0x159, 7166 }, + /*II_66_0F_F8*/{ 0x13b, 7166 }, + /*II_0F_F9*/{ 0x159, 7181 }, + /*II_66_0F_F9*/{ 0x13b, 7181 }, + /*II_0F_FA*/{ 0x159, 7196 }, + /*II_66_0F_FA*/{ 0x13b, 7196 }, + /*II_0F_FB*/{ 0x193, 7211 }, + /*II_66_0F_FB*/{ 0x13b, 7211 }, + /*II_0F_FC*/{ 0x159, 7226 }, + /*II_66_0F_FC*/{ 0x13b, 7226 }, + /*II_0F_FD*/{ 0x159, 7241 }, + /*II_66_0F_FD*/{ 0x13b, 7241 }, + /*II_0F_FE*/{ 0x159, 7256 }, + /*II_66_0F_FE*/{ 0x13b, 7256 }, + /*II_D9_06*/{ 0x197, 7271 }, + /*II_9B_D9_06*/{ 0x198, 7280 }, + /*II_D9_07*/{ 0xfd, 7288 }, + /*II_9B_D9_07*/{ 0x199, 7296 }, + /*II_DB_E2*/{ 0xeb, 7303 }, + /*II_9B_DB_E2*/{ 0x19a, 7311 }, + /*II_DB_E3*/{ 0xeb, 7318 }, + /*II_9B_DB_E3*/{ 0x19a, 7326 }, + /*II_DD_06*/{ 0x197, 7333 }, + /*II_9B_DD_06*/{ 0x198, 7341 }, + /*II_DD_07*/{ 0xfd, 7348 }, + /*II_9B_DD_07*/{ 0x199, 7356 }, + /*II_DF_E0*/{ 0x19b, 7348 }, + /*II_9B_DF_E0*/{ 0x19c, 7356 }, + /*II_0F_38_00*/{ 0x19d, 7363 }, + /*II_66_0F_38_00*/{ 0x19e, 7363 }, + /*II_0F_38_01*/{ 0x19d, 7380 }, + /*II_66_0F_38_01*/{ 0x19e, 7380 }, + /*II_0F_38_02*/{ 0x19d, 7397 }, + /*II_66_0F_38_02*/{ 0x19e, 7397 }, + /*II_0F_38_03*/{ 0x19d, 7414 }, + /*II_66_0F_38_03*/{ 0x19e, 7414 }, + /*II_0F_38_04*/{ 0x19d, 7433 }, + /*II_66_0F_38_04*/{ 0x19e, 7433 }, + /*II_0F_38_05*/{ 0x19d, 7456 }, + /*II_66_0F_38_05*/{ 0x19e, 7456 }, + /*II_0F_38_06*/{ 0x19d, 7473 }, + /*II_66_0F_38_06*/{ 0x19e, 7473 }, + /*II_0F_38_07*/{ 0x19d, 7490 }, + /*II_66_0F_38_07*/{ 0x19e, 7490 }, + /*II_0F_38_08*/{ 0x19d, 7509 }, + /*II_66_0F_38_08*/{ 0x19e, 7509 }, + /*II_0F_38_09*/{ 0x19d, 7526 }, + /*II_66_0F_38_09*/{ 0x19e, 7526 }, + /*II_0F_38_0A*/{ 0x19d, 7543 }, + /*II_66_0F_38_0A*/{ 0x19e, 7543 }, + /*II_0F_38_0B*/{ 0x19d, 7560 }, + /*II_66_0F_38_0B*/{ 0x19e, 7560 }, + /*II_66_0F_38_17*/{ 0x1a0, 7651 }, + /*II_0F_38_1C*/{ 0x19d, 7710 }, + /*II_66_0F_38_1C*/{ 0x19e, 7710 }, + /*II_0F_38_1D*/{ 0x19d, 7725 }, + /*II_66_0F_38_1D*/{ 0x19e, 7725 }, + /*II_0F_38_1E*/{ 0x19d, 7740 }, + /*II_66_0F_38_1E*/{ 0x19e, 7740 }, + /*II_66_0F_38_20*/{ 0x1a5, 7755 }, + /*II_66_0F_38_21*/{ 0x1a6, 7776 }, + /*II_66_0F_38_22*/{ 0x1a7, 7797 }, + /*II_66_0F_38_23*/{ 0x1a5, 7818 }, + /*II_66_0F_38_24*/{ 0x1a6, 7839 }, + /*II_66_0F_38_25*/{ 0x1a5, 7860 }, + /*II_66_0F_38_28*/{ 0x1a9, 7881 }, + /*II_66_0F_38_29*/{ 0x1a9, 7898 }, + /*II_66_0F_38_2A*/{ 0x1aa, 7917 }, + /*II_66_0F_38_2B*/{ 0x1a9, 7938 }, + /*II_66_0F_38_30*/{ 0x1a5, 7983 }, + /*II_66_0F_38_31*/{ 0x1a6, 8004 }, + /*II_66_0F_38_32*/{ 0x1a7, 8025 }, + /*II_66_0F_38_33*/{ 0x1a5, 8046 }, + /*II_66_0F_38_34*/{ 0x1a6, 8067 }, + /*II_66_0F_38_35*/{ 0x1a5, 8088 }, + /*II_66_0F_38_37*/{ 0x1a0, 8109 }, + /*II_66_0F_38_38*/{ 0x1a9, 8128 }, + /*II_66_0F_38_39*/{ 0x1a9, 8145 }, + /*II_66_0F_38_3A*/{ 0x1a9, 8162 }, + /*II_66_0F_38_3B*/{ 0x1a9, 8179 }, + /*II_66_0F_38_3C*/{ 0x1a9, 8196 }, + /*II_66_0F_38_3D*/{ 0x1a9, 8213 }, + /*II_66_0F_38_3E*/{ 0x1a9, 8230 }, + /*II_66_0F_38_3F*/{ 0x1a9, 8247 }, + /*II_66_0F_38_40*/{ 0x1a9, 8264 }, + /*II_66_0F_38_41*/{ 0x1a9, 8281 }, + /*II_66_0F_38_80*/{ 0x1ad, 8306 }, + /*II_66_0F_38_81*/{ 0x1ad, 8314 }, + /*II_66_0F_38_82*/{ 0x1ad, 8323 }, + /*II_66_0F_38_DB*/{ 0x1b0, 9172 }, + /*II_66_0F_38_DC*/{ 0x1b0, 9189 }, + /*II_66_0F_38_DD*/{ 0x1b0, 9206 }, + /*II_66_0F_38_DE*/{ 0x1b0, 9231 }, + /*II_66_0F_38_DF*/{ 0x1b0, 9248 }, + /*II_0F_38_F0*/{ 0x1b3, 9273 }, + /*II_F2_0F_38_F0*/{ 0x1b4, 9280 }, + /*II_0F_38_F1*/{ 0x1b5, 9273 }, + /*II_F2_0F_38_F1*/{ 0x1b6, 9280 }, + /*II_0F_71_02*/{ 0x1cd, 6458 }, + /*II_66_0F_71_02*/{ 0x1ce, 6458 }, + /*II_0F_71_04*/{ 0x1cd, 6717 }, + /*II_66_0F_71_04*/{ 0x1ce, 6717 }, + /*II_0F_71_06*/{ 0x1cd, 7031 }, + /*II_66_0F_71_06*/{ 0x1ce, 7031 }, + /*II_0F_72_02*/{ 0x1cd, 6473 }, + /*II_66_0F_72_02*/{ 0x1ce, 6473 }, + /*II_0F_72_04*/{ 0x1cd, 6732 }, + /*II_66_0F_72_04*/{ 0x1ce, 6732 }, + /*II_0F_72_06*/{ 0x1cd, 7046 }, + /*II_66_0F_72_06*/{ 0x1ce, 7046 }, + /*II_0F_73_02*/{ 0x1cd, 6488 }, + /*II_66_0F_73_02*/{ 0x1ce, 6488 }, + /*II_66_0F_73_03*/{ 0x1ce, 9852 }, + /*II_0F_73_06*/{ 0x1cd, 7061 }, + /*II_66_0F_73_06*/{ 0x1ce, 7061 }, + /*II_66_0F_73_07*/{ 0x1ce, 9869 }, + /*II_F3_0F_AE_00*/{ 0x1d0, 9904 }, + /*II_F3_0F_AE_01*/{ 0x1d0, 9934 }, + /*II_0F_AE_02*/{ 0x116, 9944 }, + /*II_F3_0F_AE_02*/{ 0x1d0, 9953 }, + /*II_0F_AE_03*/{ 0x116, 9973 }, + /*II_F3_0F_AE_03*/{ 0x1d0, 9982 }, + /*II_0F_C7_06*/{ 0x1d2, 10002 }, + /*II_66_0F_C7_06*/{ 0x188, 10011 }, + /*II_F3_0F_C7_06*/{ 0x188, 10020 } +}; + +_InstInfoEx InstInfosEx[381] = { + /*II_69*/{ { 0x34, 117 }, 0x0, 3, 0, 0, 0 }, + /*II_6B*/{ { 0x34, 117 }, 0x0, 5, 0, 0, 0 }, + /*II_98*/{ { 0x4e, 228 }, 0x0, 0, 0, 233, 239 }, + /*II_99*/{ { 0x4e, 245 }, 0x0, 0, 0, 250, 255 }, + /*II_E3*/{ { 0x76, 427 }, 0x0, 0, 0, 433, 440 }, + /*II_0F_A4*/{ { 0xac, 876 }, 0x0, 1, 0, 0, 0 }, + /*II_0F_A5*/{ { 0xac, 876 }, 0x0, 52, 0, 0, 0 }, + /*II_0F_AC*/{ { 0xac, 892 }, 0x0, 1, 0, 0, 0 }, + /*II_0F_AD*/{ { 0xac, 892 }, 0x0, 52, 0, 0, 0 }, + /*II_V_0F_10*/{ { 0x126, 2139 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_10*/{ { 0x126, 2148 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_10*/{ { 0x127, 2157 }, 0x20, 69, 0, 0, 0 }, + /*II_V_F2_0F_10*/{ { 0x127, 2165 }, 0x20, 69, 0, 0, 0 }, + /*II_VRR_F3_0F_10*/{ { 0x128, 2157 }, 0x60, 0, 0, 0, 0 }, + /*II_VRR_F2_0F_10*/{ { 0x129, 2165 }, 0x60, 0, 0, 0, 0 }, + /*II_V_0F_11*/{ { 0x12e, 2139 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_11*/{ { 0x12e, 2148 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_11*/{ { 0x127, 2157 }, 0x20, 69, 0, 0, 0 }, + /*II_V_F2_0F_11*/{ { 0x127, 2165 }, 0x20, 69, 0, 0, 0 }, + /*II_VRR_F3_0F_11*/{ { 0x12f, 2157 }, 0x60, 0, 0, 0, 0 }, + /*II_VRR_F2_0F_11*/{ { 0x130, 2165 }, 0x60, 0, 0, 0, 0 }, + /*II_0F_12*/{ { 0x131, 2173 }, 0x0, 0, 0, 2182, 0 }, + /*II_V_0F_12*/{ { 0x134, 2217 }, 0x0, 72, 0, 2227, 0 }, + /*II_V_66_0F_12*/{ { 0x135, 2236 }, 0x0, 46, 0, 0, 0 }, + /*II_V_F3_0F_12*/{ { 0x126, 2245 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F2_0F_12*/{ { 0x136, 2256 }, 0x41, 0, 0, 0, 0 }, + /*II_V_0F_13*/{ { 0x139, 2227 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_13*/{ { 0x139, 2236 }, 0x40, 0, 0, 0, 0 }, + /*II_V_0F_14*/{ { 0x13c, 2286 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_14*/{ { 0x13c, 2297 }, 0x1, 90, 0, 0, 0 }, + /*II_V_0F_15*/{ { 0x13c, 2328 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_15*/{ { 0x13c, 2339 }, 0x1, 90, 0, 0, 0 }, + /*II_0F_16*/{ { 0x131, 2350 }, 0x0, 0, 0, 2359, 0 }, + /*II_V_0F_16*/{ { 0x134, 2385 }, 0x0, 72, 0, 2395, 0 }, + /*II_V_66_0F_16*/{ { 0x135, 2404 }, 0x0, 46, 0, 0, 0 }, + /*II_V_F3_0F_16*/{ { 0x126, 2413 }, 0x41, 0, 0, 0, 0 }, + /*II_V_0F_17*/{ { 0x139, 2395 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_17*/{ { 0x139, 2404 }, 0x40, 0, 0, 0, 0 }, + /*II_V_0F_28*/{ { 0x126, 2489 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_28*/{ { 0x126, 2498 }, 0x41, 0, 0, 0, 0 }, + /*II_V_0F_29*/{ { 0x12e, 2489 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_29*/{ { 0x12e, 2498 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_2A*/{ { 0x135, 2547 }, 0x2, 79, 0, 0, 0 }, + /*II_V_F2_0F_2A*/{ { 0x135, 2558 }, 0x2, 79, 0, 0, 0 }, + /*II_V_0F_2B*/{ { 0x147, 2605 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_2B*/{ { 0x147, 2615 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_2C*/{ { 0x14c, 2669 }, 0x42, 0, 0, 0, 0 }, + /*II_V_F2_0F_2C*/{ { 0x14c, 2681 }, 0x42, 0, 0, 0, 0 }, + /*II_V_F3_0F_2D*/{ { 0x14c, 2733 }, 0x42, 0, 0, 0, 0 }, + /*II_V_F2_0F_2D*/{ { 0x14c, 2744 }, 0x42, 0, 0, 0, 0 }, + /*II_V_0F_2E*/{ { 0x14f, 2773 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_2E*/{ { 0x150, 2783 }, 0x40, 0, 0, 0, 0 }, + /*II_V_0F_2F*/{ { 0x14f, 2809 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_2F*/{ { 0x150, 2818 }, 0x40, 0, 0, 0, 0 }, + /*II_V_0F_50*/{ { 0x153, 2847 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_50*/{ { 0x153, 2858 }, 0x41, 0, 0, 0, 0 }, + /*II_V_0F_51*/{ { 0x126, 2901 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_51*/{ { 0x126, 2910 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_51*/{ { 0x135, 2919 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_51*/{ { 0x135, 2928 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_52*/{ { 0x126, 2955 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_52*/{ { 0x135, 2965 }, 0x0, 71, 0, 0, 0 }, + /*II_V_0F_53*/{ { 0x126, 2989 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_53*/{ { 0x135, 2997 }, 0x0, 71, 0, 0, 0 }, + /*II_V_0F_54*/{ { 0x13c, 3019 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_54*/{ { 0x13c, 3027 }, 0x1, 90, 0, 0, 0 }, + /*II_V_0F_55*/{ { 0x13c, 3051 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_55*/{ { 0x13c, 3060 }, 0x1, 90, 0, 0, 0 }, + /*II_V_0F_56*/{ { 0x13c, 3081 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_56*/{ { 0x13c, 3088 }, 0x1, 90, 0, 0, 0 }, + /*II_V_0F_57*/{ { 0x13c, 3109 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_57*/{ { 0x13c, 3117 }, 0x1, 90, 0, 0, 0 }, + /*II_V_0F_58*/{ { 0x13c, 3153 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_58*/{ { 0x13c, 3161 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_58*/{ { 0x135, 3169 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_58*/{ { 0x135, 3177 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_59*/{ { 0x13c, 3213 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_59*/{ { 0x13c, 3221 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_59*/{ { 0x135, 3229 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_59*/{ { 0x135, 3237 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_5A*/{ { 0x156, 3285 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_5A*/{ { 0x157, 3296 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_5A*/{ { 0x135, 3307 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_5A*/{ { 0x135, 3318 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_5B*/{ { 0x126, 3360 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_5B*/{ { 0x126, 3371 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_5B*/{ { 0x126, 3382 }, 0x41, 0, 0, 0, 0 }, + /*II_V_0F_5C*/{ { 0x13c, 3422 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_5C*/{ { 0x13c, 3430 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_5C*/{ { 0x135, 3438 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_5C*/{ { 0x135, 3446 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_5D*/{ { 0x13c, 3482 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_5D*/{ { 0x13c, 3490 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_5D*/{ { 0x135, 3498 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_5D*/{ { 0x135, 3506 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_5E*/{ { 0x13c, 3542 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_5E*/{ { 0x13c, 3550 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_5E*/{ { 0x135, 3558 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_5E*/{ { 0x135, 3566 }, 0x0, 72, 0, 0, 0 }, + /*II_V_0F_5F*/{ { 0x13c, 3602 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_5F*/{ { 0x13c, 3610 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F3_0F_5F*/{ { 0x135, 3618 }, 0x0, 71, 0, 0, 0 }, + /*II_V_F2_0F_5F*/{ { 0x135, 3626 }, 0x0, 72, 0, 0, 0 }, + /*II_V_66_0F_60*/{ { 0x135, 3645 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_61*/{ { 0x135, 3668 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_62*/{ { 0x135, 3691 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_63*/{ { 0x135, 3713 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_64*/{ { 0x135, 3733 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_65*/{ { 0x135, 3752 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_66*/{ { 0x135, 3771 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_67*/{ { 0x135, 3791 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_68*/{ { 0x135, 3813 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_69*/{ { 0x135, 3836 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_6A*/{ { 0x135, 3859 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_6B*/{ { 0x135, 3881 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_6C*/{ { 0x135, 3904 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_6D*/{ { 0x135, 3929 }, 0x0, 73, 0, 0, 0 }, + /*II_0F_6E*/{ { 0x15a, 3942 }, 0x0, 0, 0, 0, 3948 }, + /*II_66_0F_6E*/{ { 0x15b, 3942 }, 0x0, 0, 0, 0, 3948 }, + /*II_V_66_0F_6E*/{ { 0x15c, 3954 }, 0x46, 0, 0, 3961, 0 }, + /*II_V_66_0F_6F*/{ { 0x126, 3984 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_6F*/{ { 0x126, 3993 }, 0x41, 0, 0, 0, 0 }, + /*II_0F_70*/{ { 0x15e, 4002 }, 0x0, 1, 0, 0, 0 }, + /*II_66_0F_70*/{ { 0x15f, 4010 }, 0x0, 1, 0, 0, 0 }, + /*II_F3_0F_70*/{ { 0x15f, 4018 }, 0x0, 1, 0, 0, 0 }, + /*II_F2_0F_70*/{ { 0x15f, 4027 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_70*/{ { 0x160, 4036 }, 0x40, 1, 0, 0, 0 }, + /*II_V_F3_0F_70*/{ { 0x160, 4045 }, 0x40, 1, 0, 0, 0 }, + /*II_V_F2_0F_70*/{ { 0x160, 4055 }, 0x40, 1, 0, 0, 0 }, + /*II_V_66_0F_74*/{ { 0x135, 4074 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_75*/{ { 0x135, 4093 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_76*/{ { 0x135, 4112 }, 0x0, 73, 0, 0, 0 }, + /*II_V_0F_77*/{ { 0x162, 4128 }, 0x49, 0, 0, 4140, 0 }, + /*II_66_0F_78*/{ { 0x164, 4158 }, 0x0, 8, 0, 0, 0 }, + /*II_F2_0F_78*/{ { 0x165, 4165 }, 0x0, 7, 8, 0, 0 }, + /*II_V_66_0F_7C*/{ { 0x13c, 4219 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F2_0F_7C*/{ { 0x13c, 4228 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_7D*/{ { 0x13c, 4253 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F2_0F_7D*/{ { 0x13c, 4262 }, 0x1, 90, 0, 0, 0 }, + /*II_0F_7E*/{ { 0x16c, 3942 }, 0x0, 0, 0, 0, 3948 }, + /*II_66_0F_7E*/{ { 0x16d, 3942 }, 0x0, 0, 0, 0, 3948 }, + /*II_V_66_0F_7E*/{ { 0x16e, 3954 }, 0x46, 0, 0, 3961, 0 }, + /*II_V_F3_0F_7E*/{ { 0x150, 3961 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_7F*/{ { 0x12e, 3984 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_7F*/{ { 0x12e, 3993 }, 0x41, 0, 0, 0, 0 }, + /*II_0F_AE_04*/{ { 0x170, 4271 }, 0x0, 0, 0, 0, 4278 }, + /*II_0F_AE_05*/{ { 0x171, 4287 }, 0x0, 0, 0, 4295, 4303 }, + /*II_0F_AE_06*/{ { 0x171, 4313 }, 0x0, 0, 0, 4321, 4331 }, + /*II_0F_AE_07*/{ { 0x172, 4343 }, 0x0, 0, 0, 4351, 0 }, + /*II_0F_C2*/{ { 0x179, 4392 }, 0x0, 0, 0, 4401, 4410 }, + /*II_66_0F_C2*/{ { 0x17a, 4471 }, 0x0, 0, 0, 4480, 4489 }, + /*II_F3_0F_C2*/{ { 0x17b, 4550 }, 0x0, 0, 0, 4559, 4568 }, + /*II_F2_0F_C2*/{ { 0x17c, 4629 }, 0x0, 0, 0, 4638, 4647 }, + /*II_V_0F_C2*/{ { 0x17d, 4708 }, 0x1, 90, 0, 4718, 4728 }, + /*II_V_66_0F_C2*/{ { 0x17d, 5110 }, 0x1, 90, 0, 5120, 5130 }, + /*II_V_F3_0F_C2*/{ { 0x17e, 5512 }, 0x0, 71, 0, 5522, 5532 }, + /*II_V_F2_0F_C2*/{ { 0x17e, 5914 }, 0x0, 72, 0, 5924, 5934 }, + /*II_0F_C4*/{ { 0x17f, 6316 }, 0x0, 1, 0, 0, 0 }, + /*II_66_0F_C4*/{ { 0x180, 6316 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_C4*/{ { 0x181, 6324 }, 0x0, 25, 1, 0, 0 }, + /*II_0F_C5*/{ { 0x182, 6333 }, 0x0, 1, 0, 0, 0 }, + /*II_66_0F_C5*/{ { 0x183, 6333 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_C5*/{ { 0x184, 6341 }, 0x40, 1, 0, 0, 0 }, + /*II_0F_C6*/{ { 0x185, 6350 }, 0x0, 1, 0, 0, 0 }, + /*II_66_0F_C6*/{ { 0x15f, 6358 }, 0x0, 1, 0, 0, 0 }, + /*II_V_0F_C6*/{ { 0x186, 6366 }, 0x1, 90, 1, 0, 0 }, + /*II_V_66_0F_C6*/{ { 0x186, 6375 }, 0x1, 90, 1, 0, 0 }, + /*II_0F_C7_01*/{ { 0x187, 6384 }, 0x0, 0, 0, 0, 6395 }, + /*II_V_66_0F_D0*/{ { 0x13c, 6436 }, 0x1, 90, 0, 0, 0 }, + /*II_V_F2_0F_D0*/{ { 0x13c, 6447 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_D1*/{ { 0x135, 6465 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D2*/{ { 0x135, 6480 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D3*/{ { 0x135, 6495 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D4*/{ { 0x135, 6510 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D5*/{ { 0x135, 6526 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D6*/{ { 0x18b, 3961 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_D7*/{ { 0x18e, 6563 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_D8*/{ { 0x135, 6583 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_D9*/{ { 0x135, 6602 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DA*/{ { 0x135, 6620 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DB*/{ { 0x135, 6635 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DC*/{ { 0x135, 6651 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DD*/{ { 0x135, 6651 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DE*/{ { 0x135, 6678 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_DF*/{ { 0x135, 6694 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E0*/{ { 0x135, 6709 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E1*/{ { 0x135, 6724 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E2*/{ { 0x135, 6739 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E3*/{ { 0x135, 6754 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E4*/{ { 0x135, 6771 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E5*/{ { 0x135, 6789 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E6*/{ { 0x157, 6829 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F3_0F_E6*/{ { 0x156, 6841 }, 0x41, 0, 0, 0, 0 }, + /*II_V_F2_0F_E6*/{ { 0x157, 6852 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_E7*/{ { 0x147, 6880 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_E8*/{ { 0x135, 6898 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_E9*/{ { 0x135, 6915 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_EA*/{ { 0x135, 6932 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_EB*/{ { 0x135, 6946 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_EC*/{ { 0x135, 6960 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_ED*/{ { 0x135, 6977 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_EE*/{ { 0x135, 6994 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_EF*/{ { 0x135, 7009 }, 0x0, 73, 0, 0, 0 }, + /*II_V_F2_0F_F0*/{ { 0x192, 7023 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_F1*/{ { 0x135, 7038 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F2*/{ { 0x135, 7053 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F3*/{ { 0x135, 7068 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F4*/{ { 0x135, 7085 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F5*/{ { 0x135, 7104 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F6*/{ { 0x135, 7122 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F7*/{ { 0x196, 7153 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_F8*/{ { 0x135, 7173 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_F9*/{ { 0x135, 7188 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_FA*/{ { 0x135, 7203 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_FB*/{ { 0x135, 7218 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_FC*/{ { 0x135, 7233 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_FD*/{ { 0x135, 7248 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_FE*/{ { 0x135, 7263 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_00*/{ { 0x135, 7371 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_01*/{ { 0x135, 7388 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_02*/{ { 0x135, 7405 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_03*/{ { 0x135, 7423 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_04*/{ { 0x135, 7444 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_05*/{ { 0x135, 7464 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_06*/{ { 0x135, 7481 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_07*/{ { 0x135, 7499 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_08*/{ { 0x135, 7517 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_09*/{ { 0x135, 7534 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_0A*/{ { 0x135, 7551 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_0B*/{ { 0x135, 7570 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_0C*/{ { 0x13c, 7581 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_38_0D*/{ { 0x13c, 7592 }, 0x1, 90, 0, 0, 0 }, + /*II_V_66_0F_38_0E*/{ { 0x126, 7603 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_38_0F*/{ { 0x126, 7612 }, 0x41, 0, 0, 0, 0 }, + /*II_66_0F_38_10*/{ { 0x19f, 7621 }, 0x0, 74, 0, 0, 0 }, + /*II_66_0F_38_14*/{ { 0x19f, 7631 }, 0x0, 74, 0, 0, 0 }, + /*II_66_0F_38_15*/{ { 0x19f, 7641 }, 0x0, 74, 0, 0, 0 }, + /*II_V_66_0F_38_17*/{ { 0x126, 7658 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_38_18*/{ { 0x1a1, 7666 }, 0x41, 0, 0, 0, 0 }, + /*II_V_66_0F_38_19*/{ { 0x1a2, 7680 }, 0x50, 0, 0, 0, 0 }, + /*II_V_66_0F_38_1A*/{ { 0x1a3, 7694 }, 0x50, 0, 0, 0, 0 }, + /*II_V_66_0F_38_1C*/{ { 0x1a4, 7717 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_1D*/{ { 0x1a4, 7732 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_1E*/{ { 0x1a4, 7747 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_20*/{ { 0x150, 7765 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_21*/{ { 0x14f, 7786 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_22*/{ { 0x1a8, 7807 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_23*/{ { 0x150, 7828 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_24*/{ { 0x14f, 7849 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_25*/{ { 0x150, 7870 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_28*/{ { 0x135, 7889 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_29*/{ { 0x135, 7907 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_2A*/{ { 0x1ab, 7927 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_2B*/{ { 0x135, 7948 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_2C*/{ { 0x13c, 7959 }, 0x1, 92, 0, 0, 0 }, + /*II_V_66_0F_38_2D*/{ { 0x13c, 7971 }, 0x1, 92, 0, 0, 0 }, + /*II_V_66_0F_38_2E*/{ { 0x1ac, 7959 }, 0x1, 83, 0, 0, 0 }, + /*II_V_66_0F_38_2F*/{ { 0x1ac, 7971 }, 0x1, 83, 0, 0, 0 }, + /*II_V_66_0F_38_30*/{ { 0x150, 7993 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_31*/{ { 0x14f, 8014 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_32*/{ { 0x1a8, 8035 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_33*/{ { 0x150, 8056 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_34*/{ { 0x14f, 8077 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_35*/{ { 0x150, 8098 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_37*/{ { 0x135, 8118 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_38*/{ { 0x135, 8136 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_39*/{ { 0x135, 8153 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3A*/{ { 0x135, 8170 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3B*/{ { 0x135, 8187 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3C*/{ { 0x135, 8204 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3D*/{ { 0x135, 8221 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3E*/{ { 0x135, 8238 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_3F*/{ { 0x135, 8255 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_40*/{ { 0x135, 8272 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_41*/{ { 0x1a4, 8293 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_96*/{ { 0x1ae, 8332 }, 0x7, 90, 0, 8348, 0 }, + /*II_V_66_0F_38_97*/{ { 0x1ae, 8364 }, 0x7, 90, 0, 8380, 0 }, + /*II_V_66_0F_38_98*/{ { 0x1ae, 8396 }, 0x7, 90, 0, 8409, 0 }, + /*II_V_66_0F_38_99*/{ { 0x1af, 8422 }, 0x6, 80, 0, 8435, 0 }, + /*II_V_66_0F_38_9A*/{ { 0x1ae, 8448 }, 0x7, 90, 0, 8461, 0 }, + /*II_V_66_0F_38_9B*/{ { 0x1af, 8474 }, 0x6, 80, 0, 8487, 0 }, + /*II_V_66_0F_38_9C*/{ { 0x1ae, 8500 }, 0x7, 90, 0, 8514, 0 }, + /*II_V_66_0F_38_9D*/{ { 0x1af, 8528 }, 0x6, 80, 0, 8542, 0 }, + /*II_V_66_0F_38_9E*/{ { 0x1ae, 8556 }, 0x7, 90, 0, 8570, 0 }, + /*II_V_66_0F_38_9F*/{ { 0x1af, 8584 }, 0x6, 80, 0, 8598, 0 }, + /*II_V_66_0F_38_A6*/{ { 0x1ae, 8612 }, 0x7, 90, 0, 8628, 0 }, + /*II_V_66_0F_38_A7*/{ { 0x1ae, 8644 }, 0x7, 90, 0, 8660, 0 }, + /*II_V_66_0F_38_A8*/{ { 0x1ae, 8676 }, 0x7, 90, 0, 8689, 0 }, + /*II_V_66_0F_38_A9*/{ { 0x1af, 8702 }, 0x6, 80, 0, 8715, 0 }, + /*II_V_66_0F_38_AA*/{ { 0x1ae, 8728 }, 0x7, 90, 0, 8741, 0 }, + /*II_V_66_0F_38_AB*/{ { 0x1af, 8754 }, 0x6, 80, 0, 8767, 0 }, + /*II_V_66_0F_38_AC*/{ { 0x1ae, 8780 }, 0x7, 90, 0, 8794, 0 }, + /*II_V_66_0F_38_AD*/{ { 0x1af, 8808 }, 0x6, 80, 0, 8822, 0 }, + /*II_V_66_0F_38_AE*/{ { 0x1ae, 8836 }, 0x7, 90, 0, 8850, 0 }, + /*II_V_66_0F_38_AF*/{ { 0x1af, 8864 }, 0x6, 80, 0, 8878, 0 }, + /*II_V_66_0F_38_B6*/{ { 0x1ae, 8892 }, 0x7, 90, 0, 8908, 0 }, + /*II_V_66_0F_38_B7*/{ { 0x1ae, 8924 }, 0x7, 90, 0, 8940, 0 }, + /*II_V_66_0F_38_B8*/{ { 0x1ae, 8956 }, 0x7, 90, 0, 8969, 0 }, + /*II_V_66_0F_38_B9*/{ { 0x1af, 8982 }, 0x6, 80, 0, 8995, 0 }, + /*II_V_66_0F_38_BA*/{ { 0x1ae, 9008 }, 0x7, 90, 0, 9021, 0 }, + /*II_V_66_0F_38_BB*/{ { 0x1af, 9034 }, 0x6, 80, 0, 9047, 0 }, + /*II_V_66_0F_38_BC*/{ { 0x1ae, 9060 }, 0x7, 90, 0, 9074, 0 }, + /*II_V_66_0F_38_BD*/{ { 0x1af, 9088 }, 0x6, 80, 0, 9102, 0 }, + /*II_V_66_0F_38_BE*/{ { 0x1ae, 9116 }, 0x7, 90, 0, 9130, 0 }, + /*II_V_66_0F_38_BF*/{ { 0x1af, 9144 }, 0x6, 80, 0, 9158, 0 }, + /*II_V_66_0F_38_DB*/{ { 0x1b1, 9180 }, 0x40, 0, 0, 0, 0 }, + /*II_V_66_0F_38_DC*/{ { 0x1b2, 9197 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_DD*/{ { 0x1b2, 9218 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_DE*/{ { 0x1b2, 9239 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_38_DF*/{ { 0x1b2, 9260 }, 0x0, 73, 0, 0, 0 }, + /*II_V_66_0F_3A_04*/{ { 0x1b7, 7581 }, 0x41, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_05*/{ { 0x1b7, 7592 }, 0x41, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_06*/{ { 0x1b8, 9287 }, 0x10, 86, 1, 0, 0 }, + /*II_66_0F_3A_08*/{ { 0x19f, 9299 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_08*/{ { 0x1b7, 9308 }, 0x41, 1, 0, 0, 0 }, + /*II_66_0F_3A_09*/{ { 0x19f, 9318 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_09*/{ { 0x1b7, 9327 }, 0x41, 1, 0, 0, 0 }, + /*II_66_0F_3A_0A*/{ { 0x1b9, 9337 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0A*/{ { 0x181, 9346 }, 0x0, 71, 1, 0, 0 }, + /*II_66_0F_3A_0B*/{ { 0x1ba, 9356 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0B*/{ { 0x181, 9365 }, 0x0, 72, 1, 0, 0 }, + /*II_66_0F_3A_0C*/{ { 0x19f, 9375 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0C*/{ { 0x186, 9384 }, 0x1, 90, 1, 0, 0 }, + /*II_66_0F_3A_0D*/{ { 0x19f, 9394 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0D*/{ { 0x186, 9403 }, 0x1, 90, 1, 0, 0 }, + /*II_66_0F_3A_0E*/{ { 0x19f, 9413 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0E*/{ { 0x181, 9422 }, 0x0, 73, 1, 0, 0 }, + /*II_0F_3A_0F*/{ { 0x1bb, 9432 }, 0x0, 1, 0, 0, 0 }, + /*II_66_0F_3A_0F*/{ { 0x1bc, 9432 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_0F*/{ { 0x181, 9441 }, 0x0, 73, 1, 0, 0 }, + /*II_66_0F_3A_14*/{ { 0x1bd, 9451 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_14*/{ { 0x1be, 9459 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_15*/{ { 0x1bf, 6333 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_15*/{ { 0x1c0, 6341 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_16*/{ { 0x1c1, 9468 }, 0x0, 1, 0, 0, 9476 }, + /*II_V_66_0F_3A_16*/{ { 0x1c2, 9484 }, 0x46, 1, 0, 9493, 0 }, + /*II_66_0F_3A_17*/{ { 0x1c3, 9502 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_17*/{ { 0x1c4, 9513 }, 0x40, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_18*/{ { 0x1b8, 9525 }, 0x10, 73, 1, 0, 0 }, + /*II_V_66_0F_3A_19*/{ { 0x1c5, 9538 }, 0x50, 1, 0, 0, 0 }, + /*II_66_0F_3A_20*/{ { 0x1c6, 9552 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_20*/{ { 0x181, 9560 }, 0x0, 76, 1, 0, 0 }, + /*II_66_0F_3A_21*/{ { 0x1b9, 9569 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_21*/{ { 0x181, 9579 }, 0x0, 71, 1, 0, 0 }, + /*II_66_0F_3A_22*/{ { 0x1c7, 9590 }, 0x0, 1, 0, 0, 9598 }, + /*II_V_66_0F_3A_22*/{ { 0x181, 9606 }, 0x6, 79, 1, 9615, 0 }, + /*II_66_0F_3A_40*/{ { 0x19f, 9624 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_40*/{ { 0x186, 9630 }, 0x1, 90, 1, 0, 0 }, + /*II_66_0F_3A_41*/{ { 0x19f, 9637 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_41*/{ { 0x181, 9643 }, 0x0, 73, 1, 0, 0 }, + /*II_66_0F_3A_42*/{ { 0x19f, 9650 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_42*/{ { 0x181, 9659 }, 0x0, 73, 1, 0, 0 }, + /*II_66_0F_3A_44*/{ { 0x1c8, 9669 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_44*/{ { 0x1c9, 9680 }, 0x0, 73, 1, 0, 0 }, + /*II_V_66_0F_3A_4A*/{ { 0x186, 9692 }, 0x1, 90, 84, 0, 0 }, + /*II_V_66_0F_3A_4B*/{ { 0x186, 9703 }, 0x1, 90, 84, 0, 0 }, + /*II_V_66_0F_3A_4C*/{ { 0x181, 9714 }, 0x0, 73, 82, 0, 0 }, + /*II_66_0F_3A_60*/{ { 0x1ca, 9725 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_60*/{ { 0x160, 9736 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_61*/{ { 0x1ca, 9748 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_61*/{ { 0x160, 9759 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_62*/{ { 0x1ca, 9771 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_62*/{ { 0x160, 9782 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_63*/{ { 0x1ca, 9794 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_63*/{ { 0x160, 9805 }, 0x40, 1, 0, 0, 0 }, + /*II_66_0F_3A_DF*/{ { 0x1cb, 9817 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_3A_DF*/{ { 0x1cc, 9834 }, 0x40, 1, 0, 0, 0 }, + /*II_V_66_0F_71_02*/{ { 0x1cf, 6465 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_71_04*/{ { 0x1cf, 6724 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_71_06*/{ { 0x1cf, 7038 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_72_02*/{ { 0x1cf, 6480 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_72_04*/{ { 0x1cf, 6739 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_72_06*/{ { 0x1cf, 7053 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_73_02*/{ { 0x1cf, 6495 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_73_03*/{ { 0x1cf, 9860 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_73_06*/{ { 0x1cf, 7068 }, 0x0, 1, 0, 0, 0 }, + /*II_V_66_0F_73_07*/{ { 0x1cf, 9877 }, 0x0, 1, 0, 0, 0 }, + /*II_0F_AE_00*/{ { 0x170, 9886 }, 0x0, 0, 0, 0, 9894 }, + /*II_0F_AE_01*/{ { 0x170, 9914 }, 0x0, 0, 0, 0, 9923 }, + /*II_V_0F_AE_02*/{ { 0x1d1, 9963 }, 0x40, 0, 0, 0, 0 }, + /*II_V_0F_AE_03*/{ { 0x1d1, 9992 }, 0x40, 0, 0, 0, 0 } +}; + +_InstNode InstructionsTree[5688] = { + /* 0 - _00 */ 0x2000, + /* 1 - _01 */ 0x2001, + /* 2 - _02 */ 0x2002, + /* 3 - _03 */ 0x2003, + /* 4 - _04 */ 0x2004, + /* 5 - _05 */ 0x2005, + /* 6 - _06 */ 0x2006, + /* 7 - _07 */ 0x2007, + /* 8 - _08 */ 0x2008, + /* 9 - _09 */ 0x2009, + /* a - _0A */ 0x200a, + /* b - _0B */ 0x200b, + /* c - _0C */ 0x200c, + /* d - _0D */ 0x200d, + /* e - _0E */ 0x200e, + /* f - _0F */ 0x8100, + /* 10 - _10 */ 0x200f, + /* 11 - _11 */ 0x2010, + /* 12 - _12 */ 0x2011, + /* 13 - _13 */ 0x2012, + /* 14 - _14 */ 0x2013, + /* 15 - _15 */ 0x2014, + /* 16 - _16 */ 0x2015, + /* 17 - _17 */ 0x2016, + /* 18 - _18 */ 0x2017, + /* 19 - _19 */ 0x2018, + /* 1a - _1A */ 0x2019, + /* 1b - _1B */ 0x201a, + /* 1c - _1C */ 0x201b, + /* 1d - _1D */ 0x201c, + /* 1e - _1E */ 0x201d, + /* 1f - _1F */ 0x201e, + /* 20 - _20 */ 0x201f, + /* 21 - _21 */ 0x2020, + /* 22 - _22 */ 0x2021, + /* 23 - _23 */ 0x2022, + /* 24 - _24 */ 0x2023, + /* 25 - _25 */ 0x2024, + /* 26 - */ 0, + /* 27 - _27 */ 0x2025, + /* 28 - _28 */ 0x2026, + /* 29 - _29 */ 0x2027, + /* 2a - _2A */ 0x2028, + /* 2b - _2B */ 0x2029, + /* 2c - _2C */ 0x202a, + /* 2d - _2D */ 0x202b, + /* 2e - */ 0, + /* 2f - _2F */ 0x202c, + /* 30 - _30 */ 0x202d, + /* 31 - _31 */ 0x202e, + /* 32 - _32 */ 0x202f, + /* 33 - _33 */ 0x2030, + /* 34 - _34 */ 0x2031, + /* 35 - _35 */ 0x2032, + /* 36 - */ 0, + /* 37 - _37 */ 0x2033, + /* 38 - _38 */ 0x2034, + /* 39 - _39 */ 0x2035, + /* 3a - _3A */ 0x2036, + /* 3b - _3B */ 0x2037, + /* 3c - _3C */ 0x2038, + /* 3d - _3D */ 0x2039, + /* 3e - */ 0, + /* 3f - _3F */ 0x203a, + /* 40 - _40 */ 0x203b, + /* 41 - _40 */ 0x203c, + /* 42 - _40 */ 0x203d, + /* 43 - _40 */ 0x203e, + /* 44 - _40 */ 0x203f, + /* 45 - _40 */ 0x2040, + /* 46 - _40 */ 0x2041, + /* 47 - _40 */ 0x2042, + /* 48 - _48 */ 0x2043, + /* 49 - _48 */ 0x2044, + /* 4a - _48 */ 0x2045, + /* 4b - _48 */ 0x2046, + /* 4c - _48 */ 0x2047, + /* 4d - _48 */ 0x2048, + /* 4e - _48 */ 0x2049, + /* 4f - _48 */ 0x204a, + /* 50 - _50 */ 0x204b, + /* 51 - _50 */ 0x204c, + /* 52 - _50 */ 0x204d, + /* 53 - _50 */ 0x204e, + /* 54 - _50 */ 0x204f, + /* 55 - _50 */ 0x2050, + /* 56 - _50 */ 0x2051, + /* 57 - _50 */ 0x2052, + /* 58 - _58 */ 0x2053, + /* 59 - _58 */ 0x2054, + /* 5a - _58 */ 0x2055, + /* 5b - _58 */ 0x2056, + /* 5c - _58 */ 0x2057, + /* 5d - _58 */ 0x2058, + /* 5e - _58 */ 0x2059, + /* 5f - _58 */ 0x205a, + /* 60 - _60 */ 0x205b, + /* 61 - _61 */ 0x205c, + /* 62 - _62 */ 0x205d, + /* 63 - _63 */ 0x205e, + /* 64 - */ 0, + /* 65 - */ 0, + /* 66 - */ 0, + /* 67 - */ 0, + /* 68 - _68 */ 0x205f, + /* 69 - _69 */ 0x4000, + /* 6a - _6A */ 0x2060, + /* 6b - _6B */ 0x4001, + /* 6c - _6C */ 0x2061, + /* 6d - _6D */ 0x2062, + /* 6e - _6E */ 0x2063, + /* 6f - _6F */ 0x2064, + /* 70 - _70 */ 0x2065, + /* 71 - _71 */ 0x2066, + /* 72 - _72 */ 0x2067, + /* 73 - _73 */ 0x2068, + /* 74 - _74 */ 0x2069, + /* 75 - _75 */ 0x206a, + /* 76 - _76 */ 0x206b, + /* 77 - _77 */ 0x206c, + /* 78 - _78 */ 0x206d, + /* 79 - _79 */ 0x206e, + /* 7a - _7A */ 0x206f, + /* 7b - _7B */ 0x2070, + /* 7c - _7C */ 0x2071, + /* 7d - _7D */ 0x2072, + /* 7e - _7E */ 0x2073, + /* 7f - _7F */ 0x2074, + /* 80 - _80 */ 0x6200, + /* 81 - _81 */ 0x6208, + /* 82 - _82 */ 0x6210, + /* 83 - _83 */ 0x6218, + /* 84 - _84 */ 0x2075, + /* 85 - _85 */ 0x2076, + /* 86 - _86 */ 0x2077, + /* 87 - _87 */ 0x2078, + /* 88 - _88 */ 0x2079, + /* 89 - _89 */ 0x207a, + /* 8a - _8A */ 0x207b, + /* 8b - _8B */ 0x207c, + /* 8c - _8C */ 0x207d, + /* 8d - _8D */ 0x207e, + /* 8e - _8E */ 0x207f, + /* 8f - _8F */ 0x6220, + /* 90 - _90 */ 0x2080, + /* 91 - _91 */ 0x2081, + /* 92 - _92 */ 0x2082, + /* 93 - _93 */ 0x2083, + /* 94 - _94 */ 0x2084, + /* 95 - _95 */ 0x2085, + /* 96 - _96 */ 0x2086, + /* 97 - _97 */ 0x2087, + /* 98 - _98 */ 0x4002, + /* 99 - _99 */ 0x4003, + /* 9a - _9A */ 0x2088, + /* 9b - */ 0, + /* 9c - _9C */ 0x2089, + /* 9d - _9D */ 0x208a, + /* 9e - _9E */ 0x208b, + /* 9f - _9F */ 0x208c, + /* a0 - _A0 */ 0x208d, + /* a1 - _A1 */ 0x208e, + /* a2 - _A2 */ 0x208f, + /* a3 - _A3 */ 0x2090, + /* a4 - _A4 */ 0x2091, + /* a5 - _A5 */ 0x2092, + /* a6 - _A6 */ 0x2093, + /* a7 - _A7 */ 0x2094, + /* a8 - _A8 */ 0x2095, + /* a9 - _A9 */ 0x2096, + /* aa - _AA */ 0x2097, + /* ab - _AB */ 0x2098, + /* ac - _AC */ 0x2099, + /* ad - _AD */ 0x209a, + /* ae - _AE */ 0x209b, + /* af - _AF */ 0x209c, + /* b0 - _B0 */ 0x209d, + /* b1 - _B0 */ 0x209e, + /* b2 - _B0 */ 0x209f, + /* b3 - _B0 */ 0x20a0, + /* b4 - _B0 */ 0x20a1, + /* b5 - _B0 */ 0x20a2, + /* b6 - _B0 */ 0x20a3, + /* b7 - _B0 */ 0x20a4, + /* b8 - _B8 */ 0x20a5, + /* b9 - _B8 */ 0x20a6, + /* ba - _B8 */ 0x20a7, + /* bb - _B8 */ 0x20a8, + /* bc - _B8 */ 0x20a9, + /* bd - _B8 */ 0x20aa, + /* be - _B8 */ 0x20ab, + /* bf - _B8 */ 0x20ac, + /* c0 - _C0 */ 0x6228, + /* c1 - _C1 */ 0x6230, + /* c2 - _C2 */ 0x20ad, + /* c3 - _C3 */ 0x20ae, + /* c4 - _C4 */ 0x20af, + /* c5 - _C5 */ 0x20b0, + /* c6 - _C6 */ 0xa238, + /* c7 - _C7 */ 0xa280, + /* c8 - _C8 */ 0x20b1, + /* c9 - _C9 */ 0x20b2, + /* ca - _CA */ 0x20b3, + /* cb - _CB */ 0x20b4, + /* cc - _CC */ 0x20b5, + /* cd - _CD */ 0x20b6, + /* ce - _CE */ 0x20b7, + /* cf - _CF */ 0x20b8, + /* d0 - _D0 */ 0x62c8, + /* d1 - _D1 */ 0x62d0, + /* d2 - _D2 */ 0x62d8, + /* d3 - _D3 */ 0x62e0, + /* d4 - _D4 */ 0x20b9, + /* d5 - _D5 */ 0x20ba, + /* d6 - _D6 */ 0x20bb, + /* d7 - _D7 */ 0x20bc, + /* d8 - _D8 */ 0xa2e8, + /* d9 - _D9 */ 0xa330, + /* da - _DA */ 0xa378, + /* db - _DB */ 0xa3c0, + /* dc - _DC */ 0xa408, + /* dd - _DD */ 0xa450, + /* de - _DE */ 0xa498, + /* df - _DF */ 0xa4e0, + /* e0 - _E0 */ 0x20bd, + /* e1 - _E1 */ 0x20be, + /* e2 - _E2 */ 0x20bf, + /* e3 - _E3 */ 0x4004, + /* e4 - _E4 */ 0x20c0, + /* e5 - _E5 */ 0x20c1, + /* e6 - _E6 */ 0x20c2, + /* e7 - _E7 */ 0x20c3, + /* e8 - _E8 */ 0x20c4, + /* e9 - _E9 */ 0x20c5, + /* ea - _EA */ 0x20c6, + /* eb - _EB */ 0x20c7, + /* ec - _EC */ 0x20c8, + /* ed - _ED */ 0x20c9, + /* ee - _EE */ 0x20ca, + /* ef - _EF */ 0x20cb, + /* f0 - */ 0, + /* f1 - _F1 */ 0x20cc, + /* f2 - */ 0, + /* f3 - */ 0, + /* f4 - _F4 */ 0x20cd, + /* f5 - _F5 */ 0x20ce, + /* f6 - _F6 */ 0x6528, + /* f7 - _F7 */ 0x6530, + /* f8 - _F8 */ 0x20cf, + /* f9 - _F9 */ 0x20d0, + /* fa - _FA */ 0x20d1, + /* fb - _FB */ 0x20d2, + /* fc - _FC */ 0x20d3, + /* fd - _FD */ 0x20d4, + /* fe - _FE */ 0x6538, + /* ff - _FF */ 0x6540, + /* 100 - _0F_00 */ 0x6548, + /* 101 - _0F_01 */ 0xa550, + /* 102 - _0F_02 */ 0x20d5, + /* 103 - _0F_03 */ 0x20d6, + /* 104 - */ 0, + /* 105 - _0F_05 */ 0x20d7, + /* 106 - _0F_06 */ 0x20d8, + /* 107 - _0F_07 */ 0x20d9, + /* 108 - _0F_08 */ 0x20da, + /* 109 - _0F_09 */ 0x20db, + /* 10a - */ 0, + /* 10b - _0F_0B */ 0x20dc, + /* 10c - */ 0, + /* 10d - _0F_0D */ 0x6598, + /* 10e - _0F_0E */ 0x20dd, + /* 10f - _0F_0F */ 0x85a0, + /* 110 - _0F_10 */ 0xc6a0, + /* 111 - _0F_11 */ 0xc6ac, + /* 112 - _0F_12 */ 0xc6b8, + /* 113 - _0F_13 */ 0xc6c4, + /* 114 - _0F_14 */ 0xc6d0, + /* 115 - _0F_15 */ 0xc6dc, + /* 116 - _0F_16 */ 0xc6e8, + /* 117 - _0F_17 */ 0xc6f4, + /* 118 - _0F_18 */ 0x6700, + /* 119 - */ 0, + /* 11a - */ 0, + /* 11b - */ 0, + /* 11c - */ 0, + /* 11d - */ 0, + /* 11e - */ 0, + /* 11f - _0F_1F */ 0x20de, + /* 120 - _0F_20 */ 0x20df, + /* 121 - _0F_21 */ 0x20e0, + /* 122 - _0F_22 */ 0x20e1, + /* 123 - _0F_23 */ 0x20e2, + /* 124 - */ 0, + /* 125 - */ 0, + /* 126 - */ 0, + /* 127 - */ 0, + /* 128 - _0F_28 */ 0xc708, + /* 129 - _0F_29 */ 0xc714, + /* 12a - _0F_2A */ 0xc720, + /* 12b - _0F_2B */ 0xc72c, + /* 12c - _0F_2C */ 0xc738, + /* 12d - _0F_2D */ 0xc744, + /* 12e - _0F_2E */ 0xc750, + /* 12f - _0F_2F */ 0xc75c, + /* 130 - _0F_30 */ 0x20e3, + /* 131 - _0F_31 */ 0x20e4, + /* 132 - _0F_32 */ 0x20e5, + /* 133 - _0F_33 */ 0x20e6, + /* 134 - _0F_34 */ 0x20e7, + /* 135 - _0F_35 */ 0x20e8, + /* 136 - */ 0, + /* 137 - _0F_37 */ 0x20e9, + /* 138 - _0F_38 */ 0x8768, + /* 139 - */ 0, + /* 13a - _0F_3A */ 0x8868, + /* 13b - */ 0, + /* 13c - */ 0, + /* 13d - */ 0, + /* 13e - */ 0, + /* 13f - */ 0, + /* 140 - _0F_40 */ 0x20ea, + /* 141 - _0F_41 */ 0x20eb, + /* 142 - _0F_42 */ 0x20ec, + /* 143 - _0F_43 */ 0x20ed, + /* 144 - _0F_44 */ 0x20ee, + /* 145 - _0F_45 */ 0x20ef, + /* 146 - _0F_46 */ 0x20f0, + /* 147 - _0F_47 */ 0x20f1, + /* 148 - _0F_48 */ 0x20f2, + /* 149 - _0F_49 */ 0x20f3, + /* 14a - _0F_4A */ 0x20f4, + /* 14b - _0F_4B */ 0x20f5, + /* 14c - _0F_4C */ 0x20f6, + /* 14d - _0F_4D */ 0x20f7, + /* 14e - _0F_4E */ 0x20f8, + /* 14f - _0F_4F */ 0x20f9, + /* 150 - _0F_50 */ 0xc968, + /* 151 - _0F_51 */ 0xc974, + /* 152 - _0F_52 */ 0xc980, + /* 153 - _0F_53 */ 0xc98c, + /* 154 - _0F_54 */ 0xc998, + /* 155 - _0F_55 */ 0xc9a4, + /* 156 - _0F_56 */ 0xc9b0, + /* 157 - _0F_57 */ 0xc9bc, + /* 158 - _0F_58 */ 0xc9c8, + /* 159 - _0F_59 */ 0xc9d4, + /* 15a - _0F_5A */ 0xc9e0, + /* 15b - _0F_5B */ 0xc9ec, + /* 15c - _0F_5C */ 0xc9f8, + /* 15d - _0F_5D */ 0xca04, + /* 15e - _0F_5E */ 0xca10, + /* 15f - _0F_5F */ 0xca1c, + /* 160 - _0F_60 */ 0xca28, + /* 161 - _0F_61 */ 0xca34, + /* 162 - _0F_62 */ 0xca40, + /* 163 - _0F_63 */ 0xca4c, + /* 164 - _0F_64 */ 0xca58, + /* 165 - _0F_65 */ 0xca64, + /* 166 - _0F_66 */ 0xca70, + /* 167 - _0F_67 */ 0xca7c, + /* 168 - _0F_68 */ 0xca88, + /* 169 - _0F_69 */ 0xca94, + /* 16a - _0F_6A */ 0xcaa0, + /* 16b - _0F_6B */ 0xcaac, + /* 16c - _0F_6C */ 0xcab8, + /* 16d - _0F_6D */ 0xcac4, + /* 16e - _0F_6E */ 0xcad0, + /* 16f - _0F_6F */ 0xcadc, + /* 170 - _0F_70 */ 0xcae8, + /* 171 - _0F_71 */ 0x6af4, + /* 172 - _0F_72 */ 0x6afc, + /* 173 - _0F_73 */ 0x6b04, + /* 174 - _0F_74 */ 0xcb0c, + /* 175 - _0F_75 */ 0xcb18, + /* 176 - _0F_76 */ 0xcb24, + /* 177 - _0F_77 */ 0xcb30, + /* 178 - _0F_78 */ 0xcb3c, + /* 179 - _0F_79 */ 0xcb48, + /* 17a - _0F_7A */ 0x8b54, + /* 17b - */ 0, + /* 17c - _0F_7C */ 0xcc54, + /* 17d - _0F_7D */ 0xcc60, + /* 17e - _0F_7E */ 0xcc6c, + /* 17f - _0F_7F */ 0xcc78, + /* 180 - _0F_80 */ 0x20fa, + /* 181 - _0F_81 */ 0x20fb, + /* 182 - _0F_82 */ 0x20fc, + /* 183 - _0F_83 */ 0x20fd, + /* 184 - _0F_84 */ 0x20fe, + /* 185 - _0F_85 */ 0x20ff, + /* 186 - _0F_86 */ 0x2100, + /* 187 - _0F_87 */ 0x2101, + /* 188 - _0F_88 */ 0x2102, + /* 189 - _0F_89 */ 0x2103, + /* 18a - _0F_8A */ 0x2104, + /* 18b - _0F_8B */ 0x2105, + /* 18c - _0F_8C */ 0x2106, + /* 18d - _0F_8D */ 0x2107, + /* 18e - _0F_8E */ 0x2108, + /* 18f - _0F_8F */ 0x2109, + /* 190 - _0F_90 */ 0x210a, + /* 191 - _0F_91 */ 0x210b, + /* 192 - _0F_92 */ 0x210c, + /* 193 - _0F_93 */ 0x210d, + /* 194 - _0F_94 */ 0x210e, + /* 195 - _0F_95 */ 0x210f, + /* 196 - _0F_96 */ 0x2110, + /* 197 - _0F_97 */ 0x2111, + /* 198 - _0F_98 */ 0x2112, + /* 199 - _0F_99 */ 0x2113, + /* 19a - _0F_9A */ 0x2114, + /* 19b - _0F_9B */ 0x2115, + /* 19c - _0F_9C */ 0x2116, + /* 19d - _0F_9D */ 0x2117, + /* 19e - _0F_9E */ 0x2118, + /* 19f - _0F_9F */ 0x2119, + /* 1a0 - _0F_A0 */ 0x211a, + /* 1a1 - _0F_A1 */ 0x211b, + /* 1a2 - _0F_A2 */ 0x211c, + /* 1a3 - _0F_A3 */ 0x211d, + /* 1a4 - _0F_A4 */ 0x4005, + /* 1a5 - _0F_A5 */ 0x4006, + /* 1a6 - */ 0, + /* 1a7 - */ 0, + /* 1a8 - _0F_A8 */ 0x211e, + /* 1a9 - _0F_A9 */ 0x211f, + /* 1aa - _0F_AA */ 0x2120, + /* 1ab - _0F_AB */ 0x2121, + /* 1ac - _0F_AC */ 0x4007, + /* 1ad - _0F_AD */ 0x4008, + /* 1ae - _0F_AE */ 0x6c84, + /* 1af - _0F_AF */ 0x2122, + /* 1b0 - _0F_B0 */ 0x2123, + /* 1b1 - _0F_B1 */ 0x2124, + /* 1b2 - _0F_B2 */ 0x2125, + /* 1b3 - _0F_B3 */ 0x2126, + /* 1b4 - _0F_B4 */ 0x2127, + /* 1b5 - _0F_B5 */ 0x2128, + /* 1b6 - _0F_B6 */ 0x2129, + /* 1b7 - _0F_B7 */ 0x212a, + /* 1b8 - _0F_B8 */ 0xcc8c, + /* 1b9 - _0F_B9 */ 0x212b, + /* 1ba - _0F_BA */ 0x6c98, + /* 1bb - _0F_BB */ 0x212c, + /* 1bc - _0F_BC */ 0xcca0, + /* 1bd - _0F_BD */ 0xccac, + /* 1be - _0F_BE */ 0x212d, + /* 1bf - _0F_BF */ 0x212e, + /* 1c0 - _0F_C0 */ 0x212f, + /* 1c1 - _0F_C1 */ 0x2130, + /* 1c2 - _0F_C2 */ 0xccb8, + /* 1c3 - _0F_C3 */ 0x2131, + /* 1c4 - _0F_C4 */ 0xccc4, + /* 1c5 - _0F_C5 */ 0xccd0, + /* 1c6 - _0F_C6 */ 0xccdc, + /* 1c7 - _0F_C7 */ 0x6ce8, + /* 1c8 - _0F_C8 */ 0x2132, + /* 1c9 - _0F_C8 */ 0x2133, + /* 1ca - _0F_C8 */ 0x2134, + /* 1cb - _0F_C8 */ 0x2135, + /* 1cc - _0F_C8 */ 0x2136, + /* 1cd - _0F_C8 */ 0x2137, + /* 1ce - _0F_C8 */ 0x2138, + /* 1cf - _0F_C8 */ 0x2139, + /* 1d0 - _0F_D0 */ 0xccf0, + /* 1d1 - _0F_D1 */ 0xccfc, + /* 1d2 - _0F_D2 */ 0xcd08, + /* 1d3 - _0F_D3 */ 0xcd14, + /* 1d4 - _0F_D4 */ 0xcd20, + /* 1d5 - _0F_D5 */ 0xcd2c, + /* 1d6 - _0F_D6 */ 0xcd38, + /* 1d7 - _0F_D7 */ 0xcd44, + /* 1d8 - _0F_D8 */ 0xcd50, + /* 1d9 - _0F_D9 */ 0xcd5c, + /* 1da - _0F_DA */ 0xcd68, + /* 1db - _0F_DB */ 0xcd74, + /* 1dc - _0F_DC */ 0xcd80, + /* 1dd - _0F_DD */ 0xcd8c, + /* 1de - _0F_DE */ 0xcd98, + /* 1df - _0F_DF */ 0xcda4, + /* 1e0 - _0F_E0 */ 0xcdb0, + /* 1e1 - _0F_E1 */ 0xcdbc, + /* 1e2 - _0F_E2 */ 0xcdc8, + /* 1e3 - _0F_E3 */ 0xcdd4, + /* 1e4 - _0F_E4 */ 0xcde0, + /* 1e5 - _0F_E5 */ 0xcdec, + /* 1e6 - _0F_E6 */ 0xcdf8, + /* 1e7 - _0F_E7 */ 0xce04, + /* 1e8 - _0F_E8 */ 0xce10, + /* 1e9 - _0F_E9 */ 0xce1c, + /* 1ea - _0F_EA */ 0xce28, + /* 1eb - _0F_EB */ 0xce34, + /* 1ec - _0F_EC */ 0xce40, + /* 1ed - _0F_ED */ 0xce4c, + /* 1ee - _0F_EE */ 0xce58, + /* 1ef - _0F_EF */ 0xce64, + /* 1f0 - _0F_F0 */ 0xce70, + /* 1f1 - _0F_F1 */ 0xce7c, + /* 1f2 - _0F_F2 */ 0xce88, + /* 1f3 - _0F_F3 */ 0xce94, + /* 1f4 - _0F_F4 */ 0xcea0, + /* 1f5 - _0F_F5 */ 0xceac, + /* 1f6 - _0F_F6 */ 0xceb8, + /* 1f7 - _0F_F7 */ 0xcec4, + /* 1f8 - _0F_F8 */ 0xced0, + /* 1f9 - _0F_F9 */ 0xcedc, + /* 1fa - _0F_FA */ 0xcee8, + /* 1fb - _0F_FB */ 0xcef4, + /* 1fc - _0F_FC */ 0xcf00, + /* 1fd - _0F_FD */ 0xcf0c, + /* 1fe - _0F_FE */ 0xcf18, + /* 1ff - */ 0, + /* 200 - _80_00 */ 0x213a, + /* 201 - _80_01 */ 0x213b, + /* 202 - _80_02 */ 0x213c, + /* 203 - _80_03 */ 0x213d, + /* 204 - _80_04 */ 0x213e, + /* 205 - _80_05 */ 0x213f, + /* 206 - _80_06 */ 0x2140, + /* 207 - _80_07 */ 0x2141, + /* 208 - _81_00 */ 0x2142, + /* 209 - _81_01 */ 0x2143, + /* 20a - _81_02 */ 0x2144, + /* 20b - _81_03 */ 0x2145, + /* 20c - _81_04 */ 0x2146, + /* 20d - _81_05 */ 0x2147, + /* 20e - _81_06 */ 0x2148, + /* 20f - _81_07 */ 0x2149, + /* 210 - _82_00 */ 0x214a, + /* 211 - _82_01 */ 0x214b, + /* 212 - _82_02 */ 0x214c, + /* 213 - _82_03 */ 0x214d, + /* 214 - _82_04 */ 0x214e, + /* 215 - _82_05 */ 0x214f, + /* 216 - _82_06 */ 0x2150, + /* 217 - _82_07 */ 0x2151, + /* 218 - _83_00 */ 0x2152, + /* 219 - _83_01 */ 0x2153, + /* 21a - _83_02 */ 0x2154, + /* 21b - _83_03 */ 0x2155, + /* 21c - _83_04 */ 0x2156, + /* 21d - _83_05 */ 0x2157, + /* 21e - _83_06 */ 0x2158, + /* 21f - _83_07 */ 0x2159, + /* 220 - _8F_00 */ 0x215a, + /* 221 - */ 0, + /* 222 - */ 0, + /* 223 - */ 0, + /* 224 - */ 0, + /* 225 - */ 0, + /* 226 - */ 0, + /* 227 - */ 0, + /* 228 - _C0_00 */ 0x215b, + /* 229 - _C0_01 */ 0x215c, + /* 22a - _C0_02 */ 0x215d, + /* 22b - _C0_03 */ 0x215e, + /* 22c - _C0_04 */ 0x215f, + /* 22d - _C0_05 */ 0x2160, + /* 22e - _C0_06 */ 0x2161, + /* 22f - _C0_07 */ 0x2162, + /* 230 - _C1_00 */ 0x2163, + /* 231 - _C1_01 */ 0x2164, + /* 232 - _C1_02 */ 0x2165, + /* 233 - _C1_03 */ 0x2166, + /* 234 - _C1_04 */ 0x2167, + /* 235 - _C1_05 */ 0x2168, + /* 236 - _C1_06 */ 0x2169, + /* 237 - _C1_07 */ 0x216a, + /* 238 - _C6_00 */ 0x216b, + /* 239 - */ 0, + /* 23a - */ 0, + /* 23b - */ 0, + /* 23c - */ 0, + /* 23d - */ 0, + /* 23e - */ 0, + /* 23f - */ 0, + /* 240 - */ 0, + /* 241 - */ 0, + /* 242 - */ 0, + /* 243 - */ 0, + /* 244 - */ 0, + /* 245 - */ 0, + /* 246 - */ 0, + /* 247 - */ 0, + /* 248 - */ 0, + /* 249 - */ 0, + /* 24a - */ 0, + /* 24b - */ 0, + /* 24c - */ 0, + /* 24d - */ 0, + /* 24e - */ 0, + /* 24f - */ 0, + /* 250 - */ 0, + /* 251 - */ 0, + /* 252 - */ 0, + /* 253 - */ 0, + /* 254 - */ 0, + /* 255 - */ 0, + /* 256 - */ 0, + /* 257 - */ 0, + /* 258 - */ 0, + /* 259 - */ 0, + /* 25a - */ 0, + /* 25b - */ 0, + /* 25c - */ 0, + /* 25d - */ 0, + /* 25e - */ 0, + /* 25f - */ 0, + /* 260 - */ 0, + /* 261 - */ 0, + /* 262 - */ 0, + /* 263 - */ 0, + /* 264 - */ 0, + /* 265 - */ 0, + /* 266 - */ 0, + /* 267 - */ 0, + /* 268 - */ 0, + /* 269 - */ 0, + /* 26a - */ 0, + /* 26b - */ 0, + /* 26c - */ 0, + /* 26d - */ 0, + /* 26e - */ 0, + /* 26f - */ 0, + /* 270 - */ 0, + /* 271 - */ 0, + /* 272 - */ 0, + /* 273 - */ 0, + /* 274 - */ 0, + /* 275 - */ 0, + /* 276 - */ 0, + /* 277 - */ 0, + /* 278 - _C6_F8 */ 0x216c, + /* 279 - */ 0, + /* 27a - */ 0, + /* 27b - */ 0, + /* 27c - */ 0, + /* 27d - */ 0, + /* 27e - */ 0, + /* 27f - */ 0, + /* 280 - _C7_00 */ 0x216d, + /* 281 - */ 0, + /* 282 - */ 0, + /* 283 - */ 0, + /* 284 - */ 0, + /* 285 - */ 0, + /* 286 - */ 0, + /* 287 - */ 0, + /* 288 - */ 0, + /* 289 - */ 0, + /* 28a - */ 0, + /* 28b - */ 0, + /* 28c - */ 0, + /* 28d - */ 0, + /* 28e - */ 0, + /* 28f - */ 0, + /* 290 - */ 0, + /* 291 - */ 0, + /* 292 - */ 0, + /* 293 - */ 0, + /* 294 - */ 0, + /* 295 - */ 0, + /* 296 - */ 0, + /* 297 - */ 0, + /* 298 - */ 0, + /* 299 - */ 0, + /* 29a - */ 0, + /* 29b - */ 0, + /* 29c - */ 0, + /* 29d - */ 0, + /* 29e - */ 0, + /* 29f - */ 0, + /* 2a0 - */ 0, + /* 2a1 - */ 0, + /* 2a2 - */ 0, + /* 2a3 - */ 0, + /* 2a4 - */ 0, + /* 2a5 - */ 0, + /* 2a6 - */ 0, + /* 2a7 - */ 0, + /* 2a8 - */ 0, + /* 2a9 - */ 0, + /* 2aa - */ 0, + /* 2ab - */ 0, + /* 2ac - */ 0, + /* 2ad - */ 0, + /* 2ae - */ 0, + /* 2af - */ 0, + /* 2b0 - */ 0, + /* 2b1 - */ 0, + /* 2b2 - */ 0, + /* 2b3 - */ 0, + /* 2b4 - */ 0, + /* 2b5 - */ 0, + /* 2b6 - */ 0, + /* 2b7 - */ 0, + /* 2b8 - */ 0, + /* 2b9 - */ 0, + /* 2ba - */ 0, + /* 2bb - */ 0, + /* 2bc - */ 0, + /* 2bd - */ 0, + /* 2be - */ 0, + /* 2bf - */ 0, + /* 2c0 - _C7_F8 */ 0x216e, + /* 2c1 - */ 0, + /* 2c2 - */ 0, + /* 2c3 - */ 0, + /* 2c4 - */ 0, + /* 2c5 - */ 0, + /* 2c6 - */ 0, + /* 2c7 - */ 0, + /* 2c8 - _D0_00 */ 0x216f, + /* 2c9 - _D0_01 */ 0x2170, + /* 2ca - _D0_02 */ 0x2171, + /* 2cb - _D0_03 */ 0x2172, + /* 2cc - _D0_04 */ 0x2173, + /* 2cd - _D0_05 */ 0x2174, + /* 2ce - _D0_06 */ 0x2175, + /* 2cf - _D0_07 */ 0x2176, + /* 2d0 - _D1_00 */ 0x2177, + /* 2d1 - _D1_01 */ 0x2178, + /* 2d2 - _D1_02 */ 0x2179, + /* 2d3 - _D1_03 */ 0x217a, + /* 2d4 - _D1_04 */ 0x217b, + /* 2d5 - _D1_05 */ 0x217c, + /* 2d6 - _D1_06 */ 0x217d, + /* 2d7 - _D1_07 */ 0x217e, + /* 2d8 - _D2_00 */ 0x217f, + /* 2d9 - _D2_01 */ 0x2180, + /* 2da - _D2_02 */ 0x2181, + /* 2db - _D2_03 */ 0x2182, + /* 2dc - _D2_04 */ 0x2183, + /* 2dd - _D2_05 */ 0x2184, + /* 2de - _D2_06 */ 0x2185, + /* 2df - _D2_07 */ 0x2186, + /* 2e0 - _D3_00 */ 0x2187, + /* 2e1 - _D3_01 */ 0x2188, + /* 2e2 - _D3_02 */ 0x2189, + /* 2e3 - _D3_03 */ 0x218a, + /* 2e4 - _D3_04 */ 0x218b, + /* 2e5 - _D3_05 */ 0x218c, + /* 2e6 - _D3_06 */ 0x218d, + /* 2e7 - _D3_07 */ 0x218e, + /* 2e8 - _D8_00 */ 0x218f, + /* 2e9 - _D8_01 */ 0x2190, + /* 2ea - _D8_02 */ 0x2191, + /* 2eb - _D8_03 */ 0x2192, + /* 2ec - _D8_04 */ 0x2193, + /* 2ed - _D8_05 */ 0x2194, + /* 2ee - _D8_06 */ 0x2195, + /* 2ef - _D8_07 */ 0x2196, + /* 2f0 - _D8_C0 */ 0x2197, + /* 2f1 - _D8_C0 */ 0x2198, + /* 2f2 - _D8_C0 */ 0x2199, + /* 2f3 - _D8_C0 */ 0x219a, + /* 2f4 - _D8_C0 */ 0x219b, + /* 2f5 - _D8_C0 */ 0x219c, + /* 2f6 - _D8_C0 */ 0x219d, + /* 2f7 - _D8_C0 */ 0x219e, + /* 2f8 - _D8_C8 */ 0x219f, + /* 2f9 - _D8_C8 */ 0x21a0, + /* 2fa - _D8_C8 */ 0x21a1, + /* 2fb - _D8_C8 */ 0x21a2, + /* 2fc - _D8_C8 */ 0x21a3, + /* 2fd - _D8_C8 */ 0x21a4, + /* 2fe - _D8_C8 */ 0x21a5, + /* 2ff - _D8_C8 */ 0x21a6, + /* 300 - _D8_D0 */ 0x21a7, + /* 301 - _D8_D0 */ 0x21a8, + /* 302 - _D8_D0 */ 0x21a9, + /* 303 - _D8_D0 */ 0x21aa, + /* 304 - _D8_D0 */ 0x21ab, + /* 305 - _D8_D0 */ 0x21ac, + /* 306 - _D8_D0 */ 0x21ad, + /* 307 - _D8_D0 */ 0x21ae, + /* 308 - _D8_D8 */ 0x21af, + /* 309 - _D8_D9 */ 0x21b0, + /* 30a - _D8_D8 */ 0x21b1, + /* 30b - _D8_D8 */ 0x21b2, + /* 30c - _D8_D8 */ 0x21b3, + /* 30d - _D8_D8 */ 0x21b4, + /* 30e - _D8_D8 */ 0x21b5, + /* 30f - _D8_D8 */ 0x21b6, + /* 310 - _D8_E0 */ 0x21b7, + /* 311 - _D8_E0 */ 0x21b8, + /* 312 - _D8_E0 */ 0x21b9, + /* 313 - _D8_E0 */ 0x21ba, + /* 314 - _D8_E0 */ 0x21bb, + /* 315 - _D8_E0 */ 0x21bc, + /* 316 - _D8_E0 */ 0x21bd, + /* 317 - _D8_E0 */ 0x21be, + /* 318 - _D8_E8 */ 0x21bf, + /* 319 - _D8_E8 */ 0x21c0, + /* 31a - _D8_E8 */ 0x21c1, + /* 31b - _D8_E8 */ 0x21c2, + /* 31c - _D8_E8 */ 0x21c3, + /* 31d - _D8_E8 */ 0x21c4, + /* 31e - _D8_E8 */ 0x21c5, + /* 31f - _D8_E8 */ 0x21c6, + /* 320 - _D8_F0 */ 0x21c7, + /* 321 - _D8_F0 */ 0x21c8, + /* 322 - _D8_F0 */ 0x21c9, + /* 323 - _D8_F0 */ 0x21ca, + /* 324 - _D8_F0 */ 0x21cb, + /* 325 - _D8_F0 */ 0x21cc, + /* 326 - _D8_F0 */ 0x21cd, + /* 327 - _D8_F0 */ 0x21ce, + /* 328 - _D8_F8 */ 0x21cf, + /* 329 - _D8_F8 */ 0x21d0, + /* 32a - _D8_F8 */ 0x21d1, + /* 32b - _D8_F8 */ 0x21d2, + /* 32c - _D8_F8 */ 0x21d3, + /* 32d - _D8_F8 */ 0x21d4, + /* 32e - _D8_F8 */ 0x21d5, + /* 32f - _D8_F8 */ 0x21d6, + /* 330 - _D9_00 */ 0x21d7, + /* 331 - */ 0, + /* 332 - _D9_02 */ 0x21d8, + /* 333 - _D9_03 */ 0x21d9, + /* 334 - _D9_04 */ 0x21da, + /* 335 - _D9_05 */ 0x21db, + /* 336 - _D9_06 */ 0xcf24, + /* 337 - _D9_07 */ 0xcf30, + /* 338 - _D9_C0 */ 0x21dc, + /* 339 - _D9_C0 */ 0x21dd, + /* 33a - _D9_C0 */ 0x21de, + /* 33b - _D9_C0 */ 0x21df, + /* 33c - _D9_C0 */ 0x21e0, + /* 33d - _D9_C0 */ 0x21e1, + /* 33e - _D9_C0 */ 0x21e2, + /* 33f - _D9_C0 */ 0x21e3, + /* 340 - _D9_C8 */ 0x21e4, + /* 341 - _D9_C9 */ 0x21e5, + /* 342 - _D9_C8 */ 0x21e6, + /* 343 - _D9_C8 */ 0x21e7, + /* 344 - _D9_C8 */ 0x21e8, + /* 345 - _D9_C8 */ 0x21e9, + /* 346 - _D9_C8 */ 0x21ea, + /* 347 - _D9_C8 */ 0x21eb, + /* 348 - _D9_D0 */ 0x21ec, + /* 349 - */ 0, + /* 34a - */ 0, + /* 34b - */ 0, + /* 34c - */ 0, + /* 34d - */ 0, + /* 34e - */ 0, + /* 34f - */ 0, + /* 350 - */ 0, + /* 351 - */ 0, + /* 352 - */ 0, + /* 353 - */ 0, + /* 354 - */ 0, + /* 355 - */ 0, + /* 356 - */ 0, + /* 357 - */ 0, + /* 358 - _D9_E0 */ 0x21ed, + /* 359 - _D9_E1 */ 0x21ee, + /* 35a - */ 0, + /* 35b - */ 0, + /* 35c - _D9_E4 */ 0x21ef, + /* 35d - _D9_E5 */ 0x21f0, + /* 35e - */ 0, + /* 35f - */ 0, + /* 360 - _D9_E8 */ 0x21f1, + /* 361 - _D9_E9 */ 0x21f2, + /* 362 - _D9_EA */ 0x21f3, + /* 363 - _D9_EB */ 0x21f4, + /* 364 - _D9_EC */ 0x21f5, + /* 365 - _D9_ED */ 0x21f6, + /* 366 - _D9_EE */ 0x21f7, + /* 367 - */ 0, + /* 368 - _D9_F0 */ 0x21f8, + /* 369 - _D9_F1 */ 0x21f9, + /* 36a - _D9_F2 */ 0x21fa, + /* 36b - _D9_F3 */ 0x21fb, + /* 36c - _D9_F4 */ 0x21fc, + /* 36d - _D9_F5 */ 0x21fd, + /* 36e - _D9_F6 */ 0x21fe, + /* 36f - _D9_F7 */ 0x21ff, + /* 370 - _D9_F8 */ 0x2200, + /* 371 - _D9_F9 */ 0x2201, + /* 372 - _D9_FA */ 0x2202, + /* 373 - _D9_FB */ 0x2203, + /* 374 - _D9_FC */ 0x2204, + /* 375 - _D9_FD */ 0x2205, + /* 376 - _D9_FE */ 0x2206, + /* 377 - _D9_FF */ 0x2207, + /* 378 - _DA_00 */ 0x2208, + /* 379 - _DA_01 */ 0x2209, + /* 37a - _DA_02 */ 0x220a, + /* 37b - _DA_03 */ 0x220b, + /* 37c - _DA_04 */ 0x220c, + /* 37d - _DA_05 */ 0x220d, + /* 37e - _DA_06 */ 0x220e, + /* 37f - _DA_07 */ 0x220f, + /* 380 - _DA_C0 */ 0x2210, + /* 381 - _DA_C0 */ 0x2211, + /* 382 - _DA_C0 */ 0x2212, + /* 383 - _DA_C0 */ 0x2213, + /* 384 - _DA_C0 */ 0x2214, + /* 385 - _DA_C0 */ 0x2215, + /* 386 - _DA_C0 */ 0x2216, + /* 387 - _DA_C0 */ 0x2217, + /* 388 - _DA_C8 */ 0x2218, + /* 389 - _DA_C8 */ 0x2219, + /* 38a - _DA_C8 */ 0x221a, + /* 38b - _DA_C8 */ 0x221b, + /* 38c - _DA_C8 */ 0x221c, + /* 38d - _DA_C8 */ 0x221d, + /* 38e - _DA_C8 */ 0x221e, + /* 38f - _DA_C8 */ 0x221f, + /* 390 - _DA_D0 */ 0x2220, + /* 391 - _DA_D0 */ 0x2221, + /* 392 - _DA_D0 */ 0x2222, + /* 393 - _DA_D0 */ 0x2223, + /* 394 - _DA_D0 */ 0x2224, + /* 395 - _DA_D0 */ 0x2225, + /* 396 - _DA_D0 */ 0x2226, + /* 397 - _DA_D0 */ 0x2227, + /* 398 - _DA_D8 */ 0x2228, + /* 399 - _DA_D8 */ 0x2229, + /* 39a - _DA_D8 */ 0x222a, + /* 39b - _DA_D8 */ 0x222b, + /* 39c - _DA_D8 */ 0x222c, + /* 39d - _DA_D8 */ 0x222d, + /* 39e - _DA_D8 */ 0x222e, + /* 39f - _DA_D8 */ 0x222f, + /* 3a0 - */ 0, + /* 3a1 - */ 0, + /* 3a2 - */ 0, + /* 3a3 - */ 0, + /* 3a4 - */ 0, + /* 3a5 - */ 0, + /* 3a6 - */ 0, + /* 3a7 - */ 0, + /* 3a8 - */ 0, + /* 3a9 - _DA_E9 */ 0x2230, + /* 3aa - */ 0, + /* 3ab - */ 0, + /* 3ac - */ 0, + /* 3ad - */ 0, + /* 3ae - */ 0, + /* 3af - */ 0, + /* 3b0 - */ 0, + /* 3b1 - */ 0, + /* 3b2 - */ 0, + /* 3b3 - */ 0, + /* 3b4 - */ 0, + /* 3b5 - */ 0, + /* 3b6 - */ 0, + /* 3b7 - */ 0, + /* 3b8 - */ 0, + /* 3b9 - */ 0, + /* 3ba - */ 0, + /* 3bb - */ 0, + /* 3bc - */ 0, + /* 3bd - */ 0, + /* 3be - */ 0, + /* 3bf - */ 0, + /* 3c0 - _DB_00 */ 0x2231, + /* 3c1 - _DB_01 */ 0x2232, + /* 3c2 - _DB_02 */ 0x2233, + /* 3c3 - _DB_03 */ 0x2234, + /* 3c4 - */ 0, + /* 3c5 - _DB_05 */ 0x2235, + /* 3c6 - */ 0, + /* 3c7 - _DB_07 */ 0x2236, + /* 3c8 - _DB_C0 */ 0x2237, + /* 3c9 - _DB_C0 */ 0x2238, + /* 3ca - _DB_C0 */ 0x2239, + /* 3cb - _DB_C0 */ 0x223a, + /* 3cc - _DB_C0 */ 0x223b, + /* 3cd - _DB_C0 */ 0x223c, + /* 3ce - _DB_C0 */ 0x223d, + /* 3cf - _DB_C0 */ 0x223e, + /* 3d0 - _DB_C8 */ 0x223f, + /* 3d1 - _DB_C8 */ 0x2240, + /* 3d2 - _DB_C8 */ 0x2241, + /* 3d3 - _DB_C8 */ 0x2242, + /* 3d4 - _DB_C8 */ 0x2243, + /* 3d5 - _DB_C8 */ 0x2244, + /* 3d6 - _DB_C8 */ 0x2245, + /* 3d7 - _DB_C8 */ 0x2246, + /* 3d8 - _DB_D0 */ 0x2247, + /* 3d9 - _DB_D0 */ 0x2248, + /* 3da - _DB_D0 */ 0x2249, + /* 3db - _DB_D0 */ 0x224a, + /* 3dc - _DB_D0 */ 0x224b, + /* 3dd - _DB_D0 */ 0x224c, + /* 3de - _DB_D0 */ 0x224d, + /* 3df - _DB_D0 */ 0x224e, + /* 3e0 - _DB_D8 */ 0x224f, + /* 3e1 - _DB_D8 */ 0x2250, + /* 3e2 - _DB_D8 */ 0x2251, + /* 3e3 - _DB_D8 */ 0x2252, + /* 3e4 - _DB_D8 */ 0x2253, + /* 3e5 - _DB_D8 */ 0x2254, + /* 3e6 - _DB_D8 */ 0x2255, + /* 3e7 - _DB_D8 */ 0x2256, + /* 3e8 - _DB_E0 */ 0x2257, + /* 3e9 - _DB_E1 */ 0x2258, + /* 3ea - _DB_E2 */ 0xcf3c, + /* 3eb - _DB_E3 */ 0xcf48, + /* 3ec - _DB_E4 */ 0x2259, + /* 3ed - */ 0, + /* 3ee - */ 0, + /* 3ef - */ 0, + /* 3f0 - _DB_E8 */ 0x225a, + /* 3f1 - _DB_E8 */ 0x225b, + /* 3f2 - _DB_E8 */ 0x225c, + /* 3f3 - _DB_E8 */ 0x225d, + /* 3f4 - _DB_E8 */ 0x225e, + /* 3f5 - _DB_E8 */ 0x225f, + /* 3f6 - _DB_E8 */ 0x2260, + /* 3f7 - _DB_E8 */ 0x2261, + /* 3f8 - _DB_F0 */ 0x2262, + /* 3f9 - _DB_F0 */ 0x2263, + /* 3fa - _DB_F0 */ 0x2264, + /* 3fb - _DB_F0 */ 0x2265, + /* 3fc - _DB_F0 */ 0x2266, + /* 3fd - _DB_F0 */ 0x2267, + /* 3fe - _DB_F0 */ 0x2268, + /* 3ff - _DB_F0 */ 0x2269, + /* 400 - */ 0, + /* 401 - */ 0, + /* 402 - */ 0, + /* 403 - */ 0, + /* 404 - */ 0, + /* 405 - */ 0, + /* 406 - */ 0, + /* 407 - */ 0, + /* 408 - _DC_00 */ 0x226a, + /* 409 - _DC_01 */ 0x226b, + /* 40a - _DC_02 */ 0x226c, + /* 40b - _DC_03 */ 0x226d, + /* 40c - _DC_04 */ 0x226e, + /* 40d - _DC_05 */ 0x226f, + /* 40e - _DC_06 */ 0x2270, + /* 40f - _DC_07 */ 0x2271, + /* 410 - _DC_C0 */ 0x2272, + /* 411 - _DC_C0 */ 0x2273, + /* 412 - _DC_C0 */ 0x2274, + /* 413 - _DC_C0 */ 0x2275, + /* 414 - _DC_C0 */ 0x2276, + /* 415 - _DC_C0 */ 0x2277, + /* 416 - _DC_C0 */ 0x2278, + /* 417 - _DC_C0 */ 0x2279, + /* 418 - _DC_C8 */ 0x227a, + /* 419 - _DC_C8 */ 0x227b, + /* 41a - _DC_C8 */ 0x227c, + /* 41b - _DC_C8 */ 0x227d, + /* 41c - _DC_C8 */ 0x227e, + /* 41d - _DC_C8 */ 0x227f, + /* 41e - _DC_C8 */ 0x2280, + /* 41f - _DC_C8 */ 0x2281, + /* 420 - */ 0, + /* 421 - */ 0, + /* 422 - */ 0, + /* 423 - */ 0, + /* 424 - */ 0, + /* 425 - */ 0, + /* 426 - */ 0, + /* 427 - */ 0, + /* 428 - */ 0, + /* 429 - */ 0, + /* 42a - */ 0, + /* 42b - */ 0, + /* 42c - */ 0, + /* 42d - */ 0, + /* 42e - */ 0, + /* 42f - */ 0, + /* 430 - _DC_E0 */ 0x2282, + /* 431 - _DC_E0 */ 0x2283, + /* 432 - _DC_E0 */ 0x2284, + /* 433 - _DC_E0 */ 0x2285, + /* 434 - _DC_E0 */ 0x2286, + /* 435 - _DC_E0 */ 0x2287, + /* 436 - _DC_E0 */ 0x2288, + /* 437 - _DC_E0 */ 0x2289, + /* 438 - _DC_E8 */ 0x228a, + /* 439 - _DC_E8 */ 0x228b, + /* 43a - _DC_E8 */ 0x228c, + /* 43b - _DC_E8 */ 0x228d, + /* 43c - _DC_E8 */ 0x228e, + /* 43d - _DC_E8 */ 0x228f, + /* 43e - _DC_E8 */ 0x2290, + /* 43f - _DC_E8 */ 0x2291, + /* 440 - _DC_F0 */ 0x2292, + /* 441 - _DC_F0 */ 0x2293, + /* 442 - _DC_F0 */ 0x2294, + /* 443 - _DC_F0 */ 0x2295, + /* 444 - _DC_F0 */ 0x2296, + /* 445 - _DC_F0 */ 0x2297, + /* 446 - _DC_F0 */ 0x2298, + /* 447 - _DC_F0 */ 0x2299, + /* 448 - _DC_F8 */ 0x229a, + /* 449 - _DC_F8 */ 0x229b, + /* 44a - _DC_F8 */ 0x229c, + /* 44b - _DC_F8 */ 0x229d, + /* 44c - _DC_F8 */ 0x229e, + /* 44d - _DC_F8 */ 0x229f, + /* 44e - _DC_F8 */ 0x22a0, + /* 44f - _DC_F8 */ 0x22a1, + /* 450 - _DD_00 */ 0x22a2, + /* 451 - _DD_01 */ 0x22a3, + /* 452 - _DD_02 */ 0x22a4, + /* 453 - _DD_03 */ 0x22a5, + /* 454 - _DD_04 */ 0x22a6, + /* 455 - */ 0, + /* 456 - _DD_06 */ 0xcf54, + /* 457 - _DD_07 */ 0xcf60, + /* 458 - _DD_C0 */ 0x22a7, + /* 459 - _DD_C0 */ 0x22a8, + /* 45a - _DD_C0 */ 0x22a9, + /* 45b - _DD_C0 */ 0x22aa, + /* 45c - _DD_C0 */ 0x22ab, + /* 45d - _DD_C0 */ 0x22ac, + /* 45e - _DD_C0 */ 0x22ad, + /* 45f - _DD_C0 */ 0x22ae, + /* 460 - */ 0, + /* 461 - */ 0, + /* 462 - */ 0, + /* 463 - */ 0, + /* 464 - */ 0, + /* 465 - */ 0, + /* 466 - */ 0, + /* 467 - */ 0, + /* 468 - _DD_D0 */ 0x22af, + /* 469 - _DD_D0 */ 0x22b0, + /* 46a - _DD_D0 */ 0x22b1, + /* 46b - _DD_D0 */ 0x22b2, + /* 46c - _DD_D0 */ 0x22b3, + /* 46d - _DD_D0 */ 0x22b4, + /* 46e - _DD_D0 */ 0x22b5, + /* 46f - _DD_D0 */ 0x22b6, + /* 470 - _DD_D8 */ 0x22b7, + /* 471 - _DD_D8 */ 0x22b8, + /* 472 - _DD_D8 */ 0x22b9, + /* 473 - _DD_D8 */ 0x22ba, + /* 474 - _DD_D8 */ 0x22bb, + /* 475 - _DD_D8 */ 0x22bc, + /* 476 - _DD_D8 */ 0x22bd, + /* 477 - _DD_D8 */ 0x22be, + /* 478 - _DD_E0 */ 0x22bf, + /* 479 - _DD_E1 */ 0x22c0, + /* 47a - _DD_E0 */ 0x22c1, + /* 47b - _DD_E0 */ 0x22c2, + /* 47c - _DD_E0 */ 0x22c3, + /* 47d - _DD_E0 */ 0x22c4, + /* 47e - _DD_E0 */ 0x22c5, + /* 47f - _DD_E0 */ 0x22c6, + /* 480 - _DD_E8 */ 0x22c7, + /* 481 - _DD_E9 */ 0x22c8, + /* 482 - _DD_E8 */ 0x22c9, + /* 483 - _DD_E8 */ 0x22ca, + /* 484 - _DD_E8 */ 0x22cb, + /* 485 - _DD_E8 */ 0x22cc, + /* 486 - _DD_E8 */ 0x22cd, + /* 487 - _DD_E8 */ 0x22ce, + /* 488 - */ 0, + /* 489 - */ 0, + /* 48a - */ 0, + /* 48b - */ 0, + /* 48c - */ 0, + /* 48d - */ 0, + /* 48e - */ 0, + /* 48f - */ 0, + /* 490 - */ 0, + /* 491 - */ 0, + /* 492 - */ 0, + /* 493 - */ 0, + /* 494 - */ 0, + /* 495 - */ 0, + /* 496 - */ 0, + /* 497 - */ 0, + /* 498 - _DE_00 */ 0x22cf, + /* 499 - _DE_01 */ 0x22d0, + /* 49a - _DE_02 */ 0x22d1, + /* 49b - _DE_03 */ 0x22d2, + /* 49c - _DE_04 */ 0x22d3, + /* 49d - _DE_05 */ 0x22d4, + /* 49e - _DE_06 */ 0x22d5, + /* 49f - _DE_07 */ 0x22d6, + /* 4a0 - _DE_C0 */ 0x22d7, + /* 4a1 - _DE_C1 */ 0x22d8, + /* 4a2 - _DE_C0 */ 0x22d9, + /* 4a3 - _DE_C0 */ 0x22da, + /* 4a4 - _DE_C0 */ 0x22db, + /* 4a5 - _DE_C0 */ 0x22dc, + /* 4a6 - _DE_C0 */ 0x22dd, + /* 4a7 - _DE_C0 */ 0x22de, + /* 4a8 - _DE_C8 */ 0x22df, + /* 4a9 - _DE_C9 */ 0x22e0, + /* 4aa - _DE_C8 */ 0x22e1, + /* 4ab - _DE_C8 */ 0x22e2, + /* 4ac - _DE_C8 */ 0x22e3, + /* 4ad - _DE_C8 */ 0x22e4, + /* 4ae - _DE_C8 */ 0x22e5, + /* 4af - _DE_C8 */ 0x22e6, + /* 4b0 - */ 0, + /* 4b1 - */ 0, + /* 4b2 - */ 0, + /* 4b3 - */ 0, + /* 4b4 - */ 0, + /* 4b5 - */ 0, + /* 4b6 - */ 0, + /* 4b7 - */ 0, + /* 4b8 - */ 0, + /* 4b9 - _DE_D9 */ 0x22e7, + /* 4ba - */ 0, + /* 4bb - */ 0, + /* 4bc - */ 0, + /* 4bd - */ 0, + /* 4be - */ 0, + /* 4bf - */ 0, + /* 4c0 - _DE_E0 */ 0x22e8, + /* 4c1 - _DE_E1 */ 0x22e9, + /* 4c2 - _DE_E0 */ 0x22ea, + /* 4c3 - _DE_E0 */ 0x22eb, + /* 4c4 - _DE_E0 */ 0x22ec, + /* 4c5 - _DE_E0 */ 0x22ed, + /* 4c6 - _DE_E0 */ 0x22ee, + /* 4c7 - _DE_E0 */ 0x22ef, + /* 4c8 - _DE_E8 */ 0x22f0, + /* 4c9 - _DE_E9 */ 0x22f1, + /* 4ca - _DE_E8 */ 0x22f2, + /* 4cb - _DE_E8 */ 0x22f3, + /* 4cc - _DE_E8 */ 0x22f4, + /* 4cd - _DE_E8 */ 0x22f5, + /* 4ce - _DE_E8 */ 0x22f6, + /* 4cf - _DE_E8 */ 0x22f7, + /* 4d0 - _DE_F0 */ 0x22f8, + /* 4d1 - _DE_F1 */ 0x22f9, + /* 4d2 - _DE_F0 */ 0x22fa, + /* 4d3 - _DE_F0 */ 0x22fb, + /* 4d4 - _DE_F0 */ 0x22fc, + /* 4d5 - _DE_F0 */ 0x22fd, + /* 4d6 - _DE_F0 */ 0x22fe, + /* 4d7 - _DE_F0 */ 0x22ff, + /* 4d8 - _DE_F8 */ 0x2300, + /* 4d9 - _DE_F9 */ 0x2301, + /* 4da - _DE_F8 */ 0x2302, + /* 4db - _DE_F8 */ 0x2303, + /* 4dc - _DE_F8 */ 0x2304, + /* 4dd - _DE_F8 */ 0x2305, + /* 4de - _DE_F8 */ 0x2306, + /* 4df - _DE_F8 */ 0x2307, + /* 4e0 - _DF_00 */ 0x2308, + /* 4e1 - _DF_01 */ 0x2309, + /* 4e2 - _DF_02 */ 0x230a, + /* 4e3 - _DF_03 */ 0x230b, + /* 4e4 - _DF_04 */ 0x230c, + /* 4e5 - _DF_05 */ 0x230d, + /* 4e6 - _DF_06 */ 0x230e, + /* 4e7 - _DF_07 */ 0x230f, + /* 4e8 - */ 0, + /* 4e9 - */ 0, + /* 4ea - */ 0, + /* 4eb - */ 0, + /* 4ec - */ 0, + /* 4ed - */ 0, + /* 4ee - */ 0, + /* 4ef - */ 0, + /* 4f0 - */ 0, + /* 4f1 - */ 0, + /* 4f2 - */ 0, + /* 4f3 - */ 0, + /* 4f4 - */ 0, + /* 4f5 - */ 0, + /* 4f6 - */ 0, + /* 4f7 - */ 0, + /* 4f8 - */ 0, + /* 4f9 - */ 0, + /* 4fa - */ 0, + /* 4fb - */ 0, + /* 4fc - */ 0, + /* 4fd - */ 0, + /* 4fe - */ 0, + /* 4ff - */ 0, + /* 500 - */ 0, + /* 501 - */ 0, + /* 502 - */ 0, + /* 503 - */ 0, + /* 504 - */ 0, + /* 505 - */ 0, + /* 506 - */ 0, + /* 507 - */ 0, + /* 508 - _DF_E0 */ 0xcf6c, + /* 509 - */ 0, + /* 50a - */ 0, + /* 50b - */ 0, + /* 50c - */ 0, + /* 50d - */ 0, + /* 50e - */ 0, + /* 50f - */ 0, + /* 510 - _DF_E8 */ 0x2310, + /* 511 - _DF_E8 */ 0x2311, + /* 512 - _DF_E8 */ 0x2312, + /* 513 - _DF_E8 */ 0x2313, + /* 514 - _DF_E8 */ 0x2314, + /* 515 - _DF_E8 */ 0x2315, + /* 516 - _DF_E8 */ 0x2316, + /* 517 - _DF_E8 */ 0x2317, + /* 518 - _DF_F0 */ 0x2318, + /* 519 - _DF_F0 */ 0x2319, + /* 51a - _DF_F0 */ 0x231a, + /* 51b - _DF_F0 */ 0x231b, + /* 51c - _DF_F0 */ 0x231c, + /* 51d - _DF_F0 */ 0x231d, + /* 51e - _DF_F0 */ 0x231e, + /* 51f - _DF_F0 */ 0x231f, + /* 520 - */ 0, + /* 521 - */ 0, + /* 522 - */ 0, + /* 523 - */ 0, + /* 524 - */ 0, + /* 525 - */ 0, + /* 526 - */ 0, + /* 527 - */ 0, + /* 528 - _F6_00 */ 0x2320, + /* 529 - */ 0, + /* 52a - _F6_02 */ 0x2321, + /* 52b - _F6_03 */ 0x2322, + /* 52c - _F6_04 */ 0x2323, + /* 52d - _F6_05 */ 0x2324, + /* 52e - _F6_06 */ 0x2325, + /* 52f - _F6_07 */ 0x2326, + /* 530 - _F7_00 */ 0x2327, + /* 531 - */ 0, + /* 532 - _F7_02 */ 0x2328, + /* 533 - _F7_03 */ 0x2329, + /* 534 - _F7_04 */ 0x232a, + /* 535 - _F7_05 */ 0x232b, + /* 536 - _F7_06 */ 0x232c, + /* 537 - _F7_07 */ 0x232d, + /* 538 - _FE_00 */ 0x232e, + /* 539 - _FE_01 */ 0x232f, + /* 53a - */ 0, + /* 53b - */ 0, + /* 53c - */ 0, + /* 53d - */ 0, + /* 53e - */ 0, + /* 53f - */ 0, + /* 540 - _FF_00 */ 0x2330, + /* 541 - _FF_01 */ 0x2331, + /* 542 - _FF_02 */ 0x2332, + /* 543 - _FF_03 */ 0x2333, + /* 544 - _FF_04 */ 0x2334, + /* 545 - _FF_05 */ 0x2335, + /* 546 - _FF_06 */ 0x2336, + /* 547 - */ 0, + /* 548 - _0F_00_00 */ 0x2337, + /* 549 - _0F_00_01 */ 0x2338, + /* 54a - _0F_00_02 */ 0x2339, + /* 54b - _0F_00_03 */ 0x233a, + /* 54c - _0F_00_04 */ 0x233b, + /* 54d - _0F_00_05 */ 0x233c, + /* 54e - */ 0, + /* 54f - */ 0, + /* 550 - _0F_01_00 */ 0x233d, + /* 551 - _0F_01_01 */ 0x233e, + /* 552 - _0F_01_02 */ 0x233f, + /* 553 - _0F_01_03 */ 0x2340, + /* 554 - _0F_01_04 */ 0x2341, + /* 555 - */ 0, + /* 556 - _0F_01_06 */ 0x2342, + /* 557 - _0F_01_07 */ 0x2343, + /* 558 - */ 0, + /* 559 - _0F_01_C1 */ 0x2344, + /* 55a - _0F_01_C2 */ 0x2345, + /* 55b - _0F_01_C3 */ 0x2346, + /* 55c - _0F_01_C4 */ 0x2347, + /* 55d - */ 0, + /* 55e - */ 0, + /* 55f - */ 0, + /* 560 - _0F_01_C8 */ 0x2348, + /* 561 - _0F_01_C9 */ 0x2349, + /* 562 - */ 0, + /* 563 - */ 0, + /* 564 - */ 0, + /* 565 - */ 0, + /* 566 - */ 0, + /* 567 - */ 0, + /* 568 - _0F_01_D0 */ 0x234a, + /* 569 - _0F_01_D1 */ 0x234b, + /* 56a - */ 0, + /* 56b - */ 0, + /* 56c - _0F_01_D4 */ 0x234c, + /* 56d - _0F_01_D5 */ 0x234d, + /* 56e - */ 0, + /* 56f - */ 0, + /* 570 - _0F_01_D8 */ 0x234e, + /* 571 - _0F_01_D9 */ 0x234f, + /* 572 - _0F_01_DA */ 0x2350, + /* 573 - _0F_01_DB */ 0x2351, + /* 574 - _0F_01_DC */ 0x2352, + /* 575 - _0F_01_DD */ 0x2353, + /* 576 - _0F_01_DE */ 0x2354, + /* 577 - _0F_01_DF */ 0x2355, + /* 578 - */ 0, + /* 579 - */ 0, + /* 57a - */ 0, + /* 57b - */ 0, + /* 57c - */ 0, + /* 57d - */ 0, + /* 57e - */ 0, + /* 57f - */ 0, + /* 580 - */ 0, + /* 581 - */ 0, + /* 582 - */ 0, + /* 583 - */ 0, + /* 584 - */ 0, + /* 585 - */ 0, + /* 586 - */ 0, + /* 587 - */ 0, + /* 588 - */ 0, + /* 589 - */ 0, + /* 58a - */ 0, + /* 58b - */ 0, + /* 58c - */ 0, + /* 58d - */ 0, + /* 58e - */ 0, + /* 58f - */ 0, + /* 590 - _0F_01_F8 */ 0x2356, + /* 591 - _0F_01_F9 */ 0x2357, + /* 592 - */ 0, + /* 593 - */ 0, + /* 594 - */ 0, + /* 595 - */ 0, + /* 596 - */ 0, + /* 597 - */ 0, + /* 598 - _0F_0D_00 */ 0x2358, + /* 599 - _0F_0D_01 */ 0x2359, + /* 59a - */ 0, + /* 59b - */ 0, + /* 59c - */ 0, + /* 59d - */ 0, + /* 59e - */ 0, + /* 59f - */ 0, + /* 5a0 - */ 0, + /* 5a1 - */ 0, + /* 5a2 - */ 0, + /* 5a3 - */ 0, + /* 5a4 - */ 0, + /* 5a5 - */ 0, + /* 5a6 - */ 0, + /* 5a7 - */ 0, + /* 5a8 - */ 0, + /* 5a9 - */ 0, + /* 5aa - */ 0, + /* 5ab - */ 0, + /* 5ac - _0F_0F_0C */ 0x235a, + /* 5ad - _0F_0F_0D */ 0x235b, + /* 5ae - */ 0, + /* 5af - */ 0, + /* 5b0 - */ 0, + /* 5b1 - */ 0, + /* 5b2 - */ 0, + /* 5b3 - */ 0, + /* 5b4 - */ 0, + /* 5b5 - */ 0, + /* 5b6 - */ 0, + /* 5b7 - */ 0, + /* 5b8 - */ 0, + /* 5b9 - */ 0, + /* 5ba - */ 0, + /* 5bb - */ 0, + /* 5bc - _0F_0F_1C */ 0x235c, + /* 5bd - _0F_0F_1D */ 0x235d, + /* 5be - */ 0, + /* 5bf - */ 0, + /* 5c0 - */ 0, + /* 5c1 - */ 0, + /* 5c2 - */ 0, + /* 5c3 - */ 0, + /* 5c4 - */ 0, + /* 5c5 - */ 0, + /* 5c6 - */ 0, + /* 5c7 - */ 0, + /* 5c8 - */ 0, + /* 5c9 - */ 0, + /* 5ca - */ 0, + /* 5cb - */ 0, + /* 5cc - */ 0, + /* 5cd - */ 0, + /* 5ce - */ 0, + /* 5cf - */ 0, + /* 5d0 - */ 0, + /* 5d1 - */ 0, + /* 5d2 - */ 0, + /* 5d3 - */ 0, + /* 5d4 - */ 0, + /* 5d5 - */ 0, + /* 5d6 - */ 0, + /* 5d7 - */ 0, + /* 5d8 - */ 0, + /* 5d9 - */ 0, + /* 5da - */ 0, + /* 5db - */ 0, + /* 5dc - */ 0, + /* 5dd - */ 0, + /* 5de - */ 0, + /* 5df - */ 0, + /* 5e0 - */ 0, + /* 5e1 - */ 0, + /* 5e2 - */ 0, + /* 5e3 - */ 0, + /* 5e4 - */ 0, + /* 5e5 - */ 0, + /* 5e6 - */ 0, + /* 5e7 - */ 0, + /* 5e8 - */ 0, + /* 5e9 - */ 0, + /* 5ea - */ 0, + /* 5eb - */ 0, + /* 5ec - */ 0, + /* 5ed - */ 0, + /* 5ee - */ 0, + /* 5ef - */ 0, + /* 5f0 - */ 0, + /* 5f1 - */ 0, + /* 5f2 - */ 0, + /* 5f3 - */ 0, + /* 5f4 - */ 0, + /* 5f5 - */ 0, + /* 5f6 - */ 0, + /* 5f7 - */ 0, + /* 5f8 - */ 0, + /* 5f9 - */ 0, + /* 5fa - */ 0, + /* 5fb - */ 0, + /* 5fc - */ 0, + /* 5fd - */ 0, + /* 5fe - */ 0, + /* 5ff - */ 0, + /* 600 - */ 0, + /* 601 - */ 0, + /* 602 - */ 0, + /* 603 - */ 0, + /* 604 - */ 0, + /* 605 - */ 0, + /* 606 - */ 0, + /* 607 - */ 0, + /* 608 - */ 0, + /* 609 - */ 0, + /* 60a - */ 0, + /* 60b - */ 0, + /* 60c - */ 0, + /* 60d - */ 0, + /* 60e - */ 0, + /* 60f - */ 0, + /* 610 - */ 0, + /* 611 - */ 0, + /* 612 - */ 0, + /* 613 - */ 0, + /* 614 - */ 0, + /* 615 - */ 0, + /* 616 - */ 0, + /* 617 - */ 0, + /* 618 - */ 0, + /* 619 - */ 0, + /* 61a - */ 0, + /* 61b - */ 0, + /* 61c - */ 0, + /* 61d - */ 0, + /* 61e - */ 0, + /* 61f - */ 0, + /* 620 - */ 0, + /* 621 - */ 0, + /* 622 - */ 0, + /* 623 - */ 0, + /* 624 - */ 0, + /* 625 - */ 0, + /* 626 - */ 0, + /* 627 - */ 0, + /* 628 - */ 0, + /* 629 - */ 0, + /* 62a - _0F_0F_8A */ 0x235e, + /* 62b - */ 0, + /* 62c - */ 0, + /* 62d - */ 0, + /* 62e - _0F_0F_8E */ 0x235f, + /* 62f - */ 0, + /* 630 - _0F_0F_90 */ 0x2360, + /* 631 - */ 0, + /* 632 - */ 0, + /* 633 - */ 0, + /* 634 - _0F_0F_94 */ 0x2361, + /* 635 - */ 0, + /* 636 - _0F_0F_96 */ 0x2362, + /* 637 - _0F_0F_97 */ 0x2363, + /* 638 - */ 0, + /* 639 - */ 0, + /* 63a - _0F_0F_9A */ 0x2364, + /* 63b - */ 0, + /* 63c - */ 0, + /* 63d - */ 0, + /* 63e - _0F_0F_9E */ 0x2365, + /* 63f - */ 0, + /* 640 - _0F_0F_A0 */ 0x2366, + /* 641 - */ 0, + /* 642 - */ 0, + /* 643 - */ 0, + /* 644 - _0F_0F_A4 */ 0x2367, + /* 645 - */ 0, + /* 646 - _0F_0F_A6 */ 0x2368, + /* 647 - _0F_0F_A7 */ 0x2369, + /* 648 - */ 0, + /* 649 - */ 0, + /* 64a - _0F_0F_AA */ 0x236a, + /* 64b - */ 0, + /* 64c - */ 0, + /* 64d - */ 0, + /* 64e - _0F_0F_AE */ 0x236b, + /* 64f - */ 0, + /* 650 - _0F_0F_B0 */ 0x236c, + /* 651 - */ 0, + /* 652 - */ 0, + /* 653 - */ 0, + /* 654 - _0F_0F_B4 */ 0x236d, + /* 655 - */ 0, + /* 656 - _0F_0F_B6 */ 0x236e, + /* 657 - _0F_0F_B7 */ 0x236f, + /* 658 - */ 0, + /* 659 - */ 0, + /* 65a - */ 0, + /* 65b - _0F_0F_BB */ 0x2370, + /* 65c - */ 0, + /* 65d - */ 0, + /* 65e - */ 0, + /* 65f - _0F_0F_BF */ 0x2371, + /* 660 - */ 0, + /* 661 - */ 0, + /* 662 - */ 0, + /* 663 - */ 0, + /* 664 - */ 0, + /* 665 - */ 0, + /* 666 - */ 0, + /* 667 - */ 0, + /* 668 - */ 0, + /* 669 - */ 0, + /* 66a - */ 0, + /* 66b - */ 0, + /* 66c - */ 0, + /* 66d - */ 0, + /* 66e - */ 0, + /* 66f - */ 0, + /* 670 - */ 0, + /* 671 - */ 0, + /* 672 - */ 0, + /* 673 - */ 0, + /* 674 - */ 0, + /* 675 - */ 0, + /* 676 - */ 0, + /* 677 - */ 0, + /* 678 - */ 0, + /* 679 - */ 0, + /* 67a - */ 0, + /* 67b - */ 0, + /* 67c - */ 0, + /* 67d - */ 0, + /* 67e - */ 0, + /* 67f - */ 0, + /* 680 - */ 0, + /* 681 - */ 0, + /* 682 - */ 0, + /* 683 - */ 0, + /* 684 - */ 0, + /* 685 - */ 0, + /* 686 - */ 0, + /* 687 - */ 0, + /* 688 - */ 0, + /* 689 - */ 0, + /* 68a - */ 0, + /* 68b - */ 0, + /* 68c - */ 0, + /* 68d - */ 0, + /* 68e - */ 0, + /* 68f - */ 0, + /* 690 - */ 0, + /* 691 - */ 0, + /* 692 - */ 0, + /* 693 - */ 0, + /* 694 - */ 0, + /* 695 - */ 0, + /* 696 - */ 0, + /* 697 - */ 0, + /* 698 - */ 0, + /* 699 - */ 0, + /* 69a - */ 0, + /* 69b - */ 0, + /* 69c - */ 0, + /* 69d - */ 0, + /* 69e - */ 0, + /* 69f - */ 0, + /* 6a0 - _0F_10 */ 0x2372, + /* 6a1 - _66_0F_10 */ 0x2373, + /* 6a2 - _F3_0F_10 */ 0x2374, + /* 6a3 - _F2_0F_10 */ 0x2375, + /* 6a4 - _V_0F_10 */ 0x4009, + /* 6a5 - _V_66_0F_10 */ 0x400a, + /* 6a6 - _V_F3_0F_10 */ 0x400b, + /* 6a7 - _V_F2_0F_10 */ 0x400c, + /* 6a8 - */ 0, + /* 6a9 - */ 0, + /* 6aa - _VRR_F3_0F_10 */ 0x400d, + /* 6ab - _VRR_F2_0F_10 */ 0x400e, + /* 6ac - _0F_11 */ 0x2376, + /* 6ad - _66_0F_11 */ 0x2377, + /* 6ae - _F3_0F_11 */ 0x2378, + /* 6af - _F2_0F_11 */ 0x2379, + /* 6b0 - _V_0F_11 */ 0x400f, + /* 6b1 - _V_66_0F_11 */ 0x4010, + /* 6b2 - _V_F3_0F_11 */ 0x4011, + /* 6b3 - _V_F2_0F_11 */ 0x4012, + /* 6b4 - */ 0, + /* 6b5 - */ 0, + /* 6b6 - _VRR_F3_0F_11 */ 0x4013, + /* 6b7 - _VRR_F2_0F_11 */ 0x4014, + /* 6b8 - _0F_12 */ 0x4015, + /* 6b9 - _66_0F_12 */ 0x237a, + /* 6ba - _F3_0F_12 */ 0x237b, + /* 6bb - _F2_0F_12 */ 0x237c, + /* 6bc - _V_0F_12 */ 0x4016, + /* 6bd - _V_66_0F_12 */ 0x4017, + /* 6be - _V_F3_0F_12 */ 0x4018, + /* 6bf - _V_F2_0F_12 */ 0x4019, + /* 6c0 - */ 0, + /* 6c1 - */ 0, + /* 6c2 - */ 0, + /* 6c3 - */ 0, + /* 6c4 - _0F_13 */ 0x237d, + /* 6c5 - _66_0F_13 */ 0x237e, + /* 6c6 - */ 0, + /* 6c7 - */ 0, + /* 6c8 - _V_0F_13 */ 0x401a, + /* 6c9 - _V_66_0F_13 */ 0x401b, + /* 6ca - */ 0, + /* 6cb - */ 0, + /* 6cc - */ 0, + /* 6cd - */ 0, + /* 6ce - */ 0, + /* 6cf - */ 0, + /* 6d0 - _0F_14 */ 0x237f, + /* 6d1 - _66_0F_14 */ 0x2380, + /* 6d2 - */ 0, + /* 6d3 - */ 0, + /* 6d4 - _V_0F_14 */ 0x401c, + /* 6d5 - _V_66_0F_14 */ 0x401d, + /* 6d6 - */ 0, + /* 6d7 - */ 0, + /* 6d8 - */ 0, + /* 6d9 - */ 0, + /* 6da - */ 0, + /* 6db - */ 0, + /* 6dc - _0F_15 */ 0x2381, + /* 6dd - _66_0F_15 */ 0x2382, + /* 6de - */ 0, + /* 6df - */ 0, + /* 6e0 - _V_0F_15 */ 0x401e, + /* 6e1 - _V_66_0F_15 */ 0x401f, + /* 6e2 - */ 0, + /* 6e3 - */ 0, + /* 6e4 - */ 0, + /* 6e5 - */ 0, + /* 6e6 - */ 0, + /* 6e7 - */ 0, + /* 6e8 - _0F_16 */ 0x4020, + /* 6e9 - _66_0F_16 */ 0x2383, + /* 6ea - _F3_0F_16 */ 0x2384, + /* 6eb - */ 0, + /* 6ec - _V_0F_16 */ 0x4021, + /* 6ed - _V_66_0F_16 */ 0x4022, + /* 6ee - _V_F3_0F_16 */ 0x4023, + /* 6ef - */ 0, + /* 6f0 - */ 0, + /* 6f1 - */ 0, + /* 6f2 - */ 0, + /* 6f3 - */ 0, + /* 6f4 - _0F_17 */ 0x2385, + /* 6f5 - _66_0F_17 */ 0x2386, + /* 6f6 - */ 0, + /* 6f7 - */ 0, + /* 6f8 - _V_0F_17 */ 0x4024, + /* 6f9 - _V_66_0F_17 */ 0x4025, + /* 6fa - */ 0, + /* 6fb - */ 0, + /* 6fc - */ 0, + /* 6fd - */ 0, + /* 6fe - */ 0, + /* 6ff - */ 0, + /* 700 - _0F_18_00 */ 0x2387, + /* 701 - _0F_18_01 */ 0x2388, + /* 702 - _0F_18_02 */ 0x2389, + /* 703 - _0F_18_03 */ 0x238a, + /* 704 - */ 0, + /* 705 - */ 0, + /* 706 - */ 0, + /* 707 - */ 0, + /* 708 - _0F_28 */ 0x238b, + /* 709 - _66_0F_28 */ 0x238c, + /* 70a - */ 0, + /* 70b - */ 0, + /* 70c - _V_0F_28 */ 0x4026, + /* 70d - _V_66_0F_28 */ 0x4027, + /* 70e - */ 0, + /* 70f - */ 0, + /* 710 - */ 0, + /* 711 - */ 0, + /* 712 - */ 0, + /* 713 - */ 0, + /* 714 - _0F_29 */ 0x238d, + /* 715 - _66_0F_29 */ 0x238e, + /* 716 - */ 0, + /* 717 - */ 0, + /* 718 - _V_0F_29 */ 0x4028, + /* 719 - _V_66_0F_29 */ 0x4029, + /* 71a - */ 0, + /* 71b - */ 0, + /* 71c - */ 0, + /* 71d - */ 0, + /* 71e - */ 0, + /* 71f - */ 0, + /* 720 - _0F_2A */ 0x238f, + /* 721 - _66_0F_2A */ 0x2390, + /* 722 - _F3_0F_2A */ 0x2391, + /* 723 - _F2_0F_2A */ 0x2392, + /* 724 - */ 0, + /* 725 - */ 0, + /* 726 - _V_F3_0F_2A */ 0x402a, + /* 727 - _V_F2_0F_2A */ 0x402b, + /* 728 - */ 0, + /* 729 - */ 0, + /* 72a - */ 0, + /* 72b - */ 0, + /* 72c - _0F_2B */ 0x2393, + /* 72d - _66_0F_2B */ 0x2394, + /* 72e - _F3_0F_2B */ 0x2395, + /* 72f - _F2_0F_2B */ 0x2396, + /* 730 - _V_0F_2B */ 0x402c, + /* 731 - _V_66_0F_2B */ 0x402d, + /* 732 - */ 0, + /* 733 - */ 0, + /* 734 - */ 0, + /* 735 - */ 0, + /* 736 - */ 0, + /* 737 - */ 0, + /* 738 - _0F_2C */ 0x2397, + /* 739 - _66_0F_2C */ 0x2398, + /* 73a - _F3_0F_2C */ 0x2399, + /* 73b - _F2_0F_2C */ 0x239a, + /* 73c - */ 0, + /* 73d - */ 0, + /* 73e - _V_F3_0F_2C */ 0x402e, + /* 73f - _V_F2_0F_2C */ 0x402f, + /* 740 - */ 0, + /* 741 - */ 0, + /* 742 - */ 0, + /* 743 - */ 0, + /* 744 - _0F_2D */ 0x239b, + /* 745 - _66_0F_2D */ 0x239c, + /* 746 - _F3_0F_2D */ 0x239d, + /* 747 - _F2_0F_2D */ 0x239e, + /* 748 - */ 0, + /* 749 - */ 0, + /* 74a - _V_F3_0F_2D */ 0x4030, + /* 74b - _V_F2_0F_2D */ 0x4031, + /* 74c - */ 0, + /* 74d - */ 0, + /* 74e - */ 0, + /* 74f - */ 0, + /* 750 - _0F_2E */ 0x239f, + /* 751 - _66_0F_2E */ 0x23a0, + /* 752 - */ 0, + /* 753 - */ 0, + /* 754 - _V_0F_2E */ 0x4032, + /* 755 - _V_66_0F_2E */ 0x4033, + /* 756 - */ 0, + /* 757 - */ 0, + /* 758 - */ 0, + /* 759 - */ 0, + /* 75a - */ 0, + /* 75b - */ 0, + /* 75c - _0F_2F */ 0x23a1, + /* 75d - _66_0F_2F */ 0x23a2, + /* 75e - */ 0, + /* 75f - */ 0, + /* 760 - _V_0F_2F */ 0x4034, + /* 761 - _V_66_0F_2F */ 0x4035, + /* 762 - */ 0, + /* 763 - */ 0, + /* 764 - */ 0, + /* 765 - */ 0, + /* 766 - */ 0, + /* 767 - */ 0, + /* 768 - _0F_38_00 */ 0xcf78, + /* 769 - _0F_38_01 */ 0xcf84, + /* 76a - _0F_38_02 */ 0xcf90, + /* 76b - _0F_38_03 */ 0xcf9c, + /* 76c - _0F_38_04 */ 0xcfa8, + /* 76d - _0F_38_05 */ 0xcfb4, + /* 76e - _0F_38_06 */ 0xcfc0, + /* 76f - _0F_38_07 */ 0xcfcc, + /* 770 - _0F_38_08 */ 0xcfd8, + /* 771 - _0F_38_09 */ 0xcfe4, + /* 772 - _0F_38_0A */ 0xcff0, + /* 773 - _0F_38_0B */ 0xcffc, + /* 774 - _0F_38_0C */ 0xd008, + /* 775 - _0F_38_0D */ 0xd014, + /* 776 - _0F_38_0E */ 0xd020, + /* 777 - _0F_38_0F */ 0xd02c, + /* 778 - _0F_38_10 */ 0xd038, + /* 779 - */ 0, + /* 77a - */ 0, + /* 77b - */ 0, + /* 77c - _0F_38_14 */ 0xd044, + /* 77d - _0F_38_15 */ 0xd050, + /* 77e - */ 0, + /* 77f - _0F_38_17 */ 0xd05c, + /* 780 - _0F_38_18 */ 0xd068, + /* 781 - _0F_38_19 */ 0xd074, + /* 782 - _0F_38_1A */ 0xd080, + /* 783 - */ 0, + /* 784 - _0F_38_1C */ 0xd08c, + /* 785 - _0F_38_1D */ 0xd098, + /* 786 - _0F_38_1E */ 0xd0a4, + /* 787 - */ 0, + /* 788 - _0F_38_20 */ 0xd0b0, + /* 789 - _0F_38_21 */ 0xd0bc, + /* 78a - _0F_38_22 */ 0xd0c8, + /* 78b - _0F_38_23 */ 0xd0d4, + /* 78c - _0F_38_24 */ 0xd0e0, + /* 78d - _0F_38_25 */ 0xd0ec, + /* 78e - */ 0, + /* 78f - */ 0, + /* 790 - _0F_38_28 */ 0xd0f8, + /* 791 - _0F_38_29 */ 0xd104, + /* 792 - _0F_38_2A */ 0xd110, + /* 793 - _0F_38_2B */ 0xd11c, + /* 794 - _0F_38_2C */ 0xd128, + /* 795 - _0F_38_2D */ 0xd134, + /* 796 - _0F_38_2E */ 0xd140, + /* 797 - _0F_38_2F */ 0xd14c, + /* 798 - _0F_38_30 */ 0xd158, + /* 799 - _0F_38_31 */ 0xd164, + /* 79a - _0F_38_32 */ 0xd170, + /* 79b - _0F_38_33 */ 0xd17c, + /* 79c - _0F_38_34 */ 0xd188, + /* 79d - _0F_38_35 */ 0xd194, + /* 79e - */ 0, + /* 79f - _0F_38_37 */ 0xd1a0, + /* 7a0 - _0F_38_38 */ 0xd1ac, + /* 7a1 - _0F_38_39 */ 0xd1b8, + /* 7a2 - _0F_38_3A */ 0xd1c4, + /* 7a3 - _0F_38_3B */ 0xd1d0, + /* 7a4 - _0F_38_3C */ 0xd1dc, + /* 7a5 - _0F_38_3D */ 0xd1e8, + /* 7a6 - _0F_38_3E */ 0xd1f4, + /* 7a7 - _0F_38_3F */ 0xd200, + /* 7a8 - _0F_38_40 */ 0xd20c, + /* 7a9 - _0F_38_41 */ 0xd218, + /* 7aa - */ 0, + /* 7ab - */ 0, + /* 7ac - */ 0, + /* 7ad - */ 0, + /* 7ae - */ 0, + /* 7af - */ 0, + /* 7b0 - */ 0, + /* 7b1 - */ 0, + /* 7b2 - */ 0, + /* 7b3 - */ 0, + /* 7b4 - */ 0, + /* 7b5 - */ 0, + /* 7b6 - */ 0, + /* 7b7 - */ 0, + /* 7b8 - */ 0, + /* 7b9 - */ 0, + /* 7ba - */ 0, + /* 7bb - */ 0, + /* 7bc - */ 0, + /* 7bd - */ 0, + /* 7be - */ 0, + /* 7bf - */ 0, + /* 7c0 - */ 0, + /* 7c1 - */ 0, + /* 7c2 - */ 0, + /* 7c3 - */ 0, + /* 7c4 - */ 0, + /* 7c5 - */ 0, + /* 7c6 - */ 0, + /* 7c7 - */ 0, + /* 7c8 - */ 0, + /* 7c9 - */ 0, + /* 7ca - */ 0, + /* 7cb - */ 0, + /* 7cc - */ 0, + /* 7cd - */ 0, + /* 7ce - */ 0, + /* 7cf - */ 0, + /* 7d0 - */ 0, + /* 7d1 - */ 0, + /* 7d2 - */ 0, + /* 7d3 - */ 0, + /* 7d4 - */ 0, + /* 7d5 - */ 0, + /* 7d6 - */ 0, + /* 7d7 - */ 0, + /* 7d8 - */ 0, + /* 7d9 - */ 0, + /* 7da - */ 0, + /* 7db - */ 0, + /* 7dc - */ 0, + /* 7dd - */ 0, + /* 7de - */ 0, + /* 7df - */ 0, + /* 7e0 - */ 0, + /* 7e1 - */ 0, + /* 7e2 - */ 0, + /* 7e3 - */ 0, + /* 7e4 - */ 0, + /* 7e5 - */ 0, + /* 7e6 - */ 0, + /* 7e7 - */ 0, + /* 7e8 - _0F_38_80 */ 0xd224, + /* 7e9 - _0F_38_81 */ 0xd230, + /* 7ea - _0F_38_82 */ 0xd23c, + /* 7eb - */ 0, + /* 7ec - */ 0, + /* 7ed - */ 0, + /* 7ee - */ 0, + /* 7ef - */ 0, + /* 7f0 - */ 0, + /* 7f1 - */ 0, + /* 7f2 - */ 0, + /* 7f3 - */ 0, + /* 7f4 - */ 0, + /* 7f5 - */ 0, + /* 7f6 - */ 0, + /* 7f7 - */ 0, + /* 7f8 - */ 0, + /* 7f9 - */ 0, + /* 7fa - */ 0, + /* 7fb - */ 0, + /* 7fc - */ 0, + /* 7fd - */ 0, + /* 7fe - _0F_38_96 */ 0xd248, + /* 7ff - _0F_38_97 */ 0xd254, + /* 800 - _0F_38_98 */ 0xd260, + /* 801 - _0F_38_99 */ 0xd26c, + /* 802 - _0F_38_9A */ 0xd278, + /* 803 - _0F_38_9B */ 0xd284, + /* 804 - _0F_38_9C */ 0xd290, + /* 805 - _0F_38_9D */ 0xd29c, + /* 806 - _0F_38_9E */ 0xd2a8, + /* 807 - _0F_38_9F */ 0xd2b4, + /* 808 - */ 0, + /* 809 - */ 0, + /* 80a - */ 0, + /* 80b - */ 0, + /* 80c - */ 0, + /* 80d - */ 0, + /* 80e - _0F_38_A6 */ 0xd2c0, + /* 80f - _0F_38_A7 */ 0xd2cc, + /* 810 - _0F_38_A8 */ 0xd2d8, + /* 811 - _0F_38_A9 */ 0xd2e4, + /* 812 - _0F_38_AA */ 0xd2f0, + /* 813 - _0F_38_AB */ 0xd2fc, + /* 814 - _0F_38_AC */ 0xd308, + /* 815 - _0F_38_AD */ 0xd314, + /* 816 - _0F_38_AE */ 0xd320, + /* 817 - _0F_38_AF */ 0xd32c, + /* 818 - */ 0, + /* 819 - */ 0, + /* 81a - */ 0, + /* 81b - */ 0, + /* 81c - */ 0, + /* 81d - */ 0, + /* 81e - _0F_38_B6 */ 0xd338, + /* 81f - _0F_38_B7 */ 0xd344, + /* 820 - _0F_38_B8 */ 0xd350, + /* 821 - _0F_38_B9 */ 0xd35c, + /* 822 - _0F_38_BA */ 0xd368, + /* 823 - _0F_38_BB */ 0xd374, + /* 824 - _0F_38_BC */ 0xd380, + /* 825 - _0F_38_BD */ 0xd38c, + /* 826 - _0F_38_BE */ 0xd398, + /* 827 - _0F_38_BF */ 0xd3a4, + /* 828 - */ 0, + /* 829 - */ 0, + /* 82a - */ 0, + /* 82b - */ 0, + /* 82c - */ 0, + /* 82d - */ 0, + /* 82e - */ 0, + /* 82f - */ 0, + /* 830 - */ 0, + /* 831 - */ 0, + /* 832 - */ 0, + /* 833 - */ 0, + /* 834 - */ 0, + /* 835 - */ 0, + /* 836 - */ 0, + /* 837 - */ 0, + /* 838 - */ 0, + /* 839 - */ 0, + /* 83a - */ 0, + /* 83b - */ 0, + /* 83c - */ 0, + /* 83d - */ 0, + /* 83e - */ 0, + /* 83f - */ 0, + /* 840 - */ 0, + /* 841 - */ 0, + /* 842 - */ 0, + /* 843 - _0F_38_DB */ 0xd3b0, + /* 844 - _0F_38_DC */ 0xd3bc, + /* 845 - _0F_38_DD */ 0xd3c8, + /* 846 - _0F_38_DE */ 0xd3d4, + /* 847 - _0F_38_DF */ 0xd3e0, + /* 848 - */ 0, + /* 849 - */ 0, + /* 84a - */ 0, + /* 84b - */ 0, + /* 84c - */ 0, + /* 84d - */ 0, + /* 84e - */ 0, + /* 84f - */ 0, + /* 850 - */ 0, + /* 851 - */ 0, + /* 852 - */ 0, + /* 853 - */ 0, + /* 854 - */ 0, + /* 855 - */ 0, + /* 856 - */ 0, + /* 857 - */ 0, + /* 858 - _0F_38_F0 */ 0xd3ec, + /* 859 - _0F_38_F1 */ 0xd3f8, + /* 85a - */ 0, + /* 85b - */ 0, + /* 85c - */ 0, + /* 85d - */ 0, + /* 85e - */ 0, + /* 85f - */ 0, + /* 860 - */ 0, + /* 861 - */ 0, + /* 862 - */ 0, + /* 863 - */ 0, + /* 864 - */ 0, + /* 865 - */ 0, + /* 866 - */ 0, + /* 867 - */ 0, + /* 868 - */ 0, + /* 869 - */ 0, + /* 86a - */ 0, + /* 86b - */ 0, + /* 86c - _0F_3A_04 */ 0xd404, + /* 86d - _0F_3A_05 */ 0xd410, + /* 86e - _0F_3A_06 */ 0xd41c, + /* 86f - */ 0, + /* 870 - _0F_3A_08 */ 0xd428, + /* 871 - _0F_3A_09 */ 0xd434, + /* 872 - _0F_3A_0A */ 0xd440, + /* 873 - _0F_3A_0B */ 0xd44c, + /* 874 - _0F_3A_0C */ 0xd458, + /* 875 - _0F_3A_0D */ 0xd464, + /* 876 - _0F_3A_0E */ 0xd470, + /* 877 - _0F_3A_0F */ 0xd47c, + /* 878 - */ 0, + /* 879 - */ 0, + /* 87a - */ 0, + /* 87b - */ 0, + /* 87c - _0F_3A_14 */ 0xd488, + /* 87d - _0F_3A_15 */ 0xd494, + /* 87e - _0F_3A_16 */ 0xd4a0, + /* 87f - _0F_3A_17 */ 0xd4ac, + /* 880 - _0F_3A_18 */ 0xd4b8, + /* 881 - _0F_3A_19 */ 0xd4c4, + /* 882 - */ 0, + /* 883 - */ 0, + /* 884 - */ 0, + /* 885 - */ 0, + /* 886 - */ 0, + /* 887 - */ 0, + /* 888 - _0F_3A_20 */ 0xd4d0, + /* 889 - _0F_3A_21 */ 0xd4dc, + /* 88a - _0F_3A_22 */ 0xd4e8, + /* 88b - */ 0, + /* 88c - */ 0, + /* 88d - */ 0, + /* 88e - */ 0, + /* 88f - */ 0, + /* 890 - */ 0, + /* 891 - */ 0, + /* 892 - */ 0, + /* 893 - */ 0, + /* 894 - */ 0, + /* 895 - */ 0, + /* 896 - */ 0, + /* 897 - */ 0, + /* 898 - */ 0, + /* 899 - */ 0, + /* 89a - */ 0, + /* 89b - */ 0, + /* 89c - */ 0, + /* 89d - */ 0, + /* 89e - */ 0, + /* 89f - */ 0, + /* 8a0 - */ 0, + /* 8a1 - */ 0, + /* 8a2 - */ 0, + /* 8a3 - */ 0, + /* 8a4 - */ 0, + /* 8a5 - */ 0, + /* 8a6 - */ 0, + /* 8a7 - */ 0, + /* 8a8 - _0F_3A_40 */ 0xd4f4, + /* 8a9 - _0F_3A_41 */ 0xd500, + /* 8aa - _0F_3A_42 */ 0xd50c, + /* 8ab - */ 0, + /* 8ac - _0F_3A_44 */ 0xd518, + /* 8ad - */ 0, + /* 8ae - */ 0, + /* 8af - */ 0, + /* 8b0 - */ 0, + /* 8b1 - */ 0, + /* 8b2 - _0F_3A_4A */ 0xd524, + /* 8b3 - _0F_3A_4B */ 0xd530, + /* 8b4 - _0F_3A_4C */ 0xd53c, + /* 8b5 - */ 0, + /* 8b6 - */ 0, + /* 8b7 - */ 0, + /* 8b8 - */ 0, + /* 8b9 - */ 0, + /* 8ba - */ 0, + /* 8bb - */ 0, + /* 8bc - */ 0, + /* 8bd - */ 0, + /* 8be - */ 0, + /* 8bf - */ 0, + /* 8c0 - */ 0, + /* 8c1 - */ 0, + /* 8c2 - */ 0, + /* 8c3 - */ 0, + /* 8c4 - */ 0, + /* 8c5 - */ 0, + /* 8c6 - */ 0, + /* 8c7 - */ 0, + /* 8c8 - _0F_3A_60 */ 0xd548, + /* 8c9 - _0F_3A_61 */ 0xd554, + /* 8ca - _0F_3A_62 */ 0xd560, + /* 8cb - _0F_3A_63 */ 0xd56c, + /* 8cc - */ 0, + /* 8cd - */ 0, + /* 8ce - */ 0, + /* 8cf - */ 0, + /* 8d0 - */ 0, + /* 8d1 - */ 0, + /* 8d2 - */ 0, + /* 8d3 - */ 0, + /* 8d4 - */ 0, + /* 8d5 - */ 0, + /* 8d6 - */ 0, + /* 8d7 - */ 0, + /* 8d8 - */ 0, + /* 8d9 - */ 0, + /* 8da - */ 0, + /* 8db - */ 0, + /* 8dc - */ 0, + /* 8dd - */ 0, + /* 8de - */ 0, + /* 8df - */ 0, + /* 8e0 - */ 0, + /* 8e1 - */ 0, + /* 8e2 - */ 0, + /* 8e3 - */ 0, + /* 8e4 - */ 0, + /* 8e5 - */ 0, + /* 8e6 - */ 0, + /* 8e7 - */ 0, + /* 8e8 - */ 0, + /* 8e9 - */ 0, + /* 8ea - */ 0, + /* 8eb - */ 0, + /* 8ec - */ 0, + /* 8ed - */ 0, + /* 8ee - */ 0, + /* 8ef - */ 0, + /* 8f0 - */ 0, + /* 8f1 - */ 0, + /* 8f2 - */ 0, + /* 8f3 - */ 0, + /* 8f4 - */ 0, + /* 8f5 - */ 0, + /* 8f6 - */ 0, + /* 8f7 - */ 0, + /* 8f8 - */ 0, + /* 8f9 - */ 0, + /* 8fa - */ 0, + /* 8fb - */ 0, + /* 8fc - */ 0, + /* 8fd - */ 0, + /* 8fe - */ 0, + /* 8ff - */ 0, + /* 900 - */ 0, + /* 901 - */ 0, + /* 902 - */ 0, + /* 903 - */ 0, + /* 904 - */ 0, + /* 905 - */ 0, + /* 906 - */ 0, + /* 907 - */ 0, + /* 908 - */ 0, + /* 909 - */ 0, + /* 90a - */ 0, + /* 90b - */ 0, + /* 90c - */ 0, + /* 90d - */ 0, + /* 90e - */ 0, + /* 90f - */ 0, + /* 910 - */ 0, + /* 911 - */ 0, + /* 912 - */ 0, + /* 913 - */ 0, + /* 914 - */ 0, + /* 915 - */ 0, + /* 916 - */ 0, + /* 917 - */ 0, + /* 918 - */ 0, + /* 919 - */ 0, + /* 91a - */ 0, + /* 91b - */ 0, + /* 91c - */ 0, + /* 91d - */ 0, + /* 91e - */ 0, + /* 91f - */ 0, + /* 920 - */ 0, + /* 921 - */ 0, + /* 922 - */ 0, + /* 923 - */ 0, + /* 924 - */ 0, + /* 925 - */ 0, + /* 926 - */ 0, + /* 927 - */ 0, + /* 928 - */ 0, + /* 929 - */ 0, + /* 92a - */ 0, + /* 92b - */ 0, + /* 92c - */ 0, + /* 92d - */ 0, + /* 92e - */ 0, + /* 92f - */ 0, + /* 930 - */ 0, + /* 931 - */ 0, + /* 932 - */ 0, + /* 933 - */ 0, + /* 934 - */ 0, + /* 935 - */ 0, + /* 936 - */ 0, + /* 937 - */ 0, + /* 938 - */ 0, + /* 939 - */ 0, + /* 93a - */ 0, + /* 93b - */ 0, + /* 93c - */ 0, + /* 93d - */ 0, + /* 93e - */ 0, + /* 93f - */ 0, + /* 940 - */ 0, + /* 941 - */ 0, + /* 942 - */ 0, + /* 943 - */ 0, + /* 944 - */ 0, + /* 945 - */ 0, + /* 946 - */ 0, + /* 947 - _0F_3A_DF */ 0xd578, + /* 948 - */ 0, + /* 949 - */ 0, + /* 94a - */ 0, + /* 94b - */ 0, + /* 94c - */ 0, + /* 94d - */ 0, + /* 94e - */ 0, + /* 94f - */ 0, + /* 950 - */ 0, + /* 951 - */ 0, + /* 952 - */ 0, + /* 953 - */ 0, + /* 954 - */ 0, + /* 955 - */ 0, + /* 956 - */ 0, + /* 957 - */ 0, + /* 958 - */ 0, + /* 959 - */ 0, + /* 95a - */ 0, + /* 95b - */ 0, + /* 95c - */ 0, + /* 95d - */ 0, + /* 95e - */ 0, + /* 95f - */ 0, + /* 960 - */ 0, + /* 961 - */ 0, + /* 962 - */ 0, + /* 963 - */ 0, + /* 964 - */ 0, + /* 965 - */ 0, + /* 966 - */ 0, + /* 967 - */ 0, + /* 968 - _0F_50 */ 0x23a3, + /* 969 - _66_0F_50 */ 0x23a4, + /* 96a - */ 0, + /* 96b - */ 0, + /* 96c - _V_0F_50 */ 0x4036, + /* 96d - _V_66_0F_50 */ 0x4037, + /* 96e - */ 0, + /* 96f - */ 0, + /* 970 - */ 0, + /* 971 - */ 0, + /* 972 - */ 0, + /* 973 - */ 0, + /* 974 - _0F_51 */ 0x23a5, + /* 975 - _66_0F_51 */ 0x23a6, + /* 976 - _F3_0F_51 */ 0x23a7, + /* 977 - _F2_0F_51 */ 0x23a8, + /* 978 - _V_0F_51 */ 0x4038, + /* 979 - _V_66_0F_51 */ 0x4039, + /* 97a - _V_F3_0F_51 */ 0x403a, + /* 97b - _V_F2_0F_51 */ 0x403b, + /* 97c - */ 0, + /* 97d - */ 0, + /* 97e - */ 0, + /* 97f - */ 0, + /* 980 - _0F_52 */ 0x23a9, + /* 981 - */ 0, + /* 982 - _F3_0F_52 */ 0x23aa, + /* 983 - */ 0, + /* 984 - _V_0F_52 */ 0x403c, + /* 985 - */ 0, + /* 986 - _V_F3_0F_52 */ 0x403d, + /* 987 - */ 0, + /* 988 - */ 0, + /* 989 - */ 0, + /* 98a - */ 0, + /* 98b - */ 0, + /* 98c - _0F_53 */ 0x23ab, + /* 98d - */ 0, + /* 98e - _F3_0F_53 */ 0x23ac, + /* 98f - */ 0, + /* 990 - _V_0F_53 */ 0x403e, + /* 991 - */ 0, + /* 992 - _V_F3_0F_53 */ 0x403f, + /* 993 - */ 0, + /* 994 - */ 0, + /* 995 - */ 0, + /* 996 - */ 0, + /* 997 - */ 0, + /* 998 - _0F_54 */ 0x23ad, + /* 999 - _66_0F_54 */ 0x23ae, + /* 99a - */ 0, + /* 99b - */ 0, + /* 99c - _V_0F_54 */ 0x4040, + /* 99d - _V_66_0F_54 */ 0x4041, + /* 99e - */ 0, + /* 99f - */ 0, + /* 9a0 - */ 0, + /* 9a1 - */ 0, + /* 9a2 - */ 0, + /* 9a3 - */ 0, + /* 9a4 - _0F_55 */ 0x23af, + /* 9a5 - _66_0F_55 */ 0x23b0, + /* 9a6 - */ 0, + /* 9a7 - */ 0, + /* 9a8 - _V_0F_55 */ 0x4042, + /* 9a9 - _V_66_0F_55 */ 0x4043, + /* 9aa - */ 0, + /* 9ab - */ 0, + /* 9ac - */ 0, + /* 9ad - */ 0, + /* 9ae - */ 0, + /* 9af - */ 0, + /* 9b0 - _0F_56 */ 0x23b1, + /* 9b1 - _66_0F_56 */ 0x23b2, + /* 9b2 - */ 0, + /* 9b3 - */ 0, + /* 9b4 - _V_0F_56 */ 0x4044, + /* 9b5 - _V_66_0F_56 */ 0x4045, + /* 9b6 - */ 0, + /* 9b7 - */ 0, + /* 9b8 - */ 0, + /* 9b9 - */ 0, + /* 9ba - */ 0, + /* 9bb - */ 0, + /* 9bc - _0F_57 */ 0x23b3, + /* 9bd - _66_0F_57 */ 0x23b4, + /* 9be - */ 0, + /* 9bf - */ 0, + /* 9c0 - _V_0F_57 */ 0x4046, + /* 9c1 - _V_66_0F_57 */ 0x4047, + /* 9c2 - */ 0, + /* 9c3 - */ 0, + /* 9c4 - */ 0, + /* 9c5 - */ 0, + /* 9c6 - */ 0, + /* 9c7 - */ 0, + /* 9c8 - _0F_58 */ 0x23b5, + /* 9c9 - _66_0F_58 */ 0x23b6, + /* 9ca - _F3_0F_58 */ 0x23b7, + /* 9cb - _F2_0F_58 */ 0x23b8, + /* 9cc - _V_0F_58 */ 0x4048, + /* 9cd - _V_66_0F_58 */ 0x4049, + /* 9ce - _V_F3_0F_58 */ 0x404a, + /* 9cf - _V_F2_0F_58 */ 0x404b, + /* 9d0 - */ 0, + /* 9d1 - */ 0, + /* 9d2 - */ 0, + /* 9d3 - */ 0, + /* 9d4 - _0F_59 */ 0x23b9, + /* 9d5 - _66_0F_59 */ 0x23ba, + /* 9d6 - _F3_0F_59 */ 0x23bb, + /* 9d7 - _F2_0F_59 */ 0x23bc, + /* 9d8 - _V_0F_59 */ 0x404c, + /* 9d9 - _V_66_0F_59 */ 0x404d, + /* 9da - _V_F3_0F_59 */ 0x404e, + /* 9db - _V_F2_0F_59 */ 0x404f, + /* 9dc - */ 0, + /* 9dd - */ 0, + /* 9de - */ 0, + /* 9df - */ 0, + /* 9e0 - _0F_5A */ 0x23bd, + /* 9e1 - _66_0F_5A */ 0x23be, + /* 9e2 - _F3_0F_5A */ 0x23bf, + /* 9e3 - _F2_0F_5A */ 0x23c0, + /* 9e4 - _V_0F_5A */ 0x4050, + /* 9e5 - _V_66_0F_5A */ 0x4051, + /* 9e6 - _V_F3_0F_5A */ 0x4052, + /* 9e7 - _V_F2_0F_5A */ 0x4053, + /* 9e8 - */ 0, + /* 9e9 - */ 0, + /* 9ea - */ 0, + /* 9eb - */ 0, + /* 9ec - _0F_5B */ 0x23c1, + /* 9ed - _66_0F_5B */ 0x23c2, + /* 9ee - _F3_0F_5B */ 0x23c3, + /* 9ef - */ 0, + /* 9f0 - _V_0F_5B */ 0x4054, + /* 9f1 - _V_66_0F_5B */ 0x4055, + /* 9f2 - _V_F3_0F_5B */ 0x4056, + /* 9f3 - */ 0, + /* 9f4 - */ 0, + /* 9f5 - */ 0, + /* 9f6 - */ 0, + /* 9f7 - */ 0, + /* 9f8 - _0F_5C */ 0x23c4, + /* 9f9 - _66_0F_5C */ 0x23c5, + /* 9fa - _F3_0F_5C */ 0x23c6, + /* 9fb - _F2_0F_5C */ 0x23c7, + /* 9fc - _V_0F_5C */ 0x4057, + /* 9fd - _V_66_0F_5C */ 0x4058, + /* 9fe - _V_F3_0F_5C */ 0x4059, + /* 9ff - _V_F2_0F_5C */ 0x405a, + /* a00 - */ 0, + /* a01 - */ 0, + /* a02 - */ 0, + /* a03 - */ 0, + /* a04 - _0F_5D */ 0x23c8, + /* a05 - _66_0F_5D */ 0x23c9, + /* a06 - _F3_0F_5D */ 0x23ca, + /* a07 - _F2_0F_5D */ 0x23cb, + /* a08 - _V_0F_5D */ 0x405b, + /* a09 - _V_66_0F_5D */ 0x405c, + /* a0a - _V_F3_0F_5D */ 0x405d, + /* a0b - _V_F2_0F_5D */ 0x405e, + /* a0c - */ 0, + /* a0d - */ 0, + /* a0e - */ 0, + /* a0f - */ 0, + /* a10 - _0F_5E */ 0x23cc, + /* a11 - _66_0F_5E */ 0x23cd, + /* a12 - _F3_0F_5E */ 0x23ce, + /* a13 - _F2_0F_5E */ 0x23cf, + /* a14 - _V_0F_5E */ 0x405f, + /* a15 - _V_66_0F_5E */ 0x4060, + /* a16 - _V_F3_0F_5E */ 0x4061, + /* a17 - _V_F2_0F_5E */ 0x4062, + /* a18 - */ 0, + /* a19 - */ 0, + /* a1a - */ 0, + /* a1b - */ 0, + /* a1c - _0F_5F */ 0x23d0, + /* a1d - _66_0F_5F */ 0x23d1, + /* a1e - _F3_0F_5F */ 0x23d2, + /* a1f - _F2_0F_5F */ 0x23d3, + /* a20 - _V_0F_5F */ 0x4063, + /* a21 - _V_66_0F_5F */ 0x4064, + /* a22 - _V_F3_0F_5F */ 0x4065, + /* a23 - _V_F2_0F_5F */ 0x4066, + /* a24 - */ 0, + /* a25 - */ 0, + /* a26 - */ 0, + /* a27 - */ 0, + /* a28 - _0F_60 */ 0x23d4, + /* a29 - _66_0F_60 */ 0x23d5, + /* a2a - */ 0, + /* a2b - */ 0, + /* a2c - */ 0, + /* a2d - _V_66_0F_60 */ 0x4067, + /* a2e - */ 0, + /* a2f - */ 0, + /* a30 - */ 0, + /* a31 - */ 0, + /* a32 - */ 0, + /* a33 - */ 0, + /* a34 - _0F_61 */ 0x23d6, + /* a35 - _66_0F_61 */ 0x23d7, + /* a36 - */ 0, + /* a37 - */ 0, + /* a38 - */ 0, + /* a39 - _V_66_0F_61 */ 0x4068, + /* a3a - */ 0, + /* a3b - */ 0, + /* a3c - */ 0, + /* a3d - */ 0, + /* a3e - */ 0, + /* a3f - */ 0, + /* a40 - _0F_62 */ 0x23d8, + /* a41 - _66_0F_62 */ 0x23d9, + /* a42 - */ 0, + /* a43 - */ 0, + /* a44 - */ 0, + /* a45 - _V_66_0F_62 */ 0x4069, + /* a46 - */ 0, + /* a47 - */ 0, + /* a48 - */ 0, + /* a49 - */ 0, + /* a4a - */ 0, + /* a4b - */ 0, + /* a4c - _0F_63 */ 0x23da, + /* a4d - _66_0F_63 */ 0x23db, + /* a4e - */ 0, + /* a4f - */ 0, + /* a50 - */ 0, + /* a51 - _V_66_0F_63 */ 0x406a, + /* a52 - */ 0, + /* a53 - */ 0, + /* a54 - */ 0, + /* a55 - */ 0, + /* a56 - */ 0, + /* a57 - */ 0, + /* a58 - _0F_64 */ 0x23dc, + /* a59 - _66_0F_64 */ 0x23dd, + /* a5a - */ 0, + /* a5b - */ 0, + /* a5c - */ 0, + /* a5d - _V_66_0F_64 */ 0x406b, + /* a5e - */ 0, + /* a5f - */ 0, + /* a60 - */ 0, + /* a61 - */ 0, + /* a62 - */ 0, + /* a63 - */ 0, + /* a64 - _0F_65 */ 0x23de, + /* a65 - _66_0F_65 */ 0x23df, + /* a66 - */ 0, + /* a67 - */ 0, + /* a68 - */ 0, + /* a69 - _V_66_0F_65 */ 0x406c, + /* a6a - */ 0, + /* a6b - */ 0, + /* a6c - */ 0, + /* a6d - */ 0, + /* a6e - */ 0, + /* a6f - */ 0, + /* a70 - _0F_66 */ 0x23e0, + /* a71 - _66_0F_66 */ 0x23e1, + /* a72 - */ 0, + /* a73 - */ 0, + /* a74 - */ 0, + /* a75 - _V_66_0F_66 */ 0x406d, + /* a76 - */ 0, + /* a77 - */ 0, + /* a78 - */ 0, + /* a79 - */ 0, + /* a7a - */ 0, + /* a7b - */ 0, + /* a7c - _0F_67 */ 0x23e2, + /* a7d - _66_0F_67 */ 0x23e3, + /* a7e - */ 0, + /* a7f - */ 0, + /* a80 - */ 0, + /* a81 - _V_66_0F_67 */ 0x406e, + /* a82 - */ 0, + /* a83 - */ 0, + /* a84 - */ 0, + /* a85 - */ 0, + /* a86 - */ 0, + /* a87 - */ 0, + /* a88 - _0F_68 */ 0x23e4, + /* a89 - _66_0F_68 */ 0x23e5, + /* a8a - */ 0, + /* a8b - */ 0, + /* a8c - */ 0, + /* a8d - _V_66_0F_68 */ 0x406f, + /* a8e - */ 0, + /* a8f - */ 0, + /* a90 - */ 0, + /* a91 - */ 0, + /* a92 - */ 0, + /* a93 - */ 0, + /* a94 - _0F_69 */ 0x23e6, + /* a95 - _66_0F_69 */ 0x23e7, + /* a96 - */ 0, + /* a97 - */ 0, + /* a98 - */ 0, + /* a99 - _V_66_0F_69 */ 0x4070, + /* a9a - */ 0, + /* a9b - */ 0, + /* a9c - */ 0, + /* a9d - */ 0, + /* a9e - */ 0, + /* a9f - */ 0, + /* aa0 - _0F_6A */ 0x23e8, + /* aa1 - _66_0F_6A */ 0x23e9, + /* aa2 - */ 0, + /* aa3 - */ 0, + /* aa4 - */ 0, + /* aa5 - _V_66_0F_6A */ 0x4071, + /* aa6 - */ 0, + /* aa7 - */ 0, + /* aa8 - */ 0, + /* aa9 - */ 0, + /* aaa - */ 0, + /* aab - */ 0, + /* aac - _0F_6B */ 0x23ea, + /* aad - _66_0F_6B */ 0x23eb, + /* aae - */ 0, + /* aaf - */ 0, + /* ab0 - */ 0, + /* ab1 - _V_66_0F_6B */ 0x4072, + /* ab2 - */ 0, + /* ab3 - */ 0, + /* ab4 - */ 0, + /* ab5 - */ 0, + /* ab6 - */ 0, + /* ab7 - */ 0, + /* ab8 - */ 0, + /* ab9 - _66_0F_6C */ 0x23ec, + /* aba - */ 0, + /* abb - */ 0, + /* abc - */ 0, + /* abd - _V_66_0F_6C */ 0x4073, + /* abe - */ 0, + /* abf - */ 0, + /* ac0 - */ 0, + /* ac1 - */ 0, + /* ac2 - */ 0, + /* ac3 - */ 0, + /* ac4 - */ 0, + /* ac5 - _66_0F_6D */ 0x23ed, + /* ac6 - */ 0, + /* ac7 - */ 0, + /* ac8 - */ 0, + /* ac9 - _V_66_0F_6D */ 0x4074, + /* aca - */ 0, + /* acb - */ 0, + /* acc - */ 0, + /* acd - */ 0, + /* ace - */ 0, + /* acf - */ 0, + /* ad0 - _0F_6E */ 0x4075, + /* ad1 - _66_0F_6E */ 0x4076, + /* ad2 - */ 0, + /* ad3 - */ 0, + /* ad4 - */ 0, + /* ad5 - _V_66_0F_6E */ 0x4077, + /* ad6 - */ 0, + /* ad7 - */ 0, + /* ad8 - */ 0, + /* ad9 - */ 0, + /* ada - */ 0, + /* adb - */ 0, + /* adc - _0F_6F */ 0x23ee, + /* add - _66_0F_6F */ 0x23ef, + /* ade - _F3_0F_6F */ 0x23f0, + /* adf - */ 0, + /* ae0 - */ 0, + /* ae1 - _V_66_0F_6F */ 0x4078, + /* ae2 - _V_F3_0F_6F */ 0x4079, + /* ae3 - */ 0, + /* ae4 - */ 0, + /* ae5 - */ 0, + /* ae6 - */ 0, + /* ae7 - */ 0, + /* ae8 - _0F_70 */ 0x407a, + /* ae9 - _66_0F_70 */ 0x407b, + /* aea - _F3_0F_70 */ 0x407c, + /* aeb - _F2_0F_70 */ 0x407d, + /* aec - */ 0, + /* aed - _V_66_0F_70 */ 0x407e, + /* aee - _V_F3_0F_70 */ 0x407f, + /* aef - _V_F2_0F_70 */ 0x4080, + /* af0 - */ 0, + /* af1 - */ 0, + /* af2 - */ 0, + /* af3 - */ 0, + /* af4 - */ 0, + /* af5 - */ 0, + /* af6 - _0F_71_02 */ 0xd584, + /* af7 - */ 0, + /* af8 - _0F_71_04 */ 0xd590, + /* af9 - */ 0, + /* afa - _0F_71_06 */ 0xd59c, + /* afb - */ 0, + /* afc - */ 0, + /* afd - */ 0, + /* afe - _0F_72_02 */ 0xd5a8, + /* aff - */ 0, + /* b00 - _0F_72_04 */ 0xd5b4, + /* b01 - */ 0, + /* b02 - _0F_72_06 */ 0xd5c0, + /* b03 - */ 0, + /* b04 - */ 0, + /* b05 - */ 0, + /* b06 - _0F_73_02 */ 0xd5cc, + /* b07 - _0F_73_03 */ 0xd5d8, + /* b08 - */ 0, + /* b09 - */ 0, + /* b0a - _0F_73_06 */ 0xd5e4, + /* b0b - _0F_73_07 */ 0xd5f0, + /* b0c - _0F_74 */ 0x23f1, + /* b0d - _66_0F_74 */ 0x23f2, + /* b0e - */ 0, + /* b0f - */ 0, + /* b10 - */ 0, + /* b11 - _V_66_0F_74 */ 0x4081, + /* b12 - */ 0, + /* b13 - */ 0, + /* b14 - */ 0, + /* b15 - */ 0, + /* b16 - */ 0, + /* b17 - */ 0, + /* b18 - _0F_75 */ 0x23f3, + /* b19 - _66_0F_75 */ 0x23f4, + /* b1a - */ 0, + /* b1b - */ 0, + /* b1c - */ 0, + /* b1d - _V_66_0F_75 */ 0x4082, + /* b1e - */ 0, + /* b1f - */ 0, + /* b20 - */ 0, + /* b21 - */ 0, + /* b22 - */ 0, + /* b23 - */ 0, + /* b24 - _0F_76 */ 0x23f5, + /* b25 - _66_0F_76 */ 0x23f6, + /* b26 - */ 0, + /* b27 - */ 0, + /* b28 - */ 0, + /* b29 - _V_66_0F_76 */ 0x4083, + /* b2a - */ 0, + /* b2b - */ 0, + /* b2c - */ 0, + /* b2d - */ 0, + /* b2e - */ 0, + /* b2f - */ 0, + /* b30 - _0F_77 */ 0x23f7, + /* b31 - */ 0, + /* b32 - */ 0, + /* b33 - */ 0, + /* b34 - _V_0F_77 */ 0x4084, + /* b35 - */ 0, + /* b36 - */ 0, + /* b37 - */ 0, + /* b38 - */ 0, + /* b39 - */ 0, + /* b3a - */ 0, + /* b3b - */ 0, + /* b3c - _0F_78 */ 0x23f8, + /* b3d - _66_0F_78 */ 0x4085, + /* b3e - */ 0, + /* b3f - _F2_0F_78 */ 0x4086, + /* b40 - */ 0, + /* b41 - */ 0, + /* b42 - */ 0, + /* b43 - */ 0, + /* b44 - */ 0, + /* b45 - */ 0, + /* b46 - */ 0, + /* b47 - */ 0, + /* b48 - _0F_79 */ 0x23f9, + /* b49 - _66_0F_79 */ 0x23fa, + /* b4a - */ 0, + /* b4b - _F2_0F_79 */ 0x23fb, + /* b4c - */ 0, + /* b4d - */ 0, + /* b4e - */ 0, + /* b4f - */ 0, + /* b50 - */ 0, + /* b51 - */ 0, + /* b52 - */ 0, + /* b53 - */ 0, + /* b54 - */ 0, + /* b55 - */ 0, + /* b56 - */ 0, + /* b57 - */ 0, + /* b58 - */ 0, + /* b59 - */ 0, + /* b5a - */ 0, + /* b5b - */ 0, + /* b5c - */ 0, + /* b5d - */ 0, + /* b5e - */ 0, + /* b5f - */ 0, + /* b60 - */ 0, + /* b61 - */ 0, + /* b62 - */ 0, + /* b63 - */ 0, + /* b64 - */ 0, + /* b65 - */ 0, + /* b66 - */ 0, + /* b67 - */ 0, + /* b68 - */ 0, + /* b69 - */ 0, + /* b6a - */ 0, + /* b6b - */ 0, + /* b6c - */ 0, + /* b6d - */ 0, + /* b6e - */ 0, + /* b6f - */ 0, + /* b70 - */ 0, + /* b71 - */ 0, + /* b72 - */ 0, + /* b73 - */ 0, + /* b74 - */ 0, + /* b75 - */ 0, + /* b76 - */ 0, + /* b77 - */ 0, + /* b78 - */ 0, + /* b79 - */ 0, + /* b7a - */ 0, + /* b7b - */ 0, + /* b7c - */ 0, + /* b7d - */ 0, + /* b7e - */ 0, + /* b7f - */ 0, + /* b80 - */ 0, + /* b81 - */ 0, + /* b82 - */ 0, + /* b83 - */ 0, + /* b84 - _0F_7A_30 */ 0x23fc, + /* b85 - _0F_7A_31 */ 0x23fd, + /* b86 - */ 0, + /* b87 - */ 0, + /* b88 - */ 0, + /* b89 - */ 0, + /* b8a - */ 0, + /* b8b - */ 0, + /* b8c - */ 0, + /* b8d - */ 0, + /* b8e - */ 0, + /* b8f - */ 0, + /* b90 - */ 0, + /* b91 - */ 0, + /* b92 - */ 0, + /* b93 - */ 0, + /* b94 - */ 0, + /* b95 - */ 0, + /* b96 - */ 0, + /* b97 - */ 0, + /* b98 - */ 0, + /* b99 - */ 0, + /* b9a - */ 0, + /* b9b - */ 0, + /* b9c - */ 0, + /* b9d - */ 0, + /* b9e - */ 0, + /* b9f - */ 0, + /* ba0 - */ 0, + /* ba1 - */ 0, + /* ba2 - */ 0, + /* ba3 - */ 0, + /* ba4 - */ 0, + /* ba5 - */ 0, + /* ba6 - */ 0, + /* ba7 - */ 0, + /* ba8 - */ 0, + /* ba9 - */ 0, + /* baa - */ 0, + /* bab - */ 0, + /* bac - */ 0, + /* bad - */ 0, + /* bae - */ 0, + /* baf - */ 0, + /* bb0 - */ 0, + /* bb1 - */ 0, + /* bb2 - */ 0, + /* bb3 - */ 0, + /* bb4 - */ 0, + /* bb5 - */ 0, + /* bb6 - */ 0, + /* bb7 - */ 0, + /* bb8 - */ 0, + /* bb9 - */ 0, + /* bba - */ 0, + /* bbb - */ 0, + /* bbc - */ 0, + /* bbd - */ 0, + /* bbe - */ 0, + /* bbf - */ 0, + /* bc0 - */ 0, + /* bc1 - */ 0, + /* bc2 - */ 0, + /* bc3 - */ 0, + /* bc4 - */ 0, + /* bc5 - */ 0, + /* bc6 - */ 0, + /* bc7 - */ 0, + /* bc8 - */ 0, + /* bc9 - */ 0, + /* bca - */ 0, + /* bcb - */ 0, + /* bcc - */ 0, + /* bcd - */ 0, + /* bce - */ 0, + /* bcf - */ 0, + /* bd0 - */ 0, + /* bd1 - */ 0, + /* bd2 - */ 0, + /* bd3 - */ 0, + /* bd4 - */ 0, + /* bd5 - */ 0, + /* bd6 - */ 0, + /* bd7 - */ 0, + /* bd8 - */ 0, + /* bd9 - */ 0, + /* bda - */ 0, + /* bdb - */ 0, + /* bdc - */ 0, + /* bdd - */ 0, + /* bde - */ 0, + /* bdf - */ 0, + /* be0 - */ 0, + /* be1 - */ 0, + /* be2 - */ 0, + /* be3 - */ 0, + /* be4 - */ 0, + /* be5 - */ 0, + /* be6 - */ 0, + /* be7 - */ 0, + /* be8 - */ 0, + /* be9 - */ 0, + /* bea - */ 0, + /* beb - */ 0, + /* bec - */ 0, + /* bed - */ 0, + /* bee - */ 0, + /* bef - */ 0, + /* bf0 - */ 0, + /* bf1 - */ 0, + /* bf2 - */ 0, + /* bf3 - */ 0, + /* bf4 - */ 0, + /* bf5 - */ 0, + /* bf6 - */ 0, + /* bf7 - */ 0, + /* bf8 - */ 0, + /* bf9 - */ 0, + /* bfa - */ 0, + /* bfb - */ 0, + /* bfc - */ 0, + /* bfd - */ 0, + /* bfe - */ 0, + /* bff - */ 0, + /* c00 - */ 0, + /* c01 - */ 0, + /* c02 - */ 0, + /* c03 - */ 0, + /* c04 - */ 0, + /* c05 - */ 0, + /* c06 - */ 0, + /* c07 - */ 0, + /* c08 - */ 0, + /* c09 - */ 0, + /* c0a - */ 0, + /* c0b - */ 0, + /* c0c - */ 0, + /* c0d - */ 0, + /* c0e - */ 0, + /* c0f - */ 0, + /* c10 - */ 0, + /* c11 - */ 0, + /* c12 - */ 0, + /* c13 - */ 0, + /* c14 - */ 0, + /* c15 - */ 0, + /* c16 - */ 0, + /* c17 - */ 0, + /* c18 - */ 0, + /* c19 - */ 0, + /* c1a - */ 0, + /* c1b - */ 0, + /* c1c - */ 0, + /* c1d - */ 0, + /* c1e - */ 0, + /* c1f - */ 0, + /* c20 - */ 0, + /* c21 - */ 0, + /* c22 - */ 0, + /* c23 - */ 0, + /* c24 - */ 0, + /* c25 - */ 0, + /* c26 - */ 0, + /* c27 - */ 0, + /* c28 - */ 0, + /* c29 - */ 0, + /* c2a - */ 0, + /* c2b - */ 0, + /* c2c - */ 0, + /* c2d - */ 0, + /* c2e - */ 0, + /* c2f - */ 0, + /* c30 - */ 0, + /* c31 - */ 0, + /* c32 - */ 0, + /* c33 - */ 0, + /* c34 - */ 0, + /* c35 - */ 0, + /* c36 - */ 0, + /* c37 - */ 0, + /* c38 - */ 0, + /* c39 - */ 0, + /* c3a - */ 0, + /* c3b - */ 0, + /* c3c - */ 0, + /* c3d - */ 0, + /* c3e - */ 0, + /* c3f - */ 0, + /* c40 - */ 0, + /* c41 - */ 0, + /* c42 - */ 0, + /* c43 - */ 0, + /* c44 - */ 0, + /* c45 - */ 0, + /* c46 - */ 0, + /* c47 - */ 0, + /* c48 - */ 0, + /* c49 - */ 0, + /* c4a - */ 0, + /* c4b - */ 0, + /* c4c - */ 0, + /* c4d - */ 0, + /* c4e - */ 0, + /* c4f - */ 0, + /* c50 - */ 0, + /* c51 - */ 0, + /* c52 - */ 0, + /* c53 - */ 0, + /* c54 - */ 0, + /* c55 - _66_0F_7C */ 0x23fe, + /* c56 - */ 0, + /* c57 - _F2_0F_7C */ 0x23ff, + /* c58 - */ 0, + /* c59 - _V_66_0F_7C */ 0x4087, + /* c5a - */ 0, + /* c5b - _V_F2_0F_7C */ 0x4088, + /* c5c - */ 0, + /* c5d - */ 0, + /* c5e - */ 0, + /* c5f - */ 0, + /* c60 - */ 0, + /* c61 - _66_0F_7D */ 0x2400, + /* c62 - */ 0, + /* c63 - _F2_0F_7D */ 0x2401, + /* c64 - */ 0, + /* c65 - _V_66_0F_7D */ 0x4089, + /* c66 - */ 0, + /* c67 - _V_F2_0F_7D */ 0x408a, + /* c68 - */ 0, + /* c69 - */ 0, + /* c6a - */ 0, + /* c6b - */ 0, + /* c6c - _0F_7E */ 0x408b, + /* c6d - _66_0F_7E */ 0x408c, + /* c6e - _F3_0F_7E */ 0x2402, + /* c6f - */ 0, + /* c70 - */ 0, + /* c71 - _V_66_0F_7E */ 0x408d, + /* c72 - _V_F3_0F_7E */ 0x408e, + /* c73 - */ 0, + /* c74 - */ 0, + /* c75 - */ 0, + /* c76 - */ 0, + /* c77 - */ 0, + /* c78 - _0F_7F */ 0x2403, + /* c79 - _66_0F_7F */ 0x2404, + /* c7a - _F3_0F_7F */ 0x2405, + /* c7b - */ 0, + /* c7c - */ 0, + /* c7d - _V_66_0F_7F */ 0x408f, + /* c7e - _V_F3_0F_7F */ 0x4090, + /* c7f - */ 0, + /* c80 - */ 0, + /* c81 - */ 0, + /* c82 - */ 0, + /* c83 - */ 0, + /* c84 - _0F_AE_00 */ 0xd5fc, + /* c85 - _0F_AE_01 */ 0xd608, + /* c86 - _0F_AE_02 */ 0xd614, + /* c87 - _0F_AE_03 */ 0xd620, + /* c88 - _0F_AE_04 */ 0x4091, + /* c89 - _0F_AE_05 */ 0x4092, + /* c8a - _0F_AE_06 */ 0x4093, + /* c8b - _0F_AE_07 */ 0x4094, + /* c8c - */ 0, + /* c8d - */ 0, + /* c8e - _F3_0F_B8 */ 0x2406, + /* c8f - */ 0, + /* c90 - */ 0, + /* c91 - */ 0, + /* c92 - */ 0, + /* c93 - */ 0, + /* c94 - */ 0, + /* c95 - */ 0, + /* c96 - */ 0, + /* c97 - */ 0, + /* c98 - */ 0, + /* c99 - */ 0, + /* c9a - */ 0, + /* c9b - */ 0, + /* c9c - _0F_BA_04 */ 0x2407, + /* c9d - _0F_BA_05 */ 0x2408, + /* c9e - _0F_BA_06 */ 0x2409, + /* c9f - _0F_BA_07 */ 0x240a, + /* ca0 - _0F_BC */ 0x240b, + /* ca1 - */ 0, + /* ca2 - _F3_0F_BC */ 0x240c, + /* ca3 - */ 0, + /* ca4 - */ 0, + /* ca5 - */ 0, + /* ca6 - */ 0, + /* ca7 - */ 0, + /* ca8 - */ 0, + /* ca9 - */ 0, + /* caa - */ 0, + /* cab - */ 0, + /* cac - _0F_BD */ 0x240d, + /* cad - */ 0, + /* cae - _F3_0F_BD */ 0x240e, + /* caf - */ 0, + /* cb0 - */ 0, + /* cb1 - */ 0, + /* cb2 - */ 0, + /* cb3 - */ 0, + /* cb4 - */ 0, + /* cb5 - */ 0, + /* cb6 - */ 0, + /* cb7 - */ 0, + /* cb8 - _0F_C2 */ 0x4095, + /* cb9 - _66_0F_C2 */ 0x4096, + /* cba - _F3_0F_C2 */ 0x4097, + /* cbb - _F2_0F_C2 */ 0x4098, + /* cbc - _V_0F_C2 */ 0x4099, + /* cbd - _V_66_0F_C2 */ 0x409a, + /* cbe - _V_F3_0F_C2 */ 0x409b, + /* cbf - _V_F2_0F_C2 */ 0x409c, + /* cc0 - */ 0, + /* cc1 - */ 0, + /* cc2 - */ 0, + /* cc3 - */ 0, + /* cc4 - _0F_C4 */ 0x409d, + /* cc5 - _66_0F_C4 */ 0x409e, + /* cc6 - */ 0, + /* cc7 - */ 0, + /* cc8 - */ 0, + /* cc9 - _V_66_0F_C4 */ 0x409f, + /* cca - */ 0, + /* ccb - */ 0, + /* ccc - */ 0, + /* ccd - */ 0, + /* cce - */ 0, + /* ccf - */ 0, + /* cd0 - _0F_C5 */ 0x40a0, + /* cd1 - _66_0F_C5 */ 0x40a1, + /* cd2 - */ 0, + /* cd3 - */ 0, + /* cd4 - */ 0, + /* cd5 - _V_66_0F_C5 */ 0x40a2, + /* cd6 - */ 0, + /* cd7 - */ 0, + /* cd8 - */ 0, + /* cd9 - */ 0, + /* cda - */ 0, + /* cdb - */ 0, + /* cdc - _0F_C6 */ 0x40a3, + /* cdd - _66_0F_C6 */ 0x40a4, + /* cde - */ 0, + /* cdf - */ 0, + /* ce0 - _V_0F_C6 */ 0x40a5, + /* ce1 - _V_66_0F_C6 */ 0x40a6, + /* ce2 - */ 0, + /* ce3 - */ 0, + /* ce4 - */ 0, + /* ce5 - */ 0, + /* ce6 - */ 0, + /* ce7 - */ 0, + /* ce8 - */ 0, + /* ce9 - _0F_C7_01 */ 0x40a7, + /* cea - */ 0, + /* ceb - */ 0, + /* cec - */ 0, + /* ced - */ 0, + /* cee - _0F_C7_06 */ 0xd62c, + /* cef - _0F_C7_07 */ 0x240f, + /* cf0 - */ 0, + /* cf1 - _66_0F_D0 */ 0x2410, + /* cf2 - */ 0, + /* cf3 - _F2_0F_D0 */ 0x2411, + /* cf4 - */ 0, + /* cf5 - _V_66_0F_D0 */ 0x40a8, + /* cf6 - */ 0, + /* cf7 - _V_F2_0F_D0 */ 0x40a9, + /* cf8 - */ 0, + /* cf9 - */ 0, + /* cfa - */ 0, + /* cfb - */ 0, + /* cfc - _0F_D1 */ 0x2412, + /* cfd - _66_0F_D1 */ 0x2413, + /* cfe - */ 0, + /* cff - */ 0, + /* d00 - */ 0, + /* d01 - _V_66_0F_D1 */ 0x40aa, + /* d02 - */ 0, + /* d03 - */ 0, + /* d04 - */ 0, + /* d05 - */ 0, + /* d06 - */ 0, + /* d07 - */ 0, + /* d08 - _0F_D2 */ 0x2414, + /* d09 - _66_0F_D2 */ 0x2415, + /* d0a - */ 0, + /* d0b - */ 0, + /* d0c - */ 0, + /* d0d - _V_66_0F_D2 */ 0x40ab, + /* d0e - */ 0, + /* d0f - */ 0, + /* d10 - */ 0, + /* d11 - */ 0, + /* d12 - */ 0, + /* d13 - */ 0, + /* d14 - _0F_D3 */ 0x2416, + /* d15 - _66_0F_D3 */ 0x2417, + /* d16 - */ 0, + /* d17 - */ 0, + /* d18 - */ 0, + /* d19 - _V_66_0F_D3 */ 0x40ac, + /* d1a - */ 0, + /* d1b - */ 0, + /* d1c - */ 0, + /* d1d - */ 0, + /* d1e - */ 0, + /* d1f - */ 0, + /* d20 - _0F_D4 */ 0x2418, + /* d21 - _66_0F_D4 */ 0x2419, + /* d22 - */ 0, + /* d23 - */ 0, + /* d24 - */ 0, + /* d25 - _V_66_0F_D4 */ 0x40ad, + /* d26 - */ 0, + /* d27 - */ 0, + /* d28 - */ 0, + /* d29 - */ 0, + /* d2a - */ 0, + /* d2b - */ 0, + /* d2c - _0F_D5 */ 0x241a, + /* d2d - _66_0F_D5 */ 0x241b, + /* d2e - */ 0, + /* d2f - */ 0, + /* d30 - */ 0, + /* d31 - _V_66_0F_D5 */ 0x40ae, + /* d32 - */ 0, + /* d33 - */ 0, + /* d34 - */ 0, + /* d35 - */ 0, + /* d36 - */ 0, + /* d37 - */ 0, + /* d38 - */ 0, + /* d39 - _66_0F_D6 */ 0x241c, + /* d3a - _F3_0F_D6 */ 0x241d, + /* d3b - _F2_0F_D6 */ 0x241e, + /* d3c - */ 0, + /* d3d - _V_66_0F_D6 */ 0x40af, + /* d3e - */ 0, + /* d3f - */ 0, + /* d40 - */ 0, + /* d41 - */ 0, + /* d42 - */ 0, + /* d43 - */ 0, + /* d44 - _0F_D7 */ 0x241f, + /* d45 - _66_0F_D7 */ 0x2420, + /* d46 - */ 0, + /* d47 - */ 0, + /* d48 - */ 0, + /* d49 - _V_66_0F_D7 */ 0x40b0, + /* d4a - */ 0, + /* d4b - */ 0, + /* d4c - */ 0, + /* d4d - */ 0, + /* d4e - */ 0, + /* d4f - */ 0, + /* d50 - _0F_D8 */ 0x2421, + /* d51 - _66_0F_D8 */ 0x2422, + /* d52 - */ 0, + /* d53 - */ 0, + /* d54 - */ 0, + /* d55 - _V_66_0F_D8 */ 0x40b1, + /* d56 - */ 0, + /* d57 - */ 0, + /* d58 - */ 0, + /* d59 - */ 0, + /* d5a - */ 0, + /* d5b - */ 0, + /* d5c - _0F_D9 */ 0x2423, + /* d5d - _66_0F_D9 */ 0x2424, + /* d5e - */ 0, + /* d5f - */ 0, + /* d60 - */ 0, + /* d61 - _V_66_0F_D9 */ 0x40b2, + /* d62 - */ 0, + /* d63 - */ 0, + /* d64 - */ 0, + /* d65 - */ 0, + /* d66 - */ 0, + /* d67 - */ 0, + /* d68 - _0F_DA */ 0x2425, + /* d69 - _66_0F_DA */ 0x2426, + /* d6a - */ 0, + /* d6b - */ 0, + /* d6c - */ 0, + /* d6d - _V_66_0F_DA */ 0x40b3, + /* d6e - */ 0, + /* d6f - */ 0, + /* d70 - */ 0, + /* d71 - */ 0, + /* d72 - */ 0, + /* d73 - */ 0, + /* d74 - _0F_DB */ 0x2427, + /* d75 - _66_0F_DB */ 0x2428, + /* d76 - */ 0, + /* d77 - */ 0, + /* d78 - */ 0, + /* d79 - _V_66_0F_DB */ 0x40b4, + /* d7a - */ 0, + /* d7b - */ 0, + /* d7c - */ 0, + /* d7d - */ 0, + /* d7e - */ 0, + /* d7f - */ 0, + /* d80 - _0F_DC */ 0x2429, + /* d81 - _66_0F_DC */ 0x242a, + /* d82 - */ 0, + /* d83 - */ 0, + /* d84 - */ 0, + /* d85 - _V_66_0F_DC */ 0x40b5, + /* d86 - */ 0, + /* d87 - */ 0, + /* d88 - */ 0, + /* d89 - */ 0, + /* d8a - */ 0, + /* d8b - */ 0, + /* d8c - _0F_DD */ 0x242b, + /* d8d - _66_0F_DD */ 0x242c, + /* d8e - */ 0, + /* d8f - */ 0, + /* d90 - */ 0, + /* d91 - _V_66_0F_DD */ 0x40b6, + /* d92 - */ 0, + /* d93 - */ 0, + /* d94 - */ 0, + /* d95 - */ 0, + /* d96 - */ 0, + /* d97 - */ 0, + /* d98 - _0F_DE */ 0x242d, + /* d99 - _66_0F_DE */ 0x242e, + /* d9a - */ 0, + /* d9b - */ 0, + /* d9c - */ 0, + /* d9d - _V_66_0F_DE */ 0x40b7, + /* d9e - */ 0, + /* d9f - */ 0, + /* da0 - */ 0, + /* da1 - */ 0, + /* da2 - */ 0, + /* da3 - */ 0, + /* da4 - _0F_DF */ 0x242f, + /* da5 - _66_0F_DF */ 0x2430, + /* da6 - */ 0, + /* da7 - */ 0, + /* da8 - */ 0, + /* da9 - _V_66_0F_DF */ 0x40b8, + /* daa - */ 0, + /* dab - */ 0, + /* dac - */ 0, + /* dad - */ 0, + /* dae - */ 0, + /* daf - */ 0, + /* db0 - _0F_E0 */ 0x2431, + /* db1 - _66_0F_E0 */ 0x2432, + /* db2 - */ 0, + /* db3 - */ 0, + /* db4 - */ 0, + /* db5 - _V_66_0F_E0 */ 0x40b9, + /* db6 - */ 0, + /* db7 - */ 0, + /* db8 - */ 0, + /* db9 - */ 0, + /* dba - */ 0, + /* dbb - */ 0, + /* dbc - _0F_E1 */ 0x2433, + /* dbd - _66_0F_E1 */ 0x2434, + /* dbe - */ 0, + /* dbf - */ 0, + /* dc0 - */ 0, + /* dc1 - _V_66_0F_E1 */ 0x40ba, + /* dc2 - */ 0, + /* dc3 - */ 0, + /* dc4 - */ 0, + /* dc5 - */ 0, + /* dc6 - */ 0, + /* dc7 - */ 0, + /* dc8 - _0F_E2 */ 0x2435, + /* dc9 - _66_0F_E2 */ 0x2436, + /* dca - */ 0, + /* dcb - */ 0, + /* dcc - */ 0, + /* dcd - _V_66_0F_E2 */ 0x40bb, + /* dce - */ 0, + /* dcf - */ 0, + /* dd0 - */ 0, + /* dd1 - */ 0, + /* dd2 - */ 0, + /* dd3 - */ 0, + /* dd4 - _0F_E3 */ 0x2437, + /* dd5 - _66_0F_E3 */ 0x2438, + /* dd6 - */ 0, + /* dd7 - */ 0, + /* dd8 - */ 0, + /* dd9 - _V_66_0F_E3 */ 0x40bc, + /* dda - */ 0, + /* ddb - */ 0, + /* ddc - */ 0, + /* ddd - */ 0, + /* dde - */ 0, + /* ddf - */ 0, + /* de0 - _0F_E4 */ 0x2439, + /* de1 - _66_0F_E4 */ 0x243a, + /* de2 - */ 0, + /* de3 - */ 0, + /* de4 - */ 0, + /* de5 - _V_66_0F_E4 */ 0x40bd, + /* de6 - */ 0, + /* de7 - */ 0, + /* de8 - */ 0, + /* de9 - */ 0, + /* dea - */ 0, + /* deb - */ 0, + /* dec - _0F_E5 */ 0x243b, + /* ded - _66_0F_E5 */ 0x243c, + /* dee - */ 0, + /* def - */ 0, + /* df0 - */ 0, + /* df1 - _V_66_0F_E5 */ 0x40be, + /* df2 - */ 0, + /* df3 - */ 0, + /* df4 - */ 0, + /* df5 - */ 0, + /* df6 - */ 0, + /* df7 - */ 0, + /* df8 - */ 0, + /* df9 - _66_0F_E6 */ 0x243d, + /* dfa - _F3_0F_E6 */ 0x243e, + /* dfb - _F2_0F_E6 */ 0x243f, + /* dfc - */ 0, + /* dfd - _V_66_0F_E6 */ 0x40bf, + /* dfe - _V_F3_0F_E6 */ 0x40c0, + /* dff - _V_F2_0F_E6 */ 0x40c1, + /* e00 - */ 0, + /* e01 - */ 0, + /* e02 - */ 0, + /* e03 - */ 0, + /* e04 - _0F_E7 */ 0x2440, + /* e05 - _66_0F_E7 */ 0x2441, + /* e06 - */ 0, + /* e07 - */ 0, + /* e08 - */ 0, + /* e09 - _V_66_0F_E7 */ 0x40c2, + /* e0a - */ 0, + /* e0b - */ 0, + /* e0c - */ 0, + /* e0d - */ 0, + /* e0e - */ 0, + /* e0f - */ 0, + /* e10 - _0F_E8 */ 0x2442, + /* e11 - _66_0F_E8 */ 0x2443, + /* e12 - */ 0, + /* e13 - */ 0, + /* e14 - */ 0, + /* e15 - _V_66_0F_E8 */ 0x40c3, + /* e16 - */ 0, + /* e17 - */ 0, + /* e18 - */ 0, + /* e19 - */ 0, + /* e1a - */ 0, + /* e1b - */ 0, + /* e1c - _0F_E9 */ 0x2444, + /* e1d - _66_0F_E9 */ 0x2445, + /* e1e - */ 0, + /* e1f - */ 0, + /* e20 - */ 0, + /* e21 - _V_66_0F_E9 */ 0x40c4, + /* e22 - */ 0, + /* e23 - */ 0, + /* e24 - */ 0, + /* e25 - */ 0, + /* e26 - */ 0, + /* e27 - */ 0, + /* e28 - _0F_EA */ 0x2446, + /* e29 - _66_0F_EA */ 0x2447, + /* e2a - */ 0, + /* e2b - */ 0, + /* e2c - */ 0, + /* e2d - _V_66_0F_EA */ 0x40c5, + /* e2e - */ 0, + /* e2f - */ 0, + /* e30 - */ 0, + /* e31 - */ 0, + /* e32 - */ 0, + /* e33 - */ 0, + /* e34 - _0F_EB */ 0x2448, + /* e35 - _66_0F_EB */ 0x2449, + /* e36 - */ 0, + /* e37 - */ 0, + /* e38 - */ 0, + /* e39 - _V_66_0F_EB */ 0x40c6, + /* e3a - */ 0, + /* e3b - */ 0, + /* e3c - */ 0, + /* e3d - */ 0, + /* e3e - */ 0, + /* e3f - */ 0, + /* e40 - _0F_EC */ 0x244a, + /* e41 - _66_0F_EC */ 0x244b, + /* e42 - */ 0, + /* e43 - */ 0, + /* e44 - */ 0, + /* e45 - _V_66_0F_EC */ 0x40c7, + /* e46 - */ 0, + /* e47 - */ 0, + /* e48 - */ 0, + /* e49 - */ 0, + /* e4a - */ 0, + /* e4b - */ 0, + /* e4c - _0F_ED */ 0x244c, + /* e4d - _66_0F_ED */ 0x244d, + /* e4e - */ 0, + /* e4f - */ 0, + /* e50 - */ 0, + /* e51 - _V_66_0F_ED */ 0x40c8, + /* e52 - */ 0, + /* e53 - */ 0, + /* e54 - */ 0, + /* e55 - */ 0, + /* e56 - */ 0, + /* e57 - */ 0, + /* e58 - _0F_EE */ 0x244e, + /* e59 - _66_0F_EE */ 0x244f, + /* e5a - */ 0, + /* e5b - */ 0, + /* e5c - */ 0, + /* e5d - _V_66_0F_EE */ 0x40c9, + /* e5e - */ 0, + /* e5f - */ 0, + /* e60 - */ 0, + /* e61 - */ 0, + /* e62 - */ 0, + /* e63 - */ 0, + /* e64 - _0F_EF */ 0x2450, + /* e65 - _66_0F_EF */ 0x2451, + /* e66 - */ 0, + /* e67 - */ 0, + /* e68 - */ 0, + /* e69 - _V_66_0F_EF */ 0x40ca, + /* e6a - */ 0, + /* e6b - */ 0, + /* e6c - */ 0, + /* e6d - */ 0, + /* e6e - */ 0, + /* e6f - */ 0, + /* e70 - */ 0, + /* e71 - */ 0, + /* e72 - */ 0, + /* e73 - _F2_0F_F0 */ 0x2452, + /* e74 - */ 0, + /* e75 - */ 0, + /* e76 - */ 0, + /* e77 - _V_F2_0F_F0 */ 0x40cb, + /* e78 - */ 0, + /* e79 - */ 0, + /* e7a - */ 0, + /* e7b - */ 0, + /* e7c - _0F_F1 */ 0x2453, + /* e7d - _66_0F_F1 */ 0x2454, + /* e7e - */ 0, + /* e7f - */ 0, + /* e80 - */ 0, + /* e81 - _V_66_0F_F1 */ 0x40cc, + /* e82 - */ 0, + /* e83 - */ 0, + /* e84 - */ 0, + /* e85 - */ 0, + /* e86 - */ 0, + /* e87 - */ 0, + /* e88 - _0F_F2 */ 0x2455, + /* e89 - _66_0F_F2 */ 0x2456, + /* e8a - */ 0, + /* e8b - */ 0, + /* e8c - */ 0, + /* e8d - _V_66_0F_F2 */ 0x40cd, + /* e8e - */ 0, + /* e8f - */ 0, + /* e90 - */ 0, + /* e91 - */ 0, + /* e92 - */ 0, + /* e93 - */ 0, + /* e94 - _0F_F3 */ 0x2457, + /* e95 - _66_0F_F3 */ 0x2458, + /* e96 - */ 0, + /* e97 - */ 0, + /* e98 - */ 0, + /* e99 - _V_66_0F_F3 */ 0x40ce, + /* e9a - */ 0, + /* e9b - */ 0, + /* e9c - */ 0, + /* e9d - */ 0, + /* e9e - */ 0, + /* e9f - */ 0, + /* ea0 - _0F_F4 */ 0x2459, + /* ea1 - _66_0F_F4 */ 0x245a, + /* ea2 - */ 0, + /* ea3 - */ 0, + /* ea4 - */ 0, + /* ea5 - _V_66_0F_F4 */ 0x40cf, + /* ea6 - */ 0, + /* ea7 - */ 0, + /* ea8 - */ 0, + /* ea9 - */ 0, + /* eaa - */ 0, + /* eab - */ 0, + /* eac - _0F_F5 */ 0x245b, + /* ead - _66_0F_F5 */ 0x245c, + /* eae - */ 0, + /* eaf - */ 0, + /* eb0 - */ 0, + /* eb1 - _V_66_0F_F5 */ 0x40d0, + /* eb2 - */ 0, + /* eb3 - */ 0, + /* eb4 - */ 0, + /* eb5 - */ 0, + /* eb6 - */ 0, + /* eb7 - */ 0, + /* eb8 - _0F_F6 */ 0x245d, + /* eb9 - _66_0F_F6 */ 0x245e, + /* eba - */ 0, + /* ebb - */ 0, + /* ebc - */ 0, + /* ebd - _V_66_0F_F6 */ 0x40d1, + /* ebe - */ 0, + /* ebf - */ 0, + /* ec0 - */ 0, + /* ec1 - */ 0, + /* ec2 - */ 0, + /* ec3 - */ 0, + /* ec4 - _0F_F7 */ 0x245f, + /* ec5 - _66_0F_F7 */ 0x2460, + /* ec6 - */ 0, + /* ec7 - */ 0, + /* ec8 - */ 0, + /* ec9 - _V_66_0F_F7 */ 0x40d2, + /* eca - */ 0, + /* ecb - */ 0, + /* ecc - */ 0, + /* ecd - */ 0, + /* ece - */ 0, + /* ecf - */ 0, + /* ed0 - _0F_F8 */ 0x2461, + /* ed1 - _66_0F_F8 */ 0x2462, + /* ed2 - */ 0, + /* ed3 - */ 0, + /* ed4 - */ 0, + /* ed5 - _V_66_0F_F8 */ 0x40d3, + /* ed6 - */ 0, + /* ed7 - */ 0, + /* ed8 - */ 0, + /* ed9 - */ 0, + /* eda - */ 0, + /* edb - */ 0, + /* edc - _0F_F9 */ 0x2463, + /* edd - _66_0F_F9 */ 0x2464, + /* ede - */ 0, + /* edf - */ 0, + /* ee0 - */ 0, + /* ee1 - _V_66_0F_F9 */ 0x40d4, + /* ee2 - */ 0, + /* ee3 - */ 0, + /* ee4 - */ 0, + /* ee5 - */ 0, + /* ee6 - */ 0, + /* ee7 - */ 0, + /* ee8 - _0F_FA */ 0x2465, + /* ee9 - _66_0F_FA */ 0x2466, + /* eea - */ 0, + /* eeb - */ 0, + /* eec - */ 0, + /* eed - _V_66_0F_FA */ 0x40d5, + /* eee - */ 0, + /* eef - */ 0, + /* ef0 - */ 0, + /* ef1 - */ 0, + /* ef2 - */ 0, + /* ef3 - */ 0, + /* ef4 - _0F_FB */ 0x2467, + /* ef5 - _66_0F_FB */ 0x2468, + /* ef6 - */ 0, + /* ef7 - */ 0, + /* ef8 - */ 0, + /* ef9 - _V_66_0F_FB */ 0x40d6, + /* efa - */ 0, + /* efb - */ 0, + /* efc - */ 0, + /* efd - */ 0, + /* efe - */ 0, + /* eff - */ 0, + /* f00 - _0F_FC */ 0x2469, + /* f01 - _66_0F_FC */ 0x246a, + /* f02 - */ 0, + /* f03 - */ 0, + /* f04 - */ 0, + /* f05 - _V_66_0F_FC */ 0x40d7, + /* f06 - */ 0, + /* f07 - */ 0, + /* f08 - */ 0, + /* f09 - */ 0, + /* f0a - */ 0, + /* f0b - */ 0, + /* f0c - _0F_FD */ 0x246b, + /* f0d - _66_0F_FD */ 0x246c, + /* f0e - */ 0, + /* f0f - */ 0, + /* f10 - */ 0, + /* f11 - _V_66_0F_FD */ 0x40d8, + /* f12 - */ 0, + /* f13 - */ 0, + /* f14 - */ 0, + /* f15 - */ 0, + /* f16 - */ 0, + /* f17 - */ 0, + /* f18 - _0F_FE */ 0x246d, + /* f19 - _66_0F_FE */ 0x246e, + /* f1a - */ 0, + /* f1b - */ 0, + /* f1c - */ 0, + /* f1d - _V_66_0F_FE */ 0x40d9, + /* f1e - */ 0, + /* f1f - */ 0, + /* f20 - */ 0, + /* f21 - */ 0, + /* f22 - */ 0, + /* f23 - */ 0, + /* f24 - _D9_06 */ 0x246f, + /* f25 - _9B_D9_06 */ 0x2470, + /* f26 - */ 0, + /* f27 - */ 0, + /* f28 - */ 0, + /* f29 - */ 0, + /* f2a - */ 0, + /* f2b - */ 0, + /* f2c - */ 0, + /* f2d - */ 0, + /* f2e - */ 0, + /* f2f - */ 0, + /* f30 - _D9_07 */ 0x2471, + /* f31 - _9B_D9_07 */ 0x2472, + /* f32 - */ 0, + /* f33 - */ 0, + /* f34 - */ 0, + /* f35 - */ 0, + /* f36 - */ 0, + /* f37 - */ 0, + /* f38 - */ 0, + /* f39 - */ 0, + /* f3a - */ 0, + /* f3b - */ 0, + /* f3c - _DB_E2 */ 0x2473, + /* f3d - _9B_DB_E2 */ 0x2474, + /* f3e - */ 0, + /* f3f - */ 0, + /* f40 - */ 0, + /* f41 - */ 0, + /* f42 - */ 0, + /* f43 - */ 0, + /* f44 - */ 0, + /* f45 - */ 0, + /* f46 - */ 0, + /* f47 - */ 0, + /* f48 - _DB_E3 */ 0x2475, + /* f49 - _9B_DB_E3 */ 0x2476, + /* f4a - */ 0, + /* f4b - */ 0, + /* f4c - */ 0, + /* f4d - */ 0, + /* f4e - */ 0, + /* f4f - */ 0, + /* f50 - */ 0, + /* f51 - */ 0, + /* f52 - */ 0, + /* f53 - */ 0, + /* f54 - _DD_06 */ 0x2477, + /* f55 - _9B_DD_06 */ 0x2478, + /* f56 - */ 0, + /* f57 - */ 0, + /* f58 - */ 0, + /* f59 - */ 0, + /* f5a - */ 0, + /* f5b - */ 0, + /* f5c - */ 0, + /* f5d - */ 0, + /* f5e - */ 0, + /* f5f - */ 0, + /* f60 - _DD_07 */ 0x2479, + /* f61 - _9B_DD_07 */ 0x247a, + /* f62 - */ 0, + /* f63 - */ 0, + /* f64 - */ 0, + /* f65 - */ 0, + /* f66 - */ 0, + /* f67 - */ 0, + /* f68 - */ 0, + /* f69 - */ 0, + /* f6a - */ 0, + /* f6b - */ 0, + /* f6c - _DF_E0 */ 0x247b, + /* f6d - _9B_DF_E0 */ 0x247c, + /* f6e - */ 0, + /* f6f - */ 0, + /* f70 - */ 0, + /* f71 - */ 0, + /* f72 - */ 0, + /* f73 - */ 0, + /* f74 - */ 0, + /* f75 - */ 0, + /* f76 - */ 0, + /* f77 - */ 0, + /* f78 - _0F_38_00 */ 0x247d, + /* f79 - _66_0F_38_00 */ 0x247e, + /* f7a - */ 0, + /* f7b - */ 0, + /* f7c - */ 0, + /* f7d - _V_66_0F_38_00 */ 0x40da, + /* f7e - */ 0, + /* f7f - */ 0, + /* f80 - */ 0, + /* f81 - */ 0, + /* f82 - */ 0, + /* f83 - */ 0, + /* f84 - _0F_38_01 */ 0x247f, + /* f85 - _66_0F_38_01 */ 0x2480, + /* f86 - */ 0, + /* f87 - */ 0, + /* f88 - */ 0, + /* f89 - _V_66_0F_38_01 */ 0x40db, + /* f8a - */ 0, + /* f8b - */ 0, + /* f8c - */ 0, + /* f8d - */ 0, + /* f8e - */ 0, + /* f8f - */ 0, + /* f90 - _0F_38_02 */ 0x2481, + /* f91 - _66_0F_38_02 */ 0x2482, + /* f92 - */ 0, + /* f93 - */ 0, + /* f94 - */ 0, + /* f95 - _V_66_0F_38_02 */ 0x40dc, + /* f96 - */ 0, + /* f97 - */ 0, + /* f98 - */ 0, + /* f99 - */ 0, + /* f9a - */ 0, + /* f9b - */ 0, + /* f9c - _0F_38_03 */ 0x2483, + /* f9d - _66_0F_38_03 */ 0x2484, + /* f9e - */ 0, + /* f9f - */ 0, + /* fa0 - */ 0, + /* fa1 - _V_66_0F_38_03 */ 0x40dd, + /* fa2 - */ 0, + /* fa3 - */ 0, + /* fa4 - */ 0, + /* fa5 - */ 0, + /* fa6 - */ 0, + /* fa7 - */ 0, + /* fa8 - _0F_38_04 */ 0x2485, + /* fa9 - _66_0F_38_04 */ 0x2486, + /* faa - */ 0, + /* fab - */ 0, + /* fac - */ 0, + /* fad - _V_66_0F_38_04 */ 0x40de, + /* fae - */ 0, + /* faf - */ 0, + /* fb0 - */ 0, + /* fb1 - */ 0, + /* fb2 - */ 0, + /* fb3 - */ 0, + /* fb4 - _0F_38_05 */ 0x2487, + /* fb5 - _66_0F_38_05 */ 0x2488, + /* fb6 - */ 0, + /* fb7 - */ 0, + /* fb8 - */ 0, + /* fb9 - _V_66_0F_38_05 */ 0x40df, + /* fba - */ 0, + /* fbb - */ 0, + /* fbc - */ 0, + /* fbd - */ 0, + /* fbe - */ 0, + /* fbf - */ 0, + /* fc0 - _0F_38_06 */ 0x2489, + /* fc1 - _66_0F_38_06 */ 0x248a, + /* fc2 - */ 0, + /* fc3 - */ 0, + /* fc4 - */ 0, + /* fc5 - _V_66_0F_38_06 */ 0x40e0, + /* fc6 - */ 0, + /* fc7 - */ 0, + /* fc8 - */ 0, + /* fc9 - */ 0, + /* fca - */ 0, + /* fcb - */ 0, + /* fcc - _0F_38_07 */ 0x248b, + /* fcd - _66_0F_38_07 */ 0x248c, + /* fce - */ 0, + /* fcf - */ 0, + /* fd0 - */ 0, + /* fd1 - _V_66_0F_38_07 */ 0x40e1, + /* fd2 - */ 0, + /* fd3 - */ 0, + /* fd4 - */ 0, + /* fd5 - */ 0, + /* fd6 - */ 0, + /* fd7 - */ 0, + /* fd8 - _0F_38_08 */ 0x248d, + /* fd9 - _66_0F_38_08 */ 0x248e, + /* fda - */ 0, + /* fdb - */ 0, + /* fdc - */ 0, + /* fdd - _V_66_0F_38_08 */ 0x40e2, + /* fde - */ 0, + /* fdf - */ 0, + /* fe0 - */ 0, + /* fe1 - */ 0, + /* fe2 - */ 0, + /* fe3 - */ 0, + /* fe4 - _0F_38_09 */ 0x248f, + /* fe5 - _66_0F_38_09 */ 0x2490, + /* fe6 - */ 0, + /* fe7 - */ 0, + /* fe8 - */ 0, + /* fe9 - _V_66_0F_38_09 */ 0x40e3, + /* fea - */ 0, + /* feb - */ 0, + /* fec - */ 0, + /* fed - */ 0, + /* fee - */ 0, + /* fef - */ 0, + /* ff0 - _0F_38_0A */ 0x2491, + /* ff1 - _66_0F_38_0A */ 0x2492, + /* ff2 - */ 0, + /* ff3 - */ 0, + /* ff4 - */ 0, + /* ff5 - _V_66_0F_38_0A */ 0x40e4, + /* ff6 - */ 0, + /* ff7 - */ 0, + /* ff8 - */ 0, + /* ff9 - */ 0, + /* ffa - */ 0, + /* ffb - */ 0, + /* ffc - _0F_38_0B */ 0x2493, + /* ffd - _66_0F_38_0B */ 0x2494, + /* ffe - */ 0, + /* fff - */ 0, + /* 1000 - */ 0, + /* 1001 - _V_66_0F_38_0B */ 0x40e5, + /* 1002 - */ 0, + /* 1003 - */ 0, + /* 1004 - */ 0, + /* 1005 - */ 0, + /* 1006 - */ 0, + /* 1007 - */ 0, + /* 1008 - */ 0, + /* 1009 - */ 0, + /* 100a - */ 0, + /* 100b - */ 0, + /* 100c - */ 0, + /* 100d - _V_66_0F_38_0C */ 0x40e6, + /* 100e - */ 0, + /* 100f - */ 0, + /* 1010 - */ 0, + /* 1011 - */ 0, + /* 1012 - */ 0, + /* 1013 - */ 0, + /* 1014 - */ 0, + /* 1015 - */ 0, + /* 1016 - */ 0, + /* 1017 - */ 0, + /* 1018 - */ 0, + /* 1019 - _V_66_0F_38_0D */ 0x40e7, + /* 101a - */ 0, + /* 101b - */ 0, + /* 101c - */ 0, + /* 101d - */ 0, + /* 101e - */ 0, + /* 101f - */ 0, + /* 1020 - */ 0, + /* 1021 - */ 0, + /* 1022 - */ 0, + /* 1023 - */ 0, + /* 1024 - */ 0, + /* 1025 - _V_66_0F_38_0E */ 0x40e8, + /* 1026 - */ 0, + /* 1027 - */ 0, + /* 1028 - */ 0, + /* 1029 - */ 0, + /* 102a - */ 0, + /* 102b - */ 0, + /* 102c - */ 0, + /* 102d - */ 0, + /* 102e - */ 0, + /* 102f - */ 0, + /* 1030 - */ 0, + /* 1031 - _V_66_0F_38_0F */ 0x40e9, + /* 1032 - */ 0, + /* 1033 - */ 0, + /* 1034 - */ 0, + /* 1035 - */ 0, + /* 1036 - */ 0, + /* 1037 - */ 0, + /* 1038 - */ 0, + /* 1039 - _66_0F_38_10 */ 0x40ea, + /* 103a - */ 0, + /* 103b - */ 0, + /* 103c - */ 0, + /* 103d - */ 0, + /* 103e - */ 0, + /* 103f - */ 0, + /* 1040 - */ 0, + /* 1041 - */ 0, + /* 1042 - */ 0, + /* 1043 - */ 0, + /* 1044 - */ 0, + /* 1045 - _66_0F_38_14 */ 0x40eb, + /* 1046 - */ 0, + /* 1047 - */ 0, + /* 1048 - */ 0, + /* 1049 - */ 0, + /* 104a - */ 0, + /* 104b - */ 0, + /* 104c - */ 0, + /* 104d - */ 0, + /* 104e - */ 0, + /* 104f - */ 0, + /* 1050 - */ 0, + /* 1051 - _66_0F_38_15 */ 0x40ec, + /* 1052 - */ 0, + /* 1053 - */ 0, + /* 1054 - */ 0, + /* 1055 - */ 0, + /* 1056 - */ 0, + /* 1057 - */ 0, + /* 1058 - */ 0, + /* 1059 - */ 0, + /* 105a - */ 0, + /* 105b - */ 0, + /* 105c - */ 0, + /* 105d - _66_0F_38_17 */ 0x2495, + /* 105e - */ 0, + /* 105f - */ 0, + /* 1060 - */ 0, + /* 1061 - _V_66_0F_38_17 */ 0x40ed, + /* 1062 - */ 0, + /* 1063 - */ 0, + /* 1064 - */ 0, + /* 1065 - */ 0, + /* 1066 - */ 0, + /* 1067 - */ 0, + /* 1068 - */ 0, + /* 1069 - */ 0, + /* 106a - */ 0, + /* 106b - */ 0, + /* 106c - */ 0, + /* 106d - _V_66_0F_38_18 */ 0x40ee, + /* 106e - */ 0, + /* 106f - */ 0, + /* 1070 - */ 0, + /* 1071 - */ 0, + /* 1072 - */ 0, + /* 1073 - */ 0, + /* 1074 - */ 0, + /* 1075 - */ 0, + /* 1076 - */ 0, + /* 1077 - */ 0, + /* 1078 - */ 0, + /* 1079 - _V_66_0F_38_19 */ 0x40ef, + /* 107a - */ 0, + /* 107b - */ 0, + /* 107c - */ 0, + /* 107d - */ 0, + /* 107e - */ 0, + /* 107f - */ 0, + /* 1080 - */ 0, + /* 1081 - */ 0, + /* 1082 - */ 0, + /* 1083 - */ 0, + /* 1084 - */ 0, + /* 1085 - _V_66_0F_38_1A */ 0x40f0, + /* 1086 - */ 0, + /* 1087 - */ 0, + /* 1088 - */ 0, + /* 1089 - */ 0, + /* 108a - */ 0, + /* 108b - */ 0, + /* 108c - _0F_38_1C */ 0x2496, + /* 108d - _66_0F_38_1C */ 0x2497, + /* 108e - */ 0, + /* 108f - */ 0, + /* 1090 - */ 0, + /* 1091 - _V_66_0F_38_1C */ 0x40f1, + /* 1092 - */ 0, + /* 1093 - */ 0, + /* 1094 - */ 0, + /* 1095 - */ 0, + /* 1096 - */ 0, + /* 1097 - */ 0, + /* 1098 - _0F_38_1D */ 0x2498, + /* 1099 - _66_0F_38_1D */ 0x2499, + /* 109a - */ 0, + /* 109b - */ 0, + /* 109c - */ 0, + /* 109d - _V_66_0F_38_1D */ 0x40f2, + /* 109e - */ 0, + /* 109f - */ 0, + /* 10a0 - */ 0, + /* 10a1 - */ 0, + /* 10a2 - */ 0, + /* 10a3 - */ 0, + /* 10a4 - _0F_38_1E */ 0x249a, + /* 10a5 - _66_0F_38_1E */ 0x249b, + /* 10a6 - */ 0, + /* 10a7 - */ 0, + /* 10a8 - */ 0, + /* 10a9 - _V_66_0F_38_1E */ 0x40f3, + /* 10aa - */ 0, + /* 10ab - */ 0, + /* 10ac - */ 0, + /* 10ad - */ 0, + /* 10ae - */ 0, + /* 10af - */ 0, + /* 10b0 - */ 0, + /* 10b1 - _66_0F_38_20 */ 0x249c, + /* 10b2 - */ 0, + /* 10b3 - */ 0, + /* 10b4 - */ 0, + /* 10b5 - _V_66_0F_38_20 */ 0x40f4, + /* 10b6 - */ 0, + /* 10b7 - */ 0, + /* 10b8 - */ 0, + /* 10b9 - */ 0, + /* 10ba - */ 0, + /* 10bb - */ 0, + /* 10bc - */ 0, + /* 10bd - _66_0F_38_21 */ 0x249d, + /* 10be - */ 0, + /* 10bf - */ 0, + /* 10c0 - */ 0, + /* 10c1 - _V_66_0F_38_21 */ 0x40f5, + /* 10c2 - */ 0, + /* 10c3 - */ 0, + /* 10c4 - */ 0, + /* 10c5 - */ 0, + /* 10c6 - */ 0, + /* 10c7 - */ 0, + /* 10c8 - */ 0, + /* 10c9 - _66_0F_38_22 */ 0x249e, + /* 10ca - */ 0, + /* 10cb - */ 0, + /* 10cc - */ 0, + /* 10cd - _V_66_0F_38_22 */ 0x40f6, + /* 10ce - */ 0, + /* 10cf - */ 0, + /* 10d0 - */ 0, + /* 10d1 - */ 0, + /* 10d2 - */ 0, + /* 10d3 - */ 0, + /* 10d4 - */ 0, + /* 10d5 - _66_0F_38_23 */ 0x249f, + /* 10d6 - */ 0, + /* 10d7 - */ 0, + /* 10d8 - */ 0, + /* 10d9 - _V_66_0F_38_23 */ 0x40f7, + /* 10da - */ 0, + /* 10db - */ 0, + /* 10dc - */ 0, + /* 10dd - */ 0, + /* 10de - */ 0, + /* 10df - */ 0, + /* 10e0 - */ 0, + /* 10e1 - _66_0F_38_24 */ 0x24a0, + /* 10e2 - */ 0, + /* 10e3 - */ 0, + /* 10e4 - */ 0, + /* 10e5 - _V_66_0F_38_24 */ 0x40f8, + /* 10e6 - */ 0, + /* 10e7 - */ 0, + /* 10e8 - */ 0, + /* 10e9 - */ 0, + /* 10ea - */ 0, + /* 10eb - */ 0, + /* 10ec - */ 0, + /* 10ed - _66_0F_38_25 */ 0x24a1, + /* 10ee - */ 0, + /* 10ef - */ 0, + /* 10f0 - */ 0, + /* 10f1 - _V_66_0F_38_25 */ 0x40f9, + /* 10f2 - */ 0, + /* 10f3 - */ 0, + /* 10f4 - */ 0, + /* 10f5 - */ 0, + /* 10f6 - */ 0, + /* 10f7 - */ 0, + /* 10f8 - */ 0, + /* 10f9 - _66_0F_38_28 */ 0x24a2, + /* 10fa - */ 0, + /* 10fb - */ 0, + /* 10fc - */ 0, + /* 10fd - _V_66_0F_38_28 */ 0x40fa, + /* 10fe - */ 0, + /* 10ff - */ 0, + /* 1100 - */ 0, + /* 1101 - */ 0, + /* 1102 - */ 0, + /* 1103 - */ 0, + /* 1104 - */ 0, + /* 1105 - _66_0F_38_29 */ 0x24a3, + /* 1106 - */ 0, + /* 1107 - */ 0, + /* 1108 - */ 0, + /* 1109 - _V_66_0F_38_29 */ 0x40fb, + /* 110a - */ 0, + /* 110b - */ 0, + /* 110c - */ 0, + /* 110d - */ 0, + /* 110e - */ 0, + /* 110f - */ 0, + /* 1110 - */ 0, + /* 1111 - _66_0F_38_2A */ 0x24a4, + /* 1112 - */ 0, + /* 1113 - */ 0, + /* 1114 - */ 0, + /* 1115 - _V_66_0F_38_2A */ 0x40fc, + /* 1116 - */ 0, + /* 1117 - */ 0, + /* 1118 - */ 0, + /* 1119 - */ 0, + /* 111a - */ 0, + /* 111b - */ 0, + /* 111c - */ 0, + /* 111d - _66_0F_38_2B */ 0x24a5, + /* 111e - */ 0, + /* 111f - */ 0, + /* 1120 - */ 0, + /* 1121 - _V_66_0F_38_2B */ 0x40fd, + /* 1122 - */ 0, + /* 1123 - */ 0, + /* 1124 - */ 0, + /* 1125 - */ 0, + /* 1126 - */ 0, + /* 1127 - */ 0, + /* 1128 - */ 0, + /* 1129 - */ 0, + /* 112a - */ 0, + /* 112b - */ 0, + /* 112c - */ 0, + /* 112d - _V_66_0F_38_2C */ 0x40fe, + /* 112e - */ 0, + /* 112f - */ 0, + /* 1130 - */ 0, + /* 1131 - */ 0, + /* 1132 - */ 0, + /* 1133 - */ 0, + /* 1134 - */ 0, + /* 1135 - */ 0, + /* 1136 - */ 0, + /* 1137 - */ 0, + /* 1138 - */ 0, + /* 1139 - _V_66_0F_38_2D */ 0x40ff, + /* 113a - */ 0, + /* 113b - */ 0, + /* 113c - */ 0, + /* 113d - */ 0, + /* 113e - */ 0, + /* 113f - */ 0, + /* 1140 - */ 0, + /* 1141 - */ 0, + /* 1142 - */ 0, + /* 1143 - */ 0, + /* 1144 - */ 0, + /* 1145 - _V_66_0F_38_2E */ 0x4100, + /* 1146 - */ 0, + /* 1147 - */ 0, + /* 1148 - */ 0, + /* 1149 - */ 0, + /* 114a - */ 0, + /* 114b - */ 0, + /* 114c - */ 0, + /* 114d - */ 0, + /* 114e - */ 0, + /* 114f - */ 0, + /* 1150 - */ 0, + /* 1151 - _V_66_0F_38_2F */ 0x4101, + /* 1152 - */ 0, + /* 1153 - */ 0, + /* 1154 - */ 0, + /* 1155 - */ 0, + /* 1156 - */ 0, + /* 1157 - */ 0, + /* 1158 - */ 0, + /* 1159 - _66_0F_38_30 */ 0x24a6, + /* 115a - */ 0, + /* 115b - */ 0, + /* 115c - */ 0, + /* 115d - _V_66_0F_38_30 */ 0x4102, + /* 115e - */ 0, + /* 115f - */ 0, + /* 1160 - */ 0, + /* 1161 - */ 0, + /* 1162 - */ 0, + /* 1163 - */ 0, + /* 1164 - */ 0, + /* 1165 - _66_0F_38_31 */ 0x24a7, + /* 1166 - */ 0, + /* 1167 - */ 0, + /* 1168 - */ 0, + /* 1169 - _V_66_0F_38_31 */ 0x4103, + /* 116a - */ 0, + /* 116b - */ 0, + /* 116c - */ 0, + /* 116d - */ 0, + /* 116e - */ 0, + /* 116f - */ 0, + /* 1170 - */ 0, + /* 1171 - _66_0F_38_32 */ 0x24a8, + /* 1172 - */ 0, + /* 1173 - */ 0, + /* 1174 - */ 0, + /* 1175 - _V_66_0F_38_32 */ 0x4104, + /* 1176 - */ 0, + /* 1177 - */ 0, + /* 1178 - */ 0, + /* 1179 - */ 0, + /* 117a - */ 0, + /* 117b - */ 0, + /* 117c - */ 0, + /* 117d - _66_0F_38_33 */ 0x24a9, + /* 117e - */ 0, + /* 117f - */ 0, + /* 1180 - */ 0, + /* 1181 - _V_66_0F_38_33 */ 0x4105, + /* 1182 - */ 0, + /* 1183 - */ 0, + /* 1184 - */ 0, + /* 1185 - */ 0, + /* 1186 - */ 0, + /* 1187 - */ 0, + /* 1188 - */ 0, + /* 1189 - _66_0F_38_34 */ 0x24aa, + /* 118a - */ 0, + /* 118b - */ 0, + /* 118c - */ 0, + /* 118d - _V_66_0F_38_34 */ 0x4106, + /* 118e - */ 0, + /* 118f - */ 0, + /* 1190 - */ 0, + /* 1191 - */ 0, + /* 1192 - */ 0, + /* 1193 - */ 0, + /* 1194 - */ 0, + /* 1195 - _66_0F_38_35 */ 0x24ab, + /* 1196 - */ 0, + /* 1197 - */ 0, + /* 1198 - */ 0, + /* 1199 - _V_66_0F_38_35 */ 0x4107, + /* 119a - */ 0, + /* 119b - */ 0, + /* 119c - */ 0, + /* 119d - */ 0, + /* 119e - */ 0, + /* 119f - */ 0, + /* 11a0 - */ 0, + /* 11a1 - _66_0F_38_37 */ 0x24ac, + /* 11a2 - */ 0, + /* 11a3 - */ 0, + /* 11a4 - */ 0, + /* 11a5 - _V_66_0F_38_37 */ 0x4108, + /* 11a6 - */ 0, + /* 11a7 - */ 0, + /* 11a8 - */ 0, + /* 11a9 - */ 0, + /* 11aa - */ 0, + /* 11ab - */ 0, + /* 11ac - */ 0, + /* 11ad - _66_0F_38_38 */ 0x24ad, + /* 11ae - */ 0, + /* 11af - */ 0, + /* 11b0 - */ 0, + /* 11b1 - _V_66_0F_38_38 */ 0x4109, + /* 11b2 - */ 0, + /* 11b3 - */ 0, + /* 11b4 - */ 0, + /* 11b5 - */ 0, + /* 11b6 - */ 0, + /* 11b7 - */ 0, + /* 11b8 - */ 0, + /* 11b9 - _66_0F_38_39 */ 0x24ae, + /* 11ba - */ 0, + /* 11bb - */ 0, + /* 11bc - */ 0, + /* 11bd - _V_66_0F_38_39 */ 0x410a, + /* 11be - */ 0, + /* 11bf - */ 0, + /* 11c0 - */ 0, + /* 11c1 - */ 0, + /* 11c2 - */ 0, + /* 11c3 - */ 0, + /* 11c4 - */ 0, + /* 11c5 - _66_0F_38_3A */ 0x24af, + /* 11c6 - */ 0, + /* 11c7 - */ 0, + /* 11c8 - */ 0, + /* 11c9 - _V_66_0F_38_3A */ 0x410b, + /* 11ca - */ 0, + /* 11cb - */ 0, + /* 11cc - */ 0, + /* 11cd - */ 0, + /* 11ce - */ 0, + /* 11cf - */ 0, + /* 11d0 - */ 0, + /* 11d1 - _66_0F_38_3B */ 0x24b0, + /* 11d2 - */ 0, + /* 11d3 - */ 0, + /* 11d4 - */ 0, + /* 11d5 - _V_66_0F_38_3B */ 0x410c, + /* 11d6 - */ 0, + /* 11d7 - */ 0, + /* 11d8 - */ 0, + /* 11d9 - */ 0, + /* 11da - */ 0, + /* 11db - */ 0, + /* 11dc - */ 0, + /* 11dd - _66_0F_38_3C */ 0x24b1, + /* 11de - */ 0, + /* 11df - */ 0, + /* 11e0 - */ 0, + /* 11e1 - _V_66_0F_38_3C */ 0x410d, + /* 11e2 - */ 0, + /* 11e3 - */ 0, + /* 11e4 - */ 0, + /* 11e5 - */ 0, + /* 11e6 - */ 0, + /* 11e7 - */ 0, + /* 11e8 - */ 0, + /* 11e9 - _66_0F_38_3D */ 0x24b2, + /* 11ea - */ 0, + /* 11eb - */ 0, + /* 11ec - */ 0, + /* 11ed - _V_66_0F_38_3D */ 0x410e, + /* 11ee - */ 0, + /* 11ef - */ 0, + /* 11f0 - */ 0, + /* 11f1 - */ 0, + /* 11f2 - */ 0, + /* 11f3 - */ 0, + /* 11f4 - */ 0, + /* 11f5 - _66_0F_38_3E */ 0x24b3, + /* 11f6 - */ 0, + /* 11f7 - */ 0, + /* 11f8 - */ 0, + /* 11f9 - _V_66_0F_38_3E */ 0x410f, + /* 11fa - */ 0, + /* 11fb - */ 0, + /* 11fc - */ 0, + /* 11fd - */ 0, + /* 11fe - */ 0, + /* 11ff - */ 0, + /* 1200 - */ 0, + /* 1201 - _66_0F_38_3F */ 0x24b4, + /* 1202 - */ 0, + /* 1203 - */ 0, + /* 1204 - */ 0, + /* 1205 - _V_66_0F_38_3F */ 0x4110, + /* 1206 - */ 0, + /* 1207 - */ 0, + /* 1208 - */ 0, + /* 1209 - */ 0, + /* 120a - */ 0, + /* 120b - */ 0, + /* 120c - */ 0, + /* 120d - _66_0F_38_40 */ 0x24b5, + /* 120e - */ 0, + /* 120f - */ 0, + /* 1210 - */ 0, + /* 1211 - _V_66_0F_38_40 */ 0x4111, + /* 1212 - */ 0, + /* 1213 - */ 0, + /* 1214 - */ 0, + /* 1215 - */ 0, + /* 1216 - */ 0, + /* 1217 - */ 0, + /* 1218 - */ 0, + /* 1219 - _66_0F_38_41 */ 0x24b6, + /* 121a - */ 0, + /* 121b - */ 0, + /* 121c - */ 0, + /* 121d - _V_66_0F_38_41 */ 0x4112, + /* 121e - */ 0, + /* 121f - */ 0, + /* 1220 - */ 0, + /* 1221 - */ 0, + /* 1222 - */ 0, + /* 1223 - */ 0, + /* 1224 - */ 0, + /* 1225 - _66_0F_38_80 */ 0x24b7, + /* 1226 - */ 0, + /* 1227 - */ 0, + /* 1228 - */ 0, + /* 1229 - */ 0, + /* 122a - */ 0, + /* 122b - */ 0, + /* 122c - */ 0, + /* 122d - */ 0, + /* 122e - */ 0, + /* 122f - */ 0, + /* 1230 - */ 0, + /* 1231 - _66_0F_38_81 */ 0x24b8, + /* 1232 - */ 0, + /* 1233 - */ 0, + /* 1234 - */ 0, + /* 1235 - */ 0, + /* 1236 - */ 0, + /* 1237 - */ 0, + /* 1238 - */ 0, + /* 1239 - */ 0, + /* 123a - */ 0, + /* 123b - */ 0, + /* 123c - */ 0, + /* 123d - _66_0F_38_82 */ 0x24b9, + /* 123e - */ 0, + /* 123f - */ 0, + /* 1240 - */ 0, + /* 1241 - */ 0, + /* 1242 - */ 0, + /* 1243 - */ 0, + /* 1244 - */ 0, + /* 1245 - */ 0, + /* 1246 - */ 0, + /* 1247 - */ 0, + /* 1248 - */ 0, + /* 1249 - */ 0, + /* 124a - */ 0, + /* 124b - */ 0, + /* 124c - */ 0, + /* 124d - _V_66_0F_38_96 */ 0x4113, + /* 124e - */ 0, + /* 124f - */ 0, + /* 1250 - */ 0, + /* 1251 - */ 0, + /* 1252 - */ 0, + /* 1253 - */ 0, + /* 1254 - */ 0, + /* 1255 - */ 0, + /* 1256 - */ 0, + /* 1257 - */ 0, + /* 1258 - */ 0, + /* 1259 - _V_66_0F_38_97 */ 0x4114, + /* 125a - */ 0, + /* 125b - */ 0, + /* 125c - */ 0, + /* 125d - */ 0, + /* 125e - */ 0, + /* 125f - */ 0, + /* 1260 - */ 0, + /* 1261 - */ 0, + /* 1262 - */ 0, + /* 1263 - */ 0, + /* 1264 - */ 0, + /* 1265 - _V_66_0F_38_98 */ 0x4115, + /* 1266 - */ 0, + /* 1267 - */ 0, + /* 1268 - */ 0, + /* 1269 - */ 0, + /* 126a - */ 0, + /* 126b - */ 0, + /* 126c - */ 0, + /* 126d - */ 0, + /* 126e - */ 0, + /* 126f - */ 0, + /* 1270 - */ 0, + /* 1271 - _V_66_0F_38_99 */ 0x4116, + /* 1272 - */ 0, + /* 1273 - */ 0, + /* 1274 - */ 0, + /* 1275 - */ 0, + /* 1276 - */ 0, + /* 1277 - */ 0, + /* 1278 - */ 0, + /* 1279 - */ 0, + /* 127a - */ 0, + /* 127b - */ 0, + /* 127c - */ 0, + /* 127d - _V_66_0F_38_9A */ 0x4117, + /* 127e - */ 0, + /* 127f - */ 0, + /* 1280 - */ 0, + /* 1281 - */ 0, + /* 1282 - */ 0, + /* 1283 - */ 0, + /* 1284 - */ 0, + /* 1285 - */ 0, + /* 1286 - */ 0, + /* 1287 - */ 0, + /* 1288 - */ 0, + /* 1289 - _V_66_0F_38_9B */ 0x4118, + /* 128a - */ 0, + /* 128b - */ 0, + /* 128c - */ 0, + /* 128d - */ 0, + /* 128e - */ 0, + /* 128f - */ 0, + /* 1290 - */ 0, + /* 1291 - */ 0, + /* 1292 - */ 0, + /* 1293 - */ 0, + /* 1294 - */ 0, + /* 1295 - _V_66_0F_38_9C */ 0x4119, + /* 1296 - */ 0, + /* 1297 - */ 0, + /* 1298 - */ 0, + /* 1299 - */ 0, + /* 129a - */ 0, + /* 129b - */ 0, + /* 129c - */ 0, + /* 129d - */ 0, + /* 129e - */ 0, + /* 129f - */ 0, + /* 12a0 - */ 0, + /* 12a1 - _V_66_0F_38_9D */ 0x411a, + /* 12a2 - */ 0, + /* 12a3 - */ 0, + /* 12a4 - */ 0, + /* 12a5 - */ 0, + /* 12a6 - */ 0, + /* 12a7 - */ 0, + /* 12a8 - */ 0, + /* 12a9 - */ 0, + /* 12aa - */ 0, + /* 12ab - */ 0, + /* 12ac - */ 0, + /* 12ad - _V_66_0F_38_9E */ 0x411b, + /* 12ae - */ 0, + /* 12af - */ 0, + /* 12b0 - */ 0, + /* 12b1 - */ 0, + /* 12b2 - */ 0, + /* 12b3 - */ 0, + /* 12b4 - */ 0, + /* 12b5 - */ 0, + /* 12b6 - */ 0, + /* 12b7 - */ 0, + /* 12b8 - */ 0, + /* 12b9 - _V_66_0F_38_9F */ 0x411c, + /* 12ba - */ 0, + /* 12bb - */ 0, + /* 12bc - */ 0, + /* 12bd - */ 0, + /* 12be - */ 0, + /* 12bf - */ 0, + /* 12c0 - */ 0, + /* 12c1 - */ 0, + /* 12c2 - */ 0, + /* 12c3 - */ 0, + /* 12c4 - */ 0, + /* 12c5 - _V_66_0F_38_A6 */ 0x411d, + /* 12c6 - */ 0, + /* 12c7 - */ 0, + /* 12c8 - */ 0, + /* 12c9 - */ 0, + /* 12ca - */ 0, + /* 12cb - */ 0, + /* 12cc - */ 0, + /* 12cd - */ 0, + /* 12ce - */ 0, + /* 12cf - */ 0, + /* 12d0 - */ 0, + /* 12d1 - _V_66_0F_38_A7 */ 0x411e, + /* 12d2 - */ 0, + /* 12d3 - */ 0, + /* 12d4 - */ 0, + /* 12d5 - */ 0, + /* 12d6 - */ 0, + /* 12d7 - */ 0, + /* 12d8 - */ 0, + /* 12d9 - */ 0, + /* 12da - */ 0, + /* 12db - */ 0, + /* 12dc - */ 0, + /* 12dd - _V_66_0F_38_A8 */ 0x411f, + /* 12de - */ 0, + /* 12df - */ 0, + /* 12e0 - */ 0, + /* 12e1 - */ 0, + /* 12e2 - */ 0, + /* 12e3 - */ 0, + /* 12e4 - */ 0, + /* 12e5 - */ 0, + /* 12e6 - */ 0, + /* 12e7 - */ 0, + /* 12e8 - */ 0, + /* 12e9 - _V_66_0F_38_A9 */ 0x4120, + /* 12ea - */ 0, + /* 12eb - */ 0, + /* 12ec - */ 0, + /* 12ed - */ 0, + /* 12ee - */ 0, + /* 12ef - */ 0, + /* 12f0 - */ 0, + /* 12f1 - */ 0, + /* 12f2 - */ 0, + /* 12f3 - */ 0, + /* 12f4 - */ 0, + /* 12f5 - _V_66_0F_38_AA */ 0x4121, + /* 12f6 - */ 0, + /* 12f7 - */ 0, + /* 12f8 - */ 0, + /* 12f9 - */ 0, + /* 12fa - */ 0, + /* 12fb - */ 0, + /* 12fc - */ 0, + /* 12fd - */ 0, + /* 12fe - */ 0, + /* 12ff - */ 0, + /* 1300 - */ 0, + /* 1301 - _V_66_0F_38_AB */ 0x4122, + /* 1302 - */ 0, + /* 1303 - */ 0, + /* 1304 - */ 0, + /* 1305 - */ 0, + /* 1306 - */ 0, + /* 1307 - */ 0, + /* 1308 - */ 0, + /* 1309 - */ 0, + /* 130a - */ 0, + /* 130b - */ 0, + /* 130c - */ 0, + /* 130d - _V_66_0F_38_AC */ 0x4123, + /* 130e - */ 0, + /* 130f - */ 0, + /* 1310 - */ 0, + /* 1311 - */ 0, + /* 1312 - */ 0, + /* 1313 - */ 0, + /* 1314 - */ 0, + /* 1315 - */ 0, + /* 1316 - */ 0, + /* 1317 - */ 0, + /* 1318 - */ 0, + /* 1319 - _V_66_0F_38_AD */ 0x4124, + /* 131a - */ 0, + /* 131b - */ 0, + /* 131c - */ 0, + /* 131d - */ 0, + /* 131e - */ 0, + /* 131f - */ 0, + /* 1320 - */ 0, + /* 1321 - */ 0, + /* 1322 - */ 0, + /* 1323 - */ 0, + /* 1324 - */ 0, + /* 1325 - _V_66_0F_38_AE */ 0x4125, + /* 1326 - */ 0, + /* 1327 - */ 0, + /* 1328 - */ 0, + /* 1329 - */ 0, + /* 132a - */ 0, + /* 132b - */ 0, + /* 132c - */ 0, + /* 132d - */ 0, + /* 132e - */ 0, + /* 132f - */ 0, + /* 1330 - */ 0, + /* 1331 - _V_66_0F_38_AF */ 0x4126, + /* 1332 - */ 0, + /* 1333 - */ 0, + /* 1334 - */ 0, + /* 1335 - */ 0, + /* 1336 - */ 0, + /* 1337 - */ 0, + /* 1338 - */ 0, + /* 1339 - */ 0, + /* 133a - */ 0, + /* 133b - */ 0, + /* 133c - */ 0, + /* 133d - _V_66_0F_38_B6 */ 0x4127, + /* 133e - */ 0, + /* 133f - */ 0, + /* 1340 - */ 0, + /* 1341 - */ 0, + /* 1342 - */ 0, + /* 1343 - */ 0, + /* 1344 - */ 0, + /* 1345 - */ 0, + /* 1346 - */ 0, + /* 1347 - */ 0, + /* 1348 - */ 0, + /* 1349 - _V_66_0F_38_B7 */ 0x4128, + /* 134a - */ 0, + /* 134b - */ 0, + /* 134c - */ 0, + /* 134d - */ 0, + /* 134e - */ 0, + /* 134f - */ 0, + /* 1350 - */ 0, + /* 1351 - */ 0, + /* 1352 - */ 0, + /* 1353 - */ 0, + /* 1354 - */ 0, + /* 1355 - _V_66_0F_38_B8 */ 0x4129, + /* 1356 - */ 0, + /* 1357 - */ 0, + /* 1358 - */ 0, + /* 1359 - */ 0, + /* 135a - */ 0, + /* 135b - */ 0, + /* 135c - */ 0, + /* 135d - */ 0, + /* 135e - */ 0, + /* 135f - */ 0, + /* 1360 - */ 0, + /* 1361 - _V_66_0F_38_B9 */ 0x412a, + /* 1362 - */ 0, + /* 1363 - */ 0, + /* 1364 - */ 0, + /* 1365 - */ 0, + /* 1366 - */ 0, + /* 1367 - */ 0, + /* 1368 - */ 0, + /* 1369 - */ 0, + /* 136a - */ 0, + /* 136b - */ 0, + /* 136c - */ 0, + /* 136d - _V_66_0F_38_BA */ 0x412b, + /* 136e - */ 0, + /* 136f - */ 0, + /* 1370 - */ 0, + /* 1371 - */ 0, + /* 1372 - */ 0, + /* 1373 - */ 0, + /* 1374 - */ 0, + /* 1375 - */ 0, + /* 1376 - */ 0, + /* 1377 - */ 0, + /* 1378 - */ 0, + /* 1379 - _V_66_0F_38_BB */ 0x412c, + /* 137a - */ 0, + /* 137b - */ 0, + /* 137c - */ 0, + /* 137d - */ 0, + /* 137e - */ 0, + /* 137f - */ 0, + /* 1380 - */ 0, + /* 1381 - */ 0, + /* 1382 - */ 0, + /* 1383 - */ 0, + /* 1384 - */ 0, + /* 1385 - _V_66_0F_38_BC */ 0x412d, + /* 1386 - */ 0, + /* 1387 - */ 0, + /* 1388 - */ 0, + /* 1389 - */ 0, + /* 138a - */ 0, + /* 138b - */ 0, + /* 138c - */ 0, + /* 138d - */ 0, + /* 138e - */ 0, + /* 138f - */ 0, + /* 1390 - */ 0, + /* 1391 - _V_66_0F_38_BD */ 0x412e, + /* 1392 - */ 0, + /* 1393 - */ 0, + /* 1394 - */ 0, + /* 1395 - */ 0, + /* 1396 - */ 0, + /* 1397 - */ 0, + /* 1398 - */ 0, + /* 1399 - */ 0, + /* 139a - */ 0, + /* 139b - */ 0, + /* 139c - */ 0, + /* 139d - _V_66_0F_38_BE */ 0x412f, + /* 139e - */ 0, + /* 139f - */ 0, + /* 13a0 - */ 0, + /* 13a1 - */ 0, + /* 13a2 - */ 0, + /* 13a3 - */ 0, + /* 13a4 - */ 0, + /* 13a5 - */ 0, + /* 13a6 - */ 0, + /* 13a7 - */ 0, + /* 13a8 - */ 0, + /* 13a9 - _V_66_0F_38_BF */ 0x4130, + /* 13aa - */ 0, + /* 13ab - */ 0, + /* 13ac - */ 0, + /* 13ad - */ 0, + /* 13ae - */ 0, + /* 13af - */ 0, + /* 13b0 - */ 0, + /* 13b1 - _66_0F_38_DB */ 0x24ba, + /* 13b2 - */ 0, + /* 13b3 - */ 0, + /* 13b4 - */ 0, + /* 13b5 - _V_66_0F_38_DB */ 0x4131, + /* 13b6 - */ 0, + /* 13b7 - */ 0, + /* 13b8 - */ 0, + /* 13b9 - */ 0, + /* 13ba - */ 0, + /* 13bb - */ 0, + /* 13bc - */ 0, + /* 13bd - _66_0F_38_DC */ 0x24bb, + /* 13be - */ 0, + /* 13bf - */ 0, + /* 13c0 - */ 0, + /* 13c1 - _V_66_0F_38_DC */ 0x4132, + /* 13c2 - */ 0, + /* 13c3 - */ 0, + /* 13c4 - */ 0, + /* 13c5 - */ 0, + /* 13c6 - */ 0, + /* 13c7 - */ 0, + /* 13c8 - */ 0, + /* 13c9 - _66_0F_38_DD */ 0x24bc, + /* 13ca - */ 0, + /* 13cb - */ 0, + /* 13cc - */ 0, + /* 13cd - _V_66_0F_38_DD */ 0x4133, + /* 13ce - */ 0, + /* 13cf - */ 0, + /* 13d0 - */ 0, + /* 13d1 - */ 0, + /* 13d2 - */ 0, + /* 13d3 - */ 0, + /* 13d4 - */ 0, + /* 13d5 - _66_0F_38_DE */ 0x24bd, + /* 13d6 - */ 0, + /* 13d7 - */ 0, + /* 13d8 - */ 0, + /* 13d9 - _V_66_0F_38_DE */ 0x4134, + /* 13da - */ 0, + /* 13db - */ 0, + /* 13dc - */ 0, + /* 13dd - */ 0, + /* 13de - */ 0, + /* 13df - */ 0, + /* 13e0 - */ 0, + /* 13e1 - _66_0F_38_DF */ 0x24be, + /* 13e2 - */ 0, + /* 13e3 - */ 0, + /* 13e4 - */ 0, + /* 13e5 - _V_66_0F_38_DF */ 0x4135, + /* 13e6 - */ 0, + /* 13e7 - */ 0, + /* 13e8 - */ 0, + /* 13e9 - */ 0, + /* 13ea - */ 0, + /* 13eb - */ 0, + /* 13ec - _0F_38_F0 */ 0x24bf, + /* 13ed - */ 0, + /* 13ee - */ 0, + /* 13ef - _F2_0F_38_F0 */ 0x24c0, + /* 13f0 - */ 0, + /* 13f1 - */ 0, + /* 13f2 - */ 0, + /* 13f3 - */ 0, + /* 13f4 - */ 0, + /* 13f5 - */ 0, + /* 13f6 - */ 0, + /* 13f7 - */ 0, + /* 13f8 - _0F_38_F1 */ 0x24c1, + /* 13f9 - */ 0, + /* 13fa - */ 0, + /* 13fb - _F2_0F_38_F1 */ 0x24c2, + /* 13fc - */ 0, + /* 13fd - */ 0, + /* 13fe - */ 0, + /* 13ff - */ 0, + /* 1400 - */ 0, + /* 1401 - */ 0, + /* 1402 - */ 0, + /* 1403 - */ 0, + /* 1404 - */ 0, + /* 1405 - */ 0, + /* 1406 - */ 0, + /* 1407 - */ 0, + /* 1408 - */ 0, + /* 1409 - _V_66_0F_3A_04 */ 0x4136, + /* 140a - */ 0, + /* 140b - */ 0, + /* 140c - */ 0, + /* 140d - */ 0, + /* 140e - */ 0, + /* 140f - */ 0, + /* 1410 - */ 0, + /* 1411 - */ 0, + /* 1412 - */ 0, + /* 1413 - */ 0, + /* 1414 - */ 0, + /* 1415 - _V_66_0F_3A_05 */ 0x4137, + /* 1416 - */ 0, + /* 1417 - */ 0, + /* 1418 - */ 0, + /* 1419 - */ 0, + /* 141a - */ 0, + /* 141b - */ 0, + /* 141c - */ 0, + /* 141d - */ 0, + /* 141e - */ 0, + /* 141f - */ 0, + /* 1420 - */ 0, + /* 1421 - _V_66_0F_3A_06 */ 0x4138, + /* 1422 - */ 0, + /* 1423 - */ 0, + /* 1424 - */ 0, + /* 1425 - */ 0, + /* 1426 - */ 0, + /* 1427 - */ 0, + /* 1428 - */ 0, + /* 1429 - _66_0F_3A_08 */ 0x4139, + /* 142a - */ 0, + /* 142b - */ 0, + /* 142c - */ 0, + /* 142d - _V_66_0F_3A_08 */ 0x413a, + /* 142e - */ 0, + /* 142f - */ 0, + /* 1430 - */ 0, + /* 1431 - */ 0, + /* 1432 - */ 0, + /* 1433 - */ 0, + /* 1434 - */ 0, + /* 1435 - _66_0F_3A_09 */ 0x413b, + /* 1436 - */ 0, + /* 1437 - */ 0, + /* 1438 - */ 0, + /* 1439 - _V_66_0F_3A_09 */ 0x413c, + /* 143a - */ 0, + /* 143b - */ 0, + /* 143c - */ 0, + /* 143d - */ 0, + /* 143e - */ 0, + /* 143f - */ 0, + /* 1440 - */ 0, + /* 1441 - _66_0F_3A_0A */ 0x413d, + /* 1442 - */ 0, + /* 1443 - */ 0, + /* 1444 - */ 0, + /* 1445 - _V_66_0F_3A_0A */ 0x413e, + /* 1446 - */ 0, + /* 1447 - */ 0, + /* 1448 - */ 0, + /* 1449 - */ 0, + /* 144a - */ 0, + /* 144b - */ 0, + /* 144c - */ 0, + /* 144d - _66_0F_3A_0B */ 0x413f, + /* 144e - */ 0, + /* 144f - */ 0, + /* 1450 - */ 0, + /* 1451 - _V_66_0F_3A_0B */ 0x4140, + /* 1452 - */ 0, + /* 1453 - */ 0, + /* 1454 - */ 0, + /* 1455 - */ 0, + /* 1456 - */ 0, + /* 1457 - */ 0, + /* 1458 - */ 0, + /* 1459 - _66_0F_3A_0C */ 0x4141, + /* 145a - */ 0, + /* 145b - */ 0, + /* 145c - */ 0, + /* 145d - _V_66_0F_3A_0C */ 0x4142, + /* 145e - */ 0, + /* 145f - */ 0, + /* 1460 - */ 0, + /* 1461 - */ 0, + /* 1462 - */ 0, + /* 1463 - */ 0, + /* 1464 - */ 0, + /* 1465 - _66_0F_3A_0D */ 0x4143, + /* 1466 - */ 0, + /* 1467 - */ 0, + /* 1468 - */ 0, + /* 1469 - _V_66_0F_3A_0D */ 0x4144, + /* 146a - */ 0, + /* 146b - */ 0, + /* 146c - */ 0, + /* 146d - */ 0, + /* 146e - */ 0, + /* 146f - */ 0, + /* 1470 - */ 0, + /* 1471 - _66_0F_3A_0E */ 0x4145, + /* 1472 - */ 0, + /* 1473 - */ 0, + /* 1474 - */ 0, + /* 1475 - _V_66_0F_3A_0E */ 0x4146, + /* 1476 - */ 0, + /* 1477 - */ 0, + /* 1478 - */ 0, + /* 1479 - */ 0, + /* 147a - */ 0, + /* 147b - */ 0, + /* 147c - _0F_3A_0F */ 0x4147, + /* 147d - _66_0F_3A_0F */ 0x4148, + /* 147e - */ 0, + /* 147f - */ 0, + /* 1480 - */ 0, + /* 1481 - _V_66_0F_3A_0F */ 0x4149, + /* 1482 - */ 0, + /* 1483 - */ 0, + /* 1484 - */ 0, + /* 1485 - */ 0, + /* 1486 - */ 0, + /* 1487 - */ 0, + /* 1488 - */ 0, + /* 1489 - _66_0F_3A_14 */ 0x414a, + /* 148a - */ 0, + /* 148b - */ 0, + /* 148c - */ 0, + /* 148d - _V_66_0F_3A_14 */ 0x414b, + /* 148e - */ 0, + /* 148f - */ 0, + /* 1490 - */ 0, + /* 1491 - */ 0, + /* 1492 - */ 0, + /* 1493 - */ 0, + /* 1494 - */ 0, + /* 1495 - _66_0F_3A_15 */ 0x414c, + /* 1496 - */ 0, + /* 1497 - */ 0, + /* 1498 - */ 0, + /* 1499 - _V_66_0F_3A_15 */ 0x414d, + /* 149a - */ 0, + /* 149b - */ 0, + /* 149c - */ 0, + /* 149d - */ 0, + /* 149e - */ 0, + /* 149f - */ 0, + /* 14a0 - */ 0, + /* 14a1 - _66_0F_3A_16 */ 0x414e, + /* 14a2 - */ 0, + /* 14a3 - */ 0, + /* 14a4 - */ 0, + /* 14a5 - _V_66_0F_3A_16 */ 0x414f, + /* 14a6 - */ 0, + /* 14a7 - */ 0, + /* 14a8 - */ 0, + /* 14a9 - */ 0, + /* 14aa - */ 0, + /* 14ab - */ 0, + /* 14ac - */ 0, + /* 14ad - _66_0F_3A_17 */ 0x4150, + /* 14ae - */ 0, + /* 14af - */ 0, + /* 14b0 - */ 0, + /* 14b1 - _V_66_0F_3A_17 */ 0x4151, + /* 14b2 - */ 0, + /* 14b3 - */ 0, + /* 14b4 - */ 0, + /* 14b5 - */ 0, + /* 14b6 - */ 0, + /* 14b7 - */ 0, + /* 14b8 - */ 0, + /* 14b9 - */ 0, + /* 14ba - */ 0, + /* 14bb - */ 0, + /* 14bc - */ 0, + /* 14bd - _V_66_0F_3A_18 */ 0x4152, + /* 14be - */ 0, + /* 14bf - */ 0, + /* 14c0 - */ 0, + /* 14c1 - */ 0, + /* 14c2 - */ 0, + /* 14c3 - */ 0, + /* 14c4 - */ 0, + /* 14c5 - */ 0, + /* 14c6 - */ 0, + /* 14c7 - */ 0, + /* 14c8 - */ 0, + /* 14c9 - _V_66_0F_3A_19 */ 0x4153, + /* 14ca - */ 0, + /* 14cb - */ 0, + /* 14cc - */ 0, + /* 14cd - */ 0, + /* 14ce - */ 0, + /* 14cf - */ 0, + /* 14d0 - */ 0, + /* 14d1 - _66_0F_3A_20 */ 0x4154, + /* 14d2 - */ 0, + /* 14d3 - */ 0, + /* 14d4 - */ 0, + /* 14d5 - _V_66_0F_3A_20 */ 0x4155, + /* 14d6 - */ 0, + /* 14d7 - */ 0, + /* 14d8 - */ 0, + /* 14d9 - */ 0, + /* 14da - */ 0, + /* 14db - */ 0, + /* 14dc - */ 0, + /* 14dd - _66_0F_3A_21 */ 0x4156, + /* 14de - */ 0, + /* 14df - */ 0, + /* 14e0 - */ 0, + /* 14e1 - _V_66_0F_3A_21 */ 0x4157, + /* 14e2 - */ 0, + /* 14e3 - */ 0, + /* 14e4 - */ 0, + /* 14e5 - */ 0, + /* 14e6 - */ 0, + /* 14e7 - */ 0, + /* 14e8 - */ 0, + /* 14e9 - _66_0F_3A_22 */ 0x4158, + /* 14ea - */ 0, + /* 14eb - */ 0, + /* 14ec - */ 0, + /* 14ed - _V_66_0F_3A_22 */ 0x4159, + /* 14ee - */ 0, + /* 14ef - */ 0, + /* 14f0 - */ 0, + /* 14f1 - */ 0, + /* 14f2 - */ 0, + /* 14f3 - */ 0, + /* 14f4 - */ 0, + /* 14f5 - _66_0F_3A_40 */ 0x415a, + /* 14f6 - */ 0, + /* 14f7 - */ 0, + /* 14f8 - */ 0, + /* 14f9 - _V_66_0F_3A_40 */ 0x415b, + /* 14fa - */ 0, + /* 14fb - */ 0, + /* 14fc - */ 0, + /* 14fd - */ 0, + /* 14fe - */ 0, + /* 14ff - */ 0, + /* 1500 - */ 0, + /* 1501 - _66_0F_3A_41 */ 0x415c, + /* 1502 - */ 0, + /* 1503 - */ 0, + /* 1504 - */ 0, + /* 1505 - _V_66_0F_3A_41 */ 0x415d, + /* 1506 - */ 0, + /* 1507 - */ 0, + /* 1508 - */ 0, + /* 1509 - */ 0, + /* 150a - */ 0, + /* 150b - */ 0, + /* 150c - */ 0, + /* 150d - _66_0F_3A_42 */ 0x415e, + /* 150e - */ 0, + /* 150f - */ 0, + /* 1510 - */ 0, + /* 1511 - _V_66_0F_3A_42 */ 0x415f, + /* 1512 - */ 0, + /* 1513 - */ 0, + /* 1514 - */ 0, + /* 1515 - */ 0, + /* 1516 - */ 0, + /* 1517 - */ 0, + /* 1518 - */ 0, + /* 1519 - _66_0F_3A_44 */ 0x4160, + /* 151a - */ 0, + /* 151b - */ 0, + /* 151c - */ 0, + /* 151d - _V_66_0F_3A_44 */ 0x4161, + /* 151e - */ 0, + /* 151f - */ 0, + /* 1520 - */ 0, + /* 1521 - */ 0, + /* 1522 - */ 0, + /* 1523 - */ 0, + /* 1524 - */ 0, + /* 1525 - */ 0, + /* 1526 - */ 0, + /* 1527 - */ 0, + /* 1528 - */ 0, + /* 1529 - _V_66_0F_3A_4A */ 0x4162, + /* 152a - */ 0, + /* 152b - */ 0, + /* 152c - */ 0, + /* 152d - */ 0, + /* 152e - */ 0, + /* 152f - */ 0, + /* 1530 - */ 0, + /* 1531 - */ 0, + /* 1532 - */ 0, + /* 1533 - */ 0, + /* 1534 - */ 0, + /* 1535 - _V_66_0F_3A_4B */ 0x4163, + /* 1536 - */ 0, + /* 1537 - */ 0, + /* 1538 - */ 0, + /* 1539 - */ 0, + /* 153a - */ 0, + /* 153b - */ 0, + /* 153c - */ 0, + /* 153d - */ 0, + /* 153e - */ 0, + /* 153f - */ 0, + /* 1540 - */ 0, + /* 1541 - _V_66_0F_3A_4C */ 0x4164, + /* 1542 - */ 0, + /* 1543 - */ 0, + /* 1544 - */ 0, + /* 1545 - */ 0, + /* 1546 - */ 0, + /* 1547 - */ 0, + /* 1548 - */ 0, + /* 1549 - _66_0F_3A_60 */ 0x4165, + /* 154a - */ 0, + /* 154b - */ 0, + /* 154c - */ 0, + /* 154d - _V_66_0F_3A_60 */ 0x4166, + /* 154e - */ 0, + /* 154f - */ 0, + /* 1550 - */ 0, + /* 1551 - */ 0, + /* 1552 - */ 0, + /* 1553 - */ 0, + /* 1554 - */ 0, + /* 1555 - _66_0F_3A_61 */ 0x4167, + /* 1556 - */ 0, + /* 1557 - */ 0, + /* 1558 - */ 0, + /* 1559 - _V_66_0F_3A_61 */ 0x4168, + /* 155a - */ 0, + /* 155b - */ 0, + /* 155c - */ 0, + /* 155d - */ 0, + /* 155e - */ 0, + /* 155f - */ 0, + /* 1560 - */ 0, + /* 1561 - _66_0F_3A_62 */ 0x4169, + /* 1562 - */ 0, + /* 1563 - */ 0, + /* 1564 - */ 0, + /* 1565 - _V_66_0F_3A_62 */ 0x416a, + /* 1566 - */ 0, + /* 1567 - */ 0, + /* 1568 - */ 0, + /* 1569 - */ 0, + /* 156a - */ 0, + /* 156b - */ 0, + /* 156c - */ 0, + /* 156d - _66_0F_3A_63 */ 0x416b, + /* 156e - */ 0, + /* 156f - */ 0, + /* 1570 - */ 0, + /* 1571 - _V_66_0F_3A_63 */ 0x416c, + /* 1572 - */ 0, + /* 1573 - */ 0, + /* 1574 - */ 0, + /* 1575 - */ 0, + /* 1576 - */ 0, + /* 1577 - */ 0, + /* 1578 - */ 0, + /* 1579 - _66_0F_3A_DF */ 0x416d, + /* 157a - */ 0, + /* 157b - */ 0, + /* 157c - */ 0, + /* 157d - _V_66_0F_3A_DF */ 0x416e, + /* 157e - */ 0, + /* 157f - */ 0, + /* 1580 - */ 0, + /* 1581 - */ 0, + /* 1582 - */ 0, + /* 1583 - */ 0, + /* 1584 - _0F_71_02 */ 0x24c3, + /* 1585 - _66_0F_71_02 */ 0x24c4, + /* 1586 - */ 0, + /* 1587 - */ 0, + /* 1588 - */ 0, + /* 1589 - _V_66_0F_71_02 */ 0x416f, + /* 158a - */ 0, + /* 158b - */ 0, + /* 158c - */ 0, + /* 158d - */ 0, + /* 158e - */ 0, + /* 158f - */ 0, + /* 1590 - _0F_71_04 */ 0x24c5, + /* 1591 - _66_0F_71_04 */ 0x24c6, + /* 1592 - */ 0, + /* 1593 - */ 0, + /* 1594 - */ 0, + /* 1595 - _V_66_0F_71_04 */ 0x4170, + /* 1596 - */ 0, + /* 1597 - */ 0, + /* 1598 - */ 0, + /* 1599 - */ 0, + /* 159a - */ 0, + /* 159b - */ 0, + /* 159c - _0F_71_06 */ 0x24c7, + /* 159d - _66_0F_71_06 */ 0x24c8, + /* 159e - */ 0, + /* 159f - */ 0, + /* 15a0 - */ 0, + /* 15a1 - _V_66_0F_71_06 */ 0x4171, + /* 15a2 - */ 0, + /* 15a3 - */ 0, + /* 15a4 - */ 0, + /* 15a5 - */ 0, + /* 15a6 - */ 0, + /* 15a7 - */ 0, + /* 15a8 - _0F_72_02 */ 0x24c9, + /* 15a9 - _66_0F_72_02 */ 0x24ca, + /* 15aa - */ 0, + /* 15ab - */ 0, + /* 15ac - */ 0, + /* 15ad - _V_66_0F_72_02 */ 0x4172, + /* 15ae - */ 0, + /* 15af - */ 0, + /* 15b0 - */ 0, + /* 15b1 - */ 0, + /* 15b2 - */ 0, + /* 15b3 - */ 0, + /* 15b4 - _0F_72_04 */ 0x24cb, + /* 15b5 - _66_0F_72_04 */ 0x24cc, + /* 15b6 - */ 0, + /* 15b7 - */ 0, + /* 15b8 - */ 0, + /* 15b9 - _V_66_0F_72_04 */ 0x4173, + /* 15ba - */ 0, + /* 15bb - */ 0, + /* 15bc - */ 0, + /* 15bd - */ 0, + /* 15be - */ 0, + /* 15bf - */ 0, + /* 15c0 - _0F_72_06 */ 0x24cd, + /* 15c1 - _66_0F_72_06 */ 0x24ce, + /* 15c2 - */ 0, + /* 15c3 - */ 0, + /* 15c4 - */ 0, + /* 15c5 - _V_66_0F_72_06 */ 0x4174, + /* 15c6 - */ 0, + /* 15c7 - */ 0, + /* 15c8 - */ 0, + /* 15c9 - */ 0, + /* 15ca - */ 0, + /* 15cb - */ 0, + /* 15cc - _0F_73_02 */ 0x24cf, + /* 15cd - _66_0F_73_02 */ 0x24d0, + /* 15ce - */ 0, + /* 15cf - */ 0, + /* 15d0 - */ 0, + /* 15d1 - _V_66_0F_73_02 */ 0x4175, + /* 15d2 - */ 0, + /* 15d3 - */ 0, + /* 15d4 - */ 0, + /* 15d5 - */ 0, + /* 15d6 - */ 0, + /* 15d7 - */ 0, + /* 15d8 - */ 0, + /* 15d9 - _66_0F_73_03 */ 0x24d1, + /* 15da - */ 0, + /* 15db - */ 0, + /* 15dc - */ 0, + /* 15dd - _V_66_0F_73_03 */ 0x4176, + /* 15de - */ 0, + /* 15df - */ 0, + /* 15e0 - */ 0, + /* 15e1 - */ 0, + /* 15e2 - */ 0, + /* 15e3 - */ 0, + /* 15e4 - _0F_73_06 */ 0x24d2, + /* 15e5 - _66_0F_73_06 */ 0x24d3, + /* 15e6 - */ 0, + /* 15e7 - */ 0, + /* 15e8 - */ 0, + /* 15e9 - _V_66_0F_73_06 */ 0x4177, + /* 15ea - */ 0, + /* 15eb - */ 0, + /* 15ec - */ 0, + /* 15ed - */ 0, + /* 15ee - */ 0, + /* 15ef - */ 0, + /* 15f0 - */ 0, + /* 15f1 - _66_0F_73_07 */ 0x24d4, + /* 15f2 - */ 0, + /* 15f3 - */ 0, + /* 15f4 - */ 0, + /* 15f5 - _V_66_0F_73_07 */ 0x4178, + /* 15f6 - */ 0, + /* 15f7 - */ 0, + /* 15f8 - */ 0, + /* 15f9 - */ 0, + /* 15fa - */ 0, + /* 15fb - */ 0, + /* 15fc - _0F_AE_00 */ 0x4179, + /* 15fd - */ 0, + /* 15fe - _F3_0F_AE_00 */ 0x24d5, + /* 15ff - */ 0, + /* 1600 - */ 0, + /* 1601 - */ 0, + /* 1602 - */ 0, + /* 1603 - */ 0, + /* 1604 - */ 0, + /* 1605 - */ 0, + /* 1606 - */ 0, + /* 1607 - */ 0, + /* 1608 - _0F_AE_01 */ 0x417a, + /* 1609 - */ 0, + /* 160a - _F3_0F_AE_01 */ 0x24d6, + /* 160b - */ 0, + /* 160c - */ 0, + /* 160d - */ 0, + /* 160e - */ 0, + /* 160f - */ 0, + /* 1610 - */ 0, + /* 1611 - */ 0, + /* 1612 - */ 0, + /* 1613 - */ 0, + /* 1614 - _0F_AE_02 */ 0x24d7, + /* 1615 - */ 0, + /* 1616 - _F3_0F_AE_02 */ 0x24d8, + /* 1617 - */ 0, + /* 1618 - _V_0F_AE_02 */ 0x417b, + /* 1619 - */ 0, + /* 161a - */ 0, + /* 161b - */ 0, + /* 161c - */ 0, + /* 161d - */ 0, + /* 161e - */ 0, + /* 161f - */ 0, + /* 1620 - _0F_AE_03 */ 0x24d9, + /* 1621 - */ 0, + /* 1622 - _F3_0F_AE_03 */ 0x24da, + /* 1623 - */ 0, + /* 1624 - _V_0F_AE_03 */ 0x417c, + /* 1625 - */ 0, + /* 1626 - */ 0, + /* 1627 - */ 0, + /* 1628 - */ 0, + /* 1629 - */ 0, + /* 162a - */ 0, + /* 162b - */ 0, + /* 162c - _0F_C7_06 */ 0x24db, + /* 162d - _66_0F_C7_06 */ 0x24dc, + /* 162e - _F3_0F_C7_06 */ 0x24dd, + /* 162f - */ 0, + /* 1630 - */ 0, + /* 1631 - */ 0, + /* 1632 - */ 0, + /* 1633 - */ 0, + /* 1634 - */ 0, + /* 1635 - */ 0, + /* 1636 - */ 0, + /* 1637 - */ 0 +}; + +_InstSharedInfo InstSharedInfoTable[470] = { + { 0, 9, 15, 8, 245, 0, 0 }, + { 0, 11, 17, 8, 245, 0, 0 }, + { 0, 15, 9, 8, 245, 0, 0 }, + { 0, 17, 11, 8, 245, 0, 0 }, + { 1, 1, 33, 8, 245, 0, 0 }, + { 1, 3, 35, 8, 245, 0, 0 }, + { 2, 0, 32, 8, 0, 0, 0 }, + { 3, 0, 32, 8, 0, 0, 0 }, + { 0, 9, 15, 8, 196, 16, 0 }, + { 0, 11, 17, 8, 196, 16, 0 }, + { 0, 15, 9, 8, 196, 16, 0 }, + { 0, 17, 11, 8, 196, 16, 0 }, + { 1, 1, 33, 8, 196, 16, 0 }, + { 1, 3, 35, 8, 196, 16, 0 }, + { 4, 0, 32, 8, 0, 0, 0 }, + { 0, 9, 15, 8, 245, 1, 0 }, + { 0, 11, 17, 8, 245, 1, 0 }, + { 0, 15, 9, 8, 245, 1, 0 }, + { 0, 17, 11, 8, 245, 1, 0 }, + { 1, 1, 33, 8, 245, 1, 0 }, + { 1, 3, 35, 8, 245, 1, 0 }, + { 5, 0, 32, 8, 0, 0, 0 }, + { 6, 0, 32, 8, 0, 0, 0 }, + { 7, 0, 32, 8, 0, 0, 0 }, + { 8, 0, 32, 8, 0, 0, 0 }, + { 0, 9, 15, 8, 229, 0, 16 }, + { 0, 11, 17, 8, 229, 0, 16 }, + { 0, 15, 9, 8, 229, 0, 16 }, + { 0, 17, 11, 8, 229, 0, 16 }, + { 1, 1, 33, 8, 229, 0, 16 }, + { 1, 3, 35, 8, 229, 0, 16 }, + { 9, 0, 0, 8, 213, 17, 32 }, + { 0, 9, 15, 8, 196, 0, 16 }, + { 0, 11, 17, 8, 196, 0, 16 }, + { 0, 15, 9, 8, 196, 0, 16 }, + { 0, 17, 11, 8, 196, 0, 16 }, + { 1, 1, 33, 8, 196, 0, 16 }, + { 1, 3, 35, 8, 196, 0, 16 }, + { 9, 0, 0, 8, 17, 16, 228 }, + { 10, 9, 15, 8, 245, 0, 0 }, + { 10, 11, 17, 8, 245, 0, 0 }, + { 10, 15, 9, 8, 245, 0, 0 }, + { 10, 17, 11, 8, 245, 0, 0 }, + { 11, 1, 33, 8, 245, 0, 0 }, + { 11, 3, 35, 8, 245, 0, 0 }, + { 12, 0, 54, 8, 244, 0, 0 }, + { 13, 0, 54, 8, 0, 0, 0 }, + { 14, 0, 54, 8, 0, 0, 0 }, + { 15, 0, 0, 8, 0, 0, 0 }, + { 16, 42, 11, 8, 0, 0, 0 }, + { 10, 10, 16, 8, 64, 0, 0 }, + { 13, 0, 3, 8, 0, 0, 0 }, + { 17, 17, 11, 8, 33, 0, 212 }, + { 18, 0, 5, 8, 0, 0, 0 }, + { 19, 59, 56, 8, 0, 8, 0 }, + { 20, 59, 56, 8, 0, 8, 0 }, + { 19, 55, 59, 8, 0, 8, 0 }, + { 20, 55, 59, 8, 0, 8, 0 }, + { 13, 0, 40, 13, 0, 32, 0 }, + { 13, 0, 40, 13, 0, 1, 0 }, + { 13, 0, 40, 13, 0, 64, 0 }, + { 13, 0, 40, 13, 0, 65, 0 }, + { 13, 0, 40, 13, 0, 128, 0 }, + { 13, 0, 40, 13, 0, 4, 0 }, + { 13, 0, 40, 13, 0, 160, 0 }, + { 13, 0, 40, 13, 0, 224, 0 }, + { 10, 9, 15, 8, 196, 0, 16 }, + { 10, 11, 17, 8, 196, 0, 16 }, + { 0, 9, 15, 8, 0, 0, 0 }, + { 0, 11, 17, 8, 0, 0, 0 }, + { 21, 9, 15, 8, 0, 0, 0 }, + { 21, 11, 17, 8, 0, 0, 0 }, + { 21, 15, 9, 8, 0, 0, 0 }, + { 21, 17, 11, 8, 0, 0, 0 }, + { 21, 31, 28, 8, 0, 0, 0 }, + { 21, 42, 11, 8, 0, 0, 0 }, + { 21, 28, 31, 8, 0, 0, 0 }, + { 1, 35, 54, 8, 0, 0, 0 }, + { 22, 0, 0, 8, 0, 0, 0 }, + { 9, 0, 38, 9, 0, 0, 0 }, + { 23, 0, 0, 8, 0, 0, 0 }, + { 23, 0, 0, 8, 255, 0, 0 }, + { 11, 0, 0, 8, 213, 0, 0 }, + { 11, 0, 0, 8, 0, 0, 0 }, + { 1, 49, 33, 8, 0, 0, 0 }, + { 1, 50, 35, 8, 0, 0, 0 }, + { 1, 33, 49, 8, 0, 0, 0 }, + { 1, 35, 50, 8, 0, 0, 0 }, + { 24, 55, 56, 8, 0, 8, 0 }, + { 25, 55, 56, 8, 0, 8, 0 }, + { 19, 56, 55, 8, 245, 8, 0 }, + { 26, 56, 55, 8, 245, 8, 0 }, + { 11, 1, 33, 8, 196, 0, 16 }, + { 11, 3, 35, 8, 196, 0, 16 }, + { 19, 33, 56, 8, 0, 8, 0 }, + { 26, 35, 56, 8, 0, 8, 0 }, + { 19, 55, 33, 8, 0, 8, 0 }, + { 26, 55, 35, 8, 0, 8, 0 }, + { 19, 33, 56, 8, 245, 8, 0 }, + { 26, 35, 56, 8, 245, 8, 0 }, + { 1, 1, 53, 8, 0, 0, 0 }, + { 27, 3, 54, 8, 0, 0, 0 }, + { 13, 0, 2, 10, 0, 0, 0 }, + { 13, 0, 0, 10, 0, 0, 0 }, + { 16, 37, 11, 8, 0, 0, 0 }, + { 13, 8, 6, 8, 0, 0, 0 }, + { 13, 0, 0, 8, 0, 0, 0 }, + { 28, 0, 2, 10, 0, 0, 0 }, + { 28, 0, 0, 10, 0, 0, 0 }, + { 11, 0, 0, 14, 0, 0, 0 }, + { 11, 0, 1, 14, 0, 0, 0 }, + { 9, 0, 0, 14, 0, 0, 0 }, + { 28, 0, 0, 10, 255, 0, 0 }, + { 9, 0, 1, 8, 196, 0, 49 }, + { 9, 0, 0, 8, 0, 0, 0 }, + { 29, 0, 57, 8, 0, 0, 0 }, + { 30, 0, 40, 13, 0, 64, 0 }, + { 30, 0, 40, 13, 0, 0, 0 }, + { 31, 0, 40, 13, 0, 0, 0 }, + { 1, 1, 33, 8, 0, 0, 0 }, + { 1, 1, 36, 8, 0, 0, 0 }, + { 11, 33, 1, 8, 0, 0, 0 }, + { 11, 36, 1, 8, 0, 0, 0 }, + { 13, 0, 41, 9, 0, 0, 0 }, + { 13, 0, 41, 12, 0, 0, 0 }, + { 9, 0, 38, 12, 0, 0, 0 }, + { 13, 0, 40, 12, 0, 0, 0 }, + { 1, 59, 33, 8, 0, 0, 0 }, + { 1, 59, 36, 8, 0, 0, 0 }, + { 11, 33, 59, 8, 0, 0, 0 }, + { 11, 36, 59, 8, 0, 0, 0 }, + { 11, 0, 0, 8, 1, 0, 0 }, + { 11, 0, 0, 8, 2, 0, 0 }, + { 11, 0, 0, 8, 8, 0, 0 }, + { 10, 16, 11, 8, 64, 0, 0 }, + { 32, 0, 0, 27, 0, 0, 0 }, + { 32, 0, 0, 8, 0, 0, 0 }, + { 32, 0, 0, 14, 0, 0, 0 }, + { 11, 0, 0, 96, 0, 0, 0 }, + { 10, 0, 17, 8, 0, 0, 0 }, + { 33, 29, 14, 8, 0, 0, 0 }, + { 33, 30, 14, 8, 0, 0, 0 }, + { 33, 14, 29, 8, 0, 0, 0 }, + { 33, 14, 30, 8, 0, 0, 0 }, + { 34, 0, 0, 8, 0, 0, 0 }, + { 35, 17, 11, 31, 0, 32, 0 }, + { 35, 17, 11, 31, 0, 1, 0 }, + { 35, 17, 11, 31, 0, 64, 0 }, + { 35, 17, 11, 31, 0, 65, 0 }, + { 35, 17, 11, 31, 0, 128, 0 }, + { 35, 17, 11, 31, 0, 4, 0 }, + { 35, 17, 11, 31, 0, 160, 0 }, + { 35, 17, 11, 31, 0, 224, 0 }, + { 32, 0, 41, 13, 0, 32, 0 }, + { 32, 0, 41, 13, 0, 1, 0 }, + { 32, 0, 41, 13, 0, 64, 0 }, + { 32, 0, 41, 13, 0, 65, 0 }, + { 32, 0, 41, 13, 0, 128, 0 }, + { 32, 0, 41, 13, 0, 4, 0 }, + { 32, 0, 41, 13, 0, 160, 0 }, + { 32, 0, 41, 13, 0, 224, 0 }, + { 35, 0, 15, 8, 0, 32, 0 }, + { 35, 0, 15, 8, 0, 1, 0 }, + { 35, 0, 15, 8, 0, 64, 0 }, + { 35, 0, 15, 8, 0, 65, 0 }, + { 35, 0, 15, 8, 0, 128, 0 }, + { 35, 0, 15, 8, 0, 4, 0 }, + { 35, 0, 15, 8, 0, 160, 0 }, + { 35, 0, 15, 8, 0, 224, 0 }, + { 36, 0, 32, 8, 0, 0, 0 }, + { 37, 0, 32, 8, 0, 0, 0 }, + { 35, 11, 17, 8, 1, 0, 244 }, + { 38, 11, 17, 8, 197, 0, 48 }, + { 39, 0, 32, 8, 0, 0, 0 }, + { 40, 0, 32, 8, 0, 0, 0 }, + { 32, 0, 0, 8, 255, 0, 0 }, + { 41, 11, 17, 8, 1, 0, 244 }, + { 35, 17, 11, 8, 33, 0, 212 }, + { 41, 9, 15, 8, 245, 0, 0 }, + { 41, 11, 17, 8, 245, 0, 0 }, + { 42, 37, 11, 8, 0, 0, 0 }, + { 35, 15, 11, 8, 0, 0, 0 }, + { 43, 16, 11, 8, 0, 0, 0 }, + { 43, 13, 45, 48, 0, 0, 0 }, + { 44, 0, 54, 8, 0, 0, 0 }, + { 45, 1, 15, 8, 245, 0, 0 }, + { 45, 1, 15, 8, 196, 16, 0 }, + { 45, 1, 15, 8, 245, 1, 0 }, + { 45, 1, 15, 8, 229, 0, 16 }, + { 45, 1, 15, 8, 196, 0, 16 }, + { 46, 1, 15, 8, 245, 0, 0 }, + { 45, 3, 17, 8, 245, 0, 0 }, + { 45, 3, 17, 8, 196, 16, 0 }, + { 45, 3, 17, 8, 245, 1, 0 }, + { 45, 3, 17, 8, 229, 0, 16 }, + { 45, 3, 17, 8, 196, 0, 16 }, + { 46, 3, 17, 8, 245, 0, 0 }, + { 47, 1, 15, 8, 245, 0, 0 }, + { 47, 1, 15, 8, 196, 16, 0 }, + { 47, 1, 15, 8, 245, 1, 0 }, + { 47, 1, 15, 8, 229, 0, 16 }, + { 47, 1, 15, 8, 196, 0, 16 }, + { 48, 1, 15, 8, 245, 0, 0 }, + { 45, 5, 17, 8, 245, 0, 0 }, + { 49, 5, 17, 8, 196, 16, 0 }, + { 45, 5, 17, 8, 245, 1, 0 }, + { 49, 5, 17, 8, 229, 0, 16 }, + { 49, 5, 17, 8, 196, 0, 16 }, + { 46, 5, 17, 8, 245, 0, 0 }, + { 50, 0, 17, 8, 0, 0, 0 }, + { 51, 1, 15, 8, 1, 0, 32 }, + { 51, 1, 15, 8, 1, 1, 32 }, + { 51, 1, 15, 8, 197, 0, 48 }, + { 51, 1, 17, 8, 1, 0, 32 }, + { 51, 1, 17, 8, 1, 1, 32 }, + { 51, 1, 17, 8, 197, 0, 48 }, + { 52, 1, 15, 8, 0, 0, 0 }, + { 53, 0, 1, 24, 0, 0, 0 }, + { 52, 3, 17, 8, 0, 0, 0 }, + { 53, 0, 41, 24, 0, 0, 0 }, + { 51, 51, 15, 8, 33, 0, 0 }, + { 51, 51, 15, 8, 33, 1, 0 }, + { 51, 51, 15, 8, 229, 0, 16 }, + { 51, 51, 17, 8, 33, 0, 0 }, + { 51, 51, 17, 8, 33, 1, 0 }, + { 51, 51, 17, 8, 229, 0, 16 }, + { 51, 52, 15, 8, 1, 0, 32 }, + { 51, 52, 15, 8, 1, 1, 32 }, + { 51, 52, 15, 8, 197, 0, 48 }, + { 51, 52, 17, 8, 1, 0, 32 }, + { 51, 52, 17, 8, 1, 1, 32 }, + { 51, 52, 17, 8, 197, 0, 48 }, + { 46, 0, 21, 16, 0, 0, 0 }, + { 54, 0, 62, 16, 0, 0, 0 }, + { 54, 0, 61, 16, 0, 0, 0 }, + { 54, 0, 0, 16, 0, 0, 0 }, + { 51, 0, 21, 16, 0, 0, 0 }, + { 46, 0, 42, 16, 0, 0, 0 }, + { 46, 0, 20, 16, 0, 0, 0 }, + { 55, 0, 62, 24, 0, 1, 0 }, + { 55, 0, 62, 24, 0, 64, 0 }, + { 55, 0, 62, 24, 0, 65, 0 }, + { 55, 0, 62, 24, 0, 4, 0 }, + { 56, 0, 21, 56, 0, 0, 0 }, + { 46, 0, 23, 16, 0, 0, 0 }, + { 51, 0, 23, 16, 0, 0, 0 }, + { 55, 0, 62, 16, 69, 0, 0 }, + { 55, 0, 62, 24, 69, 0, 0 }, + { 46, 0, 22, 16, 0, 0, 0 }, + { 54, 0, 63, 16, 0, 0, 0 }, + { 56, 0, 22, 56, 0, 0, 0 }, + { 51, 0, 22, 16, 0, 0, 0 }, + { 56, 0, 20, 56, 0, 0, 0 }, + { 51, 0, 20, 16, 0, 0, 0 }, + { 46, 1, 15, 8, 196, 0, 16 }, + { 45, 0, 15, 8, 0, 0, 0 }, + { 45, 0, 15, 8, 245, 0, 0 }, + { 51, 0, 15, 8, 33, 0, 212 }, + { 51, 0, 15, 8, 0, 0, 245 }, + { 46, 3, 17, 8, 196, 0, 16 }, + { 45, 0, 17, 8, 0, 0, 0 }, + { 45, 0, 17, 8, 245, 0, 0 }, + { 51, 0, 17, 8, 33, 0, 212 }, + { 51, 0, 17, 8, 0, 0, 245 }, + { 45, 0, 15, 8, 244, 0, 0 }, + { 45, 0, 17, 8, 244, 0, 0 }, + { 57, 0, 17, 9, 0, 0, 0 }, + { 58, 0, 37, 9, 0, 0, 0 }, + { 57, 0, 17, 12, 0, 0, 0 }, + { 58, 0, 37, 12, 0, 0, 0 }, + { 57, 0, 17, 8, 0, 0, 0 }, + { 46, 0, 17, 8, 0, 0, 0 }, + { 46, 0, 16, 8, 0, 0, 0 }, + { 56, 0, 16, 8, 0, 0, 0 }, + { 46, 0, 16, 8, 64, 0, 0 }, + { 57, 0, 39, 8, 0, 0, 0 }, + { 52, 0, 28, 8, 0, 0, 0 }, + { 59, 0, 16, 8, 0, 0, 0 }, + { 56, 0, 42, 8, 0, 0, 0 }, + { 55, 0, 0, 112, 0, 0, 0 }, + { 55, 0, 0, 8, 0, 0, 0 }, + { 13, 0, 0, 24, 0, 0, 0 }, + { 56, 0, 58, 120, 0, 0, 0 }, + { 55, 0, 0, 120, 0, 0, 0 }, + { 55, 0, 58, 120, 0, 0, 0 }, + { 55, 60, 58, 120, 0, 0, 0 }, + { 60, 0, 0, 8, 0, 0, 0 }, + { 56, 0, 42, 96, 0, 0, 0 }, + { 61, 67, 64, 104, 0, 0, 0 }, + { 61, 67, 64, 96, 0, 0, 0 }, + { 35, 73, 68, 40, 0, 0, 0 }, + { 35, 73, 68, 48, 0, 0, 0 }, + { 35, 71, 68, 40, 0, 0, 0 }, + { 35, 72, 68, 48, 0, 0, 0 }, + { 62, 90, 83, 128, 0, 0, 0 }, + { 63, 81, 68, 128, 0, 0, 0 }, + { 64, 44, 68, 128, 0, 0, 0 }, + { 64, 46, 68, 128, 0, 0, 0 }, + { 35, 68, 73, 40, 0, 0, 0 }, + { 35, 68, 73, 48, 0, 0, 0 }, + { 35, 68, 71, 40, 0, 0, 0 }, + { 35, 68, 72, 48, 0, 0, 0 }, + { 62, 83, 90, 128, 0, 0, 0 }, + { 64, 68, 44, 128, 0, 0, 0 }, + { 64, 68, 46, 128, 0, 0, 0 }, + { 65, 72, 68, 40, 0, 0, 0 }, + { 35, 46, 68, 48, 0, 0, 0 }, + { 35, 72, 68, 56, 0, 0, 0 }, + { 66, 81, 68, 128, 0, 0, 0 }, + { 67, 81, 68, 128, 0, 0, 0 }, + { 62, 89, 83, 128, 0, 0, 0 }, + { 35, 68, 46, 40, 0, 0, 0 }, + { 35, 68, 46, 48, 0, 0, 0 }, + { 62, 68, 46, 128, 0, 0, 0 }, + { 34, 73, 68, 40, 0, 0, 0 }, + { 34, 73, 68, 48, 0, 0, 0 }, + { 67, 88, 83, 128, 0, 0, 0 }, + { 35, 73, 68, 56, 0, 0, 0 }, + { 56, 0, 42, 40, 0, 0, 0 }, + { 34, 67, 68, 40, 0, 0, 0 }, + { 34, 67, 68, 48, 0, 0, 0 }, + { 42, 18, 68, 40, 0, 0, 0 }, + { 42, 18, 68, 48, 0, 0, 0 }, + { 35, 68, 47, 40, 0, 0, 0 }, + { 35, 68, 47, 48, 0, 0, 0 }, + { 35, 68, 44, 88, 0, 0, 0 }, + { 35, 68, 46, 88, 0, 0, 0 }, + { 62, 83, 92, 128, 0, 0, 0 }, + { 34, 72, 64, 40, 0, 0, 0 }, + { 34, 73, 64, 48, 0, 0, 0 }, + { 42, 71, 13, 40, 0, 0, 0 }, + { 42, 72, 13, 48, 0, 0, 0 }, + { 62, 80, 78, 128, 0, 0, 0 }, + { 34, 71, 68, 40, 69, 0, 0 }, + { 34, 72, 68, 48, 0, 0, 0 }, + { 62, 71, 68, 128, 0, 0, 0 }, + { 62, 72, 68, 128, 0, 0, 0 }, + { 68, 69, 12, 40, 0, 0, 0 }, + { 68, 69, 12, 48, 0, 0, 0 }, + { 69, 83, 13, 128, 0, 0, 0 }, + { 34, 71, 68, 40, 0, 0, 0 }, + { 34, 71, 68, 48, 0, 0, 0 }, + { 62, 91, 83, 128, 0, 0, 0 }, + { 62, 90, 68, 128, 0, 0, 0 }, + { 34, 66, 64, 32, 0, 0, 0 }, + { 34, 67, 64, 32, 0, 0, 0 }, + { 70, 18, 64, 32, 0, 0, 0 }, + { 70, 18, 68, 48, 0, 0, 0 }, + { 62, 79, 68, 128, 0, 0, 0 }, + { 35, 67, 64, 32, 0, 0, 0 }, + { 71, 67, 64, 40, 0, 0, 0 }, + { 71, 73, 68, 48, 0, 0, 0 }, + { 67, 73, 68, 128, 0, 0, 0 }, + { 32, 0, 0, 32, 0, 0, 0 }, + { 72, 0, 0, 128, 0, 0, 0 }, + { 73, 13, 18, 112, 0, 0, 0 }, + { 74, 7, 69, 88, 0, 0, 0 }, + { 75, 69, 68, 88, 0, 0, 0 }, + { 73, 18, 13, 112, 0, 0, 0 }, + { 34, 69, 68, 88, 0, 0, 0 }, + { 76, 69, 68, 88, 0, 0, 0 }, + { 32, 72, 68, 112, 0, 0, 0 }, + { 32, 68, 72, 112, 0, 0, 0 }, + { 34, 73, 68, 56, 0, 0, 0 }, + { 70, 64, 18, 32, 0, 0, 0 }, + { 70, 68, 18, 48, 0, 0, 0 }, + { 62, 68, 79, 128, 0, 0, 0 }, + { 35, 64, 67, 32, 0, 0, 0 }, + { 77, 0, 42, 8, 0, 0, 0 }, + { 78, 0, 43, 8, 0, 0, 0 }, + { 79, 0, 43, 8, 0, 0, 0 }, + { 80, 17, 11, 80, 64, 0, 0 }, + { 81, 1, 17, 8, 1, 0, 244 }, + { 49, 1, 17, 8, 1, 0, 244 }, + { 34, 17, 11, 8, 64, 0, 245 }, + { 82, 17, 11, 112, 0, 0, 0 }, + { 83, 17, 11, 8, 65, 0, 180 }, + { 84, 73, 68, 40, 0, 0, 0 }, + { 84, 73, 68, 48, 0, 0, 0 }, + { 84, 71, 68, 40, 0, 0, 0 }, + { 84, 72, 68, 48, 0, 0, 0 }, + { 85, 88, 83, 128, 0, 0, 0 }, + { 85, 81, 68, 128, 0, 0, 0 }, + { 71, 25, 64, 40, 0, 0, 0 }, + { 71, 25, 68, 48, 0, 0, 0 }, + { 86, 81, 68, 128, 0, 0, 0 }, + { 87, 65, 12, 40, 0, 0, 0 }, + { 71, 69, 12, 48, 0, 0, 0 }, + { 88, 68, 13, 128, 0, 0, 0 }, + { 71, 73, 68, 40, 0, 0, 0 }, + { 86, 88, 83, 128, 0, 0, 0 }, + { 89, 0, 48, 8, 64, 0, 0 }, + { 56, 0, 46, 112, 0, 0, 0 }, + { 68, 65, 68, 48, 0, 0, 0 }, + { 68, 69, 64, 48, 0, 0, 0 }, + { 62, 68, 72, 128, 0, 0, 0 }, + { 76, 65, 12, 40, 0, 0, 0 }, + { 76, 69, 12, 48, 0, 0, 0 }, + { 69, 68, 13, 128, 0, 0, 0 }, + { 34, 67, 64, 40, 0, 0, 0 }, + { 35, 64, 46, 40, 0, 0, 0 }, + { 34, 42, 68, 56, 0, 0, 0 }, + { 62, 92, 83, 128, 0, 0, 0 }, + { 34, 67, 64, 48, 0, 0, 0 }, + { 76, 65, 64, 40, 0, 0, 0 }, + { 76, 69, 68, 48, 0, 0, 0 }, + { 90, 69, 68, 128, 0, 0, 0 }, + { 51, 0, 42, 16, 0, 0, 0 }, + { 91, 0, 42, 16, 0, 0, 0 }, + { 91, 0, 20, 16, 0, 0, 0 }, + { 92, 0, 0, 16, 0, 0, 0 }, + { 93, 0, 34, 16, 0, 0, 0 }, + { 94, 0, 34, 16, 0, 0, 0 }, + { 34, 67, 64, 64, 0, 0, 0 }, + { 34, 73, 68, 64, 0, 0, 0 }, + { 71, 73, 68, 72, 0, 0, 0 }, + { 34, 73, 68, 80, 0, 0, 0 }, + { 62, 44, 83, 128, 0, 0, 0 }, + { 62, 46, 85, 128, 0, 0, 0 }, + { 62, 47, 85, 128, 0, 0, 0 }, + { 62, 73, 68, 128, 0, 0, 0 }, + { 34, 72, 68, 72, 0, 0, 0 }, + { 34, 71, 68, 72, 0, 0, 0 }, + { 34, 70, 68, 72, 0, 0, 0 }, + { 62, 70, 68, 128, 0, 0, 0 }, + { 34, 73, 68, 72, 0, 0, 0 }, + { 35, 47, 68, 72, 0, 0, 0 }, + { 62, 47, 68, 128, 0, 0, 0 }, + { 67, 88, 92, 128, 0, 0, 0 }, + { 73, 47, 13, 112, 0, 0, 0 }, + { 67, 88, 83, 136, 0, 0, 0 }, + { 67, 81, 68, 136, 0, 0, 0 }, + { 34, 73, 68, 152, 0, 0, 0 }, + { 62, 73, 68, 152, 0, 0, 0 }, + { 67, 81, 68, 152, 0, 0, 0 }, + { 35, 17, 11, 8, 0, 0, 0 }, + { 35, 15, 13, 80, 0, 0, 0 }, + { 35, 11, 17, 8, 0, 0, 0 }, + { 35, 17, 13, 80, 0, 0, 0 }, + { 67, 90, 83, 128, 0, 0, 0 }, + { 86, 87, 85, 128, 0, 0, 0 }, + { 71, 71, 68, 72, 0, 0, 0 }, + { 71, 72, 68, 72, 0, 0, 0 }, + { 71, 67, 64, 64, 0, 0, 0 }, + { 71, 73, 68, 64, 0, 0, 0 }, + { 71, 68, 26, 72, 0, 0, 0 }, + { 88, 68, 76, 128, 0, 0, 0 }, + { 71, 68, 27, 72, 0, 0, 0 }, + { 88, 68, 77, 128, 0, 0, 0 }, + { 95, 68, 18, 72, 0, 0, 0 }, + { 67, 68, 79, 128, 0, 0, 0 }, + { 71, 68, 18, 72, 0, 0, 0 }, + { 67, 68, 75, 128, 0, 0, 0 }, + { 67, 85, 73, 128, 0, 0, 0 }, + { 71, 24, 68, 72, 0, 0, 0 }, + { 95, 18, 68, 72, 0, 0, 0 }, + { 71, 73, 68, 144, 0, 0, 0 }, + { 86, 81, 68, 144, 0, 0, 0 }, + { 71, 73, 68, 80, 0, 0, 0 }, + { 71, 73, 68, 152, 0, 0, 0 }, + { 67, 73, 68, 152, 0, 0, 0 }, + { 96, 1, 65, 32, 0, 0, 0 }, + { 56, 1, 69, 48, 0, 0, 0 }, + { 97, 69, 81, 128, 0, 0, 0 }, + { 98, 0, 13, 112, 0, 0, 0 }, + { 64, 0, 44, 128, 0, 0, 0 }, + { 56, 0, 42, 112, 0, 0, 0 }, + { 99, 75, 13, 8, 0, 0, 0 }, + { 98, 0, 17, 8, 0, 0, 0 }, + { 100, 67, 64, 96, 0, 0, 0 } +}; + +uint16_t CmpMnemonicOffsets[8] = { + 0, 9, 18, 27, 39, 49, 59, 69 +}; +uint16_t VCmpMnemonicOffsets[32] = { + 0, 10, 20, 30, 43, 54, 65, 76, 87, 100, 111, 122, 135, 149, 159, 169, 181, 194, 207, 220, 235, 249, 263, 277, 290, 303, 317, 331, 347, 361, 374, 387 +}; diff --git a/NativeCore/Dependencies/distorm/src/insts.h b/NativeCore/Dependencies/distorm/src/insts.h new file mode 100644 index 00000000..946cacde --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/insts.h @@ -0,0 +1,64 @@ +/* +insts.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef INSTS_H +#define INSTS_H + +#include "instructions.h" + + +/* Flags Table */ +extern _iflags FlagsTable[]; + +/* Root Trie DB */ +extern _InstSharedInfo InstSharedInfoTable[]; +extern _InstInfo InstInfos[]; +extern _InstInfoEx InstInfosEx[]; +extern _InstNode InstructionsTree[]; + +/* 3DNow! Trie DB */ +extern _InstNode Table_0F_0F; +/* AVX related: */ +extern _InstNode Table_0F, Table_0F_38, Table_0F_3A; + +/* + * The inst_lookup will return on of these two instructions according to the specified decoding mode. + * ARPL or MOVSXD on 64 bits is one byte instruction at index 0x63. + */ +extern _InstInfo II_MOVSXD; + +/* + * The NOP instruction can be prefixed by REX in 64bits, therefore we have to decide in runtime whether it's an XCHG or NOP instruction. + * If 0x90 is prefixed by a usable REX it will become XCHG, otherwise it will become a NOP. + * Also note that if it's prefixed by 0xf3, it becomes a Pause. + */ +extern _InstInfo II_NOP; +extern _InstInfo II_PAUSE; + +/* + * RDRAND and VMPTRLD share same 2.3 bytes opcode, and then alternates on the MOD bits, + * RDRAND is OT_FULL_REG while VMPTRLD is OT_MEM, and there's no such mixed type. + * So a hack into the inst_lookup was added for this decision, the DB isn't flexible enough. :( + */ +extern _InstInfo II_RDRAND; + +/* + * Used for letting the extract operand know the type of operands without knowing the + * instruction itself yet, because of the way those instructions work. + * See function instructions.c!inst_lookup_3dnow. + */ +extern _InstInfo II_3DNOW; + +/* Helper tables for pseudo compare mnemonics. */ +extern uint16_t CmpMnemonicOffsets[8]; /* SSE */ +extern uint16_t VCmpMnemonicOffsets[32]; /* AVX */ + +#endif /* INSTS_H */ diff --git a/NativeCore/Dependencies/distorm/src/mnemonics.c b/NativeCore/Dependencies/distorm/src/mnemonics.c new file mode 100644 index 00000000..ff00ac56 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/mnemonics.c @@ -0,0 +1,284 @@ +/* +mnemonics.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "../include/mnemonics.h" + +#ifndef DISTORM_LIGHT + +const unsigned char _MNEMONICS[] = +"\x09" "UNDEFINED\0" "\x03" "ADD\0" "\x04" "PUSH\0" "\x03" "POP\0" "\x02" "OR\0" \ +"\x03" "ADC\0" "\x03" "SBB\0" "\x03" "AND\0" "\x03" "DAA\0" "\x03" "SUB\0" \ +"\x03" "DAS\0" "\x03" "XOR\0" "\x03" "AAA\0" "\x03" "CMP\0" "\x03" "AAS\0" \ +"\x03" "INC\0" "\x03" "DEC\0" "\x05" "PUSHA\0" "\x04" "POPA\0" "\x05" "BOUND\0" \ +"\x04" "ARPL\0" "\x04" "IMUL\0" "\x03" "INS\0" "\x04" "OUTS\0" "\x02" "JO\0" \ +"\x03" "JNO\0" "\x02" "JB\0" "\x03" "JAE\0" "\x02" "JZ\0" "\x03" "JNZ\0" "\x03" "JBE\0" \ +"\x02" "JA\0" "\x02" "JS\0" "\x03" "JNS\0" "\x02" "JP\0" "\x03" "JNP\0" "\x02" "JL\0" \ +"\x03" "JGE\0" "\x03" "JLE\0" "\x02" "JG\0" "\x04" "TEST\0" "\x04" "XCHG\0" \ +"\x03" "MOV\0" "\x03" "LEA\0" "\x03" "CBW\0" "\x04" "CWDE\0" "\x04" "CDQE\0" \ +"\x03" "CWD\0" "\x03" "CDQ\0" "\x03" "CQO\0" "\x08" "CALL FAR\0" "\x05" "PUSHF\0" \ +"\x04" "POPF\0" "\x04" "SAHF\0" "\x04" "LAHF\0" "\x04" "MOVS\0" "\x04" "CMPS\0" \ +"\x04" "STOS\0" "\x04" "LODS\0" "\x04" "SCAS\0" "\x03" "RET\0" "\x03" "LES\0" \ +"\x03" "LDS\0" "\x05" "ENTER\0" "\x05" "LEAVE\0" "\x04" "RETF\0" "\x05" "INT 3\0" \ +"\x03" "INT\0" "\x04" "INTO\0" "\x04" "IRET\0" "\x03" "AAM\0" "\x03" "AAD\0" \ +"\x04" "SALC\0" "\x04" "XLAT\0" "\x06" "LOOPNZ\0" "\x05" "LOOPZ\0" "\x04" "LOOP\0" \ +"\x04" "JCXZ\0" "\x05" "JECXZ\0" "\x05" "JRCXZ\0" "\x02" "IN\0" "\x03" "OUT\0" \ +"\x04" "CALL\0" "\x03" "JMP\0" "\x07" "JMP FAR\0" "\x04" "INT1\0" "\x03" "HLT\0" \ +"\x03" "CMC\0" "\x03" "CLC\0" "\x03" "STC\0" "\x03" "CLI\0" "\x03" "STI\0" \ +"\x03" "CLD\0" "\x03" "STD\0" "\x03" "LAR\0" "\x03" "LSL\0" "\x07" "SYSCALL\0" \ +"\x04" "CLTS\0" "\x06" "SYSRET\0" "\x04" "INVD\0" "\x06" "WBINVD\0" "\x03" "UD2\0" \ +"\x05" "FEMMS\0" "\x03" "NOP\0" "\x05" "WRMSR\0" "\x05" "RDTSC\0" "\x05" "RDMSR\0" \ +"\x05" "RDPMC\0" "\x08" "SYSENTER\0" "\x07" "SYSEXIT\0" "\x06" "GETSEC\0" "\x05" "CMOVO\0" \ +"\x06" "CMOVNO\0" "\x05" "CMOVB\0" "\x06" "CMOVAE\0" "\x05" "CMOVZ\0" "\x06" "CMOVNZ\0" \ +"\x06" "CMOVBE\0" "\x05" "CMOVA\0" "\x05" "CMOVS\0" "\x06" "CMOVNS\0" "\x05" "CMOVP\0" \ +"\x06" "CMOVNP\0" "\x05" "CMOVL\0" "\x06" "CMOVGE\0" "\x06" "CMOVLE\0" "\x05" "CMOVG\0" \ +"\x04" "SETO\0" "\x05" "SETNO\0" "\x04" "SETB\0" "\x05" "SETAE\0" "\x04" "SETZ\0" \ +"\x05" "SETNZ\0" "\x05" "SETBE\0" "\x04" "SETA\0" "\x04" "SETS\0" "\x05" "SETNS\0" \ +"\x04" "SETP\0" "\x05" "SETNP\0" "\x04" "SETL\0" "\x05" "SETGE\0" "\x05" "SETLE\0" \ +"\x04" "SETG\0" "\x05" "CPUID\0" "\x02" "BT\0" "\x04" "SHLD\0" "\x03" "RSM\0" \ +"\x03" "BTS\0" "\x04" "SHRD\0" "\x07" "CMPXCHG\0" "\x03" "LSS\0" "\x03" "BTR\0" \ +"\x03" "LFS\0" "\x03" "LGS\0" "\x05" "MOVZX\0" "\x03" "BTC\0" "\x05" "MOVSX\0" \ +"\x04" "XADD\0" "\x06" "MOVNTI\0" "\x05" "BSWAP\0" "\x03" "ROL\0" "\x03" "ROR\0" \ +"\x03" "RCL\0" "\x03" "RCR\0" "\x03" "SHL\0" "\x03" "SHR\0" "\x03" "SAL\0" \ +"\x03" "SAR\0" "\x06" "XABORT\0" "\x06" "XBEGIN\0" "\x04" "FADD\0" "\x04" "FMUL\0" \ +"\x04" "FCOM\0" "\x05" "FCOMP\0" "\x04" "FSUB\0" "\x05" "FSUBR\0" "\x04" "FDIV\0" \ +"\x05" "FDIVR\0" "\x03" "FLD\0" "\x03" "FST\0" "\x04" "FSTP\0" "\x06" "FLDENV\0" \ +"\x05" "FLDCW\0" "\x04" "FXCH\0" "\x04" "FNOP\0" "\x04" "FCHS\0" "\x04" "FABS\0" \ +"\x04" "FTST\0" "\x04" "FXAM\0" "\x04" "FLD1\0" "\x06" "FLDL2T\0" "\x06" "FLDL2E\0" \ +"\x05" "FLDPI\0" "\x06" "FLDLG2\0" "\x06" "FLDLN2\0" "\x04" "FLDZ\0" "\x05" "F2XM1\0" \ +"\x05" "FYL2X\0" "\x05" "FPTAN\0" "\x06" "FPATAN\0" "\x07" "FXTRACT\0" "\x06" "FPREM1\0" \ +"\x07" "FDECSTP\0" "\x07" "FINCSTP\0" "\x05" "FPREM\0" "\x07" "FYL2XP1\0" "\x05" "FSQRT\0" \ +"\x07" "FSINCOS\0" "\x07" "FRNDINT\0" "\x06" "FSCALE\0" "\x04" "FSIN\0" "\x04" "FCOS\0" \ +"\x05" "FIADD\0" "\x05" "FIMUL\0" "\x05" "FICOM\0" "\x06" "FICOMP\0" "\x05" "FISUB\0" \ +"\x06" "FISUBR\0" "\x05" "FIDIV\0" "\x06" "FIDIVR\0" "\x06" "FCMOVB\0" "\x06" "FCMOVE\0" \ +"\x07" "FCMOVBE\0" "\x06" "FCMOVU\0" "\x07" "FUCOMPP\0" "\x04" "FILD\0" "\x06" "FISTTP\0" \ +"\x04" "FIST\0" "\x05" "FISTP\0" "\x07" "FCMOVNB\0" "\x07" "FCMOVNE\0" "\x08" "FCMOVNBE\0" \ +"\x07" "FCMOVNU\0" "\x04" "FENI\0" "\x06" "FEDISI\0" "\x06" "FSETPM\0" "\x06" "FUCOMI\0" \ +"\x05" "FCOMI\0" "\x06" "FRSTOR\0" "\x05" "FFREE\0" "\x05" "FUCOM\0" "\x06" "FUCOMP\0" \ +"\x05" "FADDP\0" "\x05" "FMULP\0" "\x06" "FCOMPP\0" "\x06" "FSUBRP\0" "\x05" "FSUBP\0" \ +"\x06" "FDIVRP\0" "\x05" "FDIVP\0" "\x04" "FBLD\0" "\x05" "FBSTP\0" "\x07" "FUCOMIP\0" \ +"\x06" "FCOMIP\0" "\x03" "NOT\0" "\x03" "NEG\0" "\x03" "MUL\0" "\x03" "DIV\0" \ +"\x04" "IDIV\0" "\x04" "SLDT\0" "\x03" "STR\0" "\x04" "LLDT\0" "\x03" "LTR\0" \ +"\x04" "VERR\0" "\x04" "VERW\0" "\x04" "SGDT\0" "\x04" "SIDT\0" "\x04" "LGDT\0" \ +"\x04" "LIDT\0" "\x04" "SMSW\0" "\x04" "LMSW\0" "\x06" "INVLPG\0" "\x06" "VMCALL\0" \ +"\x08" "VMLAUNCH\0" "\x08" "VMRESUME\0" "\x06" "VMXOFF\0" "\x07" "MONITOR\0" \ +"\x05" "MWAIT\0" "\x06" "XGETBV\0" "\x06" "XSETBV\0" "\x06" "VMFUNC\0" "\x04" "XEND\0" \ +"\x05" "VMRUN\0" "\x07" "VMMCALL\0" "\x06" "VMLOAD\0" "\x06" "VMSAVE\0" "\x04" "STGI\0" \ +"\x04" "CLGI\0" "\x06" "SKINIT\0" "\x07" "INVLPGA\0" "\x06" "SWAPGS\0" "\x06" "RDTSCP\0" \ +"\x08" "PREFETCH\0" "\x09" "PREFETCHW\0" "\x05" "PI2FW\0" "\x05" "PI2FD\0" \ +"\x05" "PF2IW\0" "\x05" "PF2ID\0" "\x06" "PFNACC\0" "\x07" "PFPNACC\0" "\x07" "PFCMPGE\0" \ +"\x05" "PFMIN\0" "\x05" "PFRCP\0" "\x07" "PFRSQRT\0" "\x05" "PFSUB\0" "\x05" "PFADD\0" \ +"\x07" "PFCMPGT\0" "\x05" "PFMAX\0" "\x08" "PFRCPIT1\0" "\x08" "PFRSQIT1\0" \ +"\x06" "PFSUBR\0" "\x05" "PFACC\0" "\x07" "PFCMPEQ\0" "\x05" "PFMUL\0" "\x08" "PFRCPIT2\0" \ +"\x07" "PMULHRW\0" "\x06" "PSWAPD\0" "\x07" "PAVGUSB\0" "\x06" "MOVUPS\0" "\x06" "MOVUPD\0" \ +"\x05" "MOVSS\0" "\x05" "MOVSD\0" "\x07" "VMOVUPS\0" "\x07" "VMOVUPD\0" "\x06" "VMOVSS\0" \ +"\x06" "VMOVSD\0" "\x07" "MOVHLPS\0" "\x06" "MOVLPS\0" "\x06" "MOVLPD\0" "\x08" "MOVSLDUP\0" \ +"\x07" "MOVDDUP\0" "\x08" "VMOVHLPS\0" "\x07" "VMOVLPS\0" "\x07" "VMOVLPD\0" \ +"\x09" "VMOVSLDUP\0" "\x08" "VMOVDDUP\0" "\x08" "UNPCKLPS\0" "\x08" "UNPCKLPD\0" \ +"\x09" "VUNPCKLPS\0" "\x09" "VUNPCKLPD\0" "\x08" "UNPCKHPS\0" "\x08" "UNPCKHPD\0" \ +"\x09" "VUNPCKHPS\0" "\x09" "VUNPCKHPD\0" "\x07" "MOVLHPS\0" "\x06" "MOVHPS\0" \ +"\x06" "MOVHPD\0" "\x08" "MOVSHDUP\0" "\x08" "VMOVLHPS\0" "\x07" "VMOVHPS\0" \ +"\x07" "VMOVHPD\0" "\x09" "VMOVSHDUP\0" "\x0b" "PREFETCHNTA\0" "\x0a" "PREFETCHT0\0" \ +"\x0a" "PREFETCHT1\0" "\x0a" "PREFETCHT2\0" "\x06" "MOVAPS\0" "\x06" "MOVAPD\0" \ +"\x07" "VMOVAPS\0" "\x07" "VMOVAPD\0" "\x08" "CVTPI2PS\0" "\x08" "CVTPI2PD\0" \ +"\x08" "CVTSI2SS\0" "\x08" "CVTSI2SD\0" "\x09" "VCVTSI2SS\0" "\x09" "VCVTSI2SD\0" \ +"\x07" "MOVNTPS\0" "\x07" "MOVNTPD\0" "\x07" "MOVNTSS\0" "\x07" "MOVNTSD\0" \ +"\x08" "VMOVNTPS\0" "\x08" "VMOVNTPD\0" "\x09" "CVTTPS2PI\0" "\x09" "CVTTPD2PI\0" \ +"\x09" "CVTTSS2SI\0" "\x09" "CVTTSD2SI\0" "\x0a" "VCVTTSS2SI\0" "\x0a" "VCVTTSD2SI\0" \ +"\x08" "CVTPS2PI\0" "\x08" "CVTPD2PI\0" "\x08" "CVTSS2SI\0" "\x08" "CVTSD2SI\0" \ +"\x09" "VCVTSS2SI\0" "\x09" "VCVTSD2SI\0" "\x07" "UCOMISS\0" "\x07" "UCOMISD\0" \ +"\x08" "VUCOMISS\0" "\x08" "VUCOMISD\0" "\x06" "COMISS\0" "\x06" "COMISD\0" \ +"\x07" "VCOMISS\0" "\x07" "VCOMISD\0" "\x08" "MOVMSKPS\0" "\x08" "MOVMSKPD\0" \ +"\x09" "VMOVMSKPS\0" "\x09" "VMOVMSKPD\0" "\x06" "SQRTPS\0" "\x06" "SQRTPD\0" \ +"\x06" "SQRTSS\0" "\x06" "SQRTSD\0" "\x07" "VSQRTPS\0" "\x07" "VSQRTPD\0" "\x07" "VSQRTSS\0" \ +"\x07" "VSQRTSD\0" "\x07" "RSQRTPS\0" "\x07" "RSQRTSS\0" "\x08" "VRSQRTPS\0" \ +"\x08" "VRSQRTSS\0" "\x05" "RCPPS\0" "\x05" "RCPSS\0" "\x06" "VRCPPS\0" "\x06" "VRCPSS\0" \ +"\x05" "ANDPS\0" "\x05" "ANDPD\0" "\x06" "VANDPS\0" "\x06" "VANDPD\0" "\x06" "ANDNPS\0" \ +"\x06" "ANDNPD\0" "\x07" "VANDNPS\0" "\x07" "VANDNPD\0" "\x04" "ORPS\0" "\x04" "ORPD\0" \ +"\x05" "VORPS\0" "\x05" "VORPD\0" "\x05" "XORPS\0" "\x05" "XORPD\0" "\x06" "VXORPS\0" \ +"\x06" "VXORPD\0" "\x05" "ADDPS\0" "\x05" "ADDPD\0" "\x05" "ADDSS\0" "\x05" "ADDSD\0" \ +"\x06" "VADDPS\0" "\x06" "VADDPD\0" "\x06" "VADDSS\0" "\x06" "VADDSD\0" "\x05" "MULPS\0" \ +"\x05" "MULPD\0" "\x05" "MULSS\0" "\x05" "MULSD\0" "\x06" "VMULPS\0" "\x06" "VMULPD\0" \ +"\x06" "VMULSS\0" "\x06" "VMULSD\0" "\x08" "CVTPS2PD\0" "\x08" "CVTPD2PS\0" \ +"\x08" "CVTSS2SD\0" "\x08" "CVTSD2SS\0" "\x09" "VCVTPS2PD\0" "\x09" "VCVTPD2PS\0" \ +"\x09" "VCVTSS2SD\0" "\x09" "VCVTSD2SS\0" "\x08" "CVTDQ2PS\0" "\x08" "CVTPS2DQ\0" \ +"\x09" "CVTTPS2DQ\0" "\x09" "VCVTDQ2PS\0" "\x09" "VCVTPS2DQ\0" "\x0a" "VCVTTPS2DQ\0" \ +"\x05" "SUBPS\0" "\x05" "SUBPD\0" "\x05" "SUBSS\0" "\x05" "SUBSD\0" "\x06" "VSUBPS\0" \ +"\x06" "VSUBPD\0" "\x06" "VSUBSS\0" "\x06" "VSUBSD\0" "\x05" "MINPS\0" "\x05" "MINPD\0" \ +"\x05" "MINSS\0" "\x05" "MINSD\0" "\x06" "VMINPS\0" "\x06" "VMINPD\0" "\x06" "VMINSS\0" \ +"\x06" "VMINSD\0" "\x05" "DIVPS\0" "\x05" "DIVPD\0" "\x05" "DIVSS\0" "\x05" "DIVSD\0" \ +"\x06" "VDIVPS\0" "\x06" "VDIVPD\0" "\x06" "VDIVSS\0" "\x06" "VDIVSD\0" "\x05" "MAXPS\0" \ +"\x05" "MAXPD\0" "\x05" "MAXSS\0" "\x05" "MAXSD\0" "\x06" "VMAXPS\0" "\x06" "VMAXPD\0" \ +"\x06" "VMAXSS\0" "\x06" "VMAXSD\0" "\x09" "PUNPCKLBW\0" "\x0a" "VPUNPCKLBW\0" \ +"\x09" "PUNPCKLWD\0" "\x0a" "VPUNPCKLWD\0" "\x09" "PUNPCKLDQ\0" "\x0a" "VPUNPCKLDQ\0" \ +"\x08" "PACKSSWB\0" "\x09" "VPACKSSWB\0" "\x07" "PCMPGTB\0" "\x08" "VPCMPGTB\0" \ +"\x07" "PCMPGTW\0" "\x08" "VPCMPGTW\0" "\x07" "PCMPGTD\0" "\x08" "VPCMPGTD\0" \ +"\x08" "PACKUSWB\0" "\x09" "VPACKUSWB\0" "\x09" "PUNPCKHBW\0" "\x0a" "VPUNPCKHBW\0" \ +"\x09" "PUNPCKHWD\0" "\x0a" "VPUNPCKHWD\0" "\x09" "PUNPCKHDQ\0" "\x0a" "VPUNPCKHDQ\0" \ +"\x08" "PACKSSDW\0" "\x09" "VPACKSSDW\0" "\x0a" "PUNPCKLQDQ\0" "\x0b" "VPUNPCKLQDQ\0" \ +"\x0a" "PUNPCKHQDQ\0" "\x0b" "VPUNPCKHQDQ\0" "\x04" "MOVD\0" "\x04" "MOVQ\0" \ +"\x05" "VMOVD\0" "\x05" "VMOVQ\0" "\x06" "MOVDQA\0" "\x06" "MOVDQU\0" "\x07" "VMOVDQA\0" \ +"\x07" "VMOVDQU\0" "\x06" "PSHUFW\0" "\x06" "PSHUFD\0" "\x07" "PSHUFHW\0" "\x07" "PSHUFLW\0" \ +"\x07" "VPSHUFD\0" "\x08" "VPSHUFHW\0" "\x08" "VPSHUFLW\0" "\x07" "PCMPEQB\0" \ +"\x08" "VPCMPEQB\0" "\x07" "PCMPEQW\0" "\x08" "VPCMPEQW\0" "\x07" "PCMPEQD\0" \ +"\x08" "VPCMPEQD\0" "\x04" "EMMS\0" "\x0a" "VZEROUPPER\0" "\x08" "VZEROALL\0" \ +"\x06" "VMREAD\0" "\x05" "EXTRQ\0" "\x07" "INSERTQ\0" "\x07" "VMWRITE\0" "\x08" "CVTPH2PS\0" \ +"\x08" "CVTPS2PH\0" "\x06" "HADDPD\0" "\x06" "HADDPS\0" "\x07" "VHADDPD\0" \ +"\x07" "VHADDPS\0" "\x06" "HSUBPD\0" "\x06" "HSUBPS\0" "\x07" "VHSUBPD\0" "\x07" "VHSUBPS\0" \ +"\x05" "XSAVE\0" "\x07" "XSAVE64\0" "\x06" "LFENCE\0" "\x06" "XRSTOR\0" "\x08" "XRSTOR64\0" \ +"\x06" "MFENCE\0" "\x08" "XSAVEOPT\0" "\x0a" "XSAVEOPT64\0" "\x06" "SFENCE\0" \ +"\x07" "CLFLUSH\0" "\x06" "POPCNT\0" "\x03" "BSF\0" "\x05" "TZCNT\0" "\x03" "BSR\0" \ +"\x05" "LZCNT\0" "\x07" "CMPEQPS\0" "\x07" "CMPLTPS\0" "\x07" "CMPLEPS\0" "\x0a" "CMPUNORDPS\0" \ +"\x08" "CMPNEQPS\0" "\x08" "CMPNLTPS\0" "\x08" "CMPNLEPS\0" "\x08" "CMPORDPS\0" \ +"\x07" "CMPEQPD\0" "\x07" "CMPLTPD\0" "\x07" "CMPLEPD\0" "\x0a" "CMPUNORDPD\0" \ +"\x08" "CMPNEQPD\0" "\x08" "CMPNLTPD\0" "\x08" "CMPNLEPD\0" "\x08" "CMPORDPD\0" \ +"\x07" "CMPEQSS\0" "\x07" "CMPLTSS\0" "\x07" "CMPLESS\0" "\x0a" "CMPUNORDSS\0" \ +"\x08" "CMPNEQSS\0" "\x08" "CMPNLTSS\0" "\x08" "CMPNLESS\0" "\x08" "CMPORDSS\0" \ +"\x07" "CMPEQSD\0" "\x07" "CMPLTSD\0" "\x07" "CMPLESD\0" "\x0a" "CMPUNORDSD\0" \ +"\x08" "CMPNEQSD\0" "\x08" "CMPNLTSD\0" "\x08" "CMPNLESD\0" "\x08" "CMPORDSD\0" \ +"\x08" "VCMPEQPS\0" "\x08" "VCMPLTPS\0" "\x08" "VCMPLEPS\0" "\x0b" "VCMPUNORDPS\0" \ +"\x09" "VCMPNEQPS\0" "\x09" "VCMPNLTPS\0" "\x09" "VCMPNLEPS\0" "\x09" "VCMPORDPS\0" \ +"\x0b" "VCMPEQ_UQPS\0" "\x09" "VCMPNGEPS\0" "\x09" "VCMPNGTPS\0" "\x0b" "VCMPFALSEPS\0" \ +"\x0c" "VCMPNEQ_OQPS\0" "\x08" "VCMPGEPS\0" "\x08" "VCMPGTPS\0" "\x0a" "VCMPTRUEPS\0" \ +"\x0b" "VCMPEQ_OSPS\0" "\x0b" "VCMPLT_OQPS\0" "\x0b" "VCMPLE_OQPS\0" "\x0d" "VCMPUNORD_SPS\0" \ +"\x0c" "VCMPNEQ_USPS\0" "\x0c" "VCMPNLT_UQPS\0" "\x0c" "VCMPNLE_UQPS\0" "\x0b" "VCMPORD_SPS\0" \ +"\x0b" "VCMPEQ_USPS\0" "\x0c" "VCMPNGE_UQPS\0" "\x0c" "VCMPNGT_UQPS\0" "\x0e" "VCMPFALSE_OSPS\0" \ +"\x0c" "VCMPNEQ_OSPS\0" "\x0b" "VCMPGE_OQPS\0" "\x0b" "VCMPGT_OQPS\0" "\x0d" "VCMPTRUE_USPS\0" \ +"\x08" "VCMPEQPD\0" "\x08" "VCMPLTPD\0" "\x08" "VCMPLEPD\0" "\x0b" "VCMPUNORDPD\0" \ +"\x09" "VCMPNEQPD\0" "\x09" "VCMPNLTPD\0" "\x09" "VCMPNLEPD\0" "\x09" "VCMPORDPD\0" \ +"\x0b" "VCMPEQ_UQPD\0" "\x09" "VCMPNGEPD\0" "\x09" "VCMPNGTPD\0" "\x0b" "VCMPFALSEPD\0" \ +"\x0c" "VCMPNEQ_OQPD\0" "\x08" "VCMPGEPD\0" "\x08" "VCMPGTPD\0" "\x0a" "VCMPTRUEPD\0" \ +"\x0b" "VCMPEQ_OSPD\0" "\x0b" "VCMPLT_OQPD\0" "\x0b" "VCMPLE_OQPD\0" "\x0d" "VCMPUNORD_SPD\0" \ +"\x0c" "VCMPNEQ_USPD\0" "\x0c" "VCMPNLT_UQPD\0" "\x0c" "VCMPNLE_UQPD\0" "\x0b" "VCMPORD_SPD\0" \ +"\x0b" "VCMPEQ_USPD\0" "\x0c" "VCMPNGE_UQPD\0" "\x0c" "VCMPNGT_UQPD\0" "\x0e" "VCMPFALSE_OSPD\0" \ +"\x0c" "VCMPNEQ_OSPD\0" "\x0b" "VCMPGE_OQPD\0" "\x0b" "VCMPGT_OQPD\0" "\x0d" "VCMPTRUE_USPD\0" \ +"\x08" "VCMPEQSS\0" "\x08" "VCMPLTSS\0" "\x08" "VCMPLESS\0" "\x0b" "VCMPUNORDSS\0" \ +"\x09" "VCMPNEQSS\0" "\x09" "VCMPNLTSS\0" "\x09" "VCMPNLESS\0" "\x09" "VCMPORDSS\0" \ +"\x0b" "VCMPEQ_UQSS\0" "\x09" "VCMPNGESS\0" "\x09" "VCMPNGTSS\0" "\x0b" "VCMPFALSESS\0" \ +"\x0c" "VCMPNEQ_OQSS\0" "\x08" "VCMPGESS\0" "\x08" "VCMPGTSS\0" "\x0a" "VCMPTRUESS\0" \ +"\x0b" "VCMPEQ_OSSS\0" "\x0b" "VCMPLT_OQSS\0" "\x0b" "VCMPLE_OQSS\0" "\x0d" "VCMPUNORD_SSS\0" \ +"\x0c" "VCMPNEQ_USSS\0" "\x0c" "VCMPNLT_UQSS\0" "\x0c" "VCMPNLE_UQSS\0" "\x0b" "VCMPORD_SSS\0" \ +"\x0b" "VCMPEQ_USSS\0" "\x0c" "VCMPNGE_UQSS\0" "\x0c" "VCMPNGT_UQSS\0" "\x0e" "VCMPFALSE_OSSS\0" \ +"\x0c" "VCMPNEQ_OSSS\0" "\x0b" "VCMPGE_OQSS\0" "\x0b" "VCMPGT_OQSS\0" "\x0d" "VCMPTRUE_USSS\0" \ +"\x08" "VCMPEQSD\0" "\x08" "VCMPLTSD\0" "\x08" "VCMPLESD\0" "\x0b" "VCMPUNORDSD\0" \ +"\x09" "VCMPNEQSD\0" "\x09" "VCMPNLTSD\0" "\x09" "VCMPNLESD\0" "\x09" "VCMPORDSD\0" \ +"\x0b" "VCMPEQ_UQSD\0" "\x09" "VCMPNGESD\0" "\x09" "VCMPNGTSD\0" "\x0b" "VCMPFALSESD\0" \ +"\x0c" "VCMPNEQ_OQSD\0" "\x08" "VCMPGESD\0" "\x08" "VCMPGTSD\0" "\x0a" "VCMPTRUESD\0" \ +"\x0b" "VCMPEQ_OSSD\0" "\x0b" "VCMPLT_OQSD\0" "\x0b" "VCMPLE_OQSD\0" "\x0d" "VCMPUNORD_SSD\0" \ +"\x0c" "VCMPNEQ_USSD\0" "\x0c" "VCMPNLT_UQSD\0" "\x0c" "VCMPNLE_UQSD\0" "\x0b" "VCMPORD_SSD\0" \ +"\x0b" "VCMPEQ_USSD\0" "\x0c" "VCMPNGE_UQSD\0" "\x0c" "VCMPNGT_UQSD\0" "\x0e" "VCMPFALSE_OSSD\0" \ +"\x0c" "VCMPNEQ_OSSD\0" "\x0b" "VCMPGE_OQSD\0" "\x0b" "VCMPGT_OQSD\0" "\x0d" "VCMPTRUE_USSD\0" \ +"\x06" "PINSRW\0" "\x07" "VPINSRW\0" "\x06" "PEXTRW\0" "\x07" "VPEXTRW\0" "\x06" "SHUFPS\0" \ +"\x06" "SHUFPD\0" "\x07" "VSHUFPS\0" "\x07" "VSHUFPD\0" "\x09" "CMPXCHG8B\0" \ +"\x0a" "CMPXCHG16B\0" "\x07" "VMPTRST\0" "\x08" "ADDSUBPD\0" "\x08" "ADDSUBPS\0" \ +"\x09" "VADDSUBPD\0" "\x09" "VADDSUBPS\0" "\x05" "PSRLW\0" "\x06" "VPSRLW\0" \ +"\x05" "PSRLD\0" "\x06" "VPSRLD\0" "\x05" "PSRLQ\0" "\x06" "VPSRLQ\0" "\x05" "PADDQ\0" \ +"\x06" "VPADDQ\0" "\x06" "PMULLW\0" "\x07" "VPMULLW\0" "\x07" "MOVQ2DQ\0" "\x07" "MOVDQ2Q\0" \ +"\x08" "PMOVMSKB\0" "\x09" "VPMOVMSKB\0" "\x07" "PSUBUSB\0" "\x08" "VPSUBUSB\0" \ +"\x07" "PSUBUSW\0" "\x08" "VPSUBUSW\0" "\x06" "PMINUB\0" "\x07" "VPMINUB\0" \ +"\x04" "PAND\0" "\x05" "VPAND\0" "\x07" "PADDUSB\0" "\x08" "VPADDUSW\0" "\x07" "PADDUSW\0" \ +"\x06" "PMAXUB\0" "\x07" "VPMAXUB\0" "\x05" "PANDN\0" "\x06" "VPANDN\0" "\x05" "PAVGB\0" \ +"\x06" "VPAVGB\0" "\x05" "PSRAW\0" "\x06" "VPSRAW\0" "\x05" "PSRAD\0" "\x06" "VPSRAD\0" \ +"\x05" "PAVGW\0" "\x06" "VPAVGW\0" "\x07" "PMULHUW\0" "\x08" "VPMULHUW\0" "\x06" "PMULHW\0" \ +"\x07" "VPMULHW\0" "\x09" "CVTTPD2DQ\0" "\x08" "CVTDQ2PD\0" "\x08" "CVTPD2DQ\0" \ +"\x0a" "VCVTTPD2DQ\0" "\x09" "VCVTDQ2PD\0" "\x09" "VCVTPD2DQ\0" "\x06" "MOVNTQ\0" \ +"\x07" "MOVNTDQ\0" "\x08" "VMOVNTDQ\0" "\x06" "PSUBSB\0" "\x07" "VPSUBSB\0" \ +"\x06" "PSUBSW\0" "\x07" "VPSUBSW\0" "\x06" "PMINSW\0" "\x07" "VPMINSW\0" "\x03" "POR\0" \ +"\x04" "VPOR\0" "\x06" "PADDSB\0" "\x07" "VPADDSB\0" "\x06" "PADDSW\0" "\x07" "VPADDSW\0" \ +"\x06" "PMAXSW\0" "\x07" "VPMAXSW\0" "\x04" "PXOR\0" "\x05" "VPXOR\0" "\x05" "LDDQU\0" \ +"\x06" "VLDDQU\0" "\x05" "PSLLW\0" "\x06" "VPSLLW\0" "\x05" "PSLLD\0" "\x06" "VPSLLD\0" \ +"\x05" "PSLLQ\0" "\x06" "VPSLLQ\0" "\x07" "PMULUDQ\0" "\x08" "VPMULUDQ\0" "\x07" "PMADDWD\0" \ +"\x08" "VPMADDWD\0" "\x06" "PSADBW\0" "\x07" "VPSADBW\0" "\x08" "MASKMOVQ\0" \ +"\x0a" "MASKMOVDQU\0" "\x0b" "VMASKMOVDQU\0" "\x05" "PSUBB\0" "\x06" "VPSUBB\0" \ +"\x05" "PSUBW\0" "\x06" "VPSUBW\0" "\x05" "PSUBD\0" "\x06" "VPSUBD\0" "\x05" "PSUBQ\0" \ +"\x06" "VPSUBQ\0" "\x05" "PADDB\0" "\x06" "VPADDB\0" "\x05" "PADDW\0" "\x06" "VPADDW\0" \ +"\x05" "PADDD\0" "\x06" "VPADDD\0" "\x07" "FNSTENV\0" "\x06" "FSTENV\0" "\x06" "FNSTCW\0" \ +"\x05" "FSTCW\0" "\x06" "FNCLEX\0" "\x05" "FCLEX\0" "\x06" "FNINIT\0" "\x05" "FINIT\0" \ +"\x06" "FNSAVE\0" "\x05" "FSAVE\0" "\x06" "FNSTSW\0" "\x05" "FSTSW\0" "\x06" "PSHUFB\0" \ +"\x07" "VPSHUFB\0" "\x06" "PHADDW\0" "\x07" "VPHADDW\0" "\x06" "PHADDD\0" "\x07" "VPHADDD\0" \ +"\x07" "PHADDSW\0" "\x08" "VPHADDSW\0" "\x09" "PMADDUBSW\0" "\x0a" "VPMADDUBSW\0" \ +"\x06" "PHSUBW\0" "\x07" "VPHSUBW\0" "\x06" "PHSUBD\0" "\x07" "VPHSUBD\0" "\x07" "PHSUBSW\0" \ +"\x08" "VPHSUBSW\0" "\x06" "PSIGNB\0" "\x07" "VPSIGNB\0" "\x06" "PSIGNW\0" \ +"\x07" "VPSIGNW\0" "\x06" "PSIGND\0" "\x07" "VPSIGND\0" "\x08" "PMULHRSW\0" \ +"\x09" "VPMULHRSW\0" "\x09" "VPERMILPS\0" "\x09" "VPERMILPD\0" "\x07" "VTESTPS\0" \ +"\x07" "VTESTPD\0" "\x08" "PBLENDVB\0" "\x08" "BLENDVPS\0" "\x08" "BLENDVPD\0" \ +"\x05" "PTEST\0" "\x06" "VPTEST\0" "\x0c" "VBROADCASTSS\0" "\x0c" "VBROADCASTSD\0" \ +"\x0e" "VBROADCASTF128\0" "\x05" "PABSB\0" "\x06" "VPABSB\0" "\x05" "PABSW\0" \ +"\x06" "VPABSW\0" "\x05" "PABSD\0" "\x06" "VPABSD\0" "\x08" "PMOVSXBW\0" "\x09" "VPMOVSXBW\0" \ +"\x08" "PMOVSXBD\0" "\x09" "VPMOVSXBD\0" "\x08" "PMOVSXBQ\0" "\x09" "VPMOVSXBQ\0" \ +"\x08" "PMOVSXWD\0" "\x09" "VPMOVSXWD\0" "\x08" "PMOVSXWQ\0" "\x09" "VPMOVSXWQ\0" \ +"\x08" "PMOVSXDQ\0" "\x09" "VPMOVSXDQ\0" "\x06" "PMULDQ\0" "\x07" "VPMULDQ\0" \ +"\x07" "PCMPEQQ\0" "\x08" "VPCMPEQQ\0" "\x08" "MOVNTDQA\0" "\x09" "VMOVNTDQA\0" \ +"\x08" "PACKUSDW\0" "\x09" "VPACKUSDW\0" "\x0a" "VMASKMOVPS\0" "\x0a" "VMASKMOVPD\0" \ +"\x08" "PMOVZXBW\0" "\x09" "VPMOVZXBW\0" "\x08" "PMOVZXBD\0" "\x09" "VPMOVZXBD\0" \ +"\x08" "PMOVZXBQ\0" "\x09" "VPMOVZXBQ\0" "\x08" "PMOVZXWD\0" "\x09" "VPMOVZXWD\0" \ +"\x08" "PMOVZXWQ\0" "\x09" "VPMOVZXWQ\0" "\x08" "PMOVZXDQ\0" "\x09" "VPMOVZXDQ\0" \ +"\x07" "PCMPGTQ\0" "\x08" "VPCMPGTQ\0" "\x06" "PMINSB\0" "\x07" "VPMINSB\0" \ +"\x06" "PMINSD\0" "\x07" "VPMINSD\0" "\x06" "PMINUW\0" "\x07" "VPMINUW\0" "\x06" "PMINUD\0" \ +"\x07" "VPMINUD\0" "\x06" "PMAXSB\0" "\x07" "VPMAXSB\0" "\x06" "PMAXSD\0" "\x07" "VPMAXSD\0" \ +"\x06" "PMAXUW\0" "\x07" "VPMAXUW\0" "\x06" "PMAXUD\0" "\x07" "VPMAXUD\0" "\x06" "PMULLD\0" \ +"\x07" "VPMULLD\0" "\x0a" "PHMINPOSUW\0" "\x0b" "VPHMINPOSUW\0" "\x06" "INVEPT\0" \ +"\x07" "INVVPID\0" "\x07" "INVPCID\0" "\x0e" "VFMADDSUB132PS\0" "\x0e" "VFMADDSUB132PD\0" \ +"\x0e" "VFMSUBADD132PS\0" "\x0e" "VFMSUBADD132PD\0" "\x0b" "VFMADD132PS\0" \ +"\x0b" "VFMADD132PD\0" "\x0b" "VFMADD132SS\0" "\x0b" "VFMADD132SD\0" "\x0b" "VFMSUB132PS\0" \ +"\x0b" "VFMSUB132PD\0" "\x0b" "VFMSUB132SS\0" "\x0b" "VFMSUB132SD\0" "\x0c" "VFNMADD132PS\0" \ +"\x0c" "VFNMADD132PD\0" "\x0c" "VFNMADD132SS\0" "\x0c" "VFNMADD132SD\0" "\x0c" "VFNMSUB132PS\0" \ +"\x0c" "VFNMSUB132PD\0" "\x0c" "VFNMSUB132SS\0" "\x0c" "VFNMSUB132SD\0" "\x0e" "VFMADDSUB213PS\0" \ +"\x0e" "VFMADDSUB213PD\0" "\x0e" "VFMSUBADD213PS\0" "\x0e" "VFMSUBADD213PD\0" \ +"\x0b" "VFMADD213PS\0" "\x0b" "VFMADD213PD\0" "\x0b" "VFMADD213SS\0" "\x0b" "VFMADD213SD\0" \ +"\x0b" "VFMSUB213PS\0" "\x0b" "VFMSUB213PD\0" "\x0b" "VFMSUB213SS\0" "\x0b" "VFMSUB213SD\0" \ +"\x0c" "VFNMADD213PS\0" "\x0c" "VFNMADD213PD\0" "\x0c" "VFNMADD213SS\0" "\x0c" "VFNMADD213SD\0" \ +"\x0c" "VFNMSUB213PS\0" "\x0c" "VFNMSUB213PD\0" "\x0c" "VFNMSUB213SS\0" "\x0c" "VFNMSUB213SD\0" \ +"\x0e" "VFMADDSUB231PS\0" "\x0e" "VFMADDSUB231PD\0" "\x0e" "VFMSUBADD231PS\0" \ +"\x0e" "VFMSUBADD231PD\0" "\x0b" "VFMADD231PS\0" "\x0b" "VFMADD231PD\0" "\x0b" "VFMADD231SS\0" \ +"\x0b" "VFMADD231SD\0" "\x0b" "VFMSUB231PS\0" "\x0b" "VFMSUB231PD\0" "\x0b" "VFMSUB231SS\0" \ +"\x0b" "VFMSUB231SD\0" "\x0c" "VFNMADD231PS\0" "\x0c" "VFNMADD231PD\0" "\x0c" "VFNMADD231SS\0" \ +"\x0c" "VFNMADD231SD\0" "\x0c" "VFNMSUB231PS\0" "\x0c" "VFNMSUB231PD\0" "\x0c" "VFNMSUB231SS\0" \ +"\x0c" "VFNMSUB231SD\0" "\x06" "AESIMC\0" "\x07" "VAESIMC\0" "\x06" "AESENC\0" \ +"\x07" "VAESENC\0" "\x0a" "AESENCLAST\0" "\x0b" "VAESENCLAST\0" "\x06" "AESDEC\0" \ +"\x07" "VAESDEC\0" "\x0a" "AESDECLAST\0" "\x0b" "VAESDECLAST\0" "\x05" "MOVBE\0" \ +"\x05" "CRC32\0" "\x0a" "VPERM2F128\0" "\x07" "ROUNDPS\0" "\x08" "VROUNDPS\0" \ +"\x07" "ROUNDPD\0" "\x08" "VROUNDPD\0" "\x07" "ROUNDSS\0" "\x08" "VROUNDSS\0" \ +"\x07" "ROUNDSD\0" "\x08" "VROUNDSD\0" "\x07" "BLENDPS\0" "\x08" "VBLENDPS\0" \ +"\x07" "BLENDPD\0" "\x08" "VBLENDPD\0" "\x07" "PBLENDW\0" "\x08" "VPBLENDW\0" \ +"\x07" "PALIGNR\0" "\x08" "VPALIGNR\0" "\x06" "PEXTRB\0" "\x07" "VPEXTRB\0" \ +"\x06" "PEXTRD\0" "\x06" "PEXTRQ\0" "\x07" "VPEXTRD\0" "\x07" "VPEXTRQ\0" "\x09" "EXTRACTPS\0" \ +"\x0a" "VEXTRACTPS\0" "\x0b" "VINSERTF128\0" "\x0c" "VEXTRACTF128\0" "\x06" "PINSRB\0" \ +"\x07" "VPINSRB\0" "\x08" "INSERTPS\0" "\x09" "VINSERTPS\0" "\x06" "PINSRD\0" \ +"\x06" "PINSRQ\0" "\x07" "VPINSRD\0" "\x07" "VPINSRQ\0" "\x04" "DPPS\0" "\x05" "VDPPS\0" \ +"\x04" "DPPD\0" "\x05" "VDPPD\0" "\x07" "MPSADBW\0" "\x08" "VMPSADBW\0" "\x09" "PCLMULQDQ\0" \ +"\x0a" "VPCLMULQDQ\0" "\x09" "VBLENDVPS\0" "\x09" "VBLENDVPD\0" "\x09" "VPBLENDVB\0" \ +"\x09" "PCMPESTRM\0" "\x0a" "VPCMPESTRM\0" "\x09" "PCMPESTRI\0" "\x0a" "VPCMPESTRI\0" \ +"\x09" "PCMPISTRM\0" "\x0a" "VPCMPISTRM\0" "\x09" "PCMPISTRI\0" "\x0a" "VPCMPISTRI\0" \ +"\x0f" "AESKEYGENASSIST\0" "\x10" "VAESKEYGENASSIST\0" "\x06" "PSRLDQ\0" "\x07" "VPSRLDQ\0" \ +"\x06" "PSLLDQ\0" "\x07" "VPSLLDQ\0" "\x06" "FXSAVE\0" "\x08" "FXSAVE64\0" \ +"\x08" "RDFSBASE\0" "\x07" "FXRSTOR\0" "\x09" "FXRSTOR64\0" "\x08" "RDGSBASE\0" \ +"\x07" "LDMXCSR\0" "\x08" "WRFSBASE\0" "\x08" "VLDMXCSR\0" "\x07" "STMXCSR\0" \ +"\x08" "WRGSBASE\0" "\x08" "VSTMXCSR\0" "\x07" "VMPTRLD\0" "\x07" "VMCLEAR\0" \ +"\x05" "VMXON\0" "\x06" "MOVSXD\0" "\x05" "PAUSE\0" "\x04" "WAIT\0" "\x06" "RDRAND\0" \ +"\x06" "_3DNOW\0"; + +const _WRegister _REGISTERS[] = { + { 3, "RAX" }, { 3, "RCX" }, { 3, "RDX" }, { 3, "RBX" }, { 3, "RSP" }, { 3, "RBP" }, { 3, "RSI" }, { 3, "RDI" }, { 2, "R8" }, { 2, "R9" }, { 3, "R10" }, { 3, "R11" }, { 3, "R12" }, { 3, "R13" }, { 3, "R14" }, { 3, "R15" }, + { 3, "EAX" }, { 3, "ECX" }, { 3, "EDX" }, { 3, "EBX" }, { 3, "ESP" }, { 3, "EBP" }, { 3, "ESI" }, { 3, "EDI" }, { 3, "R8D" }, { 3, "R9D" }, { 4, "R10D" }, { 4, "R11D" }, { 4, "R12D" }, { 4, "R13D" }, { 4, "R14D" }, { 4, "R15D" }, + { 2, "AX" }, { 2, "CX" }, { 2, "DX" }, { 2, "BX" }, { 2, "SP" }, { 2, "BP" }, { 2, "SI" }, { 2, "DI" }, { 3, "R8W" }, { 3, "R9W" }, { 4, "R10W" }, { 4, "R11W" }, { 4, "R12W" }, { 4, "R13W" }, { 4, "R14W" }, { 4, "R15W" }, + { 2, "AL" }, { 2, "CL" }, { 2, "DL" }, { 2, "BL" }, { 2, "AH" }, { 2, "CH" }, { 2, "DH" }, { 2, "BH" }, { 3, "R8B" }, { 3, "R9B" }, { 4, "R10B" }, { 4, "R11B" }, { 4, "R12B" }, { 4, "R13B" }, { 4, "R14B" }, { 4, "R15B" }, + { 3, "SPL" }, { 3, "BPL" }, { 3, "SIL" }, { 3, "DIL" }, + { 2, "ES" }, { 2, "CS" }, { 2, "SS" }, { 2, "DS" }, { 2, "FS" }, { 2, "GS" }, + { 3, "RIP" }, + { 3, "ST0" }, { 3, "ST1" }, { 3, "ST2" }, { 3, "ST3" }, { 3, "ST4" }, { 3, "ST5" }, { 3, "ST6" }, { 3, "ST7" }, + { 3, "MM0" }, { 3, "MM1" }, { 3, "MM2" }, { 3, "MM3" }, { 3, "MM4" }, { 3, "MM5" }, { 3, "MM6" }, { 3, "MM7" }, + { 4, "XMM0" }, { 4, "XMM1" }, { 4, "XMM2" }, { 4, "XMM3" }, { 4, "XMM4" }, { 4, "XMM5" }, { 4, "XMM6" }, { 4, "XMM7" }, { 4, "XMM8" }, { 4, "XMM9" }, { 5, "XMM10" }, { 5, "XMM11" }, { 5, "XMM12" }, { 5, "XMM13" }, { 5, "XMM14" }, { 5, "XMM15" }, + { 4, "YMM0" }, { 4, "YMM1" }, { 4, "YMM2" }, { 4, "YMM3" }, { 4, "YMM4" }, { 4, "YMM5" }, { 4, "YMM6" }, { 4, "YMM7" }, { 4, "YMM8" }, { 4, "YMM9" }, { 5, "YMM10" }, { 5, "YMM11" }, { 5, "YMM12" }, { 5, "YMM13" }, { 5, "YMM14" }, { 5, "YMM15" }, + { 3, "CR0" }, { 0, "" }, { 3, "CR2" }, { 3, "CR3" }, { 3, "CR4" }, { 0, "" }, { 0, "" }, { 0, "" }, { 3, "CR8" }, + { 3, "DR0" }, { 3, "DR1" }, { 3, "DR2" }, { 3, "DR3" }, { 0, "" }, { 0, "" }, { 3, "DR6" }, { 3, "DR7" } +}; + +#endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/operands.c b/NativeCore/Dependencies/distorm/src/operands.c new file mode 100644 index 00000000..789a6cb8 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/operands.c @@ -0,0 +1,1290 @@ +/* +operands.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "config.h" +#include "operands.h" +#include "x86defs.h" +#include "insts.h" +#include "../include/mnemonics.h" + + +/* Maps a register to its register-class mask. */ +uint32_t _REGISTERTORCLASS[] = /* Based on _RegisterType enumeration! */ +{RM_AX, RM_CX, RM_DX, RM_BX, RM_SP, RM_BP, RM_SI, RM_DI, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, + RM_AX, RM_CX, RM_DX, RM_BX, RM_SP, RM_BP, RM_SI, RM_DI, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, + RM_AX, RM_CX, RM_DX, RM_BX, RM_SP, RM_BP, RM_SI, RM_DI, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, + RM_AX, RM_CX, RM_DX, RM_BX, RM_AX, RM_CX, RM_DX, RM_BX, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, + RM_SP, RM_BP, RM_SI, RM_DI, + 0, 0, 0, 0, 0, 0, + 0, + RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, + RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, + RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, RM_SSE, + RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, RM_AVX, + RM_CR, 0, RM_CR, RM_CR, RM_CR, 0, 0, 0, RM_CR, + RM_DR, RM_DR, RM_DR, RM_DR, 0, 0, RM_DR, RM_DR +}; + +typedef enum {OPERAND_SIZE_NONE = 0, OPERAND_SIZE8, OPERAND_SIZE16, OPERAND_SIZE32, OPERAND_SIZE64, OPERAND_SIZE80, OPERAND_SIZE128, OPERAND_SIZE256} _OperandSizeType; +static uint16_t _OPSIZETOINT[] = {0, 8, 16, 32, 64, 80, 128, 256}; + +/* A helper function to fix the 8 bits register if REX is used (to support SIL, DIL, etc). */ +static unsigned int _FASTCALL_ operands_fix_8bit_rex_base(unsigned int reg) +{ + if ((reg >= 4) && (reg < 8)) return reg + REGS8_REX_BASE - 4; + return reg + REGS8_BASE; +} + +/* A helper function to set operand's type and size. */ +static void _FASTCALL_ operands_set_ts(_Operand* op, _OperandType type, uint16_t size) +{ + op->type = type; + op->size = size; +} + +/* A helper function to set operand's type, size and index. */ +static void _FASTCALL_ operands_set_tsi(_Operand* op, _OperandType type, uint16_t size, unsigned int index) +{ + op->type = type; + op->index = (uint8_t)index; + op->size = size; +} + +/* A helper function to read an unsigned integer from the stream safely. */ +static int _FASTCALL_ read_stream_safe_uint(_CodeInfo* ci, void* result, unsigned int size) +{ + ci->codeLen -= size; + if (ci->codeLen < 0) return FALSE; + switch (size) + { + case 1: *(uint8_t*)result = *(uint8_t*)ci->code; break; + case 2: *(uint16_t*)result = RUSHORT(ci->code); break; + case 4: *(uint32_t*)result = RULONG(ci->code); break; + case 8: *(uint64_t*)result = RULLONG(ci->code); break; + } + ci->code += size; + return TRUE; +} + +/* A helper function to read a signed integer from the stream safely. */ +static int _FASTCALL_ read_stream_safe_sint(_CodeInfo* ci, int64_t* result, unsigned int size) +{ + ci->codeLen -= size; + if (ci->codeLen < 0) return FALSE; + switch (size) + { + case 1: *result = *(int8_t*)ci->code; break; + case 2: *result = RSHORT(ci->code); break; + case 4: *result = RLONG(ci->code); break; + case 8: *result = RLLONG(ci->code); break; + } + ci->code += size; + return TRUE; +} + +/* + * SIB decoding is the most confusing part when decoding IA-32 instructions. + * This explanation should clear up some stuff. + * + * ! When base == 5, use EBP as the base register ! + * if (rm == 4) { + * if mod == 01, decode SIB byte and ALSO read a 8 bits displacement. + * if mod == 10, decode SIB byte and ALSO read a 32 bits displacement. + * if mod == 11 <-- EXCEPTION, this is a general-purpose register and mustn't lead to SIB decoding! + * ; So far so good, now the confusing part comes in with mod == 0 and base=5, but no worry. + * if (mod == 00) { + * decode SIB byte WITHOUT any displacement. + * EXCEPTION!!! when base == 5, read a 32 bits displacement, but this time DO NOT use (EBP) BASE at all! + * } + * + * NOTE: base could specify None (no base register) if base==5 and mod==0, but then you also need DISP32. + * } + */ +static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, + _PrefixState* ps, _DecodeType effAdrSz, + unsigned int sib, unsigned int mod) +{ + unsigned int scale = 0, index = 0, base = 0; + unsigned int vrex = ps->vrex; + uint8_t* pIndex = NULL; + + _Operand* op = &di->ops[opNum]; + + /* + * SIB bits: + * |7---6-5----3-2---0| + * |SCALE| INDEX| BASE| + * |------------------| + */ + scale = (sib >> 6) & 3; + index = (sib >> 3) & 7; + base = sib & 7; + + /* + * The following fields: base/index/scale/disp8/32 are ALL optional by specific rules! + * The idea here is to keep the indirection as a simple-memory type. + * Because the base is optional, and we might be left with only one index. + * So even if there's a base but no index, or vice versa, we end up with one index register. + */ + + /* In 64 bits the REX prefix might affect the index of the SIB byte. */ + if (vrex & PREFIX_EX_X) { + ps->usedPrefixes |= INST_PRE_REX; + index += EX_GPR_BASE; + } + + if (index == 4) { /* No index is used. Use SMEM. */ + op->type = O_SMEM; + pIndex = &op->index; + } else { + op->type = O_MEM; + pIndex = &di->base; + /* No base, unless it is updated below. E.G: [EAX*4] has no base reg. */ + } + + if (base != 5) { + if (vrex & PREFIX_EX_B) ps->usedPrefixes |= INST_PRE_REX; + *pIndex = effAdrSz == Decode64Bits ? REGS64_BASE : REGS32_BASE; + *pIndex += (uint8_t)(base + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0)); + } else if (mod != 0) { + /* + * if base == 5 then you have to decode according to MOD. + * mod(00) - disp32. + * mod(01) - disp8 + rBP + * mod(10) - disp32 + rBP + * mod(11) - not possible, it's a general-purpose register. + */ + + if (vrex & PREFIX_EX_B) ps->usedPrefixes |= INST_PRE_REX; + if (effAdrSz == Decode64Bits) *pIndex = REGS64_BASE + 5 + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0); + else *pIndex = REGS32_BASE + 5 + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0); + } else if (index == 4) { + /* 32bits displacement only. */ + op->type = O_DISP; + return; + } + + if (index != 4) { /* In 64 bits decoding mode, if index == R12, it's valid! */ + if (effAdrSz == Decode64Bits) op->index = (uint8_t)(REGS64_BASE + index); + else op->index = (uint8_t)(REGS32_BASE + index); + di->scale = scale != 0 ? (1 << scale) : 0; + } +} + +/* + * This seems to be the hardest part in decoding the operands. + * If you take a look carefully at Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte, + * you will understand it's easy to decode the operands. + + * First we check the DT, so we can decide according to which Table in the documentation we are supposed to decode. + * Then we follow the specific table whether it's 16 bits or 32/64 bits. + + * Don't forget that Operand Size AND Address Size prefixes may change the decoding! + + * Some instructions force the use of RM16 or other specific types, so take it into account. + */ +static int operands_extract_modrm(_CodeInfo* ci, + _DInst* di, _OpType type, + _OperandNumberType opNum, _PrefixState* ps, + _DecodeType effOpSz, _DecodeType effAdrSz, + int* lockableInstruction, unsigned int mod, unsigned int rm, + _iflags instFlags) +{ + unsigned int vrex = ps->vrex, sib = 0, base = 0; + _Operand* op = &di->ops[opNum]; + uint16_t size = 0; + + if (mod == 3) { + /* + * General-purpose register is handled the same way in 16/32/64 bits decoding modes. + * NOTE!! that we have to override the size of the register, since it was set earlier as Memory and not Register! + */ + op->type = O_REG; + /* Start with original size which was set earlier, some registers have same size of memory and depend on it. */ + size = op->size; + switch(type) + { + case OT_RFULL_M16: + case OT_RM_FULL: + switch (effOpSz) + { + case Decode16Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 16; + rm += REGS16_BASE; + break; + case Decode32Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 32; + rm += REGS32_BASE; + break; + case Decode64Bits: + /* A fix for SMSW RAX which use the REX prefix. */ + if (type == OT_RFULL_M16) ps->usedPrefixes |= INST_PRE_REX; + /* CALL NEAR/PUSH/POP defaults to 64 bits. --> INST_64BITS, REX isn't required, thus ignored anyways. */ + if (instFlags & INST_PRE_REX) ps->usedPrefixes |= INST_PRE_REX; + /* Include REX if used for REX.B. */ + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 64; + rm += REGS64_BASE; + break; + } + break; + case OT_R32_64_M8: + /* FALL THROUGH, decode 32 or 64 bits register. */ + case OT_R32_64_M16: + /* FALL THROUGH, decode 32 or 64 bits register. */ + case OT_RM32_64: /* Take care specifically in MOVNTI/MOVD/CVT's instructions, making it _REG64 with REX or if they are promoted. */ + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + /* Is it a promoted instruction? (only INST_64BITS is set and REX isn't required.) */ + if ((ci->dt == Decode64Bits) && ((instFlags & (INST_64BITS | INST_PRE_REX)) == INST_64BITS)) { + size = 64; + rm += REGS64_BASE; + break; + } + /* Give a chance to REX.W. Because if it was a promoted instruction we don't care about REX.W anyways. */ + if (vrex & PREFIX_EX_W) { + ps->usedPrefixes |= INST_PRE_REX; + size = 64; + rm += REGS64_BASE; + } else { + size = 32; + rm += REGS32_BASE; + } + break; + case OT_RM16_32: /* Used only with MOVZXD instruction to support 16 bits operand. */ + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + /* Is it 16 bits operand size? */ + if (ps->decodedPrefixes & INST_PRE_OP_SIZE) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + size = 16; + rm += REGS16_BASE; + } else { + size = 32; + rm += REGS32_BASE; + } + break; + case OT_RM16: + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + rm += REGS16_BASE; + break; + case OT_RM8: + if (ps->prefixExtType == PET_REX) { + ps->usedPrefixes |= INST_PRE_REX; + rm = operands_fix_8bit_rex_base(rm + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0)); + } else rm += REGS8_BASE; + break; + case OT_MM32: + case OT_MM64: + /* MMX doesn't support extended registers. */ + size = 64; + rm += MMXREGS_BASE; + break; + + case OT_XMM16: + case OT_XMM32: + case OT_XMM64: + case OT_XMM128: + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 128; + rm += SSEREGS_BASE; + break; + + case OT_RM32: + case OT_R32_M8: + case OT_R32_M16: + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 32; + rm += REGS32_BASE; + break; + + case OT_YMM256: + if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + rm += AVXREGS_BASE; + break; + case OT_YXMM64_256: + case OT_YXMM128_256: + if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (vrex & PREFIX_EX_L) { + size = 256; + rm += AVXREGS_BASE; + } else { + size = 128; + rm += SSEREGS_BASE; + } + break; + case OT_WXMM32_64: + case OT_LXMM64_128: + if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + size = 128; + rm += SSEREGS_BASE; + break; + + case OT_WRM32_64: + case OT_REG32_64_M8: + case OT_REG32_64_M16: + if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (vrex & PREFIX_EX_W) { + size = 64; + rm += REGS64_BASE; + } else { + size = 32; + rm += REGS32_BASE; + } + break; + + default: return FALSE; + } + op->size = size; + op->index = (uint8_t)rm; + return TRUE; + } + + /* Memory indirection decoding ahead:) */ + + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + if (lockableInstruction && (ps->decodedPrefixes & INST_PRE_LOCK)) *lockableInstruction = TRUE; + + if (effAdrSz == Decode16Bits) { + /* Decoding according to Table 2-1. (16 bits) */ + if ((mod == 0) && (rm == 6)) { + /* 6 is a special case - only 16 bits displacement. */ + op->type = O_DISP; + di->dispSize = 16; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int16_t))) return FALSE; + } else { + /* + * Create the O_MEM for 16 bits indirection that requires 2 registers, E.G: [BS+SI]. + * or create O_SMEM for a single register indirection, E.G: [BP]. + */ + static uint8_t MODS[] = {R_BX, R_BX, R_BP, R_BP, R_SI, R_DI, R_BP, R_BX}; + static uint8_t MODS2[] = {R_SI, R_DI, R_SI, R_DI}; + if (rm < 4) { + op->type = O_MEM; + di->base = MODS[rm]; + op->index = MODS2[rm]; + } else { + op->type = O_SMEM; + op->index = MODS[rm]; + } + + if (mod == 1) { /* 8 bits displacement + indirection */ + di->dispSize = 8; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int8_t))) return FALSE; + } else if (mod == 2) { /* 16 bits displacement + indirection */ + di->dispSize = 16; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int16_t))) return FALSE; + } + } + + if ((rm == 2) || (rm == 3) || ((rm == 6) && (mod != 0))) { + /* BP's default segment is SS, so ignore it. */ + prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); + } else { + /* Ignore default DS segment. */ + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + } + } else { /* Decode32Bits or Decode64Bits! */ + /* Remember that from a 32/64 bits ModR/M byte a SIB byte could follow! */ + if ((mod == 0) && (rm == 5)) { + + /* 5 is a special case - only 32 bits displacement, or RIP relative. */ + di->dispSize = 32; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int32_t))) return FALSE; + + if (ci->dt == Decode64Bits) { + /* In 64 bits decoding mode depsite of the address size, a RIP-relative address it is. */ + op->type = O_SMEM; + op->index = R_RIP; + di->flags |= FLAG_RIP_RELATIVE; + } else { + /* Absolute address: */ + op->type = O_DISP; + } + } else { + if (rm == 4) { + /* 4 is a special case - SIB byte + disp8/32 follows! */ + /* Read SIB byte. */ + if (!read_stream_safe_uint(ci, &sib, sizeof(int8_t))) return FALSE; + operands_extract_sib(di, opNum, ps, effAdrSz, sib, mod); + } else { + op->type = O_SMEM; + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + + if (effAdrSz == Decode64Bits) op->index = (uint8_t)(REGS64_BASE + rm); + else op->index = (uint8_t)(REGS32_BASE + rm); + } + + if (mod == 1) { + di->dispSize = 8; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int8_t))) return FALSE; + } else if ((mod == 2) || ((sib & 7) == 5)) { /* If there is no BASE, read DISP32! */ + di->dispSize = 32; + if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int32_t))) return FALSE; + } + } + + /* Get the base register. */ + base = op->index; + if (di->base != R_NONE) base = di->base; + else if (di->scale >= 2) base = 0; /* If it's only an index but got scale, it's still DS. */ + /* Default for EBP/ESP is SS segment. 64 bits mode ignores DS anyway. */ + if ((base == R_EBP) || (base == R_ESP)) prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); + else prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + } + + return TRUE; +} + + +/* + * This function is reponsible to textually format a required operand according to its type. + * It is vital to understand that there are other operands than what the ModR/M byte specifies. + + * Only by decoding the operands of an instruction which got a LOCK prefix, we could tell whether it may use the LOCK prefix. + * According to Intel, LOCK prefix must precede some specific instructions AND in their memory destination operand form (which means first operand). + * LOCK INC EAX, would generate an exception, but LOCK INC [EAX] is alright. + * Also LOCK ADD BX, [BP] would generate an exception. + + * Return code: + * TRUE - continue parsing the instruction and its operands, everything went right 'till now. + * FALSE - not enough bytes, or invalid operands. + */ + +int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, + _iflags instFlags, _OpType type, _OperandNumberType opNum, + unsigned int modrm, _PrefixState* ps, _DecodeType effOpSz, + _DecodeType effAdrSz, int* lockableInstruction) +{ + int ret = 0; + unsigned int mod = 0, reg = 0, rm = 0, vexV = ps->vexV; + unsigned int vrex = ps->vrex, typeHandled = TRUE; + _Operand* op = &di->ops[opNum]; + + /* Used to indicate the size of the MEMORY INDIRECTION only. */ + _OperandSizeType opSize = OPERAND_SIZE_NONE; + + /* + * ModRM bits: + * |7-6-5--------3-2-0| + * |MOD|REG/OPCODE|RM | + * |------------------| + */ + mod = (modrm >> 6) & 3; /* Mode(register-indirection, disp8+reg+indirection, disp16+reg+indirection, general-purpose register) */ + reg = (modrm >> 3) & 7; /* Register(could be part of the opcode itself or general-purpose register) */ + rm = modrm & 7; /* Specifies which general-purpose register or disp+reg to use. */ + + /* -- Memory Indirection Operands (that cannot be a general purpose register) -- */ + switch (type) + { + case OT_MEM64_128: /* Used only by CMPXCHG8/16B. */ + /* Make a specific check when the type is OT_MEM64_128 since the lockable CMPXCHG8B uses this one... */ + if (lockableInstruction && (ps->decodedPrefixes & INST_PRE_LOCK)) *lockableInstruction = TRUE; + if (effOpSz == Decode64Bits) { + ps->usedPrefixes |= INST_PRE_REX; + opSize = OPERAND_SIZE128; + } else opSize = OPERAND_SIZE64; + break; + case OT_MEM32: opSize = OPERAND_SIZE32; break; + case OT_MEM32_64: + /* Used by MOVNTI. Default size is 32bits, 64bits with REX. */ + if (effOpSz == Decode64Bits) { + ps->usedPrefixes |= INST_PRE_REX; + opSize = OPERAND_SIZE64; + } else opSize = OPERAND_SIZE32; + break; + case OT_MEM64: opSize = OPERAND_SIZE64; break; + case OT_MEM128: opSize = OPERAND_SIZE128; break; + case OT_MEM16_FULL: /* The size indicates about the second item of the pair. */ + switch (effOpSz) + { + case Decode16Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + opSize = OPERAND_SIZE16; + break; + case Decode32Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + opSize = OPERAND_SIZE32; + break; + case Decode64Bits: + /* Mark usage of REX only if it was required. */ + if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) ps->usedPrefixes |= INST_PRE_REX; + opSize = OPERAND_SIZE64; + break; + } + break; + case OT_MEM16_3264: /* The size indicates about the second item of the pair. */ + if (ci->dt == Decode64Bits) opSize = OPERAND_SIZE64; + else opSize = OPERAND_SIZE32; + break; + case OT_MEM_OPT: + /* Since the MEM is optional, only when mod != 3, then return true as if the operand was alright. */ + if (mod == 0x3) return TRUE; + break; + case OT_FPUM16: opSize = OPERAND_SIZE16; break; + case OT_FPUM32: opSize = OPERAND_SIZE32; break; + case OT_FPUM64: opSize = OPERAND_SIZE64; break; + case OT_FPUM80: opSize = OPERAND_SIZE80; break; + case OT_LMEM128_256: + if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; + else opSize = OPERAND_SIZE128; + break; + case OT_MEM: /* Size is unknown, but still handled. */ break; + default: typeHandled = FALSE; break; + } + if (typeHandled) { + /* All of the above types can't use a general-purpose register (a MOD of 3)!. */ + if (mod == 0x3) { + if (lockableInstruction) *lockableInstruction = FALSE; + return FALSE; + } + op->size = _OPSIZETOINT[opSize]; + ret = operands_extract_modrm(ci, di, type, opNum, ps, effOpSz, effAdrSz, lockableInstruction, mod, rm, instFlags); + if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + } + return ret; + } + + /* -- Memory Indirection Operands (that can be a register) -- */ + typeHandled = TRUE; + switch (type) + { + case OT_RM_FULL: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* PUSH/JMP/CALL are automatically promoted to 64 bits! */ + if (effOpSz == Decode32Bits) { + opSize = OPERAND_SIZE32; + break; + } else if (effOpSz == Decode64Bits) { + /* Mark usage of REX only if it was required. */ + if ((instFlags & INST_64BITS) == 0) ps->usedPrefixes |= INST_PRE_REX; + opSize = OPERAND_SIZE64; + break; + } + /* FALL THROUGH BECAUSE dt==Decoded16Bits @-<----*/ + case OT_RM16: + /* If we got here not from OT_RM16, then the prefix was used. */ + if (type != OT_RM16) ps->usedPrefixes |= INST_PRE_OP_SIZE; + opSize = OPERAND_SIZE16; + break; + case OT_RM32_64: + /* The default size is 32, which can be 64 with a REX only. */ + if (effOpSz == Decode64Bits) { + opSize = OPERAND_SIZE64; + /* Mark REX prefix as used if non-promoted instruction. */ + if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) { + ps->usedPrefixes |= INST_PRE_REX; + } + } else opSize = OPERAND_SIZE32; + break; + case OT_RM16_32: + /* Ignore REX, it's either 32 or 16 bits RM. */ + if (ps->decodedPrefixes & INST_PRE_OP_SIZE) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* Assume: We are in 64bits when we have this operand used. */ + opSize = OPERAND_SIZE16; + } else opSize = OPERAND_SIZE32; + break; + case OT_WXMM32_64: + case OT_WRM32_64: + if (vrex & PREFIX_EX_W) opSize = OPERAND_SIZE64; + else opSize = OPERAND_SIZE32; + break; + case OT_YXMM64_256: + if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; + else opSize = OPERAND_SIZE64; + break; + case OT_YXMM128_256: + if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; + else opSize = OPERAND_SIZE128; + break; + case OT_LXMM64_128: + if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE128; + else opSize = OPERAND_SIZE64; + break; + case OT_RFULL_M16: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + opSize = OPERAND_SIZE16; + break; + + case OT_RM8: + case OT_R32_M8: + case OT_R32_64_M8: + case OT_REG32_64_M8: + opSize = OPERAND_SIZE8; + break; + + case OT_XMM16: + case OT_R32_M16: + case OT_R32_64_M16: + case OT_REG32_64_M16: + opSize = OPERAND_SIZE16; + break; + + case OT_RM32: + case OT_MM32: + case OT_XMM32: + opSize = OPERAND_SIZE32; + break; + + case OT_MM64: + case OT_XMM64: + opSize = OPERAND_SIZE64; + break; + + case OT_XMM128: opSize = OPERAND_SIZE128; break; + case OT_YMM256: opSize = OPERAND_SIZE256; break; + default: typeHandled = FALSE; break; + } + if (typeHandled) { + /* Fill size of memory dereference for operand. */ + op->size = _OPSIZETOINT[opSize]; + ret = operands_extract_modrm(ci, di, type, opNum, ps, effOpSz, effAdrSz, lockableInstruction, mod, rm, instFlags); + if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + } + return ret; + } + + /* Simple operand type (no ModRM byte). */ + switch (type) + { + case OT_IMM8: + operands_set_ts(op, O_IMM, 8); + if (!read_stream_safe_uint(ci, &di->imm.byte, sizeof(int8_t))) return FALSE; + break; + case OT_IMM_FULL: /* 16, 32 or 64, depends on prefixes. */ + if (effOpSz == Decode16Bits) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* FALL THROUGH */ + case OT_IMM16: /* Force 16 bits imm. */ + operands_set_ts(op, O_IMM, 16); + if (!read_stream_safe_uint(ci, &di->imm.word, sizeof(int16_t))) return FALSE; + break; + /* + * Extension: MOV imm64, requires REX. + * Make sure it needs the REX. + * REX must be present because op size function takes it into consideration. + */ + } else if ((effOpSz == Decode64Bits) && + ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX))) { + ps->usedPrefixes |= INST_PRE_REX; + + operands_set_ts(op, O_IMM, 64); + if (!read_stream_safe_uint(ci, &di->imm.qword, sizeof(int64_t))) return FALSE; + break; + } else ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* FALL THROUGH BECAUSE dt==Decoded32Bits @-<----*/ + case OT_IMM32: + op->type = O_IMM; + if (ci->dt == Decode64Bits) { + /* + * Imm32 is sign extended to 64 bits! + * Originally the op size was 64, but later was changed to reflect real size of imm. + */ + op->size = 32; + /* Use this as an indicator that it should be signed extended. */ + di->flags |= FLAG_IMM_SIGNED; + if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int32_t))) return FALSE; + } else { + op->size = 32; + if (!read_stream_safe_uint(ci, &di->imm.dword, sizeof(int32_t))) return FALSE; + } + break; + case OT_SEIMM8: /* Sign extended immediate. */ + /* + * PUSH SEIMM8 can be prefixed by operand size: + * Input stream: 66, 6a, 55 + * 64bits DT: push small 55 + * 32bits DT: push small 55 + * 16bits DT: push large 55 + * small/large indicates the size of the eSP pointer advancement. + * Check the instFlags (ii->flags) if it can be operand-size-prefixed and if the prefix exists. + */ + op->type = O_IMM; + if ((instFlags & INST_PRE_OP_SIZE) && (ps->decodedPrefixes & INST_PRE_OP_SIZE)) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + switch (ci->dt) + { + case Decode16Bits: op->size = 32; break; + case Decode32Bits: + case Decode64Bits: + op->size = 16; + break; + } + } else op->size = 8; + di->flags |= FLAG_IMM_SIGNED; + if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int8_t))) return FALSE; + break; + case OT_IMM16_1: + operands_set_ts(op, O_IMM1, 16); + if (!read_stream_safe_uint(ci, &di->imm.ex.i1, sizeof(int16_t))) return FALSE; + break; + case OT_IMM8_1: + operands_set_ts(op, O_IMM1, 8); + if (!read_stream_safe_uint(ci, &di->imm.ex.i1, sizeof(int8_t))) return FALSE; + break; + case OT_IMM8_2: + operands_set_ts(op, O_IMM2, 8); + if (!read_stream_safe_uint(ci, &di->imm.ex.i2, sizeof(int8_t))) return FALSE; + break; + case OT_REG8: + operands_set_ts(op, O_REG, 8); + if (ps->prefixExtType) { + /* + * If REX prefix is valid then we will have to use low bytes. + * This is a PASSIVE behavior changer of REX prefix, it affects operands even if its value is 0x40 ! + */ + ps->usedPrefixes |= INST_PRE_REX; + op->index = (uint8_t)operands_fix_8bit_rex_base(reg + ((vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); + } else op->index = (uint8_t)(REGS8_BASE + reg); + break; + case OT_REG16: + operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + break; + case OT_REG_FULL: + switch (effOpSz) + { + case Decode16Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + break; + case Decode32Bits: + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } else ps->usedPrefixes |= INST_PRE_OP_SIZE; + operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + break; + case Decode64Bits: /* rex must be presented. */ + ps->usedPrefixes |= INST_PRE_REX; + operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg + ((vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); + break; + } + break; + case OT_REG32: + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + break; + case OT_REG32_64: /* Handle CVT's, MOVxX and MOVNTI instructions which could be extended to 64 bits registers with REX. */ + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + + /* Is it a promoted instruction? (only INST_64BITS is set and REX isn't required.) */ + if ((ci->dt == Decode64Bits) && ((instFlags & (INST_64BITS | INST_PRE_REX)) == INST_64BITS)) { + operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + break; + } + /* Give a chance to REX.W. Because if it was a promoted instruction we don't care about REX.W anyways. */ + if (vrex & PREFIX_EX_W) { + ps->usedPrefixes |= INST_PRE_REX; + operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + } else operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + break; + case OT_FREG32_64_RM: /* Force decoding mode. Used for MOV CR(n)/DR(n) which defaults to 64 bits operand size in 64 bits. */ + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + + if (ci->dt == Decode64Bits) operands_set_tsi(op, O_REG, 64, REGS64_BASE + rm); + else operands_set_tsi(op, O_REG, 32, REGS32_BASE + rm); + break; + case OT_MM: /* MMX register */ + operands_set_tsi(op, O_REG, 64, MMXREGS_BASE + reg); + break; + case OT_MM_RM: /* MMX register, this time from the RM field */ + operands_set_tsi(op, O_REG, 64, MMXREGS_BASE + rm); + break; + case OT_REGXMM0: /* Implicit XMM0 operand. */ + reg = 0; + vrex = 0; + /* FALL THROUGH */ + case OT_XMM: /* SSE register */ + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + break; + case OT_XMM_RM: /* SSE register, this time from the RM field */ + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + rm); + break; + case OT_CREG: + /* + * Don't parse if the reg exceeds the bounds of the array. + * Most of the CR's are not implemented, so if there's no matching string, the operand is invalid. + */ + if (vrex & PREFIX_EX_R) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } else if ((ci->dt == Decode32Bits) && (ps->decodedPrefixes & INST_PRE_LOCK)) { + /* + * NOTE: In 32 bits decoding mode, + * if the lock prefix is set before MOV CR(n) it will become the 4th bit of the REG field like REX.R in 64 bits. + */ + reg += EX_GPR_BASE; + ps->usedPrefixes |= INST_PRE_LOCK; + } + /* Ignore some registers which do not exist. */ + if ((reg >= CREGS_MAX) || (reg == 1) || ((reg >= 5) && (reg <= 7))) return FALSE; + + op->type = O_REG; + if (ci->dt == Decode64Bits) op->size = 64; + else op->size = 32; + op->index = (uint8_t)(CREGS_BASE + reg); + break; + case OT_DREG: + /* + * In 64 bits there are 16 debug registers. + * but accessing any of dr8-15 which aren't implemented will cause an #ud. + */ + if ((reg == 4) || (reg == 5) || (vrex & PREFIX_EX_R)) return FALSE; + + op->type = O_REG; + if (ci->dt == Decode64Bits) op->size = 64; + else op->size = 32; + op->index = (uint8_t)(DREGS_BASE + reg); + break; + case OT_SREG: /* Works with REG16 only! */ + /* If lockableInstruction pointer is non-null we know it's the first operand. */ + if (lockableInstruction && (reg == 1)) return FALSE; /* Can't MOV CS, . */ + /*Don't parse if the reg exceeds the bounds of the array. */ + if (reg <= SEG_REGS_MAX - 1) operands_set_tsi(op, O_REG, 16, SREGS_BASE + reg); + else return FALSE; + break; + case OT_SEG: + op->type = O_REG; + /* Size of reg is always 16, it's up to caller to zero extend it to operand size. */ + op->size = 16; + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* + * Extract the SEG from ii->flags this time!!! + * Check whether an operand size prefix is used. + */ + switch (instFlags & INST_PRE_SEGOVRD_MASK) + { + case INST_PRE_ES: op->index = R_ES; break; + case INST_PRE_CS: op->index = R_CS; break; + case INST_PRE_SS: op->index = R_SS; break; + case INST_PRE_DS: op->index = R_DS; break; + case INST_PRE_FS: op->index = R_FS; break; + case INST_PRE_GS: op->index = R_GS; break; + } + break; + case OT_ACC8: + operands_set_tsi(op, O_REG, 8, R_AL); + break; + case OT_ACC16: + operands_set_tsi(op, O_REG, 16, R_AX); + break; + case OT_ACC_FULL_NOT64: /* No REX.W support for IN/OUT. */ + vrex &= ~PREFIX_EX_W; + case OT_ACC_FULL: + if (effOpSz == Decode16Bits) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + operands_set_tsi(op, O_REG, 16, R_AX); + } else if (effOpSz == Decode32Bits) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + operands_set_tsi(op, O_REG, 32, R_EAX); + } else { /* Decode64Bits */ + /* Only non-promoted instructions need REX in order to decode in 64 bits. */ + /* MEM-OFFSET MOV's are NOT automatically promoted to 64 bits. */ + if (~instFlags & INST_64BITS) { + ps->usedPrefixes |= INST_PRE_REX; + } + operands_set_tsi(op, O_REG, 64, R_RAX); + } + break; + case OT_PTR16_FULL: + /* ptr16:full - full is size of operand size to read, therefore Operand Size Prefix affects this. So we need to handle it. */ + if (effOpSz == Decode16Bits) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + ci->codeLen -= sizeof(int16_t)*2; + if (ci->codeLen < 0) return FALSE; + + operands_set_ts(op, O_PTR, 16); + di->imm.ptr.off = RUSHORT(ci->code); /* Read offset first. */ + di->imm.ptr.seg = RUSHORT((ci->code + sizeof(int16_t))); /* And read segment. */ + + ci->code += sizeof(int16_t)*2; + } else { /* Decode32Bits, for Decode64Bits this instruction is invalid. */ + ps->usedPrefixes |= INST_PRE_OP_SIZE; + ci->codeLen -= sizeof(int32_t) + sizeof(int16_t); + if (ci->codeLen < 0) return FALSE; + + operands_set_ts(op, O_PTR, 32); + di->imm.ptr.off = RULONG(ci->code); /* Read 32bits offset this time. */ + di->imm.ptr.seg = RUSHORT((ci->code + sizeof(int32_t))); /* And read segment, 16 bits. */ + + ci->code += sizeof(int32_t) + sizeof(int16_t); + } + break; + case OT_RELCB: + case OT_RELC_FULL: + + if (type == OT_RELCB) { + operands_set_ts(op, O_PC, 8); + if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int8_t))) return FALSE; + } else { /* OT_RELC_FULL */ + + /* Yep, operand size prefix affects relc also. */ + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (effOpSz == Decode16Bits) { + operands_set_ts(op, O_PC, 16); + if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int16_t))) return FALSE; + } else { /* Decode32Bits or Decode64Bits = for now they are the same */ + operands_set_ts(op, O_PC, 32); + if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int32_t))) return FALSE; + } + } + + /* Support for hint, see if there's a segment override. */ + if ((ii->opcodeId >= I_JO) && (ii->opcodeId <= I_JG)) { + if (ps->decodedPrefixes & INST_PRE_CS) { + ps->usedPrefixes |= INST_PRE_CS; + di->flags |= FLAG_HINT_NOT_TAKEN; + } else if (ps->decodedPrefixes & INST_PRE_DS) { + ps->usedPrefixes |= INST_PRE_DS; + di->flags |= FLAG_HINT_TAKEN; + } + } + break; + case OT_MOFFS8: + op->size = 8; + /* FALL THROUGH, size won't be changed. */ + case OT_MOFFS_FULL: + op->type = O_DISP; + if (op->size == 0) { + /* Calculate size of operand (same as ACC size). */ + switch (effOpSz) + { + case Decode16Bits: op->size = 16; break; + case Decode32Bits: op->size = 32; break; + case Decode64Bits: op->size = 64; break; + } + } + + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + + /* + * Just a pointer to a BYTE, WORD, DWORD, QWORD. Works only with ACC8/16/32/64 respectively. + * MOV [0x1234], AL ; MOV AX, [0x1234] ; MOV EAX, [0x1234], note that R/E/AX will be chosen by OT_ACC_FULL. + */ + if (effAdrSz == Decode16Bits) { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + + di->dispSize = 16; + if (!read_stream_safe_uint(ci, &di->disp, sizeof(int16_t))) return FALSE; + } else if (effAdrSz == Decode32Bits) { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + + di->dispSize = 32; + if (!read_stream_safe_uint(ci, &di->disp, sizeof(int32_t))) return FALSE; + } else { /* Decode64Bits */ + di->dispSize = 64; + if (!read_stream_safe_uint(ci, &di->disp, sizeof(int64_t))) return FALSE; + } + break; + case OT_CONST1: + operands_set_ts(op, O_IMM, 8); + di->imm.byte = 1; + break; + case OT_REGCL: + operands_set_tsi(op, O_REG, 8, R_CL); + break; + + case OT_FPU_SI: + /* Low 3 bits specify the REG, similar to the MODR/M byte reg. */ + operands_set_tsi(op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + break; + case OT_FPU_SSI: + operands_set_tsi(op, O_REG, 32, R_ST0); + operands_set_tsi(op + 1, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + break; + case OT_FPU_SIS: + operands_set_tsi(op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + operands_set_tsi(op + 1, O_REG, 32, R_ST0); + break; + + /* + * Special treatment for Instructions-Block: + * INC/DEC (only 16/32 bits) /PUSH/POP/XCHG instructions, which get their REG from their own binary code. + + * Notice these instructions are 1 or 2 byte long, + * code points after the byte which represents the instruction itself, + * thus, even if the instructions are 2 bytes long it will read its last byte which contains the REG info. + */ + case OT_IB_RB: + /* Low 3 bits specify the REG, similar to the MODR/M byte reg. */ + operands_set_ts(op, O_REG, 8); + reg = *(ci->code-1) & 7; + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + op->index = (uint8_t)operands_fix_8bit_rex_base(reg + EX_GPR_BASE); + } else if (ps->prefixExtType == PET_REX) { + ps->usedPrefixes |= INST_PRE_REX; + op->index = (uint8_t)operands_fix_8bit_rex_base(reg); + } else op->index = (uint8_t)(REGS8_BASE + reg); + break; + case OT_IB_R_FULL: + reg = *(ci->code-1) & 7; + switch (effOpSz) + { + case Decode16Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + break; + case Decode32Bits: + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } else ps->usedPrefixes |= INST_PRE_OP_SIZE; + operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + break; + case Decode64Bits: + /* + * Automatically promoted instruction can drop REX prefix if not required. + * PUSH/POP defaults to 64 bits. --> INST_64BITS + * MOV imm64 / BSWAP requires REX.W to be 64 bits --> INST_64BITS | INST_PRE_REX + */ + if ((instFlags & INST_64BITS) && ((instFlags & INST_PRE_REX) == 0)) { + if (vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + reg += EX_GPR_BASE; + } + } else { + ps->usedPrefixes |= INST_PRE_REX; + reg += (vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0; + } + operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + break; + } + break; + + /* + * Special treatment for repeatable instructions. + + * We want the following output: + * If there's only the REP/NZ prefix, we won't output anything (All operands are implicit). + * If there's an operand size prefix, we will change the suffix letter of the mnemonic, which specifies the size of operand to the required one. + * If there's a segment override prefix, we will output the segment and the used index register (EDI/ESI). + * If there's an address size prefix, we will output the (segment if needed and) the used and inverted index register (DI/SI). + + * Example: + * :: Decoding in 16 bits mode! :: + * AD ~ LODSW + * 66 AD ~ LODSD + * F3 AC ~ REP LODSB + * F3 66 AD ~ REP LODSD + * F3 3E AC ~ REP LODS BYTE DS:[SI] + * F3 67 AD ~ REP LODS WORD [ESI] + + * The basic form of a repeatable instruction has its operands hidden and has a suffix letter + * which implies on the size of operation being done. + * Therefore, we cannot change the mnemonic here when we encounter another prefix and its not the decoder's responsibility to do so. + * That's why the caller is responsible to add the suffix letter if no other prefixes are used. + * And all we are doing here is formatting the operand correctly. + */ + case OT_REGI_ESI: + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + + op->type = O_SMEM; + + /* This might be a 16, 32 or 64 bits instruction, depends on the decoding mode. */ + if (instFlags & INST_16BITS) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + + if (effOpSz == Decode16Bits) op->size = 16; + else if ((effOpSz == Decode64Bits) && (instFlags & INST_64BITS)) { + ps->usedPrefixes |= INST_PRE_REX; + op->size = 64; + } else op->size = 32; + } else op->size = 8; + + /* + * Clear segment in case OT_REGI_EDI was parsed earlier, + * DS can be overridden and therefore has precedence. + */ + di->segment = 0; + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + + if (effAdrSz == Decode16Bits) op->index = R_SI; + else if (effAdrSz == Decode32Bits) op->index = R_ESI; + else op->index = R_RSI; + break; + case OT_REGI_EDI: + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + + op->type = O_SMEM; + + /* This might be a 16 or 32 bits instruction, depends on the decoding mode. */ + if (instFlags & INST_16BITS) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + + if (effOpSz == Decode16Bits) op->size = 16; + else if ((effOpSz == Decode64Bits) && (instFlags & INST_64BITS)) { + ps->usedPrefixes |= INST_PRE_REX; + op->size = 64; + } else op->size = 32; + } else op->size = 8; + + /* Note: The [rDI] operand can't be prefixed by a segment override, therefore we don't set usedPrefixes. */ + if ((opNum == ONT_1) && (ci->dt != Decode64Bits)) di->segment = R_ES | SEGMENT_DEFAULT; /* No ES in 64 bits mode. */ + + if (effAdrSz == Decode16Bits) op->index = R_DI; + else if (effAdrSz == Decode32Bits) op->index = R_EDI; + else op->index = R_RDI; + break; + + /* Used for In/Out instructions varying forms. */ + case OT_REGDX: + /* Simple single IN/OUT instruction. */ + operands_set_tsi(op, O_REG, 16, R_DX); + break; + + /* Used for INVLPGA instruction. */ + case OT_REGECX: + operands_set_tsi(op, O_REG, 32, R_ECX); + break; + case OT_REGI_EBXAL: + /* XLAT BYTE [rBX + AL] */ + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + + /* Size of deref is always 8 for xlat. */ + operands_set_tsi(op, O_MEM, 8, R_AL); + + if (effAdrSz == Decode16Bits) di->base = R_BX; + else if (effAdrSz == Decode32Bits) di->base = R_EBX; + else { + ps->usedPrefixes |= INST_PRE_REX; + di->base = R_RBX; + } + break; + case OT_REGI_EAX: + /* + * Implicit rAX as memory indirection operand. Used by AMD's SVM instructions. + * Since this is a memory indirection, the default address size in 64bits decoding mode is 64. + */ + + if (effAdrSz == Decode64Bits) operands_set_tsi(op, O_SMEM, 64, R_RAX); + else if (effAdrSz == Decode32Bits) { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + operands_set_tsi(op, O_SMEM, 32, R_EAX); + } else { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + operands_set_tsi(op, O_SMEM, 16, R_AX); + } + break; + case OT_VXMM: + operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + vexV); + break; + case OT_XMM_IMM: + ci->codeLen -= sizeof(int8_t); + if (ci->codeLen < 0) return FALSE; + + if (ci->dt == Decode32Bits) reg = (*ci->code >> 4) & 0x7; + else reg = (*ci->code >> 4) & 0xf; + operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + + ci->code += sizeof(int8_t); + break; + case OT_YXMM: + if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); + else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + break; + case OT_YXMM_IMM: + ci->codeLen -= sizeof(int8_t); + if (ci->codeLen < 0) return FALSE; + + if (ci->dt == Decode32Bits) reg = (*ci->code >> 4) & 0x7; + else reg = (*ci->code >> 4) & 0xf; + + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); + else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + + ci->code += sizeof(int8_t); + break; + case OT_YMM: + if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); + break; + case OT_VYMM: + operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + vexV); + break; + case OT_VYXMM: + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + vexV); + else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + vexV); + break; + case OT_WREG32_64: + if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_W) operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + else operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + break; + default: return FALSE; + } + + if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + } + + return TRUE; +} diff --git a/NativeCore/Dependencies/distorm/src/operands.h b/NativeCore/Dependencies/distorm/src/operands.h new file mode 100644 index 00000000..883d59b1 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/operands.h @@ -0,0 +1,28 @@ +/* +operands.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef OPERANDS_H +#define OPERANDS_H + +#include "config.h" +#include "decoder.h" +#include "prefix.h" +#include "instructions.h" + + +extern uint32_t _REGISTERTORCLASS[]; + +int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, + _iflags instFlags, _OpType type, _OperandNumberType opNum, + unsigned int modrm, _PrefixState* ps, _DecodeType effOpSz, + _DecodeType effAdrSz, int* lockableInstruction); + +#endif /* OPERANDS_H */ diff --git a/NativeCore/Dependencies/distorm/src/prefix.c b/NativeCore/Dependencies/distorm/src/prefix.c new file mode 100644 index 00000000..21a67f70 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/prefix.c @@ -0,0 +1,368 @@ +/* +prefix.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "prefix.h" + +#include "x86defs.h" +#include "instructions.h" +#include "../include/mnemonics.h" + + +/* + * The main purpose of this module is to keep track of all kind of prefixes a single instruction may have. + * The problem is that a single instruction may have up to six different prefix-types. + * That's why I have to detect such cases and drop those excess prefixes. + */ + +int prefixes_is_valid(unsigned int ch, _DecodeType dt) +{ + switch (ch) { + /* for i in xrange(0x40, 0x50): print "case 0x%2x:" % i */ + case 0x40: /* REX: */ + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: return (dt == Decode64Bits); + case PREFIX_LOCK: return TRUE; + case PREFIX_REPNZ: return TRUE; + case PREFIX_REP: return TRUE; + case PREFIX_CS: return TRUE; + case PREFIX_SS: return TRUE; + case PREFIX_DS: return TRUE; + case PREFIX_ES: return TRUE; + case PREFIX_FS: return TRUE; + case PREFIX_GS: return TRUE; + case PREFIX_OP_SIZE: return TRUE; + case PREFIX_ADDR_SIZE: return TRUE; + /* The VEXs might be false positives, the decode_perfixes will determine for sure. */ + case PREFIX_VEX2b: /* VEX is supported for all modes, because 16 bits Pmode is included. */ + case PREFIX_VEX3b: return TRUE; + } + return FALSE; +} + +/* Ignore a specific prefix type. */ +void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi) +{ + /* + * If that type of prefix appeared already, set the bit of that *former* prefix. + * Anyway, set the new index of that prefix type to the current index, so next time we know its position. + */ + if (ps->pfxIndexer[pi] != PFXIDX_NONE) ps->unusedPrefixesMask |= (1 << ps->pfxIndexer[pi]); +} + +/* Ignore all prefix. */ +void prefixes_ignore_all(_PrefixState* ps) +{ + int i; + for (i = 0; i < PFXIDX_MAX; i++) + prefixes_ignore(ps, i); +} + +/* Calculates which prefixes weren't used and accordingly sets the bits in the unusedPrefixesMask. */ +uint16_t prefixes_set_unused_mask(_PrefixState* ps) +{ + /* + * The decodedPrefixes represents the prefixes that were *read* from the binary stream for the instruction. + * The usedPrefixes represents the prefixes that were actually used by the instruction in the *decode* phase. + * Xoring between the two will result in a 'diff' which returns the prefixes that were read + * from the stream *and* that were never used in the actual decoding. + * + * Only one prefix per type can be set in decodedPrefixes from the stream. + * Therefore it's enough to check each type once and set the flag accordingly. + * That's why we had to book-keep each prefix type and its position. + * So now we know which bits we need to set exactly in the mask. + */ + _iflags unusedPrefixesDiff = ps->decodedPrefixes ^ ps->usedPrefixes; + + /* Examine unused prefixes by type: */ + /* + * About REX: it might be set in the diff although it was never in the stream itself. + * This is because the vrex is shared between VEX and REX and some places flag it as REX usage, while + * we were really decoding an AVX instruction. + * It's not a big problem, because the prefixes_ignore func will ignore it anyway, + * since it wasn't seen earlier. But it's important to know this. + */ + if (unusedPrefixesDiff & INST_PRE_REX) prefixes_ignore(ps, PFXIDX_REX); + if (unusedPrefixesDiff & INST_PRE_SEGOVRD_MASK) prefixes_ignore(ps, PFXIDX_SEG); + if (unusedPrefixesDiff & INST_PRE_LOKREP_MASK) prefixes_ignore(ps, PFXIDX_LOREP); + if (unusedPrefixesDiff & INST_PRE_OP_SIZE) prefixes_ignore(ps, PFXIDX_OP_SIZE); + if (unusedPrefixesDiff & INST_PRE_ADDR_SIZE) prefixes_ignore(ps, PFXIDX_ADRS); + /* If a VEX instruction was found, its prefix is considered as used, therefore no point for checking for it. */ + + return ps->unusedPrefixesMask; +} + +/* + * Mark a prefix as unused, and bookkeep where we last saw this same type, + * because in the future we might want to disable it too. + */ +_INLINE_ void prefixes_track_unused(_PrefixState* ps, int index, _PrefixIndexer pi) +{ + prefixes_ignore(ps, pi); + /* Book-keep the current index for this type. */ + ps->pfxIndexer[pi] = index; +} + +/* + * Read as many prefixes as possible, up to 15 bytes, and halt when we encounter non-prefix byte. + * This algorithm tries to imitate a real processor, where the same prefix can appear a few times, etc. + * The tiny complexity is that we want to know when a prefix was superfluous and mark any copy of it as unused. + * Note that the last prefix of its type will be considered as used, and all the others (of same type) before it as unused. + */ +void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _DecodeType dt) +{ + int index, done; + uint8_t vex; + + /* + * First thing to do, scan for prefixes, there are six types of prefixes. + * There may be up to six prefixes before a single instruction, not the same type, no special order, + * except REX/VEX must precede immediately the first opcode byte. + * BTW - This is the reason why I didn't make the REP prefixes part of the instructions (STOS/SCAS/etc). + * + * Another thing, the instruction maximum size is 15 bytes, thus if we read more than 15 bytes, we will halt. + * + * We attach all prefixes to the next instruction, there might be two or more occurrences from the same prefix. + * Also, since VEX can be allowed only once we will test it separately. + */ + for (index = 0, done = FALSE; + (codeLen > 0) && (code - ps->start < INST_MAXIMUM_SIZE); + code++, codeLen--, index++) { + /* + NOTE: AMD treat lock/rep as two different groups... But I am based on Intel. + + - Lock and Repeat: + - 0xF0 � LOCK + - 0xF2 � REPNE/REPNZ + - 0xF3 - REP/REPE/REPZ + - Segment Override: + - 0x2E - CS + - 0x36 - SS + - 0x3E - DS + - 0x26 - ES + - 0x64 - FS + - 0x65 - GS + - Operand-Size Override: 0x66, switching default size. + - Address-Size Override: 0x67, switching default size. + + 64 Bits: + - REX: 0x40 - 0x4f, extends register access. + - 2 Bytes VEX: 0xc4 + - 3 Bytes VEX: 0xc5 + 32 Bits: + - 2 Bytes VEX: 0xc4 11xx-xxxx + - 3 Bytes VEX: 0xc5 11xx-xxxx + */ + + /* Examine what type of prefix we got. */ + switch (*code) + { + /* REX type, 64 bits decoding mode only: */ + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + if (dt == Decode64Bits) { + ps->decodedPrefixes |= INST_PRE_REX; + ps->vrex = *code & 0xf; /* Keep only BXRW. */ + ps->rexPos = code; + ps->prefixExtType = PET_REX; + prefixes_track_unused(ps, index, PFXIDX_REX); + } else done = TRUE; /* If we are not in 64 bits mode, it's an instruction, then halt. */ + break; + + /* LOCK and REPx type: */ + case PREFIX_LOCK: + ps->decodedPrefixes |= INST_PRE_LOCK; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + break; + case PREFIX_REPNZ: + ps->decodedPrefixes |= INST_PRE_REPNZ; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + break; + case PREFIX_REP: + ps->decodedPrefixes |= INST_PRE_REP; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + break; + + /* Seg Overide type: */ + case PREFIX_CS: + ps->decodedPrefixes |= INST_PRE_CS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + case PREFIX_SS: + ps->decodedPrefixes |= INST_PRE_SS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + case PREFIX_DS: + ps->decodedPrefixes |= INST_PRE_DS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + case PREFIX_ES: + ps->decodedPrefixes |= INST_PRE_ES; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + case PREFIX_FS: + ps->decodedPrefixes |= INST_PRE_FS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + case PREFIX_GS: + ps->decodedPrefixes |= INST_PRE_GS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + break; + + /* Op Size type: */ + case PREFIX_OP_SIZE: + ps->decodedPrefixes |= INST_PRE_OP_SIZE; + prefixes_track_unused(ps, index, PFXIDX_OP_SIZE); + break; + + /* Addr Size type: */ + case PREFIX_ADDR_SIZE: + ps->decodedPrefixes |= INST_PRE_ADDR_SIZE; + prefixes_track_unused(ps, index, PFXIDX_ADRS); + break; + + /* Non-prefix byte now, so break 2. */ + default: done = TRUE; break; + } + if (done) break; + } + + /* 2 Bytes VEX: */ + if ((codeLen >= 2) && + (*code == PREFIX_VEX2b) && + ((code - ps->start) <= INST_MAXIMUM_SIZE - 2)) { + /* + * In 32 bits the second byte has to be in the special range of Mod=11. + * Otherwise it might be a normal LDS instruction. + */ + if ((dt == Decode64Bits) || (*(code + 1) >= INST_DIVIDED_MODRM)) { + ps->vexPos = code + 1; + ps->decodedPrefixes |= INST_PRE_VEX; + ps->prefixExtType = PET_VEX2BYTES; + + /* + * VEX 1 byte bits: + * |7-6--3-2-10| + * |R|vvvv|L|pp| + * |-----------| + */ + + /* -- Convert from VEX prefix to VREX flags -- */ + vex = *ps->vexPos; + if (~vex & 0x80 && dt == Decode64Bits) ps->vrex |= PREFIX_EX_R; /* Convert VEX.R. */ + if (vex & 4) ps->vrex |= PREFIX_EX_L; /* Convert VEX.L. */ + + code += 2; + } + } + + /* 3 Bytes VEX: */ + if ((codeLen >= 3) && + (*code == PREFIX_VEX3b) && + ((code - ps->start) <= INST_MAXIMUM_SIZE - 3) && + (~ps->decodedPrefixes & INST_PRE_VEX)) { + /* + * In 32 bits the second byte has to be in the special range of Mod=11. + * Otherwise it might be a normal LES instruction. + * And we don't care now about the 3rd byte. + */ + if ((dt == Decode64Bits) || (*(code + 1) >= INST_DIVIDED_MODRM)) { + ps->vexPos = code + 1; + ps->decodedPrefixes |= INST_PRE_VEX; + ps->prefixExtType = PET_VEX3BYTES; + + /* + * VEX first and second bytes: + * |7-6-5-4----0| |7-6--3-2-10| + * |R|X|B|m-mmmm| |W|vvvv|L|pp| + * |------------| |-----------| + */ + + /* -- Convert from VEX prefix to VREX flags -- */ + vex = *ps->vexPos; + ps->vrex |= ((~vex >> 5) & 0x7); /* Shift and invert VEX.R/X/B to their place */ + vex = *(ps->vexPos + 1); + if (vex & 4) ps->vrex |= PREFIX_EX_L; /* Convert VEX.L. */ + if (vex & 0x80) ps->vrex |= PREFIX_EX_W; /* Convert VEX.W. */ + + /* Clear some flags if the mode isn't 64 bits. */ + if (dt != Decode64Bits) ps->vrex &= ~(PREFIX_EX_B | PREFIX_EX_X | PREFIX_EX_R | PREFIX_EX_W); + + code += 3; + } + } + + /* + * Save last byte scanned address, so the decoder could keep on scanning from this point and on and on and on. + * In addition the decoder is able to know that the last byte could lead to MMX/SSE instructions (preceding REX if exists). + */ + ps->last = code; /* ps->last points to an opcode byte. */ +} + +/* + * For every memory-indirection operand we want to set its corresponding default segment. + * If the segment is being overrided, we need to see whether we use it or not. + * We will use it only if it's not the default one already. + */ +void prefixes_use_segment(_iflags defaultSeg, _PrefixState* ps, _DecodeType dt, _DInst* di) +{ + _iflags flags = 0; + if (dt == Decode64Bits) flags = ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK64; + else flags = ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK; + + if ((flags == 0) || (flags == defaultSeg)) { + flags = defaultSeg; + di->segment |= SEGMENT_DEFAULT; + } else if (flags != defaultSeg) { + /* Use it only if it's non-default segment. */ + ps->usedPrefixes |= flags; + } + + /* ASSERT: R_XX must be below 128. */ + switch (flags) + { + case INST_PRE_ES: di->segment |= R_ES; break; + case INST_PRE_CS: di->segment |= R_CS; break; + case INST_PRE_SS: di->segment |= R_SS; break; + case INST_PRE_DS: di->segment |= R_DS; break; + case INST_PRE_FS: di->segment |= R_FS; break; + case INST_PRE_GS: di->segment |= R_GS; break; + } + + /* If it's one of the CS,SS,DS,ES and the mode is 64 bits, set segment it to none, since it's ignored. */ + if ((dt == Decode64Bits) && (flags & INST_PRE_SEGOVRD_MASK32)) di->segment = R_NONE; +} diff --git a/NativeCore/Dependencies/distorm/src/prefix.h b/NativeCore/Dependencies/distorm/src/prefix.h new file mode 100644 index 00000000..f1f53c42 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/prefix.h @@ -0,0 +1,64 @@ +/* +prefix.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef PREFIX_H +#define PREFIX_H + +#include "config.h" +#include "decoder.h" + + +/* Specifies the type of the extension prefix, such as: REX, 2 bytes VEX, 3 bytes VEX. */ +typedef enum {PET_NONE = 0, PET_REX, PET_VEX2BYTES, PET_VEX3BYTES} _PrefixExtType; + +/* Specifies an index into a table of prefixes by their type. */ +typedef enum {PFXIDX_NONE = -1, PFXIDX_REX, PFXIDX_LOREP, PFXIDX_SEG, PFXIDX_OP_SIZE, PFXIDX_ADRS, PFXIDX_MAX} _PrefixIndexer; + +/* +* This holds the prefixes state for the current instruction we decode. +* decodedPrefixes includes all specific prefixes that the instruction got. +* start is a pointer to the first prefix to take into account. +* last is a pointer to the last byte we scanned. +* Other pointers are used to keep track of prefixes positions and help us know if they appeared already and where. +*/ +typedef struct { + _iflags decodedPrefixes, usedPrefixes; + const uint8_t *start, *last, *vexPos, *rexPos; + _PrefixExtType prefixExtType; + uint16_t unusedPrefixesMask; + /* Indicates whether the operand size prefix (0x66) was used as a mandatory prefix. */ + int isOpSizeMandatory; + /* If VEX prefix is used, store the VEX.vvvv field. */ + unsigned int vexV; + /* The fields B/X/R/W/L of REX and VEX are stored together in this byte. */ + unsigned int vrex; + + /* !! Make sure pfxIndexer is LAST! Otherwise memset won't work well with it. !! */ + + /* Holds the offset to the prefix byte by its type. */ + int pfxIndexer[PFXIDX_MAX]; +} _PrefixState; + +/* +* Intel supports 6 types of prefixes, whereas AMD supports 5 types (lock is seperated from rep/nz). +* REX is the fifth prefix type, this time I'm based on AMD64. +* VEX is the 6th, though it can't be repeated. +*/ +#define MAX_PREFIXES (5) + +int prefixes_is_valid(unsigned int ch, _DecodeType dt); +void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi); +void prefixes_ignore_all(_PrefixState* ps); +uint16_t prefixes_set_unused_mask(_PrefixState* ps); +void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _DecodeType dt); +void prefixes_use_segment(_iflags defaultSeg, _PrefixState* ps, _DecodeType dt, _DInst* di); + +#endif /* PREFIX_H */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.c b/NativeCore/Dependencies/distorm/src/textdefs.c new file mode 100644 index 00000000..d8cd75a5 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/textdefs.c @@ -0,0 +1,172 @@ +/* +textdefs.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "textdefs.h" + +#ifndef DISTORM_LIGHT + +static uint8_t Nibble2ChrTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; +#define NIBBLE_TO_CHR Nibble2ChrTable[t] + +void _FASTCALL_ str_hex_b(_WString* s, unsigned int x) +{ + /* + * def prebuilt(): + * s = "" + * for i in xrange(256): + * if ((i % 0x10) == 0): + * s += "\r\n" + * s += "\"%02x\", " % (i) + * return s + */ + static int8_t TextBTable[256][3] = { + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", + "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", + "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", + "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", + "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", + "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", + "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", + "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", + "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", + "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff" + }; + + /* + * Fixed length of 3 including null terminate character. + */ + memcpy(&s->p[s->length], TextBTable[x & 255], 3); + s->length += 2; +} + +void _FASTCALL_ str_code_hb(_WString* s, unsigned int x) +{ + static int8_t TextHBTable[256][5] = { + /* + * def prebuilt(): + * s = "" + * for i in xrange(256): + * if ((i % 0x10) == 0): + * s += "\r\n" + * s += "\"0x%x\", " % (i) + * return s + */ + "0x0", "0x1", "0x2", "0x3", "0x4", "0x5", "0x6", "0x7", "0x8", "0x9", "0xa", "0xb", "0xc", "0xd", "0xe", "0xf", + "0x10", "0x11", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1a", "0x1b", "0x1c", "0x1d", "0x1e", "0x1f", + "0x20", "0x21", "0x22", "0x23", "0x24", "0x25", "0x26", "0x27", "0x28", "0x29", "0x2a", "0x2b", "0x2c", "0x2d", "0x2e", "0x2f", + "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "0x39", "0x3a", "0x3b", "0x3c", "0x3d", "0x3e", "0x3f", + "0x40", "0x41", "0x42", "0x43", "0x44", "0x45", "0x46", "0x47", "0x48", "0x49", "0x4a", "0x4b", "0x4c", "0x4d", "0x4e", "0x4f", + "0x50", "0x51", "0x52", "0x53", "0x54", "0x55", "0x56", "0x57", "0x58", "0x59", "0x5a", "0x5b", "0x5c", "0x5d", "0x5e", "0x5f", + "0x60", "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", "0x67", "0x68", "0x69", "0x6a", "0x6b", "0x6c", "0x6d", "0x6e", "0x6f", + "0x70", "0x71", "0x72", "0x73", "0x74", "0x75", "0x76", "0x77", "0x78", "0x79", "0x7a", "0x7b", "0x7c", "0x7d", "0x7e", "0x7f", + "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f", + "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f", + "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7", "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf", + "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7", "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf", + "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7", "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf", + "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7", "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf", + "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7", "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef", + "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7", "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff" + }; + + if (x < 0x10) { /* < 0x10 has a fixed length of 4 including null terminate. */ + memcpy(&s->p[s->length], TextHBTable[x & 255], 4); + s->length += 3; + } else { /* >= 0x10 has a fixed length of 5 including null terminate. */ + memcpy(&s->p[s->length], TextHBTable[x & 255], 5); + s->length += 4; + } +} + +void _FASTCALL_ str_code_hdw(_WString* s, uint32_t x) +{ + int8_t* buf; + int i = 0, shift = 0; + unsigned int t = 0; + + buf = (int8_t*)&s->p[s->length]; + + buf[0] = '0'; + buf[1] = 'x'; + buf += 2; + + for (shift = 28; shift != 0; shift -= 4) { + t = (x >> shift) & 0xf; + if (i | t) buf[i++] = NIBBLE_TO_CHR; + } + t = x & 0xf; + buf[i++] = NIBBLE_TO_CHR; + + s->length += i + 2; + buf[i] = '\0'; +} + +void _FASTCALL_ str_code_hqw(_WString* s, uint8_t src[8]) +{ + int8_t* buf; + int i = 0, shift = 0; + uint32_t x = RULONG(&src[sizeof(int32_t)]); + int t; + + buf = (int8_t*)&s->p[s->length]; + buf[0] = '0'; + buf[1] = 'x'; + buf += 2; + + for (shift = 28; shift != -4; shift -= 4) { + t = (x >> shift) & 0xf; + if (i | t) buf[i++] = NIBBLE_TO_CHR; + } + + x = RULONG(src); + for (shift = 28; shift != 0; shift -= 4) { + t = (x >> shift) & 0xf; + if (i | t) buf[i++] = NIBBLE_TO_CHR; + } + t = x & 0xf; + buf[i++] = NIBBLE_TO_CHR; + + s->length += i + 2; + buf[i] = '\0'; +} + +#ifdef SUPPORT_64BIT_OFFSET +void _FASTCALL_ str_off64(_WString* s, OFFSET_INTEGER x) +{ + int8_t* buf; + int i = 0, shift = 0; + OFFSET_INTEGER t = 0; + + buf = (int8_t*)&s->p[s->length]; + + buf[0] = '0'; + buf[1] = 'x'; + buf += 2; + + for (shift = 60; shift != 0; shift -= 4) { + t = (x >> shift) & 0xf; + if (i | t) buf[i++] = NIBBLE_TO_CHR; + } + t = x & 0xf; + buf[i++] = NIBBLE_TO_CHR; + + s->length += i + 2; + buf[i] = '\0'; +} +#endif /* SUPPORT_64BIT_OFFSET */ + +#endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.h b/NativeCore/Dependencies/distorm/src/textdefs.h new file mode 100644 index 00000000..05cf8d77 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/textdefs.h @@ -0,0 +1,57 @@ +/* +textdefs.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef TEXTDEFS_H +#define TEXTDEFS_H + +#include "config.h" +#include "wstring.h" + +#ifndef DISTORM_LIGHT + +#define PLUS_DISP_CHR '+' +#define MINUS_DISP_CHR '-' +#define OPEN_CHR '[' +#define CLOSE_CHR ']' +#define SP_CHR ' ' +#define SEG_OFF_CHR ':' + +/* +Naming Convention: + +* get - returns a pointer to a string. +* str - concatenates to string. + +* hex - means the function is used for hex dump (number is padded to required size) - Little Endian output. +* code - means the function is used for disassembled instruction - Big Endian output. +* off - means the function is used for 64bit offset - Big Endian output. + +* h - '0x' in front of the string. + +* b - byte +* dw - double word (can be used for word also) +* qw - quad word + +* all numbers are in HEX. +*/ + +void _FASTCALL_ str_hex_b(_WString* s, unsigned int x); +void _FASTCALL_ str_code_hb(_WString* s, unsigned int x); +void _FASTCALL_ str_code_hdw(_WString* s, uint32_t x); +void _FASTCALL_ str_code_hqw(_WString* s, uint8_t src[8]); + +#ifdef SUPPORT_64BIT_OFFSET +void _FASTCALL_ str_off64(_WString* s, OFFSET_INTEGER x); +#endif + +#endif /* DISTORM_LIGHT */ + +#endif /* TEXTDEFS_H */ diff --git a/NativeCore/Dependencies/distorm/src/wstring.c b/NativeCore/Dependencies/distorm/src/wstring.c new file mode 100644 index 00000000..5edce8fd --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/wstring.c @@ -0,0 +1,47 @@ +/* +wstring.c + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#include "wstring.h" + +#ifndef DISTORM_LIGHT + +void strclear_WS(_WString* s) +{ + s->p[0] = '\0'; + s->length = 0; +} + +void chrcat_WS(_WString* s, uint8_t ch) +{ + s->p[s->length] = ch; + s->p[s->length + 1] = '\0'; + s->length += 1; +} + +void strcpylen_WS(_WString* s, const int8_t* buf, unsigned int len) +{ + s->length = len; + memcpy((int8_t*)s->p, buf, len + 1); +} + +void strcatlen_WS(_WString* s, const int8_t* buf, unsigned int len) +{ + memcpy((int8_t*)&s->p[s->length], buf, len + 1); + s->length += len; +} + +void strcat_WS(_WString* s, const _WString* s2) +{ + memcpy((int8_t*)&s->p[s->length], s2->p, s2->length + 1); + s->length += s2->length; +} + +#endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/wstring.h b/NativeCore/Dependencies/distorm/src/wstring.h new file mode 100644 index 00000000..1dbaa2f3 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/wstring.h @@ -0,0 +1,35 @@ +/* +wstring.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef WSTRING_H +#define WSTRING_H + +#include "config.h" + +#ifndef DISTORM_LIGHT + +void strclear_WS(_WString* s); +void chrcat_WS(_WString* s, uint8_t ch); +void strcpylen_WS(_WString* s, const int8_t* buf, unsigned int len); +void strcatlen_WS(_WString* s, const int8_t* buf, unsigned int len); +void strcat_WS(_WString* s, const _WString* s2); + +/* +* Warning, this macro should be used only when the compiler knows the size of string in advance! +* This macro is used in order to spare the call to strlen when the strings are known already. +* Note: sizeof includes NULL terminated character. +*/ +#define strcat_WSN(s, t) strcatlen_WS((s), ((const int8_t*)t), sizeof((t))-1) +#define strcpy_WSN(s, t) strcpylen_WS((s), ((const int8_t*)t), sizeof((t))-1) + +#endif /* DISTORM_LIGHT */ + +#endif /* WSTRING_H */ diff --git a/NativeCore/Dependencies/distorm/src/x86defs.h b/NativeCore/Dependencies/distorm/src/x86defs.h new file mode 100644 index 00000000..36fea6d1 --- /dev/null +++ b/NativeCore/Dependencies/distorm/src/x86defs.h @@ -0,0 +1,82 @@ +/* +x86defs.h + +diStorm3 - Powerful disassembler for X86/AMD64 +http://ragestorm.net/distorm/ +distorm at gmail dot com +Copyright (C) 2003-2016 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. +*/ + + +#ifndef X86DEFS_H +#define X86DEFS_H + + +#define SEG_REGS_MAX (6) +#define CREGS_MAX (9) +#define DREGS_MAX (8) + +/* Maximum instruction size, including prefixes */ +#define INST_MAXIMUM_SIZE (15) + +/* Maximum range of imm8 (comparison type) of special SSE CMP instructions. */ +#define INST_CMP_MAX_RANGE (8) + +/* Maximum range of imm8 (comparison type) of special AVX VCMP instructions. */ +#define INST_VCMP_MAX_RANGE (32) + +/* Wait instruction byte code. */ +#define INST_WAIT_INDEX (0x9b) + +/* Lea instruction byte code. */ +#define INST_LEA_INDEX (0x8d) + +/* NOP/XCHG instruction byte code. */ +#define INST_NOP_INDEX (0x90) + +/* ARPL/MOVSXD instruction byte code. */ +#define INST_ARPL_INDEX (0x63) + +/* + * Minimal MODR/M value of divided instructions. + * It's 0xc0, two MSBs set, which indicates a general purpose register is used too. + */ +#define INST_DIVIDED_MODRM (0xc0) + +/* This is the escape byte value used for 3DNow! instructions. */ +#define _3DNOW_ESCAPE_BYTE (0x0f) + +#define PREFIX_LOCK (0xf0) +#define PREFIX_REPNZ (0xf2) +#define PREFIX_REP (0xf3) +#define PREFIX_CS (0x2e) +#define PREFIX_SS (0x36) +#define PREFIX_DS (0x3e) +#define PREFIX_ES (0x26) +#define PREFIX_FS (0x64) +#define PREFIX_GS (0x65) +#define PREFIX_OP_SIZE (0x66) +#define PREFIX_ADDR_SIZE (0x67) +#define PREFIX_VEX2b (0xc5) +#define PREFIX_VEX3b (0xc4) + +/* REX prefix value range, 64 bits mode decoding only. */ +#define PREFIX_REX_LOW (0x40) +#define PREFIX_REX_HI (0x4f) +/* In order to use the extended GPR's we have to add 8 to the Modr/M info values. */ +#define EX_GPR_BASE (8) + +/* Mask for REX and VEX features: */ +/* Base */ +#define PREFIX_EX_B (1) +/* Index */ +#define PREFIX_EX_X (2) +/* Register */ +#define PREFIX_EX_R (4) +/* Operand Width */ +#define PREFIX_EX_W (8) +/* Vector Lengh */ +#define PREFIX_EX_L (0x10) + +#endif /* X86DEFS_H */ diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 1fea3342..d0a98ce5 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -257,17 +257,24 @@ typedef void(__stdcall EnumerateRemoteModulesCallback)(EnumerateRemoteModuleData // Helpers -inline void MultiByteToUnicode(const char* src, RC_UnicodeChar* dst, int size) +inline void MultiByteToUnicode(const char* src, const int srcOffset, RC_UnicodeChar* dst, const int dstOffset, const int size) { #if _MSC_VER >= 1900 // VS Bug: https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t - auto temp = std::wstring_convert, int16_t>{}.from_bytes(src); + using converter = std::wstring_convert, int16_t>; #else - auto temp = std::wstring_convert, char16_t>{}.from_bytes(src); + using converter = std::wstring_convert, RC_UnicodeChar>; #endif - std::memcpy(dst, temp.c_str(), std::min(static_cast(temp.length()), size) * sizeof(char16_t)); + const auto temp = converter{}.from_bytes(src + srcOffset); + + std::memcpy(dst + dstOffset, temp.c_str(), std::min(static_cast(temp.length()), size) * sizeof(RC_UnicodeChar)); +} + +inline void MultiByteToUnicode(const char* src, RC_UnicodeChar* dst, const int size) +{ + MultiByteToUnicode(src, 0, dst, 0, size); } inline char16_t* str16cpy(char16_t* destination, const char16_t* source, size_t n) diff --git a/NativeCore/Unix/DisassembleCode.cpp b/NativeCore/Unix/DisassembleCode.cpp index 3686eb74..48e437f4 100644 --- a/NativeCore/Unix/DisassembleCode.cpp +++ b/NativeCore/Unix/DisassembleCode.cpp @@ -1,29 +1,55 @@ #include #include -#include +#include #include "NativeCore.hpp" extern "C" bool DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, InstructionData* instruction) { - DISASM disasm = {}; - disasm.Options = NasmSyntax; -#ifdef RECLASSNET64 - disasm.Archi = 64; + _CodeInfo info; + info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); + info.code = reinterpret_cast(address); + info.codeLen = length; + info.features = DF_NONE; + +#ifdef RECLASSNET32 + info.dt = Decode32Bits; +#else + info.dt = Decode64Bits; #endif - disasm.VirtualAddr = reinterpret_cast(virtualAddress); - disasm.EIP = reinterpret_cast(address); - disasm.SecurityBlock = static_cast(length); - const auto disamLength = Disasm(&disasm); - if (disamLength == OUT_OF_BLOCK || disamLength == UNKNOWN_OPCODE) + _DInst decodedInstructions[1]; + unsigned int instructionCount = 0; + + const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); + if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount == 1) { return false; } - instruction->Length = disamLength; - std::memcpy(instruction->Data, address, disamLength); - MultiByteToUnicode(disasm.CompleteInstr, instruction->Instruction, 64); + _DecodedInst instructionInfo; + distorm_format(&info, &decodedInstructions[0], &instructionInfo); + + instruction->Length = instructionInfo.size; + std::memcpy(instruction->Data, address, instructionInfo.size); + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.mnemonic.p), + instruction->Instruction, + instructionInfo.mnemonic.length + ); + if (instructionInfo.operands.length != 0) + { + instruction->Instruction[instructionInfo.mnemonic.length] = ' '; + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.operands.p), + 0, + instruction->Instruction, + instructionInfo.mnemonic.length + 1, + std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) + ); + } return true; } diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index 4219df47..85a75c8d 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -76,16 +76,15 @@ $(SolutionDir)obj\$(Configuration)\$(PlatformTarget)\$(MSBuildProjectName)\ - - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false - /home/kn4ck3r/projects/Dependencies/beaengine/src/BeaEngine.c - false - + + + + + + + + + @@ -107,7 +106,7 @@ true c++1y - ../Dependencies/beaengine/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) + ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) RECLASSNET64 -m64 %(AdditionalOptions) @@ -120,7 +119,7 @@ true c++1y - ../Dependencies/beaengine/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) + ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) RECLASSNET64;%(PreprocessorDefinitions) -m64 %(AdditionalOptions) None @@ -138,7 +137,7 @@ true c++1y - ../Dependencies/beaengine/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) + ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) -m32 %(AdditionalOptions) RECLASSNET32 @@ -151,7 +150,7 @@ true c++1y - ../Dependencies/beaengine/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) + ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) -m32 %(AdditionalOptions) RECLASSNET32;%(PreprocessorDefinitions) None diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters index ac6b49ca..09256130 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters @@ -7,6 +7,9 @@ {eaf85ecc-eda1-49c6-a3be-14f2f8f4002c} + + {5b0453e9-b429-4dfd-bcbb-f3756d073e60} + @@ -39,12 +42,36 @@ Functions - - Dependencies - Functions + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index 3d717dd6..dc99a04a 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,28 +1,54 @@ #include -#include +#include #include "NativeCore.hpp" bool __stdcall DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, InstructionData* instruction) { - DISASM disasm = {}; - disasm.Options = NasmSyntax; -#ifdef RECLASSNET64 - disasm.Archi = 64; + _CodeInfo info; + info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); + info.code = reinterpret_cast(address); + info.codeLen = length; + info.features = DF_NONE; + +#ifdef RECLASSNET32 + info.dt = Decode32Bits; +#else + info.dt = Decode64Bits; #endif - disasm.VirtualAddr = reinterpret_cast(virtualAddress); - disasm.EIP = reinterpret_cast(address); - disasm.SecurityBlock = static_cast(length); - const auto disamLength = Disasm(&disasm); - if (disamLength == OUT_OF_BLOCK || disamLength == UNKNOWN_OPCODE) + _DInst decodedInstructions[1]; + unsigned int instructionCount = 0; + + const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); + if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount == 1) { return false; } - instruction->Length = disamLength; - std::memcpy(instruction->Data, address, disamLength); - MultiByteToUnicode(disasm.CompleteInstr, instruction->Instruction, 64); + _DecodedInst instructionInfo; + distorm_format(&info, &decodedInstructions[0], &instructionInfo); + + instruction->Length = instructionInfo.size; + std::memcpy(instruction->Data, address, instructionInfo.size); + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.mnemonic.p), + instruction->Instruction, + instructionInfo.mnemonic.length + ); + if (instructionInfo.operands.length != 0) + { + instruction->Instruction[instructionInfo.mnemonic.length] = ' '; + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.operands.p), + 0, + instruction->Instruction, + instructionInfo.mnemonic.length + 1, + std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) + ); + } return true; } diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index cbf21b67..4a5d2598 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -29,7 +29,7 @@ DynamicLibrary true v141 - MultiByte + Unicode DynamicLibrary @@ -74,28 +74,28 @@ $(ProjectName) $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ $(SolutionDir)obj\$(Configuration)\$(PlatformTarget)\$(MSBuildProjectName)\ - ..\Dependencies\beaengine\include;$(IncludePath) + ..\Dependencies\distorm\include;..\Dependencies\beaengine\include;$(IncludePath) true $(ProjectName) $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ $(SolutionDir)obj\$(Configuration)\$(PlatformTarget)\$(MSBuildProjectName)\ - ..\Dependencies\beaengine\include;$(IncludePath) + ..\Dependencies\distorm\include;..\Dependencies\beaengine\include;$(IncludePath) false $(ProjectName) $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ $(SolutionDir)obj\$(Configuration)\$(PlatformTarget)\$(MSBuildProjectName)\ - ..\Dependencies\beaengine\include;$(IncludePath) + ..\Dependencies\distorm\include;..\Dependencies\beaengine\include;$(IncludePath) false $(ProjectName) $(SolutionDir)bin\$(Configuration)\$(PlatformTarget)\ $(SolutionDir)obj\$(Configuration)\$(PlatformTarget)\$(MSBuildProjectName)\ - ..\Dependencies\beaengine\include;$(IncludePath) + ..\Dependencies\distorm\include;..\Dependencies\beaengine\include;$(IncludePath) @@ -167,6 +167,15 @@ + + + + + + + + + diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index fcd1cf22..3f2b4e89 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -37,6 +37,33 @@ Functions + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + @@ -48,6 +75,9 @@ {b74771cf-fe41-431f-b0fe-91f421240d53} + + {4b8b2ee0-6a06-4e69-bce3-ff446bfa6b82} + From bc02f28a6900fe205334b829541b45bef1ed096c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 18 Nov 2017 16:03:44 +0100 Subject: [PATCH 208/777] . --- NativeCore/Windows/NativeCore.vcxproj | 1 - NativeCore/Windows/NativeCore.vcxproj.filters | 3 --- 2 files changed, 4 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 4a5d2598..9d1cc717 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -166,7 +166,6 @@ - diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index 3f2b4e89..e9aa6339 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -31,9 +31,6 @@ Functions - - Dependencies - Functions From c7611cb68b5adcd6bb7dc2f9bc904c37e3bfc1eb Mon Sep 17 00:00:00 2001 From: patrick Date: Sun, 19 Nov 2017 18:13:51 +0100 Subject: [PATCH 209/777] added linux compilation support --- Dependencies/nuget.exe | Bin 0 -> 5059672 bytes Makefile | 43 ++++++++ NativeCore/ReClassNET_Plugin.hpp | 10 ++ NativeCore/Unix/Makefile | 150 +++++++++++++++++++++++++++ ReClass.NET/Makefile | 20 ++++ ReClass.NET/Memory/ProcessInfo.cs | 5 + ReClass.NET/Plugins/PluginInfo.cs | 2 +- ReClass.NET/Plugins/PluginManager.cs | 6 +- ReClass.NET/ReClass.NET.csproj | 5 +- ReClass.NET_Launcher/Makefile | 15 +++ 10 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 Dependencies/nuget.exe create mode 100644 Makefile create mode 100644 NativeCore/Unix/Makefile create mode 100644 ReClass.NET/Makefile create mode 100644 ReClass.NET_Launcher/Makefile diff --git a/Dependencies/nuget.exe b/Dependencies/nuget.exe new file mode 100644 index 0000000000000000000000000000000000000000..dfe622aee1c2cb4417ca4ec637adb16dee6bd372 GIT binary patch literal 5059672 zcmcG1349$@_5Wn%W!}pqY5S7&rA?p-&=-b;mav+n&=x5BR#sa?ma@q@WgeS-yy1a> zh-Fg{MNtG)RKyJh#a$Fckb(#<6j4DDfgg$sAcp_#`J;;H89m>eVcpgA@MiZk?Emm)hrR2R zQt#?8I5|A-jNapqJM+xo?A}!;_J-%2*?Y>Fy~_?dwD*kQgcBFGwtDkp*30*>to<7t zYf;ua(&YAxWn0Y+Im>!sf6MX|`|IohmemWm7r&H_u&r_f68ZUS9gBG2KYslIDA%!< zTGlN2m;A;-No-kb!56s*U)PP1{Q2kp){4dWU3!4kf}dBAZWH3C`1d^0qXfxcuVw9> zgsg>UpLqV+2p{r1az~t$6>_KldQqB%VJSQwNRf?YC({>2;#$(BkaA&o;^_erQdY`L z9aw)Kmu@#kr~fFEZ8ci29J87AvCj-xO$h&XmgTN{qG0vD&$E`}x0)u{06fnwH=wfm z@r#_j{v&K3X64yVg=jld5v*mk4>nr6f(Nj9=Nu&I_T1s^fbd~~o-%QTRnQ2;a3`Zs zFNh)sSDrx@V1J>Xd_eYC?@imjuxamBhadi_BU5YwsLERrqZ1YZis-E%ZTsL%>qh*7 zalRvjM62gqiDyHxpmKO^R$Ig9Y@oWcYxx}MLh7>!HMcdyD2QV9bqqD*XSBem02b@r zQtVWLTiWb4XLL5Q=x$oer}7}w+UCTlIv$Kt9zK|Q5R_$vUQxB8-&X!6`Xw6r6>Oqk zXcqc~25S19!F0mJm1i&$2-Po|2%^Zrm1mF#nAY#Yf4p&atjL5-(1uh-zX^+=o#?cF zAwKlGPn~`#b*x`h4fM;W>V}Z$S5S4jAtuo;1&;NLRM0P<%7c*TS5SB)bwtdB`h{I& z`ZtHg3IG!59CfKU0ThQ?QJesZLva)*fZ`yY;sj6}w5K=$6o-0HoB)c0Iu$2?;!r7y z69BjuY#*T8;dek0!+3Fw(a&yTWcR|wH7K_LI-t{PRJXn@d?RITSYZ!T?qhQuqDta zP5|Igf7^mjUHvTpB3*w>VEclN%Lzf^aw;UeQRB*60Pr5E6?hOF`YrSqu>!Uu$Bd5x z0u3EyEFbA%3whgVvwU=61HTDccW&~J^ z3iW2$wi8onKh{2&wK%MzjVT>?)$$8qU!Eh+MHHdXAG5;9OIDc@3HRMg_1Xb%3h#T860NTmYSWtr@#1 z*am>3KLP5;8-dAMh4##Px)`|tmF_KAw;uh5l^X_2pipbxQ=R>JRK3*zBeXGcjXZ8K ziS;?#iMB_)5poB>qwbD)mUbe#%19q|GSDyejpAD9YgGTp+30_!<*bFc-J=CQgCS5! zUH{r%3(313c`k+KtW4)2o&Aa(hUP)X1S1kvKvbr12uA1a>rH0GTV z-DZy#2qi_ycCKj7x>udD-ET}E4(kR;g%%Bd*Cg^q%Rp}|bq~O!F0}5I_9D8< zNWTdt89*^mKWYl<-xn~|@9zgd$^t`3<;|%55rq+dv;YmKqT(95ccL27`WdkfdY`GE zRtq(4Z3>y&tkKzM8a8@FR#6)o%xD3TDb~QjAeN57(Zp)wNZvXW{7|(M^F!5);|F!u z<4|)@c^xj5M`V}LGi64k1@tz;98Q%cWp`GH?{6P$u+Z^a=nwPuIZ!YCLH2~`-b*li z(~q_f+Sb-UqqEH0(t~yM+vmXglk|>u>j#2pR)g)74kESo!8r@PjfMU$ZwJeP_J(FK zi{N0u&9K2k@Eg~}3lr6ZX)9T)cS}l!8iVJyvRuy<0Xs_{-obK**lW9`j{x)`nU0z0(^3Wb zZjCt#f@Z?H%30@wj(_OVe>&U3sD)a@xbq<3QFq3E;CU3}C{`KC`N2T+(70qXne1pu z#>nX5aVcgcDH!R)YaOUy?8(GqyJww(Y`5C5KI}464@0Y#f=+NO)y8T!h~t2m)ljD@ zD3B#}GH`lUAv&1R2P-)q5W1nbA8M-2lWo5YC1OZ`QsA;wHU}v@mlKe@f}AsO2>kO9 zRe|9#;zUOD3e538V>kM+1y{<1x`x-FK9T^)4>+>noRw7kB^iI26@SqjSTCDfXQ1W= zXy4`eKy~;J?qs>chXWb?3<@0iAlMbcM^L35>!3`v#Cca@*vD+LXR{9fB*=zIVRzWr zV6BcrbGpJ}5}Ml;?v;ePy26u_P{v9LR_@wi(S|gq3Ak4Ro}7T!C*b`F_^JVeQ^DJd)=>u-d!d7(Q>TN@SO%uJXVQH^}X&bg-aXOrDIWJgk= zFP}?x5`2{G;P9aI$Ds5H$8lo8>^;_-S0zovhiZ{fR*F~%&}_Wm-FOUt5LrbYeqD^6=M?Ct93WWkN|^z5qdiqQ^-L7XrjJ1D~Xz6*7~8l2E9%pbTbX*&-yW zuszB0i5>l`)yha%Tbbz-&<@$c`#E3X|3hpay}RpVq?x(?-$w*(%`5n=>}$IRx3-={ z2fUE|myQ}}zGl=ATK`i;F!1ld(~F*D(Nyj4pQ_qPBZR7U2|khV`RG*nkS5|o`4F=G zqfk1jL$%e;mgrYxJsoQ$fl#TnO7NFtqSm^_WR*Cl&RQ>|MUXV&qg=Oy8Iq;V=x zGm^8Ro!>LR#mKLhOVJ_R!L(6~&(s)&YUpaPtCEHADPM!2K+*5WRy8yiEEDUWqz5OB z5UPe4%xm+<&$VRzM{?b}ChV5=!Ws)UA{IMq&>RD)*dL(SWF{QTa9Wgi^c*voX2p_5 z2vuwbQx%(cqh}MQ`%P6Bq!B`8D#1S_e5P!5q>1=YK7>-jY2SJsif_9dq}=FF%!8ww zn!|DR8Xi}9(jQz;ZIV!^%O9dP8H_W!f#K)t`Cd6?z9bZC<;!4-Z@;xG{BPK?br-C+ z5C4CS0H+H4>mHmVktk0-9xDAiWu$w7;_QJWh46-YQH&9#d{tvR#X0re!-rXJa*FsU ze}v^Ev~E}9T}FRqK59>QPqpevBZOLI45q5g4Q@m}&947Z{It0K$M6%}M0h=?T7BzT z@aRS6i^*nOjX$X`W7im8H1W%lA{OV?7xv@GqDr>HyZi|R1ya$%Um=IwoGSw;y;z9; z!t9qI`;?C~fnv?DQcRlX&EV^Ql6jGbFe=}|yck?Z_A;7=FCo8da4TYNlRP`aw}1&} zHp0ER&0vF10g8Pgu5nn_6IT9Dn3Q6?Fg_CfC1=YJ0O&@gTzhnhJKf!pF}sIIr=wqnu?fAD5+IU z3BF8X6|*>1F-a5gp<)tJzdMnzWoQm0%!!1p(HqQUI(`fZgi8Gw3BE!m%V=R6@?&bP zw$m7Laf~1HX(+5pMiC$7&mbsJ^nYZoYS?zFY9Ngesu~z%4sHi$IB>6%trq;S zNh~0lX^}vvwBQWFHR42O4k|-IvHFCS4JJ+=&$6iTE&+3)Y<@Pgiy80plVfSuhhbRgnRK#YIzwM- z>9eS+DoKUD{5b>#ivCV^9H3KOtErvD~ zKc7{9UYAWrI!rQm;$(&XJiByjSLlej?}AEQfZpd+^y9`aARfb~^-tihP2sUODD!Fm z4#+#J!STOImV8i!bYaUMKUMVcF0F|DsvU zb3UNLy7SC%ni#rHPQQp^RGCmxm%oIdK+#MRYY%bj!~##=Ly%sWXb-{Qx?-(|m_hCv zH!mk?#D}&$LRc?FQ*z_kd4MtmUzX~T_0?7Bij3D!M&tF9?!i7QgK9-Vr?76~-zF|) z2Zf(bPeg)<5ABI0*iI%JrvZ{ie5eK_*hY5R59LEB z?Y^u=RiqbAmY~gaG)LXcNv#w8(j-eKOem?1=Y zK7_^=H|-FuL3130 z1~3>mvKv_Oo7MB3`XU1fgyEnfxo`Y6 zsKB4Wjg~mi?!jK`Z}2D4r{z1mXlJmQ(pbiXl3K?y2@a81o1f!OakfO7h!1Uk5`0_2 zXUbz4X(B$9520AY9JO`P@Df6o;?X?R4)f2-R? zrZeH>o{S1=Yg%HY#8p2J%LMQmiAd~af&xb{1b)Vw*9Ar8e zmI+I1lN_07(n(FUn9@u~UnCGJ)t3Z!ArtK>S`$}({H$<-{VbA3d}vQWsII4Y40RhV zC4b#Pc?Zfn!Mecs`bbSvNG?2dnj*m^WT~|g7_I|b5Q$p%ZmKKjWNI~jry8-SmCS^rs+B>=vUn|z+bgb^P)Hb`)95>In%AWg)F+MfjXO888<5t1h2L-`O& zHNtUY1Jz*0hW(h`box3HM0{vpC&7Km!r#Cmk>jq%_k}A_*csREZKifJ`=S zz#wVFhYlEo>IMwdx7Dw0RTf5)2HT$LK+kX(v!06KGohqb!&A7w z=Rv`GE{HS{A6gZJ;xi?euoBdTxu#~O=r;~#F8{-Pob~f=HtuBUCU74HBM3n z(nNe{83@HYjSeN(>6irxgi6gqf`^dF^xKx{EhlVS&4Ez9F}!GF#Fi<40HAd())77h{7#rNCVoPP)sD!6(GvV0 zpy2kXy9Sfa(hsSL`-mvx6jUZWA01%uBO-r{M@K>2pWuGLUi40uN8P*I>%E@w4zOvx zDTkfp!bANp2Js%qTCi@8jwS2qG&m9nl{PpD9z!PD;HG47%3yrpvt|8u;AfY8RAkC;eE=nDkp;=| zHUAUDJ(Ww&yA;6SS=i1S_@AsrWvu1E^Usl&=k)mgFQJs$s{$}gY>k9(04Mug{)6CL z=~L|HUL6)|rSR_F4fB(|r0?LpB_<4yMzYS}rzB(%4EnYNO%ug=@fPb@$Z{BL*)B6< z6^gds(Vqz(0)x&g_e2+iv*BCc)EPVsgg+B2DmbwWuvwlhZa50Y-N8DbhK~mAoGUT4 zkhhbC=cB*}kCF5aJmigI;=_*SxG=Xw$3yq#6@pcON8K&Cg7b5vFIE}J_ZbIThTx#1 zT1efJOUs&b!!B}r+~m@n^?w04enBMbKY>7ezFyvKK-nF6hh_!JUc&o2vc7Zza=!!n4$M0syVG&7?N>p>H);nw zym{5Rl*6>+7H(xN9PBI?MHNOHr2M3%d-qP3dx4bOuAGegg*VE+kYfFcWk;81-l4SR z-OFQWCwOJc^)E(-@!L7Be*zMF^4?eX&gd~Mcfr#glGmPgIG?rh8*-aXZrrPFvoM&+ zpKJn@)+4qUV%v3f@HD`_Vz@K~FHgb8rr^~n_~I1&ffRgO4X%pfxbBEE+UOni{R#mf z32+MxP5|I)@2&grK=~f(d+`JLkrv0bm0kd(IqQt>7eEbfN=4{s@b{5&5mPKf0_?@w`b9XFZT0^i7%f?CYwG@K@)_A4B*_`keWMYKDi&aLLcC_nMC|i1wIpuQT{}Q0HufW8;y{XXd z4eblg`KG*gV|z2a)@F^D*XP6Sz@a;MnUpPg*TkL8*3sUY&*fY5Ev3t$&EWr#B=2>u zXvZ_(gm)P4wDUP0+(pGV;2a}c&5YBm_WeO=`s1G0|X^sN4ym8YlbUONCPU6j#!lTlEe)R8FSLvxYfDP*M5vQ8)A zb6$-PX(B$9521LY6MYEJY@J4?%S1XoFJIHaWa~%uYYd+Tt11}@H(iQm5X*9EI=3^g z#^{VBuiw{eVzRvI{kOj|FESEt<-Z{)P;@$(t9EGrQ_>D;giy7^plYY*sOVL24*pKT z-E4FwnJ=N1623;}372DP^P8K&!T$#yRq_x<<$oe5(7IX1P|>U!gMR@pZ7ANp{pNq_ zw{ORu7_zf*+cN8N_d&wtFue}6C3b`S<2@|2zVmB+YiS!9wL1N4aIT}W8e(zC9^|m~ z8YC#ajzTxBfHTW?372p>LQ`Zr?Wzca=O9z=)Q zobj(i^T(?S{YaAw|AwmR4&FqvVGqorZIMzg^2mk%tVNA*{B?7|e~@h8JGsta6hLc7 zd!{K)w2t(1k*KNWT`jmNc#EmRH^8PnlZ`@@%lHdt0UmX?X9=+(3y+AAQE6O?9g-A` z%r*J&LI>I#+i*Ps=-OQ@N;m-49fS@{&guFY1cxy+TY2Q>;{l4lYG=727QjZy#K&M-CoQ-(*FjC zhWCa_8_!`k?AY30C*J0w*xPI_v<$T&T{b7)OsnJHL(-e5yl^SR=?+{L4I<87jE>f7 zD&SB-mZ(MyN1ZD~`B*eM7Ya!&HZKEd$2z!7+R>WEVC+79prO72-;G+Tl9_PS#byT4 z0OEz_A-cfPdCYGypkCQSACupIo95+EfGSxCpK=p|0=Z2A&J=jL&J``W>{X{Mc@DZB zx*EAS{x_+Y)dZ!E{br=&wIKu1+2B)eN;}d}T9KewWn^^DxD-1jDHxe)l%dpz(GJXV z92-k0FF+APa1kwp;w*9K6>E)*ka53nw5u=N-i2i~bS!0{-_Ph@S?&e|!L74BB}on1OP5uC!Bl>LkJ&;nIe)!A~GjOHPgV0wakT zinFm4cFy&$Ws8M4VymaxGB2}rgD~b8%tSssbKYbw~Up^XeQg~Z;Disboe;rmjyqZ zV~F|9Bct{E0N>|73VnwU7)D0TZkfVB*WvSsBK2HScTpPX5u6zA$iAhzB1+L@3WnPe zEaA0hugZjc$9gCJwh!j5XHddxSpSP54eP%GQ8XTUUP2M^s*A_FdsypR;Ae!k8;&zU zw@lL54zvDzq-;Ue7x61(!{>pFmAACUw2x_WBkW|f>R%jR^}^IteRLtRFzr7AJnHUF zZrJ*P78&Vp$^6C}1pDpw!P(Z&k=J!B?^Yl&R~BGE^w>LpkrL)^T?%_?#Z@tfqizD2 zo;!@ez-n5DF-5!B&R_r(?U_P*<4}O8JeD?Dv8!|WnfTQn%;m!ImO50}Hm5ZTk z+|#iw`CTON>`E2CZkZumC5A{JRncZ$K!m@2EQ8Kl{o84|`^K$Fd=>w5V$8^UXOp)8 zD$gzkCxGHGBB|U0C~k?t381*81}A{xb~QKw6t|nf381*$4Nd^XEi*U)6t{=L381(= z4Nd^y4z$aQfQy|Ie+R0BdMA>74$8ilp%FlFdmEepii3G+*#!V@ja?oAZba(c=K7Ue zAwtppSp4Ez%O=(jkro{c=JsDj61j@b=Gk*xcy&LXyr9kv;5%Ys?tcS6x-y0S+p=x{ zyFhf<{+Ee=l*>9l05pX42($}Hyd#QK)I}7z8KT*Cvt!eP&-cmT3EX(--v`L{AL7&Y zKaZahUTAau9|PioT&DCr_Ne#bVRP}&wS%AG8SEt1q-{EH9SZ?I#xil4&>cPuLH}(? zAuAG|g6Q5of0)P-JesvV?rqv*ZKMenAr>P|R-0do3Y814hE&r3E>=u%84z=@4#jce zNMy)A6yagY=--WJ>65&N=MAE?%wRrc7_zi zDkJ^XNCxB3vKA~1?$*sHYw5=jpoEovIQgQ_Sbg6_uD1U*WPmm(7xUQa?tF{lY{d>2 z@vs6sMc*%?8h9y<8!QI19PiZ{7{;hhuYUg}q2}kn8g^{UN-WTTfcNp2wzV>6g!SDY3W!n<~RNaF; z7Df&0Ga@4mbYvFL;a6(B{(uZ{v(;x2rR&BvjmYIaaRbBeM_LUByF$KZah!2O(ry&C z&GvVvCMn`D+*qV!20$+(x^GL%?Hd9cD|`yM#prIIt30iBNn=J$ei0<#z6Zz`d}RH} zAZ2BvU3SMWu&6o?tmWkvZ2vJzJ0FysVW=>@l7My)W@e2Uo7`K1>uB|ACzy$78-P}9 zYj^9cyQ~=?wvN{Oy-IsRlnS+LYu^qX!>Clp0w67LkVtU?DDEJG6970f*4%-*;8=4x z+JPBs-Yf9z%4PU<%M9sQvkIK`nvE z%P86l@%%lMzqA_xRDPJT;sj9K;RYvw;$X^}P5{Nd-QWZOu6?lGdIi5<5Ig)cY6fjX z45uAfwT5sf)K#G%bs5Kw+{4%||F6Yx2%G`FteTuJwqq=G2sSXlkCzDezqSaVI3@ zmj0D_cC6wQheUD)bshAUDhV7N?C6=2Bn(*}2?*Me%k6&jpGyS;3E~jno2-``Kjw=tW|H%^6b zwx8?8wsolmKcN+Z0bXzUjST|xeYF81@u!{R@VpurP?*AECe*k>upAin$m$1{p?+-> z0w5jQ*gFhP0N}3D7Kv835>a+Cw##T;fw}1ZAB~lNwvQGR-{>iM$B5Xi`70ua+a%qq z1hWGE2O#=7iB!y+iuo6RMBeVf`4(T?L|cRZB)#Tiuskydx672|mf#xnnsIb*ezNG` z$|U7=NGUz6QfgG0Fr0k_z0&VL;mNr|b4j~D2Lj9EEy9KT1YiF9M< zTPR@NdRz1;wI#E59a`eM8(*}xo};#qq~=v!TXl#j>Ju5pjifz~6oWx++m zJ~H+1$jS@$w>YmtGnabD9fhmsUI|-}tzoHm_Bb=a=a%A}Y_J7^lqE=gW;HYR=F&OD zywHo(Y)F%gqtujHEd|G6MZ{c-$ZU91v0@6>o#id4TG~`PEsZN{!7aG}3&m)f??Mq` zF&0CNu@;z%t{G=2htg11fVx;^q`y53WzLG$Ty*WYq=zL*87WEIaXN7&s4;c^9z@1k z`;iQp7PA~uG|gF|)q5-gb=BME%IdE;gfXmhY!9qt2Y(2DqZOV&Le{5RLR>-`PCnB$ z3G;VAlwbhL6N^X__jvitil!CFRMKE1Q3XSOv?y<62MlEEQT-^8ZU@F!1Ene;8*E9= zQvGj3%2=vXC(ye_DZ$t}(YPr#s#Ny6CT3g5G(54RO-bSNc39uRFD7BJt!rQNfpHai zI4e>YSs1B(%?HONJA%oyuVJM0HR28gM?tZsH{rl-dJ}D)Ih}UC6N$peRGpSvqkMMV zaX)jP41IO|4BPZ9DAYRD+Ve{~MsbZEeTH@an6h0rPUyEMWn-k2EjXI;4jm5$Zg33X z<`S0X-6C2zegdrA;$>^;9kSA%qU*=8T|u_Tg0xs=q>oY$1lYQ8Yjes*vSMS7Z|S^# zqFXw(Ttn75@z{H(t=^yu(Zt~U)!(`XYBQant-UJ!)uYgXiN7iUXn=dC!3hA|!laJS z{~chxiT>|F>Mi^@D+8r=)b^_Q{$wK&)Pef24JNgj$ zq9?(gx4a%yV>!v5H)(`W_emLyuRu8ojO{S2N&OLWUkvWO8!a_iM0}{!gzV_UUDgixhsuukf)7^&l%7tZ5BT)J*`_dDC+FHO3*c9RZuKdJtgYw_s>Cqpwn zAK@k)sCJGE0R}!}vWZP4_Fj7r6P~2?LDc$t&?dy;MR;F3z%CYAK$fP1p$Dt0^K8Eb zA-1`rP5Tmng+TvwYJ89itSq>hq;!H)AVeS6<#1vI_=nKu;=2?3AgCU+(Iw)L=M_4y z#NY;pV;valp64yWsbJyZX4lj3E6XR22-G~(&5Rw>CCG50$2H`zNHaF9Y5p?j!n*M3 zAg@r~)VlC7rW^u*otc+E3^_S3{}`&#%*#J2@a)Qs_;t$+>AZYLbbFYW6HzxW=h*Wm zc>WB$;=O9e$EFaMt^6|}jqHB8{Ro}Oq8*O3vQUZpYY}dd?K%t&fE_=;vlUC^tMRKF z_6wdB^QpVZ9k0wXArALoF@s5mDr1>qnvcUGWLlK<%Raf5Lvn<_(ur7%_eq}ZF1Mk{ zDs}@FJTs9G5R3Hb@ghP0=(lWZ2dnQ$Gq?JT)&HoT#j&mTStq0%XfcS z5cYcm;%s!5&O#Vw^#z(X_2Uhlg~Z~s;v`l&eGBlKzGZy~IGYf)4s8yE&O67F6eNq5 z^-ClLU7iI`NO|h!pz%od-tlc0>kYFp7I)(^echX6XJ@UncDT}%d%pFa&nS$xbURxO z+S0Mc1_eOgz#V6B0w`{k!3m%^jNUr-381(W3{C*WooH|ZDDEVK6F_k%8=L@w^Pi!d z?Sorb*j=-pVBOgMpMdip#et4v{pSHHLe5zD|A*PW|1&&n|0RhUfW_NBc8pw1Rk*Y$ zQ|9>Me1>(#EM9GN^-MG(F0o^|6S8{#9&jFp-wjFZP9OVy;6(p_80{Es1roW#oD%Dz zQEB}U@_q)7;l)6z*RUP?!}Mu8|B)7~1zrYp$k9@|N%babZi`GmvRL;7f0$e%B-Sds zfs>;b`f(mbl-{{7*Bot}VQ{%&#O_e$VEh&k>cM)7dh@qLj1J{0G{a^kOO62Pv65&` z4qCv{peL%p=JdE73Dg0a%D5c{>Fc;&f$5s{wB(6>t{4Dw-L`8nwyoyuqBH&gk%{ObPM?E=rPdErw>++ka+%3P2m2b$e>g#I)&#v5sU$@MV>T5{# zMMRyxxc|U9N5jlVuj9UBlmR>XvB2yQp?3D$Xpt zLsuBRwC@%`^@7n#aRMl=WN-o~?reh-Kyhah2fpW+H~}>7T!RxpapxJF0E#=`-~><{ zI$xDZ0L85_H~|z_HaGzk7Z3-TE--NdXdFBfVB7+k^aWD%_CjfBmgL^@dmWAOZ zUwTik+6qU7;8+A;H=iYZgu>Y0gZrW|wyoS?g~C|kKuWCA;7M8^ch9@Qsf={}yYLf) zg#EALsVTy~*<(f$H#iHiGESN0EG#+2ZLSZJ+CIbf1@L?`{<-XzW&stZ)Bkqts_2;#FVZqh&duY1WscuiB+>*Rv>BYkiIxp$1ZXt{3bqX*(~ zJutzC@Q|_SmWORmoWuwxXNGdiwS@d0e6wX381)(4Nd^Xy~p4LP~0U3CxGHEH8=qjC;9U`I@=)3 zKYQIz;bqE@7n}#9lD7v^ICw2ya6TTNVmh;~?^%0+_7%37cO$MS??eS_n6`|E7vfU^ zs}*?x!meMz6JFRZsBb$s3*BbRdfHLezYr08cS_f7wzk?9^K)Hnms?wCZq}>F!|~y+ z!{KuSEC%2p0PFC%U0_;na550VUlhjd&<*~hFlIz<(7YIFf){}i*M9_kCa{$C&U+@-wiN-jO|edaLGln!Ns8Mi<#jn$2gy@C7+ie zOgd`A`Pe}Y;%izO5cEbwXcr7eNCVFyg(b7#56Gb(n!&1!s{!#zU|%0H_8orf5q-TG%tN8&+H=TSyKN2M8Gn9n4vq_>v?FFv5jqS z^{vz+=JXRVhRENf@kAhG+B`<(Ut%Lh?d+qAz{51`NYrHqd#yL^0><5+)oPVim~^Zj^lRDV15S9OKZ4Nd^T`LHEf1NfMU6F}47WN-o~?&Ah00B|^OcR6t8 zyxlpNl8gLAvi)=q?rwd{v8*@P??>WS&uFYX4pq;{$Tp_!e*iMrJ_dqVxkDgRh3ed3 z9$HS_1UgQ90%}6$r#fB-2Ow{^^bGnk;cvTTX5-%s#_Ox#iJD<8Dbp1jV0t2$#{3Qf zzf{HIrH;+P1@Aeb2Inj-)TGSHYGAnd;23lysmK-L-4G~2CHQpq(-(C zQCPtS(?d+0CdClZG73O054^6y&w|gdpCOz_3qMC4>Vc<@_N-DxKZjiL^7QSHIccSn zEKie02z7ayL2Y7kSAo3N5zF*@)L^C&@5w_Fw{$JU@o&bMFw#NsH4U!vr4qCHf^TQ# zeJFQK&7oTscsduigCK>)iX=?U>*G=T3poqJnzQGBmP4YFz-nN3e5KIVYPi|QjaXa5!?iG_F*45j~&<2H&6xxTL+NXj}f6I7EohixPo zPvpy!W%jR!{OVn#t$#fKele7S*E0-vB8XXAiuKp!vm6?_QU+S0p(nNH(;pihqNPmt;OngI?;yVCYRN+;Nt z)j->fTZt#w{fHIMoKa4&ztQbTib0noWt1>*g2N_CMU`q)oa)GlQuPThM#ZTPV5*sL zvdo|$ZC@p)HZ@(czLU4U106Xv9pR(2!3~goC%CJQq!AyS*?0og-G+KCxJJJs|EYKdOem?cOynC^ z$n#jp(^yE-M0{vJMJV1zQwIQp8vPoM!R((n#)4LkY`nXd%%LU>s{dF zn5*Sc`vyvJZmqJqOsrbdN0~3VOBUsiF<%A~H%*7s>yWFA)6uUfit1fHld@ssO7u<| zAymCHm>M5cm%&ZQJNP&rwvWyma~9i22krWpKpGbUD;b{T9eWACK&9&2G`}?RnGHKl zk-S^RdgVLs@4#T~qMgd#f8345M~)XlzhjRazXpGx)eUoVYUhfZ{7*m%ncsWn2=PyJ zM6EkQtXETny`YTNZ-mZBBZR6m22(n7qo)&|E0D*O?4LA3s5}`=@sv-E`cI?8Jm5Tx z<0@A4JLa;4hL>buUXV<^Eo_Wx?AKx7pLtdC5Ju%sA}G*0=vwDWVF=;XvYugHi^Rx3 z2IK@2s#K1~pw*1A(Bf4|AMv4gc@bKNIg#%4M!zNZY1%Dmgi!UxU`k*5Wk&b_IM$xB zRkL={X6<^YC1WVRO~Y^dHFJEBfm1Bb8+sDPh=t$Xz@j<&Jq6tOA%Wz=Lx%(gRaO}3 zGGrhVotEei%tib3)}%_O)TfhF=(SI0FsIjNwMNgA?R3T)5(t%!Hw-q(Eqfza@Ux;n zO_v`Dgi85I@Q-A|vhw>NwSH=RS!=e01@HKyD4sE#&42zj5P@45~8T zkU*%^ekAxTnXsDYgm+DB<+a9C`zD$i`K_qMD#;^0%C{jXkev%Y#R|sKtA5HuZ!27b zJfc4{x4i-BsPsgAj;19W1^ky+oykl%>Z{HS)|nVAZFdUt4G03W#wxBivMFEuXDh(R zsZ%dlL@!XV9cqFdC%3HC>S&x!PiD#sQ}HR7P*ST; zA;G_pSexL+tTd23;zOGtA=OX#GW4FTG$ikj`~V$5^fGguipWeTsa0eNzC_}U7n$S{ zA1X4TSmeyyI*}WrSD4dO#AHHAtzt^>|46*?Vv;=KL&YQ%i`i8#rW^g8IZZ`OCY01F zrUYLl@&7Ockv`%>haf_!A?R-j_njd2v!ELMiTlCHH9#aHNU&&<=`_>Qy_F z04+*KIr_)#c;O+R4Oc+)yz74&82KVCtvR{ttOZT_C0OpYZLvW)%17`9aZa2RD;Zp};;O;Nz{z5yx4JdbkfZmB-V>zc%!AvNrwSpOR z0xm!lM>fM4(--}NoHpJlNiICpC>e~6@>pY(#gV&F{=Vp6%t`HP&BoL`>4k~bJcFs4 z$BcB^HBXv|53PAZ<7%FjE?WlC8_Z!UI%h&jtvZ+B>m=TIHIqEzL)A1_+>ov-+DLr^|p5V^6iUaMEu(m?-H~^2I$>X>i)9_tsr;My zgkM2zW#m&)SOj_x7lE*5=J}ZC#dn#UY5Q2;&@3=*#5~UJ$A-!6P#w+!H}dWZYcB0x zZi4i&9^lE{@*ZA=a9ke~Jy#BUO?)1^-D>SM=ht?y{?mv#4BLS6kD5AbwK8b@+{7QR<^x|wIGk=eR`F_IHLN*r#=)MT0>r`o9NIvYltNy{29YOF zQ{<4{6ecG%dlY`>K+-Bng}!_)f&xW0+3AQVca7F09OqspOBJLMLhTnN*g!tof$0^k zHAbeWNmZIcrxxo-9`T`7NeJ)otc92|%EsT7zXNI*!X(jZTFbFdefU37$u6@$9x;Uw zi&1H}VUwvX{+RW-Vpk37HWI6xSaJ8N%ttaS-^nUraNX{vU(wChTt`PH_#$F)-CCAn z9ZIp1K4*%nQASC{u9_G(LmmE?C0B z!^^=)8>)y~WNVzoe5NBT34}_8mEcS=*%PHNg!j}7Yb>PbSH#{Dbw%HkOez-&%hpmVr$juSyoer~F-VXD}PP%HIQGXhD{* z<9#0>I>q+-{Pe1~al^%i^7{evBMaeE{vq>Y(2d&2SBJ7Guey^)2z4l9kS}hq_1#C# z^T|`4`pMl#CY03bK1#5I#A;X@<35r+;zJFK5U$vqz;(nvIKE!W*G4Xb;JCc6z>KHU z{zxEH+WsUsn@lME#(9qUVfU_A7^8m{3xy`zXOq z5^sFNC3(b$>X%U79pgV@J|7<|-xcCwqdfQ#%wl8*%04&Aeq&r7k_!*bp1~aWuVoeH zqD{zrI#oylq0%apU^khluQ)U56-+2I=k)#nH>MKeR+sUSZP1#o@O~i*b zFhY6#bWH5ii7osYW)}63{r}>_)e1DZ5665YGxgyZ9P7j7v(Y?CqrJ(m(IY16o5V3D zjSy;K8H{_Aj-0rJLx;1Vo02uxbyHs9B$ZNuMfl>tlTfI&QW(tVRFCaVFjSeEYzoGJ zPXHBuP9$+{ax%OLhv#1AzYNLdgm2b&_GV-q-}x468>Kp~{+Qh`840)Y{p>6mwDV0) z@Bl*XUbH#$;lPqA=VUpU`tyGRdjCP@Ko-KM{8Q$@pc8FIzFIYyB2BGoNF#(=H4Nr; zZh@bNz`Jkg7)TmzLEit{U`Q6iM+ZX&v-zfg17Z9M-^juAVCS%+8uhc^&G}|^VVl*3 z%?1x6d106PUyEN-t$PIyJ_7FnrEA!S2fngv{T3rE8S;<#RrvpD;BxRIT8YHp(N3nZ zqhs8`BCNsq);h#Vi6C^%;6H4IXXbR7q^>wu1JP22agGZ4{-T*U*$4K_-BAfJ@Q6!>VG7GRT$wfwb+J^;{;wec@ZP5GzGnm!Vmwmj0(WWv(f1%mI#{L#`^h zOBUtF5fmtOfa9C!Cd0!}N4m{EKvAaYN|GkxL-k2W^@&Em4>j`(Jm8!yAnzqCW@7)Q zSDbK0V=TkJnSJ>aEDU)FqwvW0l8fKm%!t*0rHMH@{+&v(J}Bp_02PE-Pm)W zcfh~+w1}J@;o_DPBSO@~j z=DEb-L&z?`OA4-!Vh;@ORtpEef|Q+$dx6j+G*_4!(9i#*uG@_nEaiE#As+g<}6~hN0QP%$r*qN_w{Bj)T z`Ei)n#$fPbs~nZ2wsT?2CiOgX;U?oSJB-D2`Zz3S?(X_B_?Wx9Z2xjZNP)urL50}> z=D+C*9j3m*6^P5@odK3pPWI^i1XPT?SqeHX#A9>dLB5+vr3el11>%Em1C0+%2p=~l zDeZ}BEyBs!Uw(0Eta==GfNO9daP3*!fg6IQ9lSfgEwCfYc#92(q_IO<{I0>uh9CFX zGGuiR?qWRwTUrELDqSLb4yC716P1Oqcb;OswC=>ITP8kOj}*}$AoITBHh@Rn%bE6R z#1*TI^mm0N`7p(SW+#gw5t|Nf>9>gXv79%+%{CmRMzBSVc;rY3>;x?+QMBzi-tQyt z-wAI<`tYp=qV2{dyMoDnFUc4wX6EmKwCE6@1-fOUM9bSM)Mb;7i5zK-=kz->HUC}G(bMf;$5XkAz_*rnJ9zJkJ3r!8? zu(LAqF*t+uTH7lv|}3fv5NN-r|hlnY+suP3*?wt4=`3^nJQ+M50U0~ox5$H+|3 zC#b&y)rX{i!|#HJv>e`O0bNmiXd5|vf+cP$eVl_$i%Nuv=&PVGfqYBwcLeh;Za#J) z+&>T)c{}Zt)!vpJEi~5{DviA2n+yJlgd)6f5B`Njpa>@&>TF+UPReF}# zwq9&l+;7Xaux&li@YS-y{1*2ND0xq`g@Ts}UI+W;q2EBfZ14u);NN^aNppDMD0u1kb{~KH;t^vIvU)9G!!b){#(OZ1LUM36 zb=FW^NE}=Ds$>@NQMM5j$c=Vp4q6tuC#c8~OK9aJ*sB2y6_x377>~`Z@--AP2~mJCc+E z7GJGsHdN&IxWA)wy=2bEij%9q#b+=j zKD;R8BOTx)Bk09Y)4VTfEk?HRTr^~v1IX)CaA#JrsNX@dU?z#M|8)n_@!K#XU!#fa zL-E)T{39VaR z)8QV>XPP=BO~i-lkWfm8(OzW9#n(CE^Yx;erL6JYk;)5a#jBEBcl7$zV!MU2n#R%RPC25&j1!qkLnk3`#ap!19?;KKJZrHnlwh+ zgIB#1`F?tE9pF~1GSY`XHW2MFF4ls<@5`suV_ zF3^>Ikrb!LyixZ$la0SWWs$`pP&oPK;GZ>zunROJudp=D!E3_ckx^b@yW(oY}70%^tiqd&Qa}mbb-FXP$;t{_Gzv_Omq=@JR0$0`2 zhvSLfEo;6beHCPA<8}S5x3|Q{TjeB|4dIfZ5^a*7JwQ_A-EMsszblcq6YV(8%&w%F zY=+E=RYvN3;y~1b9n63v(N5ziu1Y8vsT2o+!V9)wX@-W8T{f5xxCM9f7xCNX1XyGA zhIbNu25IAP+KAYVwI8pa+C)*ReTPrOirRqk2O zV5DGOWO&b>KLAwN2QyP2n0MvP;`hyPiz(_{x_i%++o4$7Ta&@#7!=HFZ*-Y;Wis3u zO!S5Xddle+4i7_&3@hf{8%djb(J;k9ZVTYYR45<6mH9fD@h>_M#hcPt!-SGr#~KM9 zKw@<=u7WhFvBq@R6O1+5W1oTIR!JZ6p-u*&b!a8=D7`sKvBlu zqtfp8u~vLi?SGZ+e-QgNSsa}8!R@Cn z7|_SU8oq$5R7Zm56H0RoXo^ndIFdqVgVtXfE$c+KsoRkNrhEco*AcoK>K2M3(=5g*z%2&EkG6Ulv=dLd23hw6n;S}(P> z(OTLLD#BuskA7%icqz;$hraH!?CZ8i41MT<2;bltvC2pv8H@Z$12U6ZR$s<108z)pd ztic`_yURKKKse1f-OtXNH)deVH^rkG``Dp<;ZEh7!rhQczdSj6@mLN=Y>)$A@E^*N z13vI1Ymn&ca8JZqQtSxZ9ce|lG2bNq!w|Qr@Da-;T|vho_v|Hzce-uJBQ)GK&W(ET!JMs(GGHBPLPs3;zK(~LQeQ$SVHOq=_es# zbT0FmN@vJ~l3KMV!E;Ew@x3_7BR*6}LTMq{AM*CByJ6zS9y_f&(ax~5mXF@e%%>tb z6H028T!QD5SpAS&pp|L+=%kPMP(OswI(+Od_R-HHceSc1`{<;J_)x1NG@&1YshWQ$ zT4;0DjX(JO5wwITVwO|U1`|qZ)rJHsB-VO-aAIwkg|OtMTpiRtiw>ho@`#V}=MWSq zx*%cs^u#PTG)`iU;Z;d4Jjyu5>j{*N%H*kPJ;s@0VLE?Uhw>qm zuAbHGI2TdWR|$Qd51CQv!7xlVIInsvwc#CYiqptutNU+knNNeLuNZdp8n{aT1*E*2 z>k|ZdC!+w0yV>9bP#hYyrV~JMw-}rNio>pzrV~JMw;7xOiu;to2>_hAH@<>4$h(j) zf+nyOvn?8Hr7H03%7yrK%M4*6kH{4m+i-6@5q0;)rtSv+w8=*R&HFP3CxGH^H#h+l z2P4$72%tDvqT&Ql9BM^z0w@mq=ZX_RabGYv0R-nigE0+nQC#-xq`X@84+=cH z@&Ww1Wrnou*p*}1iKr|4#nBg$ja-u&-vIsGZkAgmQes%|C)qv@AH`QWWr1*lFT-Kz z$LBw-lN6T4L`{Yb(XTL;b(F`~Q!ML3$cYmq*vfZ@--$5b^?;LwFi$`AsaKSzKKscp z4B!S!#Z2*=pU79&Q5vmXkr&)Zv5(tCFHYrF`So{38>!qP@a)Pb@#~fuQe7RXx+22I z=i6)R5xiUc2JpO?<>8@4H~vQB_aUa-g&xRV=u42s7pG?$ccDWEum@abNoO+t0Luv4 zVBIRxhObiBn{Cbbr1pVBbW-*&NICr_Eb|=#&#rtPziyc!E%Q6H%tZJYK~iN_Jzg5~ z`l`@7m9NOJ+T51~o?ZD8e%&%d%JV4YNkpB^@q2`SgN|^zFJJn3?2q1!RE}HbPw;i% zaMhQLs|yFoA?7Bt`=jYs7kk_6viVl1mLfw=QH&51)E!CgRbu?HtD;#<{@ zK}2*lh|C1xa=@eR4-I9p%1C*URX)H_FToQ`R+9h+3+@IY*m85M07ch~V|pJ`?+$tK zMJqBr7I_QPnteJ}Cv930G?pqL~&2lQ=mfuX}JM!CD`L6u>%V;0>3Ou{= zP5ioLhO{n^gZ$_}i17EUvyVK#>tkJAlL>eN8yL(1E($T&aq7glayv;T>1kZ zYb1^9{{)q17HI3@O&@~gd~m#$WefiZjs+h(&R%pav`}wDKT2$fkzzxBJ9Or`SIKuq z+^bIMT*T>Y__C2qMR5zaViCRpmo&xh)(c!A<*WR&b>>WVt9 zYX!GvH`p5*YRPpi@sQHZb*&7bLf}KGI)5L;$}~Q!)*uLsB)HZ<`t85jTBd!O4mf;& zY5wN4nm54(D_2ww7w|O|p>AbSkl_epj%QVn3f?GWd>FQ&H<)tR(lC~d*lOL24W26E+daKK#{~O9+VC1CyNZg3thUTg zKPqkKqrlagG7d)Rkvm)nUF#IG{o2x#S~v6DcIyG;_i^yaXp-QoFi5-wil+>-O2UN_ z)62AgKMjP49rpU%b7Qw_Y#6ybc9#^@X-<`iQ9SG7O~}+ zdz-nu(u8k5N>X8?4IidUy@p2`g4)WA5XiS7<93wtY40++5&*(Lf9N1oe*!4(>jo!) z;_fy$0Tg$S!3m(aZy1~az;TTK6@G93Z}kCZdHl7K7%EW2_>3A>V4(1~P#ewJ&ZXLr zagK){Rmt(kmGestL})M=I;gtq*7~g zgvn^g1GDgU6C9Io&BjnT8((0b_d&B3Hk;qDwZ5>iI%uxbfqo}s>WXl)#nJ46 zD1Yf7Jc8wT^o=iS_}ZkUQlF{UI*pGr`sKEdqoQ$V zBJp3JF#g-{VYF|0Wo$gou%W&tupOMJif!k37>(u*6G+<}O{{f-WJlH~Qz6y9N;|?HBPa%j}xd6=|4=d2U53Wb3s3T@m|gW7%e8y{xv4Q4cQdN%l5%O>kQ~0 z3(6bUmT=U|RU9KM3GNHnA!KTPV6ps8^&yeO&NHZ<%x8|B+?dO8SgqXIHZs*}s|3&@ryxEm|slFll zuT{U+wzyKBdz@NX*OqlwW_*!u>s!#=y+U8JSLvs`q014287?bEJ0ExrL+=pw2U4Z!U2z|8Cjbs&%+lBC|8k(Pt*0l1$<(}S6 zN{3S|g_faDQb{>6$X0yRzCF{^o9k)Xnd8o!A&7ua?J+5jCW<%kGcfJC5)t@}V?HBa zIfgrsZ-fKUB(`-+aW2mAP|q_#9sb=2p*{WPeq4>_lRComKwyn`k)?Mbiqj+zswIaH z{y>N&heCa395g=1f!a?vl6mZ&PXous=16uE(gyGXy?*c;mkxf-_l+MS07?to4-8HK z;JOEols&ThP?x2KLCm~6nmf?;W}!}Wwt%@cYVy0NhZxH#mV9BQ)eUS=H0ifPmTkp0 zrU;z4&<}S8d#13b5xZ{+aS9PDfEfB>EfX9wx)6EE?H9^Uzo|rF21aB&J__|A!+iSd zctMhXcsdeD&O>hp->j?*v?#Oie8#2HUd-^`HKD=}7}_}frx~V>2c2PR?kP?_M6B>ZiLSJlGd<0!C? zYmsr#qAlYe1wfjW|4wFhbS+)<9nu|za4x#31=Ie=VJ5tFN9Sx?O9kUFsyniofYP#F zAn)6NG@~F|YV1{&j%Jqp0B9k|!OHM^Y9TlV$UdB3{p&0qc;J15eu0*HEbw|Bvi>@p zxLYV}wSj!r)1dkwvpsexXF4GaWwo|MS(+;J zV@V3rO}BqvJA^J)%fx@KzY5&so3*zyj^7V_C-UK6cpXwzStsF(gjgHlvVK6Uhwwv$ zSOekb2vMhD*8m_|O=(AHw;1k*aIjFo69^6htbPyiN#9e(U?bm+x-b6y5r4T?Apqn+ zU+`mt6F_nI8=L@&L-~|e0LA^p-~>?Ig9ayn;(lsy0x0ewgA+h;4;!2Sz?pUZhtMx^ zPvd^9B$+*p9}7IY@+17ZWrlQJ?gaD@SeGMW%o?kHEAru(*Dr+LsXQsanaUILtLwLq z3p~5>bNu213wSDT^n&C~L>=$$!B*=S$on&ng;;@uS-9T%gMf)gb^T<>B91oxUhrvy zJ-9fR43F^_M6L&2`~?xVjI6&C(-ONLlvYPS_gm>M<8Q_c>wtwYQ?Bp48{u`#TRuD| zounMyNOz4`<`{rMnhxj@G|c9#EWV^BiuiOWGV9Ok+LR0|a;(CY)rx*UqEvEZCynkf zHg~G7RmCfsI>X!%u5Uk5bYrjJTFCixk+bFpMUO(6X6f)@z@zS;xOB+LU$M%_pAa^6GT{#iVR&VS4?pt+4mSKI#fdWN@ViW+GxSEyEVH1oW|;9$(gXsZtni5K zAHN-3JE!ssVMsfmePN#^UwQ@25sNaF7h#p)zX}O)Hou{J3X-VqS1lZ)SUdSFL#-asy5%okYtJKK%Q9r# zg|WSck>M0x14yF74-t1N3v0^~Vmkee_3617nMxo20MWKQb&;C(e4{O&3#wa*=aQ%$ z_ot{nj|=z@La(sQ(%+ztqJJ9lue=0Z75&o*z6@~GeU+*@17ZJ6%7=ck!9okM{tO-Y z0Z`uh9D;oXPsRXktLUrv*W7I7pp%Aqj=!43-B>@Tu3sSSS)_Ffi`fmk&2oi7&+_K= zEeQ7YVv=%UvoK`km@x%!;kU&6Lh^%ufPOgBe-bQ%fURMc#PwI9WMX^eUos8-3IV_$ zXS;a>t#gr!fL|i3=xja_;P*wy7(D?>EG_d6-g6Ld`&g&KROej4sU>jNKM#nf zbnLUOoHZABEr3Oh*GrS|I)BQ%a3;DwdZaXOGLp+%pLe<9>=6iaJVOJh^T=N?7dGGEFxsNM3xN!qfXFIXJME8`tjGZEWxqpJhtz@1MOn07>V)g`=&LL&9N>yk=_wkWm7ObR zIb&Pq&{aqV{q2bif+_@^1;Mzn+2~({XG_LE8AEs>*BxApU~ALt#q@PEg{B}2e0xS# zRx*WL9CWbZMd}r{j~{m>mu}di@{NUED0My~hne$u9WZzg(uofEzCMX$|J3AP*ySX% zURAFOwV#4@#}7<<%UQ>RH7*B$Z-bR_7hXDV7TpxzeF9gnXNG80>-^=hb?#`L`be*EaEprCYJhaxaV<*NW+@W?K6lsr9gv?Y|3|cKVlr7#$&eI);Up_KTkQUbvl7`)9!pMv?dNPJladDFXhZfQHL}I(d=--F5)Dg!M*m4aVsA<9FUtx`lSI z7I5d1ZO?(YV z@&(ZU$JzbBM{$*Vz#nEeyPHi&^RJsUq#;cqod%kwG^R;P(-bMCh?pWqM5Ks_h{(hZ zMI`F(O7pL_|bHM2r{_F-1f~K#YjU<#M@*h=}R?d(P}8p?!Y7_kHt$ z-P!M)dCr+LXU@!=*+0^v6Y)O*|INpyB1PFnIrv{(@57lwvm6C6J`gtdzL5rH6vxR{ z9U|kqRI#?*qlBk`-M8UE-j*I-g(J@(^Gj2WxU+~8L8&Jkv&{=UpAwYgvY9~KA^4rX z6bxeE=3bgF(|HGCnEodEJ2p7e?HV6km3h(0@zgH1ec-O3GYw_& zmUF)diA_hB-jS|;E#f5IkviyZK=OKAGKYub$GPPx=zbng^i=g*u0lcj} zc6|Q1RradaU*MeB+X#)nH+37vH7x4%bi7W@1lAOWUCyg#GXayd@_QCDF)e=yt>&}I zrfcyhm=kh*X6|WhExeH)n+5-|RV)Yp@eu*Z&+kq^JL-F3-U1h&V?GBEe<43QYJQ)f z%oCsa!BMPF7~@zd+u3;8%mgxk{UL5<0)}-RjcP+nIVZCujhUE*<3)lq4WIqT4+!^Q zmYvY}N0UPKx1c5cM1u4sbJ0$)jiw-_cP;lA=GYCgi2DtE9wIi>Vdl#(#5ya+VWY-| zI{I~)D87RVPq<<971@$)*mlnQ5#E_64QY1(<~fbf-ahK${16P74)aCR9>DAybE zelOe{H`nBU!x^_+lV3B>{>B^TIic~od3L^lyc+-4OyAvj70-bNdF5T3&qq{@{RlW{ zl70Qs1fP3wEXvy;6;po=E9-6h3gjD-y7?*!6>j>I)LwK8+Hb&IN60%l!_rtWA|ux^ zgdKu~6jd%!q#{u_Cm=2h6rGS~ncrPj;Jo3*0_sf#D9S>f8 zHAS}~^KNXISU2)v9GL4-$Khrv8~UG2>pN(L$;ijfbo_EfE@!>b%UI0o8=B4|p&5Oz z$8arvW(qHjp+k4En&HarSip`393oe2OS(r!seU3yeM;C8^wnx_8k#o`DeO6 z!=ei%Qn-FTf+qX=ezyJbm)&O|gCjU+`8-OPnC3TcN6Sbs8&bxi6U=7B_%qIl!u=a; zc%|&ig_z%Oeczs2@!)@6TMT&*csE|i?La+wmu?~V>zFQ-Z^p%)5{!HMms4iELe86g8z82-U*U(neu`!-@oSu#p;tL(CA6yN&sqfAp8F63henFd)418!L{PH_TLNybVA$QciU6@5&MdVkzLfiEDReB>wz$Si=q>FP zG2mV)!n>vZ^}0>=FWF?<%qEkW&H|J!Dd@c?q9-2F8}9N&iylRBkE8OEZJZi@8=2eq zMVlS+?5$6!B#>JzUdf~`hm`oNeAH`>sY~?eBV1Hy>XM%7<&QolOcT3CsL@bFf2z2*I0Uph0-xTHEeE@!r6{rKSE5(@q^4k@F!u#P`<;w&}YaR0FquWqPrVZnVpOGMJ&O+mFq=@#3K?wdNOzVa!#O7!C~Y&S@V=vfrP=Y3nJoHNGW9=iiU%rdyE zAA9?(Y|@}}5JmC6Dcj^0bXHX326lpXFCi>z9SZoR!05#=mEd4&pb>ffMyYiK4gW!D zGrgwGr1%^Ejn?6Je~Tz+5wA*%_zALb>QM#gweFROUP1FqaVFFt$-UCbdFZB8i6m$NqFBgyiWM}aJ3jjy6UWYD8G;6sG^PN}Z8(M4BUzx2x=O6`F$u> zET?WDJ|6T(v{rquxf)-}@BRjf++SduhRfxgKHy?k$Nge=&=^#tY3FjP=)E>ym=(<} zv+D3Qu68WJh>Ds0IpZf7>O%edl9$TV$l!8}Vf25KZ-15Gi|6|G+}M|A{_f2ElGc14 zJ@!pku{9feXZ+Z&Bs~)!7`(H$_wtyAMNAEOy_Ne*tRKEnLoP}%=6Fv@F*HkjnSZyuiZ`!SQurjV4@h!fv->Bx@54&D zugC()<+yue;fr98$*aNUJuDe1`1Uf{^PCT3pZ30AEhV}QA-y;D$ZXlI@0i_v$86~{ z?wEb!j@f3%M0@HBp8HsT@RYv(bL7kJtJrN(o)qucBtvS^aY&ny65C4i@FGnL^g-l^ zrw>WSQ?ZcQ%2+S6-{(r3xXY}lx2a;^7lCRs^MBaaFND4MVQ*8SUs#GA2@8G?|B=+f zway*=0CIit`So3I`)EipGfNLagnQB?)pZ&|+kY$?wfk*Rj$1?IB zjn5&UF<7SlU#Pp`_yPs=Rl{xbi5Np+d}EW`uJ8Y7q1lm>%CQyWpNk2E{8{GrFwN4j z54HU1_2X{c&!8^6K}{KraPel&u(?G)IMJN4;}Zyp363kXq!`}1nRB!f>w&j>)hzdJ zFgA+w+E|%!?e=RlVSH!+B??z&V_qQG*ODH8Im`W}w2F8@IhVoxbJTVi*9Sgxj)_IA zp}Ed+go*Bv+U=CuEyK%Zsq#B!o#>k-H5={4%Vw$FXmL5FWMf6A$&_pYbB>Apmf20e zL9oU_gW{LoxW>SKhha9!)U2mmtH?cg`BRd+uj0*b&hL=eEP?A}tTfJcN)BN3&gaU6R90*(Y!=4G@nYW4d`zLr!V6|Pr_Ef+!)Lt@ zdA&*6Qxf`Gv?pmuCMYfjqixul-pO>(jCGoF;H_Dv$7~FupAI_T!~)n)kO@8pjlj-g zba6O=OP0R-*O+O(Vy7_BAj#unH-7Veqe;luuKxoTa?jxbw@Utqr`ReLpkTPeFWW=P z`8ZzHNcuZV*by%w23LNA%;F_RrBGk<4X?p>LQYHnQ~uY)O3&R%Up_{gXTe-1G9} zbN}q&1@GxEcycb{0p}Zk#Z%C|ghw)LA3G}~B z!6wE4v4Gr0lZ#ewI}OISn_E^b$`k8ToqwV#OpiJ|T2O)Wkbh$%4UbOipPUz;3`d(V zIj}?X-XI*^A5UQh(F4&gypEklO0+=qB*1pABd0(VH@EQv#b!DsLE00n1eW0Z-AvEI zbc#RrVuid2#9qi3I(n(1+u^1l_}HWAS>+gvx8+NA(TgcEu$^mKRD8YfvVMvb)3DyY z)`}lu(!0?p2S;=BvG0dsy+PO{Z%{25J&%mMu}<^;?qD?K@i^ea0CFr1RNRZlpf6;u znoQbgSzn@Z>GJQKIl6DAd8@v!_5GuM5YMi7tg`Ih2Gw4dtqy;6cm3^ zd7E%_6_$;*;i3M2u|Rwm_2QanQvUeBQ*>%J;$MSA@!J7)CJ!^FUjH{(dp#Ny#@x^s zt@8qO^cC#9OueRHs6gqn@=+GN>msdwsPwIPUzvmI@S$(a@9P_JrZvLEmGSInk$z@u zUoJ*c*_R(O&;G^{=Gl8sWs#Y_yYWFh2O8v+w_7%PyQRP#@2QmUwcUl-??&wCbt&%+ zS<$bLMq9%*UwC+Id=RG_R`efG)2VqQtc~kg?do z=DR`PBXxVf)UEBS{}lEWjQ!5W`ZPX*8gO3(H05LJ&eoYFb^i~n|L|s+Dev=@!__e1 zn_&4g#)zadlaXI?$P{L9$o(%wt;hl;ngKTt%uI7C>&rvMyV^ zooAR9bt;vBa$PB3JI14Z2&rYfFx)H)n5De09WyT66 z;@?@?|1D5`KbVD4BeT`Q&9Z2dJTx@J%v4&!z#rJ%fUAurbei$+sVc!1Fel~x84dWE zcu8nddtZ4eFL4pP9HCvD8sMtA97h3s!MOLWl)+%rV-guB`uIM|zO`4r+&w4S7QwzU z2QlzDt(@pkRKEAh*#vX`h0WP4u}r{*+jwcFy2r#fP}3VECvVe9&()vZf7o=gj9Jjz zbn+4x)UxTC%KF1S_~?a*ykpqI>>lP@#T@LkfsDkUxdWb-m{cy8lK49C5T4{W_g+PQLFZ!# zF>wDUF^$#2S>}klkaqBf@>o- zZnwdc%4H4l9&;SV@G1D%87^)U$_^g%c5pOf9GkY-P4~a9=s8k!d@Cf@P-Z$G#~PZx z#BWVO+$i#IO29E)-f;Bz187ZxI zXUcnP7EU*Qm|5g~2eO5C_l~H>=R8n6x$m+MY30w`rcyKVJ&%Ez)p&So~Bbl6Q;7%4! z4&>3R;bfG`=b+yjkyM^9(>UlA#w*QK7uuGrK`c@1#_MQVz5cyu!28>itluN`hb7Mk zVtHZ&0(r_~-})DOw*!)bt=?xD>kzM8vI%-4fXP98;NXccAlg668webXFL$_0K8ad^ z_A@*ZLPNm8)Q_gz_&BnV6~J#Mc#YevfE?c{dazc6>B?A~?Ixg2;dXuiPyg53`QCev@3oR2^tyC;A98+~H!XQ> zMPAF0S9Au7Qy)ZRCnOKjbuO$yIb&})$V@teLl)ki>UD6&eRB(C-SY5w#C_ZAYRB~+kem0w;nzmbT0X@RduI`auAyq72TvL3_z_(d>tFqWS@ zlV6M+b!@~p65T|UCzelQ(ZJ6}3>|8Pq|ffL%|MUoAI+_ZXa`mXz3O&6Mfc&s2_r_d zOI}{W!_ZV`7BVVAv1AA~JUT{Hkk{ufp#c@u? zL5E^D{1jq)r_YIarS!y^C_ua?YDz*;U(RxViPnH|Gn|83_@Wv<6?gNRvfnsT=(rKIS`gLFJKd>t@*Wu{qM(v8{WR57v z$sE$!n;tMbsz zl2HN8a`}EwtVfORimmWo^PC+$AkWQmHh|B=c;m!-oACA*f2HXLIx)K&JJEn~Z0}ul zlEkDdvT~a6E_n2td3LjzsC95M7>L?qZ~zxD?*l{wiFq;cIm9;*KSKN#@yHwX@>CL^ zL3|nUEyNEKzd}5HtX|GC;?syX5pO4ci1;Pqk*D=?P9@$>{4(*faeDk_;)jW6KBLE( zLA-+x3*?jd&nDhNdG3Ox*Ad@B{3P-8 zx9Is!B))?90phoam)7X{E+F1PyoY%1b9($*;;V@tCVq?fsL6W1^N6<-KSezKt$O?k z#Fr7@OZ*z~qA7a5vxu)JevJ4H;stNh^PNO|3Gpq&j}h-BUR0}>rA<-^2{Q>j`(5Xy~IboL(g{(@%6-y61S)6@kbJ$L3}mwgT${B zFMOw7o~guJi0>nQg?RpSJ>SX1mlNMj{2cN0cj@_#CBBGw2k}$HlV|ApRuQiw-cI~D z@xb$XzU9Q{5#K=k1o70FdcG5gFDJgA_)X%Y-mT|5pZFHy=ZNRb(&JAd-b(xc@ms`8 z-=pWdfOrS-9^$#P_4u{KR}()>-2YxZeiiY>#CHxAC$8RNml6b-U^*Hm1?U@nFVy4L5N{=Zka#cg$`|x}7ZKk{{0i}+MSA=>#M_CV zC7$zPJ$^0mHN=k+zeYS~v7T=^@fpOI6W>a_oA?dlxgXKXIfnRL;;qDY5kEy7zxl0> z%M}uzLcE3e0pd4^k8IG(GmCf|@uS53OZE7b#OsJ}A%2>8dLzk~_&nn4i616@i+E9! zUY=>hTZr!^eu;R_NA-Ls5MM%kEAbxU1D}U<*uhZj9 zB;HJX7x9b4b3d==TSI&~@jb*Z6VGqc^PNI`CGma4?Jwx@Ylv?oewldXdOiM1;wOj? z`=TBvO8fxvlnr{E>BP4Zze&94Wj+3E;v0#dB%Z!ek3W(43gQQd-y&Z6B|YB-#5;)h z5YOGD$FC*cM*I}<+%N0#XAs{+yodO(c0K+a;vK{<5g+*#J^ljXJBVK;UcOn6-%PxV zc@iJ2n$PL_GOh zdYrMumlN+K?%zS;6JJielequeBtG%w#5;-mcar$TmlNMh{3h|T@96n1B)*gQRpQ0F z^!W3MZzX<_c;R>T__K+(6F*11V7DHBKJnee@m)Xael&sjTH^K3laO77{-|JoyKDoTa5HC2W=UYp> zh4_Br*N7MXM9+5`@mAsoiQgbz(y8YgCBBRJ4dUfL)#EQAzK?h>@#;f*{AI*Di3fhB z#~Dw&h4?|@c9$N14Dn^e4-&V3PT~_^M*JXg`!I=5d>QeB#O+_`@k@y>Al^Z|hj{K0 zJ>Od5tBD^b?*FA8zl!)`;ya07CSG_{&$pI%EAd0bdx@9*O3!xz@h!y95|4E2@h1^q zL3}^)8^nuW(esTG-%mVzOpjAbyq)+J;+4PFpI z@r%R@PU!hgBwj~+1Mx26*NNxLcN4!&+&QV2XA1FV;@gOyBcA*_J>P2L z3yF6SKTSOKl%DTc;){uIBYuu}=I`}<#}i*ldvkI8%tPCw`82<^?@|4e?dPyNLV$ zqQ|c$zLfYL;@63nT-5WOPrQTpdE)th)#J}1zK!?|;?JBi;W zKJKy}e>L$_#E1R29;c3YC-LkndYt*h4-n7%A3e@o;`@lFUe)8wCccMw^8e~_W)j~; z+<#4vGoAP@;>my0JGVu+>FAy(D*5fZB-bp-VupVbB z@pj^uiI=75@tcY7BW~TL#~Dj}CGjJ~Q&aW$Q;4?_KTSM8O^-jDcn9&z#7olk_zQ^d zB7Tc_b%q{)1@R-q(=+urQ;BaRex7*I-Fo~w;=768CO#@c;uGIa{4(*PEIs~Q;#-KH zCti@P$Dc`jBk|M3bMDdOPbI#d_<7>RIePrX#19fr9-_yoCBBLHCE}&Idi*BhUBuJx z)#FSjzLEGv;-m8P_)Cc&BAz-_k28((HeBz}>2-f%tNDa2cdA0U2%_{c&%-&w@l zh#w{He?X64NxY8ue&W5v@r$+U_23fX`-t}vuYOREzl?Y%as0@RTF&vrTZkVao-#s@ zUqgHi@sq?eN9ysX65l}l9Pwcf>G9_h-$wi@@zP>F{$k?$h+7ZqamEr~N&EnDt3;1q zO}v@-0pivpBtG$G;s=Q1_gU0-UQN82_yOY9qk8;N#OD*=Li`-@oKijCDa2cecM-SW zpvNCgd=c>-#4iyaR;K4Wh4?Dsoy2bwFMUkUcRumW#7`5?EZ5^tB)**ZKH}GjkF3!1 zok@HH@sq?eEA{v_#8(mTBJO`&k6%rEDe*nTuM;mBt>-(Rcqj4PC-gWAi60?8tV)lw zl=yMtBcIgcEGK@NcxkmBXBF}D#Iv8$<4h#pOnevdi^Oxs==s(VUru}v@yo>X->Bz1 zh4@P1dx_s7K4z?*Zwv8b#B-k3U<5kJsZ* zBEFjVG2)re>hWudw-G-@Ja>W~e+KbQ#CwPjdy^i24)HC-uMjVrsK;+2eu#L=oAo%g z#5WSZK)iU89)A(>{lo)r(c?@azK-}=;)OMO`~}2!6YnKH?m0bvEAbP=^Cs(Y<`Cab z{08yTx9ahi5I;aXFh!3uk@y&t@s|=mNc2I8lPXHV1P*Aj0few291JN5XJh_@0yN<3vciBG(h z_)+31?;`Puw-P@}Jbi{9e+Kcb#BUHE^SmCvmG~**g){XyQR4fFhu^KosU_Y{{0i}s zS$g~>#5;+nyho2Sm3TYx%f!oO>+ze3A10ppUOmnX;vK}V5ig#j$Bz=b;wOmbykCz$gLpgf)5P=U>G5Y0Zzq19c;N^1_;ZPGC4QNB@q9gg z9r2ySuM;o(pdNo7@h!xAi03WP<4+^Lj`%U+DXt!W0`V2Z4-)SsURkH-yNLL1;=RPj zeMpbrO8f-zyr>>$4)N{8ZxFAl*W<4sew27*p&n-j@%6;d5-)f`k3Wa_R^nHPk6NV1 zUqpN_@m}I%KCH)ILHscBl*M|S$;3AjzeK$3BYOO0#E%lsS)#|8LwqOkUg8rP^!V$D z_Yf~$s>fMCd^ho4;^P|i_^rfG5YKDUX4&oPy=YK=bcPjDK#Jh+`w(0Tb6F*2i`Gd#8Y?c@h1~sOZ)`!?CNldyTE2k+DFN&-@ zyV*?CI{ri}5WOt%1>6l-pvbafUh)&&>xfSnitm$A;%p`9j}z}D?sV$qnM`~s@h!x= ziQghV?5BEpCJ|puyq);v6umx=kn}f*=O5C`If3{>;v0!~5x+(}_h))}#u2Y0zMgm| z@h(!IS4jFumtM{);&X_%65mbyEb+k4_3{)GuO;3@d<*fT#Mfr&?ehjnKjyGr{#N3r zh!_4sj}s-npLqC)9;cRgJMk;TD}SlSUqSp(v0k6YNP7FI9)A?^S;W^6KS=x<@q%CJ z<(W);8S$OOdx)oZ>-qXq_4*t`(k~^xoA_1YMX%`PnN55n@sq^UkLmFz5??|50P$PI zuaNdx`fI&BbBS*t-c8(pT#sK)d_M6_#E%mX{YKAsH1Rs(n~CQd}b_4td4 z?Gu)8 zLOlOZBwymoiSH(Uk$BE|J>QAMn~3iq-b1|UF1`QE{Ig!38se*ncM_y~L~k zrpI4Kypwp~x*lgd@fPAoh^PErk6%N44e{f|BRBN;Q;9!Or5~3+_=N8N7_Iw868|Xi zoPX%$TtNIF@yJa*&OGA#iKqWlk28n(Ug9aY^fJAvBZ}VKR~>f_;{b5Z!_`HPwM^8UXuPwzMlR9NuTG}%Tr6dmG~jzy~N8B z^n4c(-$MK>@kl_AKZ*DX;w?k;`dmxK$)}L?`$_!U#4Ce(`4U9(w=vc>+AC*P9&_CXFTyG#J3SYOFT76&vy**g~YcIKS?~CtmiwL z_)p3C&*=ia{VyPKwh_NX+!?Hwa}M#%#CwS6r|9u#5Z^%j6!Gl4^!T;J&)uij=US5f zNRpmDnyvdq5+^5BFXu$!O~iK)?;)ODSIzO#w1C*DmwaJL?RH1R0$4&w94`=HK}^yv}3JmZKjA-5AjHr zp6>+WO~iK+zd$@EThDhA@nys}5Z_Py9C7;|y*$H+k0U;pcnk4u#E%lcN<2MBFMlcV zTH;aS>xl0qewMgBL@#F{@d?Bi5MM)lH}O-%dx;n1>gC^;rXRn?k@QQ6?<9Vac;3Bw zd8QC=A%1}P4dNs7^n7O#ZzFz`xPPb~e**Dl;zx+*=j-to67M3Od!HVsj(8{W>;gT` zeBuX)XWp;JnM-^h@zh~@oJqvj5!%A z#0wlfejV}s#FHP?<4hyoLHq{su|<0PHN?*mFCL-CSxWpc@$8X$oG9_*#LFJi5mW}IZBVeiuh&X6Cc&%Y$Kjr zs;8e%{0Q-pZ_wkcB7T|p#4`HyT%85@UzL-%I=o@q)2>zO}?#i0>zUjdiO0Y-$DE;@sbH7KJgvIuM#hL6NyiJ2l1=KOD5{^Q_1;E9ZBCo{2cM@H|zP< z5MN3B0P&l|OD5_0&LzHy_(|faZ_(p#C-3)INc>8<-kz;$-N%!B^GW*jk$RlPB+f44 zSBa0T(d%I@@y*1~5zl>2k3W_8TH@WrlPBx(#}i*pyo2}=;#Y}hzEv+zIq~Vln~85G z-bMT}@zg1LIZKI8CBB6Cdg2F(Um~9VHocsc#Agw2A-hWuduOWVvc=#Q9{BgvW5#LYz7V)xadcJdsw-Y~2Jn~LG zehu*!;+@2MiI-2;^NkYUM*ITt{CDZ`Q^@Q_3}(5zM6O!achp@ngix=IL?P6YnKH>jQe6L&S^b>*-sGUn71aPj8>KAJpUTB%ZQBPd|_NA>swD z9;b=;DdJ^ydYm=HuMnT`AwA9(;u}bP+EG2uY~qKAJN0^;7UGwQPg_&VaJi5E2L@#hlXPW(FY$|gO2Gx0;jlRv7*8B2UQ@lN9YW)h$H za^juD{U0Ooi7zMKN!-7T#3#O-_-^7?i5Gob&v!QQjl@q9PhYObpGbTK@dLzf5ik9O zp6>$U9mKB?AH714-$MK(@xo8)aTXFkNIZ3=9%lyeZNzU8AOE5re;x7j#7DL0aaIyP zOT6?`dYl&G=ZKfB(&MZm-b1|nB|T0n@$JqIPuUI^n6DXuOq&h_(|f{dOhC~;xmb_ zCVqhURpR+y)XP&tyqWk8;^&B`ZqW0sCSFH8FQQ-9?;`1M5HEjOFV7O<`-t}vuimJ~ zUq-x>c;HKVobkk4h#w)IvPqBc5T8N3llTqdC12L_okx5#@w3FU+x7U9iLWAlh`99? zJ$@zeg~YcLzev1bv!3sC;_HZa6Ayn?k3W`p6Y)L7uMr=)MbCE*@lC`}5s!RLk3X4s zEAhj`108z&F~pmQ?}0ZDgyS??mFui0>hOh4`><==n|~ zzMA+U;BKh?KTq7*uE(EGd$6reP z0CE2gJx(F1&+#PvYT_q}=YLzzcP{ZA#BUO>-l@l5NxYkQ_ILC+Gl_Q)ze>EEe9y*| zU3$K|h-ZFRPrs1(apI-B^*C#ZUnf50dwQH*#54Ek=@$||PQ3K{dYpO0JBVK(K5VZZ ze-`mg#Lp7X{ed2T8u2#bCx~b6)8kJjzMA+I;!}R8$KOjlf4`o71@X(oC;v!~vxj)z z0X_Y4;+Kfm{8*2(oA@a5xwhPcdYr|?j}tHXi5_Pa@r%UAcIt695x-4*>QD7JyNIVA z($mi;zKQgoT_k<-&-C~;#Mcr(Nj$epk3W<6X5tr#kNmkFzmE7W;x~!sk?$!QeOS+T zJ@K2wYk#4~*+o44h@QTV_)+2`f2qf5A%2ngxTAWU&BPay`m}$g$5}-D67d<`dYog# z$GxJb-%Gssn4Z3!c;wf5`WE87#G}XcI2VXl{YFo}k$5lh87K5O`-$iMR!`qV{4DXR zlX{$u#CwU)_?;eSKk>X%dirt17ZKk=`~>m9@AZ7kh|eLuj`$(sH;5OW*2_~%dk_BtG%o#M4QA-XQ76ozwGONBjcu zvOnr^RuDfyys$@)vxxX1;*me;apn-;O+0X3k28($zT=25Cw`E)bwiI|MSLmoy~J-4FZ+j{ z??U1`iC-n2JWSu;i*M@rHWNQaeAqwrIE#pP5zo1$$C*!jKk?Lm>2YQe-$gudTaPn? z9FL}w^s9+?5x4%W=UYy^j(7+0bHuZI^?YlHuOxne_)X%iq&`bt)yuP(_yOV}%cuU% zMGf&b;^&AvgY@`y#P<-lY(36+;;We#>ihdil76I5&$pTQapI0&kF%6`H}PQ!dYr|? zj}Xrf=y4Vj?;>7H`p?{;9)A(>ZsJ8DJT%W(zf62wSdX)b_$}g7lJqzo zq&~Nk^nqkO&J5zaiKh(Kw&=>2VejKT7;2sn5bxJ$@7M6U2+t z^f)VspCw+FuE%L5et~#Zh8|}f@hil~W$JNulk@qFB>g$!1$XQ5XA|E-{37w9h#r4F z@$JN~5+9YN$6rW%H*tp?k8YCmqq6mU=M&#T{2cL|d-V8Ih_@2&B5vpC@kbM1M0^MF zX{0_ck@U_Gy*zV>ZzkSDJU>^DKZE!N;-`pb->b*3CBByUG2*95eWvD-e2H%$-b36O zs>feId>8Rs#H;i5_$!DXA)bDp9%m}?$bQAMR}eoy{1)-j`}KSm z5bq$~Lp*nw9>13OB{E*OnxyX}ev|mf;d*&y5?@Qai}-EgC53vvvx&D6KSJDkK##xV zQN4YZlJpCRcM$I(p6lr4sU^Oe_+jGy2le<>#1|9aN&GVLspRt}g++RK77*V}yqEa6 z5qkVq;wOmbjnw1JA-G4+(KbfVs&!Z%LpjeMzMSKzQ?Zht-&wE(Ux0ZM- z@k7LWiIlX;=>-* z%Tr5yCGow)FB8uz)$^?(zKr-T;unZ#zd_G;0`aB9HxoZj++U{WTS|O3@wLP|iC-r^ z>@mGOQ;07ozKi&I;+f@ozE#BQh_@3zPCQVd=UYyE9`Oytj}o^k^?XMWpG|xn@y+CW zmAgp#@Z)-UCK7KY-c3Axv>ty7@pZ&c63=-;k3XIGM&jp)pC$EKP^ITPgZO&lCy1v% zsmGs0yoLB7;&!zjzl!)0;=74oBfgY;Pj&HAdU>W3Zy~;i_yyvbWAuE-5U(S?k@ykf zw}?A$)XP&#yq(nNa*}>0@pHse#_Hu6O?)2lHsXhfUngGhv|gSX;!VW25x-474|0fn z{_YfsQ!q|1=RD#&iQghV<{3SH3-M#bbH?j&W)a^?{2KAfXZ83+qx9>eWhDIx;zbkm z_)Wx*5ifj`9%l*hqr?j)>TwnkKTJID&3c?D@kOLQ50Ui#NqYP-#G8rlCw`lFv3v{Zz6t)cbL3nt|oqtcuB1urzaq5U4Af7r^k290_4&tR`{L^}e9)B$H zmBfz_Po1X6pF+Hi_-W$#@6_YZCf-5(GVzk>di-sqeJ&*FcM`u!y!c&uzVnH1C4P~3 z;S4?gY~t<2&k@giUXMSW_&(!lBMSL3ZWyH4 zZTITuO9x5%o5YJ}>E)bFd_D1Q;(_<*@kbMn67L{>mU!lDJ>Ln$7v<{p*-X+OC7%0U zJ>Pl6_Ye=v(c?@Z-cI}~@v8Uf@mCQ)MckRI$5}+YgLn_|-1qD8Yl*KWewes_o*uu7 z_+sKaiC-pO_yIlNnZ(x!;GpGABN@k_*uKcvTx65mby7V)a69)B6}L&U@NdYmcbcr=NmUrqcN@yvyK zzO}^Lh@T>!`+^>S2JubAdx#HPq{p8_JeB+`m|lUqyT| z@twpk6EFOTp6^WJwW<2?eLYEkj(Fh`J>U7ncM`uzysANuznu7C;;BpZIJLw#5bq&= zlKk$W)2Qb=gZKvGr-)}a>G5lcuO)trc_>+jQB7T^7s9BFcj`(uo2Z&!K?tDzo zcP8;R;@!kU%k=ow#1|9aLHr`|{EzGTP9?sYco*@|ay@hTv5-$VQs@zE`M{3hZDh})mi ze}nM!;!@vFo~x9ag%5OfBz~3nn9u5Q))K!$yk@N)XD9K@&*|wG5kE=1a-AM$ z1MyzsGe57#IY@k1o1T6J@r%Sqe?gDaM*KSQn)P~|ZNx)g)YH!xH20hMV;>U@X zysXDrMZA-|pZOw5U$9Y+Kb`nG;@!lC0tDgtBvkdgxH zZrid}+g6&d>8WhXKfE#vUf5KP>E6I26Rkk~uPrM)yjf;CD=ce7MFJ8yza3@;oWVXT z9QHMhdEIiO`j?ZL-f|UK&e!zD*Cl?mKe5bos*s73frr#VP6~2x{)o~#uMD>WmB|P( zwA#4~S{}f3mYH-KFt7d@+X^Jv^?w*?1(JjAM7+xG9W*%PoX67jf5k(FKg}Nsx;>ao z^Si&plRE>ok&#d?tDKhLJ}<9i-tQ$z!2JbcfFHs7KXmTQT_#aQ&`UcCcsiD}ezj!< zeC}uQIJ`21`GuJATgfq)7PMV#v_M+W`7@w$v@9KTvCRT50tPZd!RWp+yUy8+ys};z zWLblTN76#=?%O4AFG^a-{TGs!XJT0dd;z7kor_Y$po^^N)`fO{og|H~AKGJ1p+2$%{#9Vto+OB;D=HUi@L7XHiY zVJM{3Mf~psCNARte)wZ}-hg$Gd2#=HEPXj#;)oZ+{CFYTQ~rjO46@R_NvvBcHt!kP zyoG1Pkm;aQZ)Q@G6Y_33yFJ7;8T$hHjloeP+@0+E+CVTt+-%uWjWoll|x2L1IxQ}Cfn+9XwAL2Y~Tj2_+zwT$SfHNgt9YvW%sP~YC-ObvFdVI}nw;Um&MY!AT z9LFMIJK+8RyOwGHnEpPdwQV%i%6`lWVDk>jC>d;(A@(N3woQu<+b%k$fIA7111_3z z;7Qr@?$CRny>_H`P*FtI-EUbLB?*=^{dUBuKZMQU9>fF6<8%Ik4Ob*-hLjAoUPPwY zi_(0u!-d1;*qdc1!*o(+ax?*^UUBV9&5 z2uJNN$0n2PfP;YHiUNt?O-g(8RV2xy`#r2+xkQd&SHQ8xeG%I=S`=U0EMWFzgAVn~VKlGd^Zbz#>(fEnn>u$jV1 zuW$cBSqA;CjneAED|>}0m~@4&pL(Yy;26} z>j)<;aYV%!nD;v3)?ihf2T`udkw*W9$}{cAcK$ByA=0N6IJ#glqjExEJKsb^+xeNa zVL3xF=N=IUd)0^{+xbUdp!!eeBj=lV?PY2^KQ;?~1CPUdgA?VH?9-EEZcN_NFH#&Y z&-y8df)i4S8*o2?7qP6oZP#Si7hx?Lb5RN2?ts=m#JosLLp^4cBwJEy`LhQc>SL25 zu&k3V2{B*V!X&#vLizmlkDcF z(S1wEcDc*4(NXNfcJXQnIps?VMttqTtnQBv zvW9pE=(i!C_Mq7v>qn$pfhB6GBP;=#UnrHJR9<;WRxJYt%EK!C)EDYttOVP23@e^nle(i3{`mWi~4zWpV| z+Kj+IM4e=Yy=rqGL3T;y_2BeD&M3UVVYwU?Suqn7aw{Xc!Mm9 zSMr4Y$(+D67T^UMe-`S%)Df!I`jP3gvO!Wk`KEegzeL?ga&x{Rb+f?tic^kttq4hO zKIc9OVmk%$ROO}hz2a6#Z4`|fke@6YKi+1bua@)A1IV-Kenii7DkWq-EZUC4K=<1b zyZ?N+{ws2N5NMX9COv{l*>ak2#p7K=n~7Ry7>W@+iwI_py8+7~ZOol^-Rp>V5zqaK z9%nxB{lrr@>v5(MUr+oZ@$#?g@mq+WCtkcokJC*21o7Oj>2X#Nzes#yhaP7u@#L@T z>1Pn{B0h4f9;b6U4`UOOLaL z_=(qg2Ck9cf(2>q$^c{l}owwpCvB>l> z*#V3Q$T_F`1eSKI@DRwF8V-0dN1cnE<0qJN{7$o+jdd)SbD>~JE|qX>my?a5&O4r# z>p8i0kONJ*T+B(Ra&*L)ct<#tg%u2%bM{f4eaF^yc7uaX+B;v%YLsc54o*XLG(ITP z4f2SUk!|@rBK=hA`U#w3pp1>r;#wx)tA7%uuD@3n87~(%K3vmOAw_*P+<7}ZDbOHu zg6yltCNl3}$XA%-o|e9_1bUtNy5_6Ylu0+n)% z^+kMUU9!B(50k`yqu^z6E8dG}k}g3QE(DRFz`BR|t0<${kzz8q6!Ie-4jv z@v1}4YU0%qz;>F96!F#ji?Vt?_pL}Vxco^hm*}p*p1JT_*vGJaFkmzVv)s4gp;D^P z%Q?=nGsn|pnQUS^_V>?ZNvs!ezBni&AuZvK5$ddrKxRg8zy{0+m6zfoB|T)eU`Ap9 zqdc|9F(aH7uAFXim2Cz!oALTUk&4IYQNWBQrUgv{PD{!NmP==7rzJV>#73!*Jyq1J zLj-y|!WWir6%JO6m#08we|w4Nlr1s(mXWMXxJv2j;*0_BPhkeusQjG+*c7$$SrfTJ zDkGjgdJ!MeHH(yw5O&@s1;h|zUkcmrOow@Ch#;Y_LNHC*6k&FQ9Oj>Q_ z0U7R+-YGrQ8|iPjvPw@)Ln003>91H4eg{A?ZXMPyyEg0J;W#lbZ#oj*Y)v&B~ zWbm1MJjGk?ca)Z!g%MdCvSP=Bq1M|Mc}1P%i{_e+4WquOF24-DGsSstB zc2S6#i)?dLZj?UIu74LIHOd|m8`Z;DW_)16c?icbGbq$pBnj*Wd8(HSphgTV$B#en zM}9}ldI;{=*t|F5|Lkp_qXc$DbCIv#Vi=I%VN{;cNSB6$S z`bzMjqj)Vtt&=GtHU|!H|KBjmV!D_KewioOdIU^ugvj+OlxJM%-Fv#||qIfBh^ZF*omg z_3y!?GZ%%DZP0`?$#}-#%)MpIeQ1MgKpRTWl`;;^&9IG}~0l;klQubPN)DOJWD^0qusJQvnwk_0cqd4|%fcQTyS_Hr&PR??N4VZLuRj=jUFN;^ zxeGkNHMY$6`4e1Mq;GzmH^1-ohhCRHD$?q$hx;^EBObaQGh#eWDtugD9w~lzp%-U{ zXJ(_t(vFq1@$$alCF?8yqS))c@_g8Xc>2Y$`IYg!+>aRPOTWZRFkpQfMCQdZe`A07 zQ58$?T(;3$HlA0L_tF{=>!U*P`O+w*?)&m?_MpFPA2ZN5f0;MGz>YYdjO`=nm$IFe z-iz4%0o(_`-Bg^fW<8(PJE-wtGoAfB?tM3wU|R0|Hwc>d510v*0cK{(dkVZ%#w3tQ zXC{yiyU3$3bKl)=7==mq2a>zT-u=UOAlnY%!>FhvH zn}l9j&bhpMM-Tn^jC5Q9bM`X$j;j;9LE;VUpR=stqs^^AjLSKnLJr;y7q47D^vY$* zxKE~0@BJ^3M@C7&lH;WO*$t0KS#iHs4u~e%DhzNpihA?BA##%}mSDH6(sYc)dI{qD zm09>D868J3)ax6h(0lEMGRXj^qR30A!ki;{)6R1U)hG$PWJM_3U~2}_cAI)MA-{n% z70IeH3K^~qc-K0yB8|q z&Mx~>2E3HR`%*@nXZus)?H=)}z`3tk(@d{EGw-a=4Ok|2?Sm0ZYh}Atg&PF8H=1Mp z;?I_p9>-VHn$257yvauqN>LSp0e?a9gJ(l6A%Cl9t0 z8)X-@gYGA=r#DJZ5vy^zX3M|}*|NBRk($j4o0<%HqY-<|MN3G(XhAEHxN`iH9SGNQ zd1G-C)~wIn*5vnjr_Pgbh5s4EcfN!N+x;{iabB5jxme;j*1`9}_pt=dE9Fuvz7-}S zmA4zoJr{Gqg&QyEp0EPm9u&;Rz1#j*rqZ$Vcy08}Slrv(Xrr;kLtYZIk6`Ti%U(Hx z76xam->WeoZ4Ws%5ppCwm#r)0fMlK74-mlocxD{mI^+Jl$&_av?C*zvSWaH;=w zloCg%(b5PK8lRM>6n|s2DUam)7;-pmVu^Y07-*2mZXEeyw`xCym@ml7ugXI>P=uR` zcgrN+01!KF%AWGVK5Q~+V>qXJ0uj7(D%;tEd5r=d7s>pp0rS5v^94MXbFKt)?R-Yc z<+GQL#XPx3IwE{Vt_kG|_#l>95^p0gDSq$yYun-tXU^nQmISZ*@op~W42!U zKaljMKJk`;czSF@2`cYzcv_z2x?TFgb7py|W^Z3=kV$g@H(i$**9)UdboL@rawvd9 zN)B4e;4^X!hXV=5w#_=l#~+|pMTM0l>lDx9kN@BE81jG3L+VY2TYDrA)VZvj^J%H` zfEjG}WjPf$5~Pc781BguR)P zZol2|MoDK*T}Jt$`VYE0oYOTdhC zCY8?v2m8l4(RX|XGn?>!OuzF6T)~=iHr(%D11*07i9_yZF&QmF-{Y>uRHgK$A#!{mEe^aXKihGSqT0Dp7EAn z>F3k^y%D^%F!mM!pSvEj%#}?>pj=LK@XkCliYwPP81%#&eWjwHkD$wZ=#OWzO&ae+ zCzKZQMrT8@cXxX4?Y!4o`UUU0#4Dl`=7Z^~e%y~#-}tib0t=eN?1hLl9CKjQh%W?va6P3l*8=`9c~lRB3k z9&c)r9zIg_Wtr*CbvMY0zl?|ajd*C3g}qC>r1DxM8@Q3p{yf;*XhSQ_9W(P*k|+DO zC2mAab$d}ogUy+Gv<7((wi_gBV#xiHXtOf1yxil%3z&SaVBLX>!D zc6~c$H;bBCNSIM_kGzl3x_~;y``>Km5DMpWzk+nA*UfmU_!wpf+^=FXdP3@a3#Pm| z(pkQ4&et$IDd=|KDXV%IQUoLJ*JY8dc<|n7BrVlHke`c1xzrb5q6}EB$Z@37%$ti$ zyOH-)HzUknq};J>E<18}3tE5wyOPYV>wW_>UicO&_&I-#IR&u&HD;^%oSz|V*n4MX zrCi(NbPgS*j7fb4&)$%%>DO`n;IDChg5*oke_}toTXMp^sgQXe4ia0H@Adk4Y5y|L zAb&{fk4&~5xybiUM4l40pDUNcpU+ogw%v2FXLGp|n|Ava8F>-|CN<^&N zVh~S2f%sFDLy*e@5JZss5=9Auig@D*h!FnY?|aofJ;#Qq|M`4+y6V+?uU=KXx?fd; z&p|rGmVBT+CFc z-vDL>w$11=_>b8)tGc-T8&JBH4=~K}ZiKrD%1uPshbV@<(V@8Pul|m*JHi6nir&pY z*2%e3J{lrb7J<;omcI!&4S}8nY$Ij2hZ$lPO6l~EWeU24Ah0gxDs{NVoV2#vS&k)0 z8+kf-{2p;TtM*0m(9O*P!1Zqd#i~;PL9TI$8N-WP0n#L5>zd)-Qxr^6WDhg#PWfBJ zku1^-FnK{7Z8l7Hg?VAdOmXW`MDhp7(S^?NHgM_x9smE6a3o&o*vI! zHsv)04RZb;&t5j=JM^&0kM~?QJy}5xFe4-5`4vM4X#BIF7EK%W|g;x^Q`S5z)yk&-h28o1Pxn*^jj-;vZSQ zqASo1W)@8Bb-s-?ybl8bR?xM>3C&0Bc!F(qsInhu?4(Szdxk3e)8}aW`)weYf>CAU z_@lib3nX0{(51}kqmYqGyBuqQQc4UNWgS;KSLj~g`~!)#t#Q`6FRJ+{)?8W6U7K3e za2Vq!rYe87!UtHrGUyeEBpdGbF!?X0&Nju_3qsq&Oqbw*pVUFTsnw{92@4u({YmnX z3MJzLdzj9=?SBX4{o6Ai{qMrL>IbULEG*am9w6urXttc0%fV0FyBi?x^sw&tp{>MP zAoh1;PhTq^6~Xp?0~JRj@;qMUW%x_U2qu8sBYd;|y?Dn_EoG~IBe!{UWzF@uUEuoM zLAIM%ehXTVSPYOz^i zmp{ba0vk^6KG0wvvM&6HF#LXo({_{N`oFLo9Pbz4wQ6cy2FNLZUH>rPQzgv&@}fcl zV8{Ofh_Q2{rUx>!+y3{Cnc-nyO&V0)!WWHs0O)AM=-zA#mmjdR{!0)d*rcPqIr~ul zaLRx|H5+Z3A2?jpuKR4Dm&P804kiz6qGNFh?XOH-n^E`B0)VjK9SvuxM*VabIDWv~*ZVv8!{$kx4zmOIDVe@7aeRYya4&=<;biS7Ry)KZsFHng8-r2kO;|0jY_lHNb?#*3v+Sct4iBueGIh!RN5Bg?Z9&Q9sf~CgZP%hgF}??biAM7TiZL@QL}k_UF6W*VIuxU z>Aklpe5l_ni8p}9_3d{M;;iJVjQ=FK$vhtGW|F(XJic>Q+By+5Zz_%L{T@W#yZGzp zpi}+WcLxtpUi*jOZcplp_=rLzu=sYw| zSJL}$!DkNxle>b9dF4bC`W>87KzFktw^R!`*Hp=@Wl2m>Q zS?fQIKeV-iJuI!3v;{SR(l~Ttzheo+;mwyxJIO8+aeq8mTpE5)kuXlj07Dx;vuoV%P~Bsy-I`WgNeMa1KptkaR+e9PR3) zR!z`;=@3U2bL?TZzmESRq7eq1GqG>uPkSsyu_d$oA45jRe-8hq9xa2BoiyRq@SvKZ zozVTlx1krd*9s|7zp2q&`Thf9w7oy$UzUl3_JQ-sD}nM3X{6;B-IuXc7sgU-{{>QA zQb`r|CeP}E3L9IgZ8HIn`#*uS{acHZqsw+w80s=snCFcFG?5ft?u>1u5}Fm5Z^}-S zZZJ129dzZz6w-_`Lbq zm;YY>ZB#C?NsEGI?56cD9?-^j_#uW|?DxDlwIFN*=7HzCkOO@YlLbphT7IA+rivV5 z#L>8>1a1~oP_NKR2WF+SpD^Nv{I&tI<)BP(h@54XtSwE}q?*#yF=d-|0mxcFmxWES z>QlAg+6xO18r>UAI)ltBV<4QAK8R~TGGxM@!z+jeHn1$VxWM9_tx{}egYeeq1|iMy z$PKG%vyq=Kpx9c?S)Fd{(37;xFpfB$eL431KT6f&8W?qvecT7|=Fj%pkXl)S)OC~X zsz5F~3Q)HGOK)O)W6+;x$g^xE4d6onNPC$=O=UY0)HB=mQ;5L!JLJDz{yXvSjmMvs zDdy!FwHa0*{IOOUS*d>p!&}wOI?T?IKeXCWB^rKamqfFv)j%Hmt9P6S4g1;{bcoq-q4fBKJTXrA2;3?waz^yPJe_B^clfUVlk}nnH zf06tjCI1)5|IPCMko>NUY{%ohjAT{t8%U1JTDUN(J)s*XXteA3hKwIIn43+aIupW@clWW2W|7ZA@1z;@ru!?!# zhFqnI5K(KatoJ9?zyfRiNm(2Yj$(GUx_XqQHKkoS{eLDIFZ<%@yu~#ie95VE>^Du>-fe0Y?jhKQg1RKZOo{7?3-O5R98Dg@mCUgJF zi2&rU0B^4PZyrnR6v-f56I*5vlRg~3(Ib<6#E&rIN*LG4=#izq(ZbGW4=QrUyr0AE zl=eb?Xbk=f0$3~n;Y0xTG`(Lz9r9QcI4u&F`fLw-t+G;MEi&O;#k4)FB_o5FM~l!o z(@tq6G_|Ed7I}>J^VSN*m*sSI!X{hx)4KA=;%t{US9s8k%ZbDtoFhUMmR;Tmu9Y*v zFkA{bgPzv%p+K%w=q^+A%4#?R3l+LCS_f&Nom_?$@CyKJZ+8&d-kuUyFc%ERFb(m= zA`wYbQjz$paR$s^s%K8#=+|-DLidUnF+uoYc0(5Bag=%lE_+zgH%zzBj@VY`%j9Un zm{1cYPKF`h8OQA=lhy*oS%ndRZN?k~JW0Q7Fgd=VxyBx5NdH92BF-w3|4YW%RUrb{ zqYdk`u5Q5z7}n8Dg=x|BmXMJOfGJMT$qe=pHVindi_5mQMx&h6&|wE zXXX$OM~qZ4SEpu~9bC=3{;7z+{3|e%O~{U9=>kNpJ7wI(H1d2Bz@(@aTSwhQZY_Kd z+_3e09^zklGsI#`CrgREJ*xj|gm&Scn7GeT=(NtH9Mn%IOCv?x%p*JKvbNiWjps$s zm(GNZyIMX7SAhe4dzeLmumh_tDNg!iz>kC2Ytkv7rdu1?LE>mnLUSMum$x6e;VgnM zXcHSgZ(DFlx0Tt*tlo%nrD!ie_#Gkq!28(_QR7zD2tkqK&9nk|QKp$*pzYdxd z%YS$nK?7Hjg$SPUmq1pGnFzf9?;;DSYT(i|7{fugc{AkjzSKOx$IEmv=U z3Of!VVpo&&K0rUbV8LSC;kM09n88tPGUr(B3$1Y~ciQ^!GM$6Xb&#==)#V!@KF7qO>!eFy*`zVc4_7e8rTfzZBB8J2JTw zGn0|i!M|=#8bcCJ$aKsh0~7DpP}j2?{U~-+#nR+kao-Ue ziUBqV0L%&j93BIZn`@eq0cM-D8(_n>F;&=$DC%h|^jAIYh3(^YA5(8D_ z?M6qAN6@w(9nCc(0d{p*9qj~WUVA&7JMN+nIS)Otq4JOYTJ@gxVQfOjNZFariz}k) zbo^JCnXaCPGtHNRf_0v_btcgH)8@_WfwQIae*glbOwQR8->$A>Yo2H z#08}`cpPBJIMAGt4E+Hb0V)sop$>*pj9a7p8O1Ac6U|9MFU96?Zx2nzO zIRfa!8sQO0^H}5?wyw?w&>m(`{~|yg8SI9;_?WA>{nI3eh{7}HI|Ae_#~&7kz!l4^}aR%ddWo-x)55GmcD3w!<-Nl4TtAs)ty>|wl)u~JvPXj-=I zl5DGa*>*@^Q@SymqZ=!M+;`?7sPRavBXts5&S`)vGpaVZuE+Ih3&HUPHC*P0wEg88 zb0_KKVlpfrzX~iF$hiJ*;nX!u+1v4d2miR1$UTi%g<#vo-^`ho`v^M`tQE2&=mO7} zu8OjG#*7N0hT|RwW1gcahFM3BTU!IEn>1pAl%1 z!@BdU00=Q0p-@I8cNeg!h3%{-OK z&w3Y8WWq(3>2}YA;4C0*4l#?edfrPW%{SfG351yw3M0#`pM+N@2Rh1S8>!_t!8!@< z37d;!J&4uB+oMx$<~VH7qWW*5H+iv=`Cpsnj5QhKrC!Q2d>)$Xfp&ODIkK@GWYFQn zjSKG}W@^zeU-uW!~?RtFSdlEil%GR92% zD-a?&?KiCk*D-Y#TwTn>oGA@#4D>kq_5X;!f~-MEDawRH54*{w9sZx9*|ld_6xfe6 z(`!AQs1vJ!(}R((*^K0Fn2da5Iz6^M5t_CfnYptdMvyTuFo_m&1W$KCFaeJo*7D{7 z-IR;A*eDknueMvCx=P2ZXhW_A7S9QsAB=Ovfmi{%Ab^QOVHXB4aVYGf045H=rrN#U zg)DryIqo@ycv2n?lnImCKO=G8S-`OSg3FUik79tRhm^7-p9DvB_mo}_;S)wK4dJ~d z>stZ7_Zr!qLv|VOT)uGJjL}mM@3V(52Gzi1$Y2kzqf@pMY;QfczZixgC*g`nnfqpW z7Ayy>9Au`A$VFhr+k^YN5E%DA4lg=t7Fyh23lFMysAwGpE<4oR=@QX2GbyU7S|?|j z>6n}FJ`F}#^l6oO2Vk!19pwR)ELqBA4>Khb7UdfsO$)JTl&H?d^pv8RgB==ZqM3u? zu3^Hiwft8U=vu-gAU`tl z=`eho+k$YyBmm)8gyBbr;e<&5+Msspa4?^O^5n*b^u(Ao4(DWxw!8d=%TJK`3o0uWi>tm)Pq=-K;3 z&&q#CY;AVT?eqTuSIX_4i*0U5L_5P$n};|EpL9@c#|abR5m@#7$Oj!;SmzIrSXh>b*mso3t^B z7yhnZO66nAO>Usxfbi1Sn6R%96Z$A85IPgBxT5}8SW5EJYSCi6l}fIQOoHF_pa>aJ zc)(P8o&@QPA^J^#4y>YTa>{_aL^GcV&)q;Mv6oO5dNFm){bXlbpU$?B&cc34m$x2u z3KfWJ!&rdA8JJ*y)#>-)$Asuz#O7TNv^Kr^d0+wHQ!M;R-nGa2?*TJC+1URraq`?| zN8w_)gB#g+FzpkpzUX{)=)4a?6Oz#~o=?cmmP(yy*dx=`5-gNt)2+dBiODz4b9Icc zQ?>O+j-y6jgXLUKVYH7oReCw|jZ@Q_I}}usfrA0h;O3{@@YWOED6of-0h$eiY$DNG zpd6Cple%DL#e(uGa7|MJfnv^svyYm6TU<6M6LQ;(Zbs4;p)Fpz3p%2wqjg75`U9=| zds|<6H8`)Dl6y_ILfNPZlcUCh$w68c!9+-{Or(&^Mq7lbnGemkPz9~6!2>(utiWdB z3QKgKV&S^pC3uzYfkgO5z-Qnt9|KMGE`ux8+W!#{kBRj!#VgaUx29;-$+SzY#Jyal z2SA(9s@b0Cp36-1)`1+OI#y4Xy;e|WW11Jhvx?#+YTl}9-Yz%T$?bLBv%ZdYU27%| z(AC$>c3d@uaH*Q{!Y6<*KCV?Wk#tc6TJ>wHWAypA&sdrI?+^RF>bs|w+-_(g6fDi10827fUsL0??yC+ zftk*Z0tbG$X1=3(PN{QDSLax42vD)p9k@lFGVLal#&mlWG2?v_nG0NvH9aOhR^#k| zes+LVlQa8EU7h0sIWD0b5^`*Xm5C(=smU z9B(jv3=mT3@fqJnZe%(;3+ztPUd34je4;O`V(!cX_317L^M8->c@CCz_FTD4{rW~@hJBPq(RM!5}^NX3GF3H ze@B+CWl5LbrHi^(%H9qa^|G`JT^v4^7ShFhDIH4}Q`aS9imtUBIdrY%_(0bI`eseB zo<#i9*nW5$(9)VY!ytg8&KW)n%?;NZb`P6pTnS-@{W{n(`zd!uHV^A=xX~CJ2mJFx zo-!>ok`d1gvtrR~3f+&L4Pu zhat2>xQ79XlR>d^&TxA`FAfPCz9WE%Lt%FYFmWjCt^g(ug?&4Ki9=!c5(eA23LSQr zcN@h(+}{u2bVT6aA)ILv2Y7HzeiGi(S+>L9MQ{o?!JW(|f@+w_!xw{+Gi{tNaL?^j zgjR?OU_if((0^~s>4_Sl_k{j#L*I%RtMR*a@yFq>5H&)-t4^$@ z)F~-1lqugR$^Vm*>>asJ5b#YXaZI-}6TJJika>1!A@U>7IAh*D-RLCoy`}M44wG_I z{WkEAyBJ^5+Q)ki!68&e0qu=;IFbAH###9R?fZGB)dNPa80YSYb34Ro;!3$DE@+~O z>*t6ogi2had~(6ebrV*8w#K!{mJjcY{D7$*xnI&g+xFU#6z?S?!)&{BF4_ve!{jI0 zZ4>VpfmHot>-^*D{OLOX_&R@Qoxe-`%j}cJTBQpig63>Dpx%#FxJ&JmMhoRRr>BWU z`|SOZhy2B|MU*$jc^NR#-q6d^Nv(JCv7SM8gc$VDjA7&f=11ug#GD@s>miKa9P^f; z8}x{E;~2X}yq<`7)_L|QfuVG)OKvEitZi5a|*MXz`mqp2jqeR)2JF0t6F{&AbLLH?-l?4VR`p4Y0oiFr`x%y-p{oRn7>@F z-yS-OoS?2~K}`gDYAo)pV11Yb4~|sDHRqUb!egWIIA|z&-xVvl6iHbt!USfwvO#M0mKSDp;1@X;99 zE`2EjmQohaVVbi8>$p}8Q36|Rcf2pM&bvKB3z%LmhW#54+flx0OUXA2k8jpnzV|b4 zq(l72nfIyY%_TVEU1;8)Ht#Q+H>X+*zrnn*FCqS4nfGhv{S&-fjr%UV3$NqPUdf@D z)@6GGHmqB`2bnGQh6CvSp}L=<`={!Dn(l|y{S4iYsQWOwf28jF>Hdkjp=mANqw2=+ zrNw(p-Othegt{SGi}$3ue@gc=>MqlLpSqu*`+2&x-q{--Bjg7fnxp$?;$At0?iUqK zo$+2!_v3UwPIoDOhfzXPaP4TM%PY}=nZ3^Gc2}48JEEF7@$c2my2x^zf$}$(tzIf> z&?Saw<#}EBfQ#dI;DudhH((*{0BKoUXM$E2FJq0gv4GZby+3H2S{J%-mMoCL!RcGe z!Z9_>p#Rj#sDS-Ph7vb#cVT}}iMdzCX~K@cZB<-1=05|PkVItTeYuN(Hye0U!g;*Z z%yN#^)Gc3#G~wHB{?j1#{{c@dj!EWQ@HO^ZdWk9$tK+DNR`0IbpP;|&@?O()pbmy^ zju*IWvlHSke-z_=-Yq_ac@sXDw1lr%Z#;1~)c1-kV^yfqvMXJo&jQoXj@RkG@0o zVP}?wENgA1Oi@Ti43p<^sr$Qt)-Fx&f*r|BsG%uR>_;MN<#JLt>%Ynp)B9xxSq?D0 z@&5_f=En@PtTA(gF+-R48Ix}2HFtD&WnNE{!nG^YnXyh~8@z%{_TVmWi$DLfLK)`q zJDSHqnZ2KUPBLY7gqGQnT4qN@%Isv8S)S}Zr-CRyl+C-!uMhpifsm`fyfk`Um*l@7 z$#H)b{$+hJ?wUl9vBR_Q)e>GId$U)`vW=DbU%HFLh^M<9DYWnW=rKU!r!MrA)X zBD+u7x1;RaAmiMCPlJr;@tVuX0Fz(*Vx#^_E-oZr%Q0x_Eu0lt z%Q0zb=uXU1*#(!5rR#@ueT=RL>AH}vhv>SJt{=grbJrBk`=@X*ARmnNF`JgT*~3J@ zJn0d>IUf=SqQ64t0Z`T$ItejLD{TPF@T+n{srQETAo*xgvdjhW-hmo}x6Bdi=7b+X z6UKO&+N-0yW8U$^u&ll4-WeRn*|G9u&0om*XdtIJASYmt1u$^{c8Hn7WWB8@S=O5t z(CZurG>-=~;s6cn2gfb*PfF)VP%Xu0=wjN5t^=S$ybY3&FRS8F{SW330x?u~pgx)T$H#dw1YdA7wzeoWT0 zLEc?_9|D}xBjBg2G&oT$t4dDksSuWTWEop;8t3pF4UL?=7RhgO(!TR{_~%1r?637thZ{FqXYk^kZ##oU`*_;}7EYSSd6Tv6 z?*icLmodiP6^?!yx4H1VzXsLSMO(Xn0KvA8wN~Eo#nCG+^THPiut+<;HRSdeJk=d@Lp(Hq(LZ#4AtYvSLdF8)0kKT#v}dkg)GhJFjyaflkB z-$&?wVd%GD9gCkp=aA$j}v8r+^HxPl?L z|ER&uHo+AP!To0-mpD|ezY@l^kRts1Bk%Y<0#s(IPkb)dlQLqt2oUv448cmdyRZ@= z!kd+dim;J32>JAT^2GZOe8ZlSZ)q5KM*uytEFopqYVCn24v;c?ooE^(bH^SgK>7-N zWtu~3ZxFra09$f<&7ToA%$`>mZ0z2G{9A+PHZR)-b9g15}u^4rEA7lnj(on>>x07g!w!!<`!><82O;R#l z+I`U(0+D3eu#l*qJBu(-2-CP*he$xbBfTc_iZPMqdUFabQ=x$N1kn{(x=;;Z_RJE- z0BVUy!M^K3(0q{T_bve}nhO#M3}peX2zQl0KO|dT$Tor!C{zXT7XgX}JfyMLu(VYj zj-t^1Nnn>EdM`)r5!=;l>gUMkLwI0{2Crd{kSLoziUE)Q!2k z9ZfP91T@JiZX52nWrCxXrA2dxbsgoyRJx+9C`^v?W=D#I<;ya=1@D8U%sz`m!z77g z0(a8Tf&|`U&9figN8{lDjPJlLTbR70m{}LcZDY&9V-?rF^nTe%3Xx3qJ^*25Y?1LU z2AT$KAaa?VgrSxdI9|u`G2meF^`@YZ+;vwYRgv=1H1QtJ6Ce@{bIrGM#lp(YwRLGc ztVR?Mru&m@Zw0s_DnBo;(P$Wq(4Ye!L{8X(kh^LT3`+#inQ zUoJU^V{rX8fQuT=1toz?eDlBy0!_Fmf2^15G!YdsaB(+Ia zoAmZrN1=f_B$D2sft8jrJ4j8jz4N7f&%i(Kt3OvfY)Emx$om*xx+{oD8`%1iwR5me zF=8PL=X8O{?J53{FXZS{ybJe=r>%ILyvG!m$~#>=6z{^d_={vN%$|4wk=*^2x#WK2 zM@NBzBrt-%35(Qn>kZroAS*kh+evr_(hWh9DhR)RWcw!~5l_nE>W8>WFSFmR!?-pu zgwq3I)aim6XP6`%X{fRm-StpK9Mo71PRQ~wBO0!w(x%Z*`@S%ps=E)riy9pI|$_d!T8(mJFv;dyB*>sRJsHtIh15* z=u+|e(mH~Dlr+1lzr2-f*O1Q9<~*H2kyc-@UX4;MzpQ?DYy^pg%Hi2Ra}); zYdOiT4YEr8VTgNDyG+6qO_Owpq+)Vn9hqoKG1&e7n#Tz_b9C6|@|fZykI`Ts#*CFlEe8#)iWE2TMRNAm zAZ9b~)fQXhY`1Pk`VW7vd}S+kBp&7^-+{ZZ1Rmz=4N)C_0?F3?4wpSp+f+Rdhsf&~ zR->8(l$Ro?HXGNfYR123w4x!`0=--g31DM3x?WN=vm%QoGb~ce9ov z(C0hB@~F*~35O8{_98CEA5F`IT_?-rrf8Wki)FHa6qz!STt9{d!qTbHY68l~))fdx zaUZWMkWuuyP40I)dUIt#=~x!ErSJqxLE8mnd{wTvN>i8dA7RFij*a0^IPN>PX|5xg z=nMC^W!FWvqj3BSNnDM)!b%U2gsqK^t;fk8HS!kSgN}jNHpsxMl)MM1a^=E)b>aQH z5g=NvsNFy{m%m9BY2dYE$g2gU(LqJFu`3Vzw|T%lhI%6dw_dqoO_Mb}GV9fooifo% zX{gu^Vr0R&*X%#)94U{z%dCuZ@`&Gw1#XVbA3!|(VWoldbC}k0ChnNKPAM@b);TK|DVk+~~tXE>@+kNWoG2UF#OkV?khj*#q<;Db#vBuG(m@<8j z$(TV`-tAUz9Z3)?%OCUNmGJ5f7n6m?d?f6X06SuSp>yCoY+7_Nfb02soK5^|xE?=k zQFif%z?AuPAX6muxC|bc_Zb9ClNk-F>FQ>$cQR=PJM5T_Tm3WPBx zg)#d^uAGgAi8AKq6de~`AszDZ7xr--c-S-)rr^)+l@#UeiRPV48HaMTOJ575F>+Mr z%$h$X96m-Qav2}yp)8!dooiPIV)&br>!@y9aJHJnBUzZu_v9x)hgaNNli-?ZAI^Sf z{q=|-I8(k{S5PL&3W{^2=D&YAlW#4tCrP}JL-emp^e+!PB(1|dDr>6lH$Z?{Kj!*I z)hQW{;E|8qqe=S#jrJX414Cs+lOkMMBo!*ZotpWyVd(5v8n&y)8%bY+Jo#>=Yh)hPlg}tzoKC1 zbi$ege#bMt;dY&^U5f5LbTT^GazNX{?S?k7Z0EQBVy%uFFJEhTF;48Eq2ZRj!!1si z$azC^Id3$)7gdFewU)0JDDOOGIe(P05BJ*KXKRaNUlQHN$~({xwcBe5#YfdXkKOx} z8{g>{)pAza6Y6M>-vU~saT5ht?Z|4QEOnM{MolPx6x6W1s0|@6_NnTl*CZ!QE7Y+id+=Fa-DA8r){< z&w?Siu>X$8+e`+*5M28`aRozgof_O`@(PCF;+~<149(;f48e`n;5L(2Fa)=?2Dces z!Ql6#hh5;BRn%UnPKADjLLpJsaq>FIc7ktCg9DoITWXnZ=I}ps3 z)f1q91KPg9w;aAe-?_(jBK#Gi0vOPrDD-0t{Yf?SC)d%hAU#nd^d|}ZSVQjz^b_)k z|CBoVQ%O(M2>r=IKhDsX0{SfJ%XRcCNl(-W{R*KUZ|GMA^kVCMS{?nzNKe!Vy)X1> zLw|Y={TX%it4UAP2>mHS-)ZQFYv|Y1(N{=MRM2A|pa(8f-lf6s!yK2k?*wA$egd(8 z(^bV8nL!wJfIzUI-gMK+{TZ%pp9)$2yZsrmL97{N%yvA`kCLP>iva4^$=K_z>Q_@+ zdZI!&tYOn76qJ?xN_g`ZZdb6KK!?vJ058^VyjXGZVx7c`%?@6yb$GFH!;AIG9+`%J zsSozZl@6S2Ol`>}$syZ|RwAaUxBNTPZ`d-7DkE*)?*W2c0>=;-sQekeuwUmmVlv<> ziFYqLKHTTy!rvuBAlDy3d3t{kmS()Jd{+_wkDKGW(1JaLbsF#-za6G=-WSk64eSWs zxIUTY(6;{=CDBmVUyGRhv+!qbdM1s3HvF@nbJpyQbbH(h)q$?#k7MY!LGP@=dTPu& zClWTEVUJ4KT!wu-64u4A?@HJp!_JL_jbYf`61FG9S|edL!|s)^Js5UgBrL|T`y^~W z!?=qc$mufdAqm@^VYCnk!V(PofrQ~A{g}ty{~#>Iupdg;UJN@w5|&}u!xFZDVHZTg zuqEmGPe~Z=(^TCwJckLWP-7i`YoG;D(e2+v62B(`rrUo)z>^7#fi43)4Cj$>SL^LrAyJ&s?BQYi-FU|)pO%p@QGe$JkKS+0Xo~i4gXrQ z;`DDqpWM4!wE=L-ODEv8AxvDa?cw+Trb){<9T(hPCw|@F653vzeLe!nUH;8r0xRZt zBFS^3-kX$=ZIg_FX&j5jvYHkJ9AP_8;_Q=tlFcJ*1HCw}fVf^)8m93RNaN|XY5f12 zFx&qPV)MW9pC!+^#ea0H=>{b7I{Ul;v?AqWQ@MHW)FkitJYE!F{S*~=|+`0yjq%N&ZFbqg{P zpY{}fB=e7AJnRWtH+3`6Uc=FbR+K{|uA_lr4-?9LT@Fy9akU64+yA?f^M7#UXr#^5`647JyAY@&5XV>?!2Ba~~b9L_{zvjsJb4M`(@nWLPuZqwL= zA?f^&gs~xQ47G>Z+xK&8!tswsD89wWx`l)Jj%-+CqmBF4CPq#I5rE~06ax5?S-i{> z$Dnm2hqJhUi!vh{|D$1qu5Rqw!yMGe_t_l(IE3m5$h!!<RvE91q|IWxdCq-}k{n49}k$ zdw0|u>J-jBNdw7s6&`{Lm0+wXbPb3}K}&&+ZPoJ8fL19J$y<}1EKg?)KJhN;lLRX$ zE~(K(mKG*8MBW{cfHLTTpivX_Ob(yfvSwj}az}B$T z`|E=Sjl1bLi%xO8uieK7D4YLxL}CvUN)6@|A*xd?f=Zp@z-PR{_c(JvO%Yxsk)ssj z?M>a^lsGsi&~8ZM_@~4{Xa{tL(}-vsj-ZBd;5-KLJr%1u-Z#PP!&nwvEJ8I`8OE}H1u1N5DxCOW7A09mPiQgjN=eACj`-y z#057@3911JJkApki7+FH{|+NbZ0f#UBH;``dqIulUlIwSav1|>4be!Ff*VGHPp*@| z<75Jn2s4uSZvl$4{-$x|m^)}(G1xVYD_6lBpZ-n|YvbAiUl*_a6>TM*<8Km?SP8Xy zDjlJnZ9(mPmpEI{NtW43w%g@r*lVQz%*x8j$e9j5N6+bvNDSGp*^Ae*6s=C^O5DQS7%d zx94JyncG)5ZKq$Mz`=dEoa;ND1s3pgeUU~WYuFFUb-ftz_p-2bl#lf*e;g_~#-rG> z(l5K%I@I3?^MBKq#w_lRRHQHM1$(q86cr;2|6=Gu1aA_+BZ9|aJLhm5xmV|KuA&QH zt`WrHuMkyaReSm~g`Puu(sOiQrC(P^e+lV{8lhh+^c?<^ehchqi5j6lOXxX8AU$UZ z)%cs*5fe2+f40zb8bSIkup=fa=rO-uNEhea;y_*o^Wt-aC#Ol|d2WqNm)7OUCzvNh zjmY$Iq36_%^qjp_)0C{EPm!Le5&Cn5p3^(hbB0%?|70EgWuzx+g#J9C=M<3ioCQ|t zKUGJ+p7cbG(4Q~#oPLp>Gq5WC<#qI*COuI>k33yO7xPpc$Wy@f4PfE`Y?YZnkBCZeJ{E;53tIU?W^DTeiYL z59OCNMWRZ%XnV0v=s6W7{T8e#5;a19iO_SpN_vjaB>vIY6p0$4zf|Zsr6v6qtSJ&T zLXYdhFh}8>mh@Y&CP>r>Jw~6P=e(EnTd*cc)Cm1$LeIG|>9=4_k*J`D{&41O^ryOB zNFaj4^8J+XM-L<i!stUv@dy&X9mbW2V;82&5^@F1jRdAXra%?(Xq^6irIL8DIu11mA&Rz;CTO{u? zd9yP`zKCHFXVrAyig)nPU$~KytoaDocrN<=h}mMQz|HYUSZ?b<7Jx!FWqt~$SPftV zUNvlN5qrc`L8dp#H^$Whb+%TWjLrKz@;U|EKx4U>Z{Q8X!K5)9L{7+A1ACYz;r*9F zlvtmb5@b8%vai@g@%5-xrJ{8tvxB=(=wT+&*w%P5aZ@w8nD;2gLH&co$&E|L)|H_b zYHkAKbR~+Qw|b8gU6#s#-Wst2!LD<%L4ISnVnk>AggwBXC9&3?C1YYeOS~^gOT;zW zvmn9cqSH$u>7^&&7`7Dh&`It|TYdg>{M|Kg$$Z++*uzIKF&c~;UFUMS!5$`^0@a;~ zdwWqM>|tta!?LyrPVhlJ3lvEMl{klkpZxHGuB9)Bbfe_0As#(% z6Op{V^aRa;q3jU9<{)i{$g5ynn|39#1y^etf9ql)PPeMnPqxA=4}{lZ!j}ZKobX*C zmZgInV8}dLH*lMIUltuK0;pRH0K1~G?4oo-`1)dompR6Vq||YxEZdKG0*4vh*{{Z3 z^xw2Nh}am6wcZBkGvwqY^7}PcuH=2 z$Li}CytcnCo3}F=ZxP)6M-wUIEr)x$JuJ#7X%3AWOwKZO>+ykj3CwycfDbOEd%3zm z>y{ut1#jJ6><+57C5XV7N|g4yFCg$1qcd2S$A`8fn5-+iqSgH{_;29a5z1v(yU+U| z{j}*5{{-=?^*#HriPq`J&(DT=hf}4Jdu{PB_ppW_xy5(jX6{AZfgiIotAHK$npR+a zdm^{Z{QW?Jj}_1N`0i&blL)?ryAD}g@g;d5R{R#;g~fujwD?N_t|)#--owRJ3@joL7CXqC{sVFMBQB-T zCKAKrM31)saJ5HUc|EeO!|k67qQIo>KQ!wPt?BE!%d8Zw9vsM~3P0KeF|-n)&!sll zJqBYn7piP;2vR}5jOb9|bHw*P1X$tHMp7xoiE^opmS|s*s;}@H5NANZ%3A_*u-+2A?VPop^*yY+eJ<3)hB}Pn zCZdIW2X1Oz)E)S7EYT_)h`*Yug&VjQ&gU=#pL`W9jQ9UceCCVH&p>S-!t)#Rd>8M+ z%lN}*nTHl|RRJx#bqXH#eSAlsW-uIG#5rio+6NB|0Od{hdp!`e_z3U{7>FVErSoZ~ z7SHWpyc-%OGpG3u+<~9(;9=M&@Dx6eznU^Yeea+DIiSY-AK-t` z+e`u?wsNdl=3$=|R&g9~vF^dc%`m>BPcztD;G7FwKC>h405;mY@NFQY_L{1_w79eS zi+6)j;Y#tWD6%e6`MyTr1pt~V-4*SzxO4Cz&Wu3GaDYsDu7=^iHv%m*JxByU6R84v z3aJM%Y3-3yNamzWN7IusI4PD&MvkQ<^;il7-Xx#alJBS1)fu_A{k>{U3e%qhph;49 z@cpY(VJH)Jdp&HVBK&Hlw zFd$$hH6{|pdv$|SZyv6#oTjtZ^U}F?9Sr2QH;s$;36?49()+A`LWRFDdR@8%!L3L+ z-+?>u^Bp`4I~Pyk0{m@JUBZTmmB2IIJTNJ$)}?FU!RDykaK(4@;b<`Gr+YU%zXNq4k&Xv9$9#hW4m&a8ogOV;9B-+H?U7@63Eke>v*cJro#(52glRS zBIrE++m5idTMPz}z15mD_CKykbpyyi?M)53r&@!))lgjuUv2=I8gxNJ4cdYMB#K1m zJ`;7WBf|&IeR_2+Bw0`YB=t*fvkywhk#3M%{G73jFm|UW(vfq7u}Y7Lcq^sf*50$n z4A5(Ehk|ZjXTUmy*OM|vM%tX8$_Vib=aGktr)C}r?c~KnkpTtfk1~8WV}DMf{=+FG z`(5VK&r~{1#~??R(1(3EjLFiib9_utYlaCp32>vzBi}egV7O!`3mdXhp$Hi)-E_{% zT3%y@5dK}FK(PQ%21eMb^wbM`^W{_XjnOBHWN z(*kJmQ+RLpOcED$-XoB0ig(ES@Zua`Zg-a^3s*z!bR+&!m!*W+W{kUZU*JA6LRBEzxGeC8w^Q;XLaNRi`^!i6YT zfM*sjR`B7)GYBpzcv(PpOmSBYUsl|k;Rk8>isCE-aKXoR6&O^f+IR=1 zM&cR^x5|*ncE-i7$awL+SV)V{_9k#=;1P7Hjzw_XbbR1oj+s;!3o|HGpch95dQrL( zE*PwBk7M(4aa3e=C5QxH5YR~6_QD=)t)L64Us;(t2Qh3@6DFhYAgG-|syx}D_0Hhi z7-&;tF!yZQYiX;<|7hstRnc}ts~tx7d(Hni@Z$Yk?1|^L z8(P46%hr_I#dp0sfQ|Mh-DuBfG=-x;6wfU#V!(>`(L)PpE=L7x_QZ3i7pEhvz!U}= zDC?!}AnUPdwFWX!*1Xs&6xyh_MpvVCtKBTR$a)%t8lt9{T36vTGie=M6d@}61zki09!of$|~smbv+0yM{W zxVRy)r%4%T#?~eY*%@Y=$&H0X*42u+4aHN~4xrI9s6%K!f-V5Ms(I0E9SSY`a+AE6 zYVM`kW{}-Xtz5jpMfNh|vX@z4H*CA!ao{WkgAED|_m%-v(9xLvK(Ia^tr_)&WDhSx zdoJJSRi{oEywNu&{XNmxwkHO*r4aSAi}r#{X&b;O4YM&3sinDrqKdj?%S5f!+wIOW4QB#DiQK@T^roBP zTN?V|XicW-*hK3u7>QonM921@&mj@&(R>cw+kbfKhkD1;(}geBbHdg!r?&}AA`g^zM{zg23;PQqH>ovm2D#7^XzO8c zV>6EZU9AX(-4#nV$abMyGnpef?o(1FwPlf5vu$^ zgl=~k_Q^DB46)8|3O=b&O49L|Ak7Lckn2j096?Za?RELUmN1_4bU8!G^^jg^s|QUx z8*k_|P4k?Hw)hQwVMjH)BKef_Os5yJugS(HQPs2&?B(nUNm+`<@c9zTC|OF~@0&Hp zx*X&EudwWNL=Y{aaM8m%id@tp3fV#F;+i|rNuKL{88uHwe$t_fB~&)JAG6)f%^Exn zxo1WUG+fHg<$R_25Q1x0Gm0FPj~;$paoT3X7ewyo>~JOw-W*~_mOndV$^Ly2kdBpp zj_m34--cB~KPT+zSZZ$;sZe5JZ!bM9Szh%r@QvHaIU(+T|gm#Ob7_D5WWCUIqrrq8#7m z-GB*lXM4ImD=lEUEfAC)Z@Rr_P;=noAch91BRLQeWOHbfu$1zE!)5Nl*AYoV4yw4` zbx2rlR(S(n-dC8&C(!01#~ubwvj3y_Z(zz#3pV6fhnBbISclOC@BgYCH=Yh&on!3M zKZ8W2J2czIM6)fTY*StXh3dsvPcHf5SR*|)5K;3eWY-{PB#$N|@!artCJp`tJQ8wF z6Gm=u9?8b%5gU>{E}HCdL9)NfWMc$~jMQYKx!?Ckfwqj(WT!_6?$(kHh_G~0VP``>`)$Iw9LY@#5a*t3~+sr66lv$@_Ha>H0ELHO@gP^eNmYF-Y zOe~;;IZfEvv5mXM=^t>6`%R~R$Cz=y65Dw~tGIE7#rqo7_Hhtnpwl^PjP*FU{2%+f zn$d!tRjW9$+r^BHIc!EA(Y`n@dnq`ivj^ph_LW$niUWqBmrhZO51X1%gY_Q0wG1bW zA*YH*+q2Ys4)7BF9BOhfxDoHdo8svx-X!mQ@n8afg}<5s6$f`_O>T#;s!?)H;vCbB zdp`7}ZcJZT*|2`$4je_8*=Ok2CFyAX%p9CYgn(^!NEp{5Y}HAFITo6*_3m{>JO z&@tLCIPt0}y27IXp?uL*p5~}UIL@vN%QjD$C!IdX*hAnQAWtT-tBaN$DY8gGHrOanPWCGQz7-r3Zw!r& zC2r~3e{NwkRccsY`wXFrwI9{33 zE=ydHb@xzKyEGiSwNBK^^Wc9c&zX(#C`jZHrXmkrkms&Y2D|jv(A`X)AN^PIyxEvP z1|;$bQ;~-*$g{(vL0Q_R!$Nme9`?KZ*&gqoQ|;ATFB+`pyL7AA8v>#>He!Y@-&0bH zbpJ@$lIkXeZf|*;xZ6Y>PNDAKsLC%_8`xfjwOLl1d|Ku9aS=@_5Rb0p2ehG6BGAqP(Zi+JR5vc<~nAfv4fBdhb z{bx7GwH(g!__MtP;;@HTfTJmA=8OXLltfpBfwuQ2q|B5v<2U6@r~eJ%%(#|tx$VQk zk|DWa`BE$w znRg{}#gGpep=xYH6g?)NYpNkC>>PHV&}-Cf!{_o@oqwlxuo|Qq=h!Si+}nW`s<{P!_K12zcyCW4~OvNg<@jxC7) z+4qS5meJ$CwITi}Gsb@e#z`jC@-1BWq=2h=x%vDBy_PxDiQm-?w5v*AEsH9w%JYyQ zw;cKOZJ5uUvoh8r$lq_U9%9-}6~xWYZ=givR_<{vxLA`O%<@zHA7SZF=8Ag^DW64xlH6IVBM5TD=WEWT&b+4O>Ah7#u{O4kJn{*w}E%0 zVUC~&YvSW9^jh+BYBVR8*0M0|1Z#sfd)^4r>SUZtPwdeu5Zo zh~!^1$2bOk&m6NoW{?<2AG3g}Wh}6yUxWZ!R$36yZI##eDkx+Yk&|qdHP8C;^PhH5gMSF{83%aJZ_Zm)*O8B3@<655d3+OcTH6p- z{G42B`4Nksx{~k1$F(>+ycm>})Mo8^&3stz_PvE=JbWRN8MzmDN{eN~n3GW43;e~= z?ghTJj`nz{#>)4g#rX5%VCyf(u%3Az_)n_y^9tr@_)_C1FreYoAd16J+R%THJq&wy z3=+QsfiRxF03O2G=Y%>WDE@beq3Hhi;5OG{a6oUMcLQoTu$&M#+4*a5V+MKl%^I|x zMLB;<@`6DFTz}180-Gp&BG?{2AE0Z>_kasp(U4TXVNvz__Xd%VTtsON>WEz2A$Fmy z;L7!l*;uH1Zr{ttkohjnp~_yKs5J}esbpsYIm9|GFhDj#l2xB3s#hxS<# zD@?&&ifmOF5lZ9j@5{Sv3mB{1l(A+6erZqv;2oU8W ziqxyT_oQ1kNhl0`(LC^)=0Q51SM@5*ejJ}4+zWp)J~lB@+txw9^!#!8Q6z133)XFI z>s@QXo-HgMxW8__^2rviP{Dmm%P%jt#oak;oP1j5Hr9ibE4QLcWpWDJ0o5t32_kc= zUuJcieVMh*j(6!5?24&Krpv>oo{~PcG;q zk}|fr1M)ZnsH3pT^d5z{oP#`$801^Ej(;GeDn9`~z)#}ky$^tXZm8HL_X$%T?z$&2 zT$4=%$9teA&F28~PD!&gqih0k;qA}@wpeT;SQ!0v4;v)LzzGu5i0Wn)X!4gEC!*wY zQ}o@duO5A6^)*>vxj}t%FiGj+S`Ld$dwv=OvAyR+)&O=!6WEzeV8cydl_s#$o50R$ z0y`%HyWPmQ3b0@yS$iN^SQAm$zvAsz&xOom!g#S ze;7W|0K=WU^wXNsZD(xn2gr%?nW#|S_u-15;Rrr)@U18*ulaDFiRWrOJoNkry#I!0 zPpHrpcz%nAa_@t%b$GvoXJ@$S=c5Ory%!mYL~3txUt!!&QMs-}*X><}zjiyDh=`+Y zp!X9XBJDNAziuS%uzQl5C!WwXT6iR;NW*JBLyZoFJ&>Lr{3Rj=K>C8;Y&;X`G#60< zD1Ctn8px}ul_aQBI<`8-I6vTe8*3QzOj}dNSR7%Yy$8oQHsZWr)Np(jMf5*#OyG=z z_d*TFv;Q}aNgGxQKd<39>wn{zvePN=XEhvOgp$^$dW#CX%}%#@Kds><9e+$a{;;s` z1Il!4zDaj&N+s;M>&m&^PPco{|93pYc*4@pm!F1KuFkh$dTm>Ww`{#O==*MK+4}jw z9k;jM&NhAGkiB&!aDUz2`ia2(j=lB!9D}pa+4|(beWkPY_to7uYe$QX(6^<%VK3xA zgUC~bu>hivcov?vxX-S+XK(`YJno+cw{&%JpTmdDCcA*rwK6a!-T`lCWDV|jnzBr4+y#YOTnTe-X&ZT{ih+WxPLl0CcRtxP~pBrVGf`KrCoy_ zP?MHbqaNu9<1*wPsWhbR}-{n=sDkkGhIDy~7avLq@as`5_}X{Vb^yK*aS=8}t%JpUOa*Dj3&iNuB1 zDGVwkc`%Wp%s~TqsSbu~>jc!{d9WRL1@@d9IrPH~wwb5V7i;^N-yMBAw8r{0vVIK( zgh!MQZo)ZUo(2c5qO(ZOU+1hg3pr+eCo*o)k$VL>1H(q{fx07SHe}p+%($OHoM~$r z=v|BSkF0G#JD+Gj7c>TX*Rgaq;15c@8+L>;b9r#aF5MSoN@@C&&M9&K1(0|#Ak>V4 zg1Pbp>se5Jw?Ssshm_;vvQU>d_hRCd>fetEsKWLFEc#((gSCxFu|49J@^i&VOR4l@ z%KSi;4#pgR*CzY}82QWe-+c7DhX1GP`ID-izs%3^JsgxG29Zu~(EAN*nDKg#z>~+G zegK%?q3PVqgaV<;AHA7r{kiG$h~|+>ck|V8Zb&0PL(XQp9->23F=el z_}*yzgMd-8Q28&3@Fzhd{{cYzX_Djkboyg(&p^A(LK6O1xI57Ba4I^WhBx0087Ac` zWLn5Nm)zm8#)%}xz2jJ)Vl8ua*LhIqtZgmcSax?buX{I}*U08sCL6en-9G|xCqhdJ zl!N2mXVGY8=4zTJKV8k!Dn?WzcV?P7?r&r=pgc=xv9PWFdOFAv@zYpHX483RYn;~GDi~ukJ zTG~RkK81N3)G8K6Z8IQxdRyGuI)Y|{O_&jU#(bGO>%sxdq(ak-%;i6eXdUK=6r*yArdXn{0?B0+j|MR zFBQO8b#JKWOYBC?r{3>s+spFjQPKTIC7aK?6-8;bdiK|1=W8Qfzmta?dGoZPHnNc zE|kWBm~9tZTUTerFG{U)rB=CGt1|gS&>sz0+b`34wa5u< z7XBQ6Iz*Bso|vpj>A}R(H-2JNLlM?Z#PVQF{v(}b&Ap9|#r=`{rTyX>m3&hX14*Vw z*9B?4#xm!(35olIdR((mqw9aQxG-x+yBOgc;_|DDiaSGAde_QAdLP#OA3z*G1lJxSc{Phw_-9e$3=kH8$rKZfIl!tr2`^pAym1H(IGuK!z< zT{zLb710i5*ytde>{D|?c zxfGbg&%vI=7)*uf78O#6Gr8s{H}Epcs^XqM=wq{#FV2~>{3;x ziF(D9$k!7&@*`F%VJs#GDO!0Si zz6Q71H!1}~a4#qBRZeCei^OU6ElFb7{=cD4dFC7R=+ia)o6!h{;9fyo>YO+b2kr|0 z3}C_cCTU3|;RJ#`><&Gwz@~8BF>@X-<^jIoOp#$;{%6X8ZzfBjN4}X%f895e9cxeU z<1eZs+t4qCVLqL)5XDnr;V9G|CM$mtpxE@731z7eVD@+0Enhg22f<3y&ta}QrM_h5 z76}L#lDWXML;lW;tx6doLg2m#)Ehn|eVe*3CtIqvw!!$eAxRB{`Rh$Uy~Ovpj7=ai za4ItCAOa!5^uQ)i;5`wzF$5I&gbbj!@_=XwiMAIu#uCJzs=k!I+VwStuSovI^!`z{)DZqL3bV6d zniT(me0Nfa+1QU{;?@n^a*?Fb?eC(ra#^sy4?U%cKMkxwOCFrww=qiKhql>HLf5*y zE~2r&>JdAxN6=n7V#F*4Pu(e*Kq^FcjM%R@@(p@)S7K+RzEo>JjTIDif}9d`#B4&8 zrgR8m@AVeKyi)eTQ5~{~S-6jh$$1^6>??{|s7D!yjMy~Pc#JHv)k z&3gzbz@U6{9CKq0%YC08l_fqCB&DwXuWRjvRPpCvpA-#tP0g08{qdmzmYVHH70oXF zmQm>E=_8iETGofi_f2g-4MH`N&CL2M%Ki7zND_#QV+lDand`{s#^iHjF>ILev!;w` zpTf%?9z(vup0C<~I>8~T-M~y^>ltc`x67fbcwz{jrDMaLlqOr6Tt`m!Cwib!6e5uw zYENWlKI_VnSG#l!1TY1a!J5VcWNUk^NQ>8tKWxa!pdmX*g;4V>dzigjc5pHwI;2p| z5_hl6Ep2}ivjYp`6Zw{gnD>o|0n4@^WShzX7grk!v+#%Bl6_}k4&8m~-ZA2yMz{8_ z1@3;>r3)Z>+HEM6H12=knu|Mcr%+E>52FwB_cbti9QixK@unk#eof8gIF6Ilk2#cX zL>$s+j&0eL;fPY{ zrm7~la}ug7XyUA)y+x$PxF;2>r7%%S0VjQ#uZk+O22&QU+w}|t{COCg0&Nfw?KR3a7jX2WdTEgcqO>q87 zoNcRo8jPwDKdq^?n^itsf2o(5>o3~zD$dE6tk&bih$H>1;{2@%pT84lhpIgPXoB-k z;>@Vxyxs)o4dTqK;=I`e=U>FZdMEXf`TSNBoPQH%$12X-O>o{JjtpCr&!#3g?-ECP z1;s&A)Q~?dfawTAaqK2I4sm2$pg6H6IIYClRb^h%)X+I^l{RAl%ewM-4V^jRz@{7> z{efT&OC%qA94YUM@HpN9j1BdehOwNZh@C6>4A@zJe*kUo2rPKzt>xN8OqS`ObEIi1 z5+uWzWw8a>ttZ&8;~sgKeo2eX0Ym}M0z4<;IUUbcc)pJ3DLgOYX+^)qo8S8J?1cyV zXRXG=Q7~?dw|eMEThoJJIVZOC(>c&MrefYxVZic2z+04Ac#6wW|sF0?8 zQ#U`8kZ$+)G&IrKiJ>8=d~8V5v8nqe(scL>3{7=97Rp9Yd1**9W>fbKq#5JyVQ8ZB z784Ia<*{KNjNR1zYtoGM_cAn30zuoWFdl;BfP?DJI6Xj;9_R0EXdVYb%_P%AMtFH# z7+HE#_bZGny^gP7Lb`GaV_c}Lk1D9ZQo z-tM06Id(Uh-ObGAoFuTJm=KJSV|Q~cH$(&i0XG2*_o+0@B&Zp7To6z(L@rS|JOYT~ z%^`{hhl+{{D=5klL-3y)|KzfPt%SR z6I1D9(bPDHIM=O&cP3_V>2ImJ`4p~>~7*fS{UbM z(=tlF=BSC3b8p|2)FbY>>fSqsyD78I^4jl4e}-)i5snwgAzdJ}8}M;r0{em26L^hV zI`~o!Dnma)@@nYwDt`o*YP#`;9wb{R`?SNoPa_;Nb>IDefTX8$eS3~L`y?Q*XSt*- zq|kuiY?Hrs1*eIX2Gp&MfP7)aX#lG`tMi}QLx9U6FVDx_+Ed-juS*rzPW6K6%TQ8I z3P&na{ZrrqK-7g`h?HPjX2imDx5oSwOb6Vw_a#B~AO)qM zH-SvQlmo?(kZkSk6ej6Odwyy#J$U(b>Ed8(TB9y`7O=KbALf~R01t~kSZ|$0a!&&f;A@7*a*CpxWyajXHOpwPrB$K%4lbI~2 zJXo(+xHT3cc-B*H`@5zSVliF(nT8+K=|fO|D)UiV@?#2w-lf$6HrFD&L*4js{pxhO zXV9G*n#oVQKQs$p){(69Y4G^4@Jw{C!-;0&+qWCQ9aufUHs6_}1^!0Rw6c0vd5vUb z9_np|MN&6}+wMYk_Y@kjIE)$2B}haoNZM?b>+YMa==`hEm*7Vm5FqWOrB zl~t7>+5v9t`;T_S*DiMccH&~E@FZ(rC1>u+c{Sk-Mkz1 zfT&%Abw|)N6mA}a@rwb&B}nB4}8tP$H;yzQygr|q_>>Dh~uyP~6C$PW#6x<>j+*#s9yE1hIpJoz%YG_OP0RM!^rg-Id1 z5ti#vx-)@|@`M}9+Sr%?hpYpSUDw_=v8bEYwR@aJhih50UJZca&yao*cEUH1Zf^mQ zFxm}nTo3C@K6Fhu8|qr>GeUmMW)$2zA@wNZnAbOGL-5YeK^wNWXm_DaGfNolLE2tA z+7n-0#%|j-7a?3dwxxA0!k1K4M9U%?iHU}~0^r$)VKFGL#Pu;f9v+Qe=>+8dxUZVcK7U%U({P$4Bu zgnFsQ6|7Px!^ph}nYffQ8a9+Hlg;>*>?yolZbW57bQuVgnYNM?jhv_$3W{#ecE*k;uXZ{vSZjJiDIZJ>Jy zue)KP*c;lPUwH!@O*`vVk~jzx9Ny1Uqf4WU(~Ay}=rzXnHvbm{qXXewP{ti9g3A>z zbw&p@P@`3J-!cikH#U$gy@LtCd&EkQIf*^dsPZ<2HmZD2`Nm<;EzCY;rD z^FHdmkQV|$$2 z`(MnFi0^tgiQtc-J9;yIi)(S`j2VQ>7PTU*1%P{Herx#<9dQ=whMq;UF*w6;wLm4B zmg+jjMO%;glDPFGu8j~KO|*xb=|7X;_{y!4_M2!Q!$_0oxw%}9CE6*I96zR(U?7X3YNS8fDfqCB}HEH&L5#NBpHvn@pWyStIW{fkMvpB+jQ`a+<~Z8=S_ zM|s48{j+YKI>nYj$oSH9pt9RGjyaI$**TCnfCCtI$LqXE90HU52xtqgY-RZc`y?D1 zxL&l9xbF)co{4-KVf8F103kXNxy6WsPOxw|CYoje`IX+fc(`j$La3M-5kjtIpRsFT zt;5L_#pNh5vK}djcw#Lll&Gp6dBww(29lsM!S=O(Jx2zjlaas;wXvI(J$k~Bvm({Gh))__6jOu(ps z#F?8J1PpTBgrSL4nFvFGaOhYB8J_IsZn?Rxj5Ie8pVIQQ-ra_pp4|q;-^o?(jWg}Z zG%Boa1Tvnsp`PbBw>Y!zce;BKmE+OHfc%PW(8HcC^GUQq9R7q{95yx94r+fZ@ZWnR zez3V9|MVD%`m(^N>QCjII83ipuKW&uwe?h5emPmRU!jI=s_cU>9WKC>l!@=`g4CW> zzEZ-L=<>zvwrL1Rb*(OBw{f^wpia2Jo8}KkhD%Nk)g1Yo;><(u`5fu!9PeFBO6GXJ z_7k)}_|i{ciXe3)>)ZJXC6IDgV}7A^=VK6#9IC%P}f{Tx){xs2XCth4PbM9Tq$CEdbl9K&i10QpohgiyuHs46 zBnf|HE+RD1m29UA)pu&P{gIKe;Y!1N93tAxAS610H;5DIn8TDOf8@ZiB#H=5ci_$u zidhOS11hK-)5|09DmQkTsq7TZrkI@vV+5V23OlaZN_H3|GN40ds}K;~I826c1O?_6 zIOHhBEHIJx{Rpqa=_TZ;yx)b%L{zgWDJo{meVlaWQ$chGQQMifd zLErq8;~9I2R9Ap`uO^GE;Yj$#Ka;Hj!`uyYn@=OSfrV|-=h-&OV;h%6(HLnP;qB`KY5UVffncV1I z@Ri4KQTa&R$#9PoNXj#?l|KP0>3Gs8ZI879BP|92>)wWJ~oA-&u?Nyg*quR$;TjthM_|1xFaWcUFS`^(!kF#m4=v)aA0M zD!)NmslpmxL^vH2z$;6OMq9A0z7vUHTMp~W^s)zwaElLnFe=Sp4%hN6M^W*5KHb=Y zNQ>8YuVAOX@c4^g_Z2AGo{Q5B_#ISaLLo%We+p!w;{~U`$VNZs<1Kx0G>RI zu}j(1s&)C)TJH5pty-}gLuEfs@BCMZ8Bfu}C6A%4d<5HtVsJ)WP$R zKK~lxIQZlv#Wu&fx`!*be|ct@&6j$zFZXTz4)Q5vy&R6kVkmdRE6tbCo1mJ6YiF!0 zmDZmCGZrly{*q^!>>9qTQ!zES)VEx;vC?7~h3H?r7B|Z7Z-IMR;GP7YVu8n7;G5T$ zE6bnp&W6st3u>}Fz*s#W{3ZRvC!Dn;iofawfcK2-&&Ih1T}*fMZUJ!FUI5cA;LsRj zh6Q{V%BEnX?_ai&oQi`a@Y&q5N_r!?O}zLVhWU?J2mG}ew5!i8yt^jOH;1ZRPT z$XY6^WN9Z0Nz^-BKdZI$#U$3w0vYD)y3~2;?PxGPh3d6vay^YfKl(8Jh3Fc5a587| z;Gzxgo;88$d+SQ^}IgJ;^{q|IpXEE_z_1}C*xgG=o;e6|fw z8kC05vB7g}aMGA;^sEgpWh_F{k}N`NjF7bmNfWUMQ)7gjMM&C*Md*kTS}j7-I4nX} zjL>Egl9pi+;_@lATZE)pScF)Hr70F6smm5276YzY(i)I78jBDYQYmi{61`9n5*9ja zcv2TFft@rH!?dMzjRv1Ug{oeNezSTJeuk;zHFU(8&g0V4Vh66+pL<4bjn85Y&jDuT zZRo1af#|4*OZ2`y@y@09-H8`dKfiKi;+;?LO^J60dcT%7faTYa zidUx$2TO~T^2G|HAP3#^IvMXS#yd;n5wQFO;?(FYwJtwWBT&={k-Zc~d4ot7K1zft z9TF#CIoE>JsoW?*b1|yJsLLhVcwO@?E;e1>Ngk;DVIlA&xI8q*U5f*}Iw%3Pat1W7+KW z5}lR9TSe_Q7Zz6T4p>;qEMLShtbQY~lwB7NN*pewfi8D9tik>U)+X6^5zJn4XE1vi z*9&8-u8mt~yP6%Wy=t8hh=n&G3YAc|?8fg@gmR+j50E{!Tu1^lP!?`Yxa6Y|>+I`& zn{>-}acCy_r{>>_F$gE)25r1`%z;;DBY`-ljZ^CQzmrh*H>;|QUa;gF^0}k{s zuv=-?*`P>wDuL6-0%PvZW0)5g|1$W57yMW@(6Ix-JrCPCEdx@}HTuDT#OP)!OEj*H zw&R3o9fZWus52s~*s`PesMp#)J%{!3kCfl^m<4HjR)Q#IY;_Q6@+~zKy7hI7uhsgd zi?6K^EGM_P%6u8yULjoGj}IQoTSjgR>E#RY!SgdxEeo0DG%MhJ`(^A$e8fVT|;$+)mvGx+NXcz1x&*Df*dLBHZg@5L|2nFn1t zV#8@~2LCK2u@4k*ZnjviOhaGoZhjtpbfv^@TaHh0f5lNi&Wn&Y<|Dic8;5{l#1u9= z@ulggmwgJC2tcX3N_u7Z-p?=WGt6T=zL3_Rw@Yiyl=Ce5rCX25*)Mwh4gEV#=g&1`p9PuiPU-F3fj@73>Ern)}u1U_TFQm8GsG zCv#r|d4*eNy;?hW>Q0Vx#?j@YTy?Dz@Sqh6=c*+KGbiUS$RD?Ae+4<~AXz>hhEGaA zd{WQc4)Xo1UDyUqb&7_<9{`pMYU~PIaoQ;d(hcZAz#EYw1zWmJkgVQl4g7~5z2jIp{T@s|l>V?fP}VH1zsLVrHR zp4c5a7w4VdAc4RBFJ*^a@0=UHQrWRZvf=l#OYFcc+U9adxpzQ(Dx8zG*iP1R>*e4z zS%Jz)W$CFx>8aYrmN51q=6&4S&CKWhq$#Xm9ZUH1!c6rFq<=oyZpwSsIR|KeL*A3I zeF^}@>=dUkL^VZBdIeOfW_2u9(1@T4jOs4tN+dy4>K$j8t5~f9F_m_-Q1ijxi!03s z2~PHna4qIJ1pHn52DXvH3QTm_eAsTlNnkuU@ERMJn*b(GDYJ4IKDY7-_QY90`py>r z7wFH?e;oZ@yKjDs=GAvNd_{I&61#IHizW7%<-3Vb6VfM7=PRU?9n{p<3{b#A@B5_Z z!iNzNC#2AKQFWSv`|L2o(ghxD%S6HtHxS#C<_=WtgQtr94_?IKgrKnE*K`-;88YPd zup|VT{Q^Cb*%|tl=|=^?+|Gzbz(e1qg3d=w3QDgULJCR#MN`L$6;mp8u3X|Kq5lr@HSzuiBFt!hjIv$E-6JSNao58f*NMm;!&{*-xyg+ZA%*Mb4~V@hT@^BGq+ z6~tVHG}VH3KtSz*M$vj&2WAQC*g9Z-(m=xz7VR_Q@`qs1h4U{i|KHJ_l>Z?~2+IEs zdYa4sMgcUH|CNG1zWi;z&qW}Xh2qjbRdA&$nC0u}(Ns0l2NBRH{eF7Km43>6h=ou6 z#f>JWIZ-;=c>L6)64Cb1>bwW!{)zHW71y|>g|ltJ%vozPsL9!2nm+wpS~M|4&XlIQ z*SPU;JBS4!$iAOS5jx)^v2s}dFjzhxZ3UO0N-xm87M+WX(X;SnXETUZ5Kmt9#1qHy zUc*4njQxv!WCurK*Nl+zxH0^DfVHJ%IWFBT6B2o>$;UX%;k95s!qnMFWG{RSS4aph z{fxN%Nm`Q1C*>>#+W(OcKP7Dt3-i(j*~D;;?ryMtd{?u_Waz0IC0wzURmMNj0IUQh^;SUh&RRYw6o>vkS!X_ExIw_@g3sgQY&+oVWC`TwdLroow;HjNW?LwBZfO! z3_pCUxgMOS-)cUJkNFsLL1Ma$>ig#7F{CM9IXV9_3jR{k()*~wmj>j31)hPL@Is9* z5301fK_P7)pqbLb(I9zY#?JK$&Q56mFN3a^ZBG>k9-x%CzV3qwyBr?i?U(oY_`HLDuK%jS=q)TL9w1e)DYRI*Y0;O-5p8x zF2#?piuetP+s8?vYGy|KY(j33ZcmxVk+M!un*5cQm6Pep$#k6BUoA0w^K;_2`^BYu z0)X@edL`i1GMS{r;&$b{NNL^mR-dPR=NEuGzLPI?@)SXbi>yD1r11Rc4D*;cX29rl zz3a^!Om|zzY=z7j%)}6M>ZLV6D&+>JxaLM=Jqc-pS%)F*47sT}WU39xGvt#=2s~8H z=MG=}VdsovPnT7H&ah_VWr;R?(WP4JL;MW8ZjzX^#yic}A!)Z_PO`AOR2Qp|Mlq^PGE5 zFMl7fqfgHUbH9WY=A*F{Tpa5#Pn`SNEeL8&&(JmI)*vkq3AzLG`=fE6>RdVm@;0W>nGZoA_u``efXC78Lo`t~r@l~&T$;T>kN<782SFJ@#(pQ`k z@2w7>g$njM3{_|~3c0_-k0o5)W7y=E+Jc795`iC@{L zFb4W%P@!GjCKw==3c?B}x|7Lh8iBM;CS&EiJaIOq5$h8aIh2(#seJ{+Zeqas{DB^) z*_@E7AAMDF7w2vJa=Qz7=5r94`TXQ^`x+5!n8*#rvoUfzfEmJ{%@doz)FFfDyKv|1Axx+i--GuiHhH+ePdDpX^#QnUq-^Y| zw(o7*gON94%G+Y^m6JYAuXx;!Jn8kMhw3{pK^qgsmI%O) ziA))phvDj@ola?vL5@3#?Kjxy5k!y2(ooJ&H}NOhl1RyX5d~iV36SHb5q=8yXz(b0 zt3M-nn1SX?K#P73*Cb-JU}?gBwHv%I|_(^C$u=JJHFH!9TggV zH+4b&S($4sX32XIg&8xd{RgRgLQJ{{5wR_L3ub4bV9?x7pD~8-SL`X8`5x0}q?|*9 z>xA#7CeC&gv#moB*%q-^A18Z7R1C}YcxZ#?M*C-p*gJluL2LeH2()cV2hk?s*uhf8 zC?l%K;u@{D2Vm(7Uz((V z*#KfmOwEl*=A#38T5)P`=9o$axxTTSSr zo@8t;g5f;QHn{D196GDe85`$u2w}cHZ)s2sS7$5{g)ld^vXti(F2$swr97kE$42(D zQ{X0c5Q+U+c=#Xt$A`!87%vV-8z*n&OR%8&6w>oI&t%{A3pjD!`)Ph~-usv2gy&VB zf#W7(kpGHXBZBM{9ht#s(3rBG`5SieGMwinkHj~HF{k<~VB)mq(6jgk-q3USxRu#d zTAzngZ%YVj1e;&u2e-*FP$Bgf0Kwsu-{4dIEq=Pp?}!81+Rn4i*>DF;=l2L;I)A_y z>HLu&f9Oy6xRpJVZ)v|unR1QNd0{F#(SgO~6T9?V}D zL(|VV)D=Uf|5ren{@;l14gDP-x3W4(SUS0&MzHw@evl*s6%yz3p9s)2{za5H4azdj zH2x1zrtxolk;Z@UaVzJHPlI6dU;H2q1_m`k;xtC#o>Z0{&S#NMhUvTv9H!$0l1>Xh z{*a50TX|2CoRy`7));6!{FEUpA74o$r}#mw2`MFHw2%p|2KW)~@T5)%HwdH&XMvjx zTwU^ug=|*Ge(voE(}Ic1!ebeo256SNXAyzC=SayLYURftYQx8^+&rFl39T{EwBrW? zBT7(ff|FfvGzFh#u{EcgW4cp;z;yG(_l7$7@rOF`aVtLd3k3TdWAGh+0@##uvje%wcevmFvf*RqCde88r-p_=m znE}W-&O7U68+n)o9P%(5U+^#oAGeZvZd@BD*p%>tWEmLL2#M?ET)4NB4$HQk>C6KT z)0vMi(%FF@e`rU1+{(^La<*PdXpMoU2R}%ZC_$|WZe_dx!Ocm>`NI^}nZk5;0s_-D z_#)k%`SFL!{G^5!;^S8KN|G1NFQ^GpO>k;NF}vUgOb~IB&_yIR8tjUXu%f+8L)NE) zm#O6Cb-*Am*keFmUeAv|v;-fwvNmDD%0NPE3^Z@R50WQJP-}u)8SI8&O<1}fDdW4` z`tAV7`sE&Qj|O`Z5oQYLmkczwLccV(aq{8Ri>Pq)%`hdB${8aa)*!qvI zb@K3@A|AK_Vk6Yxeo4gRz4}}$%p?Ey+?AM90<)tm0+=#ByZqS=%rfA|x^q^}g>@hf zhEC}&VBGRk0ZfVPRIp1%x)T}{+x<}clhF1jbL1xEPQ-06(`E4fMmAer!N_=ZRalil zlcS%o8sVjjZ0H+YGn!R*%G?gogt&bGpg>02>fUg+`q4i4G^ooNls;~CON$URT&UtT zRG@0K_LSUF(4Nu`u(f#UR2{6g7OiY`Y&QFmdehjvKm4IN0KZDV-EU6jK)|<}gYfH` zRf5ALqc`FQh>2Txh~+!Wc^=$$HOse=9TiqigoTT9wks@LaFGZrt-?yDaB0C{sGsOy zuwdRqW)8tmoZaxXWH&9@h3v;ws_~f(#$^z<&ocp#-lQ|R_w#*k$$f9H!GOuMcp6z&i)C!#pkl;1$&$w#GKi3=vDx&b|E<>{#epOqg zq+D}20Okn%;5Z`1*JakwqqJ5j?@A^*QUaC~r2Y+4W21g{O-hcF$uT%KyXYvO6{~M1 zGX2Hspv2=G{0QI|AWuDW)u=@A$>)(v;^Pooy=X0>nVq0%_C)L8q`|si%J7fi893EM zqoWb9f!?^TwmHWkjp8I}bYBV+?3gYIyVqYW!J;O(WNd=;+Wupy^KHzrx+OhBWy+6^ z0Z%!p5>+A6w9VgD?@f&P8-3FWhUl^SzAt&K?WL8}M^*U_D=5;th8J#S_ zr{Gs*TnkHekh$Ua$U7Gw^!goM&2t8# z^gWCyaGwcxX9}wj(Oc=_+R@uc@p@8BWz6NE1|z@R2C$JZ$z*3}ziGdI7SM5VqUI!` zCy36*$FHA5Pb#X2r%F#+(SXi;#PqoaawXF7>l*+~tAKz@oZc=bIvGN}DJ>rT>b+TV zq^!QbiG9mz#(u$=u#Cr1$U~fSl$#LDO~(Aj248i_NY+NqOr8;3)=1`st*Ond*o^2E zFk4PvdCcg`FKcnijtalds^D!{g))=EmrX#vw_z^;%vF$)EqfAGXml=OV628;%D=NU z-#XIhOCUZqxchi*^a>D=jfQ^x?TDpy%6t$|Tc=x{!$4>{>U8DpP$IktyUq0c)5vad zLy+p}Y4a>b?*N@fD>b`-*2qWW(<$0W>9zE;&IZt*!8W7iv?IKzxU72%{Q5f+rs|vE z^rY(aa{G^0+O10x?uvem9A$Blq1+cmLrmo&szh7_)${GTfl@^oXcHQnNA3)n$vpl* z@(2~z<`E4>yWpf(!V?SH-%Q>snO&LR-D4!pFTFOu8R?T|F~7y=W~|AQ@iTd+16Nlo zk0gvo!bIa7XE1rY#!+-u0!Ykb!LU62=Df8#7lH07AN&9jHc+nO3HCN&Xv{xpy-vD{f7utk*@g&*b z`WoqzKQ58*&x@`C`RIfADJ_!&`(AW4JYMu6{MNC+>`UIwhv6+_lk!LS)$)d{uAy&N zF)0ocx4g+MwKaAIb19ksvaBx$e9m>7HV#h=#vMPe^3YcZa`FEp@pm=Xf~DcT$jc>e zsWh}NT=p(Ww?+@{INJ}e3k>Z;6qJ=O?`-S^v{^uIy-__dk^Z)=tbAH?d>lH1(0)GIfXdY9xm?Qm<+ zPUJ@JTuhlxY+4~k*p0Bn_QGu7+RoXinYfV82@qA0>K9Rtjdu19e6MmRma z&_c(7tV4?v|Hk0GiFm2#qwF*gMqH#rLY@*j2+lI@8Se7TT5+O%mYky@ECbn9*8rB4 zi=uM4A>(5pBMVXiuD$#=f}+*<(eq{n^Dx|fJxHbcZB(b$G;Z9u17?q*@3G;fM}zMG zTKxpMXDq*sw;TQz!%-&h-@w%kT#}317rLUYKzH?$w~Wl-)6 zs)vG7XNdbkOECU)rt|3;@;Y2TJ!dIvT0UKxI^ZIWJf?@wkw0!?&xeQ+-3bcO!GIyG zV4i0nx7}*sR~UE*V7-_eA-1U3of%xq{z=N+@X^1RZg`Xf| zB}2Onqfdd4_|}IEW;Css(V)(0y=`;84d!-6T{Fw5W%H-{X~cj6bPGQ0O0NY*n7&~S z_-)Gwzny+&WQTY*T#Ob{)%_~OTK^$L5L+sL0QYF{LyF=vpwu(WKvt!N=4<%rk^7+* zSc2SJ)e%IW1)|vBD!)s_m2#V8^egbU3H=i$g`WeijzyfN;e8&RBh6gg`iz5NcbDq44+no_M#?hy;kk4c@^OWh=?-+{Ow zhE6)W=$36#_ji(yO8~QmtMYBI#&;TLoXbIHSMn<=s=>THi`QkSNpzL#t1yE5(RU$+tXtY8S_*}1 z+EQ9a+~TGCOYxU>xjs4oHHn=VPeh;-<3JZ-j+1Q*(?Q0Zfa-T6VR1*Yg1{2>vav4u7F^}9 z4q2{#AK}#p@H0#);*Fo$58&bVhy3!*1(X-&U@+-4ib+e$ZsmxB)WDhFMmIRgx|HtfXd#&UxB5wM~M@iWG5oRKrCOSYR< zP`U2jIEl&9ZAH3aTGDMBNzBEWZo6s|qJKzlZAx2A$RgL7i)T5gbj}-?wx}Dl4~vaG zSA7V4veWu51ToQyTYwgA4Y@Qyz^>F6=Q z3oG6SaP@Jbw8?T%XL~w&g5D|e7$Bafd6K@V`KdKZp`X*yd^>y;5I&TbE_AH~UcSwS zMBC__qC@drIuuXQp?HcNireulkB!rAo?;?U4W*wzc3kJ~mcypFGOo^C9LP(rcnCLN z{RI%Yfc!MRL5;tS*9O$DH~+DJ$HMe4flz%0KV@8u8xM;(pv;I;TX0!@C}L}E*m%wNvDs z?<0SEj^)7;<oT2$k)CGR|hy!DPP`=-1#XXrl3&`EKI8o9_e z)eF7lT8ab})|$#$>}{wq?*q@W8YX>=XuW>M{GQNM?_4l4rruygwoC4rtwuVTR8tO9 zaSkW+@y#~ll(QSi;&FHM@st?0a)@dx>vw_l$?~{)^F^0l882Ea1+tWX!-jeeaxpA} zWMd4)OLMp;Xy{NGI{E%LU2ctFFZu&%%&4!Cz&Y-)IA+w3jQ!%6Q9mm7i(^Lp&9Pq` zGwOq}UmP>)Yh%ASX4KckesRpGA07L}F{6G=>=(z3`mwQJ95WZsbIxqRyDgAWeKmsm z`8rYkFu3s2L4eKa8=;zM$ZiO6&AE^RUW7$!j9!E$(Np;%oF!aD0C=kyG}1B=H}3$T za!(_$O#*e6ZZ-*(CmU3D`7N6A`vEoQ;isqamc(Btol6q$u*AFven}sb1Kzfs_bZ)& zb9VF{YNX#nRW%oqmJRCq9k3fg7dHjX8XI&$Q&2C1_D3mde%>nyA50)KUb!v~9zGn> zax0&TLxzul-~0&?i^CLYlTsX*w?mvymYuz3aqPhD1NeU<$B>lp)(I`EN7iz-s9COcWd-#AgNg^ z5Ia^wpUy~IL^NmQ2dqbHD8uycQR)@Q0qo$jYb3H4Vua}rm zosy2Dj+_$rO`H~;GtY5O{?v+Y&rkTzBioBha_*f5I)aD5tB(5Zu(D zF^=F^ynk&M?>;a3KLpwV>fdxKum6!K|HUtO9c_5P!xFdtG5`rror^o1e*wOdbBQSyd8fr7&f#F*95UxDO#sf$RB76?vRV;2~4XjWLabxut5i2x3Adrrp zMxeBzwixnE41vW(?+fmG7b4)!X5F|Y7CS#`0m1q&SVyG?Ur>Kas^<$#%tctwFar%* z`a)hj+hsfeMT7P;aSgEVFRjL*PrEn8*0;_erTvB0T-@o5E#Y=MxYb8G94xmv0}WaH ziL&@Dk{>UNUs4utS6Tdy>@~~ctN*Jk-rFpTns`(ePfw7=ZyK^-;CNZkpp?P{DFqdP zZ&CFWvDCHzb}-0e9F%RaGr*xx=|mHuKq7Xpytc_X&Z&?I|EfNVpkmObD;M(TDg0Eo zfuSfRAp)EdhRe{ zUwSBN$M8FlSd;giW4)W0#Waf**H&cY+h)HR`#r{fTlG6fK72ok)8-)jag;?gxk>Dq5(U`_W0f+2R(29fz=h~yI@ zo!IIED$p)tGQXaL%uKcNjNn`gltG-NZsw?oSgKArpeuO=V&xXB61cE<&AU~Hc-MK< z+2LQYdxw@C_HU7)|6;d$fO!#`Wv?_}ePp*RSx5Qu%+6Ba?9Dz%EK4{MOPSINhK`um z$F!#L=9IkV=%p_gn_96fVh(hP^yfIwqHVY6dbnX7f%lk%AWzwZ%_FhEU&RGkiha+1;-heN=nXB=SL0+z~2j0>X;O^x#K0Ws$ z{4PCKoMvv~+&Omko`|5z-%T(Lhq$BEl#XgIhA&CeumC2aekc6 z8RGmPokpCO(7A^=IlQEqA-Tz%mqDCKNNFdz@uWS~tq+RrE69gS(EPDMt0ZVo1ht2U z$$Jv`ZaIC{vUUNr2eaTe*FvvYou;c3V_)Ski3FiKU2U1Zui={!n1M+ilcO+LLD_`C zTD+J?ffnRQ`>a7O;Wh)%F(XknBuO-%TDA+_+%NbMq==O}KV~T(&NA(2KJAQRu0d#f zm=9Nb^yayc6s(o&D%>Xj=TQq#WneVd2Rt*;JHVgpUn5#!mRz$Tl}gv$SN`n3Sf){A zPm%WrLmC*Y?W6>n*iA2Evu+Q;u*gQFBpem6`S24Mk0cqm$;p_?sdbk&`h!7YU)EjE zT#sC3wW}*l?WN#cx$)I>KZA`trow4*<8 zkmiDI8J<5T9X-!2mrj^GxsPT79S_EiX9fH8$v1xSzQtiSI)0&oelC(U@ z7vBBGSr>#dts=fbjlaz{EBe)p$=(XYx&f$8$4?oVW@yp;1kxRv0VjfICc!qXt<_lo z^>{fxux z-)7te@K<-jkK!64;gAVGHU2j9P=>#{5I@9i%>6%&Yz<3AU_DsO5f*>$Jm=Zm8n)%V z&Z8H%`R_#^4j-3JQfGJBo%;d|?&`xk40@ZPpv{2q;}^HsFdSczf6iTx=qk zv*B}o`L~o(nM2G5NBVWr>$??{j3&%y0Lv=`SK zu*GeDflyC=2X{ay{&pOQU0+_ua^q9^k6#-U^IDw-?1hSAzr}-k<46+F=6Nl=hJ!yVZ z&W?z*3i|PGm zWwW#=&?y8cg!p{@8!6i@r!)6kPB*(E*Lb;xB^TmCEBma;2fhWWP?yZ>5R8$T!I`qG z9U|(Ir=T*~zS(m)>K;s*yqnD2jeN#?xHareW5VJyPZ?(~#5;sxrG8n{#Pw=RQFxeA zQ)AHGRK>NyKnS1Lwc2-Amp!)-L?NUEAGT3NqsZiH=8dxa=0v&39sm`H%Hk-*MRlQY z^fOzHj@qq0NEzecPjrei%I+_GZ?f$7h&FG>{j)TWvMv+33ODXbE^`wq)in164%J zhgE~!=nbzJ&SJLZtnY&!{)+TjQbDvENJ7SAC^v<4HE3q!UNb~OX_HaQCXIj!&`nUb zR}qS1P?$tBN^e~V!Llv%t2lBj1 zFFU1*--(v<6Uet!&i=X49zbsOL}&AgVr!Ho^R)Rf8+N)}eHiU?la_tf`2=XJL3&kO z1fRvkK~BL80qACAP9j%u?Xr|p7u>~l^itM%IF6OAXuWJ1i~}=n)Ca5F0y%gv7P1R) zLb>aE&RI0as7UOL|P}3^m*doMQ)# zcAmyUo*-`Epv#v11?F*A8zDxCt5zo=kxwa^NHo7 zZ9-hzhTc20mgy?@ub6E)a%=ZrNsf3Og)7i;bVIpYXWiJcaU--|-M#F}wuG{a9SDw| ztij!tEM0lpEs)}pgHM(2zuV%{&0O~V>w_l@O-T|zTAmF;tr^Fn24wI3FRv(@F1-^K(jYivRsJ-b$yE0fYn_!|Z$ z)FRaF&nNuJcGqk$V>#E*gYKo!U7TRX(&_m0?o0QarL2%aX{v08mAjqX4ID7##7WuR zFaUn!h!ET`i?>A3RWLlrK37?NDObLZ+A%=$ByG?>@Y2(ig|{$3+8(6KCQ<*56xZT3Z4aDgxZa%~tqPN9i%?R=YGUcp!=4I5n?{1~j zdAKv1CotK+o(1Z-t+2UFUXf=Ole}hcdG@2_D((T$_i!*B)dL5ucKYW;cAH87xR52+ z-A)F*>3NOZVKm&Y<(XxoYR7en!>k#H75@__RE=_GAO|LojP=Paqpu z@N_mc01FFc^lMGqkwPPh8+}zDJL_NrozOunXE3cmsrAiK#LMFxlzFqp_&pQQ7<6`~#>7bZW>8|J z5MwP}?uLtr7Q|@mq4PMQvJQcwg`+z7YRzc zEM-p9Q1Z!k8ah6eeO;h{Nx7FzFet9g$}PQt%;ZBg%ZNQ$*;w)g-jB_<5n+?{Sufk1 z8X}&KG(Fol;{?j#0D02m=0X|$>VKNh`LwX}IR>)o8D=0SISb8C@q>+2(h-!Fb%iow zr@NwKMf`f0RnsXgi{1jDd6X4P`N8FizjTz?yKycuIyOPQlr6^?K-f6E>2=rjy@EopgG zyv)7^Ic>?v)9mFAyd3f)c=NtI?+$s$yWg>J&?_bOOzf*4rafvtcGQal$>VOpcLCPL z_YC^6@FXj8=HIA|WvtJ8Lkz^5a)M49*IDq-F08hyQ5g`c*ITkKtmYLmV5cVGxPMW= z&IyXI*lvwLOP%9Q##soS&q1EzM-K4iixvK0$~=iy#Md!cC8m|*7ckc9_|UnyRqP2B z%0mWK#N-<|@>q6(FXHf(Dp_7fe7n3JgqD7CZnkN8b;;xQ+-xWA8$Je+s;@%Z(y|E; zDjREQPbo4vl`6CzhtH zH=jl0x!#-Z&S~<^aA!36X1WQUt;cK|?*#uF!GHB^G&HWSo`WyC>I&PP=7}5GHBUi} zp$gsB$SL~pD&W-(_%X15EyR3a8$Lx$cQJ6Ar`WB#z}h$lOX0xK{yybEuXN6(EahE| z{ye<#Lp0|yT~=s}yz;;dE9jfx4~qlr`U5-!PMp4#0vp76nNhzrER4G8^>X?*K!vp^ znEePoEd=K6h}0H@nd{?$ZOP|?>N@~TWYi(=a=bm^OQx`HxnWH1{U->zT5C&lg`KeP zX~3rEdZ7%(LCW7H0EG5xhE;H<@Xv4WA^1T(R}FL2Z%c#s%=*4P0d@gT4AnxWe=fk# z+t!PTIw-BTmTC5-iO;em)kyM*cLt#Phz+|tr^Xb^^?G^DDv1f%GJ$ZqJYkT414~g! z6!mHYYsKc!A6v0mo>&)oC#8t*CVo#*yuu3FDQ&5G`fQ_fK^#USkE^oR~H3E51?OpiFq9wG(VIn3v z-c0Dl*8%^Xf=_xl{eWML6-*kPREUil+;^_j7ppjF4FZ& zA2Ji~N>UX&PkA~?c%rF3+5*;d@+NB-eE@FkLKDM$e>ZSosDQSp2g?B86$D{k#?npO zHkxPb@zMJyF{Oz5%LP5gUvy=m9PiQTboPC-mP^0gRCe&`xc%H=81rcfKLc)_@fzs-@%B}8$p={_frmIVR(KVCaJgu*Xu1<^Vw4QkU6F zh18GB7zy!)u4Z)VY;?$;&pK{u@yl+F@hP8~(7Qf`?-1%HEGM!m#I8`5uB^sj4hA(o zm}riIggw&-Z&3RHC}58|?G)*-!;3zM>e0U*KI~pN1sHAhD}mAJ7q|@%Z+fzCierg! zta>$K$iB05^+RyN7Ks5b`Y@bu4UzsBYof26Ok9`OIx9Y;c0%sO#b!~b&h};YC$m@^ z!`r<<&MPf5zec&$|BJa@yvq0=xJQFLr*|JgVm-qQG*6?piygI9?4@mC_tMpv=y|3e zgkZ074Ia=5l-lS7Y8?$~3~W&A#I>l`NbY)Xhj8#->9zFXvevypPPXLd!x3zc(iNVf z-p24gpvrX>*8y2}z-4eZfmn3UVo+#)33kT@9H{}Q;Nt?8F~FDS9}w|Z6T+!@gxv$v zG(J~2X2?V;P7*v{4>tM-Xt-s0cLbw_n_xrJ4S-%H^Dpo0j^P>Dg({0ftI9Ga2`cDo{w^@7JfDTA=l0xfu7jV5qh$!CZNvPgh^jA2iU-&k?_G0rEA1 zAMF9+6D4`h3G*pEX@Xa{JYc0^57eV)!clZ5I2!W6TNv%w2}(Btr`iq9v6ndvhSCVZ zML1!N4vA6JyM<(LSeICp^`uG@O7s;HO-a=F7|R_51puWh`?fo0Phjy3sA@Q|A1c0{ zWgH5H#Aq;`5`Ub<%yawE!KemdG@tCAM0RJ8T{Qb(D2oUqFbeBAw+V^x#7%Sq1ZjQ) zc5r`@o|((%6Qd_rZk@Tl>2uA6=4nq!j1@4nULsOV6(;dVOou`B{~KEjNI6( zIx8z{7ZGGqu8{;6mf}ow6iWwfK5p&NHHe-l)fY6%X@BP_w8x9s9zR6>u$;4ywcu2E z0>AoZ^jgu$aJvESJ|Sa%bTipoiZzKrdjIJFb^q7B5@NQ|Hs z0Hqakwq29d1tez|(nAbI!tVqwpEG?M8kl8~AVJDRn}kwS!v`;j`({}}N?>y9A`0g` zMH?a-Usqq*KqE}iQc+#e-bFONtDb705vFKCG^}Xn6D{lr4Nld>tP!SYVRV6_y_;xh zCM@bBE<9(ee`MMm)K%4MCVI7o9)gdok;*jF<+s6U|U|ZsKkE zuXAktHOjhoXP{XWs%=J*@x;b`LlO+hh(q{;EqYeLZ-!HVz*x_-SCSW2@HjRM*A zY~t(SVcvE8Ym+@5??L`uUmy4Fz-zbWXdvmEuwL{hx(&p%Fw~4je*`2Hh$;~{T@OfF zAQ_AEdq6S*L0hK5%8OnE2>ZkS2uikGWZ=ELG+W5Yi->9%~>kL)S; zyT?>8F|zFUkW8w5924-5C4(-NS!ivsgCwqrYbFr12MHgarv%^!fq)|Tf`|a!E;f1c z?!bH+iyRlhJci=>BEtIjgIjfKT=@2-M7?jEyDx#q@1Rhg#lI-m@YB}Ji3k7eUOi~w z@qSB$sJL|OquR`EiU4OTeg9{*>HcXFL4d1cV6ry|VQd3;{g1JDuPf#KK8_t zFaVt{89+kw#SS)bA0MRt{7crB9igFzH9+!V>GjJc~{5FJ7X>>hBbgJ4n7Y5T04&eEp2 zJBXe^exdfu&5x=~$smx?i#?|yh4{R{H0KG#eZQ2!w-75XgJv1ATxBwJD^Np`Q7Z}) z*eW8GNU}jw%!CsqqA@hXZRsSt_kxUUYC{7m4siK2liprl1(ywCd|opXvKneu?*?_$ zIPLd6XDZ@umb@MX8N_*wWuf7hO8C-A!dvBV=@toxO|cPQMp4{R9~bq=xpCoB5q*2& z(d+9Iadv_mDHmmy*V*AY-Uh#I&bxu}0ZDIuQ+ltdeavZYAFZ~1l#=#Q0=>!F2jM|9 z3%{;cXqrTimEmQ=6W+9M$iVLX=#>3>mowa)3gPRy4s7OtyX={tVVK6=GAbOoaN`x| z+G2#mh!AdkPZQ`k1#M{pttTiL!Ja^!)<{n%U0xF~+7()TO!owdVa~#Kf*2%38XJm( zNZJ$U%1}2X(ZHOJXfgiDB;lHU@sWjqkv-xOXKd6Hi8oT3Jn$q22Ie$;ly0ChL6VYn zTSr}oD%KT{U%UlEu!G`gOFv@Qp7zY0*D5zODTr_t@l{p>MxAHM9fZVH$E_?lbV zgBoJgn3_OL{{moKDSX@_TQT|$03g`7C$cA+L$DE=R!hIydT7cVd4J4^cGJuV?$eKf z(Vbi{u!GhJXKec34UMEaXf=RZf{F`sv6W4y^DxE>{<*%rXO$?0a(vAOdymT8f7@=* z#pSM?x|lN|bKgwCug)x?PT0PkqN>~!M*!S!isCj!arFq#eB$r+pE!XgWb7tL=)05N zJU5SVzn{cyu;w;(UVcLv(Lw$~#Pa$M;_sHzy9Wm7XzCstor}o4e=fs|jiG|$lx-<8 zbbbKgm3{sjXP}9R2BoGr4Vig;G8teWEop3@hrWeOBRl$vX*5Zz-S@Ew6qj+%*$>hA z=jw5eoH*w~xUx^r72{!9#<_|+o7NN530}t!9&dWG=73;GX z9Rg}Sy1@Na@LByd?G2tz+Qqz_>pc}QG3BLo8P|yU(OHOsLwSb@H?-h$I$q=YMQ2K` zW5g7XHhEllEzpciexv=+-^sLBZST6|gppb9V8R@qQ*|UmgYcruR9$Rowgv}vcY-CQ zz)t*j#ON7jpm`CUsrj=^Fw|aqq_dzF@A>U)55oT@Jd4Hm}9CKWbq`a#onJhCDg5s;3S;n%DLLoiG3 z4ib5NIiX961a+lJ^W{7N5bC@@mJ!R~%r!i?rjv@lmk&?_qnjxsT3cj?tA`VCl^B8> z^joAfi|C(dmA)JHri?uVf2+)j2)TLX*dTuGoKNCzgXQ16ywB2 z&|Y^V6)@ys1*Zz$eDe}Sjnc-1)%=A{3duKrg|lna6Kg=RGmGmrmU8*J(24T?n}&7f zJk0-c$3<@gon96R{IZyq$DWcFjVgiIK}TDP*r{SSO;f)4J4o?1PMz+_=Aup*<+zDB%F=tlTq)>#i_I4vL58 zL)@gOPTY@@fUWMCb>4=+53|3Ti$2o!I+d9(k9iwN9+HY^W2Yj1CbbWmT|*tT55<6? zdWnpe)GxZAw($ZgdmmjJb?MPy9(&=tP}uPp)46zxa~se-d5yPL8aCj%G<4`*|^uXc{F^kb9kZG8*FCnnt zJe#Ah06*G{P}T3x!kr}$x}F9XCnf>xOv+yQ0vkrVmO8!YQw&1y&)$V{z*>Fcrp;go zF#Z**+=?*F1^!a@Qs{|pPocW|Y$w2YU0p8U?rP5*`lnYr#6P1tSH3f=3*}S}c$|&?Cb0UMG z52EmZ&%OBe?F*2(4-upL;FSkHSmJ!(13@@Yf>j|5pqSjrc_xlc`BbZnKk-(3JP@(u zp_pC)2$gTKQHaSxUq}!|EFJ2#o_7C)%=ghTC?YPNWh$yN3wk*;--`2w`%ga#VPTK% zj;Q<5w+UZ|i%_}wN#d=>{n3ly!3_qRTx`mzqlBv80b2Eb{0uR&Yre~9&aTz-S!b^Y z2>YgLALEyMQN#h}@At655Av7Iebk;Z_@}li$78z7Gs<(yrK#o0(O|ub%gnQzxIbiy zb1P6j2AO-h^jZBLQp=(YFG6ZL^L_ZD2k_G>C+^bG#mMc30nD_peDnjr`3Xen&VK+kANpzSTfOraN7IKF5AXQTY4i@37q|bPQiTP zzy#9dm7(@b+1}3V^|5|A*V%N9Oj+5sq+Xq(U$62Wmf7o&D+ul5lpgb+mA%6smpZo< zK(XPw_2qE7HDX2Vl7<-M*7%E4Mjyo_Zkquo*~;~CJ+R0}0%$KGp|LBd-hz>6lYLLY zao+F-$Mk}2rh6<1d_vOw1jtTISGrCHxi$Xk3p|=`uJXHAPB+war4Q6IrH!vZfwHv^L)HiV;F6!WoF-#l^yD5f=Lt&qcVd7BO z%`r?I3j0(H6Nkb+9mB+-uv=o7H~_w`5lhRSL2iw|+bw%R{vXT!21)m`lcpw-xv!88>_hxI^8xtR z31=TF4&YwxntPZx>fSa9Q7?qJy#Rx@fzHJT@~oS^vn9S_@&KEL~wjth;K$sVr~7a4xzX>#!#m zDVz7P@3#5a%$mi%z|&hs_8^*U_-kT|)?S(P;88y|0-QpVCRvbzL!CU})$5H$w8GL7 zS9bMeav`n;*fz+X$F_$K7dt<$W;KvDnAXzD2*+{9V7n@-r%!Qy3TAGSapQLI+W!UN z4GNr^R41zgL$@(g(!LuNK^k2@7kq7t;{7+{g~GCG^cj=URwJE~fUeGzVl;GJ+{%>0 zUS*l7%3b2**{$(6K179krhkk+Y{Qqp3Hxf!AE=*jo9QPdpLYPepQ@5;?ttw2MOL

7yEmeu)rSVO>)qH}s`0%}(p&We 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%0AY>%O8)$OVSeO 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

(Ij!rWH`|j@wZ3o!u5ywrF<^qK+#68m0)CKP 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

?B-&Ql_HHa%eVUDgHR=}KJ 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

~ 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%0Du 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

eeYXb5X!<)Io(qt#gv*11X2 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“hHZq{J2W{QIDT`Jbqjq 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

Cz^KGZijt95!7Y7;hfq% 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�Be8lf5rnjBS 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%0DAVglaJrofb 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ν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

i3cr5ue42d!^>{60(=v(|% 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

LCD+lQ0!_5pn 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


HXl9BIucYG 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

b3i(7ck}6x?!3}j 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 z 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 z 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%0A4M78yR(~r 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

    _BfnskH~bu#=i{UH0-S3v#K-Ik zoM%_!}|Nr-j1)@ z4Y=Iifv?#+afQ7LU$=K-t=))k*n4oLy%*oK_hFsAAK$VM;41qdzHJ}E)%Ib0$3B8< z?4$UueGJ#y$MHS83D?=p_%Hh;uD1hG?Eh^ZXcRWs3VvW~xY0K7L)*elwu2wp5xCio z#EH>ZnwMR7j`^0*a`ThorpW^B>c)w z#+`O={Mt^zU3MS*#!kiEb{c+b_s2$i0Dfl=#69*P{N5gnd+j0kgPo51>P)b}s&EkHN!s9{y&J#Upk;{%()MqxN|G!=8Z0>;nAL zo`}coNqE98#3p+({$)?WW_v3BZBN6K_H-1S85nS8qUaQ%bSkl}vk2Qci?O{^g;CBDJk42((M~m< z?$lrhXBl>MmSc>w0y{ai80)OW&Q2Y6aaQ3O&T5Qv*5H}WTI}kq!*0%c?Cxy99?nLL zcQ)Z!&Sp$-w&2;$R!ns2v8S^Qlbr2%j?;k2&JOJ5?8M&AE+T0nSmp&^d+!o#S|s(}aVZX1v%riG!WMY3%uXMU#mJ^3p zIbAW^>5f-B@tETz;3y{%bDbm{?IhzEr#D{Xq+p)Y2d{NfajcVu*E#($-x+|{I|Ff? zGYD^R2IF{V2;S(V;{+!IZ*qoXfinVcc1GevClhaRvT%}1Q*fp;74LPXVUaT(?{j8g zu`?6zcZzV9Q;ZKdv#`V|!3UjEEOln%L(UwW?Udoe&Rm@1%)>{Vax8P^7dAKwe&A@h(J}Bt$HGmHgC98& zxY>!skDYe7#fidCoM_zYbihxY7_4_<@iV6jZgb-BbEhkAce>*jPCPa^3HYUxh&!Al z{K`qjolbB3+DXA(P9OZnNyXhx8h-2a$3|xWe&-CtJ(gd4>+0lvy+7fooxKY$-zTTF8=C_!NX1-{^pFuBThd4?u^5u&UpO8nSjTf z0{qjNh{v5tc)}^fCTBAKm7NhLWLd7jX)h$KM zosGIX2MxCjO?NI@?mV>Ja&+AJ=(-Cq!d-}M+zO0zE3vJ+2-~@fvAtV`QSK5v&0UJo zZZ)3n)?f#B8FqA+V~o23JGr$O>#oGkZXI@USK%4%YK(K&;F<1P?CP$=Zti;Q?ry*y z?naDvH{n_CW=wFm;Mwk0Omyq9r@IZ4-0gUd+knaL4(#Rb#NO^MJlEZgDQ+X4=kCEi z?p{3K-G`~}e(dWWz%=(D_Hz$mfA=t6;2yyN?oqtZJ%$6_<9LzVgoE5>yx2X7gWbUC z?EhT}hqww3bu~|aFUyix4Jo4=;q>W?iifx z=Hcz`Se)YK;~nleoa&CpJKYI5%`L#Y+=)2dorHJ0g*d~VjQ6-xaHcyI?{%kPkvkpl zb7x?&I}`7Bi*S}(j1Rc8u*5CF2i;OEb!X#4?i`%$mf^$hT%6<1!$;h5EOY1MqwWHn z>n_B{+zOoMR^sFCA}n_o;}dQb&UcsKlkQSn;8x>PZVfJUm*Laya;$Jy;4^M5R=O+k zS+@=sxvTIwcQr0{*WmN+TC8%{;S271T;guP7u}7x)ZK(Hxtp=t-GVQ>Td~Hi$5-5K zxXj&-ueuGm+}(k%xjS)%y9-};cVn&Fh;O)iaHYE!-*oq3ox303au47t_aMIQ9>Ue` zVSL9uf@|EP_^x{l*Sg2?J+}$hxy|@5_av@&10C4^yS&6i*x)Mofve$0*T4^53pcqA ze&j~rW;YT)cH7|=Hwr&-qj9U-0Y7zPu-=Wu&)hD!&5gs)-LAOZ?T%l#@z~%d;FoS9 z?r@XvD>oT;y1nshHwAaOeefGM6?eO7_^sO?8{Gl;ojVZsxP$O}cQEdChu{xxI_`5b z@JDwz?srGvPwq%O;AY~_ZWbPNv+)-<2M@Wq_^Uex54(Bzn>!YdxcT_II}VS!Y<@K1Ll9(O0<3AYfN+{yTtI|ZBFsra`$4Ntn$QHYpm=>En+t65p&RpC_^)1E?N=u(2giaCt^Oj5eqOPVj;GPsKCgGN^Bdk2-`(0#`Y0a z7!|PuPm5TJ(Gk^ndPEI&h**XlBbH-K#0u;bQH!w=E3tD#9d`MDIJ*0=sLF%^<0_Gn z>z*?VI1J-3A7?%o1{mgx;Q+%#L_}m}=9-xqnYl(pL}p}!L_|bH#2OK~W<+FUMnptJ zMn*(tL`1F;5gF^UYnfcz=`_J#XuQMa*oaa2xbIy2~(2aVb2Mt0m8ij)>34Lf1 z4xw4-M~g6kR$&mMg~MnQj$n*1gmz&VV}%in6Gky!IEoJ87$yi~=oH4$B}|}Om_(0o z9KFI6CJHCeCro3KFoUvi5|f2lOcCZVRXBxy;WVZR^B54$;3dLYOc&1KrNVj45Ee!< z{|iBwDFox?!eY!4LhuS<31$mR@k&9!96^Cs2})ccgyYqM3RenhyhhOADnX0a3OZaZ z81Onl!Zm^!|0Y;*tzg6J1v{=2;_wE+f$Ie)-YB?ngW$!R1Rrh`WV~5O!Cb+Qw+I2; zB&6f5LI!RYGVwMc3%3Z__;(=(w+bupc3~yv39Il9VKwFpYw%8CEfxst@GfCJ7782i zZeb%93AuQWunD&boAF*@3vL&-;(bCM77O`!zfgcXghG5kD8dq98$Kv($5NpfcM3bO zOen#Jgikg%R8@jN)s; zQ9K|V!`Fo|Y!}Ay4PgR1gh_l;IF6md6uu>#z%F4L-xg-DTR4gD2(#ED%;CGjDeM(a z<9ot99u&^t`@&i56VBlW!g)L-EYvXn3;gp{3;Km%{76`g140OXEG)r6VJUth2zXdf z;HQETj|k!TnV`ZUL5-ga8XOk1_=TXu5y6083KEVAX8cO9;!(kd{}SwYOo+p;1qY4^ zPW(o2^s#5(+oSdUA^UHDhA0R^!UMX?DL;%*ET_n=bTi(z6jhKnt@Ol(D!xDO-5 zHdKrIF;YB$8nGRhiyf#HJ26V^LY>%+da(x$VlNuSgD8o8Xc7;hS?ouPIDl4h5TnJz zXcLcMj5vgLaTsI85sVW@F>UUm?ehb z72*=i7MJ3cqJTM~0d;(9C;H{jjkMl2F@@g8v#ZWA}- zz2X+!E^fv9#5^n(^YMPM0C$Lm_<&f1CE_-GP~48CVlnO%cVL-Vf)9zMST2^~!(usB zh!yyVSc#Ql6+S9fW0hEgkBPNdE!N@VVm;P~yYLCI0c*uZd{S(}I&n8XCGNp`aWDQu zY{p$;3qCEjVuQF3pAp-zQQVKuiU+VsY{%!s4%{tv;y=YM+#`15^I{L~6?^do@gO#f zefXky2wTK{d`TR@R&fwt77yb-@d&;m4q=-(jIW9#xL+K_*TkcEKs<)8i(}X>j^i8R z1a^p%_@;OqJH;t{OFV&H;xxW3&S1BA65kPLu}7T4cg0iKE1t&p#Cbd@p27FUv)Ct| z!wz7MX!X2mK2& z1B*`jS7Zhj-SltB?43f+p;=uxaeuVO7GD%PP-u^y8Y8&Fnk#AHP-rYJUHs$w(x6RdnKhMHjxV=*D(M z55A%3#WxiPu~X59Zz&F8m!cng6a)CKVi0>3hw(kd5&TFogd>V!{8BN3ql!`dN^umA zDvsg56k~WyF^*G;3H*;@l0V}#vIkHc#~H;G{-`*CCl%B9KgA5rDo*mwpODoybQYI{ z&f#A|PvO$g(-;;ykKv(ba9QYCG=!eR=+N_+5V|mmkrNt(uFzm~hc3p%&=9;NbP28t zT^hx|$&AeQp#ps)GTVnL=$nukHB^Z^L&G^zhMdPx6kbQ^L8L!I<~WTpyr z(+7~V8S16mk+T`t8y(Z zBUh_(9i4()t;+SZAGunU8|VOX)|4CRbmVGP=F%C+)vDY?XChataxD2bT)Fe zD!0-($knRMqgNnTt1_QniCnG90(up)XHXW>tC2l}vWQ-T>=TsRaGi2HM{Ynyj-Sk_? z^{(7Qzm2S7%DwbE$PA!trr$+o0A&mP9E zK<*U6hUp;WP9bcB4o2=2!ba)E$elviQ91;fyTXpqOOUxMY>Zxt+$n^O(*km*5H>+8 zkZUb$l2#(~Ti9_r9J%7crf3y%rx136RwH)`Vbin*xl;(6p|!}JLfA=KhukTI&C&+s zY7LvCCFE)iJ4Kt3JB6^*v=zB>!{%ula^;4dq3y^T9d?$EL)Pf9bF>4QX~WLbPGqJH z~B~ILyI&29e!Ym=pgK=EmtTFP;qZ@#_DOl`BlfpTbgbF3gWV zhXwFdSUT_d1=%}=WzfGOd#A8W`Zwh6H7tw%9l37}%cjpE_pM<$^m*jIHGBoV5SfL- zSJF2ipHlcLEDv9e4~MV8n((z)8@`VBJc;Zj!q;Pc_y&ABd?Pl5=kn?^$V?KxiGCK@ z^@VT7g8&kZM0(pgMrTs&>3k)q!cM zP7J8J@Df!wzcw9N(NsNj2C|~5dg)ALMN=K5vyc@{)kkL|zeCj_`e9_Jq3Wk=ke!BV zfUZS$lBz+v4mta(!*o5elT;m{cOfG|HAFWc`$^R>-H7ZbRU>p0a&M&?rC&t$ma3!l zOUS*F>KJyY#yIjOvZkoU>9>$IMKwXcjjSoEN%|e+>Qf!3-$kxI)fB#`I>C{H$knHs zru&dPBh?Ikq&mrw0pvMT8ljBV99`UG-CtIpHY$nI3NP`_}&46-{_1>s3mF#b=q7-v->_>*c0&Z(C2&YzKM zK_$??AlJA`LH~-35S5bt4H+S-aQb)T36)Ak|AAa1DmDEl^28}ZLtlhEaf;B=7bAP% z2p#e2HAr}tfJQ;&uSu8)9aCE zH4$s*4al>ah_&=a3(vk|o%`2!iH5q0#R$aB<)dU}Dn zo?fWlg^Sb;90@|^J#`};jLduLCVDZlJ5ukaLy+B(dJnw>*&V6((o2ywLfuRY$nHqp zLMxEnk-C*uBBNTpj}AvhwYrT~A){KopH?HgBlQ7VgN$=^JFP{=xw?baA-f}WCv8A> zN9rzGLUu>$ZrY6Oj?_K071+JWqj)cv#*8UN}5 z%vKNLmFmNImHG&;u0TeedI-0whw*mx2*>k~QKufoeDzVhQ+*5z)nju!mJx9NR%=zk5^qa_>uRcw`h0OWtdHQW+&R3tI-$CYl^;!B|WX@Ngqu)bzT?2go0`dj4N z5Vel}4*51jZJ@tL_D*UEe^8q_GKH))YAbyLSt-;u42raKJXVj%g7!+as{1&tQ3(eX+N@3M6RL($Vw5p znodVnipVu|2C`B_uB9`Pl_GK-orPQ}k?ZMf)Wrtwk2m zMaVr!SdVi?Jbc2R;*7f{l@-*cw^J`(H+`vdD7!734~ZtiZP;E3qfCisSDh zS43nreiT{5kpX0^M%Lo7$T}R0tjBL6cVUpGf%ja1>_xSv86!0_@Za09rKdXw`IJw5Ahnnl6mjbfa6-gO_P~@e0jB z{wvwY+0pdTImo)KIfUyq{dlux0E;w(ym}9^OV=Ex??t|?&>X>H%@E$N8Rqy7?S)XdTck$t9S4hJ=-IPwYdEM0RNk7(x6viuAtEkBF$@^iRi`FUKoe4&wD$MPUt zzdRUkT)r4LEDyn_moLE=mM_KT<${qJ7}>`zSI~!$JIdusx*wU%mWR_HBQw}?75ynP zYb{sPpCcn-xrY7%nYET{=`WFI9m{p}F=T8kH_+qAGmYgEJ&Ei>mz(Kdk)7vqEB!mN zjxV>-eG7F?qB(do!_t(EBv zQnq0Jm$?u~?gd_iHnGbq8_}tIeWIkn2mEjXSkDSf*Wp4{29o zxpoy+XjkJS+BI0IU5k%u*WqK@^;oUlfRAf8^3!UNyI^fDKBwJ;yS1C~pV}?Fx(9g@ ztKCZPMb4cz51Y05_@cG|TeOAvvbG5KX}94k+U?k;Eyh>1J8-|Y1YgsZ@^cO#Yo)df z-_Vw0hqi*_ZzAJUTZvuTDtud8&GBwztZHlM9%MGq*5Z5GIy|VY$M?0nuut27A7~r# zLv0fdYj@*_b`Oqf_wp0ILRK+tGyY54f?sP}IX;Gr6YV}6*S6t=c0YcnJ;1Az$X$}Q z9e>bv;FPu#r?p-9Uu`$eXnXKSZ7-hG9>o7?`*2o!h@bEi@~lJKkH2UK@K^01$LEn} z0@}lPMtcN**AC%X?J)kS9l-@rqr7t=vWJX1ia}AwFgR)qFN_-J)y2q|jGCZBklka{ zB)tT=TBDBBR%E7%nxZ|(niX||_954D)HE$4YgW_@or26-Q73U-)GSACKt^oT9DO75 z6gTP=-Wqipw?@t5?NMhiFX}AsxdYjoMV+JXMD7Km&eMg+XpiE5BDmllWcG^+qVGj! zzo=j=j#|u-`;ohVs1W)AWPOQRLYE?=C~7Hw5+&f_CrsxzfltXBXUlo%=Ayl9d4AB{u$Y~ zMA_(HkhvwwPXCJB;YP*LzaeKi%0d5*oaHDd{RcAVM7ildk^2RmmtKUNYn_k206F72 znZ6L&1?f`gi;z2CouB>-a_6fH(0@hNK3zH;irnq$GUza59n@vg%aFfcq06EpkkwF^ zO-CZDp)QAxLRLfF3R;hg78rCZX(RG?Ds-!86S7L`R?`+_mDH`Fqmflox0a4UzRlFF zqhpb8Gj;3fc;wqm-3B@V`A$l=k#-?tRhLV9kZ&_}o9IO3+f3bNItf{QbX(|TWDU}7 zrLRWrk#%|WHOM`(E}y;@8Ogc=`UYeq>k8=`krhf;MBjvrYTY*aW?Zx&SGS$M1^I45 zS4`iEJYm!Apl?I|PJ*rk@6wfWq!8H=>B_K3SC04SDsY>wl2`9VW_Vo{eIGKmb=C9( z$Q`b(hJFy4;dQn2PGmmU)!`$$daTs#!bf!tSfy*k$8=3tt=o-H>Gt3*-Ck_aHRCh7 z7JN?EiqGrz;a*)EzM$KW&AJ2lqOKiVbRF2L>%^CJUHFQw8{2d}*sbg3_wx?2XV4wQ zUR@u4q&tKIx_LHts87)NzSa7;IZGrD1%*NxyJ{U`?OkK$teF=$FvfBO^z@l)eEOIeLM<5g9pp z1$`4Ta`a02W@O~(!|7X)k)v19w<04)ucmK9p3v$w^xu*BQ?I3ON9Iqxj=lq#KlKLs zPGqF%CHgMpK38w1??y(N-b&wtj5NKCz84v3dOLj|GNbC_==+gTr+3f~Afrz2q#r~^ zo!*T*^3qop!z)e1oE^~pHELC>$|>y zoN?V^enOp=(o{7BddUZJN*l?3h0aJUy+fo-$DO|tOEKH`gi180DUQa z4q5T_W%PMu6)=?3i;z{oP(fdSTs4MD`aA_G6ae0A68e z$819fUTNsW977jgZ|KIm3_VzA=*7DY2eHV|hxZr`;Wk4*-fI}Z?S?_T&u|!v4M*^P z!w~K;4C4ca5iBu`;)8~xSZX+iI}Kx4W*EnZ3=>#mnB;SK0=Yjj9LHx3Q`lrU!SUyi zU9Mr8{wFe<8D_B8a1!4$%;I6g9DZszg`XKt^Ufh;G#cjVVPrHK&d?*sXf&LqN0IMa z4d?Jj!+GS+%FH-11mUb97=JP>#yLX>{%lx+rwmK+7lVMO4GLUjRAR6(97BvMyx6El zl~H46rAAh2qn3_D?mmn+;UfPAM+D0GkK~`;}OeZ3%wlRfHLdKZU zPbVW|%ow0kk#S{A$19B)m}AVutBhH=%9xGU8guYE;|g43T#1FoRd}~?H5M7y;628* zxXri@A26=xCzl{&#<+nlMaGPABVC4!8DlP8j(js{+=Laz&G?9M3&$&w)z-L`u0mE@ zV;)_N+(Q}j=^Etev9W-zMdnOnA=Vj-IPw(ot)g)o{=>MPBfF4$VPi2i7V?FLS?!woM4S2xVh_4%)u-&*DyN!GB9phg7#Mq37jV<`8u@#RP_u*&8 zHXJhU$Ip!i@GE0G9yNC0zl@!D%-Drv#%}z^*n{K7Ui{X05GRa%_?__(P8$31d*c8e zHxA+t#=|&eJc9o=4)G^Cfy~dwVR{;wpN%8&bPUU+G2ZhKa$hWs2{uVf@i|Gr-I4ln@dZhP z&5{;hlyul48So`Z!dA(QFH2V3C)w~7$&PJO9KI?!aKGfl*CaO{ki7W1sqqxv?3>TTkFvv8H7nmk6*ffb3nvUaQ(-dB0I)NdkX}s7pgG)>&@h_%X zTxy!bznV^=U^4T<5R5b}L5*oC zE;k97YEq!zq_i$vkcNEwZwkjtOe#z_sqs>i1~W`ryv(G-Op^gGH%XXfGUF8{D`uN) zc%{jXIi@(g%H+TmCMRBPa^p&q7q2n-aFt2MYfUM*+T_RUOaWYDO2@yMGH|Ua6R$UA z;W|?`-eAhX^`;egqiH2>Fs;IyOsjFDX${_NT8p`+b$E+uJ#I2>z*|ilakD8GZ!>Me zEvC)*cheTkH*Lj-O?g;r%Eu>71z2Y)#HUO}_`GQwwwt!&+ooddG3~%XQwa{6O7UA$ z8K36_GM-K4^dv4?@V%*mK8}oMQzboxjAv67eF7QJrfPZ`8PBE~dIlNKrds+WGM-I! z^ei%-P4)B~GM-Jl=u^l@HZ{<{A|u(6)&26*-8K36;v=SMg<^yy%GCs}ivuQe#|ltV77S>bIpf&^%i8`Vm^X3<{^B-JdCyG5$raP;%DZgymJVd1I@>9*gS?` zn8$I%Jb_=CC-JEHIPd%yGVhtE@N4r495YYjH|7}}H=o3B&9gXRp2P3Vr*P7I8oxKs z<8kvDe$Efbyk|a3{~I}L=5r`o&ZFA0Fq+TJ5`_066Z9(>*76l!R>_06^ItJN)TEgjAWdCVV(ecRs)1symko~7cgD#5}-4-3k zJ;>8|iva@`2`{mjG2LRtOD#6M++ydQS;#eRiNhN#4$QSU@m7l)H(R{C=Qd=AY4Oqb zAZN-V)Au5GE|wJfKIE>%;>Vqq07uG@9i}B6%PkrBuq6{KELr%7B^xU(Iryk$1y)&B z;$xOoSZ!I2k6YGYjb$x9VOfW@mi73gWdqh(HsVv3T-;^Zgil*GV}oT2K4aO6&sy@Z z$&!!HSqgBsr4aX7iufJAg6tM7+vr!3-GXI1{Ti|#uoPpbWe2`xDZwsFDIT(v;fI!T z?6*|lN0v%{)c~?yTdMFgOEnHzYH*RYmREz2HON{=2P12cwVqy#tU=aYbO^ErSsUmj z$QopA#HH3IR9JUonspBbtb2LSCCE9oHsht%7R<1=;$_x-m}zap%dPt{%X$E>u(o5i zwFB2%JMl(q7v5&=#+}w4EVK6FL)L>>ZtcT|t%tC}+K-P|2e8sQh>uziW0my?K4u-l zYU?mQZXLlI>nJ{9J&Lu~WB8^@5>#dXcjP*D+TBqj`YKPUCad8Qg6> ziN9E9@w9agf3=>%dFyHX%{q_2ThHKG>sdT!J%Mzjtui#A|pw1k&Oo3SL? ziVsHHur%6^Rnc+yShNElk9J~Hv>Ts`_TuhnAMTBo@rCFV+rkCS$X++vk1f#wd?`8| zTcb1Z<>*Z8h|a>U=xpBqHZns-=g{vUt6}sC`dwsq8oiQ!580PSufnnD)g1W-nFFKO z(BC3+VDwu0J7f-wUPphA%z@GC=^v0eFnR<1Z)9bR-iR~Nx%gxBCOjFv8Gnx6!h233 zXDxaweHuAy(Rnx@ozIcqkaaM+0Dq4z#D%sZTx8pZLALF9fvp&WZ9DKnTL~_gOhYr+WIZhlv4 zWG1)mp*6?~XxmF`krmL^OzV&p(AGj5konx!N}G`R+_sOlAgi9OjkY1rV{Q9sJ2Hpc z4$$$)9Byl;6OcLF);{tB@U|?J#{cvSYLzp|3%9jJ6^A zT4cv)8>X*Ac8sT6z+tm1-O@os*Eq-s);c=S*PuV0~ z6l2Dq7%N7{*!XYRkkJ)mr|rn!;faZ(+#8dHFT`YHb4(7t7_$OfVpifyF{|*E znANyHW(~d`vzGr>JMtOEtfM=S&oE{^-HEKTF&pSET-nZ({OrJSHC}V+!#5m_mNSab$-dQ$$Z8_o^}5@INuzaXO|L{~NOdXJSh5$Cy$) z8B>O*V#@hdzaT44Oa=WbGIzyP(!U{dS4*lX#9 z_BwhIat7`7c!7Nv2HP7rejzfy*&FGLkonEtL|=@|Z}#2vUy%9DzK8xRGQZjP(jqdy z*_-K5WPY=^&|%2@W^cu1_I;?bw{biI*|pmD(~-#CsQm!F9NEFz+vzA|2W#)3^~es^ z-ibzg7e^#yw`uQ2x4j3~+I#VO`$1k^hwLQneYnwn2yeFcb37Nh6SNP|n~?ElAH;n7 zVZ76R1Pkm#SZp80`|Tt6n0*wVvLD5I`!W27eGD7zBI~Ao8u!^}u)}^5-?Y#2Y9})4>~q*No!rhyQ4#B-Rmch$E2BC#1!H3UXpar>YAmv5#inC?Yz8`FGdZ4stXZ*Hv?UlC-Hgx1Zo#J5t=Jr!$9rBx=B3zt`XyvOk1e2I zMP{eiLi#o231Msz{W>y7#crcJkkJym9Y2mO#=+Pf9RCD4cd;e-U2G{%#+GsXdt^?C zEyq7&D{ygKC0-O)g&}d(xIC@~wQ;q)KMJ|l;_7HUa;?SHqcLt5UK-bcSH?ABPFxf3 zxe8gG<96fKaeFwj5_x_Sw->j^HDhsH3zo#S^6G=gry949-idswac%TN$fp{&pMDtG z;l~}IA3=8baqaY@$mbc?fo*Y}9C;P_#NxW>*N`hBt{dNr>%oI@y*M0qkXOGz?#ko( z=r55m9CrxE;`%xA4Ki=X4d8#`25~y>FvtIk?CRr=;JLUVj{J$trE$ZU8b5+p#E)Wj z{8223KgN6RLPlNu7=1Ugvd53p_aG~K`~-b3^7+J1()S^sQv7lHe&k!W_$m4UIfPULfopP?T@R=xO>*c?BLFUHSdOZ+K(DgHFJ#?SN4mytOq{tW#J@)^dT zrC&up!}xRbYsjdJKaU^AFN|HdpdXnr;)8G?J{UiaU(E4A7(yn#NC ztUC?~|LQQK;IN{_VMD9Kj&?^J?~Fy}3WtM^N51oNIO!zhJ1>WuPDZ}-a(L-f%1Kj+|vj3SRB-b7Up*#L^L1JfiICAM0WXw1=(XGfj<=9N`L-tONEp!|5 zU4~;Ty&w55!;wcHK=xFQe7YT(uN(z*2Qptd3h7Q{b#oNaUC8R@*hY6FtD9px-Gi)d zj$*nOxt1L}=!3}W<|v{2kk!pmiiaF!_@Sd5`yCbdk)sj^996vYV`NY3sK!MJH5>^- zb~_2RbTBez66)w^W^~y>t?C2b9oEUxwTPCA83&BX>Xvt@IVhOp>sVz7m;Z6WZvjkU2JCKYcZF z2b6Gtz6QAiN@%CAMecwSI_T?=JD`M4`ftdND4~nK9=QWb=%#N#?tl_{=o^tcpoCt$ zDd8YTHX=Kvgg!bK*(oI)qBkMW;u8Al&B(KwgaLXBGUq1@(p!(Z2}kIB zWM`EyL>C}`8zEtsE=2Bt5=Q7EWQ|T3rMDq#biz@3JF-S69HWbo{aC^ny#u)mNEoL} zkY^nU6LcxEY9~z6Wyq?XaGWkjR_%l-tVlS)kw=jAC1IL=6nR3DFhf6vJV8o0iH|4D zVokyvK9O(=YZFf6lL_-!mv9E3N;r%43FojU;XFU#U1U84`e+`2%_Idc4!H~ z^ascoPFPHTh>YQc5c(rz3@0q1KSoyhgr)Q+$m)|IApg_|E_5n!kuw~FoGRXP0kU^; zs?p%oaKwm=NvD=hbn0l||C{7A(6Up)+nr`!%|p(Y(@N(f=gVos0;e5|oN;)c)4{97 z$XReY=^e;faJsR?>E+0S$ZF;E(L0gV$|>VR&J-+n`Z@kEau%Ec`Vr(TIMZ>DGlL_~ zBdeG*6JK&>VXHHn<1Zttm@|id1(|c4E9iD)&T+1!JCHfYxe7a-tMM)88jg1%bB=Q@ zc01Q`h4^<@5l6NnpSf!r=DD`x9j;=`ckRGCT_srHD#g28WmxDc z$Gcq>Smdh2dt6nx%~g%}x@vH{s}}Eb)nT!#9`ASU!X2&#e8AO+C9WoX(6t*&U3+k+ zYcH0$n(-l53zoZD@nP3KtZ=pABd+~e={kUqy4tbI)q#(>IkvNW>c@K50RF=@h`U^e@oCo)Y;X&EQL}li2E-#g|=kxX*P8UvZtrHrG79 z>NtzRQ4pE(t$ynemXziXXac*zdCAN3J*=a5?Z}mlFqF zZv4dM#ltQie(I9(h${s@bNO+|6~ND3={W4lz%N{xIO58}FJ0L<>dL{dTr2RXYbE~6 zwF-~9R^!*MH8|#4i{H4`;kau(e(TzR6RwT;ohug?xi_KNy%{a;Eg0wCie7hKJaY~* z=eYCfBxKHU7tqPb?#o?Bry}d4y9h6HZ^Osj+p*eRj8D3EV4b@JpLUmGgS!l$bC=_8 zcLl!SuEb_{6~64Q#(nM@e9c{p2i$e|rn??H-MjD|cLVmg8}WU26ZW}x<45j2IN;uk zpSqjzh`R;9aJS-!dmsMG-G;~9`|(@%0i1BR;}7l*oN{;Kf8AX;9dF7gaukY^At@*Ktx&k_8qX9xw)FotdIT);DDWPS5{o_Ic)v%5 z6&^JE#7@K?`zocCOkXQA{c<>g{Mr1sAx6#qa zF4w!AjzM<0-eNiy87JNybUd=l^_I{H$hr2G(l;WzL~j{=6LQ|Y<#>y?0&n+LVxG4O z3%%96=WgV@du!->kn`@XrSC^pC2t-50J7G2>*)$)t?}-nE0MLv+dx+#Yl^p#u0>`8 zZxdaItRvptxXZf-pZ4y>25&Py<88r4Z!13Q-G@!yHh$G}$co_IkFDMV9C;a;E4=Oa zinjyXyq(zP?ZS_}-8ks&!3l3Ke&;=i)80P(!+QwNdHeBC?*N|n4&s8u!?-Z<2rfz- z!l1-qyeM%5LlQ^v;>4r4B=H#jC2JaGoK zi6=2CaTaxnbEr=|g@(k_XiS_(De(-N63?PJ@f=zb&tqER!UV4R#2~yRF&NVm7vrUg zA()Z41gjF4;$w*dRwpX(@kAxoB!=UQi7ISKRO3sD8f;J0;v0!N>`FA?+ldl(Cz|n{ zL@V|r+ORLtjvpk(;h{taewgUQ{zNx^l<38QL?8Z;DC1OO3jRCMkN-^!;7nqA0@odK z-6dw={}MBCHZco-O3cQoxRaRvUxx03fSMP^jrDq283ZQp8Ifn008HMA1>%zbO= zaO9Kst)o@QlS$utT8(`Ez72E~^7;EV(t70c_vO+?@7qjUkn7R61*3gi zIbuWZC4G75^5vu3SAZU0A+GQh;nluvc!O^{?_ZD1y}n|419I2q+d*$cc8tCfx)9kh z`by~{WbXBq(c6%{pRXKu`YN!-SBX#fs<7TyjsNh~;Pbv(Z1>gS8@_t%@a@7keGS;@ zYs9yFP57a2HxByt@bf=G)=l4D`UtWc@io&!$Zo{fLJuSBsjrnDL3Sg)ee@`@s`}dS zYu|nx^Bur%eC;^y>%a+LC-3|YnT>s2^!LaJ@pa?BeLXnq>&2ga2k{SIABH3y;++>G zS6os*{TE~;Bn{94GOs2L(h02B54Y1&YZ zOG&f1I%y8COFD%&CY{Foq(nk=J0l zycRE&*I|ad9xszOV5YngFPC#MOWuT6$eS@+-hx-kTQNt@!>iPF|L+(;B|5du8~XeZ*m!~mCNyZxdPY8m3V_(h3n;Nyiu;f4RS5sB-i0a zxgKwpcVVvFfVaqvxJhopTjkxjS>A)U$$N2&+>C#hTX3t~inq)AFi&p7JLLVCFCV}= z<#sHPJMb>K6AR@oyj$+ZBDn|ek$Z8Qd=T%I`*6E_2=9~ou~;6!`{hC0As@yE+( z@)CSbUW&VA0skp0aF49S=jCwRE35DYS&hxI249r5*dpujCE0+jvVJLyaIoaSKAy2@<#kk&c&t4n@~*N%zG5bekpkih9z&s=;S<%OU~!jcw|qTT!0D5h3HH! z;YK%|Spo4#Sf-#n= zLuaZ1U8xefQ_Yx^YDGEKhH0sG45Y^4WvLF#Om*Uwscy_k_2M`YyQ@29TCzSMR6 zxjsPF@znJ=lDYwZOx=hlQ*-f;)J=FUbu<2%x&?#%Tk%4F9$xCt=O<(!e-?iMorzo* z{zA<17vUBDZFr@BJLdR{@hblgT;VUltNo?8(qD$x_{(vXzXGrISK?}a6<+7B#x?#L z{F}cP*ZS-5dVf8x^Y6kN{0+F?--tK*n{b1FH{RsmgB$&O@n(NB=K5RkR(~sQ_V2^n z{B3xze?Pzf?Z_(QKR_2FtBk*$-hr$#{tmhXS!Mj4bSd(g`@86ekoCpiO+SpRFa93- z5#*Zn_tG`U3gSOV*CH#3zmKj%u4w-ux*l0U{QdMUWCigL&<)6S{bO$oJ{8Mx%GV}OP&|Sz??4PE)k?Yq#L%)kWz44!<-$T|H|13R< z{Jkmv9DN*FJN&2UDP)K5KTV%NW&r;@J&nu&{xkFpGH(56>66H6;y*{vBJ+d)JUxfZ z5B`N7{$42ZG{zr9pGH<0e=t3dtTO(^^cmzX(jP*fMXm+^68ao+E%=wx=aIYqG=W}- z-1Vm^=pf|V#xx}zj9f2i;q+o;7D`jmA;{B!G&Q{hxmQio&`XgyDoslZ$V{82qZP<} zm1dxo$a4DuHv*zye2J+Bdd_BI4v9V(sDR* z2eLY(t)TBjX05c9^j*jfFl`lmH?jjvTTS1C?6T6<;FD=MeGJ>AIa zkhYQTL7pC@<>Ietn{YmDGyayg1<#~y#oyEN@N8N>{*hLI#y}xTfg*l_3AtMjY(q<6 zJ6Z$97#-Mwwm=ES1WM5!D8tx5ImQJlFg{R;jzASA1gg;)s6kht7Ttk5^aSeB8`y=3 zfd=#i8Zjx*gmPdvCI|LlN?Jz zn8vEW3_cb($?v2ZnJojebPaO$19Nm8GD8MV(e=oVI&hkP2AS&u^Vl3XgRce7;(@?9 zd_8a;+XD-|%u#_L>)9PXa1D z98lw@0SylEk4*8eU?FR0Ku3=tb6UWFUj-yQ8ZhI(0#-a0u;Ez1j^700a6I6^Zv#&J zKH$cwfEWKA@ZpJojQ_{idq+ieHhkAJsLXZFxsDopL+lNE8B0)y=^&sm=vWa&>>68a z!Adap-o*l9@1lr}*ekL37B$AGv0;p{`);1ctS{?b@B04Od$xxk1HzOuaNp)b^KY@V zH0Anr%;SKiIWA}k;z%LP&x$QJx(McH8WsnxZ*k!UmSAkQw7@MbVYrp0C62H};7E%H zdn~PSl*Nl%TiW4HmJVE7H0IgU(ut12JbPL?(_JyQ4NDh#1m?D3iKTzQ+%_z6^eD`2 z!_tEugLz$J>4leD`rs9oemL3k9dAv+eD5p+=~T?wtYt908gn*l`JP^jd0k@}Mz6;_ z8dyfq8!?XwmLKTNnD4t~6ulMmeYcFEw`0yEE#vSWO9DP>NyNu2KjGt+N%(|i3O;F> zhEG{$;M0~_ILk5z|6-Yk&sY}VvzA5poMj0{Qqnai?;{tNTWW!Xmmjd`rI zq|yIi9_uVS>35jNji6n)SB^GFr+ z8$A;9NEP%u9glgW3i^W{jd`RBdQ6YSJW>VyNsq@oQUyJuf5bde1-+mrU>>Q0vgwJK z$D*LW=vkP@qM*O=oS=U=G8glDKjJ?4H9l#kwsxnBf* zLvP01FMGpu+Ta%&UW-qVx{TV`ETpIvw*WET|-%fw}Jl`O$kYkC{RK^ghgE zW>8r=6Z3oRpz`zq%wuLyMfwot=lnsH=_8o?T~Jl}80LN#6hNQA+=hc{(Eng=!$Gy^ zcbMnvpgQyi%un;I^{|h%0rs^v>$kLqd9<`PrFG2Nl(jjX4|6tU z4WhrnJc?RvbV1D7l+{5O#+*%AU35{**_1VyE{-{yvbLa0V$PpXf8=8VF+0FSdS!sD$=IG%tx zXRt2Clda3~3~Mr;XJ&tc!PvSqVr}10sFW6{1i-qkx zR%{n>UfX4y&vq3Tvt7rfY&ZE>ewf>j?KbU?x&7FFrORS&Gq!tlMa*r+_8VOpbDOdK zPFKa;W^8}Z0hlvV+he*0=JsRzldgj~3$;C?>tW6cY%k~rn6pP)HjcFYg*~>vaU0t| zyw!_&eQkS3x5Iq*Z69!q?Gx@|`+~dLj175g$9zw1xo}@w9^B7n;&^||_td7)12B)+ zHVqH8>G(%mKAdR#22ZdRWb+f|Y|vJio`m_%+KSRsFlU3d;`B7kYiCZ?aX!n{8FuY{8rv+5+fpm{+p48gv@wEYVhr-idi7 zYpX-=!aN4r>d|{JkAb!Z_@J#JK4fdm@xz$knApChk7CX)Y)$Fon6nF8bNVFaHf9UL zzu0UXIfJ=f*&Or*%vprZg)iBH@f}+W{LvPMKiOKc`HXpmVvoR;>>ga%-kRf8Fz0x7 zFaFlv4hPyh;HLIYxS72(Zf@^_E%sO(WRJsEdk<{0_ri92AMCLA!%q8m*kvDx-S)va z*#12Zu@A#7>?3ff{RbRoABDs1V{l9RINZvffFtaQ*kk_*N7*M~uYC%iXIsqkvV9sI zkNN7^XW+y3S@?*34nAg|hmYGA;FI=6_;>pf_75>fHMnZkwTdBbH`b_2q#=K55(&aF(TOGIQ3Yc4k<5#*8=2qdj zM_0kTZgu=dSHrw+b^K0O$Gl>7{DEsb9&@A)=9PluPuh%mW$JiFH^RI!b-bXPU~XNG zY&sBg>vH@>H^bbz9Dier;~$O$VQyWHceD+2>vDXc9hh5};}h+|+`1fJaInMJh@UNB zZe5OCbSUQ5<;X*aV{Tmz6Wt1P>vAY`B<42e(C8@4D;I}Ox53=r9Qo+Bn4b_jzM5iDkG)G|^<0y)|IEv%0j*|FChaa0n%x`=g{&>2hEMDg*kJB9$@qI^S{M=C$ zziB5RL7^}_}SaXJ9>1>I0X9Ujc^x%BX);Pb@i@$NU!v&lja6xA$T*%oO7j|~R zMVzs?s51^1bN0Z+oxN}gXCGYB*$>1955RVC?Vw9+zxV&=| zuHYPlD>}#FO3nma*_nu|IDf)bos)1i=M)^^oQA7AXW$ynS-7Ti4zA^#hif|*;5yDl zxUO>vuIF5e>pPd@2F_$`cCN$?ovUyo=NjDDxehmRZouCO70Xoab@4 z^CE8Pyo_5pui^;jbsXuui9OESILi4eZtc8>+coyB=;7Uos0vn0Oa^uxED z{`j`DEWYC`kAHJk#Lt|S@juS0_^mSlzjM~W@13=9E>|6_yXxVht_Il8)e!r;8sp}! zZ*h>TDYm+rW1A}o+ga5=Ec<-%@PFb;9Gz%5*1IMme=hq)qfOP2>nxLRY6%ZsC2 z?Qk1c2kdoq!fjohaeG%6+`$!#JG$apR@tH4yi34aPlP z-{W4cVYrWL1n%ql0rz)}!r!^Z;DN4jc#tar4{;^pp{}3sFxMnJ!ZihtbWOwYt{Hfg zYZe~knuEu>=HYR!1vtUA2q(Ih;0dm!c%o}Lp6p7-Q(P}ZNm#(X?T%qCr)zh!b@Gd@iNz5yxg@PuWonf(`UR)E&T>21g?T0DI*%{8F5=6s%lL}xD!%Hvj_8MuaX-Vp?iaYMI~&{Gf8kK~-#E zbZgA_%l!%Waeu+zyNylwn!9u1vFq=;SBdTc(=PC-s3Ke z_q&VYOm}hov%4fd;`YNw-TwHPyDUELE{{*UE8;A7W&De~Dn8>5z-Qex@HuxaeBNCL zUvSsM7u^l;C3i!7+1(glaes@ix|`x_?&kQqI|$!!+we`d1K)DH@MCvy6aIgTm{%h1 z7W7lhSJfRxKgaxr)ZLPPg}H~iBk)_d2fuT-#vj~X{L$SGe{y%gpWU7C7k6ju6WoRO z&4qb(2#&>m!Ev~Ba1ZPs+>5uC!8{8D_raBd`{BC5-{E?}19AP}!MH*2_t+IY47-Cz z;PBudaOdDrcuepZu4gRfmLEJ0j}K1ZNCM`0IXIC{#M}#lf5JZnPvXc#%cuw#v@DiLHycDMd zFUKo`lkvLXm3UY1D!eav4ezxd^NJvN9X=ks0iOuogii)o{(%D74jEu9r8Es81fJ974i=E4*7ulgnYt%L%!gCA;xcc+zZKtzYodt zEkCcrJo<&0@bC}?j}OssLWquk49SNRL%zWiLJH!aLJH%FAw}_|kmC5~kdpX7h#x)} z;*W2Jl*P9~%H!K174e;r%J|ois`ze50KOMe13wF?gTO+q_x+!ES}4hro|TQT>V&@Qwa z^XwKHi`#|9;r5|DaEH)dxKn5!9243PcM1It4+}9jg(l!xp^12Q=udb~=p;NhbPB!`I*n`i z74!8Eok8EjJo1OmqJP6Yvxm*0?U-lwuz9o-^Q;=S0QU}CgolJJ!9&BA;?ZHt@z}6r zJUwhBo*A|ZFAQ6Q7lp0EOT#vBJaZ<%W7sylIV=tD2-}I%!*=0)VY_i= z*j{`jY(G90_A@>ob`W0-JB)9J9mTi9j^hVmC-K9u)A)JVFZgBHS^OdFJpL4R5$6fN zj7{NJao+IjIDhy}Trm7LpIaf!{UZEVJTUwo9u)o?9vuEV9uocs9v1!>4-fwnj|hK; zM~1(^W5ToXxbVO5;qbq?wj-Ellkk7=x$t-RQTPY^B>WS0wETjdEscTPe_Q6lo|buV zR7(@?&{7HHbr9w@(^8|OF}IwSI_}akA1=`98(gSWK|HioVLZH5Q9Q0yah%YqB%adB z4^M67kJq#+i`TU(kGHj|h|^kC#`{`T#hI-F@Xb~=@ap(A0(&FEaJz_>I3^+jca8Ai zUJ&UoS~ zJ%8eEo@Y4D^8$DGWaA#5zi= z#oX7T0&u~o8n|RsEnGUP4z3wh57&umfE!0O#7&|aE$GgeuX$7$?ibY(kBExE@lhT;A*wZ= z80E#YquSwlQ62Dts7`ocRA-zV)dgRSip5u=;_&CF9@yBr7cSnq4=&ZZA1>GWJ6y5# zK-{$TU~FmqJ$APqhFi2Affu#@fzN6&=3d`=6rF^*kF*|xZ?ztWpR`WEPg^JAzgz!= z|7kr58{165x!O#_rP|EErQ6KHk!|MSs5bNP?lud!&OMl)7`ItO@54ModY9n!-lceh zcRAkbP3EoJFy{~6m2?{B-tApQ@5DT|d)MH{-gWp-?*{zTy9qz@Zo$vJ+wco-8qW6a z#IL-&@U*tO@r<^6@w~SC@q)HL;}vZW;*_?B@%6Sx@y)i!am{uoaqV`eap!iw;4baX z;xX;c<8kdS;+gF(;w|lN<8AGJ#e3S_!~5F(hO^rJj?c9F1K(}; z7~gOAC-!gu43};H0yk`*jT^Q93pZ~6H;!ok5B9WwhbOfEfG4*9glDw>f@ifiHsh<; zJ{R89J`X> zhl_Xc$NXpg@V*Y^ab|~#_*#d`_(q4SxLd~n+`VHBJhWpiyrg3toYb)%zRCQ_)K(Xd?mUIz8W2iKSjskFVQ`)sdF!^bnb)mb?%41>HHlo z*?A!L>pU2j@BBTk*m)SP-gyMB+4%?Dpz|o)u=5z)wDUOJymJC}c230Z&OhNVohM-> zW(w9~rs2FXGjje$n8&x6S@buU?{&-^x*+Cz9W#$EjQL*2ETD^GzSl8}=;D~~b<7gF zB<8*xvy}G3+@oWb)Bc#(1u@BVSXeIgX2UIf;vRIgQ<2e!(GK&SFoO^SE`Fi#WQ= zWgOGxDo*Zl9k1+i6R+=b8*l9LYqN@ma=B_o_A?BvU??}=P@!_1VTIvL)g~2J@NWzT z;tN%qRZKQ4t`=w5&c6<)8MpKA!p%~*^Dn|J!i55M;vxaNaIt{hxJ1BSTqb(X1&qN@0;b`o0bTI(fL-`y zKo9&n;CuXr>)C5~%k}IvyytrI8SmC@QZb+Le%(O)pl-8@m5m=86!ca$er`}0^Uqus zsBH8xul%O6F}Hag_BAiZ!n^^i=1odvqcm@!^O}pY&u=b{3z$pdLS{c)%sfl2Y%F1( zhfA3k;nL=vxQux>E@$40E0|Z}O6E1Vig_2VW*&#Dn}5bN%}a4z^KPxOvA+2muG4Jx z$BoQoaT9ZS9B8hHo0%(Pi@7Scngg)iTmw7JwXoY<2ZxyJ;ZSn}9ByuiTbUcVvNyS>m0gVFjphnH`=thP0TE?-BV!d^YTX}08<96O!$GC&H);Gp9ZjHM& zKCRX_c5fW#t#9nvxCidtxEJo*xDW2%xE~(S_&YqP@jyJJ@nAf(@%MOm<6(GY;}JN% z@eg=(<575Q<1u)AIB zKYkJ^@Y6^YKaZ@0Uq)8IuOiDu7S1KxYsSjCk~;A9&$S&_%aw&&{BE7jLbXM`i&ZY6>&Xw@g&gCLI&LDcctY1bcw$#;yY9K}biEXDHFy2^#UrogHpeI7M)6y5llTlA7{3QMi%-Xv z_)Kh#KQMA|o{>N8^!t*h&Gbss*ZNkNA7@zWTWNkQt~TG_XRUAb`PtUBzBT9T#gUc;u|>sxX%{fW-Pb(T3BxJwa!1v5j)F+z7yvscn|tco}cJF z>^qx2>^qk}?z^2n?z@9N<$H`i<$Hq8@;ygq`Cg#U`re_>`rf4<`PN<#XL#gWcR?(! zzrf$;k*|3{w)K&3qXoM0k#Ca)ejEv0pc$X|T39~uwX%HT>ty-F*Uj>YZwSjLzM(9i z_=dC0_U*VJ!JF+Hy&%#1+IK4b+IKqr#&@;Jcmv z;JbtVIi25BVPOKUv@p?I&}5|xn(TBr zQ^vv*<;$7&EId^{##CytX6$QfyZ9$>UsLYE|PvOXg#o5-e zrb~-;<5<&`#nU))jrSUFy3caF=>f~}rbmlsc*mQbupDoC%5uEv`Qlj|dC4-t^qOUY z=?%*S)5pc9^Cy@-vrI4l5Fb) zQyG>&nJTcEWU{lFWOA~ZWO6S#oqv)kgv}&VD4R*9aIS5VsTIq~rYM$^O>J0CHnn9r z+0>rpWK&0$lTFbqC!1nePBC?3ImOhSXzqt7s{XF1cfndMB=R+ckO=`3fO zGFZ+u?O{37w2$RXQzpwbGwHN9s!*YuI)T+?Tk z^GrTTafW%O+)1%mO*)-_o=GNUTj!bbCh5F2f6_^g6iCvH^G!uq&NmffIp0)@<$P0V zmh(+zSk5<#bcf#q&fMpA-zw`osOqW6&LE$?;6^q%)RWcr-6fFp*b+15iQpQXC- zkSX`lMI7;6su@q3sxM9Oo;1~5n&`b^8cAO<#nabKv+3)mx%3UweENoIA$`ZRmA+%z zPTx13S{i4#Z^~L4i_a}xz>y1ll>4Sje3bj9D}0purfYnZho;=i61)#hzRME5&rKER z=cY<@wy6o7Z3?7co80tkQwaUHDU|-(6i(+6@98|^BW)7-mnYx?%M-mq6rzPFLMx&e zt%wq|6qRTxs?fTqM(d(FT|ijr0>Vxg7h~z-Vmw_!{79D&6X=p+B3)8Urb~&bbSW{N z_7gK{KQWswE#}gt#eCXdETsL#V!FK8L6;ZlbVYH1t|$)CmBbOck~l_J7ANS+;uKv) zWYJZ`89G2*p##Jx++cees!YAPg%Ku+NG_uUX`#&BB*%BucM{Gc*!qR>a~8EBt*LiApQ7t&K#L z6}qvJsJ6n7Bh^=E#z4`G_X-pi-m94ip__?N+9IN8i)cd!iMDi*XiwWj3~du#X}jn~ z+eLTUA$rmd(VLDC5Bca3;t?M`LOkW8M~LTq^a$~ij~*dj@zEp1Yd*S1d}iqphU8f6 zlU%rjN90b@K#m>@Ie&>@L!ipB3#cGFWyOdsucC`;!0UNG8iZ;#G2jw~u(8oapT*3@HiN zCneE4P?SoEGYk}^Q(|$M6n~$AqFhS0b)cw_q8kT_N-2IEsgj}@2aCEa2aEbF2McqG zx5!}8h~;3>gymonn9`af%~%c*R+dAAo#hbWW;sNJupA;nSq>55EQg3zEQg7XEQg6` zmcv9>mcv9hmcvAMmcv9(mcvAEmLtRvmLtSamLtS)mLtSSmLo(w%MoHU%MoHM%aP(o zmLtUkmLtVPmLtVvmLtVfmLtV;#*0*z@nSX0 zQDQyIQDP&@QDQS+rBPxl%TZ!G%TZznU!_qZo#kk;hvjIokL74_fa@GB4zV09j<6gp zj&Yr%#R-;UL>9|2;tb0%;sVPt;u6a-;tI<#;u^~_;s(pH;ttEP;x5av;y%l<;sMLC z;vvhi;t|WS;t9)f;yKH4;w8&*;x)^0;tk7j;w{T@;yuf8;v>tSM6s0#-k(H?m5JWT zq5?fxRHCPdYAbo>71dYr%q!}y^!J$}>aXOPSD07w%qtqL^y5gAl|1u`W-O-)3(Kj( z%5ti(vz#iNET;-L%c&xSIZd=@IZbqAIbB5anM@Zk zd?qtRcY3DiNzWGj>DgicJx2_p=ZGQnTrrfMD~8iaB9)JlBv$iLlEivGN|M;fM@bT! z`6x+ZD<36EZ0Dma6B)eMGO>sE+9{$_;|x1ROlmCdmg?`bQ*=+ww(b-?Q+4A`(L2?T zBYjgfW4ai?GF=Q}nJ$K~Ocz60riQRnl zustBMhq!mp&tWR%vwZRk4OM!gtkCj)+y+)-ys~6~_^| zN;jSrg;<^yMOdB{#aNydC0L#nrC6R7rCFX8WmujUjaZ%+O<0~6fh^C9W-QMO3(NDu z%JRIhv%Ds{u3F-~Cc3e_Cc3k{CVH+~%8}kIuZg}auZjLFZ;0V6Z-|jBZ-{u7H^gX` zH^f+$H^g|BH^h%DZ;Ht*Z;GibZ;I(GZ;F{LZ;IJ0Z;H7rZ;JUWZ;2$9x5P4*x5NsT zw?qodTOyU^EwP&AEwPs6ZLyi^1gV_^1k@U^1k@Y^1d*v=FCU< ztmceJ;sil_JPXkwd=fr%3Ah;%6j&J%0`w}`Ec+>|*ClggEz5q&dY1i^ zjV$ApH|tF0eS$YxxwAgeo31q5kbo^461}^X5PG)~O7Bs^={-s-dan{m?^UAcOr<-W zsq~}|Dg)?)${;#R*}Ngnkfm(h5Q}$ga1_Z>(l=yVvy_Ytx-m=Hv%$uZeH%36IprM7 zbIJvl=afquj@LS;Tw!@mxyJIGa%00$j@)8-S-H>hvhslCW#tLid0BbN^0M-r?|Y@@CVpYBcSm#?ZOcu5>Q7 z8=YJ2PUlv8(s|V0bRM-Y?W^{ueboW9qE4q3btbK3r&1I={M}&aZBy3#l1&A$1R3Slve#Rx{~h>IJ%(dWkNsUZIPt*XR=J z4Z4JSi!Q0&p-ZZF=~C)_x|I5W_ER6ye(EFIUwuydt1s#DYUpNOW2)hs6TKDGR&)h5 zlCG?Fq${h@bXBz*T~+N)S5te^)zsc}9d$ZgN1aJGP*dp!>T0@?x|wdIZl#;3>2wn{ zgAPLuE$UZJh(HQJ`$pl#|c+M(X39qI$x zr9P!y>T}wyzNFpiD>_(xO$V!Q=n(ZS9iqOcTc{uD7V2j@OwGL|0sC%A^oFZ~4p&vW zr7G!`YF;{0EkZ}C#po!tG##aup}lGq+N)Nh+p5*+wrWkfqiUx+s!qC->ZUuXA#}7F zN=K{V^icI7Jyd-}k5uz-O~3`VCVGER3(-HQMd*077#**cphv4!=+SC5dc10;$E%I# z1homBpa#+t)lhn(8cxqt2hcOsLG)~OI6Ye(NzYTq((}~u^nCS4dcHb=UZ75-7pRlz zh3Zs#p*o#jq|T%lsk7-N>Oy*nx|mKE-HLdbzruPEj-I6!id| zsve_L)f4n8^%T8I&7#++7w9$WC3>BDgI=fJqBp4b=?&@wdZYS~-l#sJx2nF|60q2o z=uJ}#ZHqIcsYSNM;u72ZebUrY+p?``YUypdF-8f+vCyuyT?p25K zne0`E^OV!)g4^(aW$Q5 zKCWi)*&bK-aLwn`C%o4=^(pUlL48YKP~X!R)sOT=^)r1*HEd77KHC$$m(|?#W!0Cy zq6+$os?yig{PZ=o0DWC8L|<2n(D&6g+c}?9+ivGPQ|-9@ORoEB^mfiO)tK#^i>h6> zf8t2D?V9nKn!)m!x`*X6HFLYe@k~9y@|k*w!qt45~H<46?CcWPUf@6`4z z->K1QTfFbo7?$tUt}NfF-O{#kq&v$GYJZj=)B!9%s6*0f)cc?gW%)rJ&hmpgGA)23 z@hlD6T$ToHK1+kPFwLJ|WiMuF(2`ghv}OG54B85oKH5H(K3XPAAMF53AMFrJAMFTB zAMF@RAMFH7O>49x&Y)>ccEsXlJN$h#&9Wogs%h38I&Zb_@Z*Schh{9KjoiU=ffm1m z=K^gsU054S7u6=yMYXAPacwqTT$@Xm&=zvdCA7s{a|tblYc8Rsa?K^Q)m(E4Z7tVa zLR-%@`)h}IFMsU_?^Q-SMwih}&}Fq#bXhHnuAp6^D`?l~%G!Opvi5+kqCKRmXpiV> z+H<;^_L8ol`RDvSS)w?`_$0#?##B<(DLupjWx6aJN-CPXeVd9S}~S2wGu3A zYNc7$)XK1|sg+|{Q>(zTrdEk%U9A<%x>_X5x>}o^3(R%3wk+#v?OE2_aSb-@0@q;EuIyY?#HL;28f@APuED0=+PQ!ucen<- zcAuqPd%)7JJ=%G_h+TWa(yl#aY1f|byvmW6EC*_XcJWg+ZOATus-_L!<==RqHgXp~ zRny{k@l!Qz^e#V+jNQdgz_j%&hiMyG4%4>o^7k30ZD%=5+re^}mcGl6BN;4z(4Ow% z@n3tsi^qJeLG@YWAp;NSSbgEW`PSvW> ztF-F$Dy=5HTB}X3*6Pw5G$*}5bJH8O5PG8)N^jD_=}lTIdb1WuZ`PvdEm|9Ti`JIj zrp3_Pw61iT)|*b#`qJszNIG4Mr*~0R1bIzt;zXJ|jtyR`}QZfzpHN1IIV(WcV- zwT1M4Z84pxCDEDMGWut21^u&@LLb%+(TBAo^bzeCeMCD!AJfjz$Fy_waqR+qT)RY{ z)b7wHwY&5w?LK`0h*$^f}G2hi3%MXAjQ^nxHRe zDt%Ft^hGT%eM!qtU(yQDSG98VRjmSjO{+v-)2h(dwQBTrtvY=}t4ZI`YSVW#3w=kk z()YBs^gXRTeP8QH-`Aq)-?SL|H?1rEKrX${hSQI= zk@TP1c=}K6NBXHYfqtq@q+e<&^h+(3&em4b+1gtAopy?Tr)AOawKMd4?Hv6q66d^IzXPItIG>?b$N-dA+OLi1MJn-AvY}n@cm@TsESu(oS2YlXl2fv_nSHF4>lL z$@a8ccBI`hnhusRbg=A7hsz0cxSUA0l#}U}aw^?QPN!SRnRJAlO-IPNv_~$cJu->* z%JsBYZlv4F&2(G2m2NLH==O3C-9hf7JIGABqdY)&l!xd}@(A5Y9-}+UEV{EiL&wN- zbd0<}cafLqF7gW9RbHdJ${Tbyd6(`c@6&Pe0UakF(%t1Fy1RTr_mEHN9`ZTeOTOI~ zXXqv0?~BEs_qD9sOB(iPTYE{L{kpN2%)LL1Bfk6j9gvj!`5lnVyPw|y$s%+=S&Z&4 zOVIsgDf&BEn*L6fp$E!p^gvmi9wckhgJf-bu&hfDmi6f&(o7GLjp(7W89h{5=wZ@I z50iHK2iczfL3X4^%f9qz*`FRG2hd~WAbPAELXVY0>2Y#6Jx-3K$IEznyc|s@%Gvw* z`HY;qpP$>vh5PxrjaxUHflQsZ7Gk+X7GaqrOR!9mrC27((kzo?8J0=19LpqGfn}1c#B!Oe&2pKn z%W|1CXLb%;CL6I_CY!KaCId4&aikf`<xwNxfE}fYTn=Y4bmdj-b%jGgOvjIoK zS+0D$A8}I?I)E zCd-v_Hp`WAF3WXtYbLJ{<@U@(?|Qj|UN6(>4Kjn?AotLlka_6?GCzG#7N8HxLi8b7ggzvT(MMz% z`iLw?ACuMSW3oDZT-KzI%i8p5X`xR`E1f0nbe43|XJjaSMuyX8Wh?rujHJ)WDEgdi zL!Xyz>GQHZeL;4lFUV;6qKu(0%C7V!*^Ry=yVI9tPx`X#O<$E0=&N!feN9fLugR(O zbvd2BE@#p=thcjZR1Xl*{X#yaU&!b5OZk$1DPPgq@->|;-_ReV?*Yy?q&Sf1{V3&uIKxMo_dqNzaA086 zM_K4Vw)LYdazHnJl*JBw$B_~TG~*XJg!lR)hw@&z^r>_%eL9_6pGoJ|XVZD~xpW?V zJ}vb1w9q%ws=l38^&PaXAE0&p5S>rYqVwrz=mPo;x`2L*E~dYxi|KFZ;`&>AHG*+)2`ub41zCN5b>!WG2K9&yDHy-3S7y9Od{6<6Haj=dhP)|R| zZ#49bgZ$P*-*d1QNA?}mj5hrdOPl_LrA>c+@JlY6{*t9lf5pYkW$5z{ed5T%Lz*!{U%@g$PhlCMuVxvcuVopb zuV)#dZ)6#vZ)WMy(^-1-43-{!-=Pl{kDkfWqaR@D(GMMZ$B`o}d+33O;|x9YW`|?3 z^>B;)J#_owY-*)$U8QH}lAfXGrDy8->6v-~dX`>@o~0L|XY0l2*?I|jj$VqMqnD=V>SgG; zdO3QYUV)ycSEA?ZRp|M8HF|+wonD~Vq!;S7>4kb-IyS@C&=WS)^5ws=>TBS?W?@j_ z8~FEFvH$coHalP!l;!vyE~{|4pUXO2HUc+vfSk8={dzfw%Mmd4>z{M>lju3H6t=)V zI0|Rs8a#w&kaIonxy*SVBcC8Y+4`SjImiERs(gJL|H-BQc^m(vn1TOOlOg2mpL4Dw zijIX*|2dX(JvnbX0F%ESpY`=}A(v}lJNyhM;2vZ{UjE^TqQHOb$Y6yC=m7m-Bus)i zkP2JjAp8Q?;4%CSzPSvB0#FGWfDZf;adoS z4$uSo!+4klsjwX~;4oZ*yYL1~c?^bPPz7p1LvTVUbcDlvZDP6n9>&9bSOwc*4;+VI z;3C|Hr{LpjFbF6H<)Iqne68zp*#z9s8ls^)41zH*8IoZwY=M1n3NFJfcnsO_2{eA@Iqf00;6CG%z>4#5%$7i$bw7o z9R7hk`T6=n05k#{gg{$}f$w1yOoCak0@lJd_!-W_E%*Q`54HuM98`n4&;+ay0+G-j zy21b$0b^knEQd5W3FqN9{0V=7D8SzrszMX6LMP}B{b4lZ+@2?JIRh5La##afAm?p4 zoTSfx{qsXEpTTSJEy&{z))UoV5XjDWV#8G6D%7y;v9 z3e1J2uo{l>aW-+827BNzWWi;)1Ao9vcn3a(cwB%&PzB7;3|!C(+Cf+714AI^^Bl!x zB20xjkOZqB4feueI1Lx!7CeSm@C8I+o(G@|)C4nFAs9NrU^vOgNZ@i3%!CE73|7HL zNP|6a5Kh7c`1d*ZCj9`O!{6``e2e_==bfL+Vqg2eU+@2R8QxwAszY7Kx!%THTEGow z_;VDOouNN`52IiTEQEhQk7Rl?WWXUf3FqJzJckb;iW&?>pbRvF3tV^3`-jpwmr-1H zgl^CmhCn?02vcD$Bta@{gdMOCjzAV%f?wecdx z6|{vI=m`U0IQ;wh=3I{b&z~23?VNLxWO@tihJ$bpeuY2a8T>Odekp(V72Xy^|^ zArYp-0!V>Pa1_qNE%*c8z-P$0UQya$$PdNgzhB#${5cRD5DFgX0NtQ3422(I7Oa9a zH~=T%JY0u+@C4q1^yg~~rJ*haK`3}28hXJ%7y;v88q9|kuny8-ADo0Ma0ebiHhh5G zWw;N5A5?^T5D0b%g(&C*Ie*7EE`Rvi312U#e7&5*6?PPy)(9&h4)nmkq%Mt)LSOg~>1nk{|^(LOL9P|9)St@aJE@9((kk zx4op_g0URW=THzzK{*J3dhjjSAq;Xpmo{8RLoay1p9gX|7AC_iNP?BH3HHGe$bw67 z3m(8T_y9_IJ|0wn>QEm7!46^28ahFD`1k8HfFAjuKmYgd`Ty!4|F3P%*ZSY<%6Z+C z)6?0^hh*3e2jL`~hkNiCUcncT75?{gDa&PbXbKJpgLcprdczaO zoQCW02fToP;0q{KILC#uP!;MxV+ev^h=6v`6NbWQm;f_iA*_Y1kO^6E9iG4|cn_i~ zk8j`)m7x|i1Pg>iSLg);VKhvD=`bIb!8+ItXW$O}0e^#UH6A~pGSmedL_!DX3E#tb zm;wtS8MZ(M9EFQ;4<17{d;t-_;}VpC`rw9E&;k0uSeOY5VFj#%49J4Za2tMy=a9QP z=N?cBszE)lK`6w*2v`W4-~^n5+weO)gTKL4gV&}|2C6{|7!DI*C2WTSa01T5U3dg9 z;Vp=oJcmIsC<9fX9@xPHU7$CNganuk%V0ZX!ZA1tzrjm*3wkZi=b$_UKnLgsePJw2 zg5|IYcEWME2>0MmcnzOH*5+#r4(I~IVJ4))KKKQ0K+b*dPcC1>=l{dkT|h^1{cRkd zncdl0#a)WKG-z;w26uON2p-(sgB2-IC{o-txE3hx4#lCxUElAW%-sK;p7u@8=iX<2 z<9BCvHzD01RxYk5q(TPdL1C0fb+knv48hM>g2OnC8+eQ_aOdW=0I87~At;TiXohx( z#9&Oq0xZK;?7{U6}-epsQGyOkQix@1-VferBDTR&={@J83Qm4 z^RX5u@DOkC1qt(WEg%F1P!X-r8N)CGo3IlHa2)4x53itv@>n1)k|8HT5r#@=gf8fX zDOiFn*p1`3f;)JOckmYAyif?GPz#OG2K_Mtv#|*4u^k6-6HoCCu7X@=NQsQdhoWeR zR_KoY7>7Angf-ZL-8hU>xPdot7Gm6yAB`~PrN|9qP)jN8e~BziX$A=P#^8k8-p(F8kr0^>f~M$Vaxj6NN*qd01#6}qE8CSyJ}V;|1o8MF#Kcc3(Cp$E2NFYN32DEUm#^c^cd zw)$7}pWvv-&o2=lS&$2bP!bhT0}as<9nk~*F#^*t7mKkPJ8=-F@F$+(JzSM|{XtTs zM<`0666&KBrePV*;0m4~L1mUj9kfMnjKvHr#ZlZqoGOeVA}|dP5U(oN4XU9fA}|Eg zuoN3`02grwZ=h7;9zl9!M?*}Hywb(8aAuoy`9O7}VV)b?CTc9KQVFYGlA-3Z%PT~@7 z<0)RlS)1z^p=gFK7zwfMiS#q9Jdb_}R%1I3;uJ1JEc++@6MTeLhx-HZkqViS3x!Y; z710EpFc{{(=x1U+mSG*X;dh+HHQd8z1nTmbN~nd#=!U)+iYZuz?KprFxPY5@ zj5qiOqaKera-jq&pdOl`3kF~uX5&|E!af|u8Qeyq`aDk~4{D($`d}!=VH%cUEw*AW zPT&Imf};V~D>5NJs-hm6qZbBYG^S!M7Go{8VIMByHlE`n91R&KWI#^jM>y(WFeYOz z7Go8naRA404%cuGf5Xv;_l*#*?-}TGpdd=44w^tbhC&;1SBygxW@9sU;Sf&X7Cs?X zqgi6SHU;BVo&!^Ql8G9;>ES-`1*&bB(ZSed&i| z0%kzWn@7JC+i?gF@By(~F)k>AGN^}Eh{Rw_f>?hh{X+bPjflok+=9}Ymp@Fz8i?h^ zG2XQD1Ns;EU`;D+cpQ-s=^>WQNnaG<5bIZ^uZNcCiAgZegMK+S;Sf&YHlE-k+--Rs zLKYN8CA7yh?8F1S#Wxu3cx^#C{D_jMjh2YONbJBNoWM0afzh6ELlR_xI4+?$xf&WF z0{t-=^RNVKunqR|`^ZOe8_yxe;T`=q#OuI$ATx5I5K5sEYNHvtVIW3fGG^fy{DyVd zj@x*F4^TVu+zqk+c=X9o5|vR0&Cv;wScx6jk7GE8hj@cHop|m+C@P{c24OzF!`qqp z$cL(Ejcyo$DVT+YSb>e$iE~KMg~tNnh{Rw_!Xm81ChWo=xPZHO4?TjhLSd9bT|{Co z7Go8*VIR)n7M{b^mB$geQ5x0I5N$95v#=I7@f6?S?Z&tv142<1jSzt;*o$Mhh}(FE z4@lgdYXyxk5M!|ozvB&*9z3rh7s5~#_0SIeF%I+a8`k3xuH!zwAYIRx$F-2vm!z+S z78r;q%)=^d!cknoLp+1li`PkHMhR3v3y5o_1N}hE$3A>Qx!#Ny>Y*7rpgYE6E_UKA z5=62sG)7yD#0;#!9vsC-3+ zpsWo1-?4dva)O}zLr~5flye8=B0;%qP_7n~8wBN6LAgs%?h}-U1?34rd1g@lB`B{5 z%A11n?x6g;mCpv%t_J0MLHSuw{t%S4LH`>wKRFS^<1K!!keZw|Xgc`1`nR0-AItvR z&nAkoOj%SzeY8U_jKD8gj%~1yVL$ngpy_|xZ*cA6KbHNsW4O&Se?eTwZ|If5yapoy zQXoCVyzKOOtz3e>GFqY=#$zG2-~hxi9H+m8yVmqm`ZrL9#LRcoC&CZNh@7a7ewczK z*p3qr$9;$XrIo+Yi=T(Z9m;bq#Qw6<=S3JQp#{WxLO1eYi1QdtKN)lJ8#duAZsRH5 zz&(uTQY6KXD2g&@fSwqDk(iD}u%83Ak@rI!kJ#@Y(Vzx zdqiR+CSopr#ae8|9-P2cJisfcBYCfgxJZr62thGaL@l&KAI!o!oWcz}!D|FYagNA` zDyWOL=z-ywhK)Fai}-}}qq(L~43$tD?Jyia;RK%I4ZgyDJX~XV&WAny134pdBGjsj z$E5_hV$ig`{D1Ye|FP`9J+@6*rY#0w1SVnz=3yx|;{g7^bv(dx*!%oQ*2Xf{$cP_d zUz-Jkaw&3Ui1oyA)Fn3$nzpz1Uwy}aEcPpFdYl94hL}>xA6!s@B!*%zVAR9WJ6KZM{{&UPYl9nOvWrM!5VDAUYx)y z#F@flfjkI9O*BMHbi)u#!7TiOFrwHtN}?i~p)>kHTyIfU zzmk3nPU4PL6Z7Aaze1nNxgrB{qA1Fs3R<88dc(ek2a!i%2IgT2_TU8G!#j=Z4t3EC z5g3leSdGotg+sW8hwx43Jpsf%s?hhvcudDyh`P8pwv!J8P20!xU;T-HEcVV zJ{-jvT*2RXi?7hsUt`Ny*V_8hQ{W%l71F5)TP;yVJ%xQ37uMNkzTFbK=B0XuLOxA6qt z-?+b!4%v_!MNk%1Q4h_~9=$LGV=xm7upHYV&gmHaSu2a_>*V`*h7VAe^Sp#K$c2I^ ziMnWtwurz$jKoCDz&tF$YV5}ExPqs62WsFHgcaC;T{wxG_zd4_t_9>lNmNI7^v5L3!~*<=_1J*}I1c+Y z^L$Xg8I&Idezugm!Sf(|) zqCZAr8s_3xti(3##Xt9RjM_sy$9sH-v6gc{3ZzFU!cZ0U&>CIPAHy*o)3FFEuocH} z7WeQPo^>(%PDY;&xltJ9Q3K5(j;#m%Fe^`||JBOT^apVTf8r$q>v=suN@PJ8%A*y! zqd!Js5>{Xje#a%;gJ%QpKamFcQ4x*N0X^_5HexS+$2Hu8zL9$ZDUcs!(FlVv8j~># z%diPY@C@$|XA{rY$c(}WM>~whHtfSOT*qU)gm*LFTObuePz04xA8incF^Ix!EW~>3 zzyT!O!g!-B8lw+JVj>n|6%ODmZsQYTZ{_?Df?}wF#t@HDTl%gTh$zg)dPL(Gp5Qf{ z+jvY+4fW9vQCNgE*n-_SjH`GA$97(0Q3`d?62mb8bFm4x@CZ3}F#hO|vG@g>@Bpvz z8IEYa2SjF+Lp9V#XY|K#Ou!s0!4@3ASzN6HpICXq%VnzXo`;L0Wq&1{V`oayqYiDqbz-msUkpBL=u!PdOx^kUvd z`V&^|0{so##~Z6A*84&h&somh+!siX9H@j^Xp8SGY1 zunrgS7xcZHCvu?(Dxe=mAPT==8P?$pu0R~$1NvupkGT7I9zh6-qa3QD2|A(&MqvS# zVi!*00p26Qex5gw9feUIHP8SZ&>i>i3ZD_@0QUnjz#ikgRxWGx_2}E8KW1SAPU8w5 z;RBR|TuTt!5RXeza=M^td)xoj=lI96_Tw&k`{#?|F$`t7lBkTjXpDB~i&2<@S@;F( zaUS>KKE&7{JxZfC`d~5+;uNmp4xZs1#Qv1Stcy5Efegrl(x`{#Xpi0)hDrDdORySS zup5VQ8aMG2uki)GBa9RBp&DAD8wO!I7Ge!{;|R{+3hv-3-oPI7Z)ErH|C|1=v9{~+ z{;}-8jd==|$%cF=hR2LaIK9|Lb^7|~fbJNGNtlTR_={zh(MLo4o76#iF{UT2Ueqp= z?*vUhC4UW?HjeUs2iZ{+)zAdpF%)8ZW9e66Gxp**&f_}b9OHEfRnZ<}F%`eyH;D6C zN52~va1#&k93PP9IQzo{Ovleyj8)i;^LULP{^0op;&|H8cf|-kuF^9Yu ztFaOLAhvsy{*sk%S^Yz+e@-vfeP>O_Ir+b167^)(bb71LL7xxBAm*2`>Q${?)anQ2 zmO**2mB-Of#T+bxSZ4*jIMz*8FKWAk^6x?UEZK94=T;;|8stPM!cYZ+@H3WTJNDx= zUPC#}I1D_)J6y8sGvNT{44h2gjK&_^*8A6TlsJLFGzcp=QI>SDRjp$h~p6El7AJ` z5c}P4&HKaZMeSlxz8#dGkl*2(RdZj9*=`)GPePv>;&~@CeTY>rKp$r1a`e@#+P78vP(B@$uaf_SSmvWu zcifEGm#77Ta^j$zh8z+!U5H#7)zLJlE?(=}TGJ8qBe4LRu?xp>3lH%T#x346qBnNp z7XHE~xNpZCXDGcGixO5Zj6bzE&p}zg^S?2TO>TmDc!Kwc`zOz9sEzjMjiDHa8Tbt+@B!`aGL0Sh z9d{A;9@jOVLA}p=X(UE!c&1D?;&8H=$RTX7I4 za1q8smO)*t$0r0H@qCT+D1mcuJmx(m>Yy#UqA!MFHSQq!6JEzq6zyM6a z2He6&`2XUy23b)6t@xz zwtt0Q?DMYGi`w5o`F&7U-*HVNGeS@mbNYQh4*G?fc}_+-MEYINc5H0I^;toyhDO- zTmuNf7#v2@?~DPSAeF-3mq#I#K|A!qFs#HT7%G{uN=Tmt6;T^au^-3r2t_qjDT}JO z4%MM5*^v*G&>jJ&swBlMEX3~!(OD0TFdtX(8eW&m=ZmRIH}u0I7>26ELuzD3HT1>> z)Nrf()kl@TGpH)_unULr21z}tG8~hz07viypAp-uD#_3hBQXJ6@c>RfxK5nApZ*6c zhtiitRrJPMh-LUtedU&wAJV_D@&|gwuPVt=2qn-MVx6({`yuWHF@21D7FY2a>G`7% z*-;3k&>Q?2H)Rb@;yUi*$5^UT0F`5_N*#>CZ&)v;j8TaFM+D0Lv~a`ZFGk?zwz{QtSrv?u$4~- z)vgBRdqMdb`5hbydCZUrVjCg!V%vqRUernllq1~kKrroSRpxvUsqTQ+|JD*6|rkAAMt~a3Fp|_%q z)+f;J)c4Zv(%;bT)>B+ar0mfP&|ddXr@iH$L;Ef8jW$W#vKJF6N#i<)@C?L%T+iS; zCeAh;z4&s*bY}aGk;~N0D=Yt;7xMqiOZk@=otUrS^}e&sBLB~NpTqxqe@V*y_q+?0 z{(D~9s{cK2P5u9#H@E!1&lBfR`9ID<%p273-`5l4d8P5c&lBqvuki2l+#$R&HTmy( zo&Muk#Qyp;`}g(4yv5D`eV#a$-L3w8p1IAS{fS3dTtg+MiT2qYhdI^3oH`xPZBETF zr_Sw*nc8elDOX~qZkSW`uEk7!G^avt#7w1}F18u|CT6ONIkhUxV{S9Toaz`JGd0Pa zT2MV^YKu9Qrf$sCMRTfE{g|om=2WS6F;m%Qh&{Al6f;%JoC@rXnTjx{@*Rnpnqf{A zJQ_2#*PI&tN6ge+b1IJEHIFPXQ*865H)blYIrSz{%v7W~H8Fk6)NFHV5?8!f^|8Oj3uf`u;r=(5YF{Oa;6i?IYtu?)XqIaXjL zR$(>PU@g{RJvLw?Hes_Xplor)Qnq57E4H%T6<68eil;=o;`2G4@s(ZJ?Mk5RaV1pt zVxKFKvfq_hIp9jF9CRg94!M#mhg~U@Bd%1+@2=F!Q5?f@{DBj$G|EYw!f97}<%}zX zau(-s9v5&Cmv9+Za23~Z9XD_jw{RPG@F(u#9`54-9^w%m;|ZSPFZ_*Xc#ao%>B^|Q za%ECp;|<>89p2*uKH?KTaE4G!Z+#cAYHbR)mwf?*U?+(seA zV-!=o@WGFOQBsLzlu}|N4&ovn;v)ePA`ucJ36dh25w0XR%JDg=6_u1mE#(KKLTaPF zlE!GLq&1o;>5$&&uVg?*W1Nx+nUMuqjhRX|W3H0j_(jQqoW?@sM`H`0x4K2ih1^E8 zk_UN>T}nRWM<@!QAPS){il8Wpp*X@&0wqz(*sYW{_9$hHgM5DLVI>^pP~JGAR6s?3 zU|k87jpKZ_>v5$jsu?Gg>ZpO5sAZhyGha_Dbx;@eP#+D@(732HLSr;Bt}0E@%($mC zM+>w>E3`%%v_(6#=bPOQ#wVpCIvGy2v!Sb95P`1fW_Z-@=wZZFd!iR_V0s&g)JXI( zlB#`;Q6>Rbrxo04(1x2)SofWh*ale0e-D<& zY&Axz+lhH!j^(c-RJJjR&!-!T-;3Q7rG|u2G&fz>R7(3OAxMb{AFB|*RE4Yel#zFPEaY(&^ zo4AGB#u4?7aa8@&IHuk;PN?^clj?orwE6%K@d%Ic1W)moaYp?c&+r^C@Di`^8gK9x z@9^F@uYSNsd@?SmpN)&^7vqxp)wryF!*}olT~&2oQ8hT+*Howbx~jwFzM&d$!vimT z@FRd&h>bYz+iG0IbKh6vyC0|t+z-`+NQA`hM`{xHUuse$Lvo}*O8kISNR2e^=W1H_ zOEn$RBLgxbll!%r8Cj4O*^nJMkP|;51i6qKd5{;9mIqa4bk0xF^sDx(Ujq8h5B25O=fYNL+(qgogBP~ZJYZGeVo zgvMxsrf7!dXyN{>wnQtmMjNzse^J}HzpCxs-_#E1=vK8(ZcXcqE^en5;nuaT=;n55 z-Q8}j2YR}_S}(Ux>+SYyk?7+NXnoPo9b4<~j-w60Kn!xn)dsucX+zxcwW02W+Awz_ zZ8%0?q&u-T%AH&rjWO<2+E|Qpr{QnghwxYHL->32A=)H&er>Y5h&BaLn2Kqbjv4M^ z+D!c94%22~Hs)Y1es-78=3&0Ow6?%qM*GEGQCo;b_|;uWTkNi*Ex}SO!*5uQ6lkQR4DV%nX)6U>5&fz>R zxF=~BaS4~*v$ZSkIoehCTMYj@mhv_IWzwY%A{(+J2Xf*^Pf|w+av?YJcv3j>BA+L< zBflrBBNPQZ*&PK@$n&G4Fp8k4C&W?AlgClqliv}B5-5pMD2*~G>nZ36_Y`xKLwQv2 z6n9kglyX$^)Nxcs6;EA9RaEoTb5utS)I=>$eMfCi6Gt7?MLpC<12jYyta1F}S?^egMV`%$Up-qK zi?PJB$FUU4@SA6^W4Y&d#|o^(Dy+sDti?L4#|CWl9Cd8+oN;W%7Hq{f&jrVJ>_9Yj zVi$H}5B6do_IoZn4&WdTd9FAPd+s`p;CIhG$59-^ar}W3p8JlIIOTchIE^!&SB|qd zhx54LdE>ZG|lmh1{BG47x&>cOz zWt=_H3%wDEKIn^n=#K#yh(Q>PAsC8b7>*GbiBTAhF&OJD>l}yinBcAKoan9ToP^2V zX3i;y!cc46tM-({!Ycf%P#EW}0}#6>*cpU(J5 zfP_ed#7KgqNanliOpX-3ht8Dv!S~pi3aOC>X^{@;kpUTz37L@vS&_~6#F^dq)R_Z0 z@uTl=X9#j3H}d$NIrAbP@*~vu(pkXw%309&+F8i=)>#-uP}KL)Sq#Myh7!K7&XOpF z(kSEm?kww5^l+c5m-D&x@~D7{sO0nNl~Dy%QO)PmtD}a`uh&E^)b<7RI==XNUDQK; zUoyP`8lsUex!%~9N^gRuXolv#GJ&p|vla-o}?+Z|lpTxASGv+xs%>9ei2z zj_Bmes(1Ef)4L!7U47a0Zs?94=;_O$_d;((qL1%Ky{|8q-p^N3?~eh#()vIQ!eCz+ zeF%nPn6Iop+*eK?;j5&N^i|bI`5Nk@F$QBX4&!}|^a;Mk`b13fHPa_!im#m>g{he4 z>!MG`49xU()qlb)%*Gtd#m|_B`B;Eoun>#zD;E2@=}WK_%X~fb-+Vpw6@?_Td)<|e8ctaz7hHkL}Mp*`9|uyeWUa} zzR~(#-&lPg_TvB!;t&qw2!8jC(~sg9j^huU@Qv3``X=h9a2jWPlk~GVhx5M4`UT$< z{UR>mvM)-%;+v{p^-a^S`KIgFalf2Hn$*S|{l!HLiLj|52QU#lnbuhSDF z36dfik|PCD`q%3}_&4aOkQ!YWh(>6PCTNOgXpR>CvwBPaIlUEHqmBQ(-WKi99v%D_^p5C+&gkO5s7Iiy|B~Jf z-O&R*(aV2X?~O?G@n6yVq96KW00#Q6>Vq&CL;TnDp%{kY{u}xTjKnDaEqye``0war zF%IJ~0TVF^lQ9KRn2Kqb?*CKgufggw@st0qJ`1z`_w+fKi=QzM^RWQGU?CRaS1iU7 zEX6Yaef>8q_dn2AU?o=hAL^^I25Yg-|43i&f2?o7M*k~)6E^$5>szoD+prxw5RIMw zfNPgOi)*((hii{NmuoNfVLuM|^STb=kUyX6Fpl7Ne}30d9K&(^ffG21Q#g$?IE!;Q zj|;enOSp_HxQc7IjvKg%Teyuo_!D<=5BL2=To3%kTo3UGkMRUg{l#5>;ctJK>zTiV z>p5QdOS)d-mA{FtG}-6o4={+JCs0EmkJFIIHAK8 zXy!8Dh6i5w;70(l5F2q27x553(Au0 zA|28r12Q5LG9wGJB3mHBl^r>d6F(v((94wzxseBXkuT8Cl^>yj{;mQjh(dt@uEK#q zt|BNJ7~v|0;s`?tltd|%Mw!4USJ}X5S2)U{JSqgnx+q}YjnO8M-Dn$VX0!{8 zFxm%38yy1QjgA4IyHlXByK|tpyGx*?J0h^h-8FE|-7Rp--97Nt-6Ig!(=(9P(<_j{ z(>svS6B(%P=@aPg>B~O~_6wx(_77C|4hYot4h+=y4hjtR4i1d)4hc;54h=+khXv+& zhX>AhM+7c;M+VaRMg=nXMhAZKjS0;0jSXz}jSKAejmLz*6W_#u$3F>^19|;Z0;T*> zfja)Ffl2;pfhqp!f$9Dkfi?b_fsOv30-OA^0$=_7@2qtd_?vz3m@)R+?67;2>mnYx*C z#ooFpKUs5o$XX9s>m}ESlxeV>J5<(2$~0Q0u`-R9X`EtXDJRRO4g#} znMavtF6PdV+xtnT*)n-m`+T#hOT^-QHBpDtit}xvjuQpGTFK>lt75Fg+}^4^8hzy4 zepX7NOp&$4W)f>GR_(E0D(7yI+uI_yw^Pndq{SScs+6-5zhNxXB$@8WRMIh@J&CWp z&X{%ieR7!!$W%zCB39Crd%C?wR+l{*Rb;B+vgg)vtuXh%Z)?d~6PemrbNM}0S<{S- ztf4|P4w>t6?HU)Xn#pR$SZ38?8HcS} zEaRzFizD|D$I!(s!B;$4i)W;;Y6)a5fl=71B{Hgz#D)?XjjUP{qnA}nVhpir$>eg$ zjOkV_g|XaPE`_n(s{LS`uxdXT*Q{D<<1ee0+IVl((i(1VS+U==Mow|_@|9jLm);;Wol z6RCoc+L~Lz$ZgH7B)442C}Y*C81<~>su*poS~a7eRjX!+Vl-X^cQC7Eo1XOF4LtT8 z+DPuBk;lFpo5)%dk9{{bllyJvNx0EG`;O}8weNrdUi+8_c9 z7A9+9vQ|>oO3GTlz>=5~SE|Ia_tq+wy^mJ0#6HB6NUK|dk!hGrBV-z7r6kI9S(_!(&+GZeeXtlQm7&oU-P$YEC7ISre;PiETf=Rbt!MP&HYrCTlfht%j`ClC@g0)-QG| z>sUs~xufLVF|syB*2c-&I9Zz@YZGK`e;oUobjG!h*(pAn$^3H3noHK)vgVdGudI1x z%^%m^ax9tR$P`be1TtloDMY5+GKI-~gvouBl(mwwR$A6d%UW4kD{Ix9$_i`CPGyzc z#~PV#$BlWn#Q$R+*M7EmAm`?cXW!EyW)jy+NIZMF+;VPSnexk2Hl95$o#Kgoh;=*3 zS{GUCB5OU(B$n$b_t9I))<((N7+D)5YvW{XoKn*q3N2U#Oxeao;O|rI0*0#vn7FpXSYujY)WHRyYOXbQrnaqCo^-S(9R&skJ2Xb>{M&4vZb>}qp3_$>0;*cf8b`YxAIt~r!xI5({q{L%Jg2Q$C>P{T*+#uYck!H z>Ap-4v)b>B9?RNOnf{jPxlA>)+gq+HQ$v}W%G6S(wpL1_Y?W!dOwrlrSy#?ExyB`# zuE=yvrW-Qdk||{l`?^Y*!@jPLY>4Hp`WXh7$eiSN)*vH%>x1GkzG*PC>GWqh^%LQbLEmK^XlIFADvnH1*rA(>J z>8DWpJQm2bP^P*C?70oC zG+w63a=F??#h8jSsx3a6*8Hkl)ZR*cnHrjN#c~ac+E-3vS!*n7P30QRWoj?y zc9gXUnYzi;L#AFbMaq3d%B}P*YX8i)Z&C3xU-8vn*7}<@@%>=`qT=Vk;%l(n-cXr_ z%e11y<{y?uF+Sf zp>pnUSsN|WSeeGlG*PC>avziBR-(e}v5E?_$7-6aO*3m^tfqz8WA&5V-fWrXTFI$I zl(NsaX<0kvDQ}NUp7Qp%9h3YT-s%UWfb zs>)PdrkXO{%QRM| zi895nXpc}rnSPWhmrRc<+N1lpqCL7#<=nqzdT!1Yqx-y~J-RPt?WL@}mTSC~>8qUk zUDh0x?BmmAGGy||V}&%9N?PUCUx6KFLL<95UsRseX0)_?lO@$FzBMdrbS*vcF&LFVnzU_882S zX?ZRCyVTXPR=BqP-E6`J_EwTMu$RjwQx2JGHn6wcvZ0-Ji4QR~zxFk>*S#y}-k0g2 zOiyJ}8`)cN$fV0;$dpp1;*IRRm1tz|t)@(M<=mFCHc+lRQl^fL?frJPl2chL(|S4g zZc}@?`!Zc=ckGwoGwliZ4?pnaap?w6(pJ<1(#mW7iJJbVR13G98!cgiNPo zIwR9LnJ&n5NhZCmy|=IJ>?`bRJNpXz-p-z@wzrd`y?ysM+S^yBE^E518FCGeOmXGh z__CH*rlc|@mno%8spLLV$*rVmZ{M|P+S_++I$29+*2G<#uDyNNW|G^>B2zY*UbeT# z;H9}YacRGnbKlDJULMPPc`P4g?W3%HmTP>KN$+5fn$f`?Q=d!$nPSTnSEl&l!}k>x z@#R($cCg1FVF!B*63bd*vnIwMaR+-0lFRL-lqr==9Xr_HMR%4dLZ)sq^^mETOp!A6 zm8ri>17#X4(@>d)%QRA^(Pk3oJGz7Y6QHrOHrA|(a~s=Xwe`Kmc)9LGnI_9MCd=ib zWGzZ=d74~fwoG$nS|HOxnSPb2c}M%oY2MMkds=q1AK%t8wKeC8Giuw>z7E>UT6D9qlV;yxiVI znI>DwsVwLebG}X`y0e{jS&7g2m1&<$4?EkV_OP=(YLDgIr!xI*&K0BfcV~Olp3B;E zS$iqhcrDXsIrpoqsa;}@kAHiSNtelx$kk6J+10%lE&TA+(P zYH{WE;>(m!rqwd7l_^hzJuZ17>~YB#VIOm-Oa;xkVq6MF*vD5`)(Xp7QMpEOnZo7V z^0HQ0rm8Ykm#L;qwdFo)%dOOnu*aotggq|xWv#wh6XQ}p!XB5#a(hi>YHlT`GPh^U z`8t*4z3ej|F4IVvZpd^?rj@0^(#ULtUdSb1UprqXs6~@aw_8| zZZUtpCemK>U6qr+sb$v=$l8gCN3FRRiNBzw6$lkB|}w31UPFXvXD zWbdQ;BzwO#&6?OsUAbKSN%p@|v^10WSBjRC?0==`YbB>rb8^gn`8lCXkE3FafbC7Q zQ+=5l%GB6Oe3INW`$}9n&At*>%eiZ1T5rx(d3@JTv#-RBvbIsyHp?}(%Ctw$-6v~@ zWI7_#QJId*bVBaqgxt!hY4(+PYMOl|o{_aPW=&j)XQtU#;sv?AOEO)NDPp=k1`*Tk zG3Ykkek^;))XSVJ#-P`9dki9FEmGF{$~F4SG+fRdDQjb88ZXmCnI_8=CHD~}w=!+I zJqFXJ+hZ_8)@GPBF$OcH+hZ_WZf~wk^Q^=bHp4#OhcoSTVTqlRt`yID;>?q-6yK-x zR*I8zDOG9nD0OIiEA7p8F>MFs7HwB0B`fqc=koio?H=W;Svk)^c2@WB zn{e~g^z5Uv)rOIy716FYE1T828np=oA_cc!y$FtpRb7&&x zGTTtCBu5^qiGR5Y*XGhj^Z7zzNzqo-M4Q8GJDZhI?I4xb+FjakO*h1nF>TDzigvpi zpL%O8J?#vw0BsbXKP2|jn!HTwX}02ML$wFw)>?8tmaMgwllH!r*UW`z!!>cHp;~pb zQjd1c0I}uUT5EE&BF=QXI?^YOQ?#MlP1sD!M=(_TnLOUPnRdG>&bpgZw5_%4 zR9b6)n(ZUnBj(;`Xy3`9TAVmyJK{*TDrw01^xU-b)Ecy%)%LV48b;7YDY~k| z#avNy%=&iPQ0=MNCXXxj-hpTjX>~d_D==E!KLLLDV0Z?K`tA38wB4MdUFpe8o6D>`$SQKQQj0cJYfl?)j##)hfP62jxi7O_uZsILsa7=+ zf5#z**jKojlWLc!gq!VH-(7N2Ely&wwGgv?NV{HrL3=f;D+!-V9J6kq9(kCVN0@C= zZ2*-}Z9MHjbL6*W7kiHkoTRcN`z2cLf~1^RU?T059AfTNvz=gWp|g67dS~?tZQ@uT zX(yO-Cz)+zphz+vh zxw^!%_=HSvR+`BZccFwx6EURiY1P7pf1`;xvM4;XCaoHl)F@N(Uv#c zsKyCv;rbs%l2*kZ}EIYyAHYU22#714&9xqI#v)URgUX10fECz+Kf!FhtGIr;=T7^BXfxA}%Pq!d zg4wQ&Gl)u5EOBLqYjemK;;5;(ZsTO6J)0vtZ8xXL-E$YF-H}}!)g$vt{xhpMp2V@l z7Q!{rhH8P-;&n_VJ=X~ofs_EDxSw3o9cO2_9d7cI_O&5DZG*=9u-)7C0_ zi?%^g@jBbAsMuzXcwz)XwdE`ytwhtVS4BI+ystyGtK?P1#4@XjeIjpGMI|a$!t~-9 zH94)CFlGyR$uqQ?wC%!TD&xsKf6|6)Uud_h@iK@#W~N?H5!$gn z@!HqeDca7ecwGzC#Oqy@`S^xZ6kEupq{<{-Ju}i)HP5=6xwQ*%#MUAMjj6ZRTAFQp zv+YCM&3TA6DpB&xVvjM~7q1tc)fQB?t6j~yXlGcjzY9erAeP+G`JOpfRd^iOSwW@F|lYv zH8m&al~{~Ms3wjimm>BXsuiXl8K`WwVhf>K4>Hg5v}*>4*Wd18<$o08CYIs#kvua@ zY-d*3HFB3y$wGK1Y39bxm`Zvojh!`UyOioq8>;bvhdkSewT6Y|AP)-@^$F&7dYhHr zW~Eb@c+^^JrC26f5$_77C7DT{on#GdK7A8yYi)$$)4)4fY74dAjRVkEP z?6EHGg*e@4H>)$v$~xMa=A9C*i8}9O%zExT{Ek$TRTq|?kL#oh<%qFt}X zyz>#)@Otw~-mE?{ml5Z+Ssjs2JhBsML;sJx`+$lf-TH-JU33GYU_eC_0Wn|#yFqA> zARs|90%8IYp;bgc5D_DSVn#(oOemZ$4;aV0F4?BdKps1nb!SJ?`freDLFtj#usll9$TrhZR2 zTG|)p=qGbLhMmQkWiV5JHMe1K&F#U3JAEHPDLJ?jTUr8pjz35#K= zge;P5=DeN_j~MHbKa4TZ?V)roONd|Vzk_9ho-LifnZrB@ z#l;dISSslb%Y-2?OPBz?^|GPAxEjXtR$3-pM648>b)u5qut-7{OOl~dyv4Dh9c8+} zFe%kmB=JF$!?X-aV| zVt>y2^ZObrqcV0)sQx0puECW8_TMZWvPwqp7uzbPa+5a3fn>T)2+R`3Lr*=@Uz`lb za!C(u+II#vS&EEGEQU()CUo=!Fq)-fkcH<>XyZx8AV<#-#8$G=PPn^ZK-Uho1`iN> z8t6FVSMLqzyhtTBLaY)E*%quNEHDU#N--6hds96g->xxpk(pYP&ZclRfjCUM5suLQ z1Ku=v2w!>AQoZt~rF!K}OI7JjOZCK?mg*JPmc!SBSwc4#swWcWh!bJCY!Qs*t4>_$ zAok#VW>boDn!bk#Qi}5=bBQ;#g= zda%zT_7LfsG(q|SaizDXE3R$~L!nZn`DW?RzO$|lz4uZHl~M5Vw@kQ}B`? zx=Cxh(Nqm#n3Tpw8j@K$WR;A>Su`w`lyI5-ut-9d;Wuh&TAI6uHf=u#r8LJPJu*Q` zXR0NJWRV`J6vI7e?NM#Gf<{~_p}0(-+LWSUSDK3x>&s4nVMfd0ZebHF;_^!I7-FSJ zOI{?Qd4(HLJ;?#|>9^`e=5a|6ZOSh&qW9~mx6zZ9? z&8^_N8dPSw&OpStGKK!)d>*?7D!3k8IN}89IEbSF%n>u8Qd|P3>y&W(JM{RLui*R#&a3%S-T>x^CQvE1 z=2*e86YBvJqyey4(wB{gdEB}xMf(7H*S-+v1MD_dyBlT3u@|9-s2NC^h7jlTJogTW z%LFIR`*A*;wEZStig}r8o$&hd3V=OO`-A zJ<68}`aNl^5!;%Sc7kO>Ak-JD$3EfAM;a^QC!(o5+ZmP#UL423Vo5%nY(np448J2i zJ&KiL1($r!B^&pqGIDra+ZE<;d0b~vEYhb?F0162)^L{4pbynx06lo@m|)7s@~4m> zrSfBf$ufb=(jjx2I-z`-5Cw}RL%D`2u!uip53zcwwjq-sr5>kJ32hH!g5Pk4REnQi zolu&W9-M4K*MrLDtT>J{)K+*lr`E}r`+xkKSMQZ;G1g7Jy5vK|=yeQ(+;=gOOO9qo z1yh+Wnl>04*qhEv&FZQ3rO%X9igjVEq%p_tuuKTzI2;y9;$RNHm%!dhoSy*$dsn}^ zjfi8pS1mzGCDHQ3B1sio&7Y1^)D5TgLn=i-SS0BO2ZvD&3W3&-r(PIve(+%hCcDN`y5 z8-#6!*Ni_~Dj9)H4#!F{2l0ZIE8(J+^nN|W^Hg5?0V+jfoVX~Z)T5Ha`7kMsofv9M zd2tfF(~_3+xaN7p8^a#JO8%pJPD~3@5kauZTg9|jH7ybLZvtWN*d5q=ORe-W*~De zf@(MyLDQ}sK<_b!&p&gxt=5X7edlhUKTz^EdtCbw;v5so9M{%~$8+$e#;{028Kr27 zcuX+0S6EAk+ZbBGmO!L+hm&=YL&XZh#xc3CZxb@EA?XXOEgG{lcW)iJQ+6Gd%m2;C; zFGGFgYemr-9urJQRUM97vGv#-6B>J5TaJ=;ramyzkovmIWwbp0+|s&6(X_|4t%u`S z-@3ZyOvE^UgE*&6rnn6(6KD_3`*vh;LB>NQOC{AYeMUJ=sRq|5%Agg6>*~-uovyP9 zah7ljdg_t>;vG0$M{@+_O`*SN3ws&T-e+fe9dWr#JB8{ohIXcNVVO|MnS&f()~72P z@@Q+iCbHzaQT`&GRc7*8_kP|2(FTsh|Iv%%L#&Go1lsU(l3v98(5BX9FpQW_fi?~cU1UFPr|@EJ0hdenm1 znHr9vGF>3<-UGd@AhXf#xC1^hJVCKRLTicB*)1aX3t?)|CS_a8_1 zU&g`dI@AUhOL7pS*9(5)dOmSIpSYf9(NxbHuICfiGlqL?W)4nIMc>z8s(C1z#ExQ9 z*kpFfVAt{Zf29qMfeXK7<|Cdocq^RGnVEynBc8)?qjmlQ?vD&68xQW8hQ3+O=d<+( zmm^am{J|cByUoRP{QtGh2eEPRviVF{B2d53W%I?H*#d{e&{`T2Lu+YB46UVpG4$>R z#L!wA5<~AL+<>m%lVhr-Gn3>P-3fG7U_c7<+I>V;E^DTouKRI*s|7IBzVI+0o= z^0!#3tyJ<6ahX6FT*qZl$?0r4+iVi1GID`=+=sBhi00y{*AE#tb*fn*(7ZhL$YRM# zQ(^5Ic z)4ElOc_@i_!5py!N*a(J9LGv-AXW&kIYV)peywR_J(#242x{mX!YqX~oG!J8D$#}Q z%KE|Mnqh3M=@jd+CQv1s!9@xuSSs;@n-oi7v0@{;4VEeH!aa%xGtk$naD*z+6_yEo zpi&&nra?VDT5{aYhbnPCGAeNcyOk|vce4lJ1I0bIiWM^{qsi*PmkM);Ya&=;SY2~> z#A9V7o(;fUMrc!>0;z*iW1hXHs4hP8?2KqppQ9VqJ??YPmKKwsLRbY=;ttO5g1GudZ3$Ac zR6>222~ska<6ed}XHk3D6((3*VQ)c|_$T`a7E2_vY0Xec+`Bu)^XhoH(40w&~xbHD)DyfP5Z5^I#==idbT4GzZ(Tr4p8Ldx+x~$FpEB zLu%XYOm8ACmlNJfmkKZVdt|;;M!z564{x) zMO-Er%%$2KV5DUqSYZ(Xtz-k)Sauk!=bZs#Ec2jBT+Xh6S|e!h)*2Db(%$`r{;!`OP;foaNEq{?h{p3^e3()A%P5FwvhiJW!KILdQ zU5Bm^OC@yAQ7PUpJ8tVrWq_mv4 zn^23&&@&IF)_svL<-4?2*13rDBxIRD_hgk~^^-+gkilI)OtoTrs>ee-!_$%* z$5fYpgjnuP89P(?GODLLREo(k+pE;hm?xogP6e(5XkP7+v1?)lu~uQ0KwCxnIBJuNBx{hlX-(c3M_bXYaWwZE z5Ep&xYqdtER8sx9dvRQShP(%Hjz}uS zI}rEdIP(JT7IatA*p9GDM(6pjQahv0SE;n`ze>d-2$iWf;geL__g|&b9KWQ}avE4s zzm|a&wbI8mucHQ><6#>p6PmB0bHBduextb%eT>*giY13RPfvv@#gB+PrBSA3Zb9Bdr1L8S zE4m{eW>X#0yh3cKWT&(}JndOys+r!AffbphL-(riBmfLIpt)40YONs~vu$Cx0o_e| zkxI*^5WJ8N@c!$D??L#Nu~Q%3V~|-k~)H=sg&Q&km+7+?{u2B zcRH2qola$Xr}JGr&h+K6eL3Hk^F7mP3HzqgJ>TAJm`&nZ{E8swd#6)--aCCZGQHF3 zJ|Ldq#8%Xo^TAw3A<)xt3gH6E^yQKYL9&iwD)0VHs==M-XjX4O))?;fqfBr*t+9Y_ z%Rq5uD)n`1ji;8jGL`(2N^2Wi3-+(d)M=Os>jXzDg-{*Sl2@kEQdOqXl2oSBl2oSB zGJHv;<^PgObN`Y`%Tv$$0`gMcLcXL{B39>EeLUSm)EfVUr+UkI`UJnEe&&qYdiuO* z8D8*I4^yf9GhV_c?2A;I>R~EP^@68*kxEnj7F)eNG)7!3@rE8^KZq+Db{bR&i(rw2 zwy`YX0Ov2V_o1F1f@_3q&S|I z=TR!T+qTh0YAwxSTn6p+aT(Dp?e+aLXs;iXL3@2%27SI!8MM9iwxRegXY!T2kC>A4 zIL;BP_rde1v(l74{dvk8h{twPY{J=NCr^mG{Ln)r^E&N^cUo5Wd|pPZ5^ul~;WK?qn`b#)o0n_YC;bgnhFw^ci%;9_PN|BDsxPxDdt|G}aySEr? zWbqlM*{N-zd9`KbFx##(>joFuWx&_^)1j3ti_L{;c6sauxZLhMTx0i`GcP&wp5w1@ zlU>`bR9+4fq_mHqR~hjhy8?L7ZVx>)=(pE%2TleZG-~q@5}C7QVFmf_$ljp4UyYlNQso6c=#@&j28kW_OZ3&t8S8 z))nxz{(a6oh9v@Bp_B+O5%1!sIMVDsb6#yb)ldU2va1c1_9mQZ4@(3)*u_4G9l-e^ zaJgL~REqPVgXK2pA(q1gDVb(>4C1LaSRznuRcF(7T701E7=HG zr9T#Kvd@8~_N!r<-A4FY{~#=|KMt*AXJM88Ww^)wIUL*REmVo0A-4A4=##AhU+dR~ zlkFP7OuHt~$f6lkiKg(VeP_`DE8Y zJgMHE+Er31?nVZECip~(B(!E?EDs@**Xaa|u{_7|74{Y^mdML!9lF3+30WqPc|5IB zj6z&4+W<8j%3)oHClK2S`vK}X)YvHq9USzam8=;wvM^=MSW8&??F=&nagl`1nN?yo z;uy;XFw$W)9PY3ks>Gx0X?R@o0sD$GUs+i>ZIin2T&6!--AdCC7&wdUKa(;&XL5#B ziIY)MC1$a?Y#zHD9&{*!!Lts+GT{ltQ3)35kscyx!}SEus9~{K%N~O0J%CoSNARY>3mECpd^c?yZP*U16?AiSh2D-qu$$um80jzs-ZV&r zbsbV*569^+%y9{{lC9u)EsS(5=Xf9I55t=VCpq&Kj&RiZo#t2{9@lIPRbmMAw+m(a zvx7Jv$0o50;U>pYj(0V;4hj$7N6@ zu4Xr~+t}aO-`PLdW9%9B61-_}1LB+?w&^V0NA+mIwJ} zoomLO8kEFy5l|^UCm-?T@$iYLR+R%q-(1p?tQ}j zRvbs%qz->jJ%JGSlp($;191l&;;s`!ZwxHr825`Y)w&w=S!4;)gJ`3iNPN=-WjysL zR*H>SC+H#efms6ew0P=~N1aG-Jv!Gd6Q)raZBi+gz~8g!{6`_s9P_x3#aoYJrATLt zSvqv}=P!~8Qko;~A3?h&;gywVE`S*6OIa^r=mp+wu@e z?IFaH^v{Vx2H&4TMj>P%##73O%LM8-E|rk}B5B4JaV9}ZnL_6+D8GuGIG2`xh;R{W zyTUo^Fu9Oj4$qbNCxr70x|4-w*ydkDkH%b6x_+BiOO* z1c>K#VTJQCR(6zPUA7s-GilcJ$vPq4IEKC@RK$IKMUqA8=*@HSKt4?R2xTH%y7N>6 zX)2fD98Z9_w+nIS3+m~S9wMtvD#Zh^!ucp$!I@7G-yNGud9`C?1DNa5l2yV4moA(S zVngARmb8`P`yGgP3-s(jQe4M&JWh3{L#0>-TU!YyNKF{xK2kZ-0I7xeM4_M(G#>TLd+1aqA>t;C5=?GMcS0SD(<@jqGn(86PbxzUJ z+QTA=7xZwYXVfd4!x2|F$HDHd=V7trB~*%iRXA@zT;W^>7qrwo zi)C=NVLhNy41jn_XCB(#Mk6^to|Meycp+?KxDr;l?q$!zQhvI)NROV)&UJZ$j7k*F z(OlFa?vQe9%34A6cUcL-XV-;@Kf5kxi`hLeL3$SEh-MXIGFDY=DG;yDNjExwu>q_G{`1|Tk#&^uL% z^AJ}!7qP#w`(Q7(%WM_)2~8Y)7|(Isbrm? zmCO$|bq{94VDId)u)=u)G;_~l7s4`u`UKFMinxv88_v)Z*GjSeW!f64&jjBYf%mu< zC_zeB@x8PCFt(3-FsyJM3{Bmr2Qrph=8m4#d)#K^mG-pfmI!2-yYvcK7gji1!Wo`) z461PM#+fiS8oqa*2K79)!H3>dn;AdDiTml;_snD z43}P|R$?nElOApk_l$&-J*m@hvS%in53@ZtvIk(9a28%RzYN#7 z(cR~4&xW_iHn4vT%{S7JS_z!_BU2emnU3*fg|k5gX%2h2bz*(sQnwg(Bs(2?Xw$a( z*>x@A^L41d?z8Jo#GhS{z&2i&Anqn3pWyNpu~|L++Y}qY3TFk|iS5D`!vyI;=<9V0 z_VN<$khNGt80{s8O0g@)y-T<6sqj+Ie870w+IS2%mJJ=lJ196N#?&(2{Nu^V8y*LHS4djURBR6?_Q zbpO|`$*y~}%w)OOemL5q5*9Qf%e{m@X{mJK8n^0M{?o*~A+XCW=K91dBbMGiNne$U%f|QQMQ)`mtURlVL zdo6`!0-XckI}tEThb;H{4S9b)11a}9#3e7Vm9TfVSta%wZ%dfqM#rNr-oA*-y?U`R z>{xadTflB&_dt9*8}{bq5A(i{IL!MsG?UW(^a^L~2c!{Hie_-*82Scog|jW^ec721 z=ayJY2~x7cIhXUL>_PTCREiJbQty}SS62HW?@c(S;En)dyC$^PEcI@Wc)AXKTWYt^ z8F7`2YWC;3Wa&`spo+V60jB^ZFCQxRL8(HCe5gD9Qu`gMzC+PXK zXaraJw1Xu+o@^hu$0revwxI35!g(oTobA8_>3$gLaD+3bIKIsBO}3JK&VFEPKc#6~ z!YUt2wllPndBa?nP<95pf<49FW?!-D&!}WQwh3#-TEiy3{t(ZZJ5ZUyoKJ?9zSE(D z?*h&g!V2e7_8@zSt$=-e-@q8l2G6OsCaft8<+a_!SI#l5|4?4@xh^iqE+XN5ii`)TaAWbQEqsnYPJnzq2S)E^~ZMV?AK5 zO9-5DzUw-d?v7C(T8Th$ zkz_ma9N{$^^Z>aR|1-tks!x^5mphGy@2j+@ zsU{yiV*0#>ob>^}B1dxfop_XET)RD&tR?{dKB0gf;%z=!S44ubaslA(u4TU}Vd zY|bxX*TeS#zj1t$z0Ouajc)H*jj#0XXnW3+kb2!rkkQkl*n_uoqi%9!jJi2ezMBu! z@afGCVw0g!w~6qel%~3BHwSV1$*W<9ZX4O1P}%JW3=6o%zGl_%n>S$rbs@gx1iRp? zOA>t6Jt2N81M97e{Vc?0?h9Zj|H?{OKsn;DfTQeXcr@TX$M2z)thR(|GiE!&fXwPO zR;wEDgY@2B?B$lnhb3c~_YVXjLi$Mc|4x`H$7II|6gW}oBu3dheme#^>4 zszH}+#&&?A**!V#%MRfT?MGn&qc}5#oyV?Vx3IsnC)j(icXsu>UUICZM)Rt}8nTWs zG`l;;eK=0!IE9_W&SjUu-rwHEX3p$lkFi(SO7;!=73SEtkxGOO-8#V5lW7fX=;pu~ zZx|NPiyg=ghq*2j*cs5weGA;v?Hv1%^Y2(4nFQCKjp5a9>2Q_(eAs&OcFyc)??F7b z0P&ovI?bydYs{Ln_N*7%6PmeChIq0a?&-FUErr-~+4Hcedj(Vrd5No2&>C@AfD1Hp?*sAOTezoNDw_#&T^6xxU{m*E*gS9_#Iv37q~BfkF|2U@%4%v- zoekL*P~m3*=PBu#3Nv>n#3KUwz>I)sh<<6P;WHQR&0NXxCXP?S3g=7EE$~mye`age zpnahQ#8Wyj*QGP-3(efaVL&F`-?<-{?hPq5SiJtz2dgyqj?b-VeA0mEsFl zU5jE9SR|n`F~02(fAq73X7#F%BOZvy%BqiFy?E>}*e{c=-(v%_X>8z9nCr5R{T-GF zCpbO_^&D=&S2H*h_y+O1!1^`mbD`tc)xcJWO9Ur4!;{Q)31?%Wk;Np~c5?MO>I}ph zJ`369Fx-H?V_4z58*z;9At(#F0Ih;*)FPXc_`jpm($Y3i;oKE*Am5j%a1KUX;XHs% zf+}$=I{^mrT^sb)^4KNpDt0ql3cJpvFJ6V$C47F}OD~9O`)t;(Rhxidj$* zyb$iq{EcG2eK2^|X^1m+*lOlIj;mnjfLE+ohvGUgc$OioaBcxx&9vayhV#yx@!*Uv zXTmw7;!F(On>h*k2hU>jVDPLpu+_{>Ff6$G^W8;pz!CV;?h>4oLH88G0wi@QUz=?P zOZh&|-b_ElS;5oU1#B7In|Tv%4X)%^vmPyTU1;VmXKmr0ZhhDUb`(1WRs>hVy_t1% zDb^>QO`(~)70h+7Y444&pi%X8 z;wi)$J~!bipU3ci_m5B(RHGr;0Oq_cqAVCYC8#o5> z$dC-E;WH2Bx~zb>x@5OQWw&F{Oz4I0`P3Dxgq>1r4EOQ+4gS8x@J?7PeUIS-;!ha9 zV5ldVUEfS1Xmydyt?4G2qBT&mqxN77F&MT;eDt?sxG(7?RAP95K@f3Hg+at1!=R2q z1A``p8sbi=7KWPQVreZ5br9FXP#;4B40;&!F*Lzoh@r1IyZ&NP(8|M*kD&m=G7Lw> zDO$(GxiybtIDz3LhEo_$V>pX(=P;bdZ~?C#qEDQA37s;jb+#H8Oup_H!Ea>S$>7rV%)B3GNtbY5EGa9{LD@L9Rhh zEpif~e(U6uBfFltrD&_Z1moR0g*u0ZkBCo<3026gLx+V%Bql`*QD8UVQuG%DE6BLP$hC(ZUcxg*xMe0YW^NXu(qjV{8Pn!!SNV zNJ6=IysG}US$YjSjReb-gi_JS5B!^&c5oTF@cqAzLVv{g-lfnG({@39vG`Agsgp1l z{Qq%<;erQVCt=M;Vy@BO#u;h|HaprTm|)I*@AiKy}C`s;{yK!bw+TH`o@EeZcR3R;+sK8YlrCJswEHhk;{#@?%f;yHv0Mo{!w&7UcNx!_)U#Fq{jMmFv%l_k9{kcxfu$;-L zkEYYabk2B9OCF1@ZwS_mG4`jwej-1orOySuf-QW7hY|$e{yi<*ZQnU1c8GDZDsfnJ ze4K-c!dz}*tcr__kBW{P=wQ-4*xk&=#CTXzL|jzFkoY*2gULwMFq6)X+FIIL_7TH| zsbc#N8EK3v;)Xex3{Q;fG%RwEDmG%6S!{Gql{5n5WW^DYUGS4VgTvBw>$iFO;xtx|OE+Q5S;5*WJ=+Gh2kr7E)V)KZhLrpqV z*N~Jrd{~la+<^Fhad|9Ecsk5`m@0C3BIfz+H8P2+gyC3DRa8J?baM0%)j-v-f3a4} z@3k7^-_Lq*5RV*AOYEacRt+&8LOPg44D*ajj*n3#nivm{c8-ix4Z~_25HVz!>f4** zN;>?_(tKa^4u4s8`wl-=0t(o7`2Gnwe*eV(-{1fH)&S1^@TRXR|L=R}|L+~+Sxwsa zMNyEaJNl^CXgjIvq_^4<4KY96(E%x2Q6f>)l-E#~wbM}(8_NW_kGfVnb%|7xj>rC` z`HpgXx!y0C+VUD|5+Pr@OdK!BoBcAKwEpH$>wQc`@JqK;gLk{Y@ifvTw3__!#Aq1=EnTDlEn8n33?=;!$0=vb9mP*OzfP~(6u&T>ONZH2YmR<2Yit!%91z46lKmzVOiE&rA! zt0mW>C9A2c=Iq}^VJdG~{mL+|OZ3n|szhVgAU9*TAiqvZXBR6o3s-jwGgoIzcSTEi z^XfNb@V9R$NR^lz9jTJ1OH6)U!4jFEmM*D{?Lnd?rc2OmFr_eXoM(5zP-=T}+@>2* zxnozB4(sYWSvPh??2ZNF6t(s*b}$U;9~|CvWplro)=4)T#C}$(9k{UQTyN(+8_ZX} zNZ<0vb4RD};jT-(mewi`d1LLnzU}0D342b}byr)`@brMw9cIPcis^ekIK$38*U8;t z@1(k7UaiwpYsZZ>*=V==#j|T|3g`NM?H6j*XmE{JW>rUT+by})b;dl2*-)#iG0)x( zn_2tQg@#Q7LpF>bW%)eOVuQihf|--E+trYz?2B#opk23i6>+yF9f*s$pFZ#O^!2xA zDc?qq?a{eqSI;-IUfpu&G@;U6b;4`t{fxjp_xpbNv^H%{JGbo{PH%1&e{fLb(S0H| zXvy+)Ne!$KnY<}hX;U3(Luvg6U%akZPCcuiaXzZo{%b+bb^J@LcoS;cT-r$9aD4sd z9p7CJbRVkq*y&^P$F1!)@3Y!kTOLf)8%cfT-g3`;k9@aDT?Qp34eivSLuBF*^B*Tg z<~S+pFf=BbvK@vd#zzguwRVReA0us+yj5bOG)ED6PjyY~lrouyL?ZQ(d&#?ge=Qd$ z*?*hCh!G?HZU(Bv|EA_7xh^elODS!F-)5nv`RnF_{SliBI!iBtH&Sf)}u2kjEnfk}*D6^|QZHAx7wY}Y|XOH&TSq*v~e7|AX>5Vg2o_S{6 zE8RN#(;}(X=s$$l24>UeG`=yShHsz1%FMlwe$QCFBfUqXBOAUxS>9@X%|3aX7i1VF zdQGr+WYF~3jaSKA9!Ec$>N3Je7=GSv;Rnxg^}qH{KJmIh?eO4?MdhAN3hPJ3rylR_ z`*p>iTax`OJ`A58nAo_r>AVKzo}H#|zuCjhS$Qlvx@*)6>pe>wb+KR8LFfJDdAd(p zp%tq_D|Ys0D<(;4*}M37^FP9Ka4s%LQvPAB$w&TM+KT4#X4N}=;~!fKTDd5daZvQY zIJAvF+A*cvMxn5fD-;T=>UQksOLsYT(tMDa7cPHS;epCz-NjrCMFdsX&k*5Z9%Pe=Z~qN0|q3 z$D&UScy@R3q|Uc9)_ywe@%ilTk&nMFPP(^XzfE%O_qWbZb9%b;*})Gp61E#J4Idq~ z>+{;$xr~Z_uS*X*}Eb)cpw`PrPksy;|Gw z;D^#lfk&J>X1~4Yo`15F{*#QSv8P9NYTGtpy7I7zX5162wSL0Hb}O1)UUwrs4SIWE5zFk*}=3<4r z+*R?{kEf&Df;J?XZaWJLTN}A$J4HnQ0k$fu0cMe^D7jfj3zfB5gtb+aS(L4%mE6|K zc7RH*`b+zFv~J~*Gus;WlpI!?TQ+Q1>a$SGNFGA-G?Mzu(E{e91)Svezt#R>Q^tmj zW-nZBV`ix^!v-wp7O?mC<_RsJpB!!A_t$6v9sji!@V}@#=^u7nZtnUg?9NZv{fBx_ zk9|(^4&qq(#n)btw%zy4<=mA@h82;N_JM?FQXy&~AP6oWlc)Y-S95$E zlk>l)j+Lj&cA~jkQQh2WMOe0K%;#!~e^^=aa6UcLsxhb4)a)1Sqa^wb)o^T6=+jx_ zFUcA|4t)wUdAsTsti{h3EHFMk$+!y+RnY_J!d_+UJUnSoJYACWIhkB;W2vyPP}o{p zpe?ib_R@l0{wJH+|LM$XOJc83eR4jSUve-<6zTTOI9w}F9~g zlk5K|R9}?VGSouP?r`*%brGEZ(w6D0Pw(dxVw!uerS7M;6~s;(;;rP=i93A;g5an%r17>Q1i>t2WE=p&5w-JPqlJr&%|6r&*dKD-?2gx&okQ=h z)?TJo7;O=?RSJMd=}I^qwR`xgY4ULHJZM-?e}g*!I4Vc z!Ysc-P0q|p%xRktyQuLygJ(e(1|Bo{8rt;uvKi&3TSi8PxGw8<{QZOFJwvW965U)o zgulA7@m#t^+@}>ex_7Ih@2^?be%GOPb#zoS7hHY4>_fd)HB>fppN}%~Dmz^fQh6$6 zUZc>%Rt>|iXE*hnX|`)aM^}Rgf78jA_$#apLKh zLyqiuG<127IX%YC&CGAoRjv2ilgkHcB^6pfHtV2w=+8uDy;t!?_5;)32X4u!Yrz(}uh6E7qjCmud9#Q1x^2+wAhl z@A1~;k(abO)`&G2uQ0l;6MX$%!N+?Zbv8uJ{~FNHe9UfHvr)HmoK2(mWzWhvoOx+c zvyIxJi=QpqIBC#?T7%8Xl4FFX^ESL_IQmV)2`x&eoE*H`L(yU3wL1w87lm>CJx-sP za(G9h4?2mNdzL$F5}gKrjb1eGcAeFAwkZQNFYLpmy}Ab4@2B6}?}me@{}(;L|B3cn zu9SC_qXDBlIa(elnyV(DqTJNO=LyB%*?K-FJm>6^Yit^ic4lL-_JYd6# z>y7+c)P8b$)oGs%Npj=5RT}4ma~gQgZQ?R#>N9Q#ES8)sfDBHuad% zQOg#S^Ip6fXwd%C==)QeKD_U@ykJlBpd*y4{Tk^@CqC|;@%9)G_p1M{_5R!I z;J>uqb$&F$XuZ*%3-Yx2)V4O4rp=b8Wsa}^cg=4>u%^lRIr+sG6(w^#|KFjJSGYWH(<)k$F-=pV(Tu>rU(%J!^;g zxq8cH#P;9OLpB{Z`}l(4CF^@@B?pCFblX zuw6XR>_9i2hy6o4H=IA+xbtm|#uo37DZG*u4($?a9(p*`;cJGL?#;bg5i_4%+@V+H zH$C-$RlB~+cUSEkThnFqxuC>mPvl3+QdFURBzju)b42VF%{ttFpE2oJ zw~)%bp>v0kX5*JMkPoPIsn@shp(Q5G zPIYK1pu2dr|rx)8Oqz zgB_+8Bu8wEE6`oJd#%T_dhws9Sq$0o0q&1GcLc+jF!9epH4i|>_U~H|KWvC zJa4^~sN$#A9D6AG(4TP+SLL2iwE3!Ypik%}-zEi@K6F^p*}Qwhn8UiuKP%E(2g%c0 z`=h5S~a&xeioBvWpErqe%Fkd=e6pRbdnfLAF>&Iyu z_0au#tVFk|G#xwBt1h{_`=zNLvuhXCe!;kg8ly{UJaP}2E{zU*dQ|x_AiA{p>!Kc- zn?EhJtUn^c?OemiDRSdp?utfx{IA|=GG=ZwI{W7p&KF-etRHPW2yW-2?ZTihR zHMrA&H)2%X=FZ20BicUsUDjDgxHWWiL3%57dAiu*=h{|Rq>BxZs>|Eg%>UT&{O|89 z{IYe0$s7G#YBfd8A1^c{*tULbJu*dYbo(pOZ)S-T6*+p({%PAfvdgj6m#Xa*hd1p% z5qj(Xd7GwpuKv2MpwE=Hm3{uZ?4NJFm{Zh1)!^%jw^t4v`f@@1@?}Z88411_MT4@R z+4MYg`_`97U1wjg_%vz4>Yxh;G-u7d`_-zdhVIJwTCEK%f}R|`^0t0v!+Iu1>Q&sd zK%+PAyhCKeXWQ$vG?HEPo^GtaX|jvj(M#c_tNLsjefRX|W2sH`%e8yBEx6yRNat}= zw{%m#4*hZlwtW|VWaAd?nyX!kjIL_;%DB2JB>azBP2BPgL$+I0<<04KPub=8zqck`UFQ>^<8cskd$UhlX)Usev&&+GN(&5kCT zAwvwG8edtVxHj`y>pm(o^9dum1*{5qWFRr~GoCC@Z+_+H4kwi;(wiSa?vEeqn(jh1 zFF|T6wjD)nT7~^4b(N^pq#|}VdFaoHCDMHA^!YFEL~*yoFVjkmAC9>>U2R;qW!m0X zuLqjnAKCQvZG+*j{Ei*`bboiv@g8lyo;)61RI6scs)2t_Y_iDrbF4?FgO~S2M7+qU zSD>x2F|ygER|^cjrgTqxQaG~GI6YkJN^y{Wu%w6fYWgt8R(+p2 z)jMN*zLlDG#uP=kR?X?(&!kgvCOx{k+o2`hLi(|N`)EqOcLb>Y+N--tH_WKn)b5pP zPnPIeKYS59#Y%tEzuc>9iN?#KU8Ie?V}C1Egjq-1{vFY)YiVOOIzQ1YohIE$);hlZE1%=*_@7>1#^$fn>*!pi~k%W_k@10H}9@hKiJ~Q@a zwRD^v`{w$09QS-^_ToF|8+$LVJ1(Zx{=ycoZn~ap@!QtHno}1nJgT@qbkW!PO*d=U zrrwp?>6+ZoIg~T7ENUArHqAs%Vn zQDtX4VM9*anMd*~H9Hx6aUAXBIoEe)a7(RwMF+K>Bq;w_)Ytm;Di_y}J11|}{@vVe-$m>45{%lks!{jc>-4i{tTozfteg`& zJ5@Nmy3dnSQq{)-ogP8QUd*5Ra%qF?L+bk@10zKL9$gJye;i)#Nb&nud!xh43i7n0 zCzw`EaBLc**!M)|`TmJrCO=UuRu?SBlo(Gd)olJSWOJi)Tgn?eQa+A48`D5+{>L=S z$(>Fw+Wz~zUhVTGK@%n6FGlYfwfWJxOM!2~ho`yrYG`8`R2J~EZ^F&D7rR|koNpXy z)i!tB(gDiwlie+!ZaK2Eee<=hhEF~Y?7FSeWnb-S-Fhx_7b9Br*54gE_rYqXq4)d9 zea4JG7cg*H;S-%IhvMh=MjBSU?x`PNHZ?ZowsFsvU+;F^`sb$STb!hN?g8g&4aurM z_Q{dkZ(7}GVkaHg&Aj#sy|*r3J7-N*yj!(%>%C5a*VN+mOId zyQe2K+~5Ahu!Z>#!Zi1|xfQmV^hlzJ?VI#R2%5`ujZx_A?*F}`L}&IHZu-^!VPlb} zP5HO9t?10IZu{H(Z2SM~-teDC0R=i$Y%Jtfw$)uK*8Ea|hZWGJ@}E9RrHlXk#DPdp z9Ef=00Q=m!XCD&l7?^Lk6t_0Lj&H}`UTp8#Y^h6=wlNQS2dv$pZqr!m`CIC~T87t^ zF@My%RP&k5-UaHL580lV)K|EiovJ-DYVx?b{aOs!w8V4qgF$`I+*}m2MXUY3O_$fS z+c>Jmri=4>9qHFt_FzDArA1(?dL8bs(+oJd)wLw-(tdNb;p+yyJR1A5Q)ofMSMI;v zvWZ$B7iE>QGC#7m*;%LTcXw`RXrB)qS?Jm3zV@zs-4VOyIz0V&r(N$lM!q4fmyJri zRj*TtXWvVYA9u-`aC!8W(UY27b}X6^RyoywV&fMD9eUlJZD+R8vgd&k$1fIVx2ic5 zZP_%(X55*)@$Fyxg=96eYPrugE-E$Xx5c$L=r^Bu^wn=_lQQ3iKRXq;d&b+Q!(TidjpZ|h}!a!k>jjRwtEtr_qr!f0?sYtOv!DYsjOoo(jr7`VT+XHuwxITd=AJtn?Qk9Ac6ZOd z#8I~r@3*+Q+kL@-r+W>0T%C~l$k$W8YTeA6kNPa#^y&KM0k`+$rj34l;j#C9&o--c zTd!O-cHsCwr}a+>-_l{?#U6`8caLb@`uXG7eXVD;pXH?V-&2v{I(2^yp9AL#yL3p( zc^mgG#kgmC-LQT+3myF}Ctle+MeoKEzgP1%?{v=}GXKo23sYwN=vjJ<D13mxq{o##7vreL7c9+unGQWz4s}3qoH=o*3-kS;-NpU2S z`{(=Sdr$KG*E{^N`(nREpFD0|{W#c#%Pqq#Ecjs8_xr&O2fILdfZXrE1cw=c=t~_n7JT2=-mz%koJZ*x!^Y___l7^Q5-R$V#9Tgur43DKm$3`TM zj2t@5d{9!X-04RJqP(M_g>lngp3M&DXV2-m_DDR39FC`wlkki*J?s7bDR^_^rvK2O z^3iwTi%Es^Zv~HRY<~7q(m<0%HRsi>h@7*)W!~5`BWumxqY5`~@Az(C;_284Uv_n_ z)H-6f+hfi0m(f=vcbixh=7y;z&K^76J)rxgT64ynY3yzA(%xly;Hk}@W9~R=n73K< zr$dv%bHzo=<%QrgUoaC z+jedn)6+B3s77>L@A>oYPI&eEte5WXZhW#kRc`e(uI0vin@k^{y8cpU(}LEy^L=$3 zYQE5%dckO)MWfr#4w#+jvt*m6t=1n}d;i$5@!popR~t;}=GN23BEhtAYSAmxcQ@L1 zGLD|VrPtI!aq+84lJ+^t)K^N{wsuVKtm`|V=I>j5UsudZHHdF8)@@btJ*T#+<@>?{ z`%l`}G}1bE(#syCNcrpI!T- ziFDUZ=Yu+}pWIM&c$E95Aavd(;X;9Xd9Rnbg*Cjp)>$y#=#l-x&aeAk%IBbV+ekBuFCIB=M*_Naj4iu4A!{%b(jfAX}P|MY>Yx(nfN zE&+eJvdmB0fX5NFzV|ihOBLwPmi&M3xBB1hlIrl|>bZtgVIno&^m@{}`__5Jqw}q| zIcZ!zeB(rshQ#;rgOQ#0qy^>{HT-q2`__jwaYV`Bk$qCHZCz7q-r!~LK9y8m?QC!U z`t=Bd%^Nz^v`lSK*JWX%Z1=0U)>~e+{M1sX>_HpZi^*{{Uf1-0^ZIt94%X&Rc80vI zb#i#&q8m3pzQ5i#-1G6>#r?+)=`Rer7(Z&-sH8z+p}dY(MBR-ii}HH(UL5>s%*~~t zcZTLf48HEZ%;fy%o9E+}7;g`2XFotCJ({pmY5Y3R-mby3^2g&YM4zgm^XNg{Rz^ef zGEa66cCEK)gWudKZf@=CwjA2%ox7*Og?#P3nQdE7NqeT#pfDq%iQS;pZEvMc2`&2Q zpP8`q&LDT=mK_{>zK)Rf8}GL^_oML8R$nYLDQf|Q;pQTyk3`r<4Nyvk48u_CSbKmA0iwTrv;|Ek{H!=cLmI6lUGn1og# z8kdL(XNGZ$gjp)y8TLQgT`STrycn z{SLOGZFhT~-F=vVmCNcSs4O>e@lTN14yqG z2x1=!gpIM~m7)LuAG}{f_xhM`p%}c{kDsiGn0hUk%zPE%oao|%-^|E^LBh^1Jr8s; z+HFJoVU&3H^sT*)$YV2K;AGiQJ9I@wlEm7%1up~=fup4WmT%TJIs&iHd*8THovTdm zQ9@C#H$adH%lQ)CImt96(QBn`(dM=WbLNJT=m>Ei;)!@0627z};j2sa4f$4GL_xP* zjUtPYp;d##*9P^nV$vrByhJ3(B}T_%% z^w-sOEm$jSp>!5@Q%U1@Cd@PNPL2F7bTaHUEy<|37y91>8i>-Aoh;6}9{If-$>&2S zMf+__K+*_fWXvt^f)ExE_^Pf%7j&%>BmPAZ%u?!sbet z2b68nC4h8s18DBx! z+T?r|eF#3%IFzD8@?_P{$jOp$FZ(IKjfuL`!9G&><`uzJ7%00-b8I;|$Q+yTuW7n^ zdFPYG>gO(a0vGa77*=5Ed))c9d0PSU>9&3Qbkhbbx4yMpwBCwIk^b7qXIgJ_b4hJT zW5}FZkcH0nxzsZU;}1hh)cLkDmCleH9u}6nJZ)-!c`pFsZUkVZCAB)9v*uAQ9+j)E zSY{jcxPm??yL_ZX=}pDx1?4I`8)`pc-^6Tts$<;wwd(g@!MUsoy zcf(BFy=Hb8GB}3f%uUc-a4_^A|M}|vYYUIPf{8Bfeubpg0`4M>s;S1-2VviN(Z%K~ z&$5VzE{Vp-<27y`>uZJ|Nezhd-oy1QMPV{_NLf)pj#;OKmz7v(E;8xcRasitPq|s3 zm)+7KtZO_JxhPM~;dcajs(jE!gZAGrQ^`uAO%f$X%dZb$wUW&|?`L(>jy!RGOsMaA z4Ad>RJu_Z{*IJoQWQYr^D^+)xvnx)+GtDr4)7-M#8D+s3ajx5as{K7S7a#jX9}oZq z=OO6#*RS*Yb8EC|6lL)kqgD0E{aAhe*}wGl?I@}n+fi1A|4H%xL!G*TOm0Y{G)kzP z9BmjyS12sK(9ww%7AkVC<(PC4VUO6g1sPO>8zk&#!v>cZIWNZgi}X09MjnZ~-J^j1 zHl0f#Ffm%@QcZpUci@7(YA;!^UQUtXM-RpBmu+Y=NVgxx(F)XgV#})p|D*Tk<`5sGX6ZCc>u~5i~ zGd8nv(p;>y(|6v={cOki&B_NP{G~MHr!HSBp&St7WRyLW4(2Z@qe*tj(UHVL_$>v| z{YSFGSiM1q_1J1DJ(Bg`Ef2DH!oY(1!^S=97Z4&Tc_I5;*|fo7{j`{%$hrlcI-g8Z zJwUpXOR54$m46F(Z)}(NbyuDV9=F<+2gU?+6;x5m1_~;GDh7oFQZotq0lpXTuyYMJLavR_Kx(`rM2h=RyA5cNB9RR!mjSod8 zxVH{o7J&US0cf!U9N-HS>}lg%d53NrT>G+|u`&i!*PRMQf!ojT!!)ZEYbFffS~-oC zGYgUR?z4DA=tnmNg!~h`U z^Vr_b(n(>-(XKKJv<`39?65h&c$y!&`P9QFIeiG)k0+#KwD>$GtwNgg{IRz115Dhs>4=(JZ$hdqC%;#*!MJ_bSA_h0nCO6s*rihZR1k1a3g9ymbQ$t!HLdi^H)W&1 zsq@*MHRlcTTzxsp1MbkvvnQel82w14mRPTrE4?S1pAHy?i(W0FlXusoL_~Rd> zKC^^3Y4&^Y@Sr}Jeqn;kZgzFqCH%8B;F^E+38Y!?Uxl%t0g?AM2bi*gZ!j`|j}0b& z9OkJ6H*FKA_vqcU3+nxu$K?*ac|bIR%G|UFf5g!NkVe)`0OduIx&ab+v<)DYvTga) z$_2xp04X##_}_T5z~q?Bs3E%ET0{1F9n)oM^K8YQ>(21?Pd+F(pwk0^+PQb-*e=d2 z^v=G#BP1lBaT?Ih$a5P}Tt0`qT!|bDyYRM&#oyM86Q2m#tJ7xN z!oJ1N!s42!>+T^bdG4)NCcwSer0se&SE8KF2XE1BdyzWd$6}xhc&~4f_Itjx4#N0I z=R#~`C8_DxQd!S&>N-I+Z}Xk_%ti_ET$7lT(1Z+L^y__WjlBWE6IuzE u{dwg~J@_*;?D%o{2`y717AFes)A$63e)RAjwRo{tZO_)aC6A|W&i@CaE2zu> literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f169682b --- /dev/null +++ b/Makefile @@ -0,0 +1,43 @@ +all: debug release dist + +clean: clean_debug clean_release + +debug: + cd ReClass.NET_Launcher && make debug + cd ReClass.NET && make debug + cd NativeCore/Unix && make debug + +clean_debug: + cd ReClass.NET_Launcher && make clean_debug + cd ReClass.NET && make clean_debug + cd NativeCore/Unix && make clean_debug + rm -rf build/Debug + +release: + cd ReClass.NET_Launcher && make release + cd ReClass.NET && make release + cd NativeCore/Unix && make release + +clean_release: + cd ReClass.NET_Launcher && make clean_release + cd ReClass.NET && make clean_release + cd NativeCore/Unix && make clean_release + rm -rf build/Release + +update: + cd ReClass.NET && make update + +dist: + test -d build || mkdir -p build + cp -r ReClass.NET/bin/* build/ + cp -r ReClass.NET_Launcher/bin/* build/ + cp NativeCore/Unix/build/debug/NativeCore.so build/Debug/x64 + cp NativeCore/Unix/build/release/NativeCore.so build/Release/x64 + test -d build/Debug/x86/Plugins || mkdir build/Debug/x86/Plugins + test -d build/Debug/x64/Plugins || mkdir build/Debug/x64/Plugins + test -d build/Release/x86/Plugins || mkdir build/Release/x86/Plugins + test -d build/Release/x64/Plugins || mkdir build/Release/x64/Plugins + test -d build/Debug/x86 && cp -r Dependencies/x86/* build/Debug/x86 + test -d build/Debug/x64 && cp -r Dependencies/x64/* build/Debug/x64 + test -d build/Release/x86 && cp -r Dependencies/x86/* build/Release/x86 + test -d build/Release/x64 && cp -r Dependencies/x64/* build/Release/x64 diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 1fea3342..29651ace 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -1,4 +1,6 @@ #pragma once +#ifndef __RECLASS_NET_PLUGIN_H__ +#define __RECLASS_NET_PLUGIN_H__ #include #include @@ -7,6 +9,12 @@ #include #include +// OS Specific + +#ifdef __linux__ + #define __stdcall +#endif + // Types using RC_Pointer = void*; @@ -285,3 +293,5 @@ inline char16_t* str16cpy(char16_t* destination, const char16_t* source, size_t } return destination; } + +#endif diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile new file mode 100644 index 00000000..736eb1ee --- /dev/null +++ b/NativeCore/Unix/Makefile @@ -0,0 +1,150 @@ +WORKDIR = `pwd` + +CC = gcc +CXX = g++ +AR = ar +LD = g++ +WINDRES = windres + +INC = -I../Dependencies/beaengine/include +CFLAGS = -Wall -fPIC -D RECLASSNET64=1 +RESINC = +LIBDIR = +LIB = -lstdc++fs +LDFLAGS = -shared + +INC_DEBUG = $(INC) +CFLAGS_DEBUG = $(CFLAGS) -g +RESINC_DEBUG = $(RESINC) +RCFLAGS_DEBUG = $(RCFLAGS) +LIBDIR_DEBUG = $(LIBDIR) +LIB_DEBUG = $(LIB) +LDFLAGS_DEBUG = $(LDFLAGS) +OBJDIR_DEBUG = obj/debug +DEP_DEBUG = +OUT_DEBUG = build/debug/NativeCore.so + +INC_RELEASE = $(INC) +CFLAGS_RELEASE = $(CFLAGS) -O2 +RESINC_RELEASE = $(RESINC) +RCFLAGS_RELEASE = $(RCFLAGS) +LIBDIR_RELEASE = $(LIBDIR) +LIB_RELEASE = $(LIB) +LDFLAGS_RELEASE = $(LDFLAGS) -s +OBJDIR_RELEASE = obj/release +DEP_RELEASE = +OUT_RELEASE = build/release/NativeCore.so + +OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/BaeEngine.o + +OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/BaeEngine.o + +all: debug release + +clean: clean_debug clean_release + +before_debug: + test -d build/debug || mkdir -p build/debug + test -d $(OBJDIR_DEBUG) || mkdir -p $(OBJDIR_DEBUG) + +after_debug: + +debug: before_debug out_debug after_debug + +out_debug: before_debug $(OBJ_DEBUG) $(DEP_DEBUG) + $(CXX) $(LIBDIR_DEBUG) -o $(OUT_DEBUG) $(OBJ_DEBUG) $(LDFLAGS_DEBUG) $(LIB_DEBUG) + +$(OBJDIR_DEBUG)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c WriteRemoteMemory.cpp -o $(OBJDIR_DEBUG)/WriteRemoteMemory.o + +$(OBJDIR_DEBUG)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ReadRemoteMemory.cpp -o $(OBJDIR_DEBUG)/ReadRemoteMemory.o + +$(OBJDIR_DEBUG)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c OpenRemoteProcess.cpp -o $(OBJDIR_DEBUG)/OpenRemoteProcess.o + +$(OBJDIR_DEBUG)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c IsProcessValid.cpp -o $(OBJDIR_DEBUG)/IsProcessValid.o + +$(OBJDIR_DEBUG)/Input.o: Input.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c Input.cpp -o $(OBJDIR_DEBUG)/Input.o + +$(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o + +$(OBJDIR_DEBUG)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c EnumerateProcesses.cpp -o $(OBJDIR_DEBUG)/EnumerateProcesses.o + +$(OBJDIR_DEBUG)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c DisassembleCode.cpp -o $(OBJDIR_DEBUG)/DisassembleCode.o + +$(OBJDIR_DEBUG)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c Debugger.cpp -o $(OBJDIR_DEBUG)/Debugger.o + +$(OBJDIR_DEBUG)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ControlRemoteProcess.cpp -o $(OBJDIR_DEBUG)/ControlRemoteProcess.o + +$(OBJDIR_DEBUG)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c CloseRemoteProcess.cpp -o $(OBJDIR_DEBUG)/CloseRemoteProcess.o + +$(OBJDIR_DEBUG)/BaeEngine.o: ../Dependencies/beaengine/src/BeaEngine.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/beaengine/src/BeaEngine.c -o $(OBJDIR_DEBUG)/BaeEngine.o + +clean_debug: + rm -f $(OBJ_DEBUG) $(OUT_DEBUG) + rm -rf build/debug + rm -rf $(OBJDIR_DEBUG) + +before_release: + test -d build/release || mkdir -p build/release + test -d $(OBJDIR_RELEASE) || mkdir -p $(OBJDIR_RELEASE) + +after_release: + +release: before_release out_release after_release + +out_release: before_release $(OBJ_RELEASE) $(DEP_RELEASE) + $(LD) $(LIBDIR_RELEASE) -o $(OUT_RELEASE) $(OBJ_RELEASE) $(LDFLAGS_RELEASE) $(LIB_RELEASE) + +$(OBJDIR_RELEASE)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c WriteRemoteMemory.cpp -o $(OBJDIR_RELEASE)/WriteRemoteMemory.o + +$(OBJDIR_RELEASE)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ReadRemoteMemory.cpp -o $(OBJDIR_RELEASE)/ReadRemoteMemory.o + +$(OBJDIR_RELEASE)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c OpenRemoteProcess.cpp -o $(OBJDIR_RELEASE)/OpenRemoteProcess.o + +$(OBJDIR_RELEASE)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c IsProcessValid.cpp -o $(OBJDIR_RELEASE)/IsProcessValid.o + +$(OBJDIR_RELEASE)/Input.o: Input.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c Input.cpp -o $(OBJDIR_RELEASE)/Input.o + +$(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o + +$(OBJDIR_RELEASE)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c EnumerateProcesses.cpp -o $(OBJDIR_RELEASE)/EnumerateProcesses.o + +$(OBJDIR_RELEASE)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c DisassembleCode.cpp -o $(OBJDIR_RELEASE)/DisassembleCode.o + +$(OBJDIR_RELEASE)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c Debugger.cpp -o $(OBJDIR_RELEASE)/Debugger.o + +$(OBJDIR_RELEASE)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ControlRemoteProcess.cpp -o $(OBJDIR_RELEASE)/ControlRemoteProcess.o + +$(OBJDIR_RELEASE)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c CloseRemoteProcess.cpp -o $(OBJDIR_RELEASE)/CloseRemoteProcess.o + +$(OBJDIR_RELEASE)/BaeEngine.o: ../Dependencies/beaengine/src/BeaEngine.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/beaengine/src/BeaEngine.c -o $(OBJDIR_RELEASE)/BaeEngine.o + +clean_release: + rm -f $(OBJ_RELEASE) $(OUT_RELEASE) + rm -rf build/release + rm -rf $(OBJDIR_RELEASE) + +.PHONY: before_debug after_debug clean_debug before_release after_release clean_release diff --git a/ReClass.NET/Makefile b/ReClass.NET/Makefile new file mode 100644 index 00000000..5d60e616 --- /dev/null +++ b/ReClass.NET/Makefile @@ -0,0 +1,20 @@ +all: debug release + +clean: clean_debug clean_release + +debug: + xbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj + xbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj + +clean_debug: + xbuild /t:Clean ReClass.NET.csproj + +release: + xbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj + xbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj + +clean_release: + xbuild /t:Clean ReClass.NET.csproj + +update: + mono --runtime=v4.0 ../Dependencies/nuget.exe restore ReClass.NET.csproj -SolutionDirectory ../ diff --git a/ReClass.NET/Memory/ProcessInfo.cs b/ReClass.NET/Memory/ProcessInfo.cs index 59390c84..b83a32d6 100644 --- a/ReClass.NET/Memory/ProcessInfo.cs +++ b/ReClass.NET/Memory/ProcessInfo.cs @@ -26,6 +26,11 @@ public ProcessInfo(IntPtr id, string name, string path) { using (var i = NativeMethods.GetIconForFile(Path)) { + if (i == null) + { + return null; + } + return i.ToBitmap(); } }); diff --git a/ReClass.NET/Plugins/PluginInfo.cs b/ReClass.NET/Plugins/PluginInfo.cs index f95a2350..6b0f0d53 100644 --- a/ReClass.NET/Plugins/PluginInfo.cs +++ b/ReClass.NET/Plugins/PluginInfo.cs @@ -34,7 +34,7 @@ public PluginInfo(string filePath, FileVersionInfo versionInfo) Contract.Requires(versionInfo != null); FilePath = filePath; - IsNative = versionInfo.ProductName == PluginNativeName; + IsNative = versionInfo.ProductName == null ? true : (versionInfo.ProductName == PluginNativeName); FileVersion = (versionInfo.FileVersion ?? string.Empty).Trim(); diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index df2228b1..6fc8587b 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -42,6 +42,8 @@ public void LoadAllPlugins(string path, ILogger logger) LoadPlugins(directory.GetFiles("*.dll"), logger); LoadPlugins(directory.GetFiles("*.exe"), logger); + + LoadPlugins(directory.GetFiles("*.so"), logger); } catch (Exception ex) { @@ -63,10 +65,10 @@ private void LoadPlugins(IEnumerable files, ILogger logger) { fvi = FileVersionInfo.GetVersionInfo(fi.FullName); - if (fvi.ProductName != PluginInfo.PluginName && fvi.ProductName != PluginInfo.PluginNativeName) + /*if (fvi.ProductName != PluginInfo.PluginName && fvi.ProductName != PluginInfo.PluginNativeName) { continue; - } + }*/ } catch { diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 4263b7bf..fe2f4b16 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -932,7 +932,8 @@ - powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" + date +"%Y/%m/%d %H:%M:%S" > $(ProjectDir)/Resources/BuildDate.txt @@ -947,4 +948,4 @@ --> - \ No newline at end of file + diff --git a/ReClass.NET_Launcher/Makefile b/ReClass.NET_Launcher/Makefile new file mode 100644 index 00000000..bc0a358e --- /dev/null +++ b/ReClass.NET_Launcher/Makefile @@ -0,0 +1,15 @@ +all: debug release + +clean: clean_debug clean_release + +debug: + xbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj + +clean_debug: + xbuild /t:Clean ReClass.NET_Launcher.csproj + +release: + xbuild /p:Configuration=Release ReClass.NET_Launcher.csproj + +clean_release: + xbuild /t:Clean ReClass.NET_Launcher.csproj From 40d6a0a43dfbfff7a39243e1d08559ea4e1b4a98 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 19 Nov 2017 23:01:01 +0100 Subject: [PATCH 210/777] Moved to Shared folder. --- NativeCore/{ => Shared}/Keys.hpp | 0 NativeCore/Unix/Input.cpp | 2 +- NativeCore/Windows/Input.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename NativeCore/{ => Shared}/Keys.hpp (100%) diff --git a/NativeCore/Keys.hpp b/NativeCore/Shared/Keys.hpp similarity index 100% rename from NativeCore/Keys.hpp rename to NativeCore/Shared/Keys.hpp diff --git a/NativeCore/Unix/Input.cpp b/NativeCore/Unix/Input.cpp index cc3f871d..3caf78ff 100644 --- a/NativeCore/Unix/Input.cpp +++ b/NativeCore/Unix/Input.cpp @@ -1,5 +1,5 @@ #include "NativeCore.hpp" -#include "../Keys.hpp" +#include "../Shared/Keys.hpp" void ReleaseInput(); diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 53ecd432..134fd611 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -4,7 +4,7 @@ #include #include "NativeCore.hpp" -#include "../Keys.hpp" +#include "../Shared/Keys.hpp" Keys mapping[]; From 69fe9813a8166119d8b6d297e81b9076cd9d4236 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 19 Nov 2017 23:01:19 +0100 Subject: [PATCH 211/777] Fixed check. --- NativeCore/Windows/DisassembleCode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index dc99a04a..25fe26b3 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -21,7 +21,7 @@ bool __stdcall DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer vi unsigned int instructionCount = 0; const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); - if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount == 1) + if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount != 1) { return false; } From 92d46dd34ab04e42f3a1abe9cde320c2f9ae667c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 19 Nov 2017 23:04:41 +0100 Subject: [PATCH 212/777] Use lower case instruction names. --- NativeCore/Dependencies/distorm/src/distorm.c | 22 +- .../Dependencies/distorm/src/mnemonics.c | 526 +++++++++--------- .../Dependencies/distorm/src/textdefs.c | 70 +-- 3 files changed, 309 insertions(+), 309 deletions(-) diff --git a/NativeCore/Dependencies/distorm/src/distorm.c b/NativeCore/Dependencies/distorm/src/distorm.c index f4bc9d81..351b38a1 100644 --- a/NativeCore/Dependencies/distorm/src/distorm.c +++ b/NativeCore/Dependencies/distorm/src/distorm.c @@ -103,13 +103,13 @@ static void distorm_format_size(_WString* str, const _DInst* di, int opNum) switch (di->ops[opNum].size) { case 0: break; /* OT_MEM's unknown size. */ - case 8: strcat_WSN(str, "BYTE "); break; - case 16: strcat_WSN(str, "WORD "); break; - case 32: strcat_WSN(str, "DWORD "); break; - case 64: strcat_WSN(str, "QWORD "); break; - case 80: strcat_WSN(str, "TBYTE "); break; - case 128: strcat_WSN(str, "DQWORD "); break; - case 256: strcat_WSN(str, "YWORD "); break; + case 8: strcat_WSN(str, "byte "); break; + case 16: strcat_WSN(str, "word "); break; + case 32: strcat_WSN(str, "dword "); break; + case 64: strcat_WSN(str, "qword "); break; + case 80: strcat_WSN(str, "tbyte "); break; + case 128: strcat_WSN(str, "dqword "); break; + case 256: strcat_WSN(str, "yword "); break; default: /* Big oh uh if it gets here. */ break; } } @@ -173,15 +173,15 @@ static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t switch (FLAG_GET_PREFIX(di->flags)) { case FLAG_LOCK: - strcpy_WSN(str, "LOCK "); + strcpy_WSN(str, "lock "); break; case FLAG_REP: /* REP prefix for CMPS and SCAS is really a REPZ. */ - if ((di->opcode == I_CMPS) || (di->opcode == I_SCAS)) strcpy_WSN(str, "REPZ "); - else strcpy_WSN(str, "REP "); + if ((di->opcode == I_CMPS) || (di->opcode == I_SCAS)) strcpy_WSN(str, "repz "); + else strcpy_WSN(str, "rep "); break; case FLAG_REPNZ: - strcpy_WSN(str, "REPNZ "); + strcpy_WSN(str, "repnz "); break; default: /* Init mnemonic string, cause next touch is concatenation. */ diff --git a/NativeCore/Dependencies/distorm/src/mnemonics.c b/NativeCore/Dependencies/distorm/src/mnemonics.c index ff00ac56..fa1c839e 100644 --- a/NativeCore/Dependencies/distorm/src/mnemonics.c +++ b/NativeCore/Dependencies/distorm/src/mnemonics.c @@ -14,271 +14,271 @@ This library is licensed under the BSD license. See the file COPYING. #ifndef DISTORM_LIGHT const unsigned char _MNEMONICS[] = -"\x09" "UNDEFINED\0" "\x03" "ADD\0" "\x04" "PUSH\0" "\x03" "POP\0" "\x02" "OR\0" \ -"\x03" "ADC\0" "\x03" "SBB\0" "\x03" "AND\0" "\x03" "DAA\0" "\x03" "SUB\0" \ -"\x03" "DAS\0" "\x03" "XOR\0" "\x03" "AAA\0" "\x03" "CMP\0" "\x03" "AAS\0" \ -"\x03" "INC\0" "\x03" "DEC\0" "\x05" "PUSHA\0" "\x04" "POPA\0" "\x05" "BOUND\0" \ -"\x04" "ARPL\0" "\x04" "IMUL\0" "\x03" "INS\0" "\x04" "OUTS\0" "\x02" "JO\0" \ -"\x03" "JNO\0" "\x02" "JB\0" "\x03" "JAE\0" "\x02" "JZ\0" "\x03" "JNZ\0" "\x03" "JBE\0" \ -"\x02" "JA\0" "\x02" "JS\0" "\x03" "JNS\0" "\x02" "JP\0" "\x03" "JNP\0" "\x02" "JL\0" \ -"\x03" "JGE\0" "\x03" "JLE\0" "\x02" "JG\0" "\x04" "TEST\0" "\x04" "XCHG\0" \ -"\x03" "MOV\0" "\x03" "LEA\0" "\x03" "CBW\0" "\x04" "CWDE\0" "\x04" "CDQE\0" \ -"\x03" "CWD\0" "\x03" "CDQ\0" "\x03" "CQO\0" "\x08" "CALL FAR\0" "\x05" "PUSHF\0" \ -"\x04" "POPF\0" "\x04" "SAHF\0" "\x04" "LAHF\0" "\x04" "MOVS\0" "\x04" "CMPS\0" \ -"\x04" "STOS\0" "\x04" "LODS\0" "\x04" "SCAS\0" "\x03" "RET\0" "\x03" "LES\0" \ -"\x03" "LDS\0" "\x05" "ENTER\0" "\x05" "LEAVE\0" "\x04" "RETF\0" "\x05" "INT 3\0" \ -"\x03" "INT\0" "\x04" "INTO\0" "\x04" "IRET\0" "\x03" "AAM\0" "\x03" "AAD\0" \ -"\x04" "SALC\0" "\x04" "XLAT\0" "\x06" "LOOPNZ\0" "\x05" "LOOPZ\0" "\x04" "LOOP\0" \ -"\x04" "JCXZ\0" "\x05" "JECXZ\0" "\x05" "JRCXZ\0" "\x02" "IN\0" "\x03" "OUT\0" \ -"\x04" "CALL\0" "\x03" "JMP\0" "\x07" "JMP FAR\0" "\x04" "INT1\0" "\x03" "HLT\0" \ -"\x03" "CMC\0" "\x03" "CLC\0" "\x03" "STC\0" "\x03" "CLI\0" "\x03" "STI\0" \ -"\x03" "CLD\0" "\x03" "STD\0" "\x03" "LAR\0" "\x03" "LSL\0" "\x07" "SYSCALL\0" \ -"\x04" "CLTS\0" "\x06" "SYSRET\0" "\x04" "INVD\0" "\x06" "WBINVD\0" "\x03" "UD2\0" \ -"\x05" "FEMMS\0" "\x03" "NOP\0" "\x05" "WRMSR\0" "\x05" "RDTSC\0" "\x05" "RDMSR\0" \ -"\x05" "RDPMC\0" "\x08" "SYSENTER\0" "\x07" "SYSEXIT\0" "\x06" "GETSEC\0" "\x05" "CMOVO\0" \ -"\x06" "CMOVNO\0" "\x05" "CMOVB\0" "\x06" "CMOVAE\0" "\x05" "CMOVZ\0" "\x06" "CMOVNZ\0" \ -"\x06" "CMOVBE\0" "\x05" "CMOVA\0" "\x05" "CMOVS\0" "\x06" "CMOVNS\0" "\x05" "CMOVP\0" \ -"\x06" "CMOVNP\0" "\x05" "CMOVL\0" "\x06" "CMOVGE\0" "\x06" "CMOVLE\0" "\x05" "CMOVG\0" \ -"\x04" "SETO\0" "\x05" "SETNO\0" "\x04" "SETB\0" "\x05" "SETAE\0" "\x04" "SETZ\0" \ -"\x05" "SETNZ\0" "\x05" "SETBE\0" "\x04" "SETA\0" "\x04" "SETS\0" "\x05" "SETNS\0" \ -"\x04" "SETP\0" "\x05" "SETNP\0" "\x04" "SETL\0" "\x05" "SETGE\0" "\x05" "SETLE\0" \ -"\x04" "SETG\0" "\x05" "CPUID\0" "\x02" "BT\0" "\x04" "SHLD\0" "\x03" "RSM\0" \ -"\x03" "BTS\0" "\x04" "SHRD\0" "\x07" "CMPXCHG\0" "\x03" "LSS\0" "\x03" "BTR\0" \ -"\x03" "LFS\0" "\x03" "LGS\0" "\x05" "MOVZX\0" "\x03" "BTC\0" "\x05" "MOVSX\0" \ -"\x04" "XADD\0" "\x06" "MOVNTI\0" "\x05" "BSWAP\0" "\x03" "ROL\0" "\x03" "ROR\0" \ -"\x03" "RCL\0" "\x03" "RCR\0" "\x03" "SHL\0" "\x03" "SHR\0" "\x03" "SAL\0" \ -"\x03" "SAR\0" "\x06" "XABORT\0" "\x06" "XBEGIN\0" "\x04" "FADD\0" "\x04" "FMUL\0" \ -"\x04" "FCOM\0" "\x05" "FCOMP\0" "\x04" "FSUB\0" "\x05" "FSUBR\0" "\x04" "FDIV\0" \ -"\x05" "FDIVR\0" "\x03" "FLD\0" "\x03" "FST\0" "\x04" "FSTP\0" "\x06" "FLDENV\0" \ -"\x05" "FLDCW\0" "\x04" "FXCH\0" "\x04" "FNOP\0" "\x04" "FCHS\0" "\x04" "FABS\0" \ -"\x04" "FTST\0" "\x04" "FXAM\0" "\x04" "FLD1\0" "\x06" "FLDL2T\0" "\x06" "FLDL2E\0" \ -"\x05" "FLDPI\0" "\x06" "FLDLG2\0" "\x06" "FLDLN2\0" "\x04" "FLDZ\0" "\x05" "F2XM1\0" \ -"\x05" "FYL2X\0" "\x05" "FPTAN\0" "\x06" "FPATAN\0" "\x07" "FXTRACT\0" "\x06" "FPREM1\0" \ -"\x07" "FDECSTP\0" "\x07" "FINCSTP\0" "\x05" "FPREM\0" "\x07" "FYL2XP1\0" "\x05" "FSQRT\0" \ -"\x07" "FSINCOS\0" "\x07" "FRNDINT\0" "\x06" "FSCALE\0" "\x04" "FSIN\0" "\x04" "FCOS\0" \ -"\x05" "FIADD\0" "\x05" "FIMUL\0" "\x05" "FICOM\0" "\x06" "FICOMP\0" "\x05" "FISUB\0" \ -"\x06" "FISUBR\0" "\x05" "FIDIV\0" "\x06" "FIDIVR\0" "\x06" "FCMOVB\0" "\x06" "FCMOVE\0" \ -"\x07" "FCMOVBE\0" "\x06" "FCMOVU\0" "\x07" "FUCOMPP\0" "\x04" "FILD\0" "\x06" "FISTTP\0" \ -"\x04" "FIST\0" "\x05" "FISTP\0" "\x07" "FCMOVNB\0" "\x07" "FCMOVNE\0" "\x08" "FCMOVNBE\0" \ -"\x07" "FCMOVNU\0" "\x04" "FENI\0" "\x06" "FEDISI\0" "\x06" "FSETPM\0" "\x06" "FUCOMI\0" \ -"\x05" "FCOMI\0" "\x06" "FRSTOR\0" "\x05" "FFREE\0" "\x05" "FUCOM\0" "\x06" "FUCOMP\0" \ -"\x05" "FADDP\0" "\x05" "FMULP\0" "\x06" "FCOMPP\0" "\x06" "FSUBRP\0" "\x05" "FSUBP\0" \ -"\x06" "FDIVRP\0" "\x05" "FDIVP\0" "\x04" "FBLD\0" "\x05" "FBSTP\0" "\x07" "FUCOMIP\0" \ -"\x06" "FCOMIP\0" "\x03" "NOT\0" "\x03" "NEG\0" "\x03" "MUL\0" "\x03" "DIV\0" \ -"\x04" "IDIV\0" "\x04" "SLDT\0" "\x03" "STR\0" "\x04" "LLDT\0" "\x03" "LTR\0" \ -"\x04" "VERR\0" "\x04" "VERW\0" "\x04" "SGDT\0" "\x04" "SIDT\0" "\x04" "LGDT\0" \ -"\x04" "LIDT\0" "\x04" "SMSW\0" "\x04" "LMSW\0" "\x06" "INVLPG\0" "\x06" "VMCALL\0" \ -"\x08" "VMLAUNCH\0" "\x08" "VMRESUME\0" "\x06" "VMXOFF\0" "\x07" "MONITOR\0" \ -"\x05" "MWAIT\0" "\x06" "XGETBV\0" "\x06" "XSETBV\0" "\x06" "VMFUNC\0" "\x04" "XEND\0" \ -"\x05" "VMRUN\0" "\x07" "VMMCALL\0" "\x06" "VMLOAD\0" "\x06" "VMSAVE\0" "\x04" "STGI\0" \ -"\x04" "CLGI\0" "\x06" "SKINIT\0" "\x07" "INVLPGA\0" "\x06" "SWAPGS\0" "\x06" "RDTSCP\0" \ -"\x08" "PREFETCH\0" "\x09" "PREFETCHW\0" "\x05" "PI2FW\0" "\x05" "PI2FD\0" \ -"\x05" "PF2IW\0" "\x05" "PF2ID\0" "\x06" "PFNACC\0" "\x07" "PFPNACC\0" "\x07" "PFCMPGE\0" \ -"\x05" "PFMIN\0" "\x05" "PFRCP\0" "\x07" "PFRSQRT\0" "\x05" "PFSUB\0" "\x05" "PFADD\0" \ -"\x07" "PFCMPGT\0" "\x05" "PFMAX\0" "\x08" "PFRCPIT1\0" "\x08" "PFRSQIT1\0" \ -"\x06" "PFSUBR\0" "\x05" "PFACC\0" "\x07" "PFCMPEQ\0" "\x05" "PFMUL\0" "\x08" "PFRCPIT2\0" \ -"\x07" "PMULHRW\0" "\x06" "PSWAPD\0" "\x07" "PAVGUSB\0" "\x06" "MOVUPS\0" "\x06" "MOVUPD\0" \ -"\x05" "MOVSS\0" "\x05" "MOVSD\0" "\x07" "VMOVUPS\0" "\x07" "VMOVUPD\0" "\x06" "VMOVSS\0" \ -"\x06" "VMOVSD\0" "\x07" "MOVHLPS\0" "\x06" "MOVLPS\0" "\x06" "MOVLPD\0" "\x08" "MOVSLDUP\0" \ -"\x07" "MOVDDUP\0" "\x08" "VMOVHLPS\0" "\x07" "VMOVLPS\0" "\x07" "VMOVLPD\0" \ -"\x09" "VMOVSLDUP\0" "\x08" "VMOVDDUP\0" "\x08" "UNPCKLPS\0" "\x08" "UNPCKLPD\0" \ -"\x09" "VUNPCKLPS\0" "\x09" "VUNPCKLPD\0" "\x08" "UNPCKHPS\0" "\x08" "UNPCKHPD\0" \ -"\x09" "VUNPCKHPS\0" "\x09" "VUNPCKHPD\0" "\x07" "MOVLHPS\0" "\x06" "MOVHPS\0" \ -"\x06" "MOVHPD\0" "\x08" "MOVSHDUP\0" "\x08" "VMOVLHPS\0" "\x07" "VMOVHPS\0" \ -"\x07" "VMOVHPD\0" "\x09" "VMOVSHDUP\0" "\x0b" "PREFETCHNTA\0" "\x0a" "PREFETCHT0\0" \ -"\x0a" "PREFETCHT1\0" "\x0a" "PREFETCHT2\0" "\x06" "MOVAPS\0" "\x06" "MOVAPD\0" \ -"\x07" "VMOVAPS\0" "\x07" "VMOVAPD\0" "\x08" "CVTPI2PS\0" "\x08" "CVTPI2PD\0" \ -"\x08" "CVTSI2SS\0" "\x08" "CVTSI2SD\0" "\x09" "VCVTSI2SS\0" "\x09" "VCVTSI2SD\0" \ -"\x07" "MOVNTPS\0" "\x07" "MOVNTPD\0" "\x07" "MOVNTSS\0" "\x07" "MOVNTSD\0" \ -"\x08" "VMOVNTPS\0" "\x08" "VMOVNTPD\0" "\x09" "CVTTPS2PI\0" "\x09" "CVTTPD2PI\0" \ -"\x09" "CVTTSS2SI\0" "\x09" "CVTTSD2SI\0" "\x0a" "VCVTTSS2SI\0" "\x0a" "VCVTTSD2SI\0" \ -"\x08" "CVTPS2PI\0" "\x08" "CVTPD2PI\0" "\x08" "CVTSS2SI\0" "\x08" "CVTSD2SI\0" \ -"\x09" "VCVTSS2SI\0" "\x09" "VCVTSD2SI\0" "\x07" "UCOMISS\0" "\x07" "UCOMISD\0" \ -"\x08" "VUCOMISS\0" "\x08" "VUCOMISD\0" "\x06" "COMISS\0" "\x06" "COMISD\0" \ -"\x07" "VCOMISS\0" "\x07" "VCOMISD\0" "\x08" "MOVMSKPS\0" "\x08" "MOVMSKPD\0" \ -"\x09" "VMOVMSKPS\0" "\x09" "VMOVMSKPD\0" "\x06" "SQRTPS\0" "\x06" "SQRTPD\0" \ -"\x06" "SQRTSS\0" "\x06" "SQRTSD\0" "\x07" "VSQRTPS\0" "\x07" "VSQRTPD\0" "\x07" "VSQRTSS\0" \ -"\x07" "VSQRTSD\0" "\x07" "RSQRTPS\0" "\x07" "RSQRTSS\0" "\x08" "VRSQRTPS\0" \ -"\x08" "VRSQRTSS\0" "\x05" "RCPPS\0" "\x05" "RCPSS\0" "\x06" "VRCPPS\0" "\x06" "VRCPSS\0" \ -"\x05" "ANDPS\0" "\x05" "ANDPD\0" "\x06" "VANDPS\0" "\x06" "VANDPD\0" "\x06" "ANDNPS\0" \ -"\x06" "ANDNPD\0" "\x07" "VANDNPS\0" "\x07" "VANDNPD\0" "\x04" "ORPS\0" "\x04" "ORPD\0" \ -"\x05" "VORPS\0" "\x05" "VORPD\0" "\x05" "XORPS\0" "\x05" "XORPD\0" "\x06" "VXORPS\0" \ -"\x06" "VXORPD\0" "\x05" "ADDPS\0" "\x05" "ADDPD\0" "\x05" "ADDSS\0" "\x05" "ADDSD\0" \ -"\x06" "VADDPS\0" "\x06" "VADDPD\0" "\x06" "VADDSS\0" "\x06" "VADDSD\0" "\x05" "MULPS\0" \ -"\x05" "MULPD\0" "\x05" "MULSS\0" "\x05" "MULSD\0" "\x06" "VMULPS\0" "\x06" "VMULPD\0" \ -"\x06" "VMULSS\0" "\x06" "VMULSD\0" "\x08" "CVTPS2PD\0" "\x08" "CVTPD2PS\0" \ -"\x08" "CVTSS2SD\0" "\x08" "CVTSD2SS\0" "\x09" "VCVTPS2PD\0" "\x09" "VCVTPD2PS\0" \ -"\x09" "VCVTSS2SD\0" "\x09" "VCVTSD2SS\0" "\x08" "CVTDQ2PS\0" "\x08" "CVTPS2DQ\0" \ -"\x09" "CVTTPS2DQ\0" "\x09" "VCVTDQ2PS\0" "\x09" "VCVTPS2DQ\0" "\x0a" "VCVTTPS2DQ\0" \ -"\x05" "SUBPS\0" "\x05" "SUBPD\0" "\x05" "SUBSS\0" "\x05" "SUBSD\0" "\x06" "VSUBPS\0" \ -"\x06" "VSUBPD\0" "\x06" "VSUBSS\0" "\x06" "VSUBSD\0" "\x05" "MINPS\0" "\x05" "MINPD\0" \ -"\x05" "MINSS\0" "\x05" "MINSD\0" "\x06" "VMINPS\0" "\x06" "VMINPD\0" "\x06" "VMINSS\0" \ -"\x06" "VMINSD\0" "\x05" "DIVPS\0" "\x05" "DIVPD\0" "\x05" "DIVSS\0" "\x05" "DIVSD\0" \ -"\x06" "VDIVPS\0" "\x06" "VDIVPD\0" "\x06" "VDIVSS\0" "\x06" "VDIVSD\0" "\x05" "MAXPS\0" \ -"\x05" "MAXPD\0" "\x05" "MAXSS\0" "\x05" "MAXSD\0" "\x06" "VMAXPS\0" "\x06" "VMAXPD\0" \ -"\x06" "VMAXSS\0" "\x06" "VMAXSD\0" "\x09" "PUNPCKLBW\0" "\x0a" "VPUNPCKLBW\0" \ -"\x09" "PUNPCKLWD\0" "\x0a" "VPUNPCKLWD\0" "\x09" "PUNPCKLDQ\0" "\x0a" "VPUNPCKLDQ\0" \ -"\x08" "PACKSSWB\0" "\x09" "VPACKSSWB\0" "\x07" "PCMPGTB\0" "\x08" "VPCMPGTB\0" \ -"\x07" "PCMPGTW\0" "\x08" "VPCMPGTW\0" "\x07" "PCMPGTD\0" "\x08" "VPCMPGTD\0" \ -"\x08" "PACKUSWB\0" "\x09" "VPACKUSWB\0" "\x09" "PUNPCKHBW\0" "\x0a" "VPUNPCKHBW\0" \ -"\x09" "PUNPCKHWD\0" "\x0a" "VPUNPCKHWD\0" "\x09" "PUNPCKHDQ\0" "\x0a" "VPUNPCKHDQ\0" \ -"\x08" "PACKSSDW\0" "\x09" "VPACKSSDW\0" "\x0a" "PUNPCKLQDQ\0" "\x0b" "VPUNPCKLQDQ\0" \ -"\x0a" "PUNPCKHQDQ\0" "\x0b" "VPUNPCKHQDQ\0" "\x04" "MOVD\0" "\x04" "MOVQ\0" \ -"\x05" "VMOVD\0" "\x05" "VMOVQ\0" "\x06" "MOVDQA\0" "\x06" "MOVDQU\0" "\x07" "VMOVDQA\0" \ -"\x07" "VMOVDQU\0" "\x06" "PSHUFW\0" "\x06" "PSHUFD\0" "\x07" "PSHUFHW\0" "\x07" "PSHUFLW\0" \ -"\x07" "VPSHUFD\0" "\x08" "VPSHUFHW\0" "\x08" "VPSHUFLW\0" "\x07" "PCMPEQB\0" \ -"\x08" "VPCMPEQB\0" "\x07" "PCMPEQW\0" "\x08" "VPCMPEQW\0" "\x07" "PCMPEQD\0" \ -"\x08" "VPCMPEQD\0" "\x04" "EMMS\0" "\x0a" "VZEROUPPER\0" "\x08" "VZEROALL\0" \ -"\x06" "VMREAD\0" "\x05" "EXTRQ\0" "\x07" "INSERTQ\0" "\x07" "VMWRITE\0" "\x08" "CVTPH2PS\0" \ -"\x08" "CVTPS2PH\0" "\x06" "HADDPD\0" "\x06" "HADDPS\0" "\x07" "VHADDPD\0" \ -"\x07" "VHADDPS\0" "\x06" "HSUBPD\0" "\x06" "HSUBPS\0" "\x07" "VHSUBPD\0" "\x07" "VHSUBPS\0" \ -"\x05" "XSAVE\0" "\x07" "XSAVE64\0" "\x06" "LFENCE\0" "\x06" "XRSTOR\0" "\x08" "XRSTOR64\0" \ -"\x06" "MFENCE\0" "\x08" "XSAVEOPT\0" "\x0a" "XSAVEOPT64\0" "\x06" "SFENCE\0" \ -"\x07" "CLFLUSH\0" "\x06" "POPCNT\0" "\x03" "BSF\0" "\x05" "TZCNT\0" "\x03" "BSR\0" \ -"\x05" "LZCNT\0" "\x07" "CMPEQPS\0" "\x07" "CMPLTPS\0" "\x07" "CMPLEPS\0" "\x0a" "CMPUNORDPS\0" \ -"\x08" "CMPNEQPS\0" "\x08" "CMPNLTPS\0" "\x08" "CMPNLEPS\0" "\x08" "CMPORDPS\0" \ -"\x07" "CMPEQPD\0" "\x07" "CMPLTPD\0" "\x07" "CMPLEPD\0" "\x0a" "CMPUNORDPD\0" \ -"\x08" "CMPNEQPD\0" "\x08" "CMPNLTPD\0" "\x08" "CMPNLEPD\0" "\x08" "CMPORDPD\0" \ -"\x07" "CMPEQSS\0" "\x07" "CMPLTSS\0" "\x07" "CMPLESS\0" "\x0a" "CMPUNORDSS\0" \ -"\x08" "CMPNEQSS\0" "\x08" "CMPNLTSS\0" "\x08" "CMPNLESS\0" "\x08" "CMPORDSS\0" \ -"\x07" "CMPEQSD\0" "\x07" "CMPLTSD\0" "\x07" "CMPLESD\0" "\x0a" "CMPUNORDSD\0" \ -"\x08" "CMPNEQSD\0" "\x08" "CMPNLTSD\0" "\x08" "CMPNLESD\0" "\x08" "CMPORDSD\0" \ -"\x08" "VCMPEQPS\0" "\x08" "VCMPLTPS\0" "\x08" "VCMPLEPS\0" "\x0b" "VCMPUNORDPS\0" \ -"\x09" "VCMPNEQPS\0" "\x09" "VCMPNLTPS\0" "\x09" "VCMPNLEPS\0" "\x09" "VCMPORDPS\0" \ -"\x0b" "VCMPEQ_UQPS\0" "\x09" "VCMPNGEPS\0" "\x09" "VCMPNGTPS\0" "\x0b" "VCMPFALSEPS\0" \ -"\x0c" "VCMPNEQ_OQPS\0" "\x08" "VCMPGEPS\0" "\x08" "VCMPGTPS\0" "\x0a" "VCMPTRUEPS\0" \ -"\x0b" "VCMPEQ_OSPS\0" "\x0b" "VCMPLT_OQPS\0" "\x0b" "VCMPLE_OQPS\0" "\x0d" "VCMPUNORD_SPS\0" \ -"\x0c" "VCMPNEQ_USPS\0" "\x0c" "VCMPNLT_UQPS\0" "\x0c" "VCMPNLE_UQPS\0" "\x0b" "VCMPORD_SPS\0" \ -"\x0b" "VCMPEQ_USPS\0" "\x0c" "VCMPNGE_UQPS\0" "\x0c" "VCMPNGT_UQPS\0" "\x0e" "VCMPFALSE_OSPS\0" \ -"\x0c" "VCMPNEQ_OSPS\0" "\x0b" "VCMPGE_OQPS\0" "\x0b" "VCMPGT_OQPS\0" "\x0d" "VCMPTRUE_USPS\0" \ -"\x08" "VCMPEQPD\0" "\x08" "VCMPLTPD\0" "\x08" "VCMPLEPD\0" "\x0b" "VCMPUNORDPD\0" \ -"\x09" "VCMPNEQPD\0" "\x09" "VCMPNLTPD\0" "\x09" "VCMPNLEPD\0" "\x09" "VCMPORDPD\0" \ -"\x0b" "VCMPEQ_UQPD\0" "\x09" "VCMPNGEPD\0" "\x09" "VCMPNGTPD\0" "\x0b" "VCMPFALSEPD\0" \ -"\x0c" "VCMPNEQ_OQPD\0" "\x08" "VCMPGEPD\0" "\x08" "VCMPGTPD\0" "\x0a" "VCMPTRUEPD\0" \ -"\x0b" "VCMPEQ_OSPD\0" "\x0b" "VCMPLT_OQPD\0" "\x0b" "VCMPLE_OQPD\0" "\x0d" "VCMPUNORD_SPD\0" \ -"\x0c" "VCMPNEQ_USPD\0" "\x0c" "VCMPNLT_UQPD\0" "\x0c" "VCMPNLE_UQPD\0" "\x0b" "VCMPORD_SPD\0" \ -"\x0b" "VCMPEQ_USPD\0" "\x0c" "VCMPNGE_UQPD\0" "\x0c" "VCMPNGT_UQPD\0" "\x0e" "VCMPFALSE_OSPD\0" \ -"\x0c" "VCMPNEQ_OSPD\0" "\x0b" "VCMPGE_OQPD\0" "\x0b" "VCMPGT_OQPD\0" "\x0d" "VCMPTRUE_USPD\0" \ -"\x08" "VCMPEQSS\0" "\x08" "VCMPLTSS\0" "\x08" "VCMPLESS\0" "\x0b" "VCMPUNORDSS\0" \ -"\x09" "VCMPNEQSS\0" "\x09" "VCMPNLTSS\0" "\x09" "VCMPNLESS\0" "\x09" "VCMPORDSS\0" \ -"\x0b" "VCMPEQ_UQSS\0" "\x09" "VCMPNGESS\0" "\x09" "VCMPNGTSS\0" "\x0b" "VCMPFALSESS\0" \ -"\x0c" "VCMPNEQ_OQSS\0" "\x08" "VCMPGESS\0" "\x08" "VCMPGTSS\0" "\x0a" "VCMPTRUESS\0" \ -"\x0b" "VCMPEQ_OSSS\0" "\x0b" "VCMPLT_OQSS\0" "\x0b" "VCMPLE_OQSS\0" "\x0d" "VCMPUNORD_SSS\0" \ -"\x0c" "VCMPNEQ_USSS\0" "\x0c" "VCMPNLT_UQSS\0" "\x0c" "VCMPNLE_UQSS\0" "\x0b" "VCMPORD_SSS\0" \ -"\x0b" "VCMPEQ_USSS\0" "\x0c" "VCMPNGE_UQSS\0" "\x0c" "VCMPNGT_UQSS\0" "\x0e" "VCMPFALSE_OSSS\0" \ -"\x0c" "VCMPNEQ_OSSS\0" "\x0b" "VCMPGE_OQSS\0" "\x0b" "VCMPGT_OQSS\0" "\x0d" "VCMPTRUE_USSS\0" \ -"\x08" "VCMPEQSD\0" "\x08" "VCMPLTSD\0" "\x08" "VCMPLESD\0" "\x0b" "VCMPUNORDSD\0" \ -"\x09" "VCMPNEQSD\0" "\x09" "VCMPNLTSD\0" "\x09" "VCMPNLESD\0" "\x09" "VCMPORDSD\0" \ -"\x0b" "VCMPEQ_UQSD\0" "\x09" "VCMPNGESD\0" "\x09" "VCMPNGTSD\0" "\x0b" "VCMPFALSESD\0" \ -"\x0c" "VCMPNEQ_OQSD\0" "\x08" "VCMPGESD\0" "\x08" "VCMPGTSD\0" "\x0a" "VCMPTRUESD\0" \ -"\x0b" "VCMPEQ_OSSD\0" "\x0b" "VCMPLT_OQSD\0" "\x0b" "VCMPLE_OQSD\0" "\x0d" "VCMPUNORD_SSD\0" \ -"\x0c" "VCMPNEQ_USSD\0" "\x0c" "VCMPNLT_UQSD\0" "\x0c" "VCMPNLE_UQSD\0" "\x0b" "VCMPORD_SSD\0" \ -"\x0b" "VCMPEQ_USSD\0" "\x0c" "VCMPNGE_UQSD\0" "\x0c" "VCMPNGT_UQSD\0" "\x0e" "VCMPFALSE_OSSD\0" \ -"\x0c" "VCMPNEQ_OSSD\0" "\x0b" "VCMPGE_OQSD\0" "\x0b" "VCMPGT_OQSD\0" "\x0d" "VCMPTRUE_USSD\0" \ -"\x06" "PINSRW\0" "\x07" "VPINSRW\0" "\x06" "PEXTRW\0" "\x07" "VPEXTRW\0" "\x06" "SHUFPS\0" \ -"\x06" "SHUFPD\0" "\x07" "VSHUFPS\0" "\x07" "VSHUFPD\0" "\x09" "CMPXCHG8B\0" \ -"\x0a" "CMPXCHG16B\0" "\x07" "VMPTRST\0" "\x08" "ADDSUBPD\0" "\x08" "ADDSUBPS\0" \ -"\x09" "VADDSUBPD\0" "\x09" "VADDSUBPS\0" "\x05" "PSRLW\0" "\x06" "VPSRLW\0" \ -"\x05" "PSRLD\0" "\x06" "VPSRLD\0" "\x05" "PSRLQ\0" "\x06" "VPSRLQ\0" "\x05" "PADDQ\0" \ -"\x06" "VPADDQ\0" "\x06" "PMULLW\0" "\x07" "VPMULLW\0" "\x07" "MOVQ2DQ\0" "\x07" "MOVDQ2Q\0" \ -"\x08" "PMOVMSKB\0" "\x09" "VPMOVMSKB\0" "\x07" "PSUBUSB\0" "\x08" "VPSUBUSB\0" \ -"\x07" "PSUBUSW\0" "\x08" "VPSUBUSW\0" "\x06" "PMINUB\0" "\x07" "VPMINUB\0" \ -"\x04" "PAND\0" "\x05" "VPAND\0" "\x07" "PADDUSB\0" "\x08" "VPADDUSW\0" "\x07" "PADDUSW\0" \ -"\x06" "PMAXUB\0" "\x07" "VPMAXUB\0" "\x05" "PANDN\0" "\x06" "VPANDN\0" "\x05" "PAVGB\0" \ -"\x06" "VPAVGB\0" "\x05" "PSRAW\0" "\x06" "VPSRAW\0" "\x05" "PSRAD\0" "\x06" "VPSRAD\0" \ -"\x05" "PAVGW\0" "\x06" "VPAVGW\0" "\x07" "PMULHUW\0" "\x08" "VPMULHUW\0" "\x06" "PMULHW\0" \ -"\x07" "VPMULHW\0" "\x09" "CVTTPD2DQ\0" "\x08" "CVTDQ2PD\0" "\x08" "CVTPD2DQ\0" \ -"\x0a" "VCVTTPD2DQ\0" "\x09" "VCVTDQ2PD\0" "\x09" "VCVTPD2DQ\0" "\x06" "MOVNTQ\0" \ -"\x07" "MOVNTDQ\0" "\x08" "VMOVNTDQ\0" "\x06" "PSUBSB\0" "\x07" "VPSUBSB\0" \ -"\x06" "PSUBSW\0" "\x07" "VPSUBSW\0" "\x06" "PMINSW\0" "\x07" "VPMINSW\0" "\x03" "POR\0" \ -"\x04" "VPOR\0" "\x06" "PADDSB\0" "\x07" "VPADDSB\0" "\x06" "PADDSW\0" "\x07" "VPADDSW\0" \ -"\x06" "PMAXSW\0" "\x07" "VPMAXSW\0" "\x04" "PXOR\0" "\x05" "VPXOR\0" "\x05" "LDDQU\0" \ -"\x06" "VLDDQU\0" "\x05" "PSLLW\0" "\x06" "VPSLLW\0" "\x05" "PSLLD\0" "\x06" "VPSLLD\0" \ -"\x05" "PSLLQ\0" "\x06" "VPSLLQ\0" "\x07" "PMULUDQ\0" "\x08" "VPMULUDQ\0" "\x07" "PMADDWD\0" \ -"\x08" "VPMADDWD\0" "\x06" "PSADBW\0" "\x07" "VPSADBW\0" "\x08" "MASKMOVQ\0" \ -"\x0a" "MASKMOVDQU\0" "\x0b" "VMASKMOVDQU\0" "\x05" "PSUBB\0" "\x06" "VPSUBB\0" \ -"\x05" "PSUBW\0" "\x06" "VPSUBW\0" "\x05" "PSUBD\0" "\x06" "VPSUBD\0" "\x05" "PSUBQ\0" \ -"\x06" "VPSUBQ\0" "\x05" "PADDB\0" "\x06" "VPADDB\0" "\x05" "PADDW\0" "\x06" "VPADDW\0" \ -"\x05" "PADDD\0" "\x06" "VPADDD\0" "\x07" "FNSTENV\0" "\x06" "FSTENV\0" "\x06" "FNSTCW\0" \ -"\x05" "FSTCW\0" "\x06" "FNCLEX\0" "\x05" "FCLEX\0" "\x06" "FNINIT\0" "\x05" "FINIT\0" \ -"\x06" "FNSAVE\0" "\x05" "FSAVE\0" "\x06" "FNSTSW\0" "\x05" "FSTSW\0" "\x06" "PSHUFB\0" \ -"\x07" "VPSHUFB\0" "\x06" "PHADDW\0" "\x07" "VPHADDW\0" "\x06" "PHADDD\0" "\x07" "VPHADDD\0" \ -"\x07" "PHADDSW\0" "\x08" "VPHADDSW\0" "\x09" "PMADDUBSW\0" "\x0a" "VPMADDUBSW\0" \ -"\x06" "PHSUBW\0" "\x07" "VPHSUBW\0" "\x06" "PHSUBD\0" "\x07" "VPHSUBD\0" "\x07" "PHSUBSW\0" \ -"\x08" "VPHSUBSW\0" "\x06" "PSIGNB\0" "\x07" "VPSIGNB\0" "\x06" "PSIGNW\0" \ -"\x07" "VPSIGNW\0" "\x06" "PSIGND\0" "\x07" "VPSIGND\0" "\x08" "PMULHRSW\0" \ -"\x09" "VPMULHRSW\0" "\x09" "VPERMILPS\0" "\x09" "VPERMILPD\0" "\x07" "VTESTPS\0" \ -"\x07" "VTESTPD\0" "\x08" "PBLENDVB\0" "\x08" "BLENDVPS\0" "\x08" "BLENDVPD\0" \ -"\x05" "PTEST\0" "\x06" "VPTEST\0" "\x0c" "VBROADCASTSS\0" "\x0c" "VBROADCASTSD\0" \ -"\x0e" "VBROADCASTF128\0" "\x05" "PABSB\0" "\x06" "VPABSB\0" "\x05" "PABSW\0" \ -"\x06" "VPABSW\0" "\x05" "PABSD\0" "\x06" "VPABSD\0" "\x08" "PMOVSXBW\0" "\x09" "VPMOVSXBW\0" \ -"\x08" "PMOVSXBD\0" "\x09" "VPMOVSXBD\0" "\x08" "PMOVSXBQ\0" "\x09" "VPMOVSXBQ\0" \ -"\x08" "PMOVSXWD\0" "\x09" "VPMOVSXWD\0" "\x08" "PMOVSXWQ\0" "\x09" "VPMOVSXWQ\0" \ -"\x08" "PMOVSXDQ\0" "\x09" "VPMOVSXDQ\0" "\x06" "PMULDQ\0" "\x07" "VPMULDQ\0" \ -"\x07" "PCMPEQQ\0" "\x08" "VPCMPEQQ\0" "\x08" "MOVNTDQA\0" "\x09" "VMOVNTDQA\0" \ -"\x08" "PACKUSDW\0" "\x09" "VPACKUSDW\0" "\x0a" "VMASKMOVPS\0" "\x0a" "VMASKMOVPD\0" \ -"\x08" "PMOVZXBW\0" "\x09" "VPMOVZXBW\0" "\x08" "PMOVZXBD\0" "\x09" "VPMOVZXBD\0" \ -"\x08" "PMOVZXBQ\0" "\x09" "VPMOVZXBQ\0" "\x08" "PMOVZXWD\0" "\x09" "VPMOVZXWD\0" \ -"\x08" "PMOVZXWQ\0" "\x09" "VPMOVZXWQ\0" "\x08" "PMOVZXDQ\0" "\x09" "VPMOVZXDQ\0" \ -"\x07" "PCMPGTQ\0" "\x08" "VPCMPGTQ\0" "\x06" "PMINSB\0" "\x07" "VPMINSB\0" \ -"\x06" "PMINSD\0" "\x07" "VPMINSD\0" "\x06" "PMINUW\0" "\x07" "VPMINUW\0" "\x06" "PMINUD\0" \ -"\x07" "VPMINUD\0" "\x06" "PMAXSB\0" "\x07" "VPMAXSB\0" "\x06" "PMAXSD\0" "\x07" "VPMAXSD\0" \ -"\x06" "PMAXUW\0" "\x07" "VPMAXUW\0" "\x06" "PMAXUD\0" "\x07" "VPMAXUD\0" "\x06" "PMULLD\0" \ -"\x07" "VPMULLD\0" "\x0a" "PHMINPOSUW\0" "\x0b" "VPHMINPOSUW\0" "\x06" "INVEPT\0" \ -"\x07" "INVVPID\0" "\x07" "INVPCID\0" "\x0e" "VFMADDSUB132PS\0" "\x0e" "VFMADDSUB132PD\0" \ -"\x0e" "VFMSUBADD132PS\0" "\x0e" "VFMSUBADD132PD\0" "\x0b" "VFMADD132PS\0" \ -"\x0b" "VFMADD132PD\0" "\x0b" "VFMADD132SS\0" "\x0b" "VFMADD132SD\0" "\x0b" "VFMSUB132PS\0" \ -"\x0b" "VFMSUB132PD\0" "\x0b" "VFMSUB132SS\0" "\x0b" "VFMSUB132SD\0" "\x0c" "VFNMADD132PS\0" \ -"\x0c" "VFNMADD132PD\0" "\x0c" "VFNMADD132SS\0" "\x0c" "VFNMADD132SD\0" "\x0c" "VFNMSUB132PS\0" \ -"\x0c" "VFNMSUB132PD\0" "\x0c" "VFNMSUB132SS\0" "\x0c" "VFNMSUB132SD\0" "\x0e" "VFMADDSUB213PS\0" \ -"\x0e" "VFMADDSUB213PD\0" "\x0e" "VFMSUBADD213PS\0" "\x0e" "VFMSUBADD213PD\0" \ -"\x0b" "VFMADD213PS\0" "\x0b" "VFMADD213PD\0" "\x0b" "VFMADD213SS\0" "\x0b" "VFMADD213SD\0" \ -"\x0b" "VFMSUB213PS\0" "\x0b" "VFMSUB213PD\0" "\x0b" "VFMSUB213SS\0" "\x0b" "VFMSUB213SD\0" \ -"\x0c" "VFNMADD213PS\0" "\x0c" "VFNMADD213PD\0" "\x0c" "VFNMADD213SS\0" "\x0c" "VFNMADD213SD\0" \ -"\x0c" "VFNMSUB213PS\0" "\x0c" "VFNMSUB213PD\0" "\x0c" "VFNMSUB213SS\0" "\x0c" "VFNMSUB213SD\0" \ -"\x0e" "VFMADDSUB231PS\0" "\x0e" "VFMADDSUB231PD\0" "\x0e" "VFMSUBADD231PS\0" \ -"\x0e" "VFMSUBADD231PD\0" "\x0b" "VFMADD231PS\0" "\x0b" "VFMADD231PD\0" "\x0b" "VFMADD231SS\0" \ -"\x0b" "VFMADD231SD\0" "\x0b" "VFMSUB231PS\0" "\x0b" "VFMSUB231PD\0" "\x0b" "VFMSUB231SS\0" \ -"\x0b" "VFMSUB231SD\0" "\x0c" "VFNMADD231PS\0" "\x0c" "VFNMADD231PD\0" "\x0c" "VFNMADD231SS\0" \ -"\x0c" "VFNMADD231SD\0" "\x0c" "VFNMSUB231PS\0" "\x0c" "VFNMSUB231PD\0" "\x0c" "VFNMSUB231SS\0" \ -"\x0c" "VFNMSUB231SD\0" "\x06" "AESIMC\0" "\x07" "VAESIMC\0" "\x06" "AESENC\0" \ -"\x07" "VAESENC\0" "\x0a" "AESENCLAST\0" "\x0b" "VAESENCLAST\0" "\x06" "AESDEC\0" \ -"\x07" "VAESDEC\0" "\x0a" "AESDECLAST\0" "\x0b" "VAESDECLAST\0" "\x05" "MOVBE\0" \ -"\x05" "CRC32\0" "\x0a" "VPERM2F128\0" "\x07" "ROUNDPS\0" "\x08" "VROUNDPS\0" \ -"\x07" "ROUNDPD\0" "\x08" "VROUNDPD\0" "\x07" "ROUNDSS\0" "\x08" "VROUNDSS\0" \ -"\x07" "ROUNDSD\0" "\x08" "VROUNDSD\0" "\x07" "BLENDPS\0" "\x08" "VBLENDPS\0" \ -"\x07" "BLENDPD\0" "\x08" "VBLENDPD\0" "\x07" "PBLENDW\0" "\x08" "VPBLENDW\0" \ -"\x07" "PALIGNR\0" "\x08" "VPALIGNR\0" "\x06" "PEXTRB\0" "\x07" "VPEXTRB\0" \ -"\x06" "PEXTRD\0" "\x06" "PEXTRQ\0" "\x07" "VPEXTRD\0" "\x07" "VPEXTRQ\0" "\x09" "EXTRACTPS\0" \ -"\x0a" "VEXTRACTPS\0" "\x0b" "VINSERTF128\0" "\x0c" "VEXTRACTF128\0" "\x06" "PINSRB\0" \ -"\x07" "VPINSRB\0" "\x08" "INSERTPS\0" "\x09" "VINSERTPS\0" "\x06" "PINSRD\0" \ -"\x06" "PINSRQ\0" "\x07" "VPINSRD\0" "\x07" "VPINSRQ\0" "\x04" "DPPS\0" "\x05" "VDPPS\0" \ -"\x04" "DPPD\0" "\x05" "VDPPD\0" "\x07" "MPSADBW\0" "\x08" "VMPSADBW\0" "\x09" "PCLMULQDQ\0" \ -"\x0a" "VPCLMULQDQ\0" "\x09" "VBLENDVPS\0" "\x09" "VBLENDVPD\0" "\x09" "VPBLENDVB\0" \ -"\x09" "PCMPESTRM\0" "\x0a" "VPCMPESTRM\0" "\x09" "PCMPESTRI\0" "\x0a" "VPCMPESTRI\0" \ -"\x09" "PCMPISTRM\0" "\x0a" "VPCMPISTRM\0" "\x09" "PCMPISTRI\0" "\x0a" "VPCMPISTRI\0" \ -"\x0f" "AESKEYGENASSIST\0" "\x10" "VAESKEYGENASSIST\0" "\x06" "PSRLDQ\0" "\x07" "VPSRLDQ\0" \ -"\x06" "PSLLDQ\0" "\x07" "VPSLLDQ\0" "\x06" "FXSAVE\0" "\x08" "FXSAVE64\0" \ -"\x08" "RDFSBASE\0" "\x07" "FXRSTOR\0" "\x09" "FXRSTOR64\0" "\x08" "RDGSBASE\0" \ -"\x07" "LDMXCSR\0" "\x08" "WRFSBASE\0" "\x08" "VLDMXCSR\0" "\x07" "STMXCSR\0" \ -"\x08" "WRGSBASE\0" "\x08" "VSTMXCSR\0" "\x07" "VMPTRLD\0" "\x07" "VMCLEAR\0" \ -"\x05" "VMXON\0" "\x06" "MOVSXD\0" "\x05" "PAUSE\0" "\x04" "WAIT\0" "\x06" "RDRAND\0" \ -"\x06" "_3DNOW\0"; +"\x09" "undefined\0" "\x03" "add\0" "\x04" "push\0" "\x03" "pop\0" "\x02" "or\0" \ +"\x03" "adc\0" "\x03" "sbb\0" "\x03" "and\0" "\x03" "daa\0" "\x03" "sub\0" \ +"\x03" "das\0" "\x03" "xor\0" "\x03" "aaa\0" "\x03" "cmp\0" "\x03" "aas\0" \ +"\x03" "inc\0" "\x03" "dec\0" "\x05" "pusha\0" "\x04" "popa\0" "\x05" "bound\0" \ +"\x04" "arpl\0" "\x04" "imul\0" "\x03" "ins\0" "\x04" "outs\0" "\x02" "jo\0" \ +"\x03" "jno\0" "\x02" "jb\0" "\x03" "jae\0" "\x02" "jz\0" "\x03" "jnz\0" "\x03" "jbe\0" \ +"\x02" "ja\0" "\x02" "js\0" "\x03" "jns\0" "\x02" "jp\0" "\x03" "jnp\0" "\x02" "jl\0" \ +"\x03" "jge\0" "\x03" "jle\0" "\x02" "jg\0" "\x04" "test\0" "\x04" "xchg\0" \ +"\x03" "mov\0" "\x03" "lea\0" "\x03" "cbw\0" "\x04" "cwde\0" "\x04" "cdqe\0" \ +"\x03" "cwd\0" "\x03" "cdq\0" "\x03" "cqo\0" "\x08" "call far\0" "\x05" "pushf\0" \ +"\x04" "popf\0" "\x04" "sahf\0" "\x04" "lahf\0" "\x04" "movs\0" "\x04" "cmps\0" \ +"\x04" "stos\0" "\x04" "lods\0" "\x04" "scas\0" "\x03" "ret\0" "\x03" "les\0" \ +"\x03" "lds\0" "\x05" "enter\0" "\x05" "leave\0" "\x04" "retf\0" "\x05" "int 3\0" \ +"\x03" "int\0" "\x04" "into\0" "\x04" "iret\0" "\x03" "aam\0" "\x03" "aad\0" \ +"\x04" "salc\0" "\x04" "xlat\0" "\x06" "loopnz\0" "\x05" "loopz\0" "\x04" "loop\0" \ +"\x04" "jcxz\0" "\x05" "jecxz\0" "\x05" "jrcxz\0" "\x02" "in\0" "\x03" "out\0" \ +"\x04" "call\0" "\x03" "jmp\0" "\x07" "jmp far\0" "\x04" "int1\0" "\x03" "hlt\0" \ +"\x03" "cmc\0" "\x03" "clc\0" "\x03" "stc\0" "\x03" "cli\0" "\x03" "sti\0" \ +"\x03" "cld\0" "\x03" "std\0" "\x03" "lar\0" "\x03" "lsl\0" "\x07" "syscall\0" \ +"\x04" "clts\0" "\x06" "sysret\0" "\x04" "invd\0" "\x06" "wbinvd\0" "\x03" "ud2\0" \ +"\x05" "femms\0" "\x03" "nop\0" "\x05" "wrmsr\0" "\x05" "rdtsc\0" "\x05" "rdmsr\0" \ +"\x05" "rdpmc\0" "\x08" "sysenter\0" "\x07" "sysexit\0" "\x06" "getsec\0" "\x05" "cmovo\0" \ +"\x06" "cmovno\0" "\x05" "cmovb\0" "\x06" "cmovae\0" "\x05" "cmovz\0" "\x06" "cmovnz\0" \ +"\x06" "cmovbe\0" "\x05" "cmova\0" "\x05" "cmovs\0" "\x06" "cmovns\0" "\x05" "cmovp\0" \ +"\x06" "cmovnp\0" "\x05" "cmovl\0" "\x06" "cmovge\0" "\x06" "cmovle\0" "\x05" "cmovg\0" \ +"\x04" "seto\0" "\x05" "setno\0" "\x04" "setb\0" "\x05" "setae\0" "\x04" "setz\0" \ +"\x05" "setnz\0" "\x05" "setbe\0" "\x04" "seta\0" "\x04" "sets\0" "\x05" "setns\0" \ +"\x04" "setp\0" "\x05" "setnp\0" "\x04" "setl\0" "\x05" "setge\0" "\x05" "setle\0" \ +"\x04" "setg\0" "\x05" "cpuid\0" "\x02" "bt\0" "\x04" "shld\0" "\x03" "rsm\0" \ +"\x03" "bts\0" "\x04" "shrd\0" "\x07" "cmpxchg\0" "\x03" "lss\0" "\x03" "btr\0" \ +"\x03" "lfs\0" "\x03" "lgs\0" "\x05" "movzx\0" "\x03" "btc\0" "\x05" "movsx\0" \ +"\x04" "xadd\0" "\x06" "movnti\0" "\x05" "bswap\0" "\x03" "rol\0" "\x03" "ror\0" \ +"\x03" "rcl\0" "\x03" "rcr\0" "\x03" "shl\0" "\x03" "shr\0" "\x03" "sal\0" \ +"\x03" "sar\0" "\x06" "xabort\0" "\x06" "xbegin\0" "\x04" "fadd\0" "\x04" "fmul\0" \ +"\x04" "fcom\0" "\x05" "fcomp\0" "\x04" "fsub\0" "\x05" "fsubr\0" "\x04" "fdiv\0" \ +"\x05" "fdivr\0" "\x03" "fld\0" "\x03" "fst\0" "\x04" "fstp\0" "\x06" "fldenv\0" \ +"\x05" "fldcw\0" "\x04" "fxch\0" "\x04" "fnop\0" "\x04" "fchs\0" "\x04" "fabs\0" \ +"\x04" "ftst\0" "\x04" "fxam\0" "\x04" "fld1\0" "\x06" "fldl2t\0" "\x06" "fldl2e\0" \ +"\x05" "fldpi\0" "\x06" "fldlg2\0" "\x06" "fldln2\0" "\x04" "fldz\0" "\x05" "f2xm1\0" \ +"\x05" "fyl2x\0" "\x05" "fptan\0" "\x06" "fpatan\0" "\x07" "fxtract\0" "\x06" "fprem1\0" \ +"\x07" "fdecstp\0" "\x07" "fincstp\0" "\x05" "fprem\0" "\x07" "fyl2xp1\0" "\x05" "fsqrt\0" \ +"\x07" "fsincos\0" "\x07" "frndint\0" "\x06" "fscale\0" "\x04" "fsin\0" "\x04" "fcos\0" \ +"\x05" "fiadd\0" "\x05" "fimul\0" "\x05" "ficom\0" "\x06" "ficomp\0" "\x05" "fisub\0" \ +"\x06" "fisubr\0" "\x05" "fidiv\0" "\x06" "fidivr\0" "\x06" "fcmovb\0" "\x06" "fcmove\0" \ +"\x07" "fcmovbe\0" "\x06" "fcmovu\0" "\x07" "fucompp\0" "\x04" "fild\0" "\x06" "fisttp\0" \ +"\x04" "fist\0" "\x05" "fistp\0" "\x07" "fcmovnb\0" "\x07" "fcmovne\0" "\x08" "fcmovnbe\0" \ +"\x07" "fcmovnu\0" "\x04" "feni\0" "\x06" "fedisi\0" "\x06" "fsetpm\0" "\x06" "fucomi\0" \ +"\x05" "fcomi\0" "\x06" "frstor\0" "\x05" "ffree\0" "\x05" "fucom\0" "\x06" "fucomp\0" \ +"\x05" "faddp\0" "\x05" "fmulp\0" "\x06" "fcompp\0" "\x06" "fsubrp\0" "\x05" "fsubp\0" \ +"\x06" "fdivrp\0" "\x05" "fdivp\0" "\x04" "fbld\0" "\x05" "fbstp\0" "\x07" "fucomip\0" \ +"\x06" "fcomip\0" "\x03" "not\0" "\x03" "neg\0" "\x03" "mul\0" "\x03" "div\0" \ +"\x04" "idiv\0" "\x04" "sldt\0" "\x03" "str\0" "\x04" "lldt\0" "\x03" "ltr\0" \ +"\x04" "verr\0" "\x04" "verw\0" "\x04" "sgdt\0" "\x04" "sidt\0" "\x04" "lgdt\0" \ +"\x04" "lidt\0" "\x04" "smsw\0" "\x04" "lmsw\0" "\x06" "invlpg\0" "\x06" "vmcall\0" \ +"\x08" "vmlaunch\0" "\x08" "vmresume\0" "\x06" "vmxoff\0" "\x07" "monitor\0" \ +"\x05" "mwait\0" "\x06" "xgetbv\0" "\x06" "xsetbv\0" "\x06" "vmfunc\0" "\x04" "xend\0" \ +"\x05" "vmrun\0" "\x07" "vmmcall\0" "\x06" "vmload\0" "\x06" "vmsave\0" "\x04" "stgi\0" \ +"\x04" "clgi\0" "\x06" "skinit\0" "\x07" "invlpga\0" "\x06" "swapgs\0" "\x06" "rdtscp\0" \ +"\x08" "prefetch\0" "\x09" "prefetchw\0" "\x05" "pi2fw\0" "\x05" "pi2fd\0" \ +"\x05" "pf2iw\0" "\x05" "pf2id\0" "\x06" "pfnacc\0" "\x07" "pfpnacc\0" "\x07" "pfcmpge\0" \ +"\x05" "pfmin\0" "\x05" "pfrcp\0" "\x07" "pfrsqrt\0" "\x05" "pfsub\0" "\x05" "pfadd\0" \ +"\x07" "pfcmpgt\0" "\x05" "pfmax\0" "\x08" "pfrcpit1\0" "\x08" "pfrsqit1\0" \ +"\x06" "pfsubr\0" "\x05" "pfacc\0" "\x07" "pfcmpeq\0" "\x05" "pfmul\0" "\x08" "pfrcpit2\0" \ +"\x07" "pmulhrw\0" "\x06" "pswapd\0" "\x07" "pavgusb\0" "\x06" "movups\0" "\x06" "movupd\0" \ +"\x05" "movss\0" "\x05" "movsd\0" "\x07" "vmovups\0" "\x07" "vmovupd\0" "\x06" "vmovss\0" \ +"\x06" "vmovsd\0" "\x07" "movhlps\0" "\x06" "movlps\0" "\x06" "movlpd\0" "\x08" "movsldup\0" \ +"\x07" "movddup\0" "\x08" "vmovhlps\0" "\x07" "vmovlps\0" "\x07" "vmovlpd\0" \ +"\x09" "vmovsldup\0" "\x08" "vmovddup\0" "\x08" "unpcklps\0" "\x08" "unpcklpd\0" \ +"\x09" "vunpcklps\0" "\x09" "vunpcklpd\0" "\x08" "unpckhps\0" "\x08" "unpckhpd\0" \ +"\x09" "vunpckhps\0" "\x09" "vunpckhpd\0" "\x07" "movlhps\0" "\x06" "movhps\0" \ +"\x06" "movhpd\0" "\x08" "movshdup\0" "\x08" "vmovlhps\0" "\x07" "vmovhps\0" \ +"\x07" "vmovhpd\0" "\x09" "vmovshdup\0" "\x0b" "prefetchnta\0" "\x0a" "prefetcht0\0" \ +"\x0a" "prefetcht1\0" "\x0a" "prefetcht2\0" "\x06" "movaps\0" "\x06" "movapd\0" \ +"\x07" "vmovaps\0" "\x07" "vmovapd\0" "\x08" "cvtpi2ps\0" "\x08" "cvtpi2pd\0" \ +"\x08" "cvtsi2ss\0" "\x08" "cvtsi2sd\0" "\x09" "vcvtsi2ss\0" "\x09" "vcvtsi2sd\0" \ +"\x07" "movntps\0" "\x07" "movntpd\0" "\x07" "movntss\0" "\x07" "movntsd\0" \ +"\x08" "vmovntps\0" "\x08" "vmovntpd\0" "\x09" "cvttps2pi\0" "\x09" "cvttpd2pi\0" \ +"\x09" "cvttss2si\0" "\x09" "cvttsd2si\0" "\x0a" "vcvttss2si\0" "\x0a" "vcvttsd2si\0" \ +"\x08" "cvtps2pi\0" "\x08" "cvtpd2pi\0" "\x08" "cvtss2si\0" "\x08" "cvtsd2si\0" \ +"\x09" "vcvtss2si\0" "\x09" "vcvtsd2si\0" "\x07" "ucomiss\0" "\x07" "ucomisd\0" \ +"\x08" "vucomiss\0" "\x08" "vucomisd\0" "\x06" "comiss\0" "\x06" "comisd\0" \ +"\x07" "vcomiss\0" "\x07" "vcomisd\0" "\x08" "movmskps\0" "\x08" "movmskpd\0" \ +"\x09" "vmovmskps\0" "\x09" "vmovmskpd\0" "\x06" "sqrtps\0" "\x06" "sqrtpd\0" \ +"\x06" "sqrtss\0" "\x06" "sqrtsd\0" "\x07" "vsqrtps\0" "\x07" "vsqrtpd\0" "\x07" "vsqrtss\0" \ +"\x07" "vsqrtsd\0" "\x07" "rsqrtps\0" "\x07" "rsqrtss\0" "\x08" "vrsqrtps\0" \ +"\x08" "vrsqrtss\0" "\x05" "rcpps\0" "\x05" "rcpss\0" "\x06" "vrcpps\0" "\x06" "vrcpss\0" \ +"\x05" "andps\0" "\x05" "andpd\0" "\x06" "vandps\0" "\x06" "vandpd\0" "\x06" "andnps\0" \ +"\x06" "andnpd\0" "\x07" "vandnps\0" "\x07" "vandnpd\0" "\x04" "orps\0" "\x04" "orpd\0" \ +"\x05" "vorps\0" "\x05" "vorpd\0" "\x05" "xorps\0" "\x05" "xorpd\0" "\x06" "vxorps\0" \ +"\x06" "vxorpd\0" "\x05" "addps\0" "\x05" "addpd\0" "\x05" "addss\0" "\x05" "addsd\0" \ +"\x06" "vaddps\0" "\x06" "vaddpd\0" "\x06" "vaddss\0" "\x06" "vaddsd\0" "\x05" "mulps\0" \ +"\x05" "mulpd\0" "\x05" "mulss\0" "\x05" "mulsd\0" "\x06" "vmulps\0" "\x06" "vmulpd\0" \ +"\x06" "vmulss\0" "\x06" "vmulsd\0" "\x08" "cvtps2pd\0" "\x08" "cvtpd2ps\0" \ +"\x08" "cvtss2sd\0" "\x08" "cvtsd2ss\0" "\x09" "vcvtps2pd\0" "\x09" "vcvtpd2ps\0" \ +"\x09" "vcvtss2sd\0" "\x09" "vcvtsd2ss\0" "\x08" "cvtdq2ps\0" "\x08" "cvtps2dq\0" \ +"\x09" "cvttps2dq\0" "\x09" "vcvtdq2ps\0" "\x09" "vcvtps2dq\0" "\x0a" "vcvttps2dq\0" \ +"\x05" "subps\0" "\x05" "subpd\0" "\x05" "subss\0" "\x05" "subsd\0" "\x06" "vsubps\0" \ +"\x06" "vsubpd\0" "\x06" "vsubss\0" "\x06" "vsubsd\0" "\x05" "minps\0" "\x05" "minpd\0" \ +"\x05" "minss\0" "\x05" "minsd\0" "\x06" "vminps\0" "\x06" "vminpd\0" "\x06" "vminss\0" \ +"\x06" "vminsd\0" "\x05" "divps\0" "\x05" "divpd\0" "\x05" "divss\0" "\x05" "divsd\0" \ +"\x06" "vdivps\0" "\x06" "vdivpd\0" "\x06" "vdivss\0" "\x06" "vdivsd\0" "\x05" "maxps\0" \ +"\x05" "maxpd\0" "\x05" "maxss\0" "\x05" "maxsd\0" "\x06" "vmaxps\0" "\x06" "vmaxpd\0" \ +"\x06" "vmaxss\0" "\x06" "vmaxsd\0" "\x09" "punpcklbw\0" "\x0a" "vpunpcklbw\0" \ +"\x09" "punpcklwd\0" "\x0a" "vpunpcklwd\0" "\x09" "punpckldq\0" "\x0a" "vpunpckldq\0" \ +"\x08" "packsswb\0" "\x09" "vpacksswb\0" "\x07" "pcmpgtb\0" "\x08" "vpcmpgtb\0" \ +"\x07" "pcmpgtw\0" "\x08" "vpcmpgtw\0" "\x07" "pcmpgtd\0" "\x08" "vpcmpgtd\0" \ +"\x08" "packuswb\0" "\x09" "vpackuswb\0" "\x09" "punpckhbw\0" "\x0a" "vpunpckhbw\0" \ +"\x09" "punpckhwd\0" "\x0a" "vpunpckhwd\0" "\x09" "punpckhdq\0" "\x0a" "vpunpckhdq\0" \ +"\x08" "packssdw\0" "\x09" "vpackssdw\0" "\x0a" "punpcklqdq\0" "\x0b" "vpunpcklqdq\0" \ +"\x0a" "punpckhqdq\0" "\x0b" "vpunpckhqdq\0" "\x04" "movd\0" "\x04" "movq\0" \ +"\x05" "vmovd\0" "\x05" "vmovq\0" "\x06" "movdqa\0" "\x06" "movdqu\0" "\x07" "vmovdqa\0" \ +"\x07" "vmovdqu\0" "\x06" "pshufw\0" "\x06" "pshufd\0" "\x07" "pshufhw\0" "\x07" "pshuflw\0" \ +"\x07" "vpshufd\0" "\x08" "vpshufhw\0" "\x08" "vpshuflw\0" "\x07" "pcmpeqb\0" \ +"\x08" "vpcmpeqb\0" "\x07" "pcmpeqw\0" "\x08" "vpcmpeqw\0" "\x07" "pcmpeqd\0" \ +"\x08" "vpcmpeqd\0" "\x04" "emms\0" "\x0a" "vzeroupper\0" "\x08" "vzeroall\0" \ +"\x06" "vmread\0" "\x05" "extrq\0" "\x07" "insertq\0" "\x07" "vmwrite\0" "\x08" "cvtph2ps\0" \ +"\x08" "cvtps2ph\0" "\x06" "haddpd\0" "\x06" "haddps\0" "\x07" "vhaddpd\0" \ +"\x07" "vhaddps\0" "\x06" "hsubpd\0" "\x06" "hsubps\0" "\x07" "vhsubpd\0" "\x07" "vhsubps\0" \ +"\x05" "xsave\0" "\x07" "xsave64\0" "\x06" "lfence\0" "\x06" "xrstor\0" "\x08" "xrstor64\0" \ +"\x06" "mfence\0" "\x08" "xsaveopt\0" "\x0a" "xsaveopt64\0" "\x06" "sfence\0" \ +"\x07" "clflush\0" "\x06" "popcnt\0" "\x03" "bsf\0" "\x05" "tzcnt\0" "\x03" "bsr\0" \ +"\x05" "lzcnt\0" "\x07" "cmpeqps\0" "\x07" "cmpltps\0" "\x07" "cmpleps\0" "\x0a" "cmpunordps\0" \ +"\x08" "cmpneqps\0" "\x08" "cmpnltps\0" "\x08" "cmpnleps\0" "\x08" "cmpordps\0" \ +"\x07" "cmpeqpd\0" "\x07" "cmpltpd\0" "\x07" "cmplepd\0" "\x0a" "cmpunordpd\0" \ +"\x08" "cmpneqpd\0" "\x08" "cmpnltpd\0" "\x08" "cmpnlepd\0" "\x08" "cmpordpd\0" \ +"\x07" "cmpeqss\0" "\x07" "cmpltss\0" "\x07" "cmpless\0" "\x0a" "cmpunordss\0" \ +"\x08" "cmpneqss\0" "\x08" "cmpnltss\0" "\x08" "cmpnless\0" "\x08" "cmpordss\0" \ +"\x07" "cmpeqsd\0" "\x07" "cmpltsd\0" "\x07" "cmplesd\0" "\x0a" "cmpunordsd\0" \ +"\x08" "cmpneqsd\0" "\x08" "cmpnltsd\0" "\x08" "cmpnlesd\0" "\x08" "cmpordsd\0" \ +"\x08" "vcmpeqps\0" "\x08" "vcmpltps\0" "\x08" "vcmpleps\0" "\x0b" "vcmpunordps\0" \ +"\x09" "vcmpneqps\0" "\x09" "vcmpnltps\0" "\x09" "vcmpnleps\0" "\x09" "vcmpordps\0" \ +"\x0b" "vcmpeq_uqps\0" "\x09" "vcmpngeps\0" "\x09" "vcmpngtps\0" "\x0b" "vcmpfalseps\0" \ +"\x0c" "vcmpneq_oqps\0" "\x08" "vcmpgeps\0" "\x08" "vcmpgtps\0" "\x0a" "vcmptrueps\0" \ +"\x0b" "vcmpeq_osps\0" "\x0b" "vcmplt_oqps\0" "\x0b" "vcmple_oqps\0" "\x0d" "vcmpunord_sps\0" \ +"\x0c" "vcmpneq_usps\0" "\x0c" "vcmpnlt_uqps\0" "\x0c" "vcmpnle_uqps\0" "\x0b" "vcmpord_sps\0" \ +"\x0b" "vcmpeq_usps\0" "\x0c" "vcmpnge_uqps\0" "\x0c" "vcmpngt_uqps\0" "\x0e" "vcmpfalse_osps\0" \ +"\x0c" "vcmpneq_osps\0" "\x0b" "vcmpge_oqps\0" "\x0b" "vcmpgt_oqps\0" "\x0d" "vcmptrue_usps\0" \ +"\x08" "vcmpeqpd\0" "\x08" "vcmpltpd\0" "\x08" "vcmplepd\0" "\x0b" "vcmpunordpd\0" \ +"\x09" "vcmpneqpd\0" "\x09" "vcmpnltpd\0" "\x09" "vcmpnlepd\0" "\x09" "vcmpordpd\0" \ +"\x0b" "vcmpeq_uqpd\0" "\x09" "vcmpngepd\0" "\x09" "vcmpngtpd\0" "\x0b" "vcmpfalsepd\0" \ +"\x0c" "vcmpneq_oqpd\0" "\x08" "vcmpgepd\0" "\x08" "vcmpgtpd\0" "\x0a" "vcmptruepd\0" \ +"\x0b" "vcmpeq_ospd\0" "\x0b" "vcmplt_oqpd\0" "\x0b" "vcmple_oqpd\0" "\x0d" "vcmpunord_spd\0" \ +"\x0c" "vcmpneq_uspd\0" "\x0c" "vcmpnlt_uqpd\0" "\x0c" "vcmpnle_uqpd\0" "\x0b" "vcmpord_spd\0" \ +"\x0b" "vcmpeq_uspd\0" "\x0c" "vcmpnge_uqpd\0" "\x0c" "vcmpngt_uqpd\0" "\x0e" "vcmpfalse_ospd\0" \ +"\x0c" "vcmpneq_ospd\0" "\x0b" "vcmpge_oqpd\0" "\x0b" "vcmpgt_oqpd\0" "\x0d" "vcmptrue_uspd\0" \ +"\x08" "vcmpeqss\0" "\x08" "vcmpltss\0" "\x08" "vcmpless\0" "\x0b" "vcmpunordss\0" \ +"\x09" "vcmpneqss\0" "\x09" "vcmpnltss\0" "\x09" "vcmpnless\0" "\x09" "vcmpordss\0" \ +"\x0b" "vcmpeq_uqss\0" "\x09" "vcmpngess\0" "\x09" "vcmpngtss\0" "\x0b" "vcmpfalsess\0" \ +"\x0c" "vcmpneq_oqss\0" "\x08" "vcmpgess\0" "\x08" "vcmpgtss\0" "\x0a" "vcmptruess\0" \ +"\x0b" "vcmpeq_osss\0" "\x0b" "vcmplt_oqss\0" "\x0b" "vcmple_oqss\0" "\x0d" "vcmpunord_sss\0" \ +"\x0c" "vcmpneq_usss\0" "\x0c" "vcmpnlt_uqss\0" "\x0c" "vcmpnle_uqss\0" "\x0b" "vcmpord_sss\0" \ +"\x0b" "vcmpeq_usss\0" "\x0c" "vcmpnge_uqss\0" "\x0c" "vcmpngt_uqss\0" "\x0e" "vcmpfalse_osss\0" \ +"\x0c" "vcmpneq_osss\0" "\x0b" "vcmpge_oqss\0" "\x0b" "vcmpgt_oqss\0" "\x0d" "vcmptrue_usss\0" \ +"\x08" "vcmpeqsd\0" "\x08" "vcmpltsd\0" "\x08" "vcmplesd\0" "\x0b" "vcmpunordsd\0" \ +"\x09" "vcmpneqsd\0" "\x09" "vcmpnltsd\0" "\x09" "vcmpnlesd\0" "\x09" "vcmpordsd\0" \ +"\x0b" "vcmpeq_uqsd\0" "\x09" "vcmpngesd\0" "\x09" "vcmpngtsd\0" "\x0b" "vcmpfalsesd\0" \ +"\x0c" "vcmpneq_oqsd\0" "\x08" "vcmpgesd\0" "\x08" "vcmpgtsd\0" "\x0a" "vcmptruesd\0" \ +"\x0b" "vcmpeq_ossd\0" "\x0b" "vcmplt_oqsd\0" "\x0b" "vcmple_oqsd\0" "\x0d" "vcmpunord_ssd\0" \ +"\x0c" "vcmpneq_ussd\0" "\x0c" "vcmpnlt_uqsd\0" "\x0c" "vcmpnle_uqsd\0" "\x0b" "vcmpord_ssd\0" \ +"\x0b" "vcmpeq_ussd\0" "\x0c" "vcmpnge_uqsd\0" "\x0c" "vcmpngt_uqsd\0" "\x0e" "vcmpfalse_ossd\0" \ +"\x0c" "vcmpneq_ossd\0" "\x0b" "vcmpge_oqsd\0" "\x0b" "vcmpgt_oqsd\0" "\x0d" "vcmptrue_ussd\0" \ +"\x06" "pinsrw\0" "\x07" "vpinsrw\0" "\x06" "pextrw\0" "\x07" "vpextrw\0" "\x06" "shufps\0" \ +"\x06" "shufpd\0" "\x07" "vshufps\0" "\x07" "vshufpd\0" "\x09" "cmpxchg8b\0" \ +"\x0a" "cmpxchg16b\0" "\x07" "vmptrst\0" "\x08" "addsubpd\0" "\x08" "addsubps\0" \ +"\x09" "vaddsubpd\0" "\x09" "vaddsubps\0" "\x05" "psrlw\0" "\x06" "vpsrlw\0" \ +"\x05" "psrld\0" "\x06" "vpsrld\0" "\x05" "psrlq\0" "\x06" "vpsrlq\0" "\x05" "paddq\0" \ +"\x06" "vpaddq\0" "\x06" "pmullw\0" "\x07" "vpmullw\0" "\x07" "movq2dq\0" "\x07" "movdq2q\0" \ +"\x08" "pmovmskb\0" "\x09" "vpmovmskb\0" "\x07" "psubusb\0" "\x08" "vpsubusb\0" \ +"\x07" "psubusw\0" "\x08" "vpsubusw\0" "\x06" "pminub\0" "\x07" "vpminub\0" \ +"\x04" "pand\0" "\x05" "vpand\0" "\x07" "paddusb\0" "\x08" "vpaddusw\0" "\x07" "paddusw\0" \ +"\x06" "pmaxub\0" "\x07" "vpmaxub\0" "\x05" "pandn\0" "\x06" "vpandn\0" "\x05" "pavgb\0" \ +"\x06" "vpavgb\0" "\x05" "psraw\0" "\x06" "vpsraw\0" "\x05" "psrad\0" "\x06" "vpsrad\0" \ +"\x05" "pavgw\0" "\x06" "vpavgw\0" "\x07" "pmulhuw\0" "\x08" "vpmulhuw\0" "\x06" "pmulhw\0" \ +"\x07" "vpmulhw\0" "\x09" "cvttpd2dq\0" "\x08" "cvtdq2pd\0" "\x08" "cvtpd2dq\0" \ +"\x0a" "vcvttpd2dq\0" "\x09" "vcvtdq2pd\0" "\x09" "vcvtpd2dq\0" "\x06" "movntq\0" \ +"\x07" "movntdq\0" "\x08" "vmovntdq\0" "\x06" "psubsb\0" "\x07" "vpsubsb\0" \ +"\x06" "psubsw\0" "\x07" "vpsubsw\0" "\x06" "pminsw\0" "\x07" "vpminsw\0" "\x03" "por\0" \ +"\x04" "vpor\0" "\x06" "paddsb\0" "\x07" "vpaddsb\0" "\x06" "paddsw\0" "\x07" "vpaddsw\0" \ +"\x06" "pmaxsw\0" "\x07" "vpmaxsw\0" "\x04" "pxor\0" "\x05" "vpxor\0" "\x05" "lddqu\0" \ +"\x06" "vlddqu\0" "\x05" "psllw\0" "\x06" "vpsllw\0" "\x05" "pslld\0" "\x06" "vpslld\0" \ +"\x05" "psllq\0" "\x06" "vpsllq\0" "\x07" "pmuludq\0" "\x08" "vpmuludq\0" "\x07" "pmaddwd\0" \ +"\x08" "vpmaddwd\0" "\x06" "psadbw\0" "\x07" "vpsadbw\0" "\x08" "maskmovq\0" \ +"\x0a" "maskmovdqu\0" "\x0b" "vmaskmovdqu\0" "\x05" "psubb\0" "\x06" "vpsubb\0" \ +"\x05" "psubw\0" "\x06" "vpsubw\0" "\x05" "psubd\0" "\x06" "vpsubd\0" "\x05" "psubq\0" \ +"\x06" "vpsubq\0" "\x05" "paddb\0" "\x06" "vpaddb\0" "\x05" "paddw\0" "\x06" "vpaddw\0" \ +"\x05" "paddd\0" "\x06" "vpaddd\0" "\x07" "fnstenv\0" "\x06" "fstenv\0" "\x06" "fnstcw\0" \ +"\x05" "fstcw\0" "\x06" "fnclex\0" "\x05" "fclex\0" "\x06" "fninit\0" "\x05" "finit\0" \ +"\x06" "fnsave\0" "\x05" "fsave\0" "\x06" "fnstsw\0" "\x05" "fstsw\0" "\x06" "pshufb\0" \ +"\x07" "vpshufb\0" "\x06" "phaddw\0" "\x07" "vphaddw\0" "\x06" "phaddd\0" "\x07" "vphaddd\0" \ +"\x07" "phaddsw\0" "\x08" "vphaddsw\0" "\x09" "pmaddubsw\0" "\x0a" "vpmaddubsw\0" \ +"\x06" "phsubw\0" "\x07" "vphsubw\0" "\x06" "phsubd\0" "\x07" "vphsubd\0" "\x07" "phsubsw\0" \ +"\x08" "vphsubsw\0" "\x06" "psignb\0" "\x07" "vpsignb\0" "\x06" "psignw\0" \ +"\x07" "vpsignw\0" "\x06" "psignd\0" "\x07" "vpsignd\0" "\x08" "pmulhrsw\0" \ +"\x09" "vpmulhrsw\0" "\x09" "vpermilps\0" "\x09" "vpermilpd\0" "\x07" "vtestps\0" \ +"\x07" "vtestpd\0" "\x08" "pblendvb\0" "\x08" "blendvps\0" "\x08" "blendvpd\0" \ +"\x05" "ptest\0" "\x06" "vptest\0" "\x0c" "vbroadcastss\0" "\x0c" "vbroadcastsd\0" \ +"\x0e" "vbroadcastf128\0" "\x05" "pabsb\0" "\x06" "vpabsb\0" "\x05" "pabsw\0" \ +"\x06" "vpabsw\0" "\x05" "pabsd\0" "\x06" "vpabsd\0" "\x08" "pmovsxbw\0" "\x09" "vpmovsxbw\0" \ +"\x08" "pmovsxbd\0" "\x09" "vpmovsxbd\0" "\x08" "pmovsxbq\0" "\x09" "vpmovsxbq\0" \ +"\x08" "pmovsxwd\0" "\x09" "vpmovsxwd\0" "\x08" "pmovsxwq\0" "\x09" "vpmovsxwq\0" \ +"\x08" "pmovsxdq\0" "\x09" "vpmovsxdq\0" "\x06" "pmuldq\0" "\x07" "vpmuldq\0" \ +"\x07" "pcmpeqq\0" "\x08" "vpcmpeqq\0" "\x08" "movntdqa\0" "\x09" "vmovntdqa\0" \ +"\x08" "packusdw\0" "\x09" "vpackusdw\0" "\x0a" "vmaskmovps\0" "\x0a" "vmaskmovpd\0" \ +"\x08" "pmovzxbw\0" "\x09" "vpmovzxbw\0" "\x08" "pmovzxbd\0" "\x09" "vpmovzxbd\0" \ +"\x08" "pmovzxbq\0" "\x09" "vpmovzxbq\0" "\x08" "pmovzxwd\0" "\x09" "vpmovzxwd\0" \ +"\x08" "pmovzxwq\0" "\x09" "vpmovzxwq\0" "\x08" "pmovzxdq\0" "\x09" "vpmovzxdq\0" \ +"\x07" "pcmpgtq\0" "\x08" "vpcmpgtq\0" "\x06" "pminsb\0" "\x07" "vpminsb\0" \ +"\x06" "pminsd\0" "\x07" "vpminsd\0" "\x06" "pminuw\0" "\x07" "vpminuw\0" "\x06" "pminud\0" \ +"\x07" "vpminud\0" "\x06" "pmaxsb\0" "\x07" "vpmaxsb\0" "\x06" "pmaxsd\0" "\x07" "vpmaxsd\0" \ +"\x06" "pmaxuw\0" "\x07" "vpmaxuw\0" "\x06" "pmaxud\0" "\x07" "vpmaxud\0" "\x06" "pmulld\0" \ +"\x07" "vpmulld\0" "\x0a" "phminposuw\0" "\x0b" "vphminposuw\0" "\x06" "invept\0" \ +"\x07" "invvpid\0" "\x07" "invpcid\0" "\x0e" "vfmaddsub132ps\0" "\x0e" "vfmaddsub132pd\0" \ +"\x0e" "vfmsubadd132ps\0" "\x0e" "vfmsubadd132pd\0" "\x0b" "vfmadd132ps\0" \ +"\x0b" "vfmadd132pd\0" "\x0b" "vfmadd132ss\0" "\x0b" "vfmadd132sd\0" "\x0b" "vfmsub132ps\0" \ +"\x0b" "vfmsub132pd\0" "\x0b" "vfmsub132ss\0" "\x0b" "vfmsub132sd\0" "\x0c" "vfnmadd132ps\0" \ +"\x0c" "vfnmadd132pd\0" "\x0c" "vfnmadd132ss\0" "\x0c" "vfnmadd132sd\0" "\x0c" "vfnmsub132ps\0" \ +"\x0c" "vfnmsub132pd\0" "\x0c" "vfnmsub132ss\0" "\x0c" "vfnmsub132sd\0" "\x0e" "vfmaddsub213ps\0" \ +"\x0e" "vfmaddsub213pd\0" "\x0e" "vfmsubadd213ps\0" "\x0e" "vfmsubadd213pd\0" \ +"\x0b" "vfmadd213ps\0" "\x0b" "vfmadd213pd\0" "\x0b" "vfmadd213ss\0" "\x0b" "vfmadd213sd\0" \ +"\x0b" "vfmsub213ps\0" "\x0b" "vfmsub213pd\0" "\x0b" "vfmsub213ss\0" "\x0b" "vfmsub213sd\0" \ +"\x0c" "vfnmadd213ps\0" "\x0c" "vfnmadd213pd\0" "\x0c" "vfnmadd213ss\0" "\x0c" "vfnmadd213sd\0" \ +"\x0c" "vfnmsub213ps\0" "\x0c" "vfnmsub213pd\0" "\x0c" "vfnmsub213ss\0" "\x0c" "vfnmsub213sd\0" \ +"\x0e" "vfmaddsub231ps\0" "\x0e" "vfmaddsub231pd\0" "\x0e" "vfmsubadd231ps\0" \ +"\x0e" "vfmsubadd231pd\0" "\x0b" "vfmadd231ps\0" "\x0b" "vfmadd231pd\0" "\x0b" "vfmadd231ss\0" \ +"\x0b" "vfmadd231sd\0" "\x0b" "vfmsub231ps\0" "\x0b" "vfmsub231pd\0" "\x0b" "vfmsub231ss\0" \ +"\x0b" "vfmsub231sd\0" "\x0c" "vfnmadd231ps\0" "\x0c" "vfnmadd231pd\0" "\x0c" "vfnmadd231ss\0" \ +"\x0c" "vfnmadd231sd\0" "\x0c" "vfnmsub231ps\0" "\x0c" "vfnmsub231pd\0" "\x0c" "vfnmsub231ss\0" \ +"\x0c" "vfnmsub231sd\0" "\x06" "aesimc\0" "\x07" "vaesimc\0" "\x06" "aesenc\0" \ +"\x07" "vaesenc\0" "\x0a" "aesenclast\0" "\x0b" "vaesenclast\0" "\x06" "aesdec\0" \ +"\x07" "vaesdec\0" "\x0a" "aesdeclast\0" "\x0b" "vaesdeclast\0" "\x05" "movbe\0" \ +"\x05" "crc32\0" "\x0a" "vperm2f128\0" "\x07" "roundps\0" "\x08" "vroundps\0" \ +"\x07" "roundpd\0" "\x08" "vroundpd\0" "\x07" "roundss\0" "\x08" "vroundss\0" \ +"\x07" "roundsd\0" "\x08" "vroundsd\0" "\x07" "blendps\0" "\x08" "vblendps\0" \ +"\x07" "blendpd\0" "\x08" "vblendpd\0" "\x07" "pblendw\0" "\x08" "vpblendw\0" \ +"\x07" "palignr\0" "\x08" "vpalignr\0" "\x06" "pextrb\0" "\x07" "vpextrb\0" \ +"\x06" "pextrd\0" "\x06" "pextrq\0" "\x07" "vpextrd\0" "\x07" "vpextrq\0" "\x09" "extractps\0" \ +"\x0a" "vextractps\0" "\x0b" "vinsertf128\0" "\x0c" "vextractf128\0" "\x06" "pinsrb\0" \ +"\x07" "vpinsrb\0" "\x08" "insertps\0" "\x09" "vinsertps\0" "\x06" "pinsrd\0" \ +"\x06" "pinsrq\0" "\x07" "vpinsrd\0" "\x07" "vpinsrq\0" "\x04" "dpps\0" "\x05" "vdpps\0" \ +"\x04" "dppd\0" "\x05" "vdppd\0" "\x07" "mpsadbw\0" "\x08" "vmpsadbw\0" "\x09" "pclmulqdq\0" \ +"\x0a" "vpclmulqdq\0" "\x09" "vblendvps\0" "\x09" "vblendvpd\0" "\x09" "vpblendvb\0" \ +"\x09" "pcmpestrm\0" "\x0a" "vpcmpestrm\0" "\x09" "pcmpestri\0" "\x0a" "vpcmpestri\0" \ +"\x09" "pcmpistrm\0" "\x0a" "vpcmpistrm\0" "\x09" "pcmpistri\0" "\x0a" "vpcmpistri\0" \ +"\x0f" "aeskeygenassist\0" "\x10" "vaeskeygenassist\0" "\x06" "psrldq\0" "\x07" "vpsrldq\0" \ +"\x06" "pslldq\0" "\x07" "vpslldq\0" "\x06" "fxsave\0" "\x08" "fxsave64\0" \ +"\x08" "rdfsbase\0" "\x07" "fxrstor\0" "\x09" "fxrstor64\0" "\x08" "rdgsbase\0" \ +"\x07" "ldmxcsr\0" "\x08" "wrfsbase\0" "\x08" "vldmxcsr\0" "\x07" "stmxcsr\0" \ +"\x08" "wrgsbase\0" "\x08" "vstmxcsr\0" "\x07" "vmptrld\0" "\x07" "vmclear\0" \ +"\x05" "vmxon\0" "\x06" "movsxd\0" "\x05" "pause\0" "\x04" "wait\0" "\x06" "rdrand\0" \ +"\x06" "_3dnow\0"; const _WRegister _REGISTERS[] = { - { 3, "RAX" }, { 3, "RCX" }, { 3, "RDX" }, { 3, "RBX" }, { 3, "RSP" }, { 3, "RBP" }, { 3, "RSI" }, { 3, "RDI" }, { 2, "R8" }, { 2, "R9" }, { 3, "R10" }, { 3, "R11" }, { 3, "R12" }, { 3, "R13" }, { 3, "R14" }, { 3, "R15" }, - { 3, "EAX" }, { 3, "ECX" }, { 3, "EDX" }, { 3, "EBX" }, { 3, "ESP" }, { 3, "EBP" }, { 3, "ESI" }, { 3, "EDI" }, { 3, "R8D" }, { 3, "R9D" }, { 4, "R10D" }, { 4, "R11D" }, { 4, "R12D" }, { 4, "R13D" }, { 4, "R14D" }, { 4, "R15D" }, - { 2, "AX" }, { 2, "CX" }, { 2, "DX" }, { 2, "BX" }, { 2, "SP" }, { 2, "BP" }, { 2, "SI" }, { 2, "DI" }, { 3, "R8W" }, { 3, "R9W" }, { 4, "R10W" }, { 4, "R11W" }, { 4, "R12W" }, { 4, "R13W" }, { 4, "R14W" }, { 4, "R15W" }, - { 2, "AL" }, { 2, "CL" }, { 2, "DL" }, { 2, "BL" }, { 2, "AH" }, { 2, "CH" }, { 2, "DH" }, { 2, "BH" }, { 3, "R8B" }, { 3, "R9B" }, { 4, "R10B" }, { 4, "R11B" }, { 4, "R12B" }, { 4, "R13B" }, { 4, "R14B" }, { 4, "R15B" }, - { 3, "SPL" }, { 3, "BPL" }, { 3, "SIL" }, { 3, "DIL" }, - { 2, "ES" }, { 2, "CS" }, { 2, "SS" }, { 2, "DS" }, { 2, "FS" }, { 2, "GS" }, - { 3, "RIP" }, - { 3, "ST0" }, { 3, "ST1" }, { 3, "ST2" }, { 3, "ST3" }, { 3, "ST4" }, { 3, "ST5" }, { 3, "ST6" }, { 3, "ST7" }, - { 3, "MM0" }, { 3, "MM1" }, { 3, "MM2" }, { 3, "MM3" }, { 3, "MM4" }, { 3, "MM5" }, { 3, "MM6" }, { 3, "MM7" }, - { 4, "XMM0" }, { 4, "XMM1" }, { 4, "XMM2" }, { 4, "XMM3" }, { 4, "XMM4" }, { 4, "XMM5" }, { 4, "XMM6" }, { 4, "XMM7" }, { 4, "XMM8" }, { 4, "XMM9" }, { 5, "XMM10" }, { 5, "XMM11" }, { 5, "XMM12" }, { 5, "XMM13" }, { 5, "XMM14" }, { 5, "XMM15" }, - { 4, "YMM0" }, { 4, "YMM1" }, { 4, "YMM2" }, { 4, "YMM3" }, { 4, "YMM4" }, { 4, "YMM5" }, { 4, "YMM6" }, { 4, "YMM7" }, { 4, "YMM8" }, { 4, "YMM9" }, { 5, "YMM10" }, { 5, "YMM11" }, { 5, "YMM12" }, { 5, "YMM13" }, { 5, "YMM14" }, { 5, "YMM15" }, - { 3, "CR0" }, { 0, "" }, { 3, "CR2" }, { 3, "CR3" }, { 3, "CR4" }, { 0, "" }, { 0, "" }, { 0, "" }, { 3, "CR8" }, - { 3, "DR0" }, { 3, "DR1" }, { 3, "DR2" }, { 3, "DR3" }, { 0, "" }, { 0, "" }, { 3, "DR6" }, { 3, "DR7" } + { 3, "rax" }, { 3, "rcx" }, { 3, "rdx" }, { 3, "rbx" }, { 3, "rsp" }, { 3, "rbp" }, { 3, "rsi" }, { 3, "rdi" }, { 2, "r8" }, { 2, "r9" }, { 3, "r10" }, { 3, "r11" }, { 3, "r12" }, { 3, "r13" }, { 3, "r14" }, { 3, "r15" }, + { 3, "eax" }, { 3, "ecx" }, { 3, "edx" }, { 3, "ebx" }, { 3, "esp" }, { 3, "ebp" }, { 3, "esi" }, { 3, "edi" }, { 3, "r8d" }, { 3, "r9d" }, { 4, "r10d" }, { 4, "r11d" }, { 4, "r12d" }, { 4, "r13d" }, { 4, "r14d" }, { 4, "r15d" }, + { 2, "ax" }, { 2, "cx" }, { 2, "dx" }, { 2, "bx" }, { 2, "sp" }, { 2, "bp" }, { 2, "si" }, { 2, "di" }, { 3, "r8w" }, { 3, "r9w" }, { 4, "r10w" }, { 4, "r11w" }, { 4, "r12w" }, { 4, "r13w" }, { 4, "r14w" }, { 4, "r15w" }, + { 2, "al" }, { 2, "cl" }, { 2, "dl" }, { 2, "bl" }, { 2, "ah" }, { 2, "ch" }, { 2, "dh" }, { 2, "bh" }, { 3, "r8b" }, { 3, "r9b" }, { 4, "r10b" }, { 4, "r11b" }, { 4, "r12b" }, { 4, "r13b" }, { 4, "r14b" }, { 4, "r15b" }, + { 3, "spl" }, { 3, "bpl" }, { 3, "sil" }, { 3, "dil" }, + { 2, "es" }, { 2, "cs" }, { 2, "ss" }, { 2, "ds" }, { 2, "fs" }, { 2, "gs" }, + { 3, "rip" }, + { 3, "st0" }, { 3, "st1" }, { 3, "st2" }, { 3, "st3" }, { 3, "st4" }, { 3, "st5" }, { 3, "st6" }, { 3, "st7" }, + { 3, "mm0" }, { 3, "mm1" }, { 3, "mm2" }, { 3, "mm3" }, { 3, "mm4" }, { 3, "mm5" }, { 3, "mm6" }, { 3, "mm7" }, + { 4, "xmm0" }, { 4, "xmm1" }, { 4, "xmm2" }, { 4, "xmm3" }, { 4, "xmm4" }, { 4, "xmm5" }, { 4, "xmm6" }, { 4, "xmm7" }, { 4, "xmm8" }, { 4, "xmm9" }, { 5, "xmm10" }, { 5, "xmm11" }, { 5, "xmm12" }, { 5, "xmm13" }, { 5, "xmm14" }, { 5, "xmm15" }, + { 4, "ymm0" }, { 4, "ymm1" }, { 4, "ymm2" }, { 4, "ymm3" }, { 4, "ymm4" }, { 4, "ymm5" }, { 4, "ymm6" }, { 4, "ymm7" }, { 4, "ymm8" }, { 4, "ymm9" }, { 5, "ymm10" }, { 5, "ymm11" }, { 5, "ymm12" }, { 5, "ymm13" }, { 5, "ymm14" }, { 5, "ymm15" }, + { 3, "cr0" }, { 0, "" }, { 3, "cr2" }, { 3, "cr3" }, { 3, "cr4" }, { 0, "" }, { 0, "" }, { 0, "" }, { 3, "cr8" }, + { 3, "dr0" }, { 3, "dr1" }, { 3, "dr2" }, { 3, "dr3" }, { 0, "" }, { 0, "" }, { 3, "dr6" }, { 3, "dr7" } }; #endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.c b/NativeCore/Dependencies/distorm/src/textdefs.c index d8cd75a5..cf628951 100644 --- a/NativeCore/Dependencies/distorm/src/textdefs.c +++ b/NativeCore/Dependencies/distorm/src/textdefs.c @@ -13,7 +13,7 @@ This library is licensed under the BSD license. See the file COPYING. #ifndef DISTORM_LIGHT -static uint8_t Nibble2ChrTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; +static uint8_t Nibble2ChrTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; #define NIBBLE_TO_CHR Nibble2ChrTable[t] void _FASTCALL_ str_hex_b(_WString* s, unsigned int x) @@ -24,26 +24,26 @@ void _FASTCALL_ str_hex_b(_WString* s, unsigned int x) * for i in xrange(256): * if ((i % 0x10) == 0): * s += "\r\n" - * s += "\"%02x\", " % (i) + * s += "\"%02X\", " % (i) * return s */ static int8_t TextBTable[256][3] = { - "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", - "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", - "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", - "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", - "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", - "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", - "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", - "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", - "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", - "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", - "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", - "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", - "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", - "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", - "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff" + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", + "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", + "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", + "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", + "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", + "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" }; /* @@ -62,25 +62,25 @@ void _FASTCALL_ str_code_hb(_WString* s, unsigned int x) * for i in xrange(256): * if ((i % 0x10) == 0): * s += "\r\n" - * s += "\"0x%x\", " % (i) + * s += "\"0x%X\", " % (i) * return s */ - "0x0", "0x1", "0x2", "0x3", "0x4", "0x5", "0x6", "0x7", "0x8", "0x9", "0xa", "0xb", "0xc", "0xd", "0xe", "0xf", - "0x10", "0x11", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1a", "0x1b", "0x1c", "0x1d", "0x1e", "0x1f", - "0x20", "0x21", "0x22", "0x23", "0x24", "0x25", "0x26", "0x27", "0x28", "0x29", "0x2a", "0x2b", "0x2c", "0x2d", "0x2e", "0x2f", - "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "0x39", "0x3a", "0x3b", "0x3c", "0x3d", "0x3e", "0x3f", - "0x40", "0x41", "0x42", "0x43", "0x44", "0x45", "0x46", "0x47", "0x48", "0x49", "0x4a", "0x4b", "0x4c", "0x4d", "0x4e", "0x4f", - "0x50", "0x51", "0x52", "0x53", "0x54", "0x55", "0x56", "0x57", "0x58", "0x59", "0x5a", "0x5b", "0x5c", "0x5d", "0x5e", "0x5f", - "0x60", "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", "0x67", "0x68", "0x69", "0x6a", "0x6b", "0x6c", "0x6d", "0x6e", "0x6f", - "0x70", "0x71", "0x72", "0x73", "0x74", "0x75", "0x76", "0x77", "0x78", "0x79", "0x7a", "0x7b", "0x7c", "0x7d", "0x7e", "0x7f", - "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f", - "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f", - "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7", "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf", - "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7", "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf", - "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7", "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf", - "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7", "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf", - "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7", "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef", - "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7", "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff" + "0x0", "0x1", "0x2", "0x3", "0x4", "0x5", "0x6", "0x7", "0x8", "0x9", "0xA", "0xB", "0xC", "0xD", "0xE", "0xF", + "0x10", "0x11", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1A", "0x1B", "0x1C", "0x1D", "0x1E", "0x1F", + "0x20", "0x21", "0x22", "0x23", "0x24", "0x25", "0x26", "0x27", "0x28", "0x29", "0x2A", "0x2B", "0x2C", "0x2D", "0x2E", "0x2F", + "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "0x39", "0x3A", "0x3B", "0x3C", "0x3D", "0x3E", "0x3F", + "0x40", "0x41", "0x42", "0x43", "0x44", "0x45", "0x46", "0x47", "0x48", "0x49", "0x4A", "0x4B", "0x4C", "0x4D", "0x4E", "0x4F", + "0x50", "0x51", "0x52", "0x53", "0x54", "0x55", "0x56", "0x57", "0x58", "0x59", "0x5A", "0x5B", "0x5C", "0x5D", "0x5E", "0x5F", + "0x60", "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", "0x67", "0x68", "0x69", "0x6A", "0x6B", "0x6C", "0x6D", "0x6E", "0x6F", + "0x70", "0x71", "0x72", "0x73", "0x74", "0x75", "0x76", "0x77", "0x78", "0x79", "0x7A", "0x7B", "0x7C", "0x7D", "0x7E", "0x7F", + "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", "0x8A", "0x8B", "0x8C", "0x8D", "0x8E", "0x8F", + "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", "0x98", "0x99", "0x9A", "0x9B", "0x9C", "0x9D", "0x9E", "0x9F", + "0xA0", "0xA1", "0xA2", "0xA3", "0xA4", "0xA5", "0xA6", "0xA7", "0xA8", "0xA9", "0xAA", "0xAB", "0xAC", "0xAD", "0xAE", "0xAF", + "0xB0", "0xB1", "0xB2", "0xB3", "0xB4", "0xB5", "0xB6", "0xB7", "0xB8", "0xB9", "0xBA", "0xBB", "0xBC", "0xBD", "0xBE", "0xBF", + "0xC0", "0xC1", "0xC2", "0xC3", "0xC4", "0xC5", "0xC6", "0xC7", "0xC8", "0xC9", "0xCA", "0xCB", "0xCC", "0xCD", "0xCE", "0xCF", + "0xD0", "0xD1", "0xD2", "0xD3", "0xD4", "0xD5", "0xD6", "0xD7", "0xD8", "0xD9", "0xDA", "0xDB", "0xDC", "0xDD", "0xDE", "0xDF", + "0xE0", "0xE1", "0xE2", "0xE3", "0xE4", "0xE5", "0xE6", "0xE7", "0xE8", "0xE9", "0xEA", "0xEB", "0xEC", "0xED", "0xEE", "0xEF", + "0xF0", "0xF1", "0xF2", "0xF3", "0xF4", "0xF5", "0xF6", "0xF7", "0xF8", "0xF9", "0xFA", "0xFB", "0xFC", "0xFD", "0xFE", "0xFF" }; if (x < 0x10) { /* < 0x10 has a fixed length of 4 including null terminate. */ From ee9820947e7cb51ede76434a99cfc3652310b6df Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 00:56:01 +0100 Subject: [PATCH 213/777] Added CreatePatternFromCode. --- NativeCore/ReClassNET_Plugin.hpp | 1 + NativeCore/Shared/DistormHelper.cpp | 156 ++++++++++++++++++ NativeCore/Shared/DistormHelper.hpp | 5 + NativeCore/Unix/DisassembleCode.cpp | 55 +----- NativeCore/Unix/NativeCore.Unix.vcxproj | 2 +- .../Unix/NativeCore.Unix.vcxproj.filters | 7 +- NativeCore/Unix/NativeCore.hpp | 2 +- NativeCore/Windows/DisassembleCode.cpp | 54 +----- NativeCore/Windows/NativeCore.hpp | 5 + NativeCore/Windows/NativeCore.vcxproj | 10 +- NativeCore/Windows/NativeCore.vcxproj.filters | 7 +- ReClass.NET/Core/CoreFunctionsManager.cs | 4 +- ReClass.NET/Core/DataExchange.cs | 2 + ReClass.NET/Core/InternalCoreFunctions.cs | 6 +- ReClass.NET/Memory/Disassembler.cs | 6 +- ReClass.NET/MemoryScanner/BytePattern.cs | 50 ++++++ ReClass.NET/MemoryScanner/PatternScanner.cs | 49 ++++++ 17 files changed, 301 insertions(+), 120 deletions(-) create mode 100644 NativeCore/Shared/DistormHelper.cpp create mode 100644 NativeCore/Shared/DistormHelper.hpp diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index d0a98ce5..bbfbae41 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -124,6 +124,7 @@ struct InstructionData { int Length; uint8_t Data[15]; + int StaticInstructionBytes; RC_UnicodeChar Instruction[64]; }; diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp new file mode 100644 index 00000000..dac98d67 --- /dev/null +++ b/NativeCore/Shared/DistormHelper.cpp @@ -0,0 +1,156 @@ +#include "DistormHelper.hpp" + +#include +extern "C" +{ +#include <../src/instructions.h> +} + +bool AreOperandsStatic(_DInst *instruction, const int prefixLength) +{ + const auto fc = META_GET_FC(instruction->meta); + if (fc == FC_UNC_BRANCH || fc == FC_CND_BRANCH) + { + if (instruction->size - prefixLength < 5) + { + return true; + } + } + + const auto ops = instruction->ops; + for (auto i = 0; i < OPERANDS_NO; i++) + { + switch (ops[i].type) + { + case O_NONE: + case O_REG: + case O_IMM1: + case O_IMM2: + continue; + case O_IMM: + if (ops[i].size < 32) + { + continue; + } + return false; + case O_DISP: + case O_SMEM: + case O_MEM: + if (instruction->dispSize < 32) + { + continue; + } + +#ifdef RECLASSNET64 + if (ops[i].index == R_RIP) + { + continue; + } +#endif + return false; + case O_PC: + case O_PTR: + return false; + } + } + + return true; +} + +int GetStaticInstructionBytes(_DInst *instruction, const uint8_t *data) +{ + _CodeInfo info = {}; + info.codeOffset = reinterpret_cast<_OffsetType>(data); + info.code = data; + info.codeLen = instruction->size; + info.features = DF_NONE; +#ifdef RECLASSNET32 + info.dt = Decode32Bits; +#else + info.dt = Decode64Bits; +#endif + + _PrefixState ps = {}; + memset(ps.pfxIndexer, PFXIDX_NONE, sizeof(int) * PFXIDX_MAX); + ps.start = data; + ps.last = data; + + prefixes_decode(data, info.codeLen, &ps, info.dt); + + info.codeOffset = reinterpret_cast<_OffsetType>(ps.last); + info.code = ps.last; + + const auto prefixLength = static_cast(ps.start - ps.last); + info.codeLen -= prefixLength; + + inst_lookup(&info, &ps); + + if (AreOperandsStatic(instruction, prefixLength)) + { + return instruction->size; + } + + return instruction->size - info.codeLen; +} + +bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, InstructionData* instruction) +{ + _CodeInfo info = {}; + info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); + info.code = reinterpret_cast(address); + info.codeLen = length; + info.features = DF_NONE; + +#ifdef RECLASSNET32 + info.dt = Decode32Bits; +#else + info.dt = Decode64Bits; +#endif + + _DInst decodedInstructions[1] = {}; + unsigned int instructionCount = 0; + + const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); + if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount != 1) + { + return false; + } + + _DecodedInst instructionInfo = {}; + distorm_format(&info, &decodedInstructions[0], &instructionInfo); + + instruction->Length = instructionInfo.size; + std::memcpy(instruction->Data, address, instructionInfo.size); + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.mnemonic.p), + instruction->Instruction, + instructionInfo.mnemonic.length + ); + if (instructionInfo.operands.length != 0) + { + instruction->Instruction[instructionInfo.mnemonic.length] = ' '; + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.operands.p), + 0, + instruction->Instruction, + instructionInfo.mnemonic.length + 1, + std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) + ); + } + + if (determineStaticInstructionBytes) + { + instruction->StaticInstructionBytes = GetStaticInstructionBytes( + &decodedInstructions[0], + reinterpret_cast(address) + ); + } + else + { + instruction->StaticInstructionBytes = -1; + } + + return true; +} diff --git a/NativeCore/Shared/DistormHelper.hpp b/NativeCore/Shared/DistormHelper.hpp new file mode 100644 index 00000000..42ecbe8d --- /dev/null +++ b/NativeCore/Shared/DistormHelper.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include "../ReClassNET_Plugin.hpp" + +bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, InstructionData* instruction); \ No newline at end of file diff --git a/NativeCore/Unix/DisassembleCode.cpp b/NativeCore/Unix/DisassembleCode.cpp index 48e437f4..068246aa 100644 --- a/NativeCore/Unix/DisassembleCode.cpp +++ b/NativeCore/Unix/DisassembleCode.cpp @@ -1,55 +1,6 @@ -#include -#include -#include +#include "../Shared/DistormHelper.hpp" -#include "NativeCore.hpp" - -extern "C" bool DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, InstructionData* instruction) +extern "C" bool DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { - _CodeInfo info; - info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); - info.code = reinterpret_cast(address); - info.codeLen = length; - info.features = DF_NONE; - -#ifdef RECLASSNET32 - info.dt = Decode32Bits; -#else - info.dt = Decode64Bits; -#endif - - _DInst decodedInstructions[1]; - unsigned int instructionCount = 0; - - const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); - if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount == 1) - { - return false; - } - - _DecodedInst instructionInfo; - distorm_format(&info, &decodedInstructions[0], &instructionInfo); - - instruction->Length = instructionInfo.size; - std::memcpy(instruction->Data, address, instructionInfo.size); - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.mnemonic.p), - instruction->Instruction, - instructionInfo.mnemonic.length - ); - if (instructionInfo.operands.length != 0) - { - instruction->Instruction[instructionInfo.mnemonic.length] = ' '; - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.operands.p), - 0, - instruction->Instruction, - instructionInfo.mnemonic.length + 1, - std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) - ); - } - - return true; + return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index 85a75c8d..6d13567a 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -85,6 +85,7 @@ + @@ -98,7 +99,6 @@ - diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters index 09256130..1d75cfb2 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters @@ -10,6 +10,9 @@ {5b0453e9-b429-4dfd-bcbb-f3756d073e60} + + {976c6ca6-4172-4080-8162-a7913375df1a} + @@ -72,10 +75,12 @@ Dependencies\distorm + + Shared + - \ No newline at end of file diff --git a/NativeCore/Unix/NativeCore.hpp b/NativeCore/Unix/NativeCore.hpp index 3004680a..9939c9b0 100644 --- a/NativeCore/Unix/NativeCore.hpp +++ b/NativeCore/Unix/NativeCore.hpp @@ -4,7 +4,7 @@ #include #include "../ReClassNET_Plugin.hpp" -#include "../Keys.hpp" +#include "../Shared/Keys.hpp" extern "C" { diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index 25fe26b3..83cf9447 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,54 +1,6 @@ -#include -#include +#include "../Shared/DistormHelper.hpp" -#include "NativeCore.hpp" - -bool __stdcall DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, InstructionData* instruction) +bool __stdcall DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { - _CodeInfo info; - info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); - info.code = reinterpret_cast(address); - info.codeLen = length; - info.features = DF_NONE; - -#ifdef RECLASSNET32 - info.dt = Decode32Bits; -#else - info.dt = Decode64Bits; -#endif - - _DInst decodedInstructions[1]; - unsigned int instructionCount = 0; - - const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); - if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount != 1) - { - return false; - } - - _DecodedInst instructionInfo; - distorm_format(&info, &decodedInstructions[0], &instructionInfo); - - instruction->Length = instructionInfo.size; - std::memcpy(instruction->Data, address, instructionInfo.size); - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.mnemonic.p), - instruction->Instruction, - instructionInfo.mnemonic.length - ); - if (instructionInfo.operands.length != 0) - { - instruction->Instruction[instructionInfo.mnemonic.length] = ' '; - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.operands.p), - 0, - instruction->Instruction, - instructionInfo.mnemonic.length + 1, - std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) - ); - } - - return true; + return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Windows/NativeCore.hpp b/NativeCore/Windows/NativeCore.hpp index f99dc92d..e088eae7 100644 --- a/NativeCore/Windows/NativeCore.hpp +++ b/NativeCore/Windows/NativeCore.hpp @@ -1,6 +1,7 @@ #pragma once #include "../ReClassNET_Plugin.hpp" +#include "../Shared/Keys.hpp" void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess); void __stdcall EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); @@ -19,3 +20,7 @@ void __stdcall DetachDebuggerFromProcess(RC_Pointer id); bool __stdcall AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); void __stdcall HandleDebugEvent(DebugEvent* evt); bool __stdcall SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); + +RC_Pointer __stdcall InitializeInput(); +bool __stdcall GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); +void __stdcall ReleaseInput(RC_Pointer handle); \ No newline at end of file diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 9d1cc717..fea54b2e 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -103,7 +103,7 @@ Level3 Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;BEA_ENGINE_STATIC;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) Windows @@ -118,7 +118,7 @@ Level3 Disabled - _DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;BEA_ENGINE_STATIC;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + _DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) Windows @@ -135,7 +135,7 @@ MaxSpeed true true - WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;BEA_ENGINE_STATIC;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) Windows @@ -154,7 +154,7 @@ MaxSpeed true true - NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;BEA_ENGINE_STATIC;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) Windows @@ -175,6 +175,7 @@ + @@ -191,7 +192,6 @@ - diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index e9aa6339..a7d8862a 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -61,6 +61,9 @@ Dependencies\distorm + + Shared + @@ -75,10 +78,12 @@ {4b8b2ee0-6a06-4e69-bce3-ff446bfa6b82} + + {faf06b55-02ad-4707-a65d-37e1c0d13640} + - \ No newline at end of file diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 7817b03e..9708ee35 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -174,9 +174,9 @@ public bool SetHardwareBreakpoint(IntPtr id, IntPtr address, HardwareBreakpointR #region Internal Core Functions - public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, out InstructionData instruction) + public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, out InstructionData instruction) { - return internalCoreFunctions.DisassembleCode(address, length, virtualAddress, out instruction); + return internalCoreFunctions.DisassembleCode(address, length, virtualAddress, determineStaticInstructionBytes, out instruction); } public IntPtr InitializeInput() diff --git a/ReClass.NET/Core/DataExchange.cs b/ReClass.NET/Core/DataExchange.cs index 1c7b21d5..1abfdb42 100644 --- a/ReClass.NET/Core/DataExchange.cs +++ b/ReClass.NET/Core/DataExchange.cs @@ -69,6 +69,8 @@ public struct InstructionData [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] Data; + public int StaticInstructionBytes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string Instruction; }; diff --git a/ReClass.NET/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs index 7ffe3fc0..75fd0554 100644 --- a/ReClass.NET/Core/InternalCoreFunctions.cs +++ b/ReClass.NET/Core/InternalCoreFunctions.cs @@ -15,7 +15,7 @@ internal class InternalCoreFunctions : NativeCoreWrapper, IDisposable private readonly IntPtr handle; [return: MarshalAs(UnmanagedType.I1)] - private delegate bool DisassembleCodeDelegate(IntPtr address, IntPtr length, IntPtr virtualAddress, out InstructionData instruction); + private delegate bool DisassembleCodeDelegate(IntPtr address, IntPtr length, IntPtr virtualAddress, [MarshalAs(UnmanagedType.I1)] bool determineStaticInstructionBytes, out InstructionData instruction); private delegate IntPtr InitializeInputDelegate(); @@ -76,9 +76,9 @@ public void Dispose() #endregion - public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, out InstructionData instruction) + public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, out InstructionData instruction) { - return disassembleCodeDelegate(address, (IntPtr)length, virtualAddress, out instruction); + return disassembleCodeDelegate(address, (IntPtr)length, virtualAddress, determineStaticInstructionBytes, out instruction); } public IntPtr InitializeInput() diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 59e24fbd..ed659ad9 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -71,7 +71,7 @@ public IEnumerable DisassembleCode(IntPtr address, int while (eip.CompareTo(end) == -1) { - var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, out var instruction); + var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, false, out var instruction); if (!res) { break; @@ -189,7 +189,7 @@ private DisassembledInstruction GetPreviousInstruction(IntPtr address, IntPtr vi for (var i = 1; i < 15; ++i) { x = address + 65 + i; - if (coreFunctions.DisassembleCode(x, end.Sub(x).ToInt32() + 1, virtualAddress, out instruction)) + if (coreFunctions.DisassembleCode(x, end.Sub(x).ToInt32() + 1, virtualAddress, false, out instruction)) { if (x + instruction.Length == end) { @@ -217,7 +217,7 @@ private IntPtr GetPreviousInstructionHelper(IntPtr address, int distance, IntPtr var y = virtualAddress - distance; while (x.CompareTo(address) == -1) // aka x < address { - if (coreFunctions.DisassembleCode(x, address.Sub(x).ToInt32() + 1, y, out instruction)) + if (coreFunctions.DisassembleCode(x, address.Sub(x).ToInt32() + 1, y, false, out instruction)) { x += instruction.Length; y += instruction.Length; diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index 5ff487ec..4b95b330 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.IO; using System.Linq; +using System.Text; using ReClassNET.Util; namespace ReClassNET.MemoryScanner @@ -24,6 +25,26 @@ private struct Nibble public byte ByteValue => !HasWildcard ? (byte)((nibble1.Value << 4) + nibble2.Value) : throw new InvalidOperationException(); + public static PatternByte AsByte(byte b) + { + var pb = new PatternByte + { + nibble1 = { Value = (b >> 4) & 0xF }, + nibble2 = { Value = b & 0xF } + }; + return pb; + } + + public static PatternByte AsWildcard() + { + var pb = new PatternByte + { + nibble1 = { IsWildcard = true }, + nibble2 = { IsWildcard = true } + }; + return pb; + } + private static bool IsHexValue(char c) { return '0' <= c && c <= '9' @@ -82,6 +103,16 @@ public bool Equals(byte b) } return matched == 2; } + + public override string ToString() + { + var sb = new StringBuilder(); + if (nibble1.IsWildcard) sb.Append('?'); + else sb.AppendFormat("{0:X}", nibble1.Value); + if (nibble2.IsWildcard) sb.Append('?'); + else sb.AppendFormat("{0:X}", nibble2.Value); + return sb.ToString(); + } } private readonly List pattern = new List(); @@ -134,6 +165,20 @@ public static BytePattern Parse(string value) return pattern; } + public static BytePattern From(IEnumerable> data) + { + var pattern = new BytePattern(); + + foreach (var i in data) + { + var pb = i.Item2 ? PatternByte.AsWildcard() : PatternByte.AsByte(i.Item1); + + pattern.pattern.Add(pb); + } + + return pattern; + } + /// /// Tests if the provided byte array matches the byte pattern at the provided index. /// @@ -172,5 +217,10 @@ public byte[] ToByteArray() return pattern.Select(pb => pb.ByteValue).ToArray(); } + + public override string ToString() + { + return string.Join(" ", pattern.Select(p => p.ToString())); + } } } diff --git a/ReClass.NET/MemoryScanner/PatternScanner.cs b/ReClass.NET/MemoryScanner/PatternScanner.cs index e0ab1afc..7c292081 100644 --- a/ReClass.NET/MemoryScanner/PatternScanner.cs +++ b/ReClass.NET/MemoryScanner/PatternScanner.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Runtime.InteropServices; using ReClassNET.Memory; +using ReClassNET.Util; namespace ReClassNET.MemoryScanner { @@ -84,5 +87,51 @@ private static int FindPattern(BytePattern pattern, byte[] data) return -1; } + + /// + /// Creates a for the given address range. + /// + /// The process to use. + /// The start of the address range. + /// The size of the address range. + /// A describing the address range. + public static BytePattern CreatePatternFromCode(RemoteProcess process, IntPtr start, int size) + { + var data = new List>(); + + var buffer = process.ReadRemoteMemory(start, size); + + var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + var eip = handle.AddrOfPinnedObject(); + var end = eip + size; + + while (eip.CompareTo(end) == -1) + { + var res = process.CoreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, IntPtr.Zero, true, out var instruction); + if (!res) + { + break; + } + + for (var i = 0; i < instruction.Length; ++i) + { + data.Add(Tuple.Create(instruction.Data[i], i >= instruction.StaticInstructionBytes)); + } + + eip += instruction.Length; + } + } + finally + { + if (handle.IsAllocated) + { + handle.Free(); + } + } + + return BytePattern.From(data); + } } } From 9ca525ed373889e498fe733166cda8d777d35231 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 14:54:15 +0100 Subject: [PATCH 214/777] Added different string formats. --- ReClass.NET/MemoryScanner/BytePattern.cs | 53 ++++++++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index 4b95b330..b83d55aa 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -8,6 +8,12 @@ namespace ReClassNET.MemoryScanner { + public enum PatternFormat + { + Code, + Combined + } + public class BytePattern { private struct PatternByte @@ -104,15 +110,25 @@ public bool Equals(byte b) return matched == 2; } - public override string ToString() + public Tuple ToString(PatternFormat format) { - var sb = new StringBuilder(); - if (nibble1.IsWildcard) sb.Append('?'); - else sb.AppendFormat("{0:X}", nibble1.Value); - if (nibble2.IsWildcard) sb.Append('?'); - else sb.AppendFormat("{0:X}", nibble2.Value); - return sb.ToString(); + switch (format) + { + case PatternFormat.Code: + return HasWildcard ? Tuple.Create("\\x00", "?") : Tuple.Create($"\\x{ByteValue:X02}", "x"); + case PatternFormat.Combined: + var sb = new StringBuilder(); + if (nibble1.IsWildcard) sb.Append('?'); + else sb.AppendFormat("{0:X}", nibble1.Value); + if (nibble2.IsWildcard) sb.Append('?'); + else sb.AppendFormat("{0:X}", nibble2.Value); + return Tuple.Create(sb.ToString(), null); + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } } + + public override string ToString() => ToString(PatternFormat.Combined).Item1; } private readonly List pattern = new List(); @@ -218,9 +234,28 @@ public byte[] ToByteArray() return pattern.Select(pb => pb.ByteValue).ToArray(); } - public override string ToString() + public Tuple ToString(PatternFormat format) { - return string.Join(" ", pattern.Select(p => p.ToString())); + switch (format) + { + case PatternFormat.Code: + var sb1 = new StringBuilder(); + var sb2 = new StringBuilder(); + pattern + .Select(p => p.ToString(PatternFormat.Code)) + .ForEach(t => + { + sb1.Append(t.Item1); + sb2.Append(t.Item2); + }); + return Tuple.Create(sb1.ToString(), sb2.ToString()); + case PatternFormat.Combined: + return Tuple.Create(string.Join(" ", pattern.Select(p => p.ToString(PatternFormat.Combined).Item1)), null); + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } } + + public override string ToString() => ToString(PatternFormat.Combined).Item1; } } From c2e41461ddec9313621a35f528156e22e3606936 Mon Sep 17 00:00:00 2001 From: patrick Date: Mon, 20 Nov 2017 21:09:05 +0100 Subject: [PATCH 215/777] plugin manager now still checks for version information on dlls and exe files (managed code) --- NativeCore/ReClassNET_Plugin.hpp | 6 +----- ReClass.NET/Memory/ProcessInfo.cs | 7 +------ ReClass.NET/Plugins/PluginManager.cs | 12 ++++++------ 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 29651ace..9c334e9c 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -1,6 +1,4 @@ #pragma once -#ifndef __RECLASS_NET_PLUGIN_H__ -#define __RECLASS_NET_PLUGIN_H__ #include #include @@ -12,7 +10,7 @@ // OS Specific #ifdef __linux__ - #define __stdcall + #define __stdcall __attribute__((__stdcall__)) #endif // Types @@ -293,5 +291,3 @@ inline char16_t* str16cpy(char16_t* destination, const char16_t* source, size_t } return destination; } - -#endif diff --git a/ReClass.NET/Memory/ProcessInfo.cs b/ReClass.NET/Memory/ProcessInfo.cs index b83a32d6..fe60ae2f 100644 --- a/ReClass.NET/Memory/ProcessInfo.cs +++ b/ReClass.NET/Memory/ProcessInfo.cs @@ -26,12 +26,7 @@ public ProcessInfo(IntPtr id, string name, string path) { using (var i = NativeMethods.GetIconForFile(Path)) { - if (i == null) - { - return null; - } - - return i.ToBitmap(); + return i?.ToBitmap(); } }); } diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index 6fc8587b..0d9e63a6 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -39,11 +39,11 @@ public void LoadAllPlugins(string path, ILogger logger) var directory = new DirectoryInfo(path); - LoadPlugins(directory.GetFiles("*.dll"), logger); + LoadPlugins(directory.GetFiles("*.dll"), logger, true); - LoadPlugins(directory.GetFiles("*.exe"), logger); + LoadPlugins(directory.GetFiles("*.exe"), logger, true); - LoadPlugins(directory.GetFiles("*.so"), logger); + LoadPlugins(directory.GetFiles("*.so"), logger, false); } catch (Exception ex) { @@ -51,7 +51,7 @@ public void LoadAllPlugins(string path, ILogger logger) } } - private void LoadPlugins(IEnumerable files, ILogger logger) + private void LoadPlugins(IEnumerable files, ILogger logger, bool checkProductName) { // TODO: How to include plugin infos for unix files as they don't have embedded version info. @@ -65,10 +65,10 @@ private void LoadPlugins(IEnumerable files, ILogger logger) { fvi = FileVersionInfo.GetVersionInfo(fi.FullName); - /*if (fvi.ProductName != PluginInfo.PluginName && fvi.ProductName != PluginInfo.PluginNativeName) + if (checkProductName && fvi.ProductName != PluginInfo.PluginName && fvi.ProductName != PluginInfo.PluginNativeName) { continue; - }*/ + } } catch { From aa5047b9db857ca523826cee8375744fb9e5e151 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 23:05:52 +0100 Subject: [PATCH 216/777] Added comments. --- ReClass.NET/MemoryScanner/BytePattern.cs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index b83d55aa..ef0ca18b 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -10,8 +10,14 @@ namespace ReClassNET.MemoryScanner { public enum PatternFormat { - Code, - Combined + /// + /// Example: AA BB ?? D? ?E FF + /// + Combined, + /// + /// Example: \xAA\xBB\x00\x00\x00\xFF xx???x + /// + PatternAndMask } public class BytePattern @@ -114,7 +120,7 @@ public Tuple ToString(PatternFormat format) { switch (format) { - case PatternFormat.Code: + case PatternFormat.PatternAndMask: return HasWildcard ? Tuple.Create("\\x00", "?") : Tuple.Create($"\\x{ByteValue:X02}", "x"); case PatternFormat.Combined: var sb = new StringBuilder(); @@ -234,15 +240,20 @@ public byte[] ToByteArray() return pattern.Select(pb => pb.ByteValue).ToArray(); } + /// + /// Formats the in the specified . + /// + /// The format of the pattern. + /// A tuple containing the format. If is not the second item is null. public Tuple ToString(PatternFormat format) { switch (format) { - case PatternFormat.Code: + case PatternFormat.PatternAndMask: var sb1 = new StringBuilder(); var sb2 = new StringBuilder(); pattern - .Select(p => p.ToString(PatternFormat.Code)) + .Select(p => p.ToString(PatternFormat.PatternAndMask)) .ForEach(t => { sb1.Append(t.Item1); From d56f7ec606deb05617f9f73ea7314b2cbb96c5be Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 23:24:17 +0100 Subject: [PATCH 217/777] Added RC_CallConv. --- NativeCore/ReClassNET_Plugin.hpp | 6 +++- NativeCore/Unix/CloseRemoteProcess.cpp | 2 +- NativeCore/Unix/ControlRemoteProcess.cpp | 2 +- NativeCore/Unix/Debugger.cpp | 10 +++--- NativeCore/Unix/DisassembleCode.cpp | 2 +- NativeCore/Unix/EnumerateProcesses.cpp | 2 +- .../EnumerateRemoteSectionsAndModules.cpp | 2 +- NativeCore/Unix/Input.cpp | 8 ++--- NativeCore/Unix/IsProcessValid.cpp | 2 +- NativeCore/Unix/OpenRemoteProcess.cpp | 2 +- NativeCore/Unix/ReadRemoteMemory.cpp | 2 +- NativeCore/Unix/WriteRemoteMemory.cpp | 2 +- NativeCore/Windows/CloseRemoteProcess.cpp | 2 +- NativeCore/Windows/ControlRemoteProcess.cpp | 10 +++--- NativeCore/Windows/Debugger.cpp | 10 +++--- NativeCore/Windows/DisassembleCode.cpp | 2 +- NativeCore/Windows/EnumerateProcesses.cpp | 2 +- .../EnumerateRemoteSectionsAndModules.cpp | 4 +-- NativeCore/Windows/Input.cpp | 6 ++-- NativeCore/Windows/IsProcessValid.cpp | 4 +-- NativeCore/Windows/NativeCore.hpp | 32 +++++++++---------- NativeCore/Windows/OpenRemoteProcess.cpp | 2 +- NativeCore/Windows/ReadRemoteMemory.cpp | 2 +- NativeCore/Windows/WriteRemoteMemory.cpp | 2 +- 24 files changed, 61 insertions(+), 59 deletions(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index ea5885ad..5440cbc1 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -10,7 +10,11 @@ // OS Specific #ifdef __linux__ - #define __stdcall __attribute__((__stdcall__)) + #define RC_CallConv +#elif _WIN32 + #define RC_CallConv __stdcall +#else + static_assert(false, "Missing RC_CallConv specification"); #endif // Types diff --git a/NativeCore/Unix/CloseRemoteProcess.cpp b/NativeCore/Unix/CloseRemoteProcess.cpp index 485a9017..cf5dc94b 100644 --- a/NativeCore/Unix/CloseRemoteProcess.cpp +++ b/NativeCore/Unix/CloseRemoteProcess.cpp @@ -1,6 +1,6 @@ #include "NativeCore.hpp" -extern "C" void CloseRemoteProcess(RC_Pointer handle) +extern "C" void RC_CallConv CloseRemoteProcess(RC_Pointer handle) { } diff --git a/NativeCore/Unix/ControlRemoteProcess.cpp b/NativeCore/Unix/ControlRemoteProcess.cpp index 23ced6ad..36c86945 100644 --- a/NativeCore/Unix/ControlRemoteProcess.cpp +++ b/NativeCore/Unix/ControlRemoteProcess.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -extern "C" void ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) +extern "C" void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) { int signal = SIGKILL; if (action == ControlRemoteProcessAction::Suspend) diff --git a/NativeCore/Unix/Debugger.cpp b/NativeCore/Unix/Debugger.cpp index c98be510..a4a74241 100644 --- a/NativeCore/Unix/Debugger.cpp +++ b/NativeCore/Unix/Debugger.cpp @@ -51,7 +51,7 @@ pid_t waitpid_timeout(int* status, int timeoutInMilliseconds, bool& timedOut) return waitpid_timeout(-1, status, 0, timeoutInMilliseconds, timedOut); } -extern "C" bool AttachDebuggerToProcess(RC_Pointer id) +extern "C" bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) { //TODO: Attach to all threads. @@ -64,14 +64,14 @@ extern "C" bool AttachDebuggerToProcess(RC_Pointer id) return false; } -extern "C" void DetachDebuggerFromProcess(RC_Pointer id) +extern "C" void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) { //TODO: Detach to all threads. ptrace(PTRACE_DETACH, static_cast(reinterpret_cast(id)), nullptr, nullptr); } -extern "C" bool AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) +extern "C" bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) { int status; bool timedOut; @@ -169,7 +169,7 @@ extern "C" bool AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) return result; } -extern "C" void HandleDebugEvent(DebugEvent* evt) +extern "C" void RC_CallConv HandleDebugEvent(DebugEvent* evt) { auto tid = static_cast(reinterpret_cast(evt->ThreadId)); @@ -196,7 +196,7 @@ extern "C" void HandleDebugEvent(DebugEvent* evt) } } -extern "C" bool SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) +extern "C" bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) { if (reg == HardwareBreakpointRegister::InvalidRegister) { diff --git a/NativeCore/Unix/DisassembleCode.cpp b/NativeCore/Unix/DisassembleCode.cpp index 068246aa..ea4c85de 100644 --- a/NativeCore/Unix/DisassembleCode.cpp +++ b/NativeCore/Unix/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -extern "C" bool DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +extern "C" bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Unix/EnumerateProcesses.cpp b/NativeCore/Unix/EnumerateProcesses.cpp index 84cdcfe2..f04bcaf1 100644 --- a/NativeCore/Unix/EnumerateProcesses.cpp +++ b/NativeCore/Unix/EnumerateProcesses.cpp @@ -79,7 +79,7 @@ Platform GetProcessPlatform(const std::string& auxvPath) return platform; } -extern "C" void EnumerateProcesses(EnumerateProcessCallback callbackProcess) +extern "C" void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) { if (callbackProcess == nullptr) { diff --git a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp index b8116f80..a3ef6d8b 100644 --- a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp @@ -36,7 +36,7 @@ std::istream& operator >> (std::istream& s, SectionProtection& protection) return s; } -extern "C" void EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) +extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) { if (callbackSection == nullptr && callbackModule == nullptr) { diff --git a/NativeCore/Unix/Input.cpp b/NativeCore/Unix/Input.cpp index 3caf78ff..dc17d856 100644 --- a/NativeCore/Unix/Input.cpp +++ b/NativeCore/Unix/Input.cpp @@ -1,19 +1,17 @@ #include "NativeCore.hpp" #include "../Shared/Keys.hpp" -void ReleaseInput(); - -RC_Pointer InitializeInput() +RC_Pointer RC_CallConv InitializeInput() { return nullptr; } -bool GetPressedKeys(RC_Pointer handle, Keys* state[], int* count) +bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count) { return false; } -void ReleaseInput(RC_Pointer handle) +void RC_CallConv ReleaseInput(RC_Pointer handle) { } diff --git a/NativeCore/Unix/IsProcessValid.cpp b/NativeCore/Unix/IsProcessValid.cpp index 9f746df6..f72b7c90 100644 --- a/NativeCore/Unix/IsProcessValid.cpp +++ b/NativeCore/Unix/IsProcessValid.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -extern "C" bool IsProcessValid(RC_Pointer handle) +extern "C" bool RC_CallConv IsProcessValid(RC_Pointer handle) { return kill(static_cast(reinterpret_cast(handle)), 0) == 0; } diff --git a/NativeCore/Unix/OpenRemoteProcess.cpp b/NativeCore/Unix/OpenRemoteProcess.cpp index 07f92ed5..6456760e 100644 --- a/NativeCore/Unix/OpenRemoteProcess.cpp +++ b/NativeCore/Unix/OpenRemoteProcess.cpp @@ -1,6 +1,6 @@ #include "NativeCore.hpp" -extern "C" RC_Pointer OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) +extern "C" RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) { return id; } diff --git a/NativeCore/Unix/ReadRemoteMemory.cpp b/NativeCore/Unix/ReadRemoteMemory.cpp index 21f5d830..4a647668 100644 --- a/NativeCore/Unix/ReadRemoteMemory.cpp +++ b/NativeCore/Unix/ReadRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" bool ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +extern "C" bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { iovec local[1]; iovec remote[1]; diff --git a/NativeCore/Unix/WriteRemoteMemory.cpp b/NativeCore/Unix/WriteRemoteMemory.cpp index d0e2387f..4f20717a 100644 --- a/NativeCore/Unix/WriteRemoteMemory.cpp +++ b/NativeCore/Unix/WriteRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" bool WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +extern "C" bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { iovec local[1]; iovec remote[1]; diff --git a/NativeCore/Windows/CloseRemoteProcess.cpp b/NativeCore/Windows/CloseRemoteProcess.cpp index d18a34ab..7cdb91cd 100644 --- a/NativeCore/Windows/CloseRemoteProcess.cpp +++ b/NativeCore/Windows/CloseRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -void __stdcall CloseRemoteProcess(RC_Pointer handle) +void RC_CallConv CloseRemoteProcess(RC_Pointer handle) { CloseHandle(handle); } diff --git a/NativeCore/Windows/ControlRemoteProcess.cpp b/NativeCore/Windows/ControlRemoteProcess.cpp index 70f0f54a..82dee2a0 100644 --- a/NativeCore/Windows/ControlRemoteProcess.cpp +++ b/NativeCore/Windows/ControlRemoteProcess.cpp @@ -3,17 +3,17 @@ #include "NativeCore.hpp" -void __stdcall ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) +void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) { if (action == ControlRemoteProcessAction::Suspend || action == ControlRemoteProcessAction::Resume) { - auto processId = GetProcessId(handle); + const auto processId = GetProcessId(handle); if (processId != 0) { - auto snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + const auto snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (snapshotHandle != INVALID_HANDLE_VALUE) { - auto fn = action == ControlRemoteProcessAction::Suspend ? SuspendThread : ResumeThread; + const auto fn = action == ControlRemoteProcessAction::Suspend ? SuspendThread : ResumeThread; THREADENTRY32 te32 = {}; te32.dwSize = sizeof(THREADENTRY32); @@ -23,7 +23,7 @@ void __stdcall ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessActio { if (te32.th32OwnerProcessID == processId) { - auto threadHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID); + const auto threadHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID); if (threadHandle) { fn(threadHandle); diff --git a/NativeCore/Windows/Debugger.cpp b/NativeCore/Windows/Debugger.cpp index 232cbeca..ba1505c6 100644 --- a/NativeCore/Windows/Debugger.cpp +++ b/NativeCore/Windows/Debugger.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -bool __stdcall AttachDebuggerToProcess(RC_Pointer id) +bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) { if (!DebugActiveProcess(static_cast(reinterpret_cast(id)))) { @@ -15,12 +15,12 @@ bool __stdcall AttachDebuggerToProcess(RC_Pointer id) return true; } -void __stdcall DetachDebuggerFromProcess(RC_Pointer id) +void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) { DebugActiveProcessStop(static_cast(reinterpret_cast(id))); } -bool __stdcall AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) +bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) { DEBUG_EVENT _evt = { }; if (!WaitForDebugEvent(&_evt, timeoutInMilliseconds)) @@ -127,7 +127,7 @@ bool __stdcall AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) return result; } -void __stdcall HandleDebugEvent(DebugEvent* evt) +void RC_CallConv HandleDebugEvent(DebugEvent* evt) { DWORD continueStatus = 0; switch (evt->ContinueStatus) @@ -143,7 +143,7 @@ void __stdcall HandleDebugEvent(DebugEvent* evt) ContinueDebugEvent(static_cast(reinterpret_cast(evt->ProcessId)), static_cast(reinterpret_cast(evt->ThreadId)), continueStatus); } -bool __stdcall SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) +bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) { if (reg == HardwareBreakpointRegister::InvalidRegister) { diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index 83cf9447..c65633e1 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -bool __stdcall DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index 67b048eb..4732976e 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -44,7 +44,7 @@ Platform GetProcessPlatform(HANDLE process) return Platform::Unknown; } -void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess) +void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) { if (callbackProcess == nullptr) { diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 3db367c8..54a0c9ba 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -5,7 +5,7 @@ #include "NativeCore.hpp" -void __stdcall EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) +void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) { if (callbackSection == nullptr && callbackModule == nullptr) { @@ -55,7 +55,7 @@ void __stdcall EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRe address = reinterpret_cast(memInfo.BaseAddress) + memInfo.RegionSize; } - auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); + const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); if (handle != INVALID_HANDLE_VALUE) { MODULEENTRY32W me32 = {}; diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 134fd611..054397ed 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -120,7 +120,7 @@ class DirectInput std::vector currentState; }; -RC_Pointer __stdcall InitializeInput() +RC_Pointer RC_CallConv InitializeInput() { auto input = new DirectInput(); if (!input->Initialize()) @@ -132,12 +132,12 @@ RC_Pointer __stdcall InitializeInput() return static_cast(input); } -bool __stdcall GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) +bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) { return static_cast(handle)->ReadKeyboardState(keys, count); } -void __stdcall ReleaseInput(RC_Pointer handle) +void RC_CallConv ReleaseInput(RC_Pointer handle) { delete static_cast(handle); } diff --git a/NativeCore/Windows/IsProcessValid.cpp b/NativeCore/Windows/IsProcessValid.cpp index b3612ed9..fccf22cb 100644 --- a/NativeCore/Windows/IsProcessValid.cpp +++ b/NativeCore/Windows/IsProcessValid.cpp @@ -2,14 +2,14 @@ #include "NativeCore.hpp" -bool __stdcall IsProcessValid(RC_Pointer handle) +bool RC_CallConv IsProcessValid(RC_Pointer handle) { if (!handle || handle == INVALID_HANDLE_VALUE) { return false; } - auto retn = WaitForSingleObject(handle, 0); + const auto retn = WaitForSingleObject(handle, 0); if (retn == WAIT_FAILED) { return false; diff --git a/NativeCore/Windows/NativeCore.hpp b/NativeCore/Windows/NativeCore.hpp index e088eae7..db0fa692 100644 --- a/NativeCore/Windows/NativeCore.hpp +++ b/NativeCore/Windows/NativeCore.hpp @@ -3,24 +3,24 @@ #include "../ReClassNET_Plugin.hpp" #include "../Shared/Keys.hpp" -void __stdcall EnumerateProcesses(EnumerateProcessCallback callbackProcess); -void __stdcall EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); +void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess); +void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); -RC_Pointer __stdcall OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); -bool __stdcall IsProcessValid(RC_Pointer handle); -void __stdcall CloseRemoteProcess(RC_Pointer handle); +RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); +bool RC_CallConv IsProcessValid(RC_Pointer handle); +void RC_CallConv CloseRemoteProcess(RC_Pointer handle); -bool __stdcall ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); -bool __stdcall WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); +bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); +bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); -void __stdcall ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); +void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); -bool __stdcall AttachDebuggerToProcess(RC_Pointer id); -void __stdcall DetachDebuggerFromProcess(RC_Pointer id); -bool __stdcall AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); -void __stdcall HandleDebugEvent(DebugEvent* evt); -bool __stdcall SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); +bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id); +void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id); +bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); +void RC_CallConv HandleDebugEvent(DebugEvent* evt); +bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); -RC_Pointer __stdcall InitializeInput(); -bool __stdcall GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); -void __stdcall ReleaseInput(RC_Pointer handle); \ No newline at end of file +RC_Pointer RC_CallConv InitializeInput(); +bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); +void RC_CallConv ReleaseInput(RC_Pointer handle); \ No newline at end of file diff --git a/NativeCore/Windows/OpenRemoteProcess.cpp b/NativeCore/Windows/OpenRemoteProcess.cpp index 0043c4d3..d8944dd3 100644 --- a/NativeCore/Windows/OpenRemoteProcess.cpp +++ b/NativeCore/Windows/OpenRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -RC_Pointer __stdcall OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) +RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) { DWORD access = STANDARD_RIGHTS_REQUIRED | PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | SYNCHRONIZE; switch (desiredAccess) diff --git a/NativeCore/Windows/ReadRemoteMemory.cpp b/NativeCore/Windows/ReadRemoteMemory.cpp index 3a2e3490..a29b8ae2 100644 --- a/NativeCore/Windows/ReadRemoteMemory.cpp +++ b/NativeCore/Windows/ReadRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -bool __stdcall ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); diff --git a/NativeCore/Windows/WriteRemoteMemory.cpp b/NativeCore/Windows/WriteRemoteMemory.cpp index 101be1ac..e0dac2df 100644 --- a/NativeCore/Windows/WriteRemoteMemory.cpp +++ b/NativeCore/Windows/WriteRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -bool __stdcall WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); From a8b98d2e6c39c89f1b827cb2096675d79b5f238b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 23:26:49 +0100 Subject: [PATCH 218/777] Removed test file. --- NativeCore/Unix/main.cpp | 403 --------------------------------------- 1 file changed, 403 deletions(-) delete mode 100644 NativeCore/Unix/main.cpp diff --git a/NativeCore/Unix/main.cpp b/NativeCore/Unix/main.cpp deleted file mode 100644 index c99a5f9e..00000000 --- a/NativeCore/Unix/main.cpp +++ /dev/null @@ -1,403 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -bool is_number(const std::string& s) -{ - std::string::const_iterator it = s.begin(); - while (it != s.end() && std::isdigit(*it)) ++it; - return !s.empty() && it == s.end(); -} - -using RC_Pointer = void*; - -extern "C" RC_Pointer OpenRemoteProcess(RC_Pointer id, int desiredAccess) -{ - return id; -} - -extern "C" bool IsProcessValid(RC_Pointer handle) -{ - return kill((pid_t)(intptr_t)handle, 0) == 0; -} - -extern "C" bool ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) -{ - iovec local[1]; - iovec remote[1]; - - local[0].iov_base = ((uint8_t*)buffer + offset); - local[0].iov_len = size; - remote[0].iov_base = address; - remote[0].iov_len = size; - - if (process_vm_readv((pid_t)(intptr_t)handle, local, 1, remote, 1, 0) != size) - { - return false; - } - - return true; -} - -extern "C" bool WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) -{ - iovec local[1]; - iovec remote[1]; - - local[0].iov_base = ((uint8_t*)buffer + offset); - local[0].iov_len = size; - remote[0].iov_base = address; - remote[0].iov_len = size; - - if (process_vm_writev((pid_t)(intptr_t)handle, local, 1, remote, 1, 0) != size) - { - return false; - } - - return true; -} - -struct map_iterator -{ - off_t offset; - int fd; - size_t buf_size; - char *buf; - char *buf_end; - char *path; -}; - -static inline char* ltoa(char *buf, long val) -{ - char *cp = buf, tmp; - ssize_t i, len; - - do - { - *cp++ = '0' + (val % 10); - val /= 10; - } while (val); - - /* reverse the order of the digits: */ - len = cp - buf; - --cp; - for (i = 0; i < len / 2; ++i) - { - tmp = buf[i]; - buf[i] = cp[-i]; - cp[-i] = tmp; - } - return buf + len; -} - -static inline int maps_init(struct map_iterator *mi, pid_t pid) -{ - char path[sizeof("/proc/0123456789/maps")], *cp; - - memcpy(path, "/proc/", 6); - cp = ltoa(path + 6, pid); - memcpy(cp, "/maps", 6); - - std::stringstream ss; - ss << "/proc/" << pid << "/maps"; - - mi->fd = open(ss.str().c_str(), O_RDONLY); - if (mi->fd >= 0) - { - mi->buf_size = getpagesize(); - cp = (char*)mmap(nullptr, mi->buf_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (cp == MAP_FAILED) - { - close(mi->fd); - mi->fd = -1; - return -1; - } - else - { - mi->offset = 0; - mi->buf = mi->buf_end = cp + mi->buf_size; - return 0; - } - } - return -1; -} - -static inline char* skip_whitespace(char *cp) -{ - if (!cp) - return NULL; - - while (*cp == ' ' || *cp == '\t') - ++cp; - return cp; -} - -static inline char* scan_hex(char *cp, unsigned long *valp) -{ - unsigned long num_digits = 0, digit, val = 0; - - cp = skip_whitespace(cp); - if (!cp) - return NULL; - - while (1) - { - digit = *cp; - if ((digit - '0') <= 9) - digit -= '0'; - else if ((digit - 'a') < 6) - digit -= 'a' - 10; - else if ((digit - 'A') < 6) - digit -= 'A' - 10; - else - break; - val = (val << 4) | digit; - ++num_digits; - ++cp; - } - if (!num_digits) - return NULL; - *valp = val; - return cp; -} - -static inline char* scan_dec(char *cp, unsigned long *valp) -{ - unsigned long num_digits = 0, digit, val = 0; - - if (!(cp = skip_whitespace(cp))) - return NULL; - - while (1) - { - digit = *cp; - if ((digit - '0') <= 9) - { - digit -= '0'; - ++cp; - } - else - break; - val = (10 * val) + digit; - ++num_digits; - } - if (!num_digits) - return NULL; - *valp = val; - return cp; -} - -static inline char* scan_char(char *cp, char *valp) -{ - if (!cp) - return NULL; - - *valp = *cp; - - /* don't step over NUL terminator */ - if (*cp) - ++cp; - return cp; -} - -static inline char* scan_string(char *cp, char *valp, size_t buf_size) -{ - size_t i = 0; - - if (!(cp = skip_whitespace(cp))) - return NULL; - - while (*cp != ' ' && *cp != '\t' && *cp != '\0') - { - if ((valp != NULL) && (i < buf_size - 1)) - valp[i++] = *cp; - ++cp; - } - if (i == 0 || i >= buf_size) - return NULL; - valp[i] = '\0'; - return cp; -} - -static inline int maps_next(struct map_iterator *mi, unsigned long *low, unsigned long *high, unsigned long *offset) -{ - char perm[16], dash = 0, colon = 0, *cp; - unsigned long major, minor, inum; - ssize_t i, nread; - - if (mi->fd < 0) - return 0; - - while (true) - { - ssize_t bytes_left = mi->buf_end - mi->buf; - char *eol = NULL; - - for (i = 0; i < bytes_left; ++i) - { - if (mi->buf[i] == '\n') - { - eol = mi->buf + i; - break; - } - else if (mi->buf[i] == '\0') - break; - } - if (!eol) - { - /* copy down the remaining bytes, if any */ - if (bytes_left > 0) - memmove(mi->buf_end - mi->buf_size, mi->buf, bytes_left); - - mi->buf = mi->buf_end - mi->buf_size; - nread = read(mi->fd, mi->buf + bytes_left, - mi->buf_size - bytes_left); - if (nread <= 0) - return 0; - else if ((size_t)(nread + bytes_left) < mi->buf_size) - { - /* Move contents to the end of the buffer so we - maintain the invariant that all bytes between - mi->buf and mi->buf_end are valid. */ - memmove(mi->buf_end - nread - bytes_left, mi->buf, - nread + bytes_left); - mi->buf = mi->buf_end - nread - bytes_left; - } - - eol = mi->buf + bytes_left + nread - 1; - - for (i = bytes_left; i < bytes_left + nread; ++i) - if (mi->buf[i] == '\n') - { - eol = mi->buf + i; - break; - } - } - cp = mi->buf; - mi->buf = eol + 1; - *eol = '\0'; - - /* scan: "LOW-HIGH PERM OFFSET MAJOR:MINOR INUM PATH" */ - cp = scan_hex(cp, low); - cp = scan_char(cp, &dash); - cp = scan_hex(cp, high); - cp = scan_string(cp, perm, sizeof(perm)); - cp = scan_hex(cp, offset); - cp = scan_hex(cp, &major); - cp = scan_char(cp, &colon); - cp = scan_hex(cp, &minor); - cp = scan_dec(cp, &inum); - cp = mi->path = skip_whitespace(cp); - if (!cp) - continue; - cp = scan_string(cp, NULL, 0); - if (dash != '-' || colon != ':') - continue; /* skip line with unknown or bad format */ - return 1; - } - return 0; -} - -static inline void maps_close(struct map_iterator *mi) -{ - if (mi->fd < 0) - return; - close(mi->fd); - mi->fd = -1; - if (mi->buf) - { - munmap(mi->buf_end - mi->buf_size, mi->buf_size); - mi->buf = mi->buf_end = NULL; - } -} - -using EnumerateRemoteSectionData = void; -using EnumerateRemoteModuleData = void; - -typedef void(EnumerateRemoteSectionsCallback)(EnumerateRemoteSectionData* data); -typedef void(EnumerateRemoteModulesCallback)(EnumerateRemoteModuleData* data); - -extern "C" void EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) -{ - if (callbackSection == nullptr && callbackModule == nullptr) - { - return; - } - - struct map_iterator mi; - unsigned long start, end, offset, flags; - struct map_info *map_list = NULL; - struct map_info *cur_map; - if (maps_init(&mi, (pid_t)(intptr_t)handle) < 0) - return; - while (maps_next(&mi, &start, &end, &offset, &flags)) - { - cur_map = (struct map_info *)malloc(sizeof(struct map_info)); - if (cur_map == NULL) - break; - cur_map->next = map_list; - cur_map->start = start; - cur_map->end = end; - cur_map->offset = offset; - cur_map->flags = flags; - cur_map->path = strdup(mi.path); - cur_map->ei.size = 0; - cur_map->ei.image = NULL; - map_list = cur_map; - } - maps_close(&mi); -} - -template -T parse_type(const std::string& s) -{ - std::stringstream ss(s); - - T val; - ss >> val; - return val; -} - -int main() -{ - using namespace boost::filesystem; - - path proc("/proc"); - - for (auto& p : directory_iterator(proc)) - { - if (is_directory(p)) - { - auto name = p.path().filename().string(); - if (is_number(name)) - { - size_t pid = parse_type(name); - - auto pa = p.path() / "exe"; - - if (is_symlink(symlink_status(pa))) - { - try - { - auto e = read_symlink(pa); - - std::cout << "(" << pid << ", " << e.string() << ")" << std::endl; - } - catch(...) - { - std::cout << "Exception: " << std::endl; - } - } - } - } - } - - return 0; -} From 5e4d6a16d5aa7dabc7e4afd8cbd4220d4285da74 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 20 Nov 2017 23:36:55 +0100 Subject: [PATCH 219/777] Use distorm. --- NativeCore/Unix/Makefile | 68 +++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index 736eb1ee..07aa1306 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -6,7 +6,7 @@ AR = ar LD = g++ WINDRES = windres -INC = -I../Dependencies/beaengine/include +INC = -I../Dependencies/distorm/include CFLAGS = -Wall -fPIC -D RECLASSNET64=1 RESINC = LIBDIR = @@ -35,9 +35,9 @@ OBJDIR_RELEASE = obj/release DEP_RELEASE = OUT_RELEASE = build/release/NativeCore.so -OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/BaeEngine.o +OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/DistormHelper.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/decoder.o $(OBJDIR_DEBUG)/distorm.o $(OBJDIR_DEBUG)/instructions.o $(OBJDIR_DEBUG)/insts.o $(OBJDIR_DEBUG)/mnemonics.o $(OBJDIR_DEBUG)/operands.o $(OBJDIR_DEBUG)/prefix.o $(OBJDIR_DEBUG)/textdefs.o $(OBJDIR_DEBUG)/wstring.o -OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/BaeEngine.o +OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/DistormHelper.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/decoder.o $(OBJDIR_RELEASE)/distorm.o $(OBJDIR_RELEASE)/instructions.o $(OBJDIR_RELEASE)/insts.o $(OBJDIR_RELEASE)/mnemonics.o $(OBJDIR_RELEASE)/operands.o $(OBJDIR_RELEASE)/prefix.o $(OBJDIR_RELEASE)/textdefs.o $(OBJDIR_RELEASE)/wstring.o all: debug release @@ -78,6 +78,9 @@ $(OBJDIR_DEBUG)/EnumerateProcesses.o: EnumerateProcesses.cpp $(OBJDIR_DEBUG)/DisassembleCode.o: DisassembleCode.cpp $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c DisassembleCode.cpp -o $(OBJDIR_DEBUG)/DisassembleCode.o +$(OBJDIR_DEBUG)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Shared/DistormHelper.cpp -o $(OBJDIR_DEBUG)/DistormHelper.o + $(OBJDIR_DEBUG)/Debugger.o: Debugger.cpp $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c Debugger.cpp -o $(OBJDIR_DEBUG)/Debugger.o @@ -87,8 +90,32 @@ $(OBJDIR_DEBUG)/ControlRemoteProcess.o: ControlRemoteProcess.cpp $(OBJDIR_DEBUG)/CloseRemoteProcess.o: CloseRemoteProcess.cpp $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c CloseRemoteProcess.cpp -o $(OBJDIR_DEBUG)/CloseRemoteProcess.o -$(OBJDIR_DEBUG)/BaeEngine.o: ../Dependencies/beaengine/src/BeaEngine.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/beaengine/src/BeaEngine.c -o $(OBJDIR_DEBUG)/BaeEngine.o +$(OBJDIR_DEBUG)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR_DEBUG)/decoder.o + +$(OBJDIR_DEBUG)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR_DEBUG)/distorm.o + +$(OBJDIR_DEBUG)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR_DEBUG)/instructions.o + +$(OBJDIR_DEBUG)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR_DEBUG)/insts.o + +$(OBJDIR_DEBUG)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR_DEBUG)/mnemonics.o + +$(OBJDIR_DEBUG)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR_DEBUG)/operands.o + +$(OBJDIR_DEBUG)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR_DEBUG)/prefix.o + +$(OBJDIR_DEBUG)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_DEBUG)/textdefs.o + +$(OBJDIR_DEBUG)/wstring.o: ../Dependencies/distorm/src/wstring.c + $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/wstring.c -o $(OBJDIR_DEBUG)/wstring.o clean_debug: rm -f $(OBJ_DEBUG) $(OUT_DEBUG) @@ -130,6 +157,9 @@ $(OBJDIR_RELEASE)/EnumerateProcesses.o: EnumerateProcesses.cpp $(OBJDIR_RELEASE)/DisassembleCode.o: DisassembleCode.cpp $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c DisassembleCode.cpp -o $(OBJDIR_RELEASE)/DisassembleCode.o +$(OBJDIR_RELEASE)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Shared/DistormHelper.cpp -o $(OBJDIR_RELEASE)/DistormHelper.o + $(OBJDIR_RELEASE)/Debugger.o: Debugger.cpp $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c Debugger.cpp -o $(OBJDIR_RELEASE)/Debugger.o @@ -139,8 +169,32 @@ $(OBJDIR_RELEASE)/ControlRemoteProcess.o: ControlRemoteProcess.cpp $(OBJDIR_RELEASE)/CloseRemoteProcess.o: CloseRemoteProcess.cpp $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c CloseRemoteProcess.cpp -o $(OBJDIR_RELEASE)/CloseRemoteProcess.o -$(OBJDIR_RELEASE)/BaeEngine.o: ../Dependencies/beaengine/src/BeaEngine.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/beaengine/src/BeaEngine.c -o $(OBJDIR_RELEASE)/BaeEngine.o +$(OBJDIR_RELEASE)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR_RELEASE)/decoder.o + +$(OBJDIR_RELEASE)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR_RELEASE)/distorm.o + +$(OBJDIR_RELEASE)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR_RELEASE)/instructions.o + +$(OBJDIR_RELEASE)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR_RELEASE)/insts.o + +$(OBJDIR_RELEASE)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR_RELEASE)/mnemonics.o + +$(OBJDIR_RELEASE)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR_RELEASE)/operands.o + +$(OBJDIR_RELEASE)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR_RELEASE)/prefix.o + +$(OBJDIR_RELEASE)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_RELEASE)/textdefs.o + +$(OBJDIR_RELEASE)/wstring.o: ../Dependencies/distorm/src/wstring.c + $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/wstring.c -o $(OBJDIR_RELEASE)/wstring.o clean_release: rm -f $(OBJ_RELEASE) $(OUT_RELEASE) From 2594641abd9bd8b5e2e81413694bb39c9d60a77b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 21 Nov 2017 18:48:56 +0100 Subject: [PATCH 220/777] Fixed callback declaration. --- NativeCore/ReClassNET_Plugin.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 5440cbc1..4f307ec0 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -261,10 +261,10 @@ struct DebugRegister7 #pragma pack(pop) -typedef void(__stdcall *EnumerateProcessCallback)(EnumerateProcessData* data); +typedef void(RC_CallConv EnumerateProcessCallback)(EnumerateProcessData* data); -typedef void(__stdcall EnumerateRemoteSectionsCallback)(EnumerateRemoteSectionData* data); -typedef void(__stdcall EnumerateRemoteModulesCallback)(EnumerateRemoteModuleData* data); +typedef void(RC_CallConv EnumerateRemoteSectionsCallback)(EnumerateRemoteSectionData* data); +typedef void(RC_CallConv EnumerateRemoteModulesCallback)(EnumerateRemoteModuleData* data); // Helpers From a71a2c2141dc9f29ac46a4c18f965cedd68a32a2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 21 Nov 2017 19:05:33 +0100 Subject: [PATCH 221/777] Use extern "C" instead of exports.def. --- NativeCore/Windows/CloseRemoteProcess.cpp | 2 +- NativeCore/Windows/ControlRemoteProcess.cpp | 2 +- NativeCore/Windows/Debugger.cpp | 10 +++--- NativeCore/Windows/DisassembleCode.cpp | 2 +- NativeCore/Windows/EnumerateProcesses.cpp | 2 +- .../EnumerateRemoteSectionsAndModules.cpp | 14 ++++---- NativeCore/Windows/Input.cpp | 6 ++-- NativeCore/Windows/IsProcessValid.cpp | 2 +- NativeCore/Windows/NativeCore.hpp | 35 ++++++++++--------- NativeCore/Windows/NativeCore.vcxproj | 3 -- NativeCore/Windows/NativeCore.vcxproj.filters | 3 -- NativeCore/Windows/OpenRemoteProcess.cpp | 2 +- NativeCore/Windows/ReadRemoteMemory.cpp | 2 +- NativeCore/Windows/WriteRemoteMemory.cpp | 2 +- NativeCore/Windows/exports.def | 19 ---------- 15 files changed, 43 insertions(+), 63 deletions(-) delete mode 100644 NativeCore/Windows/exports.def diff --git a/NativeCore/Windows/CloseRemoteProcess.cpp b/NativeCore/Windows/CloseRemoteProcess.cpp index 7cdb91cd..990c48c7 100644 --- a/NativeCore/Windows/CloseRemoteProcess.cpp +++ b/NativeCore/Windows/CloseRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -void RC_CallConv CloseRemoteProcess(RC_Pointer handle) +extern "C" void RC_CallConv CloseRemoteProcess(RC_Pointer handle) { CloseHandle(handle); } diff --git a/NativeCore/Windows/ControlRemoteProcess.cpp b/NativeCore/Windows/ControlRemoteProcess.cpp index 82dee2a0..3473ae7f 100644 --- a/NativeCore/Windows/ControlRemoteProcess.cpp +++ b/NativeCore/Windows/ControlRemoteProcess.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) +extern "C" void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) { if (action == ControlRemoteProcessAction::Suspend || action == ControlRemoteProcessAction::Resume) { diff --git a/NativeCore/Windows/Debugger.cpp b/NativeCore/Windows/Debugger.cpp index ba1505c6..c85db972 100644 --- a/NativeCore/Windows/Debugger.cpp +++ b/NativeCore/Windows/Debugger.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) +extern "C" bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) { if (!DebugActiveProcess(static_cast(reinterpret_cast(id)))) { @@ -15,12 +15,12 @@ bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) return true; } -void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) +extern "C" void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) { DebugActiveProcessStop(static_cast(reinterpret_cast(id))); } -bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) +extern "C" bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) { DEBUG_EVENT _evt = { }; if (!WaitForDebugEvent(&_evt, timeoutInMilliseconds)) @@ -127,7 +127,7 @@ bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) return result; } -void RC_CallConv HandleDebugEvent(DebugEvent* evt) +extern "C" void RC_CallConv HandleDebugEvent(DebugEvent* evt) { DWORD continueStatus = 0; switch (evt->ContinueStatus) @@ -143,7 +143,7 @@ void RC_CallConv HandleDebugEvent(DebugEvent* evt) ContinueDebugEvent(static_cast(reinterpret_cast(evt->ProcessId)), static_cast(reinterpret_cast(evt->ThreadId)), continueStatus); } -bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) +extern "C" bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) { if (reg == HardwareBreakpointRegister::InvalidRegister) { diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index c65633e1..ea4c85de 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +extern "C" bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index 4732976e..dfa57726 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -44,7 +44,7 @@ Platform GetProcessPlatform(HANDLE process) return Platform::Unknown; } -void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) +extern "C" void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) { if (callbackProcess == nullptr) { diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 54a0c9ba..06fda500 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -5,7 +5,12 @@ #include "NativeCore.hpp" -void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) +bool CompareAddress(const EnumerateRemoteSectionData& lhs, const LPVOID& rhs) +{ + return lhs.BaseAddress < rhs; +} + +extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) { if (callbackSection == nullptr && callbackModule == nullptr) { @@ -76,10 +81,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate if (callbackSection != nullptr) { - auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(me32.modBaseAddr), [§ions](const auto& lhs, const LPVOID& rhs) - { - return lhs.BaseAddress < rhs; - }); + const auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(me32.modBaseAddr), CompareAddress); IMAGE_DOS_HEADER DosHdr = {}; IMAGE_NT_HEADERS NtHdr = {}; @@ -93,7 +95,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate { auto&& sectionHeader = sectionHeaders[i]; - auto sectionAddress = reinterpret_cast(me32.modBaseAddr) + sectionHeader.VirtualAddress; + const auto sectionAddress = reinterpret_cast(me32.modBaseAddr) + sectionHeader.VirtualAddress; for (auto j = it; j != std::end(sections); ++j) { if (sectionAddress >= reinterpret_cast(j->BaseAddress) && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size)) diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 054397ed..25de3109 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -120,7 +120,7 @@ class DirectInput std::vector currentState; }; -RC_Pointer RC_CallConv InitializeInput() +extern "C" RC_Pointer RC_CallConv InitializeInput() { auto input = new DirectInput(); if (!input->Initialize()) @@ -132,12 +132,12 @@ RC_Pointer RC_CallConv InitializeInput() return static_cast(input); } -bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) +extern "C" bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) { return static_cast(handle)->ReadKeyboardState(keys, count); } -void RC_CallConv ReleaseInput(RC_Pointer handle) +extern "C" void RC_CallConv ReleaseInput(RC_Pointer handle) { delete static_cast(handle); } diff --git a/NativeCore/Windows/IsProcessValid.cpp b/NativeCore/Windows/IsProcessValid.cpp index fccf22cb..0e4036c1 100644 --- a/NativeCore/Windows/IsProcessValid.cpp +++ b/NativeCore/Windows/IsProcessValid.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -bool RC_CallConv IsProcessValid(RC_Pointer handle) +extern "C" bool RC_CallConv IsProcessValid(RC_Pointer handle) { if (!handle || handle == INVALID_HANDLE_VALUE) { diff --git a/NativeCore/Windows/NativeCore.hpp b/NativeCore/Windows/NativeCore.hpp index db0fa692..2d1f2eed 100644 --- a/NativeCore/Windows/NativeCore.hpp +++ b/NativeCore/Windows/NativeCore.hpp @@ -3,24 +3,27 @@ #include "../ReClassNET_Plugin.hpp" #include "../Shared/Keys.hpp" -void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess); -void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); +extern "C" +{ + void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess); + void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); -RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); -bool RC_CallConv IsProcessValid(RC_Pointer handle); -void RC_CallConv CloseRemoteProcess(RC_Pointer handle); + RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); + bool RC_CallConv IsProcessValid(RC_Pointer handle); + void RC_CallConv CloseRemoteProcess(RC_Pointer handle); -bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); -bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); + bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); + bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); -void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); + void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); -bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id); -void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id); -bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); -void RC_CallConv HandleDebugEvent(DebugEvent* evt); -bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); + bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id); + void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id); + bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); + void RC_CallConv HandleDebugEvent(DebugEvent* evt); + bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); -RC_Pointer RC_CallConv InitializeInput(); -bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); -void RC_CallConv ReleaseInput(RC_Pointer handle); \ No newline at end of file + RC_Pointer RC_CallConv InitializeInput(); + bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); + void RC_CallConv ReleaseInput(RC_Pointer handle); +} \ No newline at end of file diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index fea54b2e..072bd0a0 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -188,9 +188,6 @@ - - - diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index a7d8862a..5db30830 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -65,9 +65,6 @@ Shared - - - {9285bf7e-f1bc-42eb-b760-942eeefb0133} diff --git a/NativeCore/Windows/OpenRemoteProcess.cpp b/NativeCore/Windows/OpenRemoteProcess.cpp index d8944dd3..0f2b833c 100644 --- a/NativeCore/Windows/OpenRemoteProcess.cpp +++ b/NativeCore/Windows/OpenRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) +extern "C" RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) { DWORD access = STANDARD_RIGHTS_REQUIRED | PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | SYNCHRONIZE; switch (desiredAccess) diff --git a/NativeCore/Windows/ReadRemoteMemory.cpp b/NativeCore/Windows/ReadRemoteMemory.cpp index a29b8ae2..cf923275 100644 --- a/NativeCore/Windows/ReadRemoteMemory.cpp +++ b/NativeCore/Windows/ReadRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +extern "C" bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); diff --git a/NativeCore/Windows/WriteRemoteMemory.cpp b/NativeCore/Windows/WriteRemoteMemory.cpp index e0dac2df..f046f43f 100644 --- a/NativeCore/Windows/WriteRemoteMemory.cpp +++ b/NativeCore/Windows/WriteRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +extern "C" bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); diff --git a/NativeCore/Windows/exports.def b/NativeCore/Windows/exports.def deleted file mode 100644 index 0d5093cb..00000000 --- a/NativeCore/Windows/exports.def +++ /dev/null @@ -1,19 +0,0 @@ -LIBRARY -EXPORTS - IsProcessValid - OpenRemoteProcess - CloseRemoteProcess - ReadRemoteMemory - WriteRemoteMemory - EnumerateProcesses - EnumerateRemoteSectionsAndModules - DisassembleCode - ControlRemoteProcess - AttachDebuggerToProcess - DetachDebuggerFromProcess - AwaitDebugEvent - HandleDebugEvent - SetHardwareBreakpoint - InitializeInput - GetPressedKeys - ReleaseInput From 141ebe2f2f9155c416ea786598f9a62364331249 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 21 Nov 2017 19:10:19 +0100 Subject: [PATCH 222/777] Remove linker setting. --- NativeCore/Windows/NativeCore.vcxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 072bd0a0..1491c91b 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -108,7 +108,6 @@ Windows true - exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -123,7 +122,6 @@ Windows true - exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -142,7 +140,6 @@ true true true - exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -161,7 +158,6 @@ true true true - exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) From 717ca09b41933142425cbdf9cf025c9ac33cefba Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 21 Nov 2017 22:32:36 +0100 Subject: [PATCH 223/777] Revert last commit. --- NativeCore/Windows/CloseRemoteProcess.cpp | 2 +- NativeCore/Windows/ControlRemoteProcess.cpp | 2 +- NativeCore/Windows/Debugger.cpp | 10 +++--- NativeCore/Windows/DisassembleCode.cpp | 2 +- NativeCore/Windows/EnumerateProcesses.cpp | 2 +- .../EnumerateRemoteSectionsAndModules.cpp | 12 +++---- NativeCore/Windows/Input.cpp | 6 ++-- NativeCore/Windows/IsProcessValid.cpp | 2 +- NativeCore/Windows/NativeCore.hpp | 35 +++++++++---------- NativeCore/Windows/NativeCore.vcxproj | 7 ++++ NativeCore/Windows/NativeCore.vcxproj.filters | 3 ++ NativeCore/Windows/OpenRemoteProcess.cpp | 2 +- NativeCore/Windows/ReadRemoteMemory.cpp | 2 +- NativeCore/Windows/WriteRemoteMemory.cpp | 2 +- NativeCore/Windows/exports.def | 19 ++++++++++ 15 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 NativeCore/Windows/exports.def diff --git a/NativeCore/Windows/CloseRemoteProcess.cpp b/NativeCore/Windows/CloseRemoteProcess.cpp index 990c48c7..7cdb91cd 100644 --- a/NativeCore/Windows/CloseRemoteProcess.cpp +++ b/NativeCore/Windows/CloseRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" void RC_CallConv CloseRemoteProcess(RC_Pointer handle) +void RC_CallConv CloseRemoteProcess(RC_Pointer handle) { CloseHandle(handle); } diff --git a/NativeCore/Windows/ControlRemoteProcess.cpp b/NativeCore/Windows/ControlRemoteProcess.cpp index 3473ae7f..82dee2a0 100644 --- a/NativeCore/Windows/ControlRemoteProcess.cpp +++ b/NativeCore/Windows/ControlRemoteProcess.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -extern "C" void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) +void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action) { if (action == ControlRemoteProcessAction::Suspend || action == ControlRemoteProcessAction::Resume) { diff --git a/NativeCore/Windows/Debugger.cpp b/NativeCore/Windows/Debugger.cpp index c85db972..ba1505c6 100644 --- a/NativeCore/Windows/Debugger.cpp +++ b/NativeCore/Windows/Debugger.cpp @@ -3,7 +3,7 @@ #include "NativeCore.hpp" -extern "C" bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) +bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) { if (!DebugActiveProcess(static_cast(reinterpret_cast(id)))) { @@ -15,12 +15,12 @@ extern "C" bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id) return true; } -extern "C" void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) +void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id) { DebugActiveProcessStop(static_cast(reinterpret_cast(id))); } -extern "C" bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) +bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds) { DEBUG_EVENT _evt = { }; if (!WaitForDebugEvent(&_evt, timeoutInMilliseconds)) @@ -127,7 +127,7 @@ extern "C" bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMillis return result; } -extern "C" void RC_CallConv HandleDebugEvent(DebugEvent* evt) +void RC_CallConv HandleDebugEvent(DebugEvent* evt) { DWORD continueStatus = 0; switch (evt->ContinueStatus) @@ -143,7 +143,7 @@ extern "C" void RC_CallConv HandleDebugEvent(DebugEvent* evt) ContinueDebugEvent(static_cast(reinterpret_cast(evt->ProcessId)), static_cast(reinterpret_cast(evt->ThreadId)), continueStatus); } -extern "C" bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) +bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set) { if (reg == HardwareBreakpointRegister::InvalidRegister) { diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index ea4c85de..c65633e1 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -extern "C" bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) { return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index dfa57726..4732976e 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -44,7 +44,7 @@ Platform GetProcessPlatform(HANDLE process) return Platform::Unknown; } -extern "C" void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) +void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) { if (callbackProcess == nullptr) { diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 06fda500..789d6363 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -5,12 +5,7 @@ #include "NativeCore.hpp" -bool CompareAddress(const EnumerateRemoteSectionData& lhs, const LPVOID& rhs) -{ - return lhs.BaseAddress < rhs; -} - -extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) +void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) { if (callbackSection == nullptr && callbackModule == nullptr) { @@ -81,7 +76,10 @@ extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process if (callbackSection != nullptr) { - const auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(me32.modBaseAddr), CompareAddress); + auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(me32.modBaseAddr), [§ions](const auto& lhs, const LPVOID& rhs) + { + return lhs.BaseAddress < rhs; + }); IMAGE_DOS_HEADER DosHdr = {}; IMAGE_NT_HEADERS NtHdr = {}; diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 25de3109..054397ed 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -120,7 +120,7 @@ class DirectInput std::vector currentState; }; -extern "C" RC_Pointer RC_CallConv InitializeInput() +RC_Pointer RC_CallConv InitializeInput() { auto input = new DirectInput(); if (!input->Initialize()) @@ -132,12 +132,12 @@ extern "C" RC_Pointer RC_CallConv InitializeInput() return static_cast(input); } -extern "C" bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) +bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* keys[], int* count) { return static_cast(handle)->ReadKeyboardState(keys, count); } -extern "C" void RC_CallConv ReleaseInput(RC_Pointer handle) +void RC_CallConv ReleaseInput(RC_Pointer handle) { delete static_cast(handle); } diff --git a/NativeCore/Windows/IsProcessValid.cpp b/NativeCore/Windows/IsProcessValid.cpp index 0e4036c1..fccf22cb 100644 --- a/NativeCore/Windows/IsProcessValid.cpp +++ b/NativeCore/Windows/IsProcessValid.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" bool RC_CallConv IsProcessValid(RC_Pointer handle) +bool RC_CallConv IsProcessValid(RC_Pointer handle) { if (!handle || handle == INVALID_HANDLE_VALUE) { diff --git a/NativeCore/Windows/NativeCore.hpp b/NativeCore/Windows/NativeCore.hpp index 2d1f2eed..db0fa692 100644 --- a/NativeCore/Windows/NativeCore.hpp +++ b/NativeCore/Windows/NativeCore.hpp @@ -3,27 +3,24 @@ #include "../ReClassNET_Plugin.hpp" #include "../Shared/Keys.hpp" -extern "C" -{ - void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess); - void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); +void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess); +void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule); - RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); - bool RC_CallConv IsProcessValid(RC_Pointer handle); - void RC_CallConv CloseRemoteProcess(RC_Pointer handle); +RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess); +bool RC_CallConv IsProcessValid(RC_Pointer handle); +void RC_CallConv CloseRemoteProcess(RC_Pointer handle); - bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); - bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); +bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); +bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size); - void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); +void RC_CallConv ControlRemoteProcess(RC_Pointer handle, ControlRemoteProcessAction action); - bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id); - void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id); - bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); - void RC_CallConv HandleDebugEvent(DebugEvent* evt); - bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); +bool RC_CallConv AttachDebuggerToProcess(RC_Pointer id); +void RC_CallConv DetachDebuggerFromProcess(RC_Pointer id); +bool RC_CallConv AwaitDebugEvent(DebugEvent* evt, int timeoutInMilliseconds); +void RC_CallConv HandleDebugEvent(DebugEvent* evt); +bool RC_CallConv SetHardwareBreakpoint(RC_Pointer id, RC_Pointer address, HardwareBreakpointRegister reg, HardwareBreakpointTrigger type, HardwareBreakpointSize size, bool set); - RC_Pointer RC_CallConv InitializeInput(); - bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); - void RC_CallConv ReleaseInput(RC_Pointer handle); -} \ No newline at end of file +RC_Pointer RC_CallConv InitializeInput(); +bool RC_CallConv GetPressedKeys(RC_Pointer handle, Keys* state[], int* count); +void RC_CallConv ReleaseInput(RC_Pointer handle); \ No newline at end of file diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 1491c91b..fea54b2e 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -108,6 +108,7 @@ Windows true + exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -122,6 +123,7 @@ Windows true + exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -140,6 +142,7 @@ true true true + exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -158,6 +161,7 @@ true true true + exports.def dinput8.lib;dxguid.lib;%(AdditionalDependencies) @@ -184,6 +188,9 @@ + + + diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index 5db30830..a7d8862a 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -65,6 +65,9 @@ Shared + + + {9285bf7e-f1bc-42eb-b760-942eeefb0133} diff --git a/NativeCore/Windows/OpenRemoteProcess.cpp b/NativeCore/Windows/OpenRemoteProcess.cpp index 0f2b833c..d8944dd3 100644 --- a/NativeCore/Windows/OpenRemoteProcess.cpp +++ b/NativeCore/Windows/OpenRemoteProcess.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) +RC_Pointer RC_CallConv OpenRemoteProcess(RC_Pointer id, ProcessAccess desiredAccess) { DWORD access = STANDARD_RIGHTS_REQUIRED | PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | SYNCHRONIZE; switch (desiredAccess) diff --git a/NativeCore/Windows/ReadRemoteMemory.cpp b/NativeCore/Windows/ReadRemoteMemory.cpp index cf923275..a29b8ae2 100644 --- a/NativeCore/Windows/ReadRemoteMemory.cpp +++ b/NativeCore/Windows/ReadRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +bool RC_CallConv ReadRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); diff --git a/NativeCore/Windows/WriteRemoteMemory.cpp b/NativeCore/Windows/WriteRemoteMemory.cpp index f046f43f..e0dac2df 100644 --- a/NativeCore/Windows/WriteRemoteMemory.cpp +++ b/NativeCore/Windows/WriteRemoteMemory.cpp @@ -2,7 +2,7 @@ #include "NativeCore.hpp" -extern "C" bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) +bool RC_CallConv WriteRemoteMemory(RC_Pointer handle, RC_Pointer address, RC_Pointer buffer, int offset, int size) { buffer = reinterpret_cast(reinterpret_cast(buffer) + offset); diff --git a/NativeCore/Windows/exports.def b/NativeCore/Windows/exports.def new file mode 100644 index 00000000..0d5093cb --- /dev/null +++ b/NativeCore/Windows/exports.def @@ -0,0 +1,19 @@ +LIBRARY +EXPORTS + IsProcessValid + OpenRemoteProcess + CloseRemoteProcess + ReadRemoteMemory + WriteRemoteMemory + EnumerateProcesses + EnumerateRemoteSectionsAndModules + DisassembleCode + ControlRemoteProcess + AttachDebuggerToProcess + DetachDebuggerFromProcess + AwaitDebugEvent + HandleDebugEvent + SetHardwareBreakpoint + InitializeInput + GetPressedKeys + ReleaseInput From ecb94b288a145871a7826a670f6ab12545683d26 Mon Sep 17 00:00:00 2001 From: patrick Date: Wed, 22 Nov 2017 03:19:49 +0100 Subject: [PATCH 224/777] fixed distorm compilation on linux --- NativeCore/Shared/DistormHelper.cpp | 1 + NativeCore/Unix/Makefile | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index dac98d67..548e0604 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -1,6 +1,7 @@ #include "DistormHelper.hpp" #include +#include extern "C" { #include <../src/instructions.h> diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index 07aa1306..c39f6e3e 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -1,13 +1,13 @@ WORKDIR = `pwd` CC = gcc -CXX = g++ +CXX = gcc AR = ar LD = g++ WINDRES = windres INC = -I../Dependencies/distorm/include -CFLAGS = -Wall -fPIC -D RECLASSNET64=1 +CFLAGS = -Wall -fPIC -fpermissive -DRECLASSNET64=1 RESINC = LIBDIR = LIB = -lstdc++fs From 45261e39cc7d6db1ac1a6fb7c1d2a663e77b38ce Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 23 Nov 2017 00:40:34 +0100 Subject: [PATCH 225/777] xbuild is deprecated, use msbuild instead --- ReClass.NET/Makefile | 12 ++++++------ ReClass.NET_Launcher/Makefile | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ReClass.NET/Makefile b/ReClass.NET/Makefile index 5d60e616..52bcae5b 100644 --- a/ReClass.NET/Makefile +++ b/ReClass.NET/Makefile @@ -3,18 +3,18 @@ all: debug release clean: clean_debug clean_release debug: - xbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj - xbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj + msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj + msbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj clean_debug: - xbuild /t:Clean ReClass.NET.csproj + msbuild /t:Clean ReClass.NET.csproj release: - xbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj - xbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj + msbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj + msbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj clean_release: - xbuild /t:Clean ReClass.NET.csproj + msbuild /t:Clean ReClass.NET.csproj update: mono --runtime=v4.0 ../Dependencies/nuget.exe restore ReClass.NET.csproj -SolutionDirectory ../ diff --git a/ReClass.NET_Launcher/Makefile b/ReClass.NET_Launcher/Makefile index bc0a358e..eb8e3c4d 100644 --- a/ReClass.NET_Launcher/Makefile +++ b/ReClass.NET_Launcher/Makefile @@ -3,13 +3,13 @@ all: debug release clean: clean_debug clean_release debug: - xbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj + msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj clean_debug: - xbuild /t:Clean ReClass.NET_Launcher.csproj + msbuild /t:Clean ReClass.NET_Launcher.csproj release: - xbuild /p:Configuration=Release ReClass.NET_Launcher.csproj + msbuild /p:Configuration=Release ReClass.NET_Launcher.csproj clean_release: - xbuild /t:Clean ReClass.NET_Launcher.csproj + msbuild /t:Clean ReClass.NET_Launcher.csproj From c154a985d91c974ac847fa0c91dd529a6cc61964 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 23 Nov 2017 14:42:22 +0100 Subject: [PATCH 226/777] Updated readme. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a1e7a748..bf3cd1a1 100644 --- a/README.md +++ b/README.md @@ -115,4 +115,5 @@ Settings - [ReUnioN](https://github.com/ReUnioN) - leveln - [buddyfavors](https://github.com/buddyfavors) -- [DrP3pp3r](https://github.com/DrP3pp3r) \ No newline at end of file +- [DrP3pp3r](https://github.com/DrP3pp3r) +- [ko1N](https://github.com/ko1N) \ No newline at end of file From 44dff8990a278ec82d08b786c8f25c8c02e102af Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 23 Nov 2017 14:42:53 +0100 Subject: [PATCH 227/777] Added copyright message. --- NativeCore/Dependencies/distorm/COPYING.txt | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 NativeCore/Dependencies/distorm/COPYING.txt diff --git a/NativeCore/Dependencies/distorm/COPYING.txt b/NativeCore/Dependencies/distorm/COPYING.txt new file mode 100644 index 00000000..4f365ddc --- /dev/null +++ b/NativeCore/Dependencies/distorm/COPYING.txt @@ -0,0 +1,26 @@ +:[diStorm3}: +The ultimate disassembler library. +Copyright (c) 2003-2016, Gil Dabah +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Gil Dabah nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL GIL DABAH BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From c28f7475ab966dab7dbbf76d1c5c1e100cb7ae44 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 23 Nov 2017 21:21:33 +0100 Subject: [PATCH 228/777] Speed up display of process informations. --- ReClass.NET/Forms/ProcessInfoForm.Designer.cs | 17 ++-- ReClass.NET/Forms/ProcessInfoForm.cs | 83 +++++++++++-------- 2 files changed, 57 insertions(+), 43 deletions(-) diff --git a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs index bba84d88..c4d9e46b 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs @@ -128,7 +128,7 @@ private void InitializeComponent() // // addressColumn // - this.addressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.addressColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.addressColumn.DataPropertyName = "address"; this.addressColumn.HeaderText = "Address"; this.addressColumn.Name = "addressColumn"; @@ -137,7 +137,7 @@ private void InitializeComponent() // // sizeColumn // - this.sizeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.sizeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.sizeColumn.DataPropertyName = "size"; this.sizeColumn.HeaderText = "Size"; this.sizeColumn.Name = "sizeColumn"; @@ -146,7 +146,7 @@ private void InitializeComponent() // // nameColumn // - this.nameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.nameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.nameColumn.DataPropertyName = "name"; this.nameColumn.HeaderText = "Name"; this.nameColumn.Name = "nameColumn"; @@ -155,7 +155,7 @@ private void InitializeComponent() // // protectionColumn // - this.protectionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.protectionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.protectionColumn.DataPropertyName = "protection"; this.protectionColumn.HeaderText = "Protection"; this.protectionColumn.Name = "protectionColumn"; @@ -164,7 +164,7 @@ private void InitializeComponent() // // typeColumn // - this.typeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.typeColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.typeColumn.DataPropertyName = "type"; this.typeColumn.HeaderText = "Type"; this.typeColumn.Name = "typeColumn"; @@ -252,7 +252,7 @@ private void InitializeComponent() // // moduleNameDataGridViewTextBoxColumn // - this.moduleNameDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.moduleNameDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.moduleNameDataGridViewTextBoxColumn.DataPropertyName = "name"; this.moduleNameDataGridViewTextBoxColumn.HeaderText = "Module"; this.moduleNameDataGridViewTextBoxColumn.Name = "moduleNameDataGridViewTextBoxColumn"; @@ -261,7 +261,7 @@ private void InitializeComponent() // // moduleAddressDataGridViewTextBoxColumn // - this.moduleAddressDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.moduleAddressDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.moduleAddressDataGridViewTextBoxColumn.DataPropertyName = "address"; this.moduleAddressDataGridViewTextBoxColumn.HeaderText = "Address"; this.moduleAddressDataGridViewTextBoxColumn.Name = "moduleAddressDataGridViewTextBoxColumn"; @@ -270,7 +270,7 @@ private void InitializeComponent() // // moduleSizeDataGridViewTextBoxColumn // - this.moduleSizeDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.moduleSizeDataGridViewTextBoxColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.DisplayedCells; this.moduleSizeDataGridViewTextBoxColumn.DataPropertyName = "size"; this.moduleSizeDataGridViewTextBoxColumn.HeaderText = "Size"; this.moduleSizeDataGridViewTextBoxColumn.Name = "moduleSizeDataGridViewTextBoxColumn"; @@ -307,6 +307,7 @@ private void InitializeComponent() this.Name = "ProcessInfoForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "ReClass.NET - Process Informations"; + this.Load += new System.EventHandler(this.ProcessInfoForm_Load); this.contextMenuStrip.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.sectionsDataGridView)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox1)).EndInit(); diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index 7c56d336..dff0b1bb 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -3,6 +3,7 @@ using System.Drawing; using System.IO; using System.Linq; +using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.Memory; using ReClassNET.Native; @@ -33,26 +34,52 @@ public ProcessInfoForm() { moduleIconDataGridViewImageColumn.Visible = false; } + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); - if (Program.RemoteProcess.IsValid) + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + + #region Event Handler + + private async void ProcessInfoForm_Load(object sender, EventArgs e) + { + if (!Program.RemoteProcess.IsValid) { - var sections = new DataTable(); - sections.Columns.Add("address", typeof(string)); - sections.Columns.Add("size", typeof(string)); - sections.Columns.Add("name", typeof(string)); - sections.Columns.Add("protection", typeof(string)); - sections.Columns.Add("type", typeof(string)); - sections.Columns.Add("module", typeof(string)); - sections.Columns.Add("section", typeof(Section)); - - var modules = new DataTable(); - modules.Columns.Add("icon", typeof(Icon)); - modules.Columns.Add("name", typeof(string)); - modules.Columns.Add("address", typeof(string)); - modules.Columns.Add("size", typeof(string)); - modules.Columns.Add("path", typeof(string)); - modules.Columns.Add("module", typeof(Module)); + return; + } + tabControl.Enabled = false; + + var sections = new DataTable(); + sections.Columns.Add("address", typeof(string)); + sections.Columns.Add("size", typeof(string)); + sections.Columns.Add("name", typeof(string)); + sections.Columns.Add("protection", typeof(string)); + sections.Columns.Add("type", typeof(string)); + sections.Columns.Add("module", typeof(string)); + sections.Columns.Add("section", typeof(Section)); + + var modules = new DataTable(); + modules.Columns.Add("icon", typeof(Icon)); + modules.Columns.Add("name", typeof(string)); + modules.Columns.Add("address", typeof(string)); + modules.Columns.Add("size", typeof(string)); + modules.Columns.Add("path", typeof(string)); + modules.Columns.Add("module", typeof(Module)); + + await Task.Run(() => + { Program.RemoteProcess.EnumerateRemoteSectionsAndModules( delegate (Section section) { @@ -78,28 +105,14 @@ public ProcessInfoForm() modules.Rows.Add(row); } ); + }); - sectionsDataGridView.DataSource = sections; - modulesDataGridView.DataSource = modules; - } - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - GlobalWindowManager.AddWindow(this); - } + sectionsDataGridView.DataSource = sections; + modulesDataGridView.DataSource = modules; - protected override void OnFormClosed(FormClosedEventArgs e) - { - base.OnFormClosed(e); - - GlobalWindowManager.RemoveWindow(this); + tabControl.Enabled = true; } - #region Event Handler - private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (!(sender is DataGridView dgv)) From 8b37a6734c81b8bb3d664c8d6d10f17d2a563f92 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 24 Nov 2017 23:47:53 +0100 Subject: [PATCH 229/777] Removed enabled. --- ReClass.NET/Forms/ProcessInfoForm.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index dff0b1bb..d405f05e 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -59,8 +59,6 @@ private async void ProcessInfoForm_Load(object sender, EventArgs e) return; } - tabControl.Enabled = false; - var sections = new DataTable(); sections.Columns.Add("address", typeof(string)); sections.Columns.Add("size", typeof(string)); @@ -109,8 +107,6 @@ await Task.Run(() => sectionsDataGridView.DataSource = sections; modulesDataGridView.DataSource = modules; - - tabControl.Enabled = true; } private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) From e2abaf8e8418266390e82774a139845703dcb771 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 25 Nov 2017 10:54:24 +0100 Subject: [PATCH 230/777] Removed -fpermissive flag. (#23) --- NativeCore/Unix/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index c39f6e3e..e1c21204 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -7,7 +7,7 @@ LD = g++ WINDRES = windres INC = -I../Dependencies/distorm/include -CFLAGS = -Wall -fPIC -fpermissive -DRECLASSNET64=1 +CFLAGS = -Wall -fPIC -DRECLASSNET64=1 RESINC = LIBDIR = LIB = -lstdc++fs From 13315c28c21bb22328f29d256796ce51efec41e6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 28 Nov 2017 23:09:21 +0100 Subject: [PATCH 231/777] Use auto. --- NativeCore/Windows/EnumerateProcesses.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index 4732976e..ff7f4a71 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -29,7 +29,7 @@ Platform GetProcessPlatform(HANDLE process) case PROCESSOR_ARCHITECTURE_INTEL: return Platform::X86; case PROCESSOR_ARCHITECTURE_AMD64: - BOOL isWow64 = FALSE; + auto isWow64 = FALSE; if (IsWow64Process(process, &isWow64)) { return isWow64 ? Platform::X86 : Platform::X64; From 37f91bb473eeb8b2d2af32719d024022260a3806 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 28 Nov 2017 23:14:11 +0100 Subject: [PATCH 232/777] Disassemble multiple instructions at once. --- NativeCore/Shared/DistormHelper.cpp | 95 ++++++++++++++------- NativeCore/Shared/DistormHelper.hpp | 4 +- NativeCore/Unix/DisassembleCode.cpp | 4 +- NativeCore/Windows/DisassembleCode.cpp | 4 +- ReClass.NET/Core/CoreFunctionsManager.cs | 4 +- ReClass.NET/Core/InternalCoreFunctions.cs | 8 +- ReClass.NET/Memory/Disassembler.cs | 82 +++++++----------- ReClass.NET/MemoryScanner/PatternScanner.cs | 15 +--- 8 files changed, 116 insertions(+), 100 deletions(-) diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index 548e0604..a8950ceb 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -7,18 +7,18 @@ extern "C" #include <../src/instructions.h> } -bool AreOperandsStatic(_DInst *instruction, const int prefixLength) +bool AreOperandsStatic(const _DInst &instruction, const int prefixLength) { - const auto fc = META_GET_FC(instruction->meta); + const auto fc = META_GET_FC(instruction.meta); if (fc == FC_UNC_BRANCH || fc == FC_CND_BRANCH) { - if (instruction->size - prefixLength < 5) + if (instruction.size - prefixLength < 5) { return true; } } - const auto ops = instruction->ops; + const auto ops = instruction.ops; for (auto i = 0; i < OPERANDS_NO; i++) { switch (ops[i].type) @@ -37,7 +37,7 @@ bool AreOperandsStatic(_DInst *instruction, const int prefixLength) case O_DISP: case O_SMEM: case O_MEM: - if (instruction->dispSize < 32) + if (instruction.dispSize < 32) { continue; } @@ -58,12 +58,12 @@ bool AreOperandsStatic(_DInst *instruction, const int prefixLength) return true; } -int GetStaticInstructionBytes(_DInst *instruction, const uint8_t *data) +int GetStaticInstructionBytes(const _DInst &instruction, const uint8_t *data) { _CodeInfo info = {}; info.codeOffset = reinterpret_cast<_OffsetType>(data); info.code = data; - info.codeLen = instruction->size; + info.codeLen = instruction.size; info.features = DF_NONE; #ifdef RECLASSNET32 info.dt = Decode32Bits; @@ -88,13 +88,13 @@ int GetStaticInstructionBytes(_DInst *instruction, const uint8_t *data) if (AreOperandsStatic(instruction, prefixLength)) { - return instruction->size; + return instruction.size; } - return instruction->size - info.codeLen; + return instruction.size - info.codeLen; } -bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, InstructionData* instruction) +_CodeInfo CreateCodeInfo(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress) { _CodeInfo info = {}; info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); @@ -108,34 +108,27 @@ bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const R info.dt = Decode64Bits; #endif - _DInst decodedInstructions[1] = {}; - unsigned int instructionCount = 0; - - const auto res = distorm_decompose(&info, decodedInstructions, 1, &instructionCount); - if (res == DECRES_INPUTERR || !(res == DECRES_SUCCESS || res == DECRES_MEMORYERR) || instructionCount != 1) - { - return false; - } - - _DecodedInst instructionInfo = {}; - distorm_format(&info, &decodedInstructions[0], &instructionInfo); + return info; +} - instruction->Length = instructionInfo.size; - std::memcpy(instruction->Data, address, instructionInfo.size); +void FillInstructionData(const RC_Pointer address, const _DInst& instruction, const _DecodedInst& instructionInfo, const bool determineStaticInstructionBytes, InstructionData* data) +{ + data->Length = instructionInfo.size; + std::memcpy(data->Data, address, instructionInfo.size); MultiByteToUnicode( reinterpret_cast(instructionInfo.mnemonic.p), - instruction->Instruction, + data->Instruction, instructionInfo.mnemonic.length ); if (instructionInfo.operands.length != 0) { - instruction->Instruction[instructionInfo.mnemonic.length] = ' '; + data->Instruction[instructionInfo.mnemonic.length] = ' '; MultiByteToUnicode( reinterpret_cast(instructionInfo.operands.p), 0, - instruction->Instruction, + data->Instruction, instructionInfo.mnemonic.length + 1, std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) ); @@ -143,15 +136,57 @@ bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const R if (determineStaticInstructionBytes) { - instruction->StaticInstructionBytes = GetStaticInstructionBytes( - &decodedInstructions[0], + data->StaticInstructionBytes = GetStaticInstructionBytes( + instruction, reinterpret_cast(address) ); } else { - instruction->StaticInstructionBytes = -1; + data->StaticInstructionBytes = -1; } +} - return true; +bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) +{ + auto info = CreateCodeInfo(address, length, virtualAddress); + + const unsigned MaxInstructions = 50; + + _DInst decodedInstructions[MaxInstructions] = {}; + unsigned count = 0; + + while (true) + { + const auto res = distorm_decompose(&info, decodedInstructions, MaxInstructions, &count); + if (res == DECRES_INPUTERR) + { + return false; + } + + for (auto i = 0u; i < count; ++i) + { + _DecodedInst instructionInfo = {}; + distorm_format(&info, &decodedInstructions[i], &instructionInfo); + + InstructionData data; + FillInstructionData(address, decodedInstructions[i], instructionInfo, determineStaticInstructionBytes, &data); + + if (callback(&data) == false) + { + return true; + } + } + + if (res == DECRES_SUCCESS || count == 0) + { + return true; + } + + const auto offset = decodedInstructions[count - 1].addr - info.codeOffset; + + info.codeOffset += offset; + info.code += offset; + info.codeLen -= offset; + } } diff --git a/NativeCore/Shared/DistormHelper.hpp b/NativeCore/Shared/DistormHelper.hpp index 42ecbe8d..04a5b673 100644 --- a/NativeCore/Shared/DistormHelper.hpp +++ b/NativeCore/Shared/DistormHelper.hpp @@ -2,4 +2,6 @@ #include "../ReClassNET_Plugin.hpp" -bool DisassembleCodeImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, InstructionData* instruction); \ No newline at end of file +typedef bool(RC_CallConv EnumerateInstructionCallback)(InstructionData* data); + +bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, EnumerateInstructionCallback callback); \ No newline at end of file diff --git a/NativeCore/Unix/DisassembleCode.cpp b/NativeCore/Unix/DisassembleCode.cpp index ea4c85de..9c2cc5af 100644 --- a/NativeCore/Unix/DisassembleCode.cpp +++ b/NativeCore/Unix/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -extern "C" bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +extern "C" bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) { - return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); + return DisassembleInstructionsImpl(address, length, virtualAddress, determineStaticInstructionBytes, callback); } diff --git a/NativeCore/Windows/DisassembleCode.cpp b/NativeCore/Windows/DisassembleCode.cpp index c65633e1..073dea1f 100644 --- a/NativeCore/Windows/DisassembleCode.cpp +++ b/NativeCore/Windows/DisassembleCode.cpp @@ -1,6 +1,6 @@ #include "../Shared/DistormHelper.hpp" -bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, InstructionData* instruction) +bool RC_CallConv DisassembleCode(RC_Pointer address, RC_Size length, RC_Pointer virtualAddress, bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) { - return DisassembleCodeImpl(address, length, virtualAddress, determineStaticInstructionBytes, instruction); + return DisassembleInstructionsImpl(address, length, virtualAddress, determineStaticInstructionBytes, callback); } diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 9708ee35..7346b563 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -174,9 +174,9 @@ public bool SetHardwareBreakpoint(IntPtr id, IntPtr address, HardwareBreakpointR #region Internal Core Functions - public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, out InstructionData instruction) + public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) { - return internalCoreFunctions.DisassembleCode(address, length, virtualAddress, determineStaticInstructionBytes, out instruction); + return internalCoreFunctions.DisassembleCode(address, length, virtualAddress, determineStaticInstructionBytes, callback); } public IntPtr InitializeInput() diff --git a/ReClass.NET/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs index 75fd0554..3112fa54 100644 --- a/ReClass.NET/Core/InternalCoreFunctions.cs +++ b/ReClass.NET/Core/InternalCoreFunctions.cs @@ -7,6 +7,8 @@ namespace ReClassNET.Core { + public delegate bool EnumerateInstructionCallback(ref InstructionData data); + internal class InternalCoreFunctions : NativeCoreWrapper, IDisposable { private const string CoreFunctionsModuleWindows = "NativeCore.dll"; @@ -15,7 +17,7 @@ internal class InternalCoreFunctions : NativeCoreWrapper, IDisposable private readonly IntPtr handle; [return: MarshalAs(UnmanagedType.I1)] - private delegate bool DisassembleCodeDelegate(IntPtr address, IntPtr length, IntPtr virtualAddress, [MarshalAs(UnmanagedType.I1)] bool determineStaticInstructionBytes, out InstructionData instruction); + private delegate bool DisassembleCodeDelegate(IntPtr address, IntPtr length, IntPtr virtualAddress, [MarshalAs(UnmanagedType.I1)] bool determineStaticInstructionBytes, [MarshalAs(UnmanagedType.FunctionPtr)] EnumerateInstructionCallback callback); private delegate IntPtr InitializeInputDelegate(); @@ -76,9 +78,9 @@ public void Dispose() #endregion - public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, out InstructionData instruction) + public bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) { - return disassembleCodeDelegate(address, (IntPtr)length, virtualAddress, determineStaticInstructionBytes, out instruction); + return disassembleCodeDelegate(address, (IntPtr)length, virtualAddress, determineStaticInstructionBytes, callback); } public IntPtr InitializeInput() diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index ed659ad9..4131a2f9 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -71,7 +71,15 @@ public IEnumerable DisassembleCode(IntPtr address, int while (eip.CompareTo(end) == -1) { - var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, false, out var instruction); + var instruction = default(InstructionData); + + // Grab only one instruction. + var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, false, (ref InstructionData data) => + { + instruction = data; + + return false; + }); if (!res) { break; @@ -170,64 +178,40 @@ public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess proces /// The previous instruction. private DisassembledInstruction GetPreviousInstruction(IntPtr address, IntPtr virtualAddress) { - var end = address + 80; + var instruction = default(InstructionData); - var instruction = new InstructionData(); - - var x = GetPreviousInstructionHelper(end, 80, virtualAddress, ref instruction); - if (x != end) + foreach (var offset in new[] { 80, 40, 20, 10, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }) { - x = GetPreviousInstructionHelper(end, 40, virtualAddress, ref instruction); - if (x != end) + var currentAddress = address - offset; + + coreFunctions.DisassembleCode(currentAddress, offset + 1, virtualAddress - offset, false, (ref InstructionData data) => { - x = GetPreviousInstructionHelper(end, 20, virtualAddress, ref instruction); - if (x != end) + var nextAddress = currentAddress + data.Length; + if (nextAddress.CompareTo(address) > -1) { - x = GetPreviousInstructionHelper(end, 10, virtualAddress, ref instruction); - if (x != end) - { - for (var i = 1; i < 15; ++i) - { - x = address + 65 + i; - if (coreFunctions.DisassembleCode(x, end.Sub(x).ToInt32() + 1, virtualAddress, false, out instruction)) - { - if (x + instruction.Length == end) - { - break; - } - } - } - } + return false; } - } - } - return new DisassembledInstruction - { - Address = virtualAddress - instruction.Length, - Length = instruction.Length, - Data = instruction.Data, - Instruction = instruction.Instruction - }; - } + instruction = data; - private IntPtr GetPreviousInstructionHelper(IntPtr address, int distance, IntPtr virtualAddress, ref InstructionData instruction) - { - var x = address - distance; - var y = virtualAddress - distance; - while (x.CompareTo(address) == -1) // aka x < address - { - if (coreFunctions.DisassembleCode(x, address.Sub(x).ToInt32() + 1, y, false, out instruction)) - { - x += instruction.Length; - y += instruction.Length; - } - else + currentAddress = nextAddress; + + return true; + }); + + if (currentAddress == address) { - break; + return new DisassembledInstruction + { + Address = virtualAddress - instruction.Length, + Length = instruction.Length, + Data = instruction.Data, + Instruction = instruction.Instruction + }; } } - return x; + + return null; } /// Tries to find the start address of the function points into. diff --git a/ReClass.NET/MemoryScanner/PatternScanner.cs b/ReClass.NET/MemoryScanner/PatternScanner.cs index 7c292081..c55ff1d6 100644 --- a/ReClass.NET/MemoryScanner/PatternScanner.cs +++ b/ReClass.NET/MemoryScanner/PatternScanner.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Runtime.InteropServices; +using ReClassNET.Core; using ReClassNET.Memory; using ReClassNET.Util; @@ -105,23 +106,15 @@ public static BytePattern CreatePatternFromCode(RemoteProcess process, IntPtr st try { var eip = handle.AddrOfPinnedObject(); - var end = eip + size; - while (eip.CompareTo(end) == -1) + process.CoreFunctions.DisassembleCode(eip, size, IntPtr.Zero, true, (ref InstructionData instruction) => { - var res = process.CoreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, IntPtr.Zero, true, out var instruction); - if (!res) - { - break; - } - for (var i = 0; i < instruction.Length; ++i) { data.Add(Tuple.Create(instruction.Data[i], i >= instruction.StaticInstructionBytes)); } - - eip += instruction.Length; - } + return true; + }); } finally { From d93bc9e3168fb8ac6bf0f0e17fcb20f6de6f2c75 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 29 Nov 2017 14:17:09 +0100 Subject: [PATCH 233/777] Added InstructionData.Address. --- NativeCore/ReClassNET_Plugin.hpp | 1 + NativeCore/Shared/DistormHelper.cpp | 9 ++++- ReClass.NET/Core/DataExchange.cs | 2 + ReClass.NET/Memory/Disassembler.cs | 61 +++++++++++++++++------------ 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/NativeCore/ReClassNET_Plugin.hpp b/NativeCore/ReClassNET_Plugin.hpp index 4f307ec0..58e909e3 100644 --- a/NativeCore/ReClassNET_Plugin.hpp +++ b/NativeCore/ReClassNET_Plugin.hpp @@ -132,6 +132,7 @@ struct EnumerateProcessData struct InstructionData { + RC_Pointer Address; int Length; uint8_t Data[15]; int StaticInstructionBytes; diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index a8950ceb..8553babf 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -113,6 +113,7 @@ _CodeInfo CreateCodeInfo(const RC_Pointer address, const RC_Size length, const R void FillInstructionData(const RC_Pointer address, const _DInst& instruction, const _DecodedInst& instructionInfo, const bool determineStaticInstructionBytes, InstructionData* data) { + data->Address = reinterpret_cast(instruction.addr); data->Length = instructionInfo.size; std::memcpy(data->Data, address, instructionInfo.size); @@ -156,6 +157,8 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, _DInst decodedInstructions[MaxInstructions] = {}; unsigned count = 0; + auto instructionAddress = static_cast(address); + while (true) { const auto res = distorm_decompose(&info, decodedInstructions, MaxInstructions, &count); @@ -170,12 +173,14 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, distorm_format(&info, &decodedInstructions[i], &instructionInfo); InstructionData data; - FillInstructionData(address, decodedInstructions[i], instructionInfo, determineStaticInstructionBytes, &data); + FillInstructionData(instructionAddress, decodedInstructions[i], instructionInfo, determineStaticInstructionBytes, &data); if (callback(&data) == false) { return true; } + + instructionAddress += decodedInstructions[i].size; } if (res == DECRES_SUCCESS || count == 0) @@ -183,7 +188,7 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, return true; } - const auto offset = decodedInstructions[count - 1].addr - info.codeOffset; + const auto offset = static_cast(decodedInstructions[count - 1].addr - info.codeOffset); info.codeOffset += offset; info.code += offset; diff --git a/ReClass.NET/Core/DataExchange.cs b/ReClass.NET/Core/DataExchange.cs index 1abfdb42..40d29b26 100644 --- a/ReClass.NET/Core/DataExchange.cs +++ b/ReClass.NET/Core/DataExchange.cs @@ -64,6 +64,8 @@ public struct EnumerateRemoteModuleData [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] public struct InstructionData { + public IntPtr Address; + public int Length; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 4131a2f9..264a26e9 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -85,13 +85,7 @@ public IEnumerable DisassembleCode(IntPtr address, int break; } - yield return new DisassembledInstruction - { - Address = virtualAddress, - Length = instruction.Length, - Data = instruction.Data, - Instruction = instruction.Instruction - }; + yield return new DisassembledInstruction(ref instruction); eip += instruction.Length; virtualAddress += instruction.Length; @@ -102,8 +96,8 @@ public IEnumerable DisassembleCode(IntPtr address, int /// The process to read from. /// The address of the code. /// The maximum maxLength of the code. - /// A list of . - public IEnumerable RemoteDisassembleFunction(RemoteProcess process, IntPtr address, int maxLength) + /// A list of which belong to the function. + public IList RemoteDisassembleFunction(RemoteProcess process, IntPtr address, int maxLength) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -116,8 +110,8 @@ public IEnumerable RemoteDisassembleFunction(RemoteProc /// Disassembles the code in the given data. /// The data to disassemble. /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. - /// A list of . - public IEnumerable DisassembleFunction(byte[] data, IntPtr virtualAddress) + /// A list of which belong to the function. + public IList DisassembleFunction(byte[] data, IntPtr virtualAddress) { Contract.Requires(data != null); Contract.Ensures(Contract.Result>() != null); @@ -140,14 +134,27 @@ public IEnumerable DisassembleFunction(byte[] data, Int /// The address of the code. /// The maxLength of the code. /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. - /// A list of . - public IEnumerable DisassembleFunction(IntPtr address, int maxLength, IntPtr virtualAddress) + /// A list of which belong to the function. + public IList DisassembleFunction(IntPtr address, int maxLength, IntPtr virtualAddress) { Contract.Ensures(Contract.Result>() != null); + var instructions = new List(); + // Read until first CC. - return DisassembleCode(address, maxLength, virtualAddress) - .TakeWhile(i => !(i.Length == 1 && i.Data[0] == 0xCC)); + coreFunctions.DisassembleCode(address, maxLength, virtualAddress, false, (ref InstructionData data) => + { + if (data.Length == 1 && data.Data[0] == 0xCC) + { + return false; + } + + instructions.Add(new DisassembledInstruction(ref data)); + + return true; + }); + + return instructions; } /// Tries to find and disassembles the instruction prior to the given address. @@ -201,13 +208,7 @@ private DisassembledInstruction GetPreviousInstruction(IntPtr address, IntPtr vi if (currentAddress == address) { - return new DisassembledInstruction - { - Address = virtualAddress - instruction.Length, - Length = instruction.Length, - Data = instruction.Data, - Instruction = instruction.Instruction - }; + return new DisassembledInstruction(ref instruction); } } @@ -274,13 +275,21 @@ public IntPtr RemoteGetFunctionStartAddress(RemoteProcess process, IntPtr addres public class DisassembledInstruction { - public IntPtr Address; - public int Length; - public byte[] Data; - public string Instruction; + public IntPtr Address { get; set; } + public int Length { get; set; } + public byte[] Data { get; set; } + public string Instruction { get; set; } public bool IsValid => Length > 0; + public DisassembledInstruction(ref InstructionData data) + { + Address = data.Address; + Length = data.Length; + Data = data.Data; + Instruction = data.Instruction; + } + public override string ToString() => $"{Address.ToString(Constants.StringHexFormat)} - {Instruction}"; } } From 8b656779ccc952c1a748c21bf06108fbd49d256a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 29 Nov 2017 14:17:35 +0100 Subject: [PATCH 234/777] Fixed uninitialized data. --- NativeCore/Shared/DistormHelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index 8553babf..1b5bea72 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -172,7 +172,7 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, _DecodedInst instructionInfo = {}; distorm_format(&info, &decodedInstructions[i], &instructionInfo); - InstructionData data; + InstructionData data = {}; FillInstructionData(instructionAddress, decodedInstructions[i], instructionInfo, determineStaticInstructionBytes, &data); if (callback(&data) == false) From 5daba15ee1980ec298d351f1d965fe68ee19202a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 29 Nov 2017 16:10:51 +0100 Subject: [PATCH 235/777] Various refactorings. --- ReClass.NET/AddressParser/AstBuilder.cs | 13 +++-- ReClass.NET/AddressParser/Interpreter.cs | 2 +- ReClass.NET/AddressParser/Operations.cs | 50 +++++++++---------- .../CodeGenerator/CSharpCodeGenerator.cs | 3 +- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 3 +- .../CodeGenerator/CustomCodeGenerator.cs | 4 +- .../DataExchange/Scanner/CheatEngineFile.cs | 9 +--- .../DataExchange/Scanner/ReClassScanFile.cs | 1 - ReClass.NET/Debugger/IBreakpoint.cs | 3 +- ReClass.NET/Debugger/RemoteDebugger.cs | 4 +- ReClass.NET/Debugger/SoftwareBreakpoint.cs | 3 +- ReClass.NET/Forms/FoundCodeForm.cs | 4 +- ReClass.NET/Forms/MainForm.cs | 2 +- ReClass.NET/Memory/Module.cs | 10 ++-- ReClass.NET/Memory/Section.cs | 18 +++---- ReClass.NET/Memory/UnionDataType.cs | 16 +++--- .../MemoryScanner/Comparer/IScanComparer.cs | 5 +- ReClass.NET/MemoryScanner/PatternScanner.cs | 1 - ReClass.NET/MemoryScanner/ScannerWorker.cs | 2 +- ReClass.NET/Native/NativeMethods.Windows.cs | 28 +++++------ ReClass.NET/Native/NativeMethods.cs | 4 +- ReClass.NET/Nodes/BaseContainerNode.cs | 3 +- ReClass.NET/Nodes/BaseFunctionNode.cs | 6 +-- ReClass.NET/Nodes/BaseHexNode.cs | 8 +-- ReClass.NET/Nodes/BaseNode.cs | 4 +- ReClass.NET/Nodes/ClassNode.cs | 4 +- ReClass.NET/Nodes/NodeUuid.cs | 4 +- ReClass.NET/Nodes/UTF16TextPtrNode.cs | 3 +- ReClass.NET/Nodes/UTF32TextPtrNode.cs | 3 +- ReClass.NET/Nodes/UTF8TextPtrNode.cs | 3 +- ReClass.NET/Plugins/PluginInfo.cs | 2 +- ReClass.NET/Plugins/PluginManager.cs | 3 +- ReClass.NET/Settings.cs | 3 +- ReClass.NET/Symbols/SymbolReader.cs | 6 +-- ReClass.NET/Symbols/SymbolStore.cs | 6 +-- ReClass.NET/UI/BannerFactory.cs | 3 +- ReClass.NET/UI/ColorBox.cs | 4 +- ReClass.NET/UI/HotSpotTextBox.cs | 6 +-- ReClass.NET/UI/MemoryViewControl.cs | 2 +- ReClass.NET/UI/SettingsCheckBox.cs | 6 +-- ReClass.NET/UI/SettingsTextBox.cs | 3 +- .../Util/Rtf/RtfBuilder.RtfFormatWrapper.cs | 20 ++++---- ReClass.NET/Util/Rtf/RtfBuilder.cs | 30 +++++------ 43 files changed, 145 insertions(+), 172 deletions(-) diff --git a/ReClass.NET/AddressParser/AstBuilder.cs b/ReClass.NET/AddressParser/AstBuilder.cs index bf26011e..2b91d50b 100644 --- a/ReClass.NET/AddressParser/AstBuilder.cs +++ b/ReClass.NET/AddressParser/AstBuilder.cs @@ -11,7 +11,7 @@ class AstBuilder { private readonly Dictionary operationPrecedence; - private readonly Stack resultStack = new Stack(); + private readonly Stack resultStack = new Stack(); private readonly Stack operatorStack = new Stack(); public AstBuilder() @@ -29,7 +29,7 @@ public AstBuilder() }; } - public Operation Build(IEnumerable tokens) + public IOperation Build(IEnumerable tokens) { Contract.Requires(tokens != null); Contract.Ensures(Contract.ForAll(tokens, t => t != null)); @@ -119,14 +119,14 @@ private void PopOperations(bool untillLeftBracket) } } - private Operation ConvertOperation(Token operationToken) + private IOperation ConvertOperation(Token operationToken) { Contract.Requires(operationToken != null); try { - Operation argument1; - Operation argument2; + IOperation argument1; + IOperation argument2; switch ((char)operationToken.Value) { @@ -163,8 +163,7 @@ private void VerifyResultStack() { if (resultStack.Count > 1) { - var offset = resultStack.Skip(1).FirstOrDefault(o => o is OffsetOperation) as OffsetOperation; - if (offset != null) + if (resultStack.Skip(1).FirstOrDefault(o => o is OffsetOperation) is OffsetOperation offset) { throw new ParseException($"Unexpected offset '{offset.Value}' found."); } diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index f992f750..83011005 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -9,7 +9,7 @@ namespace ReClassNET.AddressParser { class Interpreter { - public IntPtr Execute(Operation operation, RemoteProcess process) + public IntPtr Execute(IOperation operation, RemoteProcess process) { Contract.Requires(operation != null); Contract.Requires(process != null); diff --git a/ReClass.NET/AddressParser/Operations.cs b/ReClass.NET/AddressParser/Operations.cs index db60979e..a665de82 100644 --- a/ReClass.NET/AddressParser/Operations.cs +++ b/ReClass.NET/AddressParser/Operations.cs @@ -5,12 +5,12 @@ namespace ReClassNET.AddressParser { - interface Operation + internal interface IOperation { } - class OffsetOperation : Operation + internal class OffsetOperation : IOperation { public OffsetOperation(IntPtr value) { @@ -21,8 +21,7 @@ public OffsetOperation(IntPtr value) public override bool Equals(object obj) { - var other = obj as OffsetOperation; - if (other != null) + if (obj is OffsetOperation other) { return Value.Equals(other.Value); } @@ -38,21 +37,21 @@ public override int GetHashCode() } } - class ReadPointerOperation : Operation + internal class ReadPointerOperation : IOperation { - public ReadPointerOperation(Operation argument) + public ReadPointerOperation(IOperation argument) { Contract.Requires(argument != null); Argument = argument; } - public Operation Argument { get; } + public IOperation Argument { get; } } - class AdditionOperation : Operation + internal class AdditionOperation : IOperation { - public AdditionOperation(Operation argument1, Operation argument2) + public AdditionOperation(IOperation argument1, IOperation argument2) { Contract.Requires(argument1 != null); Contract.Requires(argument2 != null); @@ -61,13 +60,13 @@ public AdditionOperation(Operation argument1, Operation argument2) Argument2 = argument2; } - public Operation Argument1 { get; } - public Operation Argument2 { get; } + public IOperation Argument1 { get; } + public IOperation Argument2 { get; } } - class SubtractionOperation : Operation + internal class SubtractionOperation : IOperation { - public SubtractionOperation(Operation argument1, Operation argument2) + public SubtractionOperation(IOperation argument1, IOperation argument2) { Contract.Requires(argument1 != null); Contract.Requires(argument2 != null); @@ -76,13 +75,13 @@ public SubtractionOperation(Operation argument1, Operation argument2) Argument2 = argument2; } - public Operation Argument1 { get; } - public Operation Argument2 { get; } + public IOperation Argument1 { get; } + public IOperation Argument2 { get; } } - class DivisionOperation : Operation + internal class DivisionOperation : IOperation { - public DivisionOperation(Operation dividend, Operation divisor) + public DivisionOperation(IOperation dividend, IOperation divisor) { Contract.Requires(dividend != null); Contract.Requires(divisor != null); @@ -91,13 +90,13 @@ public DivisionOperation(Operation dividend, Operation divisor) Divisor = divisor; } - public Operation Dividend { get; } - public Operation Divisor { get; } + public IOperation Dividend { get; } + public IOperation Divisor { get; } } - class MultiplicationOperation : Operation + internal class MultiplicationOperation : IOperation { - public MultiplicationOperation(Operation argument1, Operation argument2) + public MultiplicationOperation(IOperation argument1, IOperation argument2) { Contract.Requires(argument1 != null); Contract.Requires(argument2 != null); @@ -106,11 +105,11 @@ public MultiplicationOperation(Operation argument1, Operation argument2) Argument2 = argument2; } - public Operation Argument1 { get; } - public Operation Argument2 { get; } + public IOperation Argument1 { get; } + public IOperation Argument2 { get; } } - class ModuleOffsetOperation : Operation + internal class ModuleOffsetOperation : IOperation { public ModuleOffsetOperation(string name) { @@ -123,8 +122,7 @@ public ModuleOffsetOperation(string name) public override bool Equals(object obj) { - var other = obj as ModuleOffsetOperation; - if (other != null) + if (obj is ModuleOffsetOperation other) { return Name.Equals(other.Name); } diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 47cf8818..283bf68b 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -87,8 +87,7 @@ private IEnumerable YieldMemberDefinitions(IEnumerable n is BaseHexNode)) { - var bitFieldNode = member as BitFieldNode; - if (bitFieldNode != null) + if (member is BitFieldNode bitFieldNode) { string type; switch (bitFieldNode.Bits) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index eecd86a4..26b9d231 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -58,8 +58,7 @@ public string GenerateCode(IEnumerable classes, ILogger logger) csb.Append($"class {c.Name}"); bool skipFirstMember = false; - var inheritedFromNode = c.Nodes.FirstOrDefault() as ClassInstanceNode; - if (inheritedFromNode != null) + if (c.Nodes.FirstOrDefault() is ClassInstanceNode inheritedFromNode) { skipFirstMember = true; diff --git a/ReClass.NET/CodeGenerator/CustomCodeGenerator.cs b/ReClass.NET/CodeGenerator/CustomCodeGenerator.cs index 56a06b99..4bfd1c70 100644 --- a/ReClass.NET/CodeGenerator/CustomCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CustomCodeGenerator.cs @@ -7,7 +7,7 @@ namespace ReClassNET.CodeGenerator { - [ContractClass(typeof(ICustomCodeGeneratorContract))] + [ContractClass(typeof(CustomCodeGeneratorContract))] public interface ICustomCodeGenerator { bool CanGenerateCode(BaseNode node, Language language); @@ -16,7 +16,7 @@ public interface ICustomCodeGenerator } [ContractClassFor(typeof(ICustomCodeGenerator))] - internal abstract class ICustomCodeGeneratorContract : ICustomCodeGenerator + internal abstract class CustomCodeGeneratorContract : ICustomCodeGenerator { public bool CanGenerateCode(BaseNode node, Language language) { diff --git a/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs b/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs index dd8e580c..757846af 100644 --- a/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs +++ b/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs @@ -80,14 +80,7 @@ public IEnumerable Load(string filePath, ILogger logger) { var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1"; - if (isUnicode) - { - record.Encoding = Encoding.Unicode; - } - else - { - record.Encoding = Encoding.UTF8; - } + record.Encoding = isUnicode ? Encoding.Unicode : Encoding.UTF8; } } diff --git a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs index 5927d8c6..821d4b28 100644 --- a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs +++ b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs @@ -100,7 +100,6 @@ public IEnumerable Load(string filePath, ILogger logger) switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty) { default: - case "UTF8": record.Encoding = Encoding.UTF8; break; case "UTF16": diff --git a/ReClass.NET/Debugger/IBreakpoint.cs b/ReClass.NET/Debugger/IBreakpoint.cs index 497a7722..09485ad4 100644 --- a/ReClass.NET/Debugger/IBreakpoint.cs +++ b/ReClass.NET/Debugger/IBreakpoint.cs @@ -6,6 +6,7 @@ namespace ReClassNET.Debugger { public delegate void BreakpointHandler(IBreakpoint breakpoint, ref DebugEvent evt); + [ContractClass(typeof(BreakpointContract))] public interface IBreakpoint { IntPtr Address { get; } @@ -17,7 +18,7 @@ public interface IBreakpoint } [ContractClassFor(typeof(IBreakpoint))] - internal abstract class IBreakpointContract : IBreakpoint + internal abstract class BreakpointContract : IBreakpoint { public IntPtr Address => throw new NotImplementedException(); diff --git a/ReClass.NET/Debugger/RemoteDebugger.cs b/ReClass.NET/Debugger/RemoteDebugger.cs index b4144a0e..86c4a643 100644 --- a/ReClass.NET/Debugger/RemoteDebugger.cs +++ b/ReClass.NET/Debugger/RemoteDebugger.cs @@ -212,7 +212,7 @@ private HardwareBreakpointRegister GetUsableDebugRegister() internal class BreakpointSplit { - public IntPtr Address; - public int Size; + public IntPtr Address { get; set; } + public int Size { get; set; } } } diff --git a/ReClass.NET/Debugger/SoftwareBreakpoint.cs b/ReClass.NET/Debugger/SoftwareBreakpoint.cs index 54f07784..7fb45fff 100644 --- a/ReClass.NET/Debugger/SoftwareBreakpoint.cs +++ b/ReClass.NET/Debugger/SoftwareBreakpoint.cs @@ -45,8 +45,7 @@ public void Handler(ref DebugEvent evt) public override bool Equals(object obj) { - var bp = obj as SoftwareBreakpoint; - if (bp == null) + if (!(obj is SoftwareBreakpoint bp)) { return false; } diff --git a/ReClass.NET/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs index 113a8e21..35371101 100644 --- a/ReClass.NET/Forms/FoundCodeForm.cs +++ b/ReClass.NET/Forms/FoundCodeForm.cs @@ -17,8 +17,8 @@ public partial class FoundCodeForm : IconForm { private class FoundCodeInfo { - public ExceptionDebugInfo DebugInfo; - public DisassembledInstruction[] Instructions; + public ExceptionDebugInfo DebugInfo { get; set; } + public DisassembledInstruction[] Instructions { get; set; } } public delegate void StopEventHandler(object sender, EventArgs e); diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 35ee14ae..8085e282 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -704,7 +704,7 @@ private static void LoadProjectFromPath(string path, ref ReClassNetProject proje Contract.Requires(project != null); Contract.Ensures(Contract.ValueAtReturn(out project) != null); - IReClassImport import = null; + IReClassImport import; switch (Path.GetExtension(path)?.ToLower()) { case ReClassNetFile.FileExtension: diff --git a/ReClass.NET/Memory/Module.cs b/ReClass.NET/Memory/Module.cs index 13109cbb..f4e43747 100644 --- a/ReClass.NET/Memory/Module.cs +++ b/ReClass.NET/Memory/Module.cs @@ -4,10 +4,10 @@ namespace ReClassNET.Memory { public class Module { - public IntPtr Start; - public IntPtr End; - public IntPtr Size; - public string Name; - public string Path; + public IntPtr Start { get; set; } + public IntPtr End { get; set; } + public IntPtr Size { get; set; } + public string Name { get; set; } + public string Path { get; set; } } } diff --git a/ReClass.NET/Memory/Section.cs b/ReClass.NET/Memory/Section.cs index 80054b94..8e1e30a4 100644 --- a/ReClass.NET/Memory/Section.cs +++ b/ReClass.NET/Memory/Section.cs @@ -34,14 +34,14 @@ public enum SectionType public class Section { - public IntPtr Start; - public IntPtr End; - public IntPtr Size; - public string Name; - public SectionCategory Category; - public SectionProtection Protection; - public SectionType Type; - public string ModuleName; - public string ModulePath; + public IntPtr Start { get; set; } + public IntPtr End { get; set; } + public IntPtr Size { get; set; } + public string Name { get; set; } + public SectionCategory Category { get; set; } + public SectionProtection Protection { get; set; } + public SectionType Type { get; set; } + public string ModuleName { get; set; } + public string ModulePath { get; set; } } } diff --git a/ReClass.NET/Memory/UnionDataType.cs b/ReClass.NET/Memory/UnionDataType.cs index 806490a6..ad6cf98e 100644 --- a/ReClass.NET/Memory/UnionDataType.cs +++ b/ReClass.NET/Memory/UnionDataType.cs @@ -4,7 +4,7 @@ namespace ReClassNET.Memory { [StructLayout(LayoutKind.Explicit)] - struct UInt8Data + public struct UInt8Data { [FieldOffset(0)] public sbyte SByteValue; @@ -14,7 +14,7 @@ struct UInt8Data } [StructLayout(LayoutKind.Explicit)] - struct UInt16Data + public struct UInt16Data { [FieldOffset(0)] public short ShortValue; @@ -24,7 +24,7 @@ struct UInt16Data } [StructLayout(LayoutKind.Explicit)] - struct UInt32FloatData + public struct UInt32FloatData { [FieldOffset(0)] public int IntValue; @@ -41,26 +41,26 @@ struct UInt32FloatData } [StructLayout(LayoutKind.Explicit)] - struct UInt64FloatDoubleData + public struct UInt64FloatDoubleData { [FieldOffset(0)] public long LongValue; public IntPtr IntPtr => -#if WIN32 +#if RECLASSNET32 unchecked((IntPtr)(int)LongValue); #else - unchecked((IntPtr)LongValue); + (IntPtr)LongValue; #endif [FieldOffset(0)] public ulong ULongValue; public UIntPtr UIntPtr => -#if WIN32 +#if RECLASSNET32 unchecked((UIntPtr)(uint)ULongValue); #else - unchecked((UIntPtr)ULongValue); + (UIntPtr)ULongValue; #endif [FieldOffset(0)] diff --git a/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs index 0ec8006b..35be65f5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs @@ -30,7 +30,6 @@ public interface IScanComparer bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result); } - [ContractClassFor(typeof(IScanComparer))] internal abstract class ScanComparerContract : IScanComparer { @@ -50,7 +49,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) Contract.Requires(data != null); Contract.Requires(index >= 0); - throw new System.NotImplementedException(); + throw new NotImplementedException(); } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) @@ -59,7 +58,7 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult Contract.Requires(index >= 0); Contract.Requires(previous != null); - throw new System.NotImplementedException(); + throw new NotImplementedException(); } } } diff --git a/ReClass.NET/MemoryScanner/PatternScanner.cs b/ReClass.NET/MemoryScanner/PatternScanner.cs index c55ff1d6..33adb8dd 100644 --- a/ReClass.NET/MemoryScanner/PatternScanner.cs +++ b/ReClass.NET/MemoryScanner/PatternScanner.cs @@ -4,7 +4,6 @@ using System.Runtime.InteropServices; using ReClassNET.Core; using ReClassNET.Memory; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner { diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs index e6cd6ee4..16aebabc 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ScannerWorker.cs @@ -60,7 +60,7 @@ public IEnumerable Search(byte[] data, int count, IEnumerable> HighlightTimer = new Dictionary>(); + private static readonly Dictionary> highlightTimer = new Dictionary>(); private readonly byte[] buffer; @@ -55,9 +55,9 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) { var address = view.Address.Add(Offset); - HighlightTimer.RemoveWhere(kv => kv.Value.Value < CurrentHighlightTime); + highlightTimer.RemoveWhere(kv => kv.Value.Value < CurrentHighlightTime); - if (HighlightTimer.TryGetValue(address, out var until)) + if (highlightTimer.TryGetValue(address, out var until)) { if (until.Value >= CurrentHighlightTime) { @@ -71,7 +71,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) } else if (view.Memory.HasChanged(Offset, MemorySize)) { - HighlightTimer.Add(address, CurrentHighlightTime.Add(HightlightDuration)); + highlightTimer.Add(address, CurrentHighlightTime.Add(HightlightDuration)); color = view.Settings.HighlightColor; } diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 28a27377..ef246ffc 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -22,7 +22,7 @@ public abstract class BaseNode protected static readonly int TextPadding = Icons.Dimensions; protected static readonly int HiddenHeight = 1; - private static int NodeIndex = 0; + private static int nodeIndex = 0; private string name = string.Empty; private string comment = string.Empty; @@ -68,7 +68,7 @@ protected BaseNode() Contract.Ensures(name != null); Contract.Ensures(comment != null); - Name = $"N{NodeIndex++:X08}"; + Name = $"N{nodeIndex++:X08}"; Comment = string.Empty; levelsOpen[0] = true; diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 49038867..a6b6c468 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -17,9 +17,9 @@ public class ClassNode : BaseContainerNode public static event ClassCreatedEventHandler ClassCreated; #if RECLASSNET64 - public static IntPtr DefaultAddress = (IntPtr)0x140000000; + public static IntPtr DefaultAddress { get; } = (IntPtr)0x140000000; #else - public static IntPtr DefaultAddress = (IntPtr)0x400000; + public static IntPtr DefaultAddress { get; } = (IntPtr)0x400000; #endif /// Size of the node in bytes. diff --git a/ReClass.NET/Nodes/NodeUuid.cs b/ReClass.NET/Nodes/NodeUuid.cs index ff5d6bb5..3eddf506 100644 --- a/ReClass.NET/Nodes/NodeUuid.cs +++ b/ReClass.NET/Nodes/NodeUuid.cs @@ -12,7 +12,7 @@ public sealed class NodeUuid : IComparable, IEquatable public static readonly NodeUuid Zero = new NodeUuid(false); /// The maximum reserved UUID value. - private static readonly NodeUuid MaxReserved = new NodeUuid(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }); + private static readonly NodeUuid maxReserved = new NodeUuid(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }); /// Checks if the given UUID is reserved. /// The uuid. @@ -21,7 +21,7 @@ public static bool IsReserved(NodeUuid uuid) { Contract.Requires(uuid != null); - return uuid.CompareTo(MaxReserved) <= 0; + return uuid.CompareTo(maxReserved) <= 0; } private byte[] uuidBytes; diff --git a/ReClass.NET/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs index 031bcc99..b87a4c2a 100644 --- a/ReClass.NET/Nodes/UTF16TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF16TextPtrNode.cs @@ -1,5 +1,4 @@ -using System; -using System.Drawing; +using System.Drawing; using System.Text; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs index c33ddad0..db026d98 100644 --- a/ReClass.NET/Nodes/UTF32TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF32TextPtrNode.cs @@ -1,5 +1,4 @@ -using System; -using System.Drawing; +using System.Drawing; using System.Text; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs index dd373d0a..27b62611 100644 --- a/ReClass.NET/Nodes/UTF8TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF8TextPtrNode.cs @@ -1,5 +1,4 @@ -using System; -using System.Drawing; +using System.Drawing; using System.Text; using ReClassNET.UI; diff --git a/ReClass.NET/Plugins/PluginInfo.cs b/ReClass.NET/Plugins/PluginInfo.cs index 6b0f0d53..254ce400 100644 --- a/ReClass.NET/Plugins/PluginInfo.cs +++ b/ReClass.NET/Plugins/PluginInfo.cs @@ -34,7 +34,7 @@ public PluginInfo(string filePath, FileVersionInfo versionInfo) Contract.Requires(versionInfo != null); FilePath = filePath; - IsNative = versionInfo.ProductName == null ? true : (versionInfo.ProductName == PluginNativeName); + IsNative = versionInfo.ProductName == null /* Unix */ || versionInfo.ProductName == PluginNativeName; FileVersion = (versionInfo.FileVersion ?? string.Empty).Trim(); diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index 0d9e63a6..03c12257 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -121,8 +121,7 @@ private static Plugin CreatePluginInstance(string filePath) var handle = Activator.CreateInstanceFrom(filePath, type); - var plugin = handle.Unwrap() as Plugin; - if (plugin == null) + if (!(handle.Unwrap() is Plugin plugin)) { throw new FileLoadException(); } diff --git a/ReClass.NET/Settings.cs b/ReClass.NET/Settings.cs index c08ddf8e..7aa0e137 100644 --- a/ReClass.NET/Settings.cs +++ b/ReClass.NET/Settings.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Drawing; +using System.Drawing; using ReClassNET.Util; namespace ReClassNET diff --git a/ReClass.NET/Symbols/SymbolReader.cs b/ReClass.NET/Symbols/SymbolReader.cs index 1184c718..002a0230 100644 --- a/ReClass.NET/Symbols/SymbolReader.cs +++ b/ReClass.NET/Symbols/SymbolReader.cs @@ -78,8 +78,7 @@ private void CreateSession() { Contract.Ensures(diaSession != null); - IDiaSession session; - diaSource.Interface.openSession(out session); + diaSource.Interface.openSession(out var session); diaSession = new ComDisposableWrapper(session); } @@ -90,8 +89,7 @@ public string GetSymbolString(IntPtr address, Module module) var rva = address.Sub(module.Start); - IDiaSymbol diaSymbol; - diaSession.Interface.findSymbolByRVA((uint)rva.ToInt32(), SymTagEnum.SymTagNull, out diaSymbol); + diaSession.Interface.findSymbolByRVA((uint)rva.ToInt32(), SymTagEnum.SymTagNull, out var diaSymbol); if (diaSymbol != null) { using (var symbol = new ComDisposableWrapper(diaSymbol)) diff --git a/ReClass.NET/Symbols/SymbolStore.cs b/ReClass.NET/Symbols/SymbolStore.cs index 5088d65c..48fde96c 100644 --- a/ReClass.NET/Symbols/SymbolStore.cs +++ b/ReClass.NET/Symbols/SymbolStore.cs @@ -96,8 +96,7 @@ private void ResolveSearchPath() { using (var debuggerKey = vsKey.OpenSubKey($@"{subKeyName}\Debugger")) { - var symbolCacheDir = debuggerKey?.GetValue("SymbolCacheDir") as string; - if (symbolCacheDir != null) + if (debuggerKey?.GetValue("SymbolCacheDir") is string symbolCacheDir) { if (Directory.Exists(symbolCacheDir)) { @@ -226,8 +225,7 @@ public SymbolReader GetSymbolsForModule(Module module) lock (symbolReaders) { - SymbolReader reader; - if (!symbolReaders.TryGetValue(name, out reader)) + if (!symbolReaders.TryGetValue(name, out var reader)) { name = Path.ChangeExtension(name, ".pdb"); diff --git a/ReClass.NET/UI/BannerFactory.cs b/ReClass.NET/UI/BannerFactory.cs index 21e607b8..7e4c697d 100644 --- a/ReClass.NET/UI/BannerFactory.cs +++ b/ReClass.NET/UI/BannerFactory.cs @@ -31,8 +31,7 @@ public static Image CreateBanner(int bannerWidth, int bannerHeight, Image icon, var bannerId = $"{bannerWidth}x{bannerHeight}:{title}:{text}"; - Image image; - if (skipCache || !imageCache.TryGetValue(bannerId, out image)) + if (skipCache || !imageCache.TryGetValue(bannerId, out var image)) { image = new Bitmap(bannerWidth, bannerHeight, PixelFormat.Format24bppRgb); using (var g = Graphics.FromImage(image)) diff --git a/ReClass.NET/UI/ColorBox.cs b/ReClass.NET/UI/ColorBox.cs index feab5c1e..a6e80b4a 100644 --- a/ReClass.NET/UI/ColorBox.cs +++ b/ReClass.NET/UI/ColorBox.cs @@ -70,9 +70,9 @@ private void ReadSetting() if (property != null && source != null) { var value = property.GetValue(source); - if (value is Color) + if (value is Color newColor) { - Color = (Color)value; + Color = newColor; } } } diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index 400af26a..b1002892 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -4,7 +4,7 @@ namespace ReClassNET.UI { - class HotSpotTextBox : TextBox + public class HotSpotTextBox : TextBox { private HotSpot hotSpot; @@ -12,7 +12,7 @@ class HotSpotTextBox : TextBox [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public HotSpot HotSpot { - get { return hotSpot; } + get => hotSpot; set { if (hotSpot != value) @@ -39,7 +39,7 @@ public HotSpot HotSpot [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new FontEx Font { - get { return font; } + get => font; set { if (font != value) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index cfb5053a..63713843 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -59,7 +59,7 @@ public ClassNode ClassNode classNode = value; VerticalScroll.Value = 0; - if (classNode != null && Memory != null && Memory.Process != null) + if (classNode != null && Memory?.Process != null) { classNode.UpdateAddress(Memory.Process); } diff --git a/ReClass.NET/UI/SettingsCheckBox.cs b/ReClass.NET/UI/SettingsCheckBox.cs index 20a87fc5..c758b7e2 100644 --- a/ReClass.NET/UI/SettingsCheckBox.cs +++ b/ReClass.NET/UI/SettingsCheckBox.cs @@ -5,7 +5,7 @@ namespace ReClassNET.UI { - class SettingsCheckBox : CheckBox, ISettingsBindable + public class SettingsCheckBox : CheckBox, ISettingsBindable { private PropertyInfo property; private Settings source; @@ -29,9 +29,9 @@ private void ReadSetting() if (property != null && source != null) { var value = property.GetValue(source); - if (value is bool) + if (value is bool b) { - Checked = (bool)value; + Checked = b; } } } diff --git a/ReClass.NET/UI/SettingsTextBox.cs b/ReClass.NET/UI/SettingsTextBox.cs index 5f245d65..7ec480d0 100644 --- a/ReClass.NET/UI/SettingsTextBox.cs +++ b/ReClass.NET/UI/SettingsTextBox.cs @@ -29,8 +29,7 @@ private void ReadSetting() if (property != null && source != null) { var value = property.GetValue(source); - var s = value as string; - if (s != null) + if (value is string s) { Text = s; } diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs index 73a7fef9..55b55bcb 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs @@ -42,7 +42,7 @@ public RtfFormatWrapper(RtfBuilder builder) buffer.Append(@"\strike"); } - if (builder.fontSize != builder.DefaultFontSize) + if (builder.fontSize != builder.defaultFontSize) { buffer.AppendFormat(@"\fs{0}", builder.fontSize); } @@ -50,11 +50,11 @@ public RtfFormatWrapper(RtfBuilder builder) { buffer.AppendFormat(@"\f{0}", builder.fontIndex); } - if (builder.foreColor != builder.DefaultForeColor) + if (builder.foreColor != builder.defaultForeColor) { buffer.AppendFormat(@"\cf{0}", builder.IndexOfColor(builder.foreColor)); } - if (builder.backColor != builder.DefaultBackColor) + if (builder.backColor != builder.defaultBackColor) { buffer.AppendFormat(@"\highlight{0}", builder.IndexOfColor(builder.backColor)); } @@ -95,11 +95,11 @@ public void Dispose() builder.fontStyle = FontStyle.Regular; - if (builder.fontSize != builder.DefaultFontSize) + if (builder.fontSize != builder.defaultFontSize) { - builder.fontSize = builder.DefaultFontSize; + builder.fontSize = builder.defaultFontSize; - buffer.AppendFormat(@"\fs{0} ", builder.DefaultFontSize); + buffer.AppendFormat(@"\fs{0} ", builder.defaultFontSize); } if (builder.fontIndex != 0) { @@ -108,15 +108,15 @@ public void Dispose() builder.fontIndex = 0; } - if (builder.foreColor != builder.DefaultForeColor) + if (builder.foreColor != builder.defaultForeColor) { - builder.foreColor = builder.DefaultForeColor; + builder.foreColor = builder.defaultForeColor; buffer.Append(@"\cf0"); } - if (builder.backColor != builder.DefaultBackColor) + if (builder.backColor != builder.defaultBackColor) { - builder.backColor = builder.DefaultBackColor; + builder.backColor = builder.defaultBackColor; buffer.Append(@"\highlight0"); } diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index 3013bf48..3a368e17 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -9,23 +9,23 @@ namespace ReClassNET.Util.Rtf { public partial class RtfBuilder { - private static readonly char[] slashable = new[] { '{', '}', '\\' }; + private static readonly char[] slashable = { '{', '}', '\\' }; private readonly StringBuilder buffer; - protected readonly Color DefaultForeColor = Color.Black; - protected readonly Color DefaultBackColor = Color.Empty; - protected readonly float DefaultFontSize; + private readonly Color defaultForeColor = Color.Black; + private readonly Color defaultBackColor = Color.Empty; + private readonly float defaultFontSize; private readonly List usedColors = new List(); private readonly List usedFonts = new List(); - protected Color foreColor; - protected Color backColor; + private Color foreColor; + private Color backColor; - protected int fontIndex; - protected float fontSize; - protected FontStyle fontStyle; + private int fontIndex; + private float fontSize; + private FontStyle fontStyle; protected bool isLocked; @@ -41,15 +41,15 @@ public RtfBuilder(RtfFont defaultFont, float defaultFontSize) fontIndex = IndexOfFont(defaultFont); - DefaultFontSize = defaultFontSize; + this.defaultFontSize = defaultFontSize; fontSize = defaultFontSize; - usedColors.Add(DefaultForeColor); - usedColors.Add(DefaultBackColor); + usedColors.Add(defaultForeColor); + usedColors.Add(defaultBackColor); fontStyle = FontStyle.Regular; - foreColor = DefaultForeColor; - backColor = DefaultBackColor; + foreColor = defaultForeColor; + backColor = defaultBackColor; } public RtfBuilder Append(char value) @@ -271,7 +271,7 @@ public override string ToString() sb.Append(@"\viewkind4\uc1\pard\plain\f0"); - sb.AppendFormat(@"\fs{0} ", DefaultFontSize); + sb.AppendFormat(@"\fs{0} ", defaultFontSize); sb.AppendLine(); sb.Append(buffer); From 8651995c143ca553c38c1bffdd4cf864f48e257c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 29 Nov 2017 21:43:13 +0100 Subject: [PATCH 236/777] Combined and rewrote some methods. --- ReClass.NET/Memory/Disassembler.cs | 205 ++++++++++++++--------------- 1 file changed, 96 insertions(+), 109 deletions(-) diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 264a26e9..89b018e9 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using System.Linq; using System.Runtime.InteropServices; using ReClassNET.Core; using ReClassNET.Util; @@ -10,6 +9,9 @@ namespace ReClassNET.Memory { public class Disassembler { + // The maximum number of bytes of a x86-64 instruction. + public const int MaximumInstructionLength = 15; + private readonly CoreFunctionsManager coreFunctions; public Disassembler(CoreFunctionsManager coreFunctions) @@ -22,31 +24,55 @@ public Disassembler(CoreFunctionsManager coreFunctions) /// Disassembles the code in the given range (, ) in the remote process. /// The process to read from. /// The address of the code. - /// The length of the code. + /// The length of the code in bytes. /// A list of . - public IEnumerable RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length) + public IList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length) { Contract.Requires(process != null); - Contract.Ensures(Contract.Result>() != null); + Contract.Ensures(Contract.Result>() != null); + + return RemoteDisassembleCode(process, address, length, -1); + } + + /// Disassembles the code in the given range (, ) in the remote process. + /// The process to read from. + /// The address of the code. + /// The length of the code in bytes. + /// The maximum number of instructions to disassemble. If is -1, all available instructions get returned. + /// A list of . + public IList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length, int maxInstructions) + { + Contract.Requires(process != null); + Contract.Ensures(Contract.Result>() != null); var buffer = process.ReadRemoteMemory(address, length); - return DisassembleCode(buffer, address); + return DisassembleCode(buffer, address, maxInstructions); } /// Disassembles the code in the given data. /// The data to disassemble. /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. + /// The maximum number of instructions to disassemble. If is -1, all available instructions get returned. /// A list of . - public IEnumerable DisassembleCode(byte[] data, IntPtr virtualAddress) + public IList DisassembleCode(byte[] data, IntPtr virtualAddress, int maxInstructions) { Contract.Requires(data != null); - Contract.Ensures(Contract.Result>() != null); + Contract.Ensures(Contract.Result>() != null); var handle = GCHandle.Alloc(data, GCHandleType.Pinned); try { - return DisassembleCode(handle.AddrOfPinnedObject(), data.Length, virtualAddress); + var instructions = new List(); + + coreFunctions.DisassembleCode(handle.AddrOfPinnedObject(), data.Length, virtualAddress, false, (ref InstructionData instruction) => + { + instructions.Add(new DisassembledInstruction(ref instruction)); + + return maxInstructions == -1 || instructions.Count < maxInstructions; + }); + + return instructions; } finally { @@ -57,41 +83,6 @@ public IEnumerable DisassembleCode(byte[] data, IntPtr } } - /// Disassembles the code in the given range (, ). - /// The address of the code. - /// The length of the code. - /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. - /// A list of . - public IEnumerable DisassembleCode(IntPtr address, int length, IntPtr virtualAddress) - { - Contract.Ensures(Contract.Result>() != null); - - var eip = address; - var end = address + length; - - while (eip.CompareTo(end) == -1) - { - var instruction = default(InstructionData); - - // Grab only one instruction. - var res = coreFunctions.DisassembleCode(eip, end.Sub(eip).ToInt32() + 1, virtualAddress, false, (ref InstructionData data) => - { - instruction = data; - - return false; - }); - if (!res) - { - break; - } - - yield return new DisassembledInstruction(ref instruction); - - eip += instruction.Length; - virtualAddress += instruction.Length; - } - } - /// Disassembles the code in the given range (, ) in the remote process until the first 0xCC instruction. /// The process to read from. /// The address of the code. @@ -119,7 +110,22 @@ public IList DisassembleFunction(byte[] data, IntPtr vi var handle = GCHandle.Alloc(data, GCHandleType.Pinned); try { - return DisassembleFunction(handle.AddrOfPinnedObject(), data.Length, virtualAddress); + var instructions = new List(); + + // Read until first CC. + coreFunctions.DisassembleCode(handle.AddrOfPinnedObject(), data.Length, virtualAddress, false, (ref InstructionData result) => + { + if (result.Length == 1 && result.Data[0] == 0xCC) + { + return false; + } + + instructions.Add(new DisassembledInstruction(ref result)); + + return true; + }); + + return instructions; } finally { @@ -130,89 +136,62 @@ public IList DisassembleFunction(byte[] data, IntPtr vi } } - /// Disassembles the code in the given range (, ) until the first 0xCC instruction. - /// The address of the code. - /// The maxLength of the code. - /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. - /// A list of which belong to the function. - public IList DisassembleFunction(IntPtr address, int maxLength, IntPtr virtualAddress) - { - Contract.Ensures(Contract.Result>() != null); - - var instructions = new List(); - - // Read until first CC. - coreFunctions.DisassembleCode(address, maxLength, virtualAddress, false, (ref InstructionData data) => - { - if (data.Length == 1 && data.Data[0] == 0xCC) - { - return false; - } - - instructions.Add(new DisassembledInstruction(ref data)); - - return true; - }); - - return instructions; - } - /// Tries to find and disassembles the instruction prior to the given address. /// The process to read from. /// The address of the code. /// The prior instruction. public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess process, IntPtr address) { - var buffer = process.ReadRemoteMemory(address - 80, 95); + var buffer = process.ReadRemoteMemory(address - 6 * MaximumInstructionLength, 7 * MaximumInstructionLength); var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { - return GetPreviousInstruction(handle.AddrOfPinnedObject(), address); - } - finally - { - if (handle.IsAllocated) - { - handle.Free(); - } - } - } - - /// Gets the previous instruction. - /// The address of the code. - /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. - /// The previous instruction. - private DisassembledInstruction GetPreviousInstruction(IntPtr address, IntPtr virtualAddress) - { - var instruction = default(InstructionData); + var bufferAddress = handle.AddrOfPinnedObject(); - foreach (var offset in new[] { 80, 40, 20, 10, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }) - { - var currentAddress = address - offset; + var instruction = default(InstructionData); - coreFunctions.DisassembleCode(currentAddress, offset + 1, virtualAddress - offset, false, (ref InstructionData data) => + foreach (var offset in new[] + { + 6 * MaximumInstructionLength, + 4 * MaximumInstructionLength, + 2 * MaximumInstructionLength, + MaximumInstructionLength, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 + }) { - var nextAddress = currentAddress + data.Length; - if (nextAddress.CompareTo(address) > -1) + var currentAddress = bufferAddress - offset; + + coreFunctions.DisassembleCode(currentAddress, offset + 1, address - offset, false, (ref InstructionData data) => { - return false; - } + var nextAddress = currentAddress + data.Length; + if (nextAddress.CompareTo(address) > -1) + { + return false; + } - instruction = data; + instruction = data; - currentAddress = nextAddress; + currentAddress = nextAddress; - return true; - }); + return true; + }); + + if (currentAddress == address) + { + return new DisassembledInstruction(ref instruction); + } + } - if (currentAddress == address) + return null; + } + finally + { + if (handle.IsAllocated) { - return new DisassembledInstruction(ref instruction); + handle.Free(); } } - - return null; } /// Tries to find the start address of the function points into. @@ -247,9 +226,17 @@ public IntPtr RemoteGetFunctionStartAddress(RemoteProcess process, IntPtr addres if (prevInstruction.Length == 1 && prevInstruction.Data[0] == 0xCC) { // Disassemble the code from the start and check if the instructions sum up to address. - var length = RemoteDisassembleCode(process, start, address.Sub(start).ToInt32()) - .Select(inst => inst.Length) - .Sum(); + var length = 0; + var res = coreFunctions.DisassembleCode(start, address.Sub(start).ToInt32(), IntPtr.Zero, false, (ref InstructionData data) => + { + length += data.Length; + + return true; + }); + if (!res) + { + continue; + } if (start + length == address) { From 7bfcb209944e9225738eb63935af2e7f002641a6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 29 Nov 2017 21:44:10 +0100 Subject: [PATCH 237/777] Use new overload. --- ReClass.NET/Forms/FoundCodeForm.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs index 35371101..0652b95d 100644 --- a/ReClass.NET/Forms/FoundCodeForm.cs +++ b/ReClass.NET/Forms/FoundCodeForm.cs @@ -219,15 +219,20 @@ public void AddRecord(ExceptionDebugInfo? context) else { var disassembler = new Disassembler(process.CoreFunctions); + var causedByInstruction = disassembler.RemoteGetPreviousInstruction(process, context.Value.ExceptionAddress); + if (causedByInstruction == null) + { + return; + } var instructions = new DisassembledInstruction[5]; instructions[2] = causedByInstruction; instructions[1] = disassembler.RemoteGetPreviousInstruction(process, instructions[2].Address); instructions[0] = disassembler.RemoteGetPreviousInstruction(process, instructions[1].Address); - int i = 3; - foreach (var instruction in disassembler.RemoteDisassembleCode(process, context.Value.ExceptionAddress, 30).Take(2)) + var i = 3; + foreach (var instruction in disassembler.RemoteDisassembleCode(process, context.Value.ExceptionAddress, 2 * Disassembler.MaximumInstructionLength, 2)) { instructions[i++] = instruction; } From 5f5de6caa054dbca36bc26c3a52d2e1477e2deb7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Dec 2017 00:07:15 +0100 Subject: [PATCH 238/777] Fixed x64 warning. --- NativeCore/Shared/DistormHelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index 1b5bea72..dbc08ad8 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -99,7 +99,7 @@ _CodeInfo CreateCodeInfo(const RC_Pointer address, const RC_Size length, const R _CodeInfo info = {}; info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); info.code = reinterpret_cast(address); - info.codeLen = length; + info.codeLen = static_cast(length); info.features = DF_NONE; #ifdef RECLASSNET32 From ff48a006f0cdb4305fd4c314e5c6a9458b0ae02e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Dec 2017 01:08:14 +0100 Subject: [PATCH 239/777] Added cancellation support. --- ReClass.NET/MemoryScanner/Scanner.cs | 84 ++++++++++++---------- ReClass.NET/MemoryScanner/ScannerWorker.cs | 17 ++++- 2 files changed, 62 insertions(+), 39 deletions(-) diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index a865895c..2b1ddb9c 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -207,39 +207,44 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg var result = Parallel.ForEach( sections, // Sections get grouped by the framework to balance the workers. - new ParallelOptions { CancellationToken = ct}, () => new ScannerContext(Settings, comparer, initialBufferSize), // Create a new context for every worker (thread). (s, state, _, context) => { - var start = s.Start; - var size = s.Size.ToInt32(); - - if (Settings.StartAddress.InRange(s.Start, s.End)) - { - start = Settings.StartAddress; - size = size - Settings.StartAddress.Sub(s.Start).ToInt32(); - } - if (Settings.StopAddress.InRange(s.Start, s.End)) + if (!ct.IsCancellationRequested) { - size = size - s.End.Sub(Settings.StopAddress).ToInt32(); - } + var start = s.Start; + var size = s.Size.ToInt32(); - context.EnsureBufferSize(size); - var buffer = context.Buffer; - if (process.ReadRemoteMemoryIntoBuffer(start, ref buffer, 0, size)) // Fill the buffer. - { - var results = context.Worker.Search(buffer, size) // Search for results. - .OrderBy(r => r.Address, IntPtrComparer.Instance) - .ToList(); - if (results.Count > 0) + if (Settings.StartAddress.InRange(s.Start, s.End)) { - var block = CreateResultBlock(results, start, comparer.ValueSize); - store.AddBlock(block); // Store the result block. + start = Settings.StartAddress; + size = size - Settings.StartAddress.Sub(s.Start).ToInt32(); + } + if (Settings.StopAddress.InRange(s.Start, s.End)) + { + size = size - s.End.Sub(Settings.StopAddress).ToInt32(); } - } - progress?.Report((int)(Interlocked.Increment(ref counter) / totalSectionCount * 100)); + context.EnsureBufferSize(size); + var buffer = context.Buffer; + if (process.ReadRemoteMemoryIntoBuffer(start, ref buffer, 0, size)) // Fill the buffer. + { + var results = context.Worker.Search(buffer, size, ct) // Search for results. + .OrderBy(r => r.Address, IntPtrComparer.Instance) + .ToList(); + if (results.Count > 0) + { + var block = CreateResultBlock(results, start, comparer.ValueSize); + store.AddBlock(block); // Store the result block. + } + } + progress?.Report((int)(Interlocked.Increment(ref counter) / totalSectionCount * 100)); + } + else + { + state.Stop(); + } return context; }, w => { } @@ -285,26 +290,31 @@ private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgr { var result = Parallel.ForEach( CurrentStore.GetResultBlocks(), - new ParallelOptions { CancellationToken = ct }, () => new ScannerContext(Settings, comparer, 0), (b, state, _, context) => { - context.EnsureBufferSize(b.Size); - var buffer = context.Buffer; - if (process.ReadRemoteMemoryIntoBuffer(b.Start, ref buffer, 0, b.Size)) + if (!ct.IsCancellationRequested) { - var results = context.Worker.Search(buffer, buffer.Length, b.Results) - .OrderBy(r => r.Address, IntPtrComparer.Instance) - .ToList(); - if (results.Count > 0) + context.EnsureBufferSize(b.Size); + var buffer = context.Buffer; + if (process.ReadRemoteMemoryIntoBuffer(b.Start, ref buffer, 0, b.Size)) { - var block = CreateResultBlock(results, b.Start, comparer.ValueSize); - store.AddBlock(block); + var results = context.Worker.Search(buffer, buffer.Length, b.Results, ct) + .OrderBy(r => r.Address, IntPtrComparer.Instance) + .ToList(); + if (results.Count > 0) + { + var block = CreateResultBlock(results, b.Start, comparer.ValueSize); + store.AddBlock(block); + } } - } - - progress?.Report((int)(Interlocked.Add(ref counter, b.Results.Count) / totalResultCount * 100)); + progress?.Report((int)(Interlocked.Add(ref counter, b.Results.Count) / totalResultCount * 100)); + } + else + { + state.Stop(); + } return context; }, w => { } diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs index 16aebabc..8a804ffb 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ScannerWorker.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Threading; using ReClassNET.MemoryScanner.Comparer; namespace ReClassNET.MemoryScanner @@ -24,8 +25,9 @@ public ScannerWorker(ScanSettings settings, IScanComparer comparer) ///

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≫=Z*HoX(nynNawu_&7%DN*aQAlXpt+{DOJV;Au_ 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 !p$ffay@BQITZMjW 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

/// The data to scan. /// The length of the parameter. + /// The to stop the scan. /// An enumeration of all s. - public IEnumerable Search(byte[] data, int count) + public IEnumerable Search(byte[] data, int count, CancellationToken ct) { Contract.Requires(data != null); @@ -33,6 +35,11 @@ public IEnumerable Search(byte[] data, int count) for (var i = 0; i < endIndex; i += settings.FastScanAlignment) { + if (ct.IsCancellationRequested) + { + break; + } + if (comparer.Compare(data, i, out var result)) { result.Address = (IntPtr)i; @@ -49,8 +56,9 @@ public IEnumerable Search(byte[] data, int count) /// The data to scan. /// The length of the parameter. /// The previous results to use. + /// The to stop the scan. /// An enumeration of all s. - public IEnumerable Search(byte[] data, int count, IEnumerable results) + public IEnumerable Search(byte[] data, int count, IEnumerable results, CancellationToken ct) { Contract.Requires(data != null); Contract.Requires(results != null); @@ -59,6 +67,11 @@ public IEnumerable Search(byte[] data, int count, IEnumerable Date: Fri, 15 Dec 2017 01:08:54 +0100 Subject: [PATCH 240/777] Added cancellation for a running scan. --- ReClass.NET/Forms/ScannerForm.Designer.cs | 23 +++++++++-- ReClass.NET/Forms/ScannerForm.cs | 47 +++++++++++++---------- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs index a5bf45de..6919ba53 100644 --- a/ReClass.NET/Forms/ScannerForm.Designer.cs +++ b/ReClass.NET/Forms/ScannerForm.Designer.cs @@ -90,6 +90,7 @@ private void InitializeComponent() this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); this.undoIconButton = new ReClassNET.UI.IconButton(); this.showInputCorrelatorIconButton = new ReClassNET.UI.IconButton(); + this.cancelScanIconButton = new ReClassNET.UI.IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -524,25 +525,25 @@ private void InitializeComponent() // descriptionToolStripMenuItem // this.descriptionToolStripMenuItem.Name = "descriptionToolStripMenuItem"; - this.descriptionToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.descriptionToolStripMenuItem.Size = new System.Drawing.Size(134, 22); this.descriptionToolStripMenuItem.Text = "Description"; // // addressToolStripMenuItem // this.addressToolStripMenuItem.Name = "addressToolStripMenuItem"; - this.addressToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.addressToolStripMenuItem.Size = new System.Drawing.Size(134, 22); this.addressToolStripMenuItem.Text = "Address"; // // valueTypeToolStripMenuItem // this.valueTypeToolStripMenuItem.Name = "valueTypeToolStripMenuItem"; - this.valueTypeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.valueTypeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); this.valueTypeToolStripMenuItem.Text = "Value Type"; // // valueToolStripMenuItem // this.valueToolStripMenuItem.Name = "valueToolStripMenuItem"; - this.valueToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.valueToolStripMenuItem.Size = new System.Drawing.Size(134, 22); this.valueToolStripMenuItem.Text = "Value"; // // toolStripSeparator2 @@ -712,11 +713,24 @@ private void InitializeComponent() this.showInputCorrelatorIconButton.TabIndex = 19; this.showInputCorrelatorIconButton.Click += new System.EventHandler(this.showInputCorrelatorIconButton_Click); // + // cancelScanIconButton + // + this.cancelScanIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; + this.cancelScanIconButton.Location = new System.Drawing.Point(517, 54); + this.cancelScanIconButton.Name = "cancelScanIconButton"; + this.cancelScanIconButton.Pressed = false; + this.cancelScanIconButton.Selected = false; + this.cancelScanIconButton.Size = new System.Drawing.Size(23, 22); + this.cancelScanIconButton.TabIndex = 21; + this.cancelScanIconButton.Visible = false; + this.cancelScanIconButton.Click += new System.EventHandler(this.cancelScanIconButton_Click); + // // ScannerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(612, 584); + this.Controls.Add(this.cancelScanIconButton); this.Controls.Add(this.showInputCorrelatorIconButton); this.Controls.Add(this.undoIconButton); this.Controls.Add(this.toolStripPanel); @@ -816,5 +830,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; private UI.IconButton undoIconButton; private UI.IconButton showInputCorrelatorIconButton; + private UI.IconButton cancelScanIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 8289afb2..4fb72873 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -29,7 +29,7 @@ internal class ScanValueTypeComboBox : EnumComboBox { } private bool isFirstScan; private Scanner scanner; - + private CancellationTokenSource cts; private string addressFilePath; @@ -155,6 +155,7 @@ private async void nextScanButton_Click(object sender, EventArgs e) { firstScanButton.Enabled = false; nextScanButton.Enabled = false; + cancelScanIconButton.Visible = true; try { @@ -165,14 +166,13 @@ private async void nextScanButton_Click(object sender, EventArgs e) scanProgressBar.Value = i; SetResultCount(scanner.TotalResultCount); }); - var completed = await scanner.Search(comparer, CancellationToken.None, report); + cts = new CancellationTokenSource(); - if (completed) - { - ShowScannerResults(scanner); + await scanner.Search(comparer, cts.Token, report); - undoIconButton.Enabled = scanner.CanUndoLastScan; - } + ShowScannerResults(scanner); + + undoIconButton.Enabled = scanner.CanUndoLastScan; } catch (Exception ex) { @@ -181,11 +181,17 @@ private async void nextScanButton_Click(object sender, EventArgs e) firstScanButton.Enabled = true; nextScanButton.Enabled = true; + cancelScanIconButton.Visible = false; scanProgressBar.Value = 0; } } + private void cancelScanIconButton_Click(object sender, EventArgs e) + { + cts?.Cancel(); + } + private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record) { addressListMemoryRecordList.Records.Add(record); @@ -585,6 +591,7 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare } firstScanButton.Enabled = false; + cancelScanIconButton.Visible = true; try { @@ -595,24 +602,24 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare scanProgressBar.Value = i; SetResultCount(scanner.TotalResultCount); }); - var completed = await scanner.Search(comparer, CancellationToken.None, report); + cts = new CancellationTokenSource(); - if (completed) - { - ShowScannerResults(scanner); + await scanner.Search(comparer, cts.Token, report); - nextScanButton.Enabled = true; - valueTypeComboBox.Enabled = false; + ShowScannerResults(scanner); - floatingOptionsGroupBox.Enabled = false; - stringOptionsGroupBox.Enabled = false; - scanOptionsGroupBox.Enabled = false; + cancelScanIconButton.Visible = false; + nextScanButton.Enabled = true; + valueTypeComboBox.Enabled = false; - isFirstScan = false; + floatingOptionsGroupBox.Enabled = false; + stringOptionsGroupBox.Enabled = false; + scanOptionsGroupBox.Enabled = false; - SetValidCompareTypes(); - OnCompareTypeChanged(); - } + isFirstScan = false; + + SetValidCompareTypes(); + OnCompareTypeChanged(); } finally { From aed38bd9a020e1a40251f58df8eed3d67b222722 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Dec 2017 14:39:09 +0100 Subject: [PATCH 241/777] Switch parameter order. --- ReClass.NET/Forms/ScannerForm.cs | 4 ++-- ReClass.NET/MemoryScanner/Scanner.cs | 23 +++++++++-------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 4fb72873..4f4f909a 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -168,7 +168,7 @@ private async void nextScanButton_Click(object sender, EventArgs e) }); cts = new CancellationTokenSource(); - await scanner.Search(comparer, cts.Token, report); + await scanner.Search(comparer, report, cts.Token); ShowScannerResults(scanner); @@ -604,7 +604,7 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare }); cts = new CancellationTokenSource(); - await scanner.Search(comparer, cts.Token, report); + await scanner.Search(comparer, report, cts.Token); ShowScannerResults(scanner); diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 2b1ddb9c..36222b24 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -163,22 +163,22 @@ private IList
GetSearchableSections() /// The results are stored in the store. ///
/// The comparer to scan for values. - /// The to stop the scan. /// The object to report the current progress. + /// The to stop the scan. /// The asynchronous result indicating if the scan completed. - public Task Search(IScanComparer comparer, CancellationToken ct, IProgress progress) + public Task Search(IScanComparer comparer, IProgress progress, CancellationToken ct) { - return isFirstScan ? FirstScan(comparer, ct, progress) : NextScan(comparer, ct, progress); + return isFirstScan ? FirstScan(comparer, progress, ct) : NextScan(comparer, progress, ct); } /// /// Starts an async first scan with the provided . /// /// The comparer to scan for values. - /// The to stop the scan. /// The object to report the current progress. + /// The to stop the scan. /// The asynchronous result indicating if the scan completed. - private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProgress progress) + private Task FirstScan(IScanComparer comparer, IProgress progress, CancellationToken ct) { Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); @@ -255,14 +255,9 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg var previousStore = stores.Enqueue(store); previousStore?.Dispose(); - if (result.IsCompleted) - { - isFirstScan = false; + isFirstScan = false; - return true; - } - - return false; + return result.IsCompleted; }, ct); } @@ -271,10 +266,10 @@ private Task FirstScan(IScanComparer comparer, CancellationToken ct, IProg /// The next scan uses the previous results to refine the results. ///
/// The comparer to scan for values. - /// The to stop the scan. /// The object to report the current progress. + /// The to stop the scan. /// The asynchronous result indicating if the scan completed. - private Task NextScan(IScanComparer comparer, CancellationToken ct, IProgress progress) + private Task NextScan(IScanComparer comparer, IProgress progress, CancellationToken ct) { Contract.Requires(comparer != null); Contract.Ensures(Contract.Result>() != null); From 2f968ff61b039ca031585897eccf6ae8d4e375b5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Dec 2017 14:45:49 +0100 Subject: [PATCH 242/777] Switch parameter order. (2/2) --- ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs index b173fdd7..5e711e94 100644 --- a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs +++ b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs @@ -81,7 +81,7 @@ private IScanComparer CreateScanComparer(ScanCompareType compareType) /// A task that represents the asynchronous operation. public Task Initialize() { - return Search(CreateScanComparer(ScanCompareType.Unknown), CancellationToken.None, null); + return Search(CreateScanComparer(ScanCompareType.Unknown), null, CancellationToken.None); } private bool shouldHaveChangedSinceLastScan = false; @@ -120,7 +120,7 @@ public async Task RefineResults(CancellationToken ct, IProgress progress) await Task.Delay(TimeSpan.FromMilliseconds(200), ct); } - await Search(CreateScanComparer(compareType), ct, progress); + await Search(CreateScanComparer(compareType), progress, ct); shouldHaveChangedSinceLastScan = false; From 527a8dfa5710d3c0609f8b1457129fed1d48c1c1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Dec 2017 23:29:49 +0100 Subject: [PATCH 243/777] Changed valid range. --- ReClass.NET/Util/Extension.IntPtr.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Util/Extension.IntPtr.cs b/ReClass.NET/Util/Extension.IntPtr.cs index b6f7459b..eb3814c7 100644 --- a/ReClass.NET/Util/Extension.IntPtr.cs +++ b/ReClass.NET/Util/Extension.IntPtr.cs @@ -18,9 +18,9 @@ public static bool IsNull(this IntPtr ptr) public static bool MayBeValid(this IntPtr ptr) { #if RECLASSNET64 - return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((long)0x00FF000000000000)); + return ptr.InRange((IntPtr)0x10000, (IntPtr)long.MaxValue); #else - return ptr.InRange((IntPtr)0x10000, (IntPtr)unchecked((int)0xFFFFF000)); + return ptr.InRange((IntPtr)0x10000, (IntPtr)int.MaxValue); #endif } From b5ddf38bdf9baac2698fe3c874811cc5ef8a0f31 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 27 Dec 2017 00:57:30 +0100 Subject: [PATCH 244/777] Fixed wrong key name. --- ReClass.NET/DataExchange/ReClass/ReClassFile.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 1fc61cdb..61715238 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -163,7 +163,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } node.Name = element.Attribute("Name")?.Value ?? string.Empty; - node.Comment = element.Attribute("Comments")?.Value ?? string.Empty; + node.Comment = element.Attribute("Comment")?.Value ?? string.Empty; // Convert the Custom node into normal hex nodes. if (node is CustomNode) @@ -242,7 +242,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C .Select(e => new VMethodNode { Name = e.Attribute("Name")?.Value ?? string.Empty, - Comment = e.Attribute("Comments")?.Value ?? string.Empty + Comment = e.Attribute("Comment")?.Value ?? string.Empty }) .ForEach(vtableNode.AddNode); break; From d7bf97ccb7ddee010b7efdf1311496ea9c90aa69 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 28 Dec 2017 16:18:44 +0100 Subject: [PATCH 245/777] Search plugins in all sub directories. --- ReClass.NET/Plugins/PluginManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index 03c12257..8e42ac52 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -39,11 +39,11 @@ public void LoadAllPlugins(string path, ILogger logger) var directory = new DirectoryInfo(path); - LoadPlugins(directory.GetFiles("*.dll"), logger, true); + LoadPlugins(directory.GetFiles("*.dll", SearchOption.AllDirectories), logger, true); - LoadPlugins(directory.GetFiles("*.exe"), logger, true); + LoadPlugins(directory.GetFiles("*.exe", SearchOption.AllDirectories), logger, true); - LoadPlugins(directory.GetFiles("*.so"), logger, false); + LoadPlugins(directory.GetFiles("*.so", SearchOption.AllDirectories), logger, false); } catch (Exception ex) { From da0b7b37bd2c3148244a993651055b8d1817fe86 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 08:23:45 +0100 Subject: [PATCH 246/777] Fixes #28. --- ReClass.NET/ReClass.NET.csproj | 5 +++-- ReClass.NET/UI/MemoryPreviewPopUp.cs | 8 ++++++-- ReClass.NET/Util/Extension.Color.cs | 12 ++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 ReClass.NET/Util/Extension.Color.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index fe2f4b16..d297f10b 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -327,6 +327,7 @@ + @@ -933,7 +934,7 @@ powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" - date +"%Y/%m/%d %H:%M:%S" > $(ProjectDir)/Resources/BuildDate.txt + date +"%Y/%m/%d %H:%M:%S" > $(ProjectDir)/Resources/BuildDate.txt @@ -948,4 +949,4 @@ --> - + \ No newline at end of file diff --git a/ReClass.NET/UI/MemoryPreviewPopUp.cs b/ReClass.NET/UI/MemoryPreviewPopUp.cs index 6c048b9c..fcab1703 100644 --- a/ReClass.NET/UI/MemoryPreviewPopUp.cs +++ b/ReClass.NET/UI/MemoryPreviewPopUp.cs @@ -7,6 +7,7 @@ using System.Windows.Forms; using ReClassNET.Memory; using ReClassNET.Nodes; +using ReClassNET.Util; namespace ReClassNET.UI { @@ -114,8 +115,11 @@ protected override void OnPaint(PaintEventArgs e) viewInfo.Context = e.Graphics; - e.Graphics.FillRectangle(Brushes.White, Bounds); - using (var pen = new Pen(Brushes.Black, 1)) + using (var brush = new SolidBrush(viewInfo.Settings.BackgroundColor)) + { + e.Graphics.FillRectangle(brush, ClientRectangle); + } + using (var pen = new Pen(viewInfo.Settings.BackgroundColor.Invert(), 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(Bounds.X, Bounds.Y, Bounds.Width - 1, Bounds.Height - 1)); } diff --git a/ReClass.NET/Util/Extension.Color.cs b/ReClass.NET/Util/Extension.Color.cs new file mode 100644 index 00000000..844915cd --- /dev/null +++ b/ReClass.NET/Util/Extension.Color.cs @@ -0,0 +1,12 @@ +using System.Drawing; + +namespace ReClassNET.Util +{ + public static class ExtensionColor + { + public static Color Invert(this Color color) + { + return Color.FromArgb(color.A, 255 - color.R, 255 - color.G, 255 - color.B); + } + } +} From c98e6745dd9c8bff45b75d078afd875803f9a4fc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 10:27:19 +0100 Subject: [PATCH 247/777] Implemented #31. --- ReClass.NET/UI/MemoryViewControl.Designer.cs | 107 ++++++++++--------- ReClass.NET/UI/MemoryViewControl.cs | 31 ++++-- 2 files changed, 82 insertions(+), 56 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 87c87199..d556aae7 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -104,11 +104,12 @@ private void InitializeComponent() this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.repaintTimer = new System.Windows.Forms.Timer(this.components); this.editBox = new ReClassNET.UI.HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.shrinkClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -134,9 +135,10 @@ private void InitializeComponent() this.toolStripSeparator12, this.copyAddressToolStripMenuItem, this.toolStripSeparator16, - this.showCodeOfClassToolStripMenuItem}); + this.showCodeOfClassToolStripMenuItem, + this.shrinkClassToolStripMenuItem}); this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 354); + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 376); this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); // // changeTypeToolStripMenuItem @@ -193,7 +195,7 @@ private void InitializeComponent() // this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.hex64ToolStripMenuItem.Text = "Hex 64"; this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -202,7 +204,7 @@ private void InitializeComponent() // this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.hex32ToolStripMenuItem.Text = "Hex 32"; this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -211,7 +213,7 @@ private void InitializeComponent() // this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.hex16ToolStripMenuItem.Text = "Hex 16"; this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -220,7 +222,7 @@ private void InitializeComponent() // this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.hex8ToolStripMenuItem.Text = "Hex 8"; this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -228,13 +230,13 @@ private void InitializeComponent() // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(170, 6); // // int64ToolStripMenuItem // this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.int64ToolStripMenuItem.Text = "Int 64"; this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -243,7 +245,7 @@ private void InitializeComponent() // this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.int32ToolStripMenuItem.Text = "Int 32"; this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -252,7 +254,7 @@ private void InitializeComponent() // this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.int16ToolStripMenuItem.Text = "Int 16"; this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -261,7 +263,7 @@ private void InitializeComponent() // this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.int8ToolStripMenuItem.Text = "Int 8"; this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -269,13 +271,13 @@ private void InitializeComponent() // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(170, 6); // // uInt64ToolStripMenuItem // this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uInt64ToolStripMenuItem.Text = "UInt 64"; this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -284,7 +286,7 @@ private void InitializeComponent() // this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uInt32ToolStripMenuItem.Text = "UInt 32"; this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -293,7 +295,7 @@ private void InitializeComponent() // this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uInt16ToolStripMenuItem.Text = "UInt 16"; this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -302,7 +304,7 @@ private void InitializeComponent() // this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uInt8ToolStripMenuItem.Text = "UInt 8"; this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -310,13 +312,13 @@ private void InitializeComponent() // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(170, 6); // // boolToolStripMenuItem // this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.boolToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.boolToolStripMenuItem.Text = "Bool"; this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -325,7 +327,7 @@ private void InitializeComponent() // this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.bitsToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.bitsToolStripMenuItem.Text = "Bits"; this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -333,13 +335,13 @@ private void InitializeComponent() // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(170, 6); // // floatToolStripMenuItem // this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.floatToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.floatToolStripMenuItem.Text = "Float"; this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -348,7 +350,7 @@ private void InitializeComponent() // this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.doubleToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.doubleToolStripMenuItem.Text = "Double"; this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -356,13 +358,13 @@ private void InitializeComponent() // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(170, 6); // // vector4ToolStripMenuItem // this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.vector4ToolStripMenuItem.Text = "Vector 4"; this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -371,7 +373,7 @@ private void InitializeComponent() // this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.vector3ToolStripMenuItem.Text = "Vector 3"; this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -380,7 +382,7 @@ private void InitializeComponent() // this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.vector2ToolStripMenuItem.Text = "Vector 2"; this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -388,13 +390,13 @@ private void InitializeComponent() // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(170, 6); // // matrix4x4ToolStripMenuItem // this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -403,7 +405,7 @@ private void InitializeComponent() // this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -412,7 +414,7 @@ private void InitializeComponent() // this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -420,13 +422,13 @@ private void InitializeComponent() // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(170, 6); // // uTF8TextToolStripMenuItem // this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -435,7 +437,7 @@ private void InitializeComponent() // this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -444,7 +446,7 @@ private void InitializeComponent() // this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -453,7 +455,7 @@ private void InitializeComponent() // this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -461,13 +463,13 @@ private void InitializeComponent() // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(170, 6); // // classInstanceToolStripMenuItem // this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.classInstanceToolStripMenuItem.Text = "Class Instance"; this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -476,7 +478,7 @@ private void InitializeComponent() // this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.classPointerToolStripMenuItem.Text = "Class Pointer"; this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -484,13 +486,13 @@ private void InitializeComponent() // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(170, 6); // // arrayToolStripMenuItem // this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.arrayToolStripMenuItem.Text = "Array of Classes"; this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -499,7 +501,7 @@ private void InitializeComponent() // this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -508,7 +510,7 @@ private void InitializeComponent() // this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -517,7 +519,7 @@ private void InitializeComponent() // this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.functionPointerToolStripMenuItem.Text = "Function Pointer"; this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -526,7 +528,7 @@ private void InitializeComponent() // this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionToolStripMenuItem.Size = new System.Drawing.Size(173, 22); this.functionToolStripMenuItem.Text = "Function"; this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -789,6 +791,11 @@ private void InitializeComponent() this.copyAddressToolStripMenuItem.Text = "Copy Address"; this.copyAddressToolStripMenuItem.Click += new System.EventHandler(this.copyAddressToolStripMenuItem_Click); // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(266, 6); + // // showCodeOfClassToolStripMenuItem // this.showCodeOfClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; @@ -819,10 +826,13 @@ private void InitializeComponent() // this.nodeInfoToolTip.ShowAlways = true; // - // toolStripSeparator16 + // shrinkClassToolStripMenuItem // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(266, 6); + this.shrinkClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; + this.shrinkClassToolStripMenuItem.Name = "shrinkClassToolStripMenuItem"; + this.shrinkClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.shrinkClassToolStripMenuItem.Text = "Shrink Class"; + this.shrinkClassToolStripMenuItem.Click += new System.EventHandler(this.shrinkClassToolStripMenuItem_Click); // // MemoryViewControl // @@ -918,5 +928,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripMenuItem shrinkClassToolStripMenuItem; } } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 63713843..53df44ad 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -803,6 +803,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs copyAddressToolStripMenuItem.Enabled = !nodeIsClass; showCodeOfClassToolStripMenuItem.Enabled = nodeIsClass; + shrinkClassToolStripMenuItem.Enabled = nodeIsClass; } private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) @@ -963,6 +964,28 @@ private void copyAddressToolStripMenuItem_Click(object sender, EventArgs e) } } + private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) + { + if (selectedNodes.FirstOrDefault()?.Node is ClassNode node) + { + LinkedWindowFeatures.ShowCodeGeneratorForm(node.Yield()); + } + } + + private void shrinkClassToolStripMenuItem_Click(object sender, EventArgs e) + { + var node = selectedNodes.Select(s => s.Node).FirstOrDefault(); + if (!(node is ClassNode classNode)) + { + return; + } + + foreach (var nodeToDelete in classNode.Nodes.Reverse().TakeWhile(n => n is BaseHexNode)) + { + classNode.RemoveNode(nodeToDelete); + } + } + #endregion public void AddBytes(int length) @@ -1222,13 +1245,5 @@ private void FindWhatInteractsWithSelectedNode(bool writeOnly) LinkedWindowFeatures.FindWhatInteractsWithAddress(selectedNode.Address, selectedNode.Node.MemorySize, writeOnly); } - - private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) - { - if (selectedNodes.FirstOrDefault()?.Node is ClassNode node) - { - LinkedWindowFeatures.ShowCodeGeneratorForm(node.Yield()); - } - } } } From 579aad30d080c19458275a00895397981740c62c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 13:37:19 +0100 Subject: [PATCH 248/777] Made constants public. --- ReClass.NET/Constants.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Constants.cs b/ReClass.NET/Constants.cs index 76357fc7..2d4236eb 100644 --- a/ReClass.NET/Constants.cs +++ b/ReClass.NET/Constants.cs @@ -1,6 +1,6 @@ namespace ReClassNET { - internal class Constants + public class Constants { public const string ApplicationName = "ReClass.NET"; From b01bfc1c897092f07a3345f656355974113f875f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 13:51:51 +0100 Subject: [PATCH 249/777] Added hex display for integer nodes (fixes #26). --- ReClass.NET/Nodes/BaseHexCommentNode.cs | 6 ++---- ReClass.NET/Nodes/Int16Node.cs | 3 ++- ReClass.NET/Nodes/Int32Node.cs | 3 ++- ReClass.NET/Nodes/Int64Node.cs | 3 ++- ReClass.NET/Nodes/Int8Node.cs | 3 ++- ReClass.NET/Nodes/UInt16Node.cs | 3 ++- ReClass.NET/Nodes/UInt32Node.cs | 3 ++- ReClass.NET/Nodes/UInt64Node.cs | 3 ++- ReClass.NET/Nodes/UInt8Node.cs | 3 ++- 9 files changed, 18 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 5b7d97ae..00eba974 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -15,18 +15,16 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentFloat) { - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, $"({(fvalue > -99999.0f && fvalue < 99999.0f ? fvalue : 0.0f):0.000})"); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, $"{(fvalue > -99999.0f && fvalue < 99999.0f ? fvalue : 0.0f):0.000}") + view.Font.Width; } if (view.Settings.ShowCommentInteger) { - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, ivalue == IntPtr.Zero ? "(0)" : $"({ivalue.ToInt64()}|0x{uvalue.ToUInt64():X})"); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, ivalue == IntPtr.Zero ? "0" : $"{ivalue.ToInt64()} (0x{uvalue.ToUInt64():X})") + view.Font.Width; } var namedAddress = view.Memory.Process.GetNamedAddress(ivalue); if (!string.IsNullOrEmpty(namedAddress)) { - x += view.Font.Width; - if (view.Settings.ShowCommentPointer) { x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 0af0e47f..38b66824 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -10,7 +10,8 @@ public class Int16Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Signed, "Int16", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Signed, "Int16", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 7d7d976f..26250902 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -10,7 +10,8 @@ public class Int32Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Signed, "Int32", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Signed, "Int32", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index 70f02b6a..ab84ee32 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -10,7 +10,8 @@ public class Int64Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Signed, "Int64", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Signed, "Int64", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 2e06ddb1..726025ad 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -10,7 +10,8 @@ public class Int8Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Signed, "Int8", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Signed, "Int8", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 6d28deed..1054a6b4 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -10,7 +10,8 @@ public class UInt16Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 9dd9e8c4..45bab281 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -10,7 +10,8 @@ public class UInt32Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 77a781e8..75d5ae78 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -10,7 +10,8 @@ public class UInt64Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index 12091cfe..d7a370eb 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -10,7 +10,8 @@ public class UInt8Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", ReadValueFromMemory(view.Memory).ToString()); + var value = ReadValueFromMemory(view.Memory); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", $"{value} (0x{value:X})"); } public override void Update(HotSpot spot) From d8d136d7a965d843f4554955a44c9885833abe66 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 15:25:36 +0100 Subject: [PATCH 250/777] Fixed form size. --- ReClass.NET/Forms/InputBytesForm.Designer.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/Forms/InputBytesForm.Designer.cs b/ReClass.NET/Forms/InputBytesForm.Designer.cs index 27e6e80d..d7927afd 100644 --- a/ReClass.NET/Forms/InputBytesForm.Designer.cs +++ b/ReClass.NET/Forms/InputBytesForm.Designer.cs @@ -52,12 +52,10 @@ private void InitializeComponent() // hexRadioButton // this.hexRadioButton.AutoSize = true; - this.hexRadioButton.Checked = true; - this.hexRadioButton.Location = new System.Drawing.Point(8, 51); + this.hexRadioButton.Location = new System.Drawing.Point(77, 51); this.hexRadioButton.Name = "hexRadioButton"; this.hexRadioButton.Size = new System.Drawing.Size(44, 17); this.hexRadioButton.TabIndex = 2; - this.hexRadioButton.TabStop = true; this.hexRadioButton.Text = "Hex"; this.hexRadioButton.UseVisualStyleBackColor = true; this.hexRadioButton.CheckedChanged += new System.EventHandler(this.hexRadioButton_CheckedChanged); @@ -65,10 +63,12 @@ private void InitializeComponent() // decimalRadioButton // this.decimalRadioButton.AutoSize = true; - this.decimalRadioButton.Location = new System.Drawing.Point(58, 51); + this.decimalRadioButton.Checked = true; + this.decimalRadioButton.Location = new System.Drawing.Point(8, 51); this.decimalRadioButton.Name = "decimalRadioButton"; this.decimalRadioButton.Size = new System.Drawing.Size(63, 17); this.decimalRadioButton.TabIndex = 3; + this.decimalRadioButton.TabStop = true; this.decimalRadioButton.Text = "Decimal"; this.decimalRadioButton.UseVisualStyleBackColor = true; // @@ -112,7 +112,7 @@ private void InitializeComponent() // this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; this.okButton.Image = global::ReClassNET.Properties.Resources.B16x16_Accept; - this.okButton.Location = new System.Drawing.Point(102, 121); + this.okButton.Location = new System.Drawing.Point(146, 121); this.okButton.Name = "okButton"; this.okButton.Size = new System.Drawing.Size(75, 23); this.okButton.TabIndex = 8; @@ -125,7 +125,7 @@ private void InitializeComponent() this.bytesNumericUpDown.Hexadecimal = true; this.bytesNumericUpDown.Location = new System.Drawing.Point(8, 25); this.bytesNumericUpDown.Name = "bytesNumericUpDown"; - this.bytesNumericUpDown.Size = new System.Drawing.Size(168, 20); + this.bytesNumericUpDown.Size = new System.Drawing.Size(212, 20); this.bytesNumericUpDown.TabIndex = 9; this.bytesNumericUpDown.ValueChanged += new System.EventHandler(this.bytesNumericUpDown_ValueChanged); // @@ -134,7 +134,7 @@ private void InitializeComponent() this.AcceptButton = this.okButton; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(184, 151); + this.ClientSize = new System.Drawing.Size(228, 151); this.Controls.Add(this.bytesNumericUpDown); this.Controls.Add(this.okButton); this.Controls.Add(this.newSizeLabel); @@ -144,6 +144,7 @@ private void InitializeComponent() this.Controls.Add(this.decimalRadioButton); this.Controls.Add(this.hexRadioButton); this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "InputBytesForm"; From 6c712ccb8db951da88baae9227e5e6045d6192f8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 2 Jan 2018 15:36:07 +0100 Subject: [PATCH 251/777] Fixed button positions. --- ReClass.NET/Forms/ScannerForm.Designer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs index 6919ba53..bbd88cb9 100644 --- a/ReClass.NET/Forms/ScannerForm.Designer.cs +++ b/ReClass.NET/Forms/ScannerForm.Designer.cs @@ -693,6 +693,7 @@ private void InitializeComponent() // // undoIconButton // + this.undoIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.undoIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Undo; this.undoIconButton.Location = new System.Drawing.Point(256, 54); this.undoIconButton.Name = "undoIconButton"; @@ -704,6 +705,7 @@ private void InitializeComponent() // // showInputCorrelatorIconButton // + this.showInputCorrelatorIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.showInputCorrelatorIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Canvas_Size; this.showInputCorrelatorIconButton.Location = new System.Drawing.Point(580, 378); this.showInputCorrelatorIconButton.Name = "showInputCorrelatorIconButton"; From cd065f1826fb94914de72e4312b1804bb6ffda0c Mon Sep 17 00:00:00 2001 From: morsisko Date: Sun, 14 Jan 2018 16:39:30 +0100 Subject: [PATCH 252/777] Changed resize property of About dialog --- ReClass.NET/Forms/AboutForm.Designer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReClass.NET/Forms/AboutForm.Designer.cs b/ReClass.NET/Forms/AboutForm.Designer.cs index 739bf454..25e94816 100644 --- a/ReClass.NET/Forms/AboutForm.Designer.cs +++ b/ReClass.NET/Forms/AboutForm.Designer.cs @@ -175,6 +175,9 @@ private void InitializeComponent() this.Controls.Add(this.platformLabel); this.Controls.Add(this.infoLabel); this.Controls.Add(this.bannerBox); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; this.Name = "AboutForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "ReClass.NET - Info"; From 9d220d90c441d1e8139f4a256bd7fa0663fb3349 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 10:49:20 +0100 Subject: [PATCH 253/777] Same problem as in #40. --- ReClass.NET/Forms/InputCorrelatorForm.Designer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs b/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs index 09f912cd..6b75bc36 100644 --- a/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs +++ b/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs @@ -34,7 +34,7 @@ private void InitializeComponent() this.settingsGroupBox = new System.Windows.Forms.GroupBox(); this.removeButton = new System.Windows.Forms.Button(); this.addButton = new System.Windows.Forms.Button(); - this.valueTypeComboBox = new ScannerForm.ScanValueTypeComboBox(); + this.valueTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanValueTypeComboBox(); this.label1 = new System.Windows.Forms.Label(); this.hotkeyListBox = new System.Windows.Forms.ListBox(); this.hotkeyBox = new ReClassNET.UI.HotkeyBox(); @@ -165,6 +165,8 @@ private void InitializeComponent() this.Controls.Add(this.settingsGroupBox); this.Controls.Add(this.bannerBox); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; this.Name = "InputCorrelatorForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Input Correlator"; From 9c40c2e7d35c7bfb4a47669d6dd4f96a6f01ea5f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 10:51:24 +0100 Subject: [PATCH 254/777] Same problem as in #40. --- ReClass.NET/Forms/PluginForm.Designer.cs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/ReClass.NET/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs index 62389847..0caecd06 100644 --- a/ReClass.NET/Forms/PluginForm.Designer.cs +++ b/ReClass.NET/Forms/PluginForm.Designer.cs @@ -38,12 +38,12 @@ private void InitializeComponent() this.versionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.authorColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.nativesTabPage = new System.Windows.Forms.TabPage(); + this.label2 = new System.Windows.Forms.Label(); this.functionsProvidersComboBox = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.getMoreLinkLabel = new System.Windows.Forms.LinkLabel(); this.closeButton = new System.Windows.Forms.Button(); this.bannerBox = new ReClassNET.UI.BannerBox(); - this.label2 = new System.Windows.Forms.Label(); this.tabControl.SuspendLayout(); this.pluginsTabPage.SuspendLayout(); this.descriptionGroupBox.SuspendLayout(); @@ -167,6 +167,15 @@ private void InitializeComponent() this.nativesTabPage.Text = "Native Helper"; this.nativesTabPage.UseVisualStyleBackColor = true; // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 66); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(98, 13); + this.label2.TabIndex = 21; + this.label2.Text = "Functions Provider:"; + // // functionsProvidersComboBox // this.functionsProvidersComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -222,15 +231,6 @@ private void InitializeComponent() this.bannerBox.Text = "Here you can configure all loaded ReClass.NET plugins."; this.bannerBox.Title = "Plugins"; // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(6, 66); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(98, 13); - this.label2.TabIndex = 21; - this.label2.Text = "Functions Provider:"; - // // PluginForm // this.AcceptButton = this.closeButton; @@ -242,6 +242,8 @@ private void InitializeComponent() this.Controls.Add(this.getMoreLinkLabel); this.Controls.Add(this.tabControl); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; this.Name = "PluginForm"; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; From 7462e6b64b43d48ffc8a547d466b314dc6c4451c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 12:50:33 +0100 Subject: [PATCH 255/777] Added PlaceholderTextBox. --- ReClass.NET/UI/PlaceholderTextBox.cs | 70 ++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 ReClass.NET/UI/PlaceholderTextBox.cs diff --git a/ReClass.NET/UI/PlaceholderTextBox.cs b/ReClass.NET/UI/PlaceholderTextBox.cs new file mode 100644 index 00000000..15b69eaf --- /dev/null +++ b/ReClass.NET/UI/PlaceholderTextBox.cs @@ -0,0 +1,70 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace ReClassNET.UI +{ + public class PlaceholderTextBox : TextBox + { + private Font fontBackup; + private Color foreColorBackup; + private Color backColorBackup; + + /// + /// The color of the placeholder text. + /// + public Color PlaceholderColor { get; set; } = SystemColors.ControlDarkDark; + + /// + /// The placeholder text. + /// + public string PlaceholderText { get; set; } + + public PlaceholderTextBox() + { + fontBackup = Font; + foreColorBackup = ForeColor; + backColorBackup = BackColor; + + SetStyle(ControlStyles.UserPaint, true); + } + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + + if (string.IsNullOrEmpty(Text)) + { + if (!GetStyle(ControlStyles.UserPaint)) + { + fontBackup = Font; + foreColorBackup = ForeColor; + backColorBackup = BackColor; + + SetStyle(ControlStyles.UserPaint, true); + } + } + else + { + if (GetStyle(ControlStyles.UserPaint)) + { + SetStyle(ControlStyles.UserPaint, false); + + Font = fontBackup; + ForeColor = foreColorBackup; + BackColor = backColorBackup; + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (string.IsNullOrEmpty(Text) && Focused == false) + { + e.Graphics.DrawString(PlaceholderText ?? string.Empty, Font, new SolidBrush(PlaceholderColor), new PointF(-1.0f, 1.0f)); + } + } + } +} From 19adb3e8d81c7b4e3af721d7a787575b522c73e6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 13:10:07 +0100 Subject: [PATCH 256/777] Implemented feature request from #39. --- .../Forms/ClassSelectionForm.Designer.cs | 131 ++++++++++++++++++ ReClass.NET/Forms/ClassSelectionForm.cs | 62 +++++++++ ReClass.NET/Forms/ClassSelectionForm.resx | 120 ++++++++++++++++ ReClass.NET/ReClass.NET.csproj | 12 ++ ReClass.NET/UI/MemoryViewControl.cs | 77 +++------- 5 files changed, 348 insertions(+), 54 deletions(-) create mode 100644 ReClass.NET/Forms/ClassSelectionForm.Designer.cs create mode 100644 ReClass.NET/Forms/ClassSelectionForm.cs create mode 100644 ReClass.NET/Forms/ClassSelectionForm.resx diff --git a/ReClass.NET/Forms/ClassSelectionForm.Designer.cs b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs new file mode 100644 index 00000000..831552d7 --- /dev/null +++ b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs @@ -0,0 +1,131 @@ +namespace ReClassNET.Forms +{ + partial class ClassSelectionForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.classesListBox = new System.Windows.Forms.ListBox(); + this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.cancelButton = new System.Windows.Forms.Button(); + this.selectButton = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.SuspendLayout(); + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B16x16_Class_Type; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(516, 48); + this.bannerBox.TabIndex = 9; + this.bannerBox.Text = "Select a class of the project."; + this.bannerBox.Title = "Class Selection"; + // + // classesListBox + // + this.classesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.classesListBox.DisplayMember = "Name"; + this.classesListBox.FormattingEnabled = true; + this.classesListBox.Location = new System.Drawing.Point(12, 80); + this.classesListBox.Name = "classesListBox"; + this.classesListBox.Size = new System.Drawing.Size(492, 186); + this.classesListBox.TabIndex = 2; + this.classesListBox.SelectedIndexChanged += new System.EventHandler(this.classesListBox_SelectedIndexChanged); + this.classesListBox.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.classesListBox_MouseDoubleClick); + // + // filterNameTextBox + // + this.filterNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filterNameTextBox.BackColor = System.Drawing.SystemColors.Window; + this.filterNameTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.filterNameTextBox.ForeColor = System.Drawing.SystemColors.WindowText; + this.filterNameTextBox.Location = new System.Drawing.Point(12, 54); + this.filterNameTextBox.Name = "filterNameTextBox"; + this.filterNameTextBox.PlaceholderColor = System.Drawing.SystemColors.ControlDarkDark; + this.filterNameTextBox.PlaceholderText = "Filter by Class Name..."; + this.filterNameTextBox.Size = new System.Drawing.Size(492, 20); + this.filterNameTextBox.TabIndex = 1; + this.filterNameTextBox.TextChanged += new System.EventHandler(this.filterNameTextBox_TextChanged); + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(430, 272); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 4; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // selectButton + // + this.selectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.selectButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.selectButton.Enabled = false; + this.selectButton.Location = new System.Drawing.Point(328, 272); + this.selectButton.Name = "selectButton"; + this.selectButton.Size = new System.Drawing.Size(95, 23); + this.selectButton.TabIndex = 3; + this.selectButton.Text = "Select Class"; + this.selectButton.UseVisualStyleBackColor = true; + // + // ClassSelectionForm + // + this.AcceptButton = this.selectButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(516, 306); + this.Controls.Add(this.selectButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.filterNameTextBox); + this.Controls.Add(this.classesListBox); + this.Controls.Add(this.bannerBox); + this.Name = "ClassSelectionForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ReClass.NET - Class Selection"; + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private UI.BannerBox bannerBox; + private System.Windows.Forms.ListBox classesListBox; + private UI.PlaceholderTextBox filterNameTextBox; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button selectButton; + } +} \ No newline at end of file diff --git a/ReClass.NET/Forms/ClassSelectionForm.cs b/ReClass.NET/Forms/ClassSelectionForm.cs new file mode 100644 index 00000000..4625b1b7 --- /dev/null +++ b/ReClass.NET/Forms/ClassSelectionForm.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ReClassNET.Nodes; + +namespace ReClassNET.Forms +{ + public partial class ClassSelectionForm : IconForm + { + private readonly List allClasses; + + public ClassNode SelectedClass => classesListBox.SelectedItem as ClassNode; + + public ClassSelectionForm(IEnumerable classes) + { + Contract.Requires(classes != null); + + allClasses = classes.ToList(); + + InitializeComponent(); + + ShowFilteredClasses(); + } + + private void filterNameTextBox_TextChanged(object sender, EventArgs e) + { + ShowFilteredClasses(); + } + + private void classesListBox_SelectedIndexChanged(object sender, EventArgs e) + { + selectButton.Enabled = SelectedClass != null; + } + + private void classesListBox_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (SelectedClass != null) + { + selectButton.PerformClick(); + } + } + + private void ShowFilteredClasses() + { + IEnumerable classes = allClasses; + + if (!string.IsNullOrEmpty(filterNameTextBox.Text)) + { + classes = classes.Where(c => c.Name.Contains(filterNameTextBox.Text)); + } + + classesListBox.DataSource = classes.ToList(); + } + } +} diff --git a/ReClass.NET/Forms/ClassSelectionForm.resx b/ReClass.NET/Forms/ClassSelectionForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/ReClass.NET/Forms/ClassSelectionForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index d297f10b..36780519 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -167,6 +167,12 @@ + + Form + + + ClassSelectionForm.cs + Form @@ -323,6 +329,9 @@ MemoryViewControl.cs + + Component + @@ -474,6 +483,9 @@ AboutForm.cs + + ClassSelectionForm.cs + CodeForm.cs diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 53df44ad..c7ea8def 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -8,6 +8,7 @@ using System.Text; using System.Windows.Forms; using ReClassNET.DataExchange.ReClass; +using ReClassNET.Forms; using ReClassNET.Memory; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; @@ -381,8 +382,6 @@ protected override void OnMouseClick(MouseEventArgs e) } else if (hotSpot.Type == HotSpotType.ChangeType) { - IEnumerable items = null; - if (hitObject is FunctionNode functionNode) { var noneClass = new ClassNode(false) @@ -390,69 +389,39 @@ protected override void OnMouseClick(MouseEventArgs e) Name = "None" }; - void ChangeTypeHandler(object sender2, EventArgs e2) + using (var csf = new ClassSelectionForm(noneClass.Yield().Concat(project.Classes.OrderBy(c => c.Name)))) { - if (!((sender2 as TypeToolStripMenuItem)?.Tag is ClassNode selectedClassNode)) + if (csf.ShowDialog() == DialogResult.OK) { - return; - } + var selectedClassNode = csf.SelectedClass; + if (selectedClassNode != null) + { + if (selectedClassNode == noneClass) + { + selectedClassNode = null; + } - if (selectedClassNode == noneClass) - { - selectedClassNode = null; + functionNode.BelongsToClass = selectedClassNode; + } } - - functionNode.BelongsToClass = selectedClassNode; } - - items = noneClass.Yield() - .Concat(project.Classes.OrderBy(c => c.Name)) - .Select(c => - { - var b = new TypeToolStripMenuItem - { - Text = c.Name, - Tag = c - }; - b.Click += ChangeTypeHandler; - return b; - }); } - - if (hitObject is BaseReferenceNode refNode) + else if (hitObject is BaseReferenceNode refNode) { - void ChangeInnerNodeHandler(object sender2, EventArgs e2) + using (var csf = new ClassSelectionForm(project.Classes.OrderBy(c => c.Name))) { - if (!((sender2 as TypeToolStripMenuItem)?.Tag is ClassNode selectedClassNode)) + if (csf.ShowDialog() == DialogResult.OK) { - return; - } - - if (!refNode.PerformCycleCheck || IsCycleFree(refNode.ParentNode as ClassNode, selectedClassNode)) - { - refNode.ChangeInnerNode(selectedClassNode); + var selectedClassNode = csf.SelectedClass; + if (selectedClassNode != null) + { + if (!refNode.PerformCycleCheck || IsCycleFree(refNode.ParentNode as ClassNode, selectedClassNode)) + { + refNode.ChangeInnerNode(selectedClassNode); + } + } } } - - items = project.Classes - .OrderBy(c => c.Name) - .Select(c => - { - var b = new TypeToolStripMenuItem - { - Text = c.Name, - Tag = c - }; - b.Click += ChangeInnerNodeHandler; - return b; - }); - } - - if (items != null) - { - var menu = new ContextMenuStrip(); - menu.Items.AddRange(items.ToArray()); - menu.Show(this, e.Location); } break; From 652e149e93526045a7c6ff705b3a45b062d4f7be Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 13:10:50 +0100 Subject: [PATCH 257/777] Add space between name and icon. --- ReClass.NET/Nodes/FunctionNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 877958d3..c6a30692 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -73,7 +73,7 @@ public override Size Draw(ViewInfo view, int x, int y) y += view.Font.Height; x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>"); + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeType); size.Width = Math.Max(size.Width, x - origX); size.Height += view.Font.Height; From 8468a62e16fcfe266329b3f8d5ac0cbee2bffeff Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 14:01:11 +0100 Subject: [PATCH 258/777] Added Encoding property. --- ReClass.NET/Nodes/BaseTextNode.cs | 5 ++++- ReClass.NET/Nodes/UTF16TextNode.cs | 3 +++ ReClass.NET/Nodes/UTF32TextNode.cs | 3 +++ ReClass.NET/Nodes/UTF8TextNode.cs | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 015e75e0..6e14e80f 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.Contracts; using System.Drawing; +using System.Text; using ReClassNET.UI; using ReClassNET.Util; @@ -17,6 +18,8 @@ public abstract class BaseTextNode : BaseNode /// Size of one character in bytes. public abstract int CharacterSize { get; } + public abstract Encoding Encoding { get; } + public override void CopyFromNode(BaseNode node) { Length = node.MemorySize / CharacterSize; @@ -50,7 +53,7 @@ protected Size DrawText(ViewInfo view, int x, int y, string type, int length, st x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]") + view.Font.Width; x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "= '"); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text.LimitLength(150)); + x = AddText(view, x, y, view.Settings.TextColor, 1, text.LimitLength(150)); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; x = AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index ebbc0932..ca90f120 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using System.Text; using ReClassNET.Memory; using ReClassNET.UI; @@ -8,6 +9,8 @@ public class Utf16TextNode : BaseTextNode { public override int CharacterSize => 2; + public override Encoding Encoding => Encoding.Unicode; + /// Draws this node. /// The view information. /// The x coordinate. diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index b85576b9..afbf7782 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using System.Text; using ReClassNET.Memory; using ReClassNET.UI; @@ -8,6 +9,8 @@ public class Utf32TextNode : BaseTextNode { public override int CharacterSize => 4; + public override Encoding Encoding => Encoding.UTF32; + /// Draws this node. /// The view information. /// The x coordinate. diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index 43c47ae8..bd95aca0 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using System.Text; using ReClassNET.Memory; using ReClassNET.UI; @@ -8,6 +9,8 @@ public class Utf8TextNode : BaseTextNode { public override int CharacterSize => 1; + public override Encoding Encoding => Encoding.UTF8; + /// Draws this node. /// The view information. /// The x coordinate. From 99f5a9f1f8d7859bfda7f6be62c5f58ed9555efe Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 14:12:31 +0100 Subject: [PATCH 259/777] Removed redundant code. --- ReClass.NET/Memory/MemoryBuffer.cs | 39 +++++++++--------------------- ReClass.NET/Nodes/BaseTextNode.cs | 12 +++++++-- ReClass.NET/Nodes/UTF16TextNode.cs | 12 +-------- ReClass.NET/Nodes/UTF32TextNode.cs | 12 +-------- ReClass.NET/Nodes/UTF8TextNode.cs | 12 +-------- 5 files changed, 24 insertions(+), 63 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index e9bc7f7a..1ad850f1 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -502,7 +502,17 @@ public string ReadPrintableAsciiString(int offset, int length) return sb.ToString(); } - private string ReadString(Encoding encoding, int offset, int length) + public string ReadString(Encoding encoding, IntPtr offset, int length) + { + Contract.Requires(encoding != null); + Contract.Requires(offset.ToInt32() >= 0); + Contract.Requires(length >= 0); + Contract.Ensures(Contract.Result() != null); + + return ReadString(encoding, offset.ToInt32(), length); + } + + public string ReadString(Encoding encoding, int offset, int length) { Contract.Requires(encoding != null); Contract.Requires(offset >= 0); @@ -525,33 +535,6 @@ private string ReadString(Encoding encoding, int offset, int length) return sb.ToString(); } - public string ReadUtf8String(IntPtr offset, int length) - { - Contract.Requires(offset.ToInt32() >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - return ReadString(Encoding.UTF8, offset.ToInt32(), length); - } - - public string ReadUtf16String(IntPtr offset, int length) - { - Contract.Requires(offset.ToInt32() >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - return ReadString(Encoding.Unicode, offset.ToInt32(), length); - } - - public string ReadUtf32String(IntPtr offset, int length) - { - Contract.Requires(offset.ToInt32() >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - return ReadString(Encoding.UTF32, offset.ToInt32(), length); - } - public bool HasChanged(IntPtr offset, int length) { return HasChanged(offset.ToInt32(), length); diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 6e14e80f..ad55ab45 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; @@ -25,17 +26,19 @@ public override void CopyFromNode(BaseNode node) Length = node.MemorySize / CharacterSize; } - protected Size DrawText(ViewInfo view, int x, int y, string type, int length, string text) + protected Size DrawText(ViewInfo view, int x, int y, string type) { Contract.Requires(view != null); Contract.Requires(type != null); - Contract.Requires(text != null); if (IsHidden) { return DrawHidden(view, x, y); } + var length = MemorySize / CharacterSize; + var text = ReadValueFromMemory(view.Memory); + DrawInvalidMemoryIndicator(view, y); var origX = x; @@ -83,6 +86,11 @@ public override void Update(HotSpot spot) } } } + + public string ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadString(Encoding, Offset, MemorySize); + } } [ContractClassFor(typeof(BaseTextNode))] diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index ca90f120..e881c6da 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -11,19 +11,9 @@ public class Utf16TextNode : BaseTextNode public override Encoding Encoding => Encoding.Unicode; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text16", MemorySize / CharacterSize, view.Memory.ReadUtf16String(Offset, MemorySize)); - } - - public string ReadValueFromMemory(MemoryBuffer memory) - { - return memory.ReadUtf16String(Offset, MemorySize); + return DrawText(view, x, y, "Text16"); } } } diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index afbf7782..024c2170 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -11,19 +11,9 @@ public class Utf32TextNode : BaseTextNode public override Encoding Encoding => Encoding.UTF32; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text32", MemorySize / CharacterSize, view.Memory.ReadUtf32String(Offset, MemorySize)); - } - - public string ReadValueFromMemory(MemoryBuffer memory) - { - return memory.ReadUtf32String(Offset, MemorySize); + return DrawText(view, x, y, "Text32"); } } } diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index bd95aca0..6ffa2489 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -11,19 +11,9 @@ public class Utf8TextNode : BaseTextNode public override Encoding Encoding => Encoding.UTF8; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return DrawText(view, x, y, "Text8", MemorySize, view.Memory.ReadUtf8String(Offset, MemorySize)); - } - - public string ReadValueFromMemory(MemoryBuffer memory) - { - return memory.ReadUtf8String(Offset, MemorySize); + return DrawText(view, x, y, "Text8"); } } } From c4ae5e0fddb1826c5d69d73d49d47c4da43f98d9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 14:18:32 +0100 Subject: [PATCH 260/777] Removed more duplicated code. --- ReClass.NET/Nodes/BaseTextNode.cs | 25 +++++-------------------- ReClass.NET/Nodes/UTF16TextNode.cs | 3 --- ReClass.NET/Nodes/UTF32TextNode.cs | 3 --- ReClass.NET/Nodes/UTF8TextNode.cs | 3 --- 4 files changed, 5 insertions(+), 29 deletions(-) diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index ad55ab45..a198a69c 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; using System.Drawing; using System.Text; using ReClassNET.Memory; @@ -8,7 +7,6 @@ namespace ReClassNET.Nodes { - [ContractClass(typeof(BaseTextNodeContract))] public abstract class BaseTextNode : BaseNode { public int Length { get; set; } @@ -16,11 +14,12 @@ public abstract class BaseTextNode : BaseNode /// Size of the node in bytes. public override int MemorySize => Length * CharacterSize; - /// Size of one character in bytes. - public abstract int CharacterSize { get; } - + /// The encoding of the string. public abstract Encoding Encoding { get; } + /// Size of one character in bytes. + private int CharacterSize => Encoding.GetSimpleByteCountPerChar(); + public override void CopyFromNode(BaseNode node) { Length = node.MemorySize / CharacterSize; @@ -92,18 +91,4 @@ public string ReadValueFromMemory(MemoryBuffer memory) return memory.ReadString(Encoding, Offset, MemorySize); } } - - [ContractClassFor(typeof(BaseTextNode))] - internal abstract class BaseTextNodeContract : BaseTextNode - { - public override int CharacterSize - { - get - { - Contract.Ensures(Contract.Result() > 0); - - throw new NotImplementedException(); - } - } - } } diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index e881c6da..8ed4897b 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -1,14 +1,11 @@ using System.Drawing; using System.Text; -using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes { public class Utf16TextNode : BaseTextNode { - public override int CharacterSize => 2; - public override Encoding Encoding => Encoding.Unicode; public override Size Draw(ViewInfo view, int x, int y) diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index 024c2170..2c3dd84b 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -1,14 +1,11 @@ using System.Drawing; using System.Text; -using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes { public class Utf32TextNode : BaseTextNode { - public override int CharacterSize => 4; - public override Encoding Encoding => Encoding.UTF32; public override Size Draw(ViewInfo view, int x, int y) diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index 6ffa2489..c724f2a8 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -1,14 +1,11 @@ using System.Drawing; using System.Text; -using ReClassNET.Memory; using ReClassNET.UI; namespace ReClassNET.Nodes { public class Utf8TextNode : BaseTextNode { - public override int CharacterSize => 1; - public override Encoding Encoding => Encoding.UTF8; public override Size Draw(ViewInfo view, int x, int y) From 9ad353ecca5ce11fb0dd8302cf030cf92ff2324d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 14:22:32 +0100 Subject: [PATCH 261/777] And again... --- ReClass.NET/Nodes/BaseTextPtrNode.cs | 12 +++++++++--- ReClass.NET/Nodes/UTF16TextPtrNode.cs | 7 +++---- ReClass.NET/Nodes/UTF32TextPtrNode.cs | 7 +++---- ReClass.NET/Nodes/UTF8TextPtrNode.cs | 7 +++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 2cd003b6..d44cfdc2 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -1,7 +1,9 @@ using System; using System.Diagnostics.Contracts; using System.Drawing; +using System.Text; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -9,24 +11,28 @@ public abstract class BaseTextPtrNode : BaseNode { public override int MemorySize => IntPtr.Size; + /// The encoding of the string. + public abstract Encoding Encoding { get; } + /// Draws this node. /// The view information. /// The x coordinate. /// The y coordinate. /// The name of the type. - /// The text. /// The pixel size the node occupies. - public Size DrawText(ViewInfo view, int x, int y, string type, string text) + public Size DrawText(ViewInfo view, int x, int y, string type) { Contract.Requires(view != null); Contract.Requires(type != null); - Contract.Requires(text != null); if (IsHidden) { return DrawHidden(view, x, y); } + var ptr = view.Memory.ReadIntPtr(Offset); + var text = view.Memory.Process.ReadRemoteString(Encoding, ptr, 64 * Encoding.GetSimpleByteCountPerChar()); + DrawInvalidMemoryIndicator(view, y); var origX = x; diff --git a/ReClass.NET/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs index b87a4c2a..9b6bd111 100644 --- a/ReClass.NET/Nodes/UTF16TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF16TextPtrNode.cs @@ -6,12 +6,11 @@ namespace ReClassNET.Nodes { public class Utf16TextPtrNode : BaseTextPtrNode { + public override Encoding Encoding => Encoding.Unicode; + public override Size Draw(ViewInfo view, int x, int y) { - var ptr = view.Memory.ReadIntPtr(Offset); - var str = view.Memory.Process.ReadRemoteString(Encoding.Unicode, ptr, 128); - - return DrawText(view, x, y, "Text16Ptr", str); + return DrawText(view, x, y, "Text16Ptr"); } } } diff --git a/ReClass.NET/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs index db026d98..cd14be3a 100644 --- a/ReClass.NET/Nodes/UTF32TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF32TextPtrNode.cs @@ -6,12 +6,11 @@ namespace ReClassNET.Nodes { public class Utf32TextPtrNode : BaseTextPtrNode { + public override Encoding Encoding => Encoding.UTF32; + public override Size Draw(ViewInfo view, int x, int y) { - var ptr = view.Memory.ReadIntPtr(Offset); - var str = view.Memory.Process.ReadRemoteString(Encoding.UTF32, ptr, 256); - - return DrawText(view, x, y, "Text32Ptr", str); + return DrawText(view, x, y, "Text32Ptr"); } } } diff --git a/ReClass.NET/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs index 27b62611..501463b3 100644 --- a/ReClass.NET/Nodes/UTF8TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF8TextPtrNode.cs @@ -6,12 +6,11 @@ namespace ReClassNET.Nodes { public class Utf8TextPtrNode : BaseTextPtrNode { + public override Encoding Encoding => Encoding.UTF8; + public override Size Draw(ViewInfo view, int x, int y) { - var ptr = view.Memory.ReadIntPtr(Offset); - var str = view.Memory.Process.ReadRemoteString(Encoding.UTF8, ptr, 64); - - return DrawText(view, x, y, "Text8Ptr", str); + return DrawText(view, x, y, "Text8Ptr"); } } } From 5d703b950a2167469e03cfe6d30bb93ec6ae1d74 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Jan 2018 22:50:34 +0100 Subject: [PATCH 262/777] Use case insensitive matching (fixes #39). --- ReClass.NET/Forms/ClassSelectionForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/ClassSelectionForm.cs b/ReClass.NET/Forms/ClassSelectionForm.cs index 4625b1b7..f0d27c95 100644 --- a/ReClass.NET/Forms/ClassSelectionForm.cs +++ b/ReClass.NET/Forms/ClassSelectionForm.cs @@ -53,7 +53,7 @@ private void ShowFilteredClasses() if (!string.IsNullOrEmpty(filterNameTextBox.Text)) { - classes = classes.Where(c => c.Name.Contains(filterNameTextBox.Text)); + classes = classes.Where(c => c.Name.IndexOf(filterNameTextBox.Text, StringComparison.OrdinalIgnoreCase) >= 0); } classesListBox.DataSource = classes.ToList(); From dcbc94d92105b312a81674c88d23a1eb52fbdd30 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 10:39:10 +0100 Subject: [PATCH 263/777] Use using. --- ReClass.NET/Forms/ClassSelectionForm.Designer.cs | 4 ---- ReClass.NET/UI/PlaceholderTextBox.cs | 5 ++++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Forms/ClassSelectionForm.Designer.cs b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs index 831552d7..7a2aa18f 100644 --- a/ReClass.NET/Forms/ClassSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs @@ -65,12 +65,8 @@ private void InitializeComponent() // this.filterNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.filterNameTextBox.BackColor = System.Drawing.SystemColors.Window; - this.filterNameTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.filterNameTextBox.ForeColor = System.Drawing.SystemColors.WindowText; this.filterNameTextBox.Location = new System.Drawing.Point(12, 54); this.filterNameTextBox.Name = "filterNameTextBox"; - this.filterNameTextBox.PlaceholderColor = System.Drawing.SystemColors.ControlDarkDark; this.filterNameTextBox.PlaceholderText = "Filter by Class Name..."; this.filterNameTextBox.Size = new System.Drawing.Size(492, 20); this.filterNameTextBox.TabIndex = 1; diff --git a/ReClass.NET/UI/PlaceholderTextBox.cs b/ReClass.NET/UI/PlaceholderTextBox.cs index 15b69eaf..6e729b09 100644 --- a/ReClass.NET/UI/PlaceholderTextBox.cs +++ b/ReClass.NET/UI/PlaceholderTextBox.cs @@ -63,7 +63,10 @@ protected override void OnPaint(PaintEventArgs e) if (string.IsNullOrEmpty(Text) && Focused == false) { - e.Graphics.DrawString(PlaceholderText ?? string.Empty, Font, new SolidBrush(PlaceholderColor), new PointF(-1.0f, 1.0f)); + using (var brush = new SolidBrush(PlaceholderColor)) + { + e.Graphics.DrawString(PlaceholderText ?? string.Empty, Font, brush, new PointF(-1.0f, 1.0f)); + } } } } From 4582934f3c654fb9e74435baaadfd138ed9bbe02 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 10:50:47 +0100 Subject: [PATCH 264/777] Set default values to prevent designer code generation. --- ReClass.NET/UI/PlaceholderTextBox.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReClass.NET/UI/PlaceholderTextBox.cs b/ReClass.NET/UI/PlaceholderTextBox.cs index 6e729b09..d0ac5d25 100644 --- a/ReClass.NET/UI/PlaceholderTextBox.cs +++ b/ReClass.NET/UI/PlaceholderTextBox.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -13,11 +14,13 @@ public class PlaceholderTextBox : TextBox /// /// The color of the placeholder text. /// + [DefaultValue(typeof(Color), "ControlDarkDark")] public Color PlaceholderColor { get; set; } = SystemColors.ControlDarkDark; /// /// The placeholder text. /// + [DefaultValue("")] public string PlaceholderText { get; set; } public PlaceholderTextBox() From 85209589aa24a560a77ee90ad52b3d19575d7e7b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 11:19:22 +0100 Subject: [PATCH 265/777] Register window. --- ReClass.NET/Forms/ClassSelectionForm.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Forms/ClassSelectionForm.cs b/ReClass.NET/Forms/ClassSelectionForm.cs index f0d27c95..ee55f0e8 100644 --- a/ReClass.NET/Forms/ClassSelectionForm.cs +++ b/ReClass.NET/Forms/ClassSelectionForm.cs @@ -1,14 +1,11 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Diagnostics.Contracts; -using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.Nodes; +using ReClassNET.UI; namespace ReClassNET.Forms { @@ -29,6 +26,20 @@ public ClassSelectionForm(IEnumerable classes) ShowFilteredClasses(); } + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + private void filterNameTextBox_TextChanged(object sender, EventArgs e) { ShowFilteredClasses(); From 5aff492391319cb4cd53758827fa1566aaf28281 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 11:19:37 +0100 Subject: [PATCH 266/777] Made class internal. --- ReClass.NET/Forms/CodeForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs index 1beb1ce2..68e4b547 100644 --- a/ReClass.NET/Forms/CodeForm.cs +++ b/ReClass.NET/Forms/CodeForm.cs @@ -59,7 +59,7 @@ protected override void OnFormClosed(FormClosedEventArgs e) } } - class RtfFormatter : IFormatter + internal class RtfFormatter : IFormatter { private readonly RtfBuilder builder = new RtfBuilder(RtfFont.Consolas, 20); From 3ce6dd723ae1c5656418af39f7efaa70e6dc3e6b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 11:21:24 +0100 Subject: [PATCH 267/777] Register window. --- ReClass.NET/Forms/InputCorrelatorForm.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ReClass.NET/Forms/InputCorrelatorForm.cs b/ReClass.NET/Forms/InputCorrelatorForm.cs index 887d5e70..0220ca81 100644 --- a/ReClass.NET/Forms/InputCorrelatorForm.cs +++ b/ReClass.NET/Forms/InputCorrelatorForm.cs @@ -6,6 +6,7 @@ using System.Windows.Forms; using ReClassNET.Input; using ReClassNET.MemoryScanner; +using ReClassNET.UI; namespace ReClassNET.Forms { @@ -45,6 +46,20 @@ public InputCorrelatorForm(ScannerForm sf) infoLabel.Text = string.Empty; } + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + #region Event Handler private async void InputCorrelatorForm_FormClosing(object sender, FormClosingEventArgs e) From aa1db5e9d2e55e057220a5651a2f4271521875b8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 13:06:04 +0100 Subject: [PATCH 268/777] Implemented feature request from #25. --- ReClass.NET/Forms/MainForm.Designer.cs | 39 +++-- ReClass.NET/Forms/MainForm.cs | 5 + .../Forms/NamedAddressesForm.Designer.cs | 138 ++++++++++++++++++ ReClass.NET/Forms/NamedAddressesForm.cs | 107 ++++++++++++++ ReClass.NET/Forms/NamedAddressesForm.resx | 120 +++++++++++++++ ReClass.NET/Memory/RemoteProcess.cs | 10 +- ReClass.NET/Properties/Resources.Designer.cs | 12 +- ReClass.NET/Properties/Resources.resx | 3 + ReClass.NET/ReClass.NET.csproj | 14 ++ .../Resources/Images/B16x16_Button_Remove.png | Bin 0 -> 678 bytes ReClass.NET/UI/BindingDisplayWrapper.cs | 21 +++ 11 files changed, 453 insertions(+), 16 deletions(-) create mode 100644 ReClass.NET/Forms/NamedAddressesForm.Designer.cs create mode 100644 ReClass.NET/Forms/NamedAddressesForm.cs create mode 100644 ReClass.NET/Forms/NamedAddressesForm.resx create mode 100644 ReClass.NET/Resources/Images/B16x16_Button_Remove.png create mode 100644 ReClass.NET/UI/BindingDisplayWrapper.cs diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 8febcf52..8caf3da7 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -132,6 +132,7 @@ private void InitializeComponent() this.resumeProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.suspendProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.terminateProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.namedAddressesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.cleanUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); @@ -1071,6 +1072,7 @@ private void InitializeComponent() this.processToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.processInformationsToolStripMenuItem, this.memorySearcherToolStripMenuItem, + this.namedAddressesToolStripMenuItem, this.toolStripSeparator17, this.loadSymbolToolStripMenuItem, this.loadSymbolsToolStripMenuItem, @@ -1086,28 +1088,28 @@ private void InitializeComponent() // this.processInformationsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; this.processInformationsToolStripMenuItem.Name = "processInformationsToolStripMenuItem"; - this.processInformationsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.processInformationsToolStripMenuItem.Text = "Process Informations"; + this.processInformationsToolStripMenuItem.Size = new System.Drawing.Size(194, 22); + this.processInformationsToolStripMenuItem.Text = "Process Informations..."; this.processInformationsToolStripMenuItem.Click += new System.EventHandler(this.memoryViewerToolStripMenuItem_Click); // // memorySearcherToolStripMenuItem // this.memorySearcherToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; this.memorySearcherToolStripMenuItem.Name = "memorySearcherToolStripMenuItem"; - this.memorySearcherToolStripMenuItem.Size = new System.Drawing.Size(185, 22); - this.memorySearcherToolStripMenuItem.Text = "Memory Searcher"; + this.memorySearcherToolStripMenuItem.Size = new System.Drawing.Size(194, 22); + this.memorySearcherToolStripMenuItem.Text = "Memory Searcher..."; this.memorySearcherToolStripMenuItem.Click += new System.EventHandler(this.memorySearcherToolStripMenuItem_Click); // // toolStripSeparator17 // this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(182, 6); + this.toolStripSeparator17.Size = new System.Drawing.Size(191, 6); // // loadSymbolToolStripMenuItem // this.loadSymbolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Pdb; this.loadSymbolToolStripMenuItem.Name = "loadSymbolToolStripMenuItem"; - this.loadSymbolToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.loadSymbolToolStripMenuItem.Size = new System.Drawing.Size(194, 22); this.loadSymbolToolStripMenuItem.Text = "Load Symbol..."; this.loadSymbolToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolToolStripMenuItem_Click); // @@ -1115,20 +1117,20 @@ private void InitializeComponent() // this.loadSymbolsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("loadSymbolsToolStripMenuItem.Image"))); this.loadSymbolsToolStripMenuItem.Name = "loadSymbolsToolStripMenuItem"; - this.loadSymbolsToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.loadSymbolsToolStripMenuItem.Size = new System.Drawing.Size(194, 22); this.loadSymbolsToolStripMenuItem.Text = "Load all Symbols"; this.loadSymbolsToolStripMenuItem.Click += new System.EventHandler(this.loadSymbolsToolStripMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(182, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(191, 6); // // resumeProcessToolStripMenuItem // this.resumeProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Play; this.resumeProcessToolStripMenuItem.Name = "resumeProcessToolStripMenuItem"; - this.resumeProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.resumeProcessToolStripMenuItem.Size = new System.Drawing.Size(194, 22); this.resumeProcessToolStripMenuItem.Text = "Resume"; this.resumeProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); // @@ -1136,7 +1138,7 @@ private void InitializeComponent() // this.suspendProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Pause; this.suspendProcessToolStripMenuItem.Name = "suspendProcessToolStripMenuItem"; - this.suspendProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.suspendProcessToolStripMenuItem.Size = new System.Drawing.Size(194, 22); this.suspendProcessToolStripMenuItem.Text = "Suspend"; this.suspendProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); // @@ -1144,10 +1146,18 @@ private void InitializeComponent() // this.terminateProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Control_Stop; this.terminateProcessToolStripMenuItem.Name = "terminateProcessToolStripMenuItem"; - this.terminateProcessToolStripMenuItem.Size = new System.Drawing.Size(185, 22); + this.terminateProcessToolStripMenuItem.Size = new System.Drawing.Size(194, 22); this.terminateProcessToolStripMenuItem.Text = "Kill"; this.terminateProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); // + // namedAddressesToolStripMenuItem + // + this.namedAddressesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; + this.namedAddressesToolStripMenuItem.Name = "namedAddressesToolStripMenuItem"; + this.namedAddressesToolStripMenuItem.Size = new System.Drawing.Size(194, 22); + this.namedAddressesToolStripMenuItem.Text = "Named Addresses..."; + this.namedAddressesToolStripMenuItem.Click += new System.EventHandler(this.namedAddressesToolStripMenuItem_Click); + // // projectToolStripMenuItem // this.projectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1177,7 +1187,7 @@ private void InitializeComponent() this.generateCppCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Cpp; this.generateCppCodeToolStripMenuItem.Name = "generateCppCodeToolStripMenuItem"; this.generateCppCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.generateCppCodeToolStripMenuItem.Text = "Generate C++ Code"; + this.generateCppCodeToolStripMenuItem.Text = "Generate C++ Code..."; this.generateCppCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCppCodeToolStripMenuItem_Click); // // generateCSharpCodeToolStripMenuItem @@ -1185,7 +1195,7 @@ private void InitializeComponent() this.generateCSharpCodeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Code_Csharp; this.generateCSharpCodeToolStripMenuItem.Name = "generateCSharpCodeToolStripMenuItem"; this.generateCSharpCodeToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.generateCSharpCodeToolStripMenuItem.Text = "Generate C# Code"; + this.generateCSharpCodeToolStripMenuItem.Text = "Generate C# Code..."; this.generateCSharpCodeToolStripMenuItem.Click += new System.EventHandler(this.generateCSharpCodeToolStripMenuItem_Click); // // helpToolStripMenuItem @@ -1200,7 +1210,7 @@ private void InitializeComponent() // this.aboutToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Information; this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(116, 22); + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.aboutToolStripMenuItem.Text = "About..."; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // @@ -1348,6 +1358,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; private System.Windows.Forms.ToolStripSplitButton attachToProcessToolStripSplitButton; + private System.Windows.Forms.ToolStripMenuItem namedAddressesToolStripMenuItem; } } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 8085e282..7237a8cd 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -307,6 +307,11 @@ private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) new ScannerForm().Show(); } + private void namedAddressesToolStripMenuItem_Click(object sender, EventArgs e) + { + new NamedAddressesForm(Program.RemoteProcess).Show(); + } + private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) diff --git a/ReClass.NET/Forms/NamedAddressesForm.Designer.cs b/ReClass.NET/Forms/NamedAddressesForm.Designer.cs new file mode 100644 index 00000000..ed7e807c --- /dev/null +++ b/ReClass.NET/Forms/NamedAddressesForm.Designer.cs @@ -0,0 +1,138 @@ +namespace ReClassNET.Forms +{ + partial class NamedAddressesForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.addressTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.nameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.namedAddressesListBox = new System.Windows.Forms.ListBox(); + this.removeAddressIconButton = new ReClassNET.UI.IconButton(); + this.addAddressIconButton = new ReClassNET.UI.IconButton(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.SuspendLayout(); + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(429, 48); + this.bannerBox.TabIndex = 10; + this.bannerBox.Text = "Give special memory addresses meaningfull names."; + this.bannerBox.Title = "Named Addresses"; + // + // addressTextBox + // + this.addressTextBox.Location = new System.Drawing.Point(13, 55); + this.addressTextBox.Name = "addressTextBox"; + this.addressTextBox.PlaceholderText = "Address"; + this.addressTextBox.Size = new System.Drawing.Size(154, 20); + this.addressTextBox.TabIndex = 1; + this.addressTextBox.TextChanged += new System.EventHandler(this.InputTextBox_TextChanged); + // + // nameTextBox + // + this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.nameTextBox.Location = new System.Drawing.Point(173, 55); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.PlaceholderText = "Name"; + this.nameTextBox.Size = new System.Drawing.Size(190, 20); + this.nameTextBox.TabIndex = 2; + this.nameTextBox.TextChanged += new System.EventHandler(this.InputTextBox_TextChanged); + // + // namedAddressesListBox + // + this.namedAddressesListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.namedAddressesListBox.FormattingEnabled = true; + this.namedAddressesListBox.Location = new System.Drawing.Point(13, 81); + this.namedAddressesListBox.Name = "namedAddressesListBox"; + this.namedAddressesListBox.Size = new System.Drawing.Size(404, 186); + this.namedAddressesListBox.TabIndex = 0; + this.namedAddressesListBox.SelectedIndexChanged += new System.EventHandler(this.namedAddressesListBox_SelectedIndexChanged); + // + // removeAddressIconButton + // + this.removeAddressIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.removeAddressIconButton.Enabled = false; + this.removeAddressIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Remove; + this.removeAddressIconButton.Location = new System.Drawing.Point(394, 54); + this.removeAddressIconButton.Name = "removeAddressIconButton"; + this.removeAddressIconButton.Pressed = false; + this.removeAddressIconButton.Selected = false; + this.removeAddressIconButton.Size = new System.Drawing.Size(23, 22); + this.removeAddressIconButton.TabIndex = 4; + this.removeAddressIconButton.Click += new System.EventHandler(this.removeAddressIconButton_Click); + // + // addAddressIconButton + // + this.addAddressIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.addAddressIconButton.Enabled = false; + this.addAddressIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add; + this.addAddressIconButton.Location = new System.Drawing.Point(369, 54); + this.addAddressIconButton.Name = "addAddressIconButton"; + this.addAddressIconButton.Pressed = false; + this.addAddressIconButton.Selected = false; + this.addAddressIconButton.Size = new System.Drawing.Size(23, 22); + this.addAddressIconButton.TabIndex = 3; + this.addAddressIconButton.Click += new System.EventHandler(this.addAddressIconButton_Click); + // + // NamedAddressesForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(429, 279); + this.Controls.Add(this.addAddressIconButton); + this.Controls.Add(this.removeAddressIconButton); + this.Controls.Add(this.namedAddressesListBox); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.addressTextBox); + this.Controls.Add(this.bannerBox); + this.MinimumSize = new System.Drawing.Size(445, 317); + this.Name = "NamedAddressesForm"; + this.Text = "ReClass.NET - Named Addresses"; + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private UI.BannerBox bannerBox; + private UI.PlaceholderTextBox addressTextBox; + private UI.PlaceholderTextBox nameTextBox; + private System.Windows.Forms.ListBox namedAddressesListBox; + private UI.IconButton removeAddressIconButton; + private UI.IconButton addAddressIconButton; + } +} \ No newline at end of file diff --git a/ReClass.NET/Forms/NamedAddressesForm.cs b/ReClass.NET/Forms/NamedAddressesForm.cs new file mode 100644 index 00000000..7bb5ec8e --- /dev/null +++ b/ReClass.NET/Forms/NamedAddressesForm.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Windows.Forms; +using ReClassNET.Memory; +using ReClassNET.UI; +using ReClassNET.Util; + +namespace ReClassNET.Forms +{ + public partial class NamedAddressesForm : IconForm + { + private readonly RemoteProcess process; + + public NamedAddressesForm(RemoteProcess process) + { + Contract.Requires(process != null); + + this.process = process; + + InitializeComponent(); + + DisplayNamedAddresses(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + + #region Event Handler + + private void InputTextBox_TextChanged(object sender, EventArgs e) + { + addAddressIconButton.Enabled = IsValidInput(); + } + + private void namedAddressesListBox_SelectedIndexChanged(object sender, EventArgs e) + { + removeAddressIconButton.Enabled = namedAddressesListBox.SelectedIndex != -1; + } + + private void addAddressIconButton_Click(object sender, EventArgs e) + { + if (!IsValidInput()) + { + return; + } + + var address = process.ParseAddress(addressTextBox.Text.Trim()); + var name = nameTextBox.Text.Trim(); + + process.NamedAddresses[address] = name; + + addressTextBox.Text = nameTextBox.Text = null; + + DisplayNamedAddresses(); + } + + private void removeAddressIconButton_Click(object sender, EventArgs e) + { + if (namedAddressesListBox.SelectedItem is BindingDisplayWrapper> namedAddress) + { + process.NamedAddresses.Remove(namedAddress.Value.Key); + + DisplayNamedAddresses(); + } + } + + #endregion + + private void DisplayNamedAddresses() + { + namedAddressesListBox.DataSource = process.NamedAddresses + .Select(kv => new BindingDisplayWrapper>(kv, v => $"0x{v.Key.ToString(Constants.StringHexFormat)}: {v.Value}")) + .ToList(); + + namedAddressesListBox_SelectedIndexChanged(null, null); + } + + private bool IsValidInput() + { + try + { + var address = process.ParseAddress(addressTextBox.Text.Trim()); + var name = nameTextBox.Text.Trim(); + + return !address.IsNull() && !string.IsNullOrEmpty(name); + } + catch + { + return false; + } + } + } +} diff --git a/ReClass.NET/Forms/NamedAddressesForm.resx b/ReClass.NET/Forms/NamedAddressesForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/ReClass.NET/Forms/NamedAddressesForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 3b089e23..0a7ec19c 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -81,6 +81,9 @@ public IEnumerable
Sections } } + /// A map of named addresses. + public Dictionary NamedAddresses { get; } = new Dictionary(); + public bool IsValid => process != null && coreFunctions.IsProcessValid(handle); public RemoteProcess(CoreFunctionsManager coreFunctions) @@ -605,6 +608,11 @@ public Module GetModuleByName(string name) /// The named address or null if no mapping exists. public string GetNamedAddress(IntPtr address) { + if (NamedAddresses.TryGetValue(address, out var namedAddress)) + { + return namedAddress; + } + var section = GetSectionToPointer(address); if (section != null) { @@ -613,7 +621,7 @@ public string GetNamedAddress(IntPtr address) // Code and Data sections belong to a module. return $"<{section.Category}>{section.ModuleName}.{address.ToString("X")}"; } - else if (section.Category == SectionCategory.HEAP) + if (section.Category == SectionCategory.HEAP) { return $"{address.ToString("X")}"; } diff --git a/ReClass.NET/Properties/Resources.Designer.cs b/ReClass.NET/Properties/Resources.Designer.cs index d1c33bf3..acde293f 100644 --- a/ReClass.NET/Properties/Resources.Designer.cs +++ b/ReClass.NET/Properties/Resources.Designer.cs @@ -510,6 +510,16 @@ internal static System.Drawing.Bitmap B16x16_Button_Pointer_Array { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Remove { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Remove", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. /// @@ -1311,7 +1321,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Sucht eine lokalisierte Zeichenfolge, die 2017/11/07 21:15:06 + /// Sucht eine lokalisierte Zeichenfolge, die 2018/01/18 10:06:36 /// ähnelt. /// internal static string BuildDate { diff --git a/ReClass.NET/Properties/Resources.resx b/ReClass.NET/Properties/Resources.resx index bb4f1131..ec7ad954 100644 --- a/ReClass.NET/Properties/Resources.resx +++ b/ReClass.NET/Properties/Resources.resx @@ -499,4 +499,7 @@ ..\Resources\Images\B16x16_Button_Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Button_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 36780519..35ce0ffa 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -167,6 +167,12 @@ + + Form + + + NamedAddressesForm.cs + Form @@ -263,6 +269,7 @@ AboutForm.cs + @@ -483,8 +490,12 @@ AboutForm.cs + + NamedAddressesForm.cs + ClassSelectionForm.cs + Designer CodeForm.cs @@ -943,6 +954,9 @@ + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" diff --git a/ReClass.NET/Resources/Images/B16x16_Button_Remove.png b/ReClass.NET/Resources/Images/B16x16_Button_Remove.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc50e83551264c4604e376802b531e31c40a024 GIT binary patch literal 678 zcmV;X0$KfuP)+f3oIcR<9S%P!;C)R2eg+CAmqhhI>bBSc9qD5>k8&{dg3ERvELjvga@67 zyctDgWC;A-4$K-#@v4wupR2`0Qo%AjT~6@}w>z*j^%l{-JBYU15p6z)A2*w@INS%1 z$$(L1HvdeXNvsmg=yZY@?B=ewV~KGgdhrZ=b_@KrYJ@LX5NV(hww^%v-VMwhB{6(x zpZl?Fk02q4!SsBs8H=v5_>Un64ewbaf_1u8;ZBkWcU{5DybKITGw6ii19gN6bX`TX zvl%{XCB7C(lV+ik1aGT>$5MrdL^_iYFy-1{*Ei-MufR)p&f2%aiiS1@0yg1@N|{o*Yvf{79p9Nf!}N_OE(wGrNi^YMJDI)+C%TbE(> zcR1-X4N7+l2gK=SC$W=xkiVVl7j5QxbJLif>{N4i<_6(kxA9-|6CKjdxk+*x{r~^~ M07*qoM6N<$g5!QUNdN!< literal 0 HcmV?d00001 diff --git a/ReClass.NET/UI/BindingDisplayWrapper.cs b/ReClass.NET/UI/BindingDisplayWrapper.cs new file mode 100644 index 00000000..4b00997b --- /dev/null +++ b/ReClass.NET/UI/BindingDisplayWrapper.cs @@ -0,0 +1,21 @@ +using System; +using System.Diagnostics.Contracts; + +namespace ReClassNET.UI +{ + public class BindingDisplayWrapper + { + public T Value { get; } + private readonly Func toString; + + public BindingDisplayWrapper(T value, Func toString) + { + Contract.Requires(toString != null); + + Value = value; + this.toString = toString; + } + + public override string ToString() => toString(Value); + } +} From 4601141e633d6dfe7ef08f059e144d99b68adfab Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 18 Jan 2018 15:41:03 +0100 Subject: [PATCH 269/777] Changed name of constant. --- ReClass.NET/Constants.cs | 4 +- .../DataExchange/Scanner/ReClassScanFile.cs | 2 +- ReClass.NET/Forms/FoundCodeForm.cs | 60 +++++++++---------- ReClass.NET/Forms/NamedAddressesForm.cs | 2 +- ReClass.NET/Forms/ProcessInfoForm.cs | 8 +-- ReClass.NET/Forms/ScannerForm.cs | 4 +- ReClass.NET/Memory/Disassembler.cs | 2 +- ReClass.NET/MemoryScanner/MemoryRecord.cs | 2 +- ReClass.NET/Nodes/BaseFunctionNode.cs | 2 +- ReClass.NET/Nodes/BaseNode.cs | 2 +- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/ReClass.NET/Constants.cs b/ReClass.NET/Constants.cs index 2d4236eb..e1abd568 100644 --- a/ReClass.NET/Constants.cs +++ b/ReClass.NET/Constants.cs @@ -21,11 +21,11 @@ public class Constants #if RECLASSNET64 public const string Platform = "x64"; - public const string StringHexFormat = "X016"; + public const string AddressHexFormat = "X016"; #else public const string Platform = "x86"; - public const string StringHexFormat = "X08"; + public const string AddressHexFormat = "X08"; #endif public const string SettingsFile = "settings.xml"; diff --git a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs index 821d4b28..b86fa626 100644 --- a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs +++ b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs @@ -141,7 +141,7 @@ public void Save(IEnumerable records, string filePath, ILogger log XmlRecordElement, new XAttribute(XmlValueTypeAttribute, r.ValueType.ToString()), new XAttribute(XmlDescriptionAttribute, r.Description ?? string.Empty), - new XAttribute(XmlAddressAttribute, r.AddressOrOffset.ToString(Constants.StringHexFormat)) + new XAttribute(XmlAddressAttribute, r.AddressOrOffset.ToString(Constants.AddressHexFormat)) ); if (r.IsRelativeAddress) { diff --git a/ReClass.NET/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs index 0652b95d..44acffee 100644 --- a/ReClass.NET/Forms/FoundCodeForm.cs +++ b/ReClass.NET/Forms/FoundCodeForm.cs @@ -43,11 +43,11 @@ public FoundCodeForm(RemoteProcess process, IntPtr address, HardwareBreakpointTr if (trigger == HardwareBreakpointTrigger.Write) { - Text = "Find out what writes to " + address.ToString(Constants.StringHexFormat); + Text = "Find out what writes to " + address.ToString(Constants.AddressHexFormat); } else { - Text = "Find out what accesses " + address.ToString(Constants.StringHexFormat); + Text = "Find out what accesses " + address.ToString(Constants.AddressHexFormat); } bannerBox.Text = Text; @@ -88,7 +88,7 @@ private void foundCodeDataGridView_SelectionChanged(object sender, EventArgs e) for (var i = 0; i < 5; ++i) { - var code = $"{info.Instructions[i].Address.ToString(Constants.StringHexFormat)} - {info.Instructions[i].Instruction}"; + var code = $"{info.Instructions[i].Address.ToString(Constants.AddressHexFormat)} - {info.Instructions[i].Instruction}"; if (i == 2) { sb.AppendLine(code + " <<<"); @@ -102,34 +102,34 @@ private void foundCodeDataGridView_SelectionChanged(object sender, EventArgs e) sb.AppendLine(); #if RECLASSNET64 - sb.AppendLine($"RAX = {info.DebugInfo.Registers.Rax.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RBX = {info.DebugInfo.Registers.Rbx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RCX = {info.DebugInfo.Registers.Rcx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RDX = {info.DebugInfo.Registers.Rdx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RDI = {info.DebugInfo.Registers.Rdi.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RSI = {info.DebugInfo.Registers.Rsi.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RSP = {info.DebugInfo.Registers.Rsp.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RBP = {info.DebugInfo.Registers.Rbp.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"RIP = {info.DebugInfo.Registers.Rip.ToString(Constants.StringHexFormat)}"); - - sb.AppendLine($"R8 = {info.DebugInfo.Registers.R8.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R9 = {info.DebugInfo.Registers.R9.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R10 = {info.DebugInfo.Registers.R10.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R11 = {info.DebugInfo.Registers.R11.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R12 = {info.DebugInfo.Registers.R12.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R13 = {info.DebugInfo.Registers.R13.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"R14 = {info.DebugInfo.Registers.R14.ToString(Constants.StringHexFormat)}"); - sb.Append($"R15 = {info.DebugInfo.Registers.R15.ToString(Constants.StringHexFormat)}"); + sb.AppendLine($"RAX = {info.DebugInfo.Registers.Rax.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RBX = {info.DebugInfo.Registers.Rbx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RCX = {info.DebugInfo.Registers.Rcx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RDX = {info.DebugInfo.Registers.Rdx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RDI = {info.DebugInfo.Registers.Rdi.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RSI = {info.DebugInfo.Registers.Rsi.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RSP = {info.DebugInfo.Registers.Rsp.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RBP = {info.DebugInfo.Registers.Rbp.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"RIP = {info.DebugInfo.Registers.Rip.ToString(Constants.AddressHexFormat)}"); + + sb.AppendLine($"R8 = {info.DebugInfo.Registers.R8.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R9 = {info.DebugInfo.Registers.R9.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R10 = {info.DebugInfo.Registers.R10.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R11 = {info.DebugInfo.Registers.R11.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R12 = {info.DebugInfo.Registers.R12.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R13 = {info.DebugInfo.Registers.R13.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"R14 = {info.DebugInfo.Registers.R14.ToString(Constants.AddressHexFormat)}"); + sb.Append($"R15 = {info.DebugInfo.Registers.R15.ToString(Constants.AddressHexFormat)}"); #else - sb.AppendLine($"EAX = {info.DebugInfo.Registers.Eax.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"EBX = {info.DebugInfo.Registers.Ebx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"ECX = {info.DebugInfo.Registers.Ecx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"EDX = {info.DebugInfo.Registers.Edx.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"EDI = {info.DebugInfo.Registers.Edi.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"ESI = {info.DebugInfo.Registers.Esi.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"ESP = {info.DebugInfo.Registers.Esp.ToString(Constants.StringHexFormat)}"); - sb.AppendLine($"EBP = {info.DebugInfo.Registers.Ebp.ToString(Constants.StringHexFormat)}"); - sb.Append($"EIP = {info.DebugInfo.Registers.Eip.ToString(Constants.StringHexFormat)}"); + sb.AppendLine($"EAX = {info.DebugInfo.Registers.Eax.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"EBX = {info.DebugInfo.Registers.Ebx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"ECX = {info.DebugInfo.Registers.Ecx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"EDX = {info.DebugInfo.Registers.Edx.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"EDI = {info.DebugInfo.Registers.Edi.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"ESI = {info.DebugInfo.Registers.Esi.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"ESP = {info.DebugInfo.Registers.Esp.ToString(Constants.AddressHexFormat)}"); + sb.AppendLine($"EBP = {info.DebugInfo.Registers.Ebp.ToString(Constants.AddressHexFormat)}"); + sb.Append($"EIP = {info.DebugInfo.Registers.Eip.ToString(Constants.AddressHexFormat)}"); #endif infoTextBox.Text = sb.ToString(); diff --git a/ReClass.NET/Forms/NamedAddressesForm.cs b/ReClass.NET/Forms/NamedAddressesForm.cs index 7bb5ec8e..3b057bdb 100644 --- a/ReClass.NET/Forms/NamedAddressesForm.cs +++ b/ReClass.NET/Forms/NamedAddressesForm.cs @@ -83,7 +83,7 @@ private void removeAddressIconButton_Click(object sender, EventArgs e) private void DisplayNamedAddresses() { namedAddressesListBox.DataSource = process.NamedAddresses - .Select(kv => new BindingDisplayWrapper>(kv, v => $"0x{v.Key.ToString(Constants.StringHexFormat)}: {v.Value}")) + .Select(kv => new BindingDisplayWrapper>(kv, v => $"0x{v.Key.ToString(Constants.AddressHexFormat)}: {v.Value}")) .ToList(); namedAddressesListBox_SelectedIndexChanged(null, null); diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index d405f05e..88bb25f7 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -82,8 +82,8 @@ await Task.Run(() => delegate (Section section) { var row = sections.NewRow(); - row["address"] = section.Start.ToString(Constants.StringHexFormat); - row["size"] = section.Size.ToString(Constants.StringHexFormat); + row["address"] = section.Start.ToString(Constants.AddressHexFormat); + row["size"] = section.Size.ToString(Constants.AddressHexFormat); row["name"] = section.Name; row["protection"] = section.Protection.ToString(); row["type"] = section.Type.ToString(); @@ -96,8 +96,8 @@ await Task.Run(() => var row = modules.NewRow(); row["icon"] = NativeMethods.GetIconForFile(module.Path); row["name"] = module.Name; - row["address"] = module.Start.ToString(Constants.StringHexFormat); - row["size"] = module.Size.ToString(Constants.StringHexFormat); + row["address"] = module.Start.ToString(Constants.AddressHexFormat); + row["size"] = module.Size.ToString(Constants.AddressHexFormat); row["path"] = module.Path; row["module"] = module; modules.Rows.Add(row); diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 4f4f909a..189f24d0 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -685,8 +685,8 @@ private void SetGuiFromSettings(ScanSettings settings) valueTypeComboBox.SelectedValue = settings.ValueType; - startAddressTextBox.Text = settings.StartAddress.ToString(Constants.StringHexFormat); - stopAddressTextBox.Text = settings.StopAddress.ToString(Constants.StringHexFormat); + startAddressTextBox.Text = settings.StartAddress.ToString(Constants.AddressHexFormat); + stopAddressTextBox.Text = settings.StopAddress.ToString(Constants.AddressHexFormat); fastScanCheckBox.Checked = settings.EnableFastScan; fastScanAlignmentTextBox.Text = Math.Max(1, settings.FastScanAlignment).ToString(); diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 89b018e9..1276d3f3 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -277,6 +277,6 @@ public DisassembledInstruction(ref InstructionData data) Instruction = data.Instruction; } - public override string ToString() => $"{Address.ToString(Constants.StringHexFormat)} - {Instruction}"; + public override string ToString() => $"{Address.ToString(Constants.AddressHexFormat)} - {Instruction}"; } } diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index 5047887f..c6a1e90a 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -34,7 +34,7 @@ public IntPtr AddressOrOffset public IntPtr RealAddress { get; private set; } - public string AddressStr => RealAddress.ToString(Constants.StringHexFormat); + public string AddressStr => RealAddress.ToString(Constants.AddressHexFormat); public string ModuleName { diff --git a/ReClass.NET/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs index 0da3f282..14ca74a4 100644 --- a/ReClass.NET/Nodes/BaseFunctionNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionNode.cs @@ -67,7 +67,7 @@ protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out in instructions.Add(new FunctionNodeInstruction { - Address = instruction.Address.ToString(Constants.StringHexFormat), + Address = instruction.Address.ToString(Constants.AddressHexFormat), Data = string.Join(" ", instruction.Data.Take(instruction.Length).Select(b => $"{b:X2}")), Instruction = instruction.Instruction }); diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index ef246ffc..374a34d7 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -249,7 +249,7 @@ protected int AddAddressOffset(ViewInfo view, int x, int y) if (view.Settings.ShowNodeAddress) { - x = AddText(view, x, y, view.Settings.AddressColor, HotSpot.AddressId, view.Address.Add(Offset).ToString(Constants.StringHexFormat)) + view.Font.Width; + x = AddText(view, x, y, view.Settings.AddressColor, HotSpot.AddressId, view.Address.Add(Offset).ToString(Constants.AddressHexFormat)) + view.Font.Width; } return x; From a9aa577e5a6ff550fd23b6d81ec91dfa1dd103b4 Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Tue, 13 Feb 2018 12:32:23 +1000 Subject: [PATCH 270/777] Made error dialog for native core more understandable, also --- NativeCore/Windows/NativeCore.vcxproj | 2 +- ReClass.NET/Core/InternalCoreFunctions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index fea54b2e..f9167ca8 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -22,7 +22,7 @@ {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} Win32Proj NativeCore - 10.0.14393.0 + 10.0.16299.0 diff --git a/ReClass.NET/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs index 3112fa54..26bd1640 100644 --- a/ReClass.NET/Core/InternalCoreFunctions.cs +++ b/ReClass.NET/Core/InternalCoreFunctions.cs @@ -51,7 +51,7 @@ public static InternalCoreFunctions Create() var handle = NativeMethods.LoadLibrary(libraryPath); if (handle.IsNull()) { - throw new FileNotFoundException(libraryPath); + throw new FileNotFoundException($"Failed to load native core functions! Couldnt find at location {libraryPath}"); } return new InternalCoreFunctions(handle); From bf6b42c0ea77b5251e785d45fe9e5db7287ce216 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 25 Feb 2018 10:22:17 +0100 Subject: [PATCH 271/777] Fixed VMT detection (fixed #46). --- ReClass.NET/Memory/NodeDissector.cs | 15 ++++----------- ReClass.NET/Memory/UnionDataType.cs | 8 ++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 30b60ed9..e23c3a8d 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -123,17 +123,10 @@ private static Type GuessPointerType(IntPtr address, MemoryBuffer memory) if (section.Category == SectionCategory.DATA || section.Category == SectionCategory.HEAP) // If the section contains data, it is at least a pointer to a class or something. { // Check if it is a vtable. Check if the first 3 values are pointers to a code section. - bool valid = true; - for (var i = 0; i < 3; ++i) - { - var pointee = memory.Process.ReadRemoteIntPtr(address); - if (memory.Process.GetSectionToPointer(pointee)?.Category != SectionCategory.CODE) - { - valid = false; - break; - } - } - if (valid) + var possibleVmt = memory.Process.ReadRemoteObject(address); + if (memory.Process.GetSectionToPointer(possibleVmt.Pointer1)?.Category == SectionCategory.CODE + && memory.Process.GetSectionToPointer(possibleVmt.Pointer2)?.Category == SectionCategory.CODE + && memory.Process.GetSectionToPointer(possibleVmt.Pointer3)?.Category == SectionCategory.CODE) { return typeof(VTableNode); } diff --git a/ReClass.NET/Memory/UnionDataType.cs b/ReClass.NET/Memory/UnionDataType.cs index ad6cf98e..3c53b48b 100644 --- a/ReClass.NET/Memory/UnionDataType.cs +++ b/ReClass.NET/Memory/UnionDataType.cs @@ -69,4 +69,12 @@ public struct UInt64FloatDoubleData [FieldOffset(0)] public double DoubleValue; } + + [StructLayout(LayoutKind.Sequential)] + public struct ThreePointersData + { + public IntPtr Pointer1; + public IntPtr Pointer2; + public IntPtr Pointer3; + } } From edd79f3c7bb7b21c26e988f27a9a767d0c37d30c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 2 Mar 2018 15:32:06 +0100 Subject: [PATCH 272/777] Fixed crash after right click. (#48) --- ReClass.NET/UI/MemoryViewControl.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index c7ea8def..3c0418db 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -250,8 +250,6 @@ protected override void OnMouseClick(MouseEventArgs e) bool invalidate = false; - editBox.Visible = false; - foreach (var hotSpot in hotSpots) { if (hotSpot.Rect.Contains(e.Location)) @@ -434,6 +432,8 @@ protected override void OnMouseClick(MouseEventArgs e) } } + editBox.Visible = false; + if (invalidate) { Invalidate(); From 7b6c598a094e1e7723307cc6a974a3983080358a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 15:33:15 +0100 Subject: [PATCH 273/777] Moved extensions. --- .../Extension.BinaryReaderWriter.cs | 0 .../{Util => Extensions}/Extension.Color.cs | 0 .../Extension.DataGridView.cs | 0 .../Extension.Dictionary.cs | 0 .../Extension.Encoding.cs | 0 .../Extension.FloatingPoint.cs | 0 .../Extension.Graphics.cs | 0 .../{Util => Extensions}/Extension.IntPtr.cs | 0 .../{Util => Extensions}/Extension.Linq.cs | 0 .../Extension.RichTextBox.cs | 0 .../{Util => Extensions}/Extension.Size.cs | 0 .../{Util => Extensions}/Extension.String.cs | 0 .../Extension.StringReader.cs | 0 .../{Util => Extensions}/Extensions.cs | 0 ReClass.NET/ReClass.NET.csproj | 28 +++++++++---------- 15 files changed, 14 insertions(+), 14 deletions(-) rename ReClass.NET/{Util => Extensions}/Extension.BinaryReaderWriter.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Color.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.DataGridView.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Dictionary.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Encoding.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.FloatingPoint.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Graphics.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.IntPtr.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Linq.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.RichTextBox.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.Size.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.String.cs (100%) rename ReClass.NET/{Util => Extensions}/Extension.StringReader.cs (100%) rename ReClass.NET/{Util => Extensions}/Extensions.cs (100%) diff --git a/ReClass.NET/Util/Extension.BinaryReaderWriter.cs b/ReClass.NET/Extensions/Extension.BinaryReaderWriter.cs similarity index 100% rename from ReClass.NET/Util/Extension.BinaryReaderWriter.cs rename to ReClass.NET/Extensions/Extension.BinaryReaderWriter.cs diff --git a/ReClass.NET/Util/Extension.Color.cs b/ReClass.NET/Extensions/Extension.Color.cs similarity index 100% rename from ReClass.NET/Util/Extension.Color.cs rename to ReClass.NET/Extensions/Extension.Color.cs diff --git a/ReClass.NET/Util/Extension.DataGridView.cs b/ReClass.NET/Extensions/Extension.DataGridView.cs similarity index 100% rename from ReClass.NET/Util/Extension.DataGridView.cs rename to ReClass.NET/Extensions/Extension.DataGridView.cs diff --git a/ReClass.NET/Util/Extension.Dictionary.cs b/ReClass.NET/Extensions/Extension.Dictionary.cs similarity index 100% rename from ReClass.NET/Util/Extension.Dictionary.cs rename to ReClass.NET/Extensions/Extension.Dictionary.cs diff --git a/ReClass.NET/Util/Extension.Encoding.cs b/ReClass.NET/Extensions/Extension.Encoding.cs similarity index 100% rename from ReClass.NET/Util/Extension.Encoding.cs rename to ReClass.NET/Extensions/Extension.Encoding.cs diff --git a/ReClass.NET/Util/Extension.FloatingPoint.cs b/ReClass.NET/Extensions/Extension.FloatingPoint.cs similarity index 100% rename from ReClass.NET/Util/Extension.FloatingPoint.cs rename to ReClass.NET/Extensions/Extension.FloatingPoint.cs diff --git a/ReClass.NET/Util/Extension.Graphics.cs b/ReClass.NET/Extensions/Extension.Graphics.cs similarity index 100% rename from ReClass.NET/Util/Extension.Graphics.cs rename to ReClass.NET/Extensions/Extension.Graphics.cs diff --git a/ReClass.NET/Util/Extension.IntPtr.cs b/ReClass.NET/Extensions/Extension.IntPtr.cs similarity index 100% rename from ReClass.NET/Util/Extension.IntPtr.cs rename to ReClass.NET/Extensions/Extension.IntPtr.cs diff --git a/ReClass.NET/Util/Extension.Linq.cs b/ReClass.NET/Extensions/Extension.Linq.cs similarity index 100% rename from ReClass.NET/Util/Extension.Linq.cs rename to ReClass.NET/Extensions/Extension.Linq.cs diff --git a/ReClass.NET/Util/Extension.RichTextBox.cs b/ReClass.NET/Extensions/Extension.RichTextBox.cs similarity index 100% rename from ReClass.NET/Util/Extension.RichTextBox.cs rename to ReClass.NET/Extensions/Extension.RichTextBox.cs diff --git a/ReClass.NET/Util/Extension.Size.cs b/ReClass.NET/Extensions/Extension.Size.cs similarity index 100% rename from ReClass.NET/Util/Extension.Size.cs rename to ReClass.NET/Extensions/Extension.Size.cs diff --git a/ReClass.NET/Util/Extension.String.cs b/ReClass.NET/Extensions/Extension.String.cs similarity index 100% rename from ReClass.NET/Util/Extension.String.cs rename to ReClass.NET/Extensions/Extension.String.cs diff --git a/ReClass.NET/Util/Extension.StringReader.cs b/ReClass.NET/Extensions/Extension.StringReader.cs similarity index 100% rename from ReClass.NET/Util/Extension.StringReader.cs rename to ReClass.NET/Extensions/Extension.StringReader.cs diff --git a/ReClass.NET/Util/Extensions.cs b/ReClass.NET/Extensions/Extensions.cs similarity index 100% rename from ReClass.NET/Util/Extensions.cs rename to ReClass.NET/Extensions/Extensions.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 35ce0ffa..67631e20 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -342,18 +342,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + Form @@ -368,7 +368,7 @@ SettingsForm.cs - + Component @@ -475,7 +475,7 @@ Component - + From 5e3ba592b5dd64a05d814a77f05b88259c6559f6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 15:35:39 +0100 Subject: [PATCH 274/777] Changed file names. --- ...ter.cs => BinaryReaderWriterExtensions.cs} | 0 ...{Extension.Color.cs => ColorExtensions.cs} | 0 ...aGridView.cs => DataGridViewExtensions.cs} | 0 ....Dictionary.cs => DictionaryExtensions.cs} | 0 ...sion.Encoding.cs => EncodingExtensions.cs} | 0 ...ingPoint.cs => FloatingPointExtensions.cs} | 0 ...sion.Graphics.cs => GraphicsExtensions.cs} | 0 ...xtension.IntPtr.cs => IntPtrExtensions.cs} | 0 .../{Extension.Linq.cs => LinqExtensions.cs} | 0 ...ichTextBox.cs => RichTextBoxExtensions.cs} | 0 .../{Extension.Size.cs => SizeExtensions.cs} | 0 ...xtension.String.cs => StringExtensions.cs} | 0 ...ingReader.cs => StringReaderExtensions.cs} | 0 ReClass.NET/ReClass.NET.csproj | 26 +++++++++---------- 14 files changed, 13 insertions(+), 13 deletions(-) rename ReClass.NET/Extensions/{Extension.BinaryReaderWriter.cs => BinaryReaderWriterExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Color.cs => ColorExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.DataGridView.cs => DataGridViewExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Dictionary.cs => DictionaryExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Encoding.cs => EncodingExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.FloatingPoint.cs => FloatingPointExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Graphics.cs => GraphicsExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.IntPtr.cs => IntPtrExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Linq.cs => LinqExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.RichTextBox.cs => RichTextBoxExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.Size.cs => SizeExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.String.cs => StringExtensions.cs} (100%) rename ReClass.NET/Extensions/{Extension.StringReader.cs => StringReaderExtensions.cs} (100%) diff --git a/ReClass.NET/Extensions/Extension.BinaryReaderWriter.cs b/ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.BinaryReaderWriter.cs rename to ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Color.cs b/ReClass.NET/Extensions/ColorExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Color.cs rename to ReClass.NET/Extensions/ColorExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.DataGridView.cs b/ReClass.NET/Extensions/DataGridViewExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.DataGridView.cs rename to ReClass.NET/Extensions/DataGridViewExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Dictionary.cs b/ReClass.NET/Extensions/DictionaryExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Dictionary.cs rename to ReClass.NET/Extensions/DictionaryExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Encoding.cs b/ReClass.NET/Extensions/EncodingExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Encoding.cs rename to ReClass.NET/Extensions/EncodingExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.FloatingPoint.cs b/ReClass.NET/Extensions/FloatingPointExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.FloatingPoint.cs rename to ReClass.NET/Extensions/FloatingPointExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Graphics.cs b/ReClass.NET/Extensions/GraphicsExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Graphics.cs rename to ReClass.NET/Extensions/GraphicsExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.IntPtr.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.IntPtr.cs rename to ReClass.NET/Extensions/IntPtrExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Linq.cs b/ReClass.NET/Extensions/LinqExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Linq.cs rename to ReClass.NET/Extensions/LinqExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.RichTextBox.cs b/ReClass.NET/Extensions/RichTextBoxExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.RichTextBox.cs rename to ReClass.NET/Extensions/RichTextBoxExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.Size.cs b/ReClass.NET/Extensions/SizeExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.Size.cs rename to ReClass.NET/Extensions/SizeExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.String.cs b/ReClass.NET/Extensions/StringExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.String.cs rename to ReClass.NET/Extensions/StringExtensions.cs diff --git a/ReClass.NET/Extensions/Extension.StringReader.cs b/ReClass.NET/Extensions/StringReaderExtensions.cs similarity index 100% rename from ReClass.NET/Extensions/Extension.StringReader.cs rename to ReClass.NET/Extensions/StringReaderExtensions.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 67631e20..c8241085 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -342,18 +342,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + Form @@ -475,7 +475,7 @@ Component - + From e305156abaa3d40429c25d756ba337f4fde6024c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:14:39 +0100 Subject: [PATCH 275/777] Split values to make them editable. --- ReClass.NET/Extensions/StringExtensions.cs | 10 ++++++++++ ReClass.NET/Nodes/BaseNumericNode.cs | 7 ++++++- ReClass.NET/Nodes/DoubleNode.cs | 2 +- ReClass.NET/Nodes/FloatNode.cs | 2 +- ReClass.NET/Nodes/Int16Node.cs | 8 +++++--- ReClass.NET/Nodes/Int32Node.cs | 8 +++++--- ReClass.NET/Nodes/Int64Node.cs | 8 +++++--- ReClass.NET/Nodes/Int8Node.cs | 8 +++++--- ReClass.NET/Nodes/UInt16Node.cs | 8 +++++--- ReClass.NET/Nodes/UInt32Node.cs | 8 +++++--- ReClass.NET/Nodes/UInt64Node.cs | 8 +++++--- ReClass.NET/Nodes/UInt8Node.cs | 8 +++++--- 12 files changed, 58 insertions(+), 27 deletions(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index f87c45e2..dd6ffc31 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; using System.Linq; +using System.Text.RegularExpressions; namespace ReClassNET.Util { @@ -84,5 +85,14 @@ public static string LimitLength(this string s, int length) } return s.Substring(0, length); } + + private static readonly Regex HexRegex = new Regex("(0x|h)?([0-9A-F]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + public static bool TryGetHexString(this string s, out string value) + { + var match = HexRegex.Match(s); + value = match.Success ? match.Groups[2].Value : null; + + return match.Success; + } } } diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index 1bdb0dfe..b389614a 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -13,8 +13,9 @@ public abstract class BaseNumericNode : BaseNode /// The icon of the node. /// The type of the node. /// The value of the node. + /// An alternative value of the node. /// The pixel size the node occupies. - protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value) + protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value, string alternativeValue) { Contract.Requires(view != null); Contract.Requires(icon != null); @@ -41,6 +42,10 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, 0, value) + view.Font.Width; + if (alternativeValue != null) + { + x = AddText(view, x, y, view.Settings.ValueColor, 1, alternativeValue) + view.Font.Width; + } x = AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index 21cf4ed6..93bc588a 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -10,7 +10,7 @@ public class DoubleNode : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000")); + return DrawNumeric(view, x, y, Icons.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 527e2ce5..43a64302 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -10,7 +10,7 @@ public class FloatNode : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000")); + return DrawNumeric(view, x, y, Icons.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 38b66824..138026f8 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class Int16Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int16", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Signed, "Int16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (short.TryParse(spot.Text, out var val)) + if (short.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && short.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 26250902..5443ce8f 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class Int32Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int32", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Signed, "Int32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (int.TryParse(spot.Text, out var val)) + if (int.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && int.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index ab84ee32..0a3ba231 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class Int64Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int64", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Signed, "Int64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (long.TryParse(spot.Text, out var val)) + if (long.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 726025ad..7613eb36 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class Int8Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int8", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Signed, "Int8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (sbyte.TryParse(spot.Text, out var val)) + if (sbyte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && sbyte.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 1054a6b4..dbfeba44 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class UInt16Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (ushort.TryParse(spot.Text, out var val)) + if (ushort.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ushort.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 45bab281..e04770b0 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class UInt32Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (uint.TryParse(spot.Text, out var val)) + if (uint.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && uint.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 75d5ae78..a0a02094 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class UInt64Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (ulong.TryParse(spot.Text, out var val)) + if (ulong.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ulong.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index d7a370eb..7f16fa97 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -1,6 +1,8 @@ using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,16 +13,16 @@ public class UInt8Node : BaseNumericNode public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", $"{value} (0x{value:X})"); + return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) { base.Update(spot); - if (spot.Id == 0) + if (spot.Id == 0 || spot.Id == 1) { - if (byte.TryParse(spot.Text, out var val)) + if (byte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && byte.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } From b3f597de4188f58d675734be5c6fc733c732e955 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:14:56 +0100 Subject: [PATCH 276/777] Split value comment. --- ReClass.NET/Nodes/BaseHexCommentNode.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 00eba974..2e92c4c1 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -19,7 +19,15 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu } if (view.Settings.ShowCommentInteger) { - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, ivalue == IntPtr.Zero ? "0" : $"{ivalue.ToInt64()} (0x{uvalue.ToUInt64():X})") + view.Font.Width; + if (ivalue == IntPtr.Zero) + { + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, "0") + view.Font.Width; + } + else + { + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, ivalue.ToInt64().ToString()) + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, $"0x{uvalue.ToUInt64():X}") + view.Font.Width; + } } var namedAddress = view.Memory.Process.GetNamedAddress(ivalue); From ba3cf4005419a9ac950afa7dcc2e836c2412028f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:15:09 +0100 Subject: [PATCH 277/777] Fixed file path. --- ReClass.NET_Launcher/ReClass.NET_Launcher.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj index 89d7a2ce..5da1c43a 100644 --- a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj +++ b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj @@ -67,8 +67,8 @@ Native\NativeMethods.Windows.cs - - Util\Extension.IntPtr.cs + + Extensions\IntPtrExtensions.cs Util\PathUtil.cs From 88f6dcdfc67662267f9b0acbe55f4312b8c27c68 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:31:18 +0100 Subject: [PATCH 278/777] Let the framework decide the culture. --- ReClass.NET/Nodes/Int16Node.cs | 2 +- ReClass.NET/Nodes/Int32Node.cs | 2 +- ReClass.NET/Nodes/Int64Node.cs | 2 +- ReClass.NET/Nodes/Int8Node.cs | 2 +- ReClass.NET/Nodes/UInt16Node.cs | 2 +- ReClass.NET/Nodes/UInt32Node.cs | 2 +- ReClass.NET/Nodes/UInt64Node.cs | 2 +- ReClass.NET/Nodes/UInt8Node.cs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 138026f8..08ad74e7 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (short.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && short.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (short.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && short.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 5443ce8f..fcf86ff6 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (int.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && int.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (int.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && int.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index 0a3ba231..98bc654e 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (long.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (long.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 7613eb36..fd7f2b87 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (sbyte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && sbyte.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (sbyte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && sbyte.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index dbfeba44..f088b305 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (ushort.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ushort.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (ushort.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ushort.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index e04770b0..dddff85c 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (uint.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && uint.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (uint.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && uint.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index a0a02094..9372bf25 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (ulong.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ulong.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (ulong.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ulong.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index 7f16fa97..9a60804d 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -22,7 +22,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0 || spot.Id == 1) { - if (byte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && byte.TryParse(hexValue, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out val)) + if (byte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && byte.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { spot.Memory.Process.WriteRemoteMemory(spot.Address, val); } From 40ab33342072647694a86db86b1eabec38451558 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:35:30 +0100 Subject: [PATCH 279/777] Implemented #53. --- ReClass.NET/Nodes/ClassPtrNode.cs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs index e48c777d..14cc3f97 100644 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ b/ReClass.NET/Nodes/ClassPtrNode.cs @@ -1,7 +1,9 @@ using System; using System.Drawing; +using System.Globalization; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -46,6 +48,11 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; + var ptr = view.Memory.ReadIntPtr(Offset); + + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, 0, "0x" + ptr.ToString(Constants.AddressHexFormat)) + view.Font.Width; + x = AddComment(view, x, y); AddTypeDrop(view, y); @@ -57,8 +64,6 @@ public override Size Draw(ViewInfo view, int x, int y) if (levelsOpen[view.Level]) { - var ptr = view.Memory.ReadIntPtr(Offset); - memory.Size = InnerNode.MemorySize; memory.Process = view.Memory.Process; memory.Update(ptr); @@ -90,5 +95,24 @@ public override int CalculateDrawnHeight(ViewInfo view) } return height; } + + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0) + { + if (spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, null, out var val)) + { +#if RECLASSNET64 + var address = (IntPtr)val; +#else + var address = (IntPtr)unchecked((int)val); +#endif + + spot.Memory.Process.WriteRemoteMemory(spot.Address, address); + } + } + } } } From 0f51566a71e1a05eaad0c44920df394acfb62cc5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Mar 2018 16:35:56 +0100 Subject: [PATCH 280/777] Avoid strange exception... --- ReClass.NET/UI/HotSpotTextBox.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index b1002892..be90dc8d 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -105,11 +105,11 @@ protected override void OnTextChanged(EventArgs e) private void OnCommit() { + Visible = false; + hotSpot.Text = Text.Trim(); Committed?.Invoke(this, EventArgs.Empty); - - Visible = false; } } } From bd7b3a0dca155e55e3b751c589b40eb0882f727b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 11 Mar 2018 23:56:33 +0100 Subject: [PATCH 281/777] Changed namespace name. --- ReClass.NET/AddressParser/Interpreter.cs | 1 + ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 1 + ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 1 + ReClass.NET/Core/CoreFunctionsManager.cs | 1 + ReClass.NET/Core/InternalCoreFunctions.cs | 1 + ReClass.NET/Core/NativeCoreWrapper.cs | 1 + ReClass.NET/DataExchange/ReClass/ReClass2007File.cs | 1 + ReClass.NET/DataExchange/ReClass/ReClassFile.cs | 1 + ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs | 1 + ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs | 1 + ReClass.NET/Debugger/RemoteDebugger.cs | 1 + ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs | 2 +- ReClass.NET/Extensions/ColorExtensions.cs | 2 +- ReClass.NET/Extensions/DataGridViewExtensions.cs | 2 +- ReClass.NET/Extensions/DictionaryExtensions.cs | 2 +- ReClass.NET/Extensions/EncodingExtensions.cs | 2 +- ReClass.NET/Extensions/Extensions.cs | 2 +- ReClass.NET/Extensions/FloatingPointExtensions.cs | 2 +- ReClass.NET/Extensions/GraphicsExtensions.cs | 2 +- ReClass.NET/Extensions/IntPtrExtensions.cs | 2 +- ReClass.NET/Extensions/LinqExtensions.cs | 2 +- ReClass.NET/Extensions/RichTextBoxExtensions.cs | 2 +- ReClass.NET/Extensions/SizeExtensions.cs | 2 +- ReClass.NET/Extensions/StringExtensions.cs | 2 +- ReClass.NET/Extensions/StringReaderExtensions.cs | 2 +- ReClass.NET/Forms/CodeForm.cs | 1 + ReClass.NET/Forms/FoundCodeForm.cs | 1 + ReClass.NET/Forms/MainForm.cs | 1 + ReClass.NET/Forms/NamedAddressesForm.cs | 1 + ReClass.NET/Forms/ScannerForm.cs | 1 + ReClass.NET/Forms/SettingsForm.cs | 1 + ReClass.NET/Memory/Disassembler.cs | 1 + ReClass.NET/Memory/MemoryBuffer.cs | 1 + ReClass.NET/Memory/NodeDissector.cs | 1 + ReClass.NET/Memory/RemoteProcess.cs | 1 + ReClass.NET/MemoryScanner/BytePattern.cs | 1 + ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs | 1 + ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs | 1 + ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs | 1 + ReClass.NET/MemoryScanner/MemoryRecord.cs | 1 + ReClass.NET/MemoryScanner/ScanResultBlock.cs | 1 + ReClass.NET/MemoryScanner/ScanResultStore.cs | 1 + ReClass.NET/MemoryScanner/Scanner.cs | 1 + ReClass.NET/Native/NativeMethods.Windows.cs | 1 + ReClass.NET/Nodes/BaseContainerNode.cs | 1 + ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 1 + ReClass.NET/Nodes/BaseHexCommentNode.cs | 1 + ReClass.NET/Nodes/BaseHexNode.cs | 1 + ReClass.NET/Nodes/BaseNode.cs | 1 + ReClass.NET/Nodes/BaseTextNode.cs | 1 + ReClass.NET/Nodes/BaseTextPtrNode.cs | 1 + ReClass.NET/Nodes/ClassInstanceArrayNode.cs | 1 + ReClass.NET/Nodes/ClassInstanceNode.cs | 1 + ReClass.NET/Nodes/ClassNode.cs | 1 + ReClass.NET/Nodes/ClassPtrNode.cs | 1 + ReClass.NET/Nodes/ClassUtil.cs | 1 + ReClass.NET/Nodes/FunctionNode.cs | 1 + ReClass.NET/Nodes/Int16Node.cs | 1 + ReClass.NET/Nodes/Int32Node.cs | 1 + ReClass.NET/Nodes/Int64Node.cs | 1 + ReClass.NET/Nodes/Int8Node.cs | 1 + ReClass.NET/Nodes/UInt16Node.cs | 1 + ReClass.NET/Nodes/UInt32Node.cs | 1 + ReClass.NET/Nodes/UInt64Node.cs | 1 + ReClass.NET/Nodes/UInt8Node.cs | 1 + ReClass.NET/Plugins/PluginInfo.cs | 1 + ReClass.NET/Plugins/PluginManager.cs | 1 + ReClass.NET/ReClassNetProject.cs | 1 + ReClass.NET/Symbols/SymbolReader.cs | 1 + ReClass.NET/Symbols/SymbolStore.cs | 1 + ReClass.NET/UI/ClassNodeView.cs | 1 + ReClass.NET/UI/EnumComboBox.cs | 1 + ReClass.NET/UI/EnumDescriptionDisplay.cs | 1 + ReClass.NET/UI/MemoryPreviewPopUp.cs | 1 + ReClass.NET/UI/MemoryRecordList.cs | 1 + ReClass.NET/UI/MemoryViewControl.cs | 1 + ReClass.NET/Util/Rtf/RtfBuilder.cs | 1 + ReClass.NET/Util/XElementSerializer.cs | 1 + 78 files changed, 78 insertions(+), 14 deletions(-) diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index 83011005..4e16aa72 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -2,6 +2,7 @@ using System; using System.Diagnostics.Contracts; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Util; diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 283bf68b..14626dba 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 26b9d231..b005496c 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 7346b563..93d566f3 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -4,6 +4,7 @@ using System.IO; using System.Windows.Forms; using ReClassNET.Debugger; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Util; diff --git a/ReClass.NET/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs index 3112fa54..e09161b0 100644 --- a/ReClass.NET/Core/InternalCoreFunctions.cs +++ b/ReClass.NET/Core/InternalCoreFunctions.cs @@ -2,6 +2,7 @@ using System.IO; using System.Runtime.InteropServices; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/Core/NativeCoreWrapper.cs b/ReClass.NET/Core/NativeCoreWrapper.cs index 17a0acaf..9ec1e24b 100644 --- a/ReClass.NET/Core/NativeCoreWrapper.cs +++ b/ReClass.NET/Core/NativeCoreWrapper.cs @@ -1,6 +1,7 @@ using System; using System.Runtime.InteropServices; using ReClassNET.Debugger; +using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs index 77ef0c2e..b109cc93 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs @@ -4,6 +4,7 @@ using System.Data.SQLite; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 61715238..ee24fd87 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Xml.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.UI; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index f2831c6e..e91129ed 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -5,6 +5,7 @@ using System.IO.Compression; using System.Linq; using System.Xml.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs index f87e1341..aee438cd 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Xml.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/Debugger/RemoteDebugger.cs b/ReClass.NET/Debugger/RemoteDebugger.cs index 86c4a643..bb468553 100644 --- a/ReClass.NET/Debugger/RemoteDebugger.cs +++ b/ReClass.NET/Debugger/RemoteDebugger.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Forms; using ReClassNET.Memory; using ReClassNET.Util; diff --git a/ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs b/ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs index 4a36ca94..fdae07f4 100644 --- a/ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs +++ b/ReClass.NET/Extensions/BinaryReaderWriterExtensions.cs @@ -2,7 +2,7 @@ using System.Diagnostics.Contracts; using System.IO; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class BinaryReaderWriterExtension { diff --git a/ReClass.NET/Extensions/ColorExtensions.cs b/ReClass.NET/Extensions/ColorExtensions.cs index 844915cd..c8d8edd1 100644 --- a/ReClass.NET/Extensions/ColorExtensions.cs +++ b/ReClass.NET/Extensions/ColorExtensions.cs @@ -1,6 +1,6 @@ using System.Drawing; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class ExtensionColor { diff --git a/ReClass.NET/Extensions/DataGridViewExtensions.cs b/ReClass.NET/Extensions/DataGridViewExtensions.cs index da5375c4..848d06c7 100644 --- a/ReClass.NET/Extensions/DataGridViewExtensions.cs +++ b/ReClass.NET/Extensions/DataGridViewExtensions.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Windows.Forms; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class DataGridViewExtension { diff --git a/ReClass.NET/Extensions/DictionaryExtensions.cs b/ReClass.NET/Extensions/DictionaryExtensions.cs index af55d56a..94d3bf9a 100644 --- a/ReClass.NET/Extensions/DictionaryExtensions.cs +++ b/ReClass.NET/Extensions/DictionaryExtensions.cs @@ -3,7 +3,7 @@ using System.Diagnostics.Contracts; using System.Linq; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class DictionaryExtension { diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index 75d61acd..e76ec2fd 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -1,7 +1,7 @@ using System; using System.Text; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class EncodingExtension { diff --git a/ReClass.NET/Extensions/Extensions.cs b/ReClass.NET/Extensions/Extensions.cs index 32553f49..ef0ded0b 100644 --- a/ReClass.NET/Extensions/Extensions.cs +++ b/ReClass.NET/Extensions/Extensions.cs @@ -6,7 +6,7 @@ using System.Linq; using ReClassNET.Nodes; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class Extensions { diff --git a/ReClass.NET/Extensions/FloatingPointExtensions.cs b/ReClass.NET/Extensions/FloatingPointExtensions.cs index 9cd86f2c..b905165c 100644 --- a/ReClass.NET/Extensions/FloatingPointExtensions.cs +++ b/ReClass.NET/Extensions/FloatingPointExtensions.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class FloatingPointExtension { diff --git a/ReClass.NET/Extensions/GraphicsExtensions.cs b/ReClass.NET/Extensions/GraphicsExtensions.cs index 01a5ced1..fb3d973d 100644 --- a/ReClass.NET/Extensions/GraphicsExtensions.cs +++ b/ReClass.NET/Extensions/GraphicsExtensions.cs @@ -1,7 +1,7 @@ using System.Drawing; using System.Windows.Forms; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class GraphicsExtension { diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index eb3814c7..646f0a5c 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class IntPtrExtension { diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 6fe2d2c3..a2b548ea 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -4,7 +4,7 @@ using System.Diagnostics.Contracts; using System.Linq; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class LinqExtension { diff --git a/ReClass.NET/Extensions/RichTextBoxExtensions.cs b/ReClass.NET/Extensions/RichTextBoxExtensions.cs index 8fcb2998..19f8fe20 100644 --- a/ReClass.NET/Extensions/RichTextBoxExtensions.cs +++ b/ReClass.NET/Extensions/RichTextBoxExtensions.cs @@ -3,7 +3,7 @@ using System.Runtime.InteropServices; using System.Windows.Forms; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class RichTextBoxExtension { diff --git a/ReClass.NET/Extensions/SizeExtensions.cs b/ReClass.NET/Extensions/SizeExtensions.cs index 1adc1d21..cc62726e 100644 --- a/ReClass.NET/Extensions/SizeExtensions.cs +++ b/ReClass.NET/Extensions/SizeExtensions.cs @@ -1,6 +1,6 @@ using System.Drawing; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class SizeExtension { diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index dd6ffc31..b0c8c50e 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class StringExtension { diff --git a/ReClass.NET/Extensions/StringReaderExtensions.cs b/ReClass.NET/Extensions/StringReaderExtensions.cs index 17c3e255..516f8eb6 100644 --- a/ReClass.NET/Extensions/StringReaderExtensions.cs +++ b/ReClass.NET/Extensions/StringReaderExtensions.cs @@ -1,6 +1,6 @@ using System.IO; -namespace ReClassNET.Util +namespace ReClassNET.Extensions { public static class StringReaderExtension { diff --git a/ReClass.NET/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs index 68e4b547..d6b08984 100644 --- a/ReClass.NET/Forms/CodeForm.cs +++ b/ReClass.NET/Forms/CodeForm.cs @@ -8,6 +8,7 @@ using ColorCode; using ColorCode.Parsing; using ReClassNET.CodeGenerator; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.UI; diff --git a/ReClass.NET/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs index 44acffee..68ccd141 100644 --- a/ReClass.NET/Forms/FoundCodeForm.cs +++ b/ReClass.NET/Forms/FoundCodeForm.cs @@ -6,6 +6,7 @@ using System.Text; using System.Windows.Forms; using ReClassNET.Debugger; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Nodes; using ReClassNET.UI; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 7237a8cd..5ddfe86f 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -10,6 +10,7 @@ using ReClassNET.CodeGenerator; using ReClassNET.Core; using ReClassNET.DataExchange.ReClass; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Memory; using ReClassNET.Nodes; diff --git a/ReClass.NET/Forms/NamedAddressesForm.cs b/ReClass.NET/Forms/NamedAddressesForm.cs index 3b057bdb..704d62c5 100644 --- a/ReClass.NET/Forms/NamedAddressesForm.cs +++ b/ReClass.NET/Forms/NamedAddressesForm.cs @@ -4,6 +4,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 189f24d0..44db2e90 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.DataExchange.Scanner; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Memory; using ReClassNET.MemoryScanner; diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index b69a0091..ae82ddb8 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.Contracts; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 1276d3f3..62e39ac5 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Runtime.InteropServices; using ReClassNET.Core; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Memory diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index 1ad850f1..2910a478 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Runtime.InteropServices; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Memory diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index e23c3a8d..317c0214 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 0a7ec19c..55ee4eb0 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -9,6 +9,7 @@ using ReClassNET.AddressParser; using ReClassNET.Core; using ReClassNET.Debugger; +using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.Symbols; using ReClassNET.Util; diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index ef0ca18b..414d2494 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index e4646e9c..56c50164 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index 8f7f22ba..52e96974 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer diff --git a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs index 09c6c828..44b958ed 100644 --- a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index c6a1e90a..aefc35c7 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Globalization; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Util; diff --git a/ReClass.NET/MemoryScanner/ScanResultBlock.cs b/ReClass.NET/MemoryScanner/ScanResultBlock.cs index fec2991a..14aad1ac 100644 --- a/ReClass.NET/MemoryScanner/ScanResultBlock.cs +++ b/ReClass.NET/MemoryScanner/ScanResultBlock.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner diff --git a/ReClass.NET/MemoryScanner/ScanResultStore.cs b/ReClass.NET/MemoryScanner/ScanResultStore.cs index 62aee95e..70a03d04 100644 --- a/ReClass.NET/MemoryScanner/ScanResultStore.cs +++ b/ReClass.NET/MemoryScanner/ScanResultStore.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.IO; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.MemoryScanner diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 36222b24..6dd0943c 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.MemoryScanner.Comparer; using ReClassNET.Util; diff --git a/ReClass.NET/Native/NativeMethods.Windows.cs b/ReClass.NET/Native/NativeMethods.Windows.cs index ac4e15ca..d74bf135 100644 --- a/ReClass.NET/Native/NativeMethods.Windows.cs +++ b/ReClass.NET/Native/NativeMethods.Windows.cs @@ -6,6 +6,7 @@ using System.Text; using System.Windows.Forms; using Microsoft.Win32; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Native diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index 3c0287f4..74dc1879 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 87c632be..f195a642 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 2e92c4c1..f73ef07e 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Text; +using ReClassNET.Extensions; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index 63af0014..5c93f446 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 374a34d7..906df5c1 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index a198a69c..0e5f5f82 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -1,6 +1,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index d44cfdc2..f73144ad 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Extensions; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs index 50c7472d..351489fa 100644 --- a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Extensions; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index a92e3ec4..7090d87b 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -1,5 +1,6 @@ using System; using System.Drawing; +using ReClassNET.Extensions; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index a6b6c468..23cbc7b1 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using ReClassNET.AddressParser; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs index 14cc3f97..2a857db5 100644 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ b/ReClass.NET/Nodes/ClassPtrNode.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/ClassUtil.cs b/ReClass.NET/Nodes/ClassUtil.cs index 4ebe3a08..17f82666 100644 --- a/ReClass.NET/Nodes/ClassUtil.cs +++ b/ReClass.NET/Nodes/ClassUtil.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index c6a30692..c30d7088 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 08ad74e7..213d85a0 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index fcf86ff6..5c5d9ceb 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index 98bc654e..ab26c3f8 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index fd7f2b87..99316a5a 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index f088b305..1c279379 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index dddff85c..fee519af 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 9372bf25..6a2a61d5 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index 9a60804d..6292ac20 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Globalization; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Plugins/PluginInfo.cs b/ReClass.NET/Plugins/PluginInfo.cs index 254ce400..5875ae8e 100644 --- a/ReClass.NET/Plugins/PluginInfo.cs +++ b/ReClass.NET/Plugins/PluginInfo.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; using System.IO; +using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index 8e42ac52..6047b62f 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -4,6 +4,7 @@ using System.Diagnostics.Contracts; using System.IO; using ReClassNET.Core; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/ReClassNetProject.cs b/ReClass.NET/ReClassNetProject.cs index 0ab0bc03..4c074d65 100644 --- a/ReClass.NET/ReClassNetProject.cs +++ b/ReClass.NET/ReClassNetProject.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.Extensions; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/Symbols/SymbolReader.cs b/ReClass.NET/Symbols/SymbolReader.cs index 002a0230..c3df31b6 100644 --- a/ReClass.NET/Symbols/SymbolReader.cs +++ b/ReClass.NET/Symbols/SymbolReader.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Text; using Dia2Lib; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/Symbols/SymbolStore.cs b/ReClass.NET/Symbols/SymbolStore.cs index 48fde96c..5f9d3f16 100644 --- a/ReClass.NET/Symbols/SymbolStore.cs +++ b/ReClass.NET/Symbols/SymbolStore.cs @@ -6,6 +6,7 @@ using System.Runtime.InteropServices; using Dia2Lib; using Microsoft.Win32; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Native; using ReClassNET.Util; diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index fbb71de3..709f241e 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -4,6 +4,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/UI/EnumComboBox.cs index 385b63c3..c266a9fa 100644 --- a/ReClass.NET/UI/EnumComboBox.cs +++ b/ReClass.NET/UI/EnumComboBox.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.UI diff --git a/ReClass.NET/UI/EnumDescriptionDisplay.cs b/ReClass.NET/UI/EnumDescriptionDisplay.cs index e1d5a863..692b22ce 100644 --- a/ReClass.NET/UI/EnumDescriptionDisplay.cs +++ b/ReClass.NET/UI/EnumDescriptionDisplay.cs @@ -4,6 +4,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Reflection; +using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.UI diff --git a/ReClass.NET/UI/MemoryPreviewPopUp.cs b/ReClass.NET/UI/MemoryPreviewPopUp.cs index fcab1703..4bf532ff 100644 --- a/ReClass.NET/UI/MemoryPreviewPopUp.cs +++ b/ReClass.NET/UI/MemoryPreviewPopUp.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Nodes; using ReClassNET.Util; diff --git a/ReClass.NET/UI/MemoryRecordList.cs b/ReClass.NET/UI/MemoryRecordList.cs index 351ddf7f..a86bbbf8 100644 --- a/ReClass.NET/UI/MemoryRecordList.cs +++ b/ReClass.NET/UI/MemoryRecordList.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.MemoryScanner; using ReClassNET.Util; diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 3c0418db..21a91b0a 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -8,6 +8,7 @@ using System.Text; using System.Windows.Forms; using ReClassNET.DataExchange.ReClass; +using ReClassNET.Extensions; using ReClassNET.Forms; using ReClassNET.Memory; using ReClassNET.MemoryScanner; diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index 3a368e17..a8732ce0 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Text; +using ReClassNET.Extensions; namespace ReClassNET.Util.Rtf { diff --git a/ReClass.NET/Util/XElementSerializer.cs b/ReClass.NET/Util/XElementSerializer.cs index 03ceff88..2249b4c8 100644 --- a/ReClass.NET/Util/XElementSerializer.cs +++ b/ReClass.NET/Util/XElementSerializer.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.Linq; using System.Xml.Linq; +using ReClassNET.Extensions; namespace ReClassNET.Util { From 78fbe804cbb0fda317d60e76fbfa7a04883341bf Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Wed, 14 Mar 2018 22:27:04 +1000 Subject: [PATCH 282/777] manifest file and error handling --- ReClass.NET/Plugins/PluginManager.cs | 2 +- ReClass.NET/ReClass.NET.csproj | 4 ++ ReClass.NET/app.manifest | 76 ++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET/app.manifest diff --git a/ReClass.NET/Plugins/PluginManager.cs b/ReClass.NET/Plugins/PluginManager.cs index 8e42ac52..dbf102f9 100644 --- a/ReClass.NET/Plugins/PluginManager.cs +++ b/ReClass.NET/Plugins/PluginManager.cs @@ -135,7 +135,7 @@ private static IntPtr CreateNativePluginInstance(string filePath) var handle = NativeMethods.LoadLibrary(filePath); if (handle.IsNull()) { - throw new FileLoadException(); + throw new FileLoadException($"Failed to load native plugin: {Path.GetFileName(filePath)}"); } return handle; } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 35ce0ffa..fdebd0ea 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -106,6 +106,9 @@ Resources\Icon\ReClassNet.ico + + app.manifest + False @@ -556,6 +559,7 @@ Resources.Designer.cs + SettingsSingleFileGenerator diff --git a/ReClass.NET/app.manifest b/ReClass.NET/app.manifest new file mode 100644 index 00000000..46701591 --- /dev/null +++ b/ReClass.NET/app.manifest @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 47a91fe95d7c1048b8bbe37b1d1e4734b0de61e6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 31 Mar 2018 18:01:34 +0200 Subject: [PATCH 283/777] Keep checked state. --- ReClass.NET/Forms/ScannerForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 44db2e90..81eebc89 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -546,7 +546,7 @@ private void Reset() nextScanButton.Enabled = false; isHexCheckBox.Enabled = true; - isHexCheckBox.Checked = false; + //isHexCheckBox.Checked = false; valueTypeComboBox.Enabled = true; //valueTypeComboBox.SelectedItem = valueTypeComboBox.Items.Cast>().PredicateOrFirst(e => e.Value == ScanValueType.Integer); From 3de68bc407ac964fe435f6c816c4a28fce8488e3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 31 Mar 2018 19:04:02 +0200 Subject: [PATCH 284/777] Consolidate sections to reduce the needed RPM calls. --- ReClass.NET/MemoryScanner/Scanner.cs | 66 ++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 6dd0943c..9f0aa41e 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -14,6 +14,15 @@ namespace ReClassNET.MemoryScanner { public class Scanner : IDisposable { + /// + /// Helper class for consolidated memory regions. + /// + private class ConsolidatedMemoryRegion + { + public IntPtr Address { get; set; } + public int Size { get; set; } + } + private readonly RemoteProcess process; private readonly CircularBuffer stores; @@ -192,12 +201,14 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca return Task.FromResult(true); } - var initialBufferSize = (int)sections.Average(s => s.Size.ToInt32()); + var regions = ConsolidateSections(sections); + + var initialBufferSize = (int)(regions.Average(s => s.Size) + 1); progress?.Report(0); var counter = 0; - var totalSectionCount = (float)sections.Count; + var totalSectionCount = (float)regions.Count; return Task.Run(() => { @@ -207,23 +218,24 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca // 3. n Worker -> m Sections: Read data, search results, store results var result = Parallel.ForEach( - sections, // Sections get grouped by the framework to balance the workers. + regions, // Sections get grouped by the framework to balance the workers. () => new ScannerContext(Settings, comparer, initialBufferSize), // Create a new context for every worker (thread). (s, state, _, context) => { if (!ct.IsCancellationRequested) { - var start = s.Start; - var size = s.Size.ToInt32(); + var start = s.Address; + var end = s.Address + s.Size; + var size = s.Size; - if (Settings.StartAddress.InRange(s.Start, s.End)) + if (Settings.StartAddress.InRange(start, end)) { + size = size - Settings.StartAddress.Sub(start).ToInt32(); start = Settings.StartAddress; - size = size - Settings.StartAddress.Sub(s.Start).ToInt32(); } - if (Settings.StopAddress.InRange(s.Start, s.End)) + if (Settings.StopAddress.InRange(start, end)) { - size = size - s.End.Sub(Settings.StopAddress).ToInt32(); + size = size - end.Sub(Settings.StopAddress).ToInt32(); } context.EnsureBufferSize(size); @@ -325,6 +337,42 @@ private Task NextScan(IScanComparer comparer, IProgress progress, Can }, ct); } + /// + /// Consolidate memory sections which are direct neighbours to reduce the number of work items. + /// + /// A list of sections. + /// A list of consolidated memory regions. + private static List ConsolidateSections(IList
sections) + { + var regions = new List(); + + if (sections.Count > 0) + { + var address = sections[0].Start; + var size = sections[0].Size.ToInt32(); + + for (var i = 1; i < sections.Count; ++i) + { + var section = sections[i]; + if (address + size != section.Start) + { + regions.Add(new ConsolidatedMemoryRegion { Address = address, Size = size }); + + address = section.Start; + size = section.Size.ToInt32(); + } + else + { + size += section.Size.ToInt32(); + } + } + + regions.Add(new ConsolidatedMemoryRegion { Address = address, Size = size }); + } + + return regions; + } + /// /// Creates a result block from the scan results and adjusts the result offset. /// From 53dba33b1773bc6d03046a39d2bcfcb254d338a5 Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Mon, 2 Apr 2018 02:29:42 +1000 Subject: [PATCH 285/777] Updated PluginForm so the combobox for native functions selection is set to whatever the current native functions is --- ReClass.NET/Core/CoreFunctionsManager.cs | 3 ++- ReClass.NET/Forms/PluginForm.cs | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 93d566f3..2994f46f 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -12,9 +12,10 @@ namespace ReClassNET.Core { public class CoreFunctionsManager : IDisposable { - private readonly Dictionary functionsRegistry = new Dictionary(); + public readonly Dictionary functionsRegistry = new Dictionary(); public IEnumerable FunctionProviders => functionsRegistry.Keys; + public ICoreProcessFunctions CurrentFunctions => currentFunctions; private readonly InternalCoreFunctions internalCoreFunctions; diff --git a/ReClass.NET/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs index 2711cd67..31dc10d8 100644 --- a/ReClass.NET/Forms/PluginForm.cs +++ b/ReClass.NET/Forms/PluginForm.cs @@ -43,9 +43,13 @@ internal PluginForm(PluginManager pluginManager) UpdatePluginDescription(); - // Native Methods Tab + // Native Methods Tab - functionsProvidersComboBox.Items.AddRange(Program.CoreFunctions.FunctionProviders.ToArray()); + string[] arrayOfFunctions = Program.CoreFunctions.FunctionProviders.ToArray(); + var funcIndexStr = Program.CoreFunctions.functionsRegistry.FirstOrDefault(p => p.Value == Program.CoreFunctions.CurrentFunctions); + + functionsProvidersComboBox.Items.AddRange(arrayOfFunctions); + functionsProvidersComboBox.SelectedIndex = funcIndexStr.Value == null ? 0 : Array.IndexOf(arrayOfFunctions, funcIndexStr.Key); } protected override void OnLoad(EventArgs e) From 705ea3cd45ad0c411850675099b2faf449af3df7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 2 Apr 2018 15:50:16 +0200 Subject: [PATCH 286/777] Use a simple list instead of a state machine. --- ReClass.NET/MemoryScanner/ScannerWorker.cs | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs index 8a804ffb..b83dc714 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ScannerWorker.cs @@ -27,10 +27,12 @@ public ScannerWorker(ScanSettings settings, IScanComparer comparer) /// The length of the parameter. /// The to stop the scan. /// An enumeration of all s. - public IEnumerable Search(byte[] data, int count, CancellationToken ct) + public IList Search(byte[] data, int count, CancellationToken ct) { Contract.Requires(data != null); + var results = new List(); + var endIndex = count - comparer.ValueSize; for (var i = 0; i < endIndex; i += settings.FastScanAlignment) @@ -44,9 +46,11 @@ public IEnumerable Search(byte[] data, int count, CancellationToken { result.Address = (IntPtr)i; - yield return result; + results.Add(result); } } + + return results; } /// @@ -55,34 +59,38 @@ public IEnumerable Search(byte[] data, int count, CancellationToken /// /// The data to scan. /// The length of the parameter. - /// The previous results to use. + /// The previous results to use. /// The to stop the scan. /// An enumeration of all s. - public IEnumerable Search(byte[] data, int count, IEnumerable results, CancellationToken ct) + public IList Search(byte[] data, int count, IEnumerable previousResults, CancellationToken ct) { Contract.Requires(data != null); - Contract.Requires(results != null); + Contract.Requires(previousResults != null); + + var results = new List(); var endIndex = count - comparer.ValueSize; - foreach (var previous in results) + foreach (var previousResult in previousResults) { if (ct.IsCancellationRequested) { break; } - var offset = previous.Address.ToInt32(); + var offset = previousResult.Address.ToInt32(); if (offset <= endIndex) { - if (comparer.Compare(data, offset, previous, out var result)) + if (comparer.Compare(data, offset, previousResult, out var result)) { - result.Address = previous.Address; + result.Address = previousResult.Address; - yield return result; + results.Add(result); } } } + + return results; } } } From d87d3977bf0a83cf79fbb9c609a12f9d3e83917c Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Wed, 11 Apr 2018 10:31:05 +1000 Subject: [PATCH 287/777] No commit message --- ReClass.NET/Forms/PluginForm.Designer.cs | 2 +- ReClass.NET/Forms/PluginForm.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs index 0caecd06..bbe2bee8 100644 --- a/ReClass.NET/Forms/PluginForm.Designer.cs +++ b/ReClass.NET/Forms/PluginForm.Designer.cs @@ -115,7 +115,7 @@ private void InitializeComponent() this.pluginsDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.pluginsDataGridView.Size = new System.Drawing.Size(702, 197); this.pluginsDataGridView.TabIndex = 0; - this.pluginsDataGridView.SelectionChanged += new System.EventHandler(this.pluginsDataGridView_SelectionChanged); + this.pluginsDataGridView.SelectionChanged += new System.EventHandler(this.PluginsDataGridView_SelectionChanged); // // iconColumn // diff --git a/ReClass.NET/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs index 31dc10d8..2d8db47b 100644 --- a/ReClass.NET/Forms/PluginForm.cs +++ b/ReClass.NET/Forms/PluginForm.cs @@ -66,10 +66,10 @@ protected override void OnFormClosed(FormClosedEventArgs e) GlobalWindowManager.RemoveWindow(this); } - #region Event Handler + #region Event Handler - private void pluginsDataGridView_SelectionChanged(object sender, EventArgs e) - { + private void pluginsDataGridView_SelectionChanged(object sender, EventArgs e) + { UpdatePluginDescription(); } From c4ee79c861b5becdebf03451df03a4a7f081dee3 Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Thu, 12 Apr 2018 00:51:56 +1000 Subject: [PATCH 288/777] Removed administrator manifest, fixed indentation and fixed the name for the selection changed event --- ReClass.NET/Core/CoreFunctionsManager.cs | 2 +- ReClass.NET/Forms/PluginForm.Designer.cs | 2 +- ReClass.NET/Forms/PluginForm.cs | 10 ++-- ReClass.NET/ReClass.NET.csproj | 5 +- ReClass.NET/app.manifest | 76 ------------------------ 5 files changed, 8 insertions(+), 87 deletions(-) delete mode 100644 ReClass.NET/app.manifest diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 2994f46f..5e8d33e7 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -15,7 +15,7 @@ public class CoreFunctionsManager : IDisposable public readonly Dictionary functionsRegistry = new Dictionary(); public IEnumerable FunctionProviders => functionsRegistry.Keys; - public ICoreProcessFunctions CurrentFunctions => currentFunctions; + public ICoreProcessFunctions CurrentFunctions => currentFunctions; private readonly InternalCoreFunctions internalCoreFunctions; diff --git a/ReClass.NET/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs index bbe2bee8..0caecd06 100644 --- a/ReClass.NET/Forms/PluginForm.Designer.cs +++ b/ReClass.NET/Forms/PluginForm.Designer.cs @@ -115,7 +115,7 @@ private void InitializeComponent() this.pluginsDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.pluginsDataGridView.Size = new System.Drawing.Size(702, 197); this.pluginsDataGridView.TabIndex = 0; - this.pluginsDataGridView.SelectionChanged += new System.EventHandler(this.PluginsDataGridView_SelectionChanged); + this.pluginsDataGridView.SelectionChanged += new System.EventHandler(this.pluginsDataGridView_SelectionChanged); // // iconColumn // diff --git a/ReClass.NET/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs index 2d8db47b..53a65c92 100644 --- a/ReClass.NET/Forms/PluginForm.cs +++ b/ReClass.NET/Forms/PluginForm.cs @@ -45,11 +45,11 @@ internal PluginForm(PluginManager pluginManager) // Native Methods Tab - string[] arrayOfFunctions = Program.CoreFunctions.FunctionProviders.ToArray(); - var funcIndexStr = Program.CoreFunctions.functionsRegistry.FirstOrDefault(p => p.Value == Program.CoreFunctions.CurrentFunctions); + string[] arrayOfFunctions = Program.CoreFunctions.FunctionProviders.ToArray(); + var funcIndexStr = Program.CoreFunctions.functionsRegistry.FirstOrDefault(p => p.Value == Program.CoreFunctions.CurrentFunctions); functionsProvidersComboBox.Items.AddRange(arrayOfFunctions); - functionsProvidersComboBox.SelectedIndex = funcIndexStr.Value == null ? 0 : Array.IndexOf(arrayOfFunctions, funcIndexStr.Key); + functionsProvidersComboBox.SelectedIndex = funcIndexStr.Value == null ? 0 : Array.IndexOf(arrayOfFunctions, funcIndexStr.Key); } protected override void OnLoad(EventArgs e) @@ -66,9 +66,9 @@ protected override void OnFormClosed(FormClosedEventArgs e) GlobalWindowManager.RemoveWindow(this); } - #region Event Handler + #region Event Handler - private void pluginsDataGridView_SelectionChanged(object sender, EventArgs e) + private void pluginsDataGridView_SelectionChanged(object sender, EventArgs e) { UpdatePluginDescription(); } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 5620081d..2849a2fd 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -106,9 +106,7 @@ Resources\Icon\ReClassNet.ico - - app.manifest - + False @@ -559,7 +557,6 @@ Resources.Designer.cs - SettingsSingleFileGenerator diff --git a/ReClass.NET/app.manifest b/ReClass.NET/app.manifest deleted file mode 100644 index 46701591..00000000 --- a/ReClass.NET/app.manifest +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From aefefcc3a118e8ba0387916b752ebaf00090fd8d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Apr 2018 17:17:42 +0200 Subject: [PATCH 289/777] Added properties for simpler use. --- ReClass.NET/Core/CoreFunctionsManager.cs | 15 +++++++++++---- ReClass.NET/Forms/PluginForm.cs | 12 +++++------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index 5e8d33e7..a8fa0c68 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; +using System.Linq; using System.Windows.Forms; using ReClassNET.Debugger; using ReClassNET.Extensions; @@ -12,15 +13,21 @@ namespace ReClassNET.Core { public class CoreFunctionsManager : IDisposable { - public readonly Dictionary functionsRegistry = new Dictionary(); - - public IEnumerable FunctionProviders => functionsRegistry.Keys; - public ICoreProcessFunctions CurrentFunctions => currentFunctions; + private readonly Dictionary functionsRegistry = new Dictionary(); private readonly InternalCoreFunctions internalCoreFunctions; private ICoreProcessFunctions currentFunctions; + public IEnumerable FunctionProviders => functionsRegistry.Keys; + + public ICoreProcessFunctions CurrentFunctions => currentFunctions; + + public string CurrentFunctionsProvider => functionsRegistry + .Where(kv => kv.Value == currentFunctions) + .Select(kv => kv.Key) + .FirstOrDefault(); + public CoreFunctionsManager() { internalCoreFunctions = InternalCoreFunctions.Create(); diff --git a/ReClass.NET/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs index 53a65c92..c8493df2 100644 --- a/ReClass.NET/Forms/PluginForm.cs +++ b/ReClass.NET/Forms/PluginForm.cs @@ -43,13 +43,11 @@ internal PluginForm(PluginManager pluginManager) UpdatePluginDescription(); - // Native Methods Tab + // Native Methods Tab - string[] arrayOfFunctions = Program.CoreFunctions.FunctionProviders.ToArray(); - var funcIndexStr = Program.CoreFunctions.functionsRegistry.FirstOrDefault(p => p.Value == Program.CoreFunctions.CurrentFunctions); - - functionsProvidersComboBox.Items.AddRange(arrayOfFunctions); - functionsProvidersComboBox.SelectedIndex = funcIndexStr.Value == null ? 0 : Array.IndexOf(arrayOfFunctions, funcIndexStr.Key); + var providers = Program.CoreFunctions.FunctionProviders.ToArray(); + functionsProvidersComboBox.Items.AddRange(providers); + functionsProvidersComboBox.SelectedIndex = Array.IndexOf(providers, Program.CoreFunctions.CurrentFunctionsProvider); } protected override void OnLoad(EventArgs e) @@ -69,7 +67,7 @@ protected override void OnFormClosed(FormClosedEventArgs e) #region Event Handler private void pluginsDataGridView_SelectionChanged(object sender, EventArgs e) - { + { UpdatePluginDescription(); } From c1956679bfccb37e854798ab40e5471653831891 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 12 Apr 2018 09:04:56 +0200 Subject: [PATCH 290/777] Added dpi aware scaling. --- ReClass.NET/UI/BannerBox.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/BannerBox.cs b/ReClass.NET/UI/BannerBox.cs index 78bae320..c20c541e 100644 --- a/ReClass.NET/UI/BannerBox.cs +++ b/ReClass.NET/UI/BannerBox.cs @@ -32,7 +32,7 @@ protected override void SetBoundsCore(int x, int y, int width, int height, Bound { int oldWidth = Width; - base.SetBoundsCore(x, y, width, DefaultBannerHeight, specified); + base.SetBoundsCore(x, y, width, DpiUtil.ScaleIntY(DefaultBannerHeight), specified); if (oldWidth != width && width > 0) { @@ -71,7 +71,7 @@ private void UpdateBanner() { var oldImage = image; - image = BannerFactory.CreateBanner(Width, DefaultBannerHeight, icon, title, text, true); + image = BannerFactory.CreateBanner(Width, Height, icon, title, text, true); oldImage?.Dispose(); From dd8179bba3c5133d3eda1525fda9cd3645f238f9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 24 Apr 2018 20:54:17 +0200 Subject: [PATCH 291/777] May fix #62. --- ReClass.NET/UI/ClassNodeView.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 709f241e..04befaa7 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -152,7 +152,7 @@ public ReClassNetProject Project classesTreeView.BeginUpdate(); - project.Classes.ForEach(AddClass); + project.Classes.ForEach(AddClassInternal); classesTreeView.EndUpdate(); } @@ -347,11 +347,9 @@ public void AddClass(ClassNode node) { Contract.Requires(node != null); - root.Nodes.Add(new ClassTreeNode(node, enableHierarchyView, autoExpand)); + AddClassInternal(node); classesTreeView.Sort(); - - root.Expand(); } /// Removes the class from the view. @@ -379,6 +377,19 @@ public void RemoveClass(ClassNode node) } } + /// + /// Adds a new to the tree. + /// + /// The class to add. + private void AddClassInternal(ClassNode node) + { + Contract.Requires(node != null); + + root.Nodes.Add(new ClassTreeNode(node, enableHierarchyView, autoExpand)); + + root.Expand(); + } + /// Searches for the ClassTreeNode which represents the class. /// The class to search. /// The found class tree node. From 93e716a1f4e838f938a611dc8bac4e88f31dc2c7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 24 Apr 2018 22:35:51 +0200 Subject: [PATCH 292/777] Fixed nodes not sorted after loading a project. --- ReClass.NET/UI/ClassNodeView.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 04befaa7..4d570317 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -154,6 +154,8 @@ public ReClassNetProject Project project.Classes.ForEach(AddClassInternal); + classesTreeView.Sort(); + classesTreeView.EndUpdate(); } } From a58bd1b73bbe64473a8973a30cb18ca087a2d046 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 25 Apr 2018 17:49:53 +0200 Subject: [PATCH 293/777] DPI scale the invalid memory indicator. --- ReClass.NET/Nodes/BaseNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 906df5c1..fe3a0c9e 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -409,7 +409,7 @@ protected void DrawInvalidMemoryIndicator(ViewInfo view, int y) { if (!view.Memory.ContainsValidData) { - view.Context.DrawImage(Properties.Resources.B16x16_Error, 2, y); + AddIcon(view, 2, y, Properties.Resources.B16x16_Error, -1, HotSpotType.None); } } } From 5f4bc9cb95f75666c7e0b8a49e2f94443c15a0e2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 26 Apr 2018 14:50:50 +0200 Subject: [PATCH 294/777] Inverted if. --- ReClass.NET/UI/ClassNodeView.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 4d570317..963dda97 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -359,8 +359,11 @@ public void AddClass(ClassNode node) public void RemoveClass(ClassNode node) { var tn = FindClassTreeNode(node); - if (tn != null) + if (tn == null) { + return; + } + root.Nodes.Remove(tn); tn.Dispose(); @@ -377,7 +380,6 @@ public void RemoveClass(ClassNode node) } } } - } /// /// Adds a new to the tree. From 484c8d559cb6f681fa7b9da6523a64caa52a9463 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 26 Apr 2018 14:54:40 +0200 Subject: [PATCH 295/777] Use direct cast. --- ReClass.NET/UI/ClassNodeView.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 963dda97..eb653365 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -59,7 +59,7 @@ public void Dispose() ClassNode.NameChanged -= NameChanged_Handler; ClassNode.NodesChanged -= NodesChanged_Handler; - Nodes.OfType().ForEach(t => t.Dispose()); + Nodes.Cast().ForEach(t => t.Dispose()); Nodes.Clear(); } @@ -90,12 +90,12 @@ private void RebuildClassHierarchy(HashSet seen) .Distinct() .ToList(); - if (distinctClasses.SequenceEqualsEx(Nodes.OfType().Select(t => t.ClassNode))) + if (distinctClasses.SequenceEqualsEx(Nodes.Cast().Select(t => t.ClassNode))) { return; } - Nodes.OfType().ForEach(t => t.Dispose()); + Nodes.Cast().ForEach(t => t.Dispose()); Nodes.Clear(); foreach (var child in distinctClasses) @@ -136,7 +136,7 @@ public ReClassNetProject Project if (project != value) { - root.Nodes.OfType().ForEach(t => t.Dispose()); + root.Nodes.Cast().ForEach(t => t.Dispose()); root.Nodes.Clear(); if (project != null) @@ -298,9 +298,9 @@ private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs enableHierarchyView.Value = enableHierarchyViewToolStripMenuItem.Checked; - var classes = root.Nodes.OfType().Select(t => t.ClassNode).ToList(); + var classes = root.Nodes.Cast().Select(t => t.ClassNode).ToList(); - root.Nodes.OfType().ForEach(t => t.Dispose()); + root.Nodes.Cast().ForEach(t => t.Dispose()); root.Nodes.Clear(); classes.ForEach(AddClass); @@ -399,7 +399,7 @@ private void AddClassInternal(ClassNode node) /// The found class tree node. private ClassTreeNode FindClassTreeNode(ClassNode node) { - return root.Nodes.OfType().FirstOrDefault(t => t.ClassNode == node); + return root.Nodes.Cast().FirstOrDefault(t => t.ClassNode == node); } } } From ba6c86f2aa735f39aeb73c3cfc75d366e4dc2f48 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 26 Apr 2018 14:55:45 +0200 Subject: [PATCH 296/777] Disable hierarchy view by default. --- ReClass.NET/UI/ClassNodeView.Designer.cs | 6 +++--- ReClass.NET/UI/ClassNodeView.cs | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.Designer.cs b/ReClass.NET/UI/ClassNodeView.Designer.cs index 9290e5ad..4c3b1dfd 100644 --- a/ReClass.NET/UI/ClassNodeView.Designer.cs +++ b/ReClass.NET/UI/ClassNodeView.Designer.cs @@ -129,12 +129,10 @@ private void InitializeComponent() this.toolStripSeparator3, this.addNewClassToolStripMenuItem}); this.rootContextMenuStrip.Name = "rootContextMenuStrip"; - this.rootContextMenuStrip.Size = new System.Drawing.Size(221, 126); + this.rootContextMenuStrip.Size = new System.Drawing.Size(221, 148); // // enableHierarchyViewToolStripMenuItem // - this.enableHierarchyViewToolStripMenuItem.Checked = true; - this.enableHierarchyViewToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.enableHierarchyViewToolStripMenuItem.Name = "enableHierarchyViewToolStripMenuItem"; this.enableHierarchyViewToolStripMenuItem.Size = new System.Drawing.Size(220, 22); this.enableHierarchyViewToolStripMenuItem.Text = "Enable hierarchy view"; @@ -154,6 +152,7 @@ private void InitializeComponent() // // expandAllClassesToolStripMenuItem // + this.expandAllClassesToolStripMenuItem.Enabled = false; this.expandAllClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Tree_Expand; this.expandAllClassesToolStripMenuItem.Name = "expandAllClassesToolStripMenuItem"; this.expandAllClassesToolStripMenuItem.Size = new System.Drawing.Size(220, 22); @@ -162,6 +161,7 @@ private void InitializeComponent() // // collapseAllClassesToolStripMenuItem // + this.collapseAllClassesToolStripMenuItem.Enabled = false; this.collapseAllClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Tree_Collapse; this.collapseAllClassesToolStripMenuItem.Name = "collapseAllClassesToolStripMenuItem"; this.collapseAllClassesToolStripMenuItem.Size = new System.Drawing.Size(220, 22); diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index eb653365..da15ea8a 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -189,7 +189,7 @@ public ClassNodeView() DoubleBuffered = true; - enableHierarchyView = new ValueTypeWrapper(true); + enableHierarchyView = new ValueTypeWrapper(false); autoExpand = new ValueTypeWrapper(false); classesTreeView.ImageList = new ImageList(); @@ -296,6 +296,9 @@ private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs { enableHierarchyViewToolStripMenuItem.Checked = !enableHierarchyViewToolStripMenuItem.Checked; + expandAllClassesToolStripMenuItem.Enabled = + collapseAllClassesToolStripMenuItem.Enabled = enableHierarchyViewToolStripMenuItem.Checked; + enableHierarchyView.Value = enableHierarchyViewToolStripMenuItem.Checked; var classes = root.Nodes.Cast().Select(t => t.ClassNode).ToList(); From 02ddd923c65ed24ac5d3a611a438448f7d5d32b0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 26 Apr 2018 14:56:34 +0200 Subject: [PATCH 297/777] Use BeginUpdate on big changes. --- ReClass.NET/UI/ClassNodeView.cs | 36 +++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index da15ea8a..622036c1 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -136,6 +136,8 @@ public ReClassNetProject Project if (project != value) { + classesTreeView.BeginUpdate(); + root.Nodes.Cast().ForEach(t => t.Dispose()); root.Nodes.Clear(); @@ -150,8 +152,6 @@ public ReClassNetProject Project project.ClassAdded += AddClass; project.ClassRemoved += RemoveClass; - classesTreeView.BeginUpdate(); - project.Classes.ForEach(AddClassInternal); classesTreeView.Sort(); @@ -303,10 +303,16 @@ private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs var classes = root.Nodes.Cast().Select(t => t.ClassNode).ToList(); + classesTreeView.BeginUpdate(); + root.Nodes.Cast().ForEach(t => t.Dispose()); root.Nodes.Clear(); - classes.ForEach(AddClass); + classes.ForEach(AddClassInternal); + + classesTreeView.Sort(); + + classesTreeView.EndUpdate(); } private void autoExpandHierarchyViewToolStripMenuItem_Click(object sender, EventArgs e) @@ -367,22 +373,22 @@ public void RemoveClass(ClassNode node) return; } - root.Nodes.Remove(tn); + root.Nodes.Remove(tn); - tn.Dispose(); + tn.Dispose(); - if (selectedClass == node) + if (selectedClass == node) + { + if (root.Nodes.Count > 0) { - if (root.Nodes.Count > 0) - { - classesTreeView.SelectedNode = root.Nodes[0]; - } - else - { - SelectedClass = null; - } + classesTreeView.SelectedNode = root.Nodes[0]; + } + else + { + SelectedClass = null; } } + } /// /// Adds a new to the tree. From 566ae12907c50d62c19dcfd6f6a1356260e6cb02 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 9 May 2018 11:38:43 +0200 Subject: [PATCH 298/777] Implemented double click to expand nodes. (fixed #30) --- ReClass.NET/UI/MemoryViewControl.cs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 21a91b0a..eee69a6b 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -451,17 +451,29 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) editBox.Visible = false; - foreach (var hotSpot in hotSpots.Where(h => h.Type == HotSpotType.Edit)) + foreach (var hotSpot in hotSpots.Where(h => h.Type == HotSpotType.Edit || h.Type == HotSpotType.Select)) { if (hotSpot.Rect.Contains(e.Location)) { - editBox.BackColor = Program.Settings.SelectedColor; - editBox.HotSpot = hotSpot; - editBox.Visible = true; + if (hotSpot.Type == HotSpotType.Edit) + { + editBox.BackColor = Program.Settings.SelectedColor; + editBox.HotSpot = hotSpot; + editBox.Visible = true; - editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; + editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; - break; + break; + } + + if (hotSpot.Type == HotSpotType.Select) + { + hotSpot.Node.ToggleLevelOpen(hotSpot.Level); + + Invalidate(); + + break; + } } } } From a41ad33dbda07928effe18c4807d9624d04494d1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 13 May 2018 00:57:03 +0200 Subject: [PATCH 299/777] Fixed bug introduced with 566ae12. --- ReClass.NET/UI/MemoryViewControl.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index eee69a6b..b2ef658e 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -451,6 +451,9 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) editBox.Visible = false; + BaseNode toggleNode = null; + var level = 0; + foreach (var hotSpot in hotSpots.Where(h => h.Type == HotSpotType.Edit || h.Type == HotSpotType.Select)) { if (hotSpot.Rect.Contains(e.Location)) @@ -463,19 +466,23 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; - break; + return; } if (hotSpot.Type == HotSpotType.Select) { - hotSpot.Node.ToggleLevelOpen(hotSpot.Level); - - Invalidate(); - - break; + toggleNode = hotSpot.Node; + level = hotSpot.Level; } } } + + if (toggleNode != null) + { + toggleNode.ToggleLevelOpen(level); + + Invalidate(); + } } private Point toolTipPosition; From 93c6e22c072768be81bdff47b4760176b66b9320 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Jul 2018 23:55:12 +0200 Subject: [PATCH 300/777] Fixed errors from #70 introduced with 37f91bb and 8651995. --- ReClass.NET/Memory/Disassembler.cs | 32 ++++++++++++------------------ 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 62e39ac5..16b65177 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -1,10 +1,10 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Linq; using System.Runtime.InteropServices; using ReClassNET.Core; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.Memory { @@ -143,12 +143,16 @@ public IList DisassembleFunction(byte[] data, IntPtr vi /// The prior instruction. public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess process, IntPtr address) { - var buffer = process.ReadRemoteMemory(address - 6 * MaximumInstructionLength, 7 * MaximumInstructionLength); + const int TotalBufferSize = 7 * MaximumInstructionLength; + const int BufferShiftSize = 6 * MaximumInstructionLength; + + var buffer = process.ReadRemoteMemory(address - BufferShiftSize, TotalBufferSize); var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { var bufferAddress = handle.AddrOfPinnedObject(); + var targetBufferAddress = bufferAddress + BufferShiftSize; var instruction = default(InstructionData); @@ -157,16 +161,16 @@ public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess proces 6 * MaximumInstructionLength, 4 * MaximumInstructionLength, 2 * MaximumInstructionLength, - MaximumInstructionLength, + 1 * MaximumInstructionLength, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }) { - var currentAddress = bufferAddress - offset; + var currentAddress = targetBufferAddress - offset; coreFunctions.DisassembleCode(currentAddress, offset + 1, address - offset, false, (ref InstructionData data) => { var nextAddress = currentAddress + data.Length; - if (nextAddress.CompareTo(address) > -1) + if (nextAddress.CompareTo(targetBufferAddress) > 0) { return false; } @@ -178,7 +182,7 @@ public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess proces return true; }); - if (currentAddress == address) + if (currentAddress == targetBufferAddress) { return new DisassembledInstruction(ref instruction); } @@ -227,19 +231,9 @@ public IntPtr RemoteGetFunctionStartAddress(RemoteProcess process, IntPtr addres if (prevInstruction.Length == 1 && prevInstruction.Data[0] == 0xCC) { // Disassemble the code from the start and check if the instructions sum up to address. - var length = 0; - var res = coreFunctions.DisassembleCode(start, address.Sub(start).ToInt32(), IntPtr.Zero, false, (ref InstructionData data) => - { - length += data.Length; - - return true; - }); - if (!res) - { - continue; - } - - if (start + length == address) + var totalInstructionLength = RemoteDisassembleCode(process, start, address.Sub(start).ToInt32()) + .Sum(ins => ins.Length); + if (start + totalInstructionLength == address) { return start; } From 70466ef3151f62709ae1c290b430301dd8e6a514 Mon Sep 17 00:00:00 2001 From: DrP3pp3r Date: Sun, 26 Aug 2018 18:17:30 +0200 Subject: [PATCH 301/777] Fixed Handle leak in EnumerateProcesses --- NativeCore/Windows/EnumerateProcesses.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index ff7f4a71..6227c4f3 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -79,8 +79,13 @@ void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) callbackProcess(&data); } + } + + if (process && process != INVALID_HANDLE_VALUE) + { CloseRemoteProcess(process); } + } while (Process32NextW(handle, &pe32)); } From 896fe7f8cd7f957d0dabe7c6d14b5e9e99d8c310 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 26 Aug 2018 18:21:17 +0200 Subject: [PATCH 302/777] Moved check into method. --- NativeCore/Windows/CloseRemoteProcess.cpp | 5 +++++ NativeCore/Windows/EnumerateProcesses.cpp | 5 +---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NativeCore/Windows/CloseRemoteProcess.cpp b/NativeCore/Windows/CloseRemoteProcess.cpp index 7cdb91cd..413ef8a1 100644 --- a/NativeCore/Windows/CloseRemoteProcess.cpp +++ b/NativeCore/Windows/CloseRemoteProcess.cpp @@ -4,5 +4,10 @@ void RC_CallConv CloseRemoteProcess(RC_Pointer handle) { + if (handle == nullptr) + { + return; + } + CloseHandle(handle); } diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index 6227c4f3..e7d14faf 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -81,10 +81,7 @@ void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) } - if (process && process != INVALID_HANDLE_VALUE) - { - CloseRemoteProcess(process); - } + CloseRemoteProcess(process); } while (Process32NextW(handle, &pe32)); } From cb1851c866209c265ecec076fd3be96070bf7124 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 26 Aug 2018 18:22:07 +0200 Subject: [PATCH 303/777] Removed windows dependent constant. --- NativeCore/Windows/IsProcessValid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/IsProcessValid.cpp b/NativeCore/Windows/IsProcessValid.cpp index fccf22cb..7f880dfe 100644 --- a/NativeCore/Windows/IsProcessValid.cpp +++ b/NativeCore/Windows/IsProcessValid.cpp @@ -4,7 +4,7 @@ bool RC_CallConv IsProcessValid(RC_Pointer handle) { - if (!handle || handle == INVALID_HANDLE_VALUE) + if (handle == nullptr) { return false; } From 1e92aba4b6ede17a65c8c33f59c09750cae4603e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 29 Nov 2018 21:02:15 +0100 Subject: [PATCH 304/777] Increased valid float range. Make invalid floats distinguishable. --- ReClass.NET/Memory/NodeDissector.cs | 7 +++---- ReClass.NET/Nodes/BaseHexCommentNode.cs | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 317c0214..041f20f4 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -4,7 +4,6 @@ using System.Linq; using ReClassNET.Extensions; using ReClassNET.Nodes; -using ReClassNET.Util; namespace ReClassNET.Memory { @@ -78,12 +77,12 @@ public static Type GuessType(BaseHexNode node, MemoryBuffer memory) if (data32.IntValue != 0) { // If the data represents a reasonable range, it could be a float. - if (-99999.0f <= data32.FloatValue && data32.FloatValue <= 99999.0f && !data32.FloatValue.IsNearlyEqual(0.0f, 0.001f)) + if (-999999.0f <= data32.FloatValue && data32.FloatValue <= 999999.0f && !data32.FloatValue.IsNearlyEqual(0.0f, 0.001f)) { return typeof(FloatNode); } - if (-99999 <= data32.IntValue && data32.IntValue <= 99999) + if (-999999 <= data32.IntValue && data32.IntValue <= 999999) { return typeof(Int32Node); } @@ -95,7 +94,7 @@ public static Type GuessType(BaseHexNode node, MemoryBuffer memory) if (data64.LongValue != 0) { // If the data represents a reasonable range, it could be a double. - if (-99999.0 <= data64.DoubleValue && data64.DoubleValue <= 99999.0 && !data64.DoubleValue.IsNearlyEqual(0.0, 0.001)) + if (-999999.0 <= data64.DoubleValue && data64.DoubleValue <= 999999.0 && !data64.DoubleValue.IsNearlyEqual(0.0, 0.001)) { return typeof(DoubleNode); } diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index f73ef07e..e03dbada 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -4,7 +4,6 @@ using System.Text; using ReClassNET.Extensions; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -16,7 +15,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentFloat) { - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, $"{(fvalue > -99999.0f && fvalue < 99999.0f ? fvalue : 0.0f):0.000}") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, fvalue > -999999.0f && fvalue < 999999.0f ? fvalue.ToString("0.000") : "#####") + view.Font.Width; } if (view.Settings.ShowCommentInteger) { From 805d61881bed42f3919dc207ef304eb34772f641 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 14 Dec 2018 20:40:06 +0100 Subject: [PATCH 305/777] Added IntPtr.ToInt64Bits. --- ReClass.NET/Extensions/IntPtrExtensions.cs | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index 646f0a5c..42ee257b 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -115,5 +115,34 @@ public static int CompareToRange(this IntPtr address, IntPtr start, IntPtr end) } return CompareTo(address, start); } + + /// + /// Changes the behaviour of ToInt64 in x86 mode. + /// IntPtr(int.MaxValue + 1) = (int)0x80000000 (-2147483648) = (long)0xFFFFFFFF80000000 + /// This method converts the value to (long)0x0000000080000000 (2147483648). + /// + /// + /// + [Pure] + [DebuggerStepThrough] + public static long ToInt64Bits(this IntPtr ptr) + { +#if RECLASSNET64 + return ptr.ToInt64(); +#else + var value = ptr.ToInt64(); + + if (value < 0) + { + var intValue = ptr.ToInt32(); + if (value == intValue) + { + value = intValue & 0xFFFFFFFFL; + } + } + + return value; +#endif + } } } From 3ea90cb82eaa65a6f460b4f37121727e3caf416f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:25:36 +0100 Subject: [PATCH 306/777] Use Equals instead operator==. --- ReClass.NET/Extensions/EncodingExtensions.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index e76ec2fd..696295f4 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -5,14 +5,14 @@ namespace ReClassNET.Extensions { public static class EncodingExtension { - /// Gets the (wrong) byte count per character. Special chars may need more bytes per character. + /// Gets the (perhaps wrong) byte count per character. Special characters may need more bytes. /// The encoding. /// The byte count per character. public static int GetSimpleByteCountPerChar(this Encoding encoding) { - if (encoding == Encoding.UTF8 || encoding == Encoding.ASCII) return 1; - if (encoding == Encoding.Unicode) return 2; - if (encoding == Encoding.UTF32) return 4; + if (encoding.Equals(Encoding.UTF8) || encoding.Equals(Encoding.ASCII)) return 1; + if (encoding.Equals(Encoding.Unicode)) return 2; + if (encoding.Equals(Encoding.UTF32)) return 4; throw new NotImplementedException(); } From 62d64812d1f91d46cf5da868e547a40b798304d4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:32:09 +0100 Subject: [PATCH 307/777] Improved pattern scanner performance. --- ReClass.NET/MemoryScanner/BytePattern.cs | 123 +++++++++++++++++------ 1 file changed, 95 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index 414d2494..6f4779a7 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Text; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner { @@ -23,7 +22,30 @@ public enum PatternFormat public class BytePattern { - private struct PatternByte + private interface IPatternByte + { + /// + /// Gets the byte value of the pattern byte if possible. + /// + /// + byte ToByte(); + + /// + /// Compares the pattern byte with the given byte. + /// + /// + /// + bool Equals(byte b); + + /// + /// Formats the pattern byte as string. + /// + /// + /// + Tuple ToString(PatternFormat format); + } + + private class PatternByte : IPatternByte { private struct Nibble { @@ -36,19 +58,9 @@ private struct Nibble public bool HasWildcard => nibble1.IsWildcard || nibble2.IsWildcard; - public byte ByteValue => !HasWildcard ? (byte)((nibble1.Value << 4) + nibble2.Value) : throw new InvalidOperationException(); - - public static PatternByte AsByte(byte b) - { - var pb = new PatternByte - { - nibble1 = { Value = (b >> 4) & 0xF }, - nibble2 = { Value = b & 0xF } - }; - return pb; - } + public byte ToByte() => !HasWildcard ? (byte)((nibble1.Value << 4) + nibble2.Value) : throw new InvalidOperationException(); - public static PatternByte AsWildcard() + public static PatternByte NewWildcardByte() { var pb = new PatternByte { @@ -105,16 +117,15 @@ public bool TryRead(StringReader sr) public bool Equals(byte b) { - var matched = 0; if (nibble1.IsWildcard || ((b >> 4) & 0xF) == nibble1.Value) { - ++matched; - } - if (nibble2.IsWildcard || (b & 0xF) == nibble2.Value) - { - ++matched; + if (nibble2.IsWildcard || (b & 0xF) == nibble2.Value) + { + return true; + } } - return matched == 2; + + return false; } public Tuple ToString(PatternFormat format) @@ -122,14 +133,14 @@ public Tuple ToString(PatternFormat format) switch (format) { case PatternFormat.PatternAndMask: - return HasWildcard ? Tuple.Create("\\x00", "?") : Tuple.Create($"\\x{ByteValue:X02}", "x"); + return HasWildcard ? Tuple.Create("\\x00", "?") : Tuple.Create($"\\x{ToByte():X02}", "x"); case PatternFormat.Combined: var sb = new StringBuilder(); if (nibble1.IsWildcard) sb.Append('?'); else sb.AppendFormat("{0:X}", nibble1.Value); if (nibble2.IsWildcard) sb.Append('?'); else sb.AppendFormat("{0:X}", nibble2.Value); - return Tuple.Create(sb.ToString(), null); + return Tuple.Create(sb.ToString(), (string)null); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } @@ -138,7 +149,34 @@ public Tuple ToString(PatternFormat format) public override string ToString() => ToString(PatternFormat.Combined).Item1; } - private readonly List pattern = new List(); + private class SimplePatternByte : IPatternByte + { + private readonly byte value; + + public SimplePatternByte(byte value) + { + this.value = value; + } + + public byte ToByte() => value; + + public bool Equals(byte b) => value == b; + + public Tuple ToString(PatternFormat format) + { + switch (format) + { + case PatternFormat.PatternAndMask: + return Tuple.Create($"\\x{ToByte():X02}", "x"); + case PatternFormat.Combined: + return Tuple.Create($"{ToByte():X02}", (string)null); + default: + throw new ArgumentOutOfRangeException(nameof(format), format, null); + } + } + } + + private readonly List pattern = new List(); /// /// Gets the length of the pattern in byte. @@ -148,7 +186,12 @@ public Tuple ToString(PatternFormat format) /// /// Gets if the pattern contains wildcards. /// - public bool HasWildcards => pattern.Any(pb => pb.HasWildcard); + public bool HasWildcards => pattern.Any(pb => pb is PatternByte pb2 && pb2.HasWildcard); + + private BytePattern() + { + + } /// /// Parses the provided string for a byte pattern. Wildcards are supported by nibble. @@ -175,7 +218,14 @@ public static BytePattern Parse(string value) var pb = new PatternByte(); while (pb.TryRead(sr)) { - pattern.pattern.Add(pb); + if (!pb.HasWildcard) + { + pattern.pattern.Add(new SimplePatternByte(pb.ToByte())); + } + else + { + pattern.pattern.Add(pb); + } } // Check if we are not at the end of the stream @@ -188,13 +238,30 @@ public static BytePattern Parse(string value) return pattern; } + /// + /// Creates a byte pattern from the provided bytes. + /// + /// The bytes to match. + /// + public static BytePattern From(IEnumerable data) + { + var pattern = new BytePattern(); + pattern.pattern.AddRange(data.Select(b => new SimplePatternByte(b))); + return pattern; + } + + /// + /// Creates a byte pattern with wildcard support from the provided bytes. The boolean tuple item signals a wildcard. + /// + /// The byte data or the wildcard flag. + /// public static BytePattern From(IEnumerable> data) { var pattern = new BytePattern(); foreach (var i in data) { - var pb = i.Item2 ? PatternByte.AsWildcard() : PatternByte.AsByte(i.Item1); + var pb = i.Item2 ? (IPatternByte)PatternByte.NewWildcardByte() : new SimplePatternByte(i.Item1); pattern.pattern.Add(pb); } @@ -238,7 +305,7 @@ public byte[] ToByteArray() throw new InvalidOperationException(); } - return pattern.Select(pb => pb.ByteValue).ToArray(); + return pattern.Select(pb => pb.ToByte()).ToArray(); } /// From db76c3282af578bc48d6b82f9d2840bfe6b2645e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:34:58 +0100 Subject: [PATCH 308/777] Changed logic to represent comment. --- ReClass.NET/Memory/RemoteProcess.cs | 4 ++-- ReClass.NET/Nodes/BaseTextPtrNode.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 55ee4eb0..ec45517b 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -341,7 +341,7 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) Contract.Requires(length >= 0); Contract.Ensures(Contract.Result() != null); - var data = ReadRemoteMemory(address, length); + var data = ReadRemoteMemory(address, length * encoding.GetSimpleByteCountPerChar()); try { diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index f73144ad..0681b120 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Text; @@ -32,7 +32,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) } var ptr = view.Memory.ReadIntPtr(Offset); - var text = view.Memory.Process.ReadRemoteString(Encoding, ptr, 64 * Encoding.GetSimpleByteCountPerChar()); + var text = view.Memory.Process.ReadRemoteString(Encoding, ptr, 64); DrawInvalidMemoryIndicator(view, y); From a803779bba9cd1d43d86fbd9ca26581ba766c73c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:40:45 +0100 Subject: [PATCH 309/777] Made method public. --- ReClass.NET/MemoryScanner/PatternScanner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/MemoryScanner/PatternScanner.cs b/ReClass.NET/MemoryScanner/PatternScanner.cs index 33adb8dd..48e901d2 100644 --- a/ReClass.NET/MemoryScanner/PatternScanner.cs +++ b/ReClass.NET/MemoryScanner/PatternScanner.cs @@ -71,7 +71,7 @@ public static IntPtr FindPattern(BytePattern pattern, RemoteProcess process, Int /// The pattern to search. /// The data to scan. /// The index in data where the pattern was found or -1 otherwise. - private static int FindPattern(BytePattern pattern, byte[] data) + public static int FindPattern(BytePattern pattern, byte[] data) { Contract.Requires(pattern != null); Contract.Requires(data != null); From b629e2ad83acc167fae46a2f56bbc29b5d84eb5a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:42:07 +0100 Subject: [PATCH 310/777] Generalized method to accept custom encodings. --- ReClass.NET/Memory/RemoteProcess.cs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index ec45517b..3451375a 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -10,6 +10,7 @@ using ReClassNET.Core; using ReClassNET.Debugger; using ReClassNET.Extensions; +using ReClassNET.MemoryScanner; using ReClassNET.Native; using ReClassNET.Symbols; using ReClassNET.Util; @@ -366,24 +367,24 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) } } - /// Reads a string from the address in the remote process with the given length using UTF8 encoding. The string gets truncated at the first zero character. + /// Reads a string from the address in the remote process with the given length and encoding. The string gets truncated at the first zero character. + /// The encoding used by the string. /// The address of the string. /// The length of the string. /// The string. - public string ReadRemoteUTF8StringUntilFirstNullCharacter(IntPtr address, int length) + public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length) { + Contract.Requires(encoding != null); Contract.Requires(length >= 0); Contract.Ensures(Contract.Result() != null); - var data = ReadRemoteMemory(address, length); + var data = ReadRemoteMemory(address, length * encoding.GetSimpleByteCountPerChar()); - int index = 0; - for (; index < data.Length; ++index) + // TODO We should cache the pattern per encoding. + var index = PatternScanner.FindPattern(BytePattern.From(new byte[encoding.GetSimpleByteCountPerChar()]), data); + if (index == -1) { - if (data[index] == 0) - { - break; - } + index = data.Length; } try @@ -444,7 +445,7 @@ private string ReadRemoteRuntimeTypeInformation32(IntPtr address) var typeDescriptorPtr = ReadRemoteIntPtr(baseClassDescriptorPtr); if (typeDescriptorPtr.MayBeValid()) { - var name = ReadRemoteUTF8StringUntilFirstNullCharacter(typeDescriptorPtr + 0x0C, 60); + var name = ReadRemoteStringUntilFirstNullCharacter(Encoding.UTF8, typeDescriptorPtr + 0x0C, 60); if (name.EndsWith("@@")) { name = NativeMethods.UndecorateSymbolName("?" + name); @@ -506,7 +507,7 @@ private string ReadRemoteRuntimeTypeInformation64(IntPtr address) { var typeDescriptorPtr = baseAddress + typeDescriptorOffset; - var name = ReadRemoteUTF8StringUntilFirstNullCharacter(typeDescriptorPtr + 0x14, 60); + var name = ReadRemoteStringUntilFirstNullCharacter(Encoding.UTF8, typeDescriptorPtr + 0x14, 60); if (string.IsNullOrEmpty(name)) { break; From 86281f619fa9707b8327c3af3c62b58e630d2073 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 16 Dec 2018 01:44:17 +0100 Subject: [PATCH 311/777] Removed usings. --- ReClass.NET/Nodes/BaseTextPtrNode.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 0681b120..2e61bac9 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -1,10 +1,8 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Text; -using ReClassNET.Extensions; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { From c6e289100dfb02ef4dd0edf6d2270ab531db686b Mon Sep 17 00:00:00 2001 From: 70rmund <> Date: Thu, 20 Dec 2018 12:21:11 -0500 Subject: [PATCH 312/777] Added Hidden Nodes Feature to Reclass.NET --- .../DataExchange/ReClass/ReClassFile.cs | 8 +- .../ReClass/ReClassNetFile.Constants.cs | 3 +- .../ReClass/ReClassNetFile.Read.cs | 4 +- .../ReClass/ReClassNetFile.Write.cs | 4 +- ReClass.NET/Nodes/BaseNode.cs | 4 +- ReClass.NET/UI/MemoryViewControl.Designer.cs | 46 +++++- ReClass.NET/UI/MemoryViewControl.cs | 145 ++++++++++++++++++ 7 files changed, 205 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index ee24fd87..3e8d46db 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -165,9 +165,10 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute("Name")?.Value ?? string.Empty; node.Comment = element.Attribute("Comment")?.Value ?? string.Empty; + node.IsHidden = element.Attribute("bHidden")?.Value.Equals("1") ?? false; - // Convert the Custom node into normal hex nodes. - if (node is CustomNode) + // Convert the Custom node into normal hex nodes. + if (node is CustomNode) { int.TryParse(element.Attribute("Size")?.Value, out var size); @@ -243,7 +244,8 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C .Select(e => new VMethodNode { Name = e.Attribute("Name")?.Value ?? string.Empty, - Comment = e.Attribute("Comment")?.Value ?? string.Empty + Comment = e.Attribute("Comment")?.Value ?? string.Empty, + IsHidden = e.Attribute("bHidden")?.Value.Equals("1") ?? false }) .ForEach(vtableNode.AddNode); break; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs index af43976c..c82a5ec7 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs @@ -23,7 +23,8 @@ public partial class ReClassNetFile public const string XmlUuidAttribute = "uuid"; public const string XmlNameAttribute = "name"; public const string XmlCommentAttribute = "comment"; - public const string XmlAddressAttribute = "address"; + public const string XmlHiddenAttribute = "hidden"; + public const string XmlAddressAttribute = "address"; public const string XmlTypeAttribute = "type"; public const string XmlReferenceAttribute = "reference"; public const string XmlCountAttribute = "count"; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index e91129ed..9faa1446 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -132,6 +132,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty; node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty; + node.IsHidden = element.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false; if (node is BaseReferenceNode referenceNode) { @@ -164,7 +165,8 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C .Select(e => new VMethodNode { Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, - Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty + Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, + IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false }) .ForEach(vtableNode.AddNode); break; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index c04c96db..18da7319 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -89,6 +89,7 @@ private static IEnumerable CreateNodeElements(IEnumerable no XmlNodeElement, new XAttribute(XmlNameAttribute, node.Name ?? string.Empty), new XAttribute(XmlCommentAttribute, node.Comment ?? string.Empty), + new XAttribute(XmlHiddenAttribute, node.IsHidden.ToString()), new XAttribute(XmlTypeAttribute, typeString) ); @@ -104,7 +105,8 @@ private static IEnumerable CreateNodeElements(IEnumerable no element.Add(vtableNode.Nodes.Select(n => new XElement( XmlMethodElement, new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), - new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty) + new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty), + new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) ))); break; } diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index fe3a0c9e..a7cdeb99 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -21,7 +21,7 @@ public abstract class BaseNode internal static readonly List NodeInfoReader = new List(); protected static readonly int TextPadding = Icons.Dimensions; - protected static readonly int HiddenHeight = 1; + protected static readonly int HiddenHeight = 0; private static int nodeIndex = 0; @@ -41,7 +41,7 @@ public abstract class BaseNode public BaseContainerNode ParentNode { get; internal set; } /// Gets or sets a value indicating whether this object is hidden. - public bool IsHidden { get; protected set; } + public bool IsHidden { get; set; } /// Gets or sets a value indicating whether this object is selected. public bool IsSelected { get; set; } diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index d556aae7..4244a301 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -101,6 +101,10 @@ private void InitializeComponent() this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.copyNodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.pasteNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.hideNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideChildNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideNodesBelowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideNodesAboveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -131,6 +135,10 @@ private void InitializeComponent() this.toolStripSeparator14, this.copyNodeToolStripMenuItem, this.pasteNodesToolStripMenuItem, + this.hideNodesToolStripMenuItem, + this.unhideChildNodesToolStripMenuItem, + this.unhideNodesBelowToolStripMenuItem, + this.unhideNodesAboveToolStripMenuItem, this.removeToolStripMenuItem, this.toolStripSeparator12, this.copyAddressToolStripMenuItem, @@ -769,7 +777,39 @@ private void InitializeComponent() this.pasteNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); this.pasteNodesToolStripMenuItem.Text = "Paste Node(s)"; this.pasteNodesToolStripMenuItem.Click += new System.EventHandler(this.pasteNodesToolStripMenuItem_Click); - // + // + // hideNodesToolStripMenuItem + // + this.hideNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.hideNodesToolStripMenuItem.Name = "hideNodesToolStripMenuItem"; + this.hideNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.hideNodesToolStripMenuItem.Text = "Hide selected Node(s)"; + this.hideNodesToolStripMenuItem.Click += new System.EventHandler(this.hideNodesToolStripMenuItem_Click); + // + // unhideChildNodesToolStripMenuItem + // + this.unhideChildNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideChildNodesToolStripMenuItem.Name = "unhideChildNodesToolStripMenuItem"; + this.unhideChildNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.unhideChildNodesToolStripMenuItem.Text = "Unhide child Node(s)"; + this.unhideChildNodesToolStripMenuItem.Click += new System.EventHandler(this.unhideChildNodesToolStripMenuItem_Click); + // + // unhideNodesBelowToolStripMenuItem + // + this.unhideNodesBelowToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideNodesBelowToolStripMenuItem.Name = "unhideNodesBelowToolStripMenuItem"; + this.unhideNodesBelowToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.unhideNodesBelowToolStripMenuItem.Text = "Unhide Node(s) below"; + this.unhideNodesBelowToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesBelowToolStripMenuItem_Click); + // + // unhideNodesAboveToolStripMenuItem + // + this.unhideNodesAboveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideNodesAboveToolStripMenuItem.Name = "unhideNodesAboveToolStripMenuItem"; + this.unhideNodesAboveToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.unhideNodesAboveToolStripMenuItem.Text = "Unhide Node(s) above"; + this.unhideNodesAboveToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesAboveToolStripMenuItem_Click); + // // removeToolStripMenuItem // this.removeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; @@ -914,6 +954,10 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; private System.Windows.Forms.ToolStripMenuItem copyNodeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem pasteNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem hideNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideChildNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideNodesBelowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideNodesAboveToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; private System.Windows.Forms.ToolStripMenuItem dissectNodesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index b2ef658e..d68e488b 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -316,6 +316,7 @@ protected override void OnMouseClick(MouseEventArgs e) continue; } + if (hotSpot.Node is BaseContainerNode) continue; var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset.ToInt32()); var last = first == hotSpot ? selectedNodes[0] : hotSpot; @@ -777,6 +778,39 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs break; } + var hiddenNodesExistBelow = false; + var hiddenNodesExistAbove = false; + if (count == 1) + { + var selNode = SelectedNodes.ElementAt(0); + var parNode = SelectedNodes.ElementAt(0).ParentNode; + if (parNode != null) + { + var selNodeIndex = parNode.FindNodeIndex(selNode); + if ((selNodeIndex+1 < parNode.Nodes.Count()) && (parNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden == true)) + { + hiddenNodesExistBelow = true; + } + if ((selNodeIndex - 1 > -1) && (parNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden == true)) + { + hiddenNodesExistAbove = true; + } + } + } + + unhideNodesBelowToolStripMenuItem.Enabled = hiddenNodesExistBelow; + unhideNodesAboveToolStripMenuItem.Enabled = hiddenNodesExistAbove; + + + var areNodesHideable = true; + foreach (BaseNode bs in SelectedNodes) areNodesHideable = areNodesHideable & !(bs is ClassNode); + hideNodesToolStripMenuItem.Enabled = areNodesHideable; + + var parentNodeTypeSelected = false; + if ((count == 1) && (SelectedNodes.ElementAt(0) is BaseContainerNode)) parentNodeTypeSelected = true; + unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected; + + addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; insertBytesToolStripMenuItem.Enabled = count == 1 && node?.ParentNode != null; @@ -940,6 +974,26 @@ private void pasteNodesToolStripMenuItem_Click(object sender, EventArgs e) PasteNodeFromClipboardToSelection(); } + private void hideNodesToolStripMenuItem_Click(object sender, EventArgs e) + { + HideSelectedNodes(); + } + + private void unhideNodesBelowToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideNodesBelow(); + } + + private void unhideNodesAboveToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideNodesAbove(); + } + + private void unhideChildNodesToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideChildNodes(); + } + private void removeToolStripMenuItem_Click(object sender, EventArgs e) { RemoveSelectedNodes(); @@ -1162,6 +1216,97 @@ private void RemoveSelectedNodes() Invalidate(); } + private void HideSelectedNodes() + { + foreach (HotSpot hs in selectedNodes) hs.Node.IsHidden = true; + + selectedNodes.Clear(); + + OnSelectionChanged(); + + Invalidate(); + } + + private void UnhideChildNodes() + { + BaseContainerNode bcn = (BaseContainerNode) selectedNodes[0].Node; + foreach (BaseNode bn in bcn.Nodes) + { + bn.IsHidden = false; + bn.IsSelected = false; + } + + selectedNodes[0].Node.IsSelected = false; + + selectedNodes.Clear(); + + OnSelectionChanged(); + + Invalidate(); + } + + private void UnhideNodesBelow() + { + var selNode = selectedNodes[0].Node; + var parNode = selNode.ParentNode; + + if (parNode == null) return; + + var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) + 1; + + if (hiddenNodeStartIndex >= parNode.Nodes.Count()) return; + + for (int i = hiddenNodeStartIndex; i < parNode.Nodes.Count(); i++) + { + var indexNode = parNode.Nodes.ElementAt(i); + if (indexNode.IsHidden) + { + indexNode.IsHidden = false; + indexNode.IsSelected = false; + } + else break; + } + + selNode.IsSelected = false; + + selectedNodes.Clear(); + + OnSelectionChanged(); + + Invalidate(); + } + + private void UnhideNodesAbove() + { + var selNode = selectedNodes[0].Node; + var parNode = selNode.ParentNode; + + if (parNode == null) return; + + var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) - 1; + + if (hiddenNodeStartIndex < 0) return; + + for (int i = hiddenNodeStartIndex; i > -1; i--) + { + var indexNode = parNode.Nodes.ElementAt(i); + if (indexNode.IsHidden) + { + indexNode.IsHidden = false; + indexNode.IsSelected = false; + } + else break; + } + + selNode.IsSelected = false; + + selectedNodes.Clear(); + + OnSelectionChanged(); + + Invalidate(); + } + private void CopySelectedNodesToClipboard() { if (selectedNodes.Count > 0) From d046f42b57f6d715db05873bdaeb39c0384492b5 Mon Sep 17 00:00:00 2001 From: 70rmund <> Date: Thu, 20 Dec 2018 12:29:51 -0500 Subject: [PATCH 313/777] Added Hidden Nodes Feature to Reclass.NET --- ReClass.NET/UI/MemoryViewControl.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index d68e488b..27788fbc 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -807,8 +807,14 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs hideNodesToolStripMenuItem.Enabled = areNodesHideable; var parentNodeTypeSelected = false; - if ((count == 1) && (SelectedNodes.ElementAt(0) is BaseContainerNode)) parentNodeTypeSelected = true; - unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected; + var areChildNodesHidden = false; + if ((count == 1) && (SelectedNodes.ElementAt(0) is BaseContainerNode)) + { + var selbcn = (BaseContainerNode)SelectedNodes.ElementAt(0); + parentNodeTypeSelected = true; + foreach (BaseNode bn in selbcn.Nodes) areChildNodesHidden = areChildNodesHidden | bn.IsHidden; + } + unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected & areChildNodesHidden; addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; From 28067cbeaf1dca4c8aa224438bcb93cd088b8536 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 21 Dec 2018 19:28:12 +0100 Subject: [PATCH 314/777] Fixed formatting. --- .../DataExchange/ReClass/ReClassFile.cs | 8 +- .../ReClass/ReClassNetFile.Constants.cs | 4 +- .../ReClass/ReClassNetFile.Read.cs | 2 +- .../ReClass/ReClassNetFile.Write.cs | 4 +- ReClass.NET/UI/MemoryViewControl.cs | 250 +++++++++--------- 5 files changed, 138 insertions(+), 130 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 3e8d46db..18875ae8 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -165,10 +165,10 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute("Name")?.Value ?? string.Empty; node.Comment = element.Attribute("Comment")?.Value ?? string.Empty; - node.IsHidden = element.Attribute("bHidden")?.Value.Equals("1") ?? false; + node.IsHidden = element.Attribute("bHidden")?.Value.Equals("1") ?? false; - // Convert the Custom node into normal hex nodes. - if (node is CustomNode) + // Convert the Custom node into normal hex nodes. + if (node is CustomNode) { int.TryParse(element.Attribute("Size")?.Value, out var size); @@ -245,7 +245,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { Name = e.Attribute("Name")?.Value ?? string.Empty, Comment = e.Attribute("Comment")?.Value ?? string.Empty, - IsHidden = e.Attribute("bHidden")?.Value.Equals("1") ?? false + IsHidden = e.Attribute("bHidden")?.Value.Equals("1") ?? false }) .ForEach(vtableNode.AddNode); break; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs index c82a5ec7..82ff9e8e 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs @@ -23,8 +23,8 @@ public partial class ReClassNetFile public const string XmlUuidAttribute = "uuid"; public const string XmlNameAttribute = "name"; public const string XmlCommentAttribute = "comment"; - public const string XmlHiddenAttribute = "hidden"; - public const string XmlAddressAttribute = "address"; + public const string XmlHiddenAttribute = "hidden"; + public const string XmlAddressAttribute = "address"; public const string XmlTypeAttribute = "type"; public const string XmlReferenceAttribute = "reference"; public const string XmlCountAttribute = "count"; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 9faa1446..86537abc 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -132,7 +132,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty; node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty; - node.IsHidden = element.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false; + node.IsHidden = bool.TryParse(element.Attribute(XmlHiddenAttribute)?.Value, out var val) && val; if (node is BaseReferenceNode referenceNode) { diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 18da7319..67eec212 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -89,7 +89,7 @@ private static IEnumerable CreateNodeElements(IEnumerable no XmlNodeElement, new XAttribute(XmlNameAttribute, node.Name ?? string.Empty), new XAttribute(XmlCommentAttribute, node.Comment ?? string.Empty), - new XAttribute(XmlHiddenAttribute, node.IsHidden.ToString()), + new XAttribute(XmlHiddenAttribute, node.IsHidden.ToString()), new XAttribute(XmlTypeAttribute, typeString) ); @@ -106,7 +106,7 @@ private static IEnumerable CreateNodeElements(IEnumerable no XmlMethodElement, new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty), - new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) + new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) ))); break; } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 27788fbc..59c637f5 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -316,7 +316,11 @@ protected override void OnMouseClick(MouseEventArgs e) continue; } - if (hotSpot.Node is BaseContainerNode) continue; + if (hotSpot.Node is BaseContainerNode) + { + continue; + } + var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset.ToInt32()); var last = first == hotSpot ? selectedNodes[0] : hotSpot; @@ -778,44 +782,48 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs break; } - var hiddenNodesExistBelow = false; - var hiddenNodesExistAbove = false; - if (count == 1) - { - var selNode = SelectedNodes.ElementAt(0); - var parNode = SelectedNodes.ElementAt(0).ParentNode; - if (parNode != null) - { - var selNodeIndex = parNode.FindNodeIndex(selNode); - if ((selNodeIndex+1 < parNode.Nodes.Count()) && (parNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden == true)) - { - hiddenNodesExistBelow = true; - } - if ((selNodeIndex - 1 > -1) && (parNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden == true)) - { - hiddenNodesExistAbove = true; - } - } - } - - unhideNodesBelowToolStripMenuItem.Enabled = hiddenNodesExistBelow; - unhideNodesAboveToolStripMenuItem.Enabled = hiddenNodesExistAbove; - - - var areNodesHideable = true; - foreach (BaseNode bs in SelectedNodes) areNodesHideable = areNodesHideable & !(bs is ClassNode); - hideNodesToolStripMenuItem.Enabled = areNodesHideable; - - var parentNodeTypeSelected = false; - var areChildNodesHidden = false; - if ((count == 1) && (SelectedNodes.ElementAt(0) is BaseContainerNode)) - { - var selbcn = (BaseContainerNode)SelectedNodes.ElementAt(0); - parentNodeTypeSelected = true; - foreach (BaseNode bn in selbcn.Nodes) areChildNodesHidden = areChildNodesHidden | bn.IsHidden; - } - unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected & areChildNodesHidden; + var hiddenNodesExistBelow = false; + var hiddenNodesExistAbove = false; + if (count == 1) + { + var selNode = SelectedNodes.ElementAt(0); + var parNode = SelectedNodes.ElementAt(0).ParentNode; + if (parNode != null) + { + var selNodeIndex = parNode.FindNodeIndex(selNode); + if (selNodeIndex+1 < parNode.Nodes.Count() && parNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden) + { + hiddenNodesExistBelow = true; + } + if (selNodeIndex - 1 > -1 && parNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden) + { + hiddenNodesExistAbove = true; + } + } + } + + unhideNodesBelowToolStripMenuItem.Enabled = hiddenNodesExistBelow; + unhideNodesAboveToolStripMenuItem.Enabled = hiddenNodesExistAbove; + var areNodesHideable = true; + foreach (var bs in SelectedNodes) + { + areNodesHideable = areNodesHideable & !(bs is ClassNode); + } + hideNodesToolStripMenuItem.Enabled = areNodesHideable; + + var parentNodeTypeSelected = false; + var areChildNodesHidden = false; + if (count == 1 && SelectedNodes.ElementAt(0) is BaseContainerNode) + { + var selbcn = (BaseContainerNode)SelectedNodes.ElementAt(0); + parentNodeTypeSelected = true; + foreach (var bn in selbcn.Nodes) + { + areChildNodesHidden = areChildNodesHidden | bn.IsHidden; + } + } + unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected & areChildNodesHidden; addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; insertBytesToolStripMenuItem.Enabled = count == 1 && node?.ParentNode != null; @@ -980,25 +988,25 @@ private void pasteNodesToolStripMenuItem_Click(object sender, EventArgs e) PasteNodeFromClipboardToSelection(); } - private void hideNodesToolStripMenuItem_Click(object sender, EventArgs e) - { - HideSelectedNodes(); - } - - private void unhideNodesBelowToolStripMenuItem_Click(object sender, EventArgs e) - { - UnhideNodesBelow(); - } - - private void unhideNodesAboveToolStripMenuItem_Click(object sender, EventArgs e) - { - UnhideNodesAbove(); - } - - private void unhideChildNodesToolStripMenuItem_Click(object sender, EventArgs e) - { - UnhideChildNodes(); - } + private void hideNodesToolStripMenuItem_Click(object sender, EventArgs e) + { + HideSelectedNodes(); + } + + private void unhideNodesBelowToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideNodesBelow(); + } + + private void unhideNodesAboveToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideNodesAbove(); + } + + private void unhideChildNodesToolStripMenuItem_Click(object sender, EventArgs e) + { + UnhideChildNodes(); + } private void removeToolStripMenuItem_Click(object sender, EventArgs e) { @@ -1222,96 +1230,96 @@ private void RemoveSelectedNodes() Invalidate(); } - private void HideSelectedNodes() - { - foreach (HotSpot hs in selectedNodes) hs.Node.IsHidden = true; + private void HideSelectedNodes() + { + foreach (HotSpot hs in selectedNodes) hs.Node.IsHidden = true; - selectedNodes.Clear(); + selectedNodes.Clear(); - OnSelectionChanged(); + OnSelectionChanged(); - Invalidate(); - } + Invalidate(); + } - private void UnhideChildNodes() - { - BaseContainerNode bcn = (BaseContainerNode) selectedNodes[0].Node; - foreach (BaseNode bn in bcn.Nodes) - { - bn.IsHidden = false; - bn.IsSelected = false; - } + private void UnhideChildNodes() + { + BaseContainerNode bcn = (BaseContainerNode)selectedNodes[0].Node; + foreach (BaseNode bn in bcn.Nodes) + { + bn.IsHidden = false; + bn.IsSelected = false; + } - selectedNodes[0].Node.IsSelected = false; + selectedNodes[0].Node.IsSelected = false; - selectedNodes.Clear(); + selectedNodes.Clear(); - OnSelectionChanged(); + OnSelectionChanged(); - Invalidate(); - } + Invalidate(); + } - private void UnhideNodesBelow() - { - var selNode = selectedNodes[0].Node; - var parNode = selNode.ParentNode; + private void UnhideNodesBelow() + { + var selNode = selectedNodes[0].Node; + var parNode = selNode.ParentNode; - if (parNode == null) return; + if (parNode == null) return; - var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) + 1; + var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) + 1; - if (hiddenNodeStartIndex >= parNode.Nodes.Count()) return; + if (hiddenNodeStartIndex >= parNode.Nodes.Count()) return; - for (int i = hiddenNodeStartIndex; i < parNode.Nodes.Count(); i++) - { - var indexNode = parNode.Nodes.ElementAt(i); - if (indexNode.IsHidden) - { - indexNode.IsHidden = false; - indexNode.IsSelected = false; - } - else break; - } + for (int i = hiddenNodeStartIndex; i < parNode.Nodes.Count(); i++) + { + var indexNode = parNode.Nodes.ElementAt(i); + if (indexNode.IsHidden) + { + indexNode.IsHidden = false; + indexNode.IsSelected = false; + } + else break; + } - selNode.IsSelected = false; + selNode.IsSelected = false; - selectedNodes.Clear(); + selectedNodes.Clear(); - OnSelectionChanged(); + OnSelectionChanged(); - Invalidate(); - } + Invalidate(); + } - private void UnhideNodesAbove() - { - var selNode = selectedNodes[0].Node; - var parNode = selNode.ParentNode; + private void UnhideNodesAbove() + { + var selNode = selectedNodes[0].Node; + var parNode = selNode.ParentNode; - if (parNode == null) return; + if (parNode == null) return; - var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) - 1; + var hiddenNodeStartIndex = parNode.FindNodeIndex(selNode) - 1; - if (hiddenNodeStartIndex < 0) return; + if (hiddenNodeStartIndex < 0) return; - for (int i = hiddenNodeStartIndex; i > -1; i--) - { - var indexNode = parNode.Nodes.ElementAt(i); - if (indexNode.IsHidden) - { - indexNode.IsHidden = false; - indexNode.IsSelected = false; - } - else break; - } + for (int i = hiddenNodeStartIndex; i > -1; i--) + { + var indexNode = parNode.Nodes.ElementAt(i); + if (indexNode.IsHidden) + { + indexNode.IsHidden = false; + indexNode.IsSelected = false; + } + else break; + } - selNode.IsSelected = false; + selNode.IsSelected = false; - selectedNodes.Clear(); + selectedNodes.Clear(); - OnSelectionChanged(); + OnSelectionChanged(); - Invalidate(); - } + Invalidate(); + } private void CopySelectedNodesToClipboard() { From de6ce7d43a28e6ba565337f3cc3498146e17658a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 22 Dec 2018 19:04:02 +0100 Subject: [PATCH 315/777] Simplified code. --- ReClass.NET/UI/MemoryViewControl.cs | 31 +++++++---------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 59c637f5..320304b6 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -759,6 +759,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs { var count = selectedNodes.Count; var node = selectedNodes.Select(s => s.Node).FirstOrDefault(); + var parentNode = node?.ParentNode; var nodeIsClass = node is ClassNode; var nodeIsValueNode = false; @@ -786,16 +787,14 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs var hiddenNodesExistAbove = false; if (count == 1) { - var selNode = SelectedNodes.ElementAt(0); - var parNode = SelectedNodes.ElementAt(0).ParentNode; - if (parNode != null) + if (parentNode != null) { - var selNodeIndex = parNode.FindNodeIndex(selNode); - if (selNodeIndex+1 < parNode.Nodes.Count() && parNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden) + var selNodeIndex = parentNode.FindNodeIndex(node); + if (selNodeIndex + 1 < parentNode.Nodes.Count() && parentNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden) { hiddenNodesExistBelow = true; } - if (selNodeIndex - 1 > -1 && parNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden) + if (selNodeIndex - 1 > -1 && parentNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden) { hiddenNodesExistAbove = true; } @@ -805,25 +804,9 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs unhideNodesBelowToolStripMenuItem.Enabled = hiddenNodesExistBelow; unhideNodesAboveToolStripMenuItem.Enabled = hiddenNodesExistAbove; - var areNodesHideable = true; - foreach (var bs in SelectedNodes) - { - areNodesHideable = areNodesHideable & !(bs is ClassNode); - } - hideNodesToolStripMenuItem.Enabled = areNodesHideable; + hideNodesToolStripMenuItem.Enabled = SelectedNodes.All(n => !(n is ClassNode)); - var parentNodeTypeSelected = false; - var areChildNodesHidden = false; - if (count == 1 && SelectedNodes.ElementAt(0) is BaseContainerNode) - { - var selbcn = (BaseContainerNode)SelectedNodes.ElementAt(0); - parentNodeTypeSelected = true; - foreach (var bn in selbcn.Nodes) - { - areChildNodesHidden = areChildNodesHidden | bn.IsHidden; - } - } - unhideChildNodesToolStripMenuItem.Enabled = parentNodeTypeSelected & areChildNodesHidden; + unhideChildNodesToolStripMenuItem.Enabled = count == 1 && node is BaseContainerNode bcn && bcn.Nodes.Any(n => n.IsHidden); addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; insertBytesToolStripMenuItem.Enabled = count == 1 && node?.ParentNode != null; From 065aec14d24c7562273914d55bd0b9a642dd68b7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 22 Dec 2018 19:21:40 +0100 Subject: [PATCH 316/777] Added new helper methods. Simplified code again. --- ReClass.NET/Nodes/BaseContainerNode.cs | 50 +++++++++++++++++++++++++- ReClass.NET/UI/MemoryViewControl.cs | 36 +++++-------------- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index 74dc1879..a22f7a35 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -41,6 +40,55 @@ public int FindNodeIndex(BaseNode node) return Nodes.FindIndex(n => n == node); } + /// + /// Tries to get the predecessor of the given node in the container. + /// + /// The root node. + /// The predecessor of the given node. + /// True if a predecessor exists, otherwise false. + public bool TryGetPredecessor(BaseNode node, out BaseNode predecessor) + { + Contract.Requires(node != null); + + return TryGetNeighbour(node, -1, out predecessor); + } + + /// + /// Tries to get the successor of the given node in the container. + /// + /// The root node. + /// The successor of the given node. + /// True if a successor exists, otherwise false. + public bool TryGetSuccessor(BaseNode node, out BaseNode successor) + { + Contract.Requires(node != null); + + return TryGetNeighbour(node, 1, out successor); + } + + private bool TryGetNeighbour(BaseNode node, int offset, out BaseNode neighbour) + { + Contract.Requires(node != null); + + neighbour = null; + + var index = FindNodeIndex(node); + if (index == -1) + { + return false; + } + + var neighbourIndex = index + offset; + if (neighbourIndex < 0 || neighbourIndex >= nodes.Count) + { + return false; + } + + neighbour = nodes[neighbourIndex]; + + return true; + } + public bool ReplaceChildNode(BaseNode child, Type nodeType) { Contract.Requires(nodeType != null); diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 320304b6..826434c8 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -783,33 +783,8 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs break; } - var hiddenNodesExistBelow = false; - var hiddenNodesExistAbove = false; - if (count == 1) - { - if (parentNode != null) - { - var selNodeIndex = parentNode.FindNodeIndex(node); - if (selNodeIndex + 1 < parentNode.Nodes.Count() && parentNode.Nodes.ElementAt(selNodeIndex + 1).IsHidden) - { - hiddenNodesExistBelow = true; - } - if (selNodeIndex - 1 > -1 && parentNode.Nodes.ElementAt(selNodeIndex - 1).IsHidden) - { - hiddenNodesExistAbove = true; - } - } - } - - unhideNodesBelowToolStripMenuItem.Enabled = hiddenNodesExistBelow; - unhideNodesAboveToolStripMenuItem.Enabled = hiddenNodesExistAbove; - - hideNodesToolStripMenuItem.Enabled = SelectedNodes.All(n => !(n is ClassNode)); - - unhideChildNodesToolStripMenuItem.Enabled = count == 1 && node is BaseContainerNode bcn && bcn.Nodes.Any(n => n.IsHidden); - - addBytesToolStripMenuItem.Enabled = node?.ParentNode != null || nodeIsClass; - insertBytesToolStripMenuItem.Enabled = count == 1 && node?.ParentNode != null; + addBytesToolStripMenuItem.Enabled = parentNode != null || nodeIsClass; + insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null; changeTypeToolStripMenuItem.Enabled = count > 0 && !nodeIsClass; @@ -824,6 +799,13 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs showCodeOfClassToolStripMenuItem.Enabled = nodeIsClass; shrinkClassToolStripMenuItem.Enabled = nodeIsClass; + + unhideNodesAboveToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetPredecessor(node, out var predecessor) && predecessor.IsHidden; + unhideNodesBelowToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetSuccessor(node, out var successor) && successor.IsHidden; + + hideNodesToolStripMenuItem.Enabled = SelectedNodes.All(n => !(n is ClassNode)); + + unhideChildNodesToolStripMenuItem.Enabled = count == 1 && node is BaseContainerNode bcn && bcn.Nodes.Any(n => n.IsHidden); } private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) From 20ebb1601112c0c7df28cdb9a89a664919a447f0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 23 Dec 2018 17:51:51 +0100 Subject: [PATCH 317/777] Rearranged menu items. --- ReClass.NET/UI/MemoryViewControl.Designer.cs | 220 +++++++++++-------- ReClass.NET/UI/MemoryViewControl.cs | 13 +- 2 files changed, 130 insertions(+), 103 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 4244a301..1b33921f 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -101,19 +101,22 @@ private void InitializeComponent() this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.copyNodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.pasteNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.hideNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.unhideChildNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.unhideNodesBelowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.unhideNodesAboveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.hideNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideChildNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideNodesAboveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unhideNodesBelowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); this.showCodeOfClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.shrinkClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.repaintTimer = new System.Windows.Forms.Timer(this.components); this.editBox = new ReClassNET.UI.HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.shrinkClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -135,18 +138,18 @@ private void InitializeComponent() this.toolStripSeparator14, this.copyNodeToolStripMenuItem, this.pasteNodesToolStripMenuItem, - this.hideNodesToolStripMenuItem, - this.unhideChildNodesToolStripMenuItem, - this.unhideNodesBelowToolStripMenuItem, - this.unhideNodesAboveToolStripMenuItem, + this.toolStripSeparator17, this.removeToolStripMenuItem, this.toolStripSeparator12, + this.hideNodesToolStripMenuItem, + this.unhideNodesToolStripMenuItem, + this.toolStripSeparator18, this.copyAddressToolStripMenuItem, this.toolStripSeparator16, this.showCodeOfClassToolStripMenuItem, this.shrinkClassToolStripMenuItem}); this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 376); + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 432); this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); // // changeTypeToolStripMenuItem @@ -203,7 +206,7 @@ private void InitializeComponent() // this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex64ToolStripMenuItem.Text = "Hex 64"; this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -212,7 +215,7 @@ private void InitializeComponent() // this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex32ToolStripMenuItem.Text = "Hex 32"; this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -221,7 +224,7 @@ private void InitializeComponent() // this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex16ToolStripMenuItem.Text = "Hex 16"; this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -230,7 +233,7 @@ private void InitializeComponent() // this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.hex8ToolStripMenuItem.Text = "Hex 8"; this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -238,13 +241,13 @@ private void InitializeComponent() // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); // // int64ToolStripMenuItem // this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int64ToolStripMenuItem.Text = "Int 64"; this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -253,7 +256,7 @@ private void InitializeComponent() // this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int32ToolStripMenuItem.Text = "Int 32"; this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -262,7 +265,7 @@ private void InitializeComponent() // this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int16ToolStripMenuItem.Text = "Int 16"; this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -271,7 +274,7 @@ private void InitializeComponent() // this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.int8ToolStripMenuItem.Text = "Int 8"; this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -279,13 +282,13 @@ private void InitializeComponent() // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); // // uInt64ToolStripMenuItem // this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt64ToolStripMenuItem.Text = "UInt 64"; this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -294,7 +297,7 @@ private void InitializeComponent() // this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt32ToolStripMenuItem.Text = "UInt 32"; this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -303,7 +306,7 @@ private void InitializeComponent() // this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt16ToolStripMenuItem.Text = "UInt 16"; this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -312,7 +315,7 @@ private void InitializeComponent() // this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uInt8ToolStripMenuItem.Text = "UInt 8"; this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -320,13 +323,13 @@ private void InitializeComponent() // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); // // boolToolStripMenuItem // this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.boolToolStripMenuItem.Text = "Bool"; this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -335,7 +338,7 @@ private void InitializeComponent() // this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.bitsToolStripMenuItem.Text = "Bits"; this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -343,13 +346,13 @@ private void InitializeComponent() // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); // // floatToolStripMenuItem // this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.floatToolStripMenuItem.Text = "Float"; this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -358,7 +361,7 @@ private void InitializeComponent() // this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.doubleToolStripMenuItem.Text = "Double"; this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -366,13 +369,13 @@ private void InitializeComponent() // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); // // vector4ToolStripMenuItem // this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector4ToolStripMenuItem.Text = "Vector 4"; this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -381,7 +384,7 @@ private void InitializeComponent() // this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector3ToolStripMenuItem.Text = "Vector 3"; this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -390,7 +393,7 @@ private void InitializeComponent() // this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vector2ToolStripMenuItem.Text = "Vector 2"; this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -398,13 +401,13 @@ private void InitializeComponent() // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); // // matrix4x4ToolStripMenuItem // this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -413,7 +416,7 @@ private void InitializeComponent() // this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -422,7 +425,7 @@ private void InitializeComponent() // this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -430,13 +433,13 @@ private void InitializeComponent() // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); // // uTF8TextToolStripMenuItem // this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -445,7 +448,7 @@ private void InitializeComponent() // this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -454,7 +457,7 @@ private void InitializeComponent() // this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -463,7 +466,7 @@ private void InitializeComponent() // this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -471,13 +474,13 @@ private void InitializeComponent() // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); // // classInstanceToolStripMenuItem // this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.classInstanceToolStripMenuItem.Text = "Class Instance"; this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -486,7 +489,7 @@ private void InitializeComponent() // this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.classPointerToolStripMenuItem.Text = "Class Pointer"; this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -494,13 +497,13 @@ private void InitializeComponent() // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(170, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); // // arrayToolStripMenuItem // this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.arrayToolStripMenuItem.Text = "Array of Classes"; this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -509,7 +512,7 @@ private void InitializeComponent() // this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -518,7 +521,7 @@ private void InitializeComponent() // this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -527,7 +530,7 @@ private void InitializeComponent() // this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.functionPointerToolStripMenuItem.Text = "Function Pointer"; this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -536,7 +539,7 @@ private void InitializeComponent() // this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); this.functionToolStripMenuItem.Text = "Function"; this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -777,39 +780,12 @@ private void InitializeComponent() this.pasteNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); this.pasteNodesToolStripMenuItem.Text = "Paste Node(s)"; this.pasteNodesToolStripMenuItem.Click += new System.EventHandler(this.pasteNodesToolStripMenuItem_Click); - // - // hideNodesToolStripMenuItem - // - this.hideNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.hideNodesToolStripMenuItem.Name = "hideNodesToolStripMenuItem"; - this.hideNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.hideNodesToolStripMenuItem.Text = "Hide selected Node(s)"; - this.hideNodesToolStripMenuItem.Click += new System.EventHandler(this.hideNodesToolStripMenuItem_Click); - // - // unhideChildNodesToolStripMenuItem - // - this.unhideChildNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.unhideChildNodesToolStripMenuItem.Name = "unhideChildNodesToolStripMenuItem"; - this.unhideChildNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.unhideChildNodesToolStripMenuItem.Text = "Unhide child Node(s)"; - this.unhideChildNodesToolStripMenuItem.Click += new System.EventHandler(this.unhideChildNodesToolStripMenuItem_Click); - // - // unhideNodesBelowToolStripMenuItem - // - this.unhideNodesBelowToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.unhideNodesBelowToolStripMenuItem.Name = "unhideNodesBelowToolStripMenuItem"; - this.unhideNodesBelowToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.unhideNodesBelowToolStripMenuItem.Text = "Unhide Node(s) below"; - this.unhideNodesBelowToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesBelowToolStripMenuItem_Click); - // - // unhideNodesAboveToolStripMenuItem - // - this.unhideNodesAboveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; - this.unhideNodesAboveToolStripMenuItem.Name = "unhideNodesAboveToolStripMenuItem"; - this.unhideNodesAboveToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.unhideNodesAboveToolStripMenuItem.Text = "Unhide Node(s) above"; - this.unhideNodesAboveToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesAboveToolStripMenuItem_Click); - // + // + // toolStripSeparator17 + // + this.toolStripSeparator17.Name = "toolStripSeparator17"; + this.toolStripSeparator17.Size = new System.Drawing.Size(266, 6); + // // removeToolStripMenuItem // this.removeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; @@ -823,6 +799,55 @@ private void InitializeComponent() this.toolStripSeparator12.Name = "toolStripSeparator12"; this.toolStripSeparator12.Size = new System.Drawing.Size(266, 6); // + // hideNodesToolStripMenuItem + // + this.hideNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.hideNodesToolStripMenuItem.Name = "hideNodesToolStripMenuItem"; + this.hideNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.hideNodesToolStripMenuItem.Text = "Hide selected Node(s)"; + this.hideNodesToolStripMenuItem.Click += new System.EventHandler(this.hideNodesToolStripMenuItem_Click); + // + // unhideNodesToolStripMenuItem + // + this.unhideNodesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.unhideChildNodesToolStripMenuItem, + this.unhideNodesAboveToolStripMenuItem, + this.unhideNodesBelowToolStripMenuItem}); + this.unhideNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideNodesToolStripMenuItem.Name = "unhideNodesToolStripMenuItem"; + this.unhideNodesToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.unhideNodesToolStripMenuItem.Text = "Unhide..."; + this.unhideNodesToolStripMenuItem.Click += new System.EventHandler(this.unhideChildNodesToolStripMenuItem_Click); + // + // unhideChildNodesToolStripMenuItem + // + this.unhideChildNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideChildNodesToolStripMenuItem.Name = "unhideChildNodesToolStripMenuItem"; + this.unhideChildNodesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideChildNodesToolStripMenuItem.Text = "... Child Node(s)"; + this.unhideChildNodesToolStripMenuItem.Click += new System.EventHandler(this.unhideChildNodesToolStripMenuItem_Click); + // + // unhideNodesAboveToolStripMenuItem + // + this.unhideNodesAboveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideNodesAboveToolStripMenuItem.Name = "unhideNodesAboveToolStripMenuItem"; + this.unhideNodesAboveToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideNodesAboveToolStripMenuItem.Text = "... Node(s) above"; + this.unhideNodesAboveToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesAboveToolStripMenuItem_Click); + // + // unhideNodesBelowToolStripMenuItem + // + this.unhideNodesBelowToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; + this.unhideNodesBelowToolStripMenuItem.Name = "unhideNodesBelowToolStripMenuItem"; + this.unhideNodesBelowToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideNodesBelowToolStripMenuItem.Text = "... Node(s) below"; + this.unhideNodesBelowToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesBelowToolStripMenuItem_Click); + // + // toolStripSeparator18 + // + this.toolStripSeparator18.Name = "toolStripSeparator18"; + this.toolStripSeparator18.Size = new System.Drawing.Size(266, 6); + // // copyAddressToolStripMenuItem // this.copyAddressToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Page_Copy; @@ -844,6 +869,14 @@ private void InitializeComponent() this.showCodeOfClassToolStripMenuItem.Text = "Show C++ Code of Class"; this.showCodeOfClassToolStripMenuItem.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem_Click); // + // shrinkClassToolStripMenuItem + // + this.shrinkClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; + this.shrinkClassToolStripMenuItem.Name = "shrinkClassToolStripMenuItem"; + this.shrinkClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); + this.shrinkClassToolStripMenuItem.Text = "Shrink Class"; + this.shrinkClassToolStripMenuItem.Click += new System.EventHandler(this.shrinkClassToolStripMenuItem_Click); + // // repaintTimer // this.repaintTimer.Enabled = true; @@ -866,14 +899,6 @@ private void InitializeComponent() // this.nodeInfoToolTip.ShowAlways = true; // - // shrinkClassToolStripMenuItem - // - this.shrinkClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Chart_Delete; - this.shrinkClassToolStripMenuItem.Name = "shrinkClassToolStripMenuItem"; - this.shrinkClassToolStripMenuItem.Size = new System.Drawing.Size(269, 22); - this.shrinkClassToolStripMenuItem.Text = "Shrink Class"; - this.shrinkClassToolStripMenuItem.Click += new System.EventHandler(this.shrinkClassToolStripMenuItem_Click); - // // MemoryViewControl // this.Controls.Add(this.editBox); @@ -955,9 +980,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem copyNodeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem pasteNodesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem hideNodesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem unhideChildNodesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem unhideNodesBelowToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem unhideNodesAboveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideNodesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; private System.Windows.Forms.ToolStripMenuItem dissectNodesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; @@ -973,5 +996,10 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; private System.Windows.Forms.ToolStripMenuItem shrinkClassToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; + private System.Windows.Forms.ToolStripMenuItem unhideChildNodesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideNodesAboveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem unhideNodesBelowToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; } } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 826434c8..36ddbcbc 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -800,12 +800,11 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs showCodeOfClassToolStripMenuItem.Enabled = nodeIsClass; shrinkClassToolStripMenuItem.Enabled = nodeIsClass; - unhideNodesAboveToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetPredecessor(node, out var predecessor) && predecessor.IsHidden; - unhideNodesBelowToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetSuccessor(node, out var successor) && successor.IsHidden; - hideNodesToolStripMenuItem.Enabled = SelectedNodes.All(n => !(n is ClassNode)); unhideChildNodesToolStripMenuItem.Enabled = count == 1 && node is BaseContainerNode bcn && bcn.Nodes.Any(n => n.IsHidden); + unhideNodesAboveToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetPredecessor(node, out var predecessor) && predecessor.IsHidden; + unhideNodesBelowToolStripMenuItem.Enabled = count == 1 && parentNode != null && parentNode.TryGetSuccessor(node, out var successor) && successor.IsHidden; } private void addBytesToolStripMenuItem_Click(object sender, EventArgs e) @@ -958,9 +957,9 @@ private void hideNodesToolStripMenuItem_Click(object sender, EventArgs e) HideSelectedNodes(); } - private void unhideNodesBelowToolStripMenuItem_Click(object sender, EventArgs e) + private void unhideChildNodesToolStripMenuItem_Click(object sender, EventArgs e) { - UnhideNodesBelow(); + UnhideChildNodes(); } private void unhideNodesAboveToolStripMenuItem_Click(object sender, EventArgs e) @@ -968,9 +967,9 @@ private void unhideNodesAboveToolStripMenuItem_Click(object sender, EventArgs e) UnhideNodesAbove(); } - private void unhideChildNodesToolStripMenuItem_Click(object sender, EventArgs e) + private void unhideNodesBelowToolStripMenuItem_Click(object sender, EventArgs e) { - UnhideChildNodes(); + UnhideNodesBelow(); } private void removeToolStripMenuItem_Click(object sender, EventArgs e) From c73035fed7fe3b0fa6867f18fc8191ac6c074e8c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 24 Dec 2018 15:10:35 +0100 Subject: [PATCH 318/777] Updated sdk version. --- NativeCore/Windows/NativeCore.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index f9167ca8..bec0c645 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -22,7 +22,7 @@ {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} Win32Proj NativeCore - 10.0.16299.0 + 10.0.17134.0 From 65d502f950c66431376bff465a069d4f09d95c4c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 24 Dec 2018 15:20:20 +0100 Subject: [PATCH 319/777] Fixed icon rendering bug introduced with d696d9e5. --- ReClass.NET/Nodes/BaseArrayNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs index 2c82fb93..691e61a4 100644 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ b/ReClass.NET/Nodes/BaseArrayNode.cs @@ -64,8 +64,8 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan size.Height += childSize.Height; } - AddTypeDrop(view, y); - AddDelete(view, y); + AddTypeDrop(view, origY); + AddDelete(view, origY); return size; } From 39c564e740c86fe5a72d0f22ae7bc8df9dd85771 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 25 Dec 2018 01:51:35 +0100 Subject: [PATCH 320/777] Fixed icon drawing (2/2). --- ReClass.NET/Nodes/BaseArrayNode.cs | 6 +++--- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 6 +++--- ReClass.NET/Nodes/BaseMatrixNode.cs | 6 +++--- ReClass.NET/Nodes/BitFieldNode.cs | 6 +++--- ReClass.NET/Nodes/FunctionNode.cs | 1 - 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs index 691e61a4..ebe38099 100644 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ b/ReClass.NET/Nodes/BaseArrayNode.cs @@ -52,6 +52,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan x += view.Font.Width; x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + y += view.Font.Height; var size = new Size(x - origX, y - origY); @@ -64,9 +67,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan size.Height += childSize.Height; } - AddTypeDrop(view, origY); - AddDelete(view, origY); - return size; } diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index f195a642..fab9cbd2 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -70,6 +70,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) } } + AddTypeDrop(view, y); + AddDelete(view, y); + var size = new Size(x - origX, view.Font.Height); if (levelsOpen[view.Level]) @@ -84,9 +87,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) size.Height += instructionSize.Height; } - AddTypeDrop(view, y); - AddDelete(view, y); - return size; } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index d289b286..fd31d0ef 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -50,14 +50,14 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + if (levelsOpen[view.Level]) { drawValues(tx, ref x, ref y); } - AddTypeDrop(view, y); - AddDelete(view, y); - return new Size(x - origX, y - origY + view.Font.Height); } diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index a8f512d4..768e474d 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -121,6 +121,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); + AddTypeDrop(view, y); + AddDelete(view, y); + if (levelsOpen[view.Level]) { y += view.Font.Height; @@ -140,9 +143,6 @@ public override Size Draw(ViewInfo view, int x, int y) y += 2; } - AddTypeDrop(view, y); - AddDelete(view, y); - return new Size(x - origX, y - origY + view.Font.Height); } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index c30d7088..6e9b915c 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -5,7 +5,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { From fb6a438e8e86ade6390ccb33edb3611257f70e5c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 25 Dec 2018 11:18:32 +0100 Subject: [PATCH 321/777] Removed unused comment. --- ReClass.NET/Nodes/FunctionPtrNode.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ReClass.NET/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs index 1ab2f3c8..0740623a 100644 --- a/ReClass.NET/Nodes/FunctionPtrNode.cs +++ b/ReClass.NET/Nodes/FunctionPtrNode.cs @@ -5,11 +5,6 @@ namespace ReClassNET.Nodes { public class FunctionPtrNode : BaseFunctionPtrNode { - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "FunctionPtr", Name); From c65b4e67ea068545925567e7230eddd9ceec6cb4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 25 Dec 2018 11:18:43 +0100 Subject: [PATCH 322/777] Removed unused variable. --- ReClass.NET/Nodes/BaseArrayNode.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs index ebe38099..4fd50ec4 100644 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ b/ReClass.NET/Nodes/BaseArrayNode.cs @@ -24,7 +24,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan DrawInvalidMemoryIndicator(view, y); var origX = x; - var origY = y; AddSelection(view, x, y, view.Font.Height); @@ -57,7 +56,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan y += view.Font.Height; - var size = new Size(x - origX, y - origY); + var size = new Size(x - origX, view.Font.Height); if (levelsOpen[view.Level]) { From f87ab66ddb8e56b7d63972632b01a38d810c147c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 27 Dec 2018 16:35:40 +0100 Subject: [PATCH 323/777] Added PointerNode. Added BaseWrapperNode. --- ReClass.NET/Nodes/BaseReferenceNode.cs | 1 + ReClass.NET/Nodes/BaseWrapperNode.cs | 42 ++++++++++ ReClass.NET/Nodes/PointerNode.cs | 103 +++++++++++++++++++++++++ ReClass.NET/ReClass.NET.csproj | 2 + 4 files changed, 148 insertions(+) create mode 100644 ReClass.NET/Nodes/BaseWrapperNode.cs create mode 100644 ReClass.NET/Nodes/PointerNode.cs diff --git a/ReClass.NET/Nodes/BaseReferenceNode.cs b/ReClass.NET/Nodes/BaseReferenceNode.cs index 096ba1a8..63e734e0 100644 --- a/ReClass.NET/Nodes/BaseReferenceNode.cs +++ b/ReClass.NET/Nodes/BaseReferenceNode.cs @@ -2,6 +2,7 @@ namespace ReClassNET.Nodes { + // TODO Replace with BaseWrapperNode. public abstract class BaseReferenceNode : BaseNode { /// Gets or sets the inner node. diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs new file mode 100644 index 00000000..1bcf5eef --- /dev/null +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReClassNET.Nodes +{ + public abstract class BaseWrapperNode : BaseNode + { + /// Gets or sets the inner node. + public BaseNode InnerNode { get; protected set; } + + /// Gets signaled if the inner node was changed. + public event NodeEventHandler InnerNodeChanged; + + /// True to perform class cycle checks when changing the inner node. + public abstract bool PerformCycleCheck { get; } + + /// + /// Should be called before to test if the node can handle the inner node type. + /// + /// The new inner node type. + /// True if the class can handle the inner node type or false otherwise. + public abstract bool CanChangeInnerNodeTo(BaseNode node); + + /// Changes the inner node. + /// The new node. + public void ChangeInnerNode(BaseNode node) + { + if (InnerNode != node) + { + InnerNode = node; + + InnerNodeChanged?.Invoke(this); + + ParentNode?.ChildHasChanged(this); + } + } + } +} diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs new file mode 100644 index 00000000..1777bd45 --- /dev/null +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -0,0 +1,103 @@ +using System; +using System.Diagnostics.Contracts; +using System.Drawing; +using ReClassNET.Memory; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class PointerNode : BaseWrapperNode + { + private readonly MemoryBuffer memory = new MemoryBuffer(); + + public override int MemorySize => IntPtr.Size; + + public override bool PerformCycleCheck => false; + + public override bool CanChangeInnerNodeTo(BaseNode node) + { + return true; + } + + public override Size Draw(ViewInfo view, int x, int y) + { + //return DrawHidden(view, x, y); + if (IsHidden) + { + return DrawHidden(view, x, y); + } + + DrawInvalidMemoryIndicator(view, y); + + var origX = x; + var origY = y; + + AddSelection(view, x, y, view.Font.Height); + + x = AddOpenClose(view, x, y); + x = AddIcon(view, x, y, Icons.Pointer, -1, HotSpotType.None); + + var tx = x; + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (InnerNode == null) + { + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "") + view.Font.Width; + } + else + { + + } + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; + + var ptr = view.Memory.ReadIntPtr(Offset); + + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, 0, "0x" + ptr.ToString(Constants.AddressHexFormat)) + view.Font.Width; + + x = AddComment(view, x, y); + + AddTypeDrop(view, y); + AddDelete(view, y); + + y += view.Font.Height; + + var size = new Size(x - origX, y - origY); + + if (levelsOpen[view.Level] && InnerNode != null) + { + memory.Size = InnerNode.MemorySize; + memory.Process = view.Memory.Process; + memory.Update(ptr); + + var v = view.Clone(); + v.Address = ptr; + v.Memory = memory; + + var innerSize = InnerNode.Draw(v, tx, y); + + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; + } + + return size; + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + if (IsHidden) + { + return HiddenHeight; + } + + var height = view.Font.Height; + if (levelsOpen[view.Level] && InnerNode != null) + { + height += InnerNode.CalculateDrawnHeight(view); + } + return height; + } + } +} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 2849a2fd..d272eb40 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -242,10 +242,12 @@ + + Component From 4c511a1a1c73841dc3277158a21d09693fcd0291 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 27 Dec 2018 16:37:08 +0100 Subject: [PATCH 324/777] Removed usings. --- ReClass.NET/Nodes/BaseWrapperNode.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 1bcf5eef..59887487 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ReClassNET.Nodes +namespace ReClassNET.Nodes { public abstract class BaseWrapperNode : BaseNode { From e6b1eae5f4d3e1df139490536a6ae9a12ff63e05 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 27 Dec 2018 16:40:13 +0100 Subject: [PATCH 325/777] Added new HotSpotType. --- ReClass.NET/Nodes/ClassInstanceArrayNode.cs | 2 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 2 +- ReClass.NET/Nodes/ClassPtrArrayNode.cs | 2 +- ReClass.NET/Nodes/ClassPtrNode.cs | 2 +- ReClass.NET/Nodes/FunctionNode.cs | 2 +- ReClass.NET/Nodes/PointerNode.cs | 2 +- ReClass.NET/UI/HotSpot.cs | 3 ++- ReClass.NET/UI/MemoryViewControl.cs | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs index 351489fa..30dc803d 100644 --- a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs @@ -25,7 +25,7 @@ public override void Intialize() /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, "Array", HotSpotType.ChangeType); + return Draw(view, x, y, "Array", HotSpotType.ChangeClassType); } protected override Size DrawChild(ViewInfo view, int x, int y) diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index 7090d87b..f021f3a0 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -47,7 +47,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Instance") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; x = AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/ClassPtrArrayNode.cs b/ReClass.NET/Nodes/ClassPtrArrayNode.cs index e87c6e3a..c2e7b212 100644 --- a/ReClass.NET/Nodes/ClassPtrArrayNode.cs +++ b/ReClass.NET/Nodes/ClassPtrArrayNode.cs @@ -23,7 +23,7 @@ public override void Intialize() public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, "PtrArray", HotSpotType.ChangeType); + return Draw(view, x, y, "PtrArray", HotSpotType.ChangeClassType); } protected override Size DrawChild(ViewInfo view, int x, int y) diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs index 2a857db5..0e1a223d 100644 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ b/ReClass.NET/Nodes/ClassPtrNode.cs @@ -47,7 +47,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; var ptr = view.Memory.ReadIntPtr(Offset); diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 6e9b915c..393f1cb8 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -74,7 +74,7 @@ public override Size Draw(ViewInfo view, int x, int y) y += view.Font.Height; x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeType); + x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeClassType); size.Width = Math.Max(size.Width, x - origX); size.Height += view.Font.Height; diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 1777bd45..f2d90b3c 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -50,7 +50,7 @@ public override Size Draw(ViewInfo view, int x, int y) { } - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeType) + view.Font.Width; + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width; var ptr = view.Memory.ReadIntPtr(Offset); diff --git a/ReClass.NET/UI/HotSpot.cs b/ReClass.NET/UI/HotSpot.cs index dc26a761..1619efea 100644 --- a/ReClass.NET/UI/HotSpot.cs +++ b/ReClass.NET/UI/HotSpot.cs @@ -13,7 +13,8 @@ public enum HotSpotType Select, Drop, Click, - ChangeType, + ChangeClassType, + ChangeWrappedType, Delete, RTTI, Address, diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 36ddbcbc..12e45a9d 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -384,7 +384,7 @@ protected override void OnMouseClick(MouseEventArgs e) break; } - else if (hotSpot.Type == HotSpotType.ChangeType) + else if (hotSpot.Type == HotSpotType.ChangeClassType) { if (hitObject is FunctionNode functionNode) { From db2082b2510987eede3a43fdd62473c7fa236311 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 3 Jan 2019 14:26:34 +0100 Subject: [PATCH 326/777] Switched button order. --- ReClass.NET/Forms/MainForm.Designer.cs | 52 +++++------ ReClass.NET/UI/MemoryViewControl.Designer.cs | 96 ++++++++++---------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 8caf3da7..bafa9bb9 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -125,6 +125,7 @@ private void InitializeComponent() this.processToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.processInformationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.memorySearcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.namedAddressesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.loadSymbolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadSymbolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -132,7 +133,6 @@ private void InitializeComponent() this.resumeProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.suspendProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.terminateProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.namedAddressesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.cleanUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); @@ -244,8 +244,8 @@ private void InitializeComponent() this.arrayToolStripButton, this.ptrArrayToolStripButton, this.vtableToolStripButton, - this.fnPtrToolStripButton, this.fnTypeToolStripButton, + this.fnPtrToolStripButton, this.toolStripSeparator19}); this.toolStrip.Location = new System.Drawing.Point(0, 24); this.toolStrip.Name = "toolStrip"; @@ -959,7 +959,7 @@ private void InitializeComponent() // this.attachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier; this.attachToProcessToolStripMenuItem.Name = "attachToProcessToolStripMenuItem"; - this.attachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.attachToProcessToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.attachToProcessToolStripMenuItem.Text = "Attach to Process..."; this.attachToProcessToolStripMenuItem.Click += new System.EventHandler(this.attachToProcessToolStripSplitButton_ButtonClick); // @@ -967,7 +967,7 @@ private void InitializeComponent() // this.reattachToProcessToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Arrow; this.reattachToProcessToolStripMenuItem.Name = "reattachToProcessToolStripMenuItem"; - this.reattachToProcessToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.reattachToProcessToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.reattachToProcessToolStripMenuItem.Text = "<>"; this.reattachToProcessToolStripMenuItem.Click += new System.EventHandler(this.reattachToProcessToolStripMenuItem_Click); // @@ -975,21 +975,21 @@ private void InitializeComponent() // this.detachToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Magnifier_Remove; this.detachToolStripMenuItem.Name = "detachToolStripMenuItem"; - this.detachToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.detachToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.detachToolStripMenuItem.Text = "Detach"; this.detachToolStripMenuItem.Click += new System.EventHandler(this.detachToolStripMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(243, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6); // // openProjectToolStripMenuItem // this.openProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder; this.openProjectToolStripMenuItem.Name = "openProjectToolStripMenuItem"; this.openProjectToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.openProjectToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.openProjectToolStripMenuItem.Text = "Open Project..."; this.openProjectToolStripMenuItem.Click += new System.EventHandler(this.openProjectToolStripMenuItem_Click); // @@ -997,7 +997,7 @@ private void InitializeComponent() // this.mergeWithProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Folder_Add; this.mergeWithProjectToolStripMenuItem.Name = "mergeWithProjectToolStripMenuItem"; - this.mergeWithProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.mergeWithProjectToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.mergeWithProjectToolStripMenuItem.Text = "Merge with Project..."; this.mergeWithProjectToolStripMenuItem.Click += new System.EventHandler(this.mergeWithProjectToolStripMenuItem_Click); // @@ -1005,21 +1005,21 @@ private void InitializeComponent() // this.clearProjectToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Arrow_Refresh; this.clearProjectToolStripMenuItem.Name = "clearProjectToolStripMenuItem"; - this.clearProjectToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.clearProjectToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.clearProjectToolStripMenuItem.Text = "Clear Project"; this.clearProjectToolStripMenuItem.Click += new System.EventHandler(this.clearProjectToolStripMenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(243, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(192, 6); // // saveToolStripMenuItem // this.saveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Save; this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.saveToolStripMenuItem.Text = "Save"; this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); // @@ -1029,20 +1029,20 @@ private void InitializeComponent() this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.saveAsToolStripMenuItem.Text = "Save as..."; this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(243, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(192, 6); // // settingsToolStripMenuItem // this.settingsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Cogs; this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.settingsToolStripMenuItem.Text = "Settings..."; this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); // @@ -1050,20 +1050,20 @@ private void InitializeComponent() // this.pluginsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Plugin; this.pluginsToolStripMenuItem.Name = "pluginsToolStripMenuItem"; - this.pluginsToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.pluginsToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.pluginsToolStripMenuItem.Text = "Plugins..."; this.pluginsToolStripMenuItem.Click += new System.EventHandler(this.pluginsToolStripButton_Click); // // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(243, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(192, 6); // // quitToolStripMenuItem // this.quitToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Quit; this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; - this.quitToolStripMenuItem.Size = new System.Drawing.Size(246, 22); + this.quitToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.quitToolStripMenuItem.Text = "Quit"; this.quitToolStripMenuItem.Click += new System.EventHandler(this.quitToolStripMenuItem_Click); // @@ -1100,6 +1100,14 @@ private void InitializeComponent() this.memorySearcherToolStripMenuItem.Text = "Memory Searcher..."; this.memorySearcherToolStripMenuItem.Click += new System.EventHandler(this.memorySearcherToolStripMenuItem_Click); // + // namedAddressesToolStripMenuItem + // + this.namedAddressesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; + this.namedAddressesToolStripMenuItem.Name = "namedAddressesToolStripMenuItem"; + this.namedAddressesToolStripMenuItem.Size = new System.Drawing.Size(194, 22); + this.namedAddressesToolStripMenuItem.Text = "Named Addresses..."; + this.namedAddressesToolStripMenuItem.Click += new System.EventHandler(this.namedAddressesToolStripMenuItem_Click); + // // toolStripSeparator17 // this.toolStripSeparator17.Name = "toolStripSeparator17"; @@ -1150,14 +1158,6 @@ private void InitializeComponent() this.terminateProcessToolStripMenuItem.Text = "Kill"; this.terminateProcessToolStripMenuItem.Click += new System.EventHandler(this.ControlRemoteProcessToolStripMenuItem_Click); // - // namedAddressesToolStripMenuItem - // - this.namedAddressesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; - this.namedAddressesToolStripMenuItem.Name = "namedAddressesToolStripMenuItem"; - this.namedAddressesToolStripMenuItem.Size = new System.Drawing.Size(194, 22); - this.namedAddressesToolStripMenuItem.Text = "Named Addresses..."; - this.namedAddressesToolStripMenuItem.Click += new System.EventHandler(this.namedAddressesToolStripMenuItem_Click); - // // projectToolStripMenuItem // this.projectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1210,7 +1210,7 @@ private void InitializeComponent() // this.aboutToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Information; this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(116, 22); this.aboutToolStripMenuItem.Text = "About..."; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 1b33921f..20759b5f 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -149,7 +149,7 @@ private void InitializeComponent() this.showCodeOfClassToolStripMenuItem, this.shrinkClassToolStripMenuItem}); this.selectedNodeContextMenuStrip.Name = "selectedNodeContextMenuStrip"; - this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 432); + this.selectedNodeContextMenuStrip.Size = new System.Drawing.Size(270, 410); this.selectedNodeContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.selectedNodeContextMenuStrip_Opening); // // changeTypeToolStripMenuItem @@ -195,8 +195,8 @@ private void InitializeComponent() this.arrayToolStripMenuItem, this.arrayOfPointersToolStripMenuItem, this.vTablePointerToolStripMenuItem, - this.functionPointerToolStripMenuItem, - this.functionToolStripMenuItem}); + this.functionToolStripMenuItem, + this.functionPointerToolStripMenuItem}); this.changeTypeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Exchange_Button; this.changeTypeToolStripMenuItem.Name = "changeTypeToolStripMenuItem"; this.changeTypeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); @@ -206,7 +206,7 @@ private void InitializeComponent() // this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.hex64ToolStripMenuItem.Text = "Hex 64"; this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -215,7 +215,7 @@ private void InitializeComponent() // this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.hex32ToolStripMenuItem.Text = "Hex 32"; this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -224,7 +224,7 @@ private void InitializeComponent() // this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.hex16ToolStripMenuItem.Text = "Hex 16"; this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -233,7 +233,7 @@ private void InitializeComponent() // this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.hex8ToolStripMenuItem.Text = "Hex 8"; this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -241,13 +241,13 @@ private void InitializeComponent() // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); // // int64ToolStripMenuItem // this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.int64ToolStripMenuItem.Text = "Int 64"; this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -256,7 +256,7 @@ private void InitializeComponent() // this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.int32ToolStripMenuItem.Text = "Int 32"; this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -265,7 +265,7 @@ private void InitializeComponent() // this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.int16ToolStripMenuItem.Text = "Int 16"; this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -274,7 +274,7 @@ private void InitializeComponent() // this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.int8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.int8ToolStripMenuItem.Text = "Int 8"; this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -282,13 +282,13 @@ private void InitializeComponent() // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(177, 6); // // uInt64ToolStripMenuItem // this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uInt64ToolStripMenuItem.Text = "UInt 64"; this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -297,7 +297,7 @@ private void InitializeComponent() // this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uInt32ToolStripMenuItem.Text = "UInt 32"; this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -306,7 +306,7 @@ private void InitializeComponent() // this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uInt16ToolStripMenuItem.Text = "UInt 16"; this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -315,7 +315,7 @@ private void InitializeComponent() // this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uInt8ToolStripMenuItem.Text = "UInt 8"; this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -323,13 +323,13 @@ private void InitializeComponent() // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(177, 6); // // boolToolStripMenuItem // this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.boolToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.boolToolStripMenuItem.Text = "Bool"; this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -338,7 +338,7 @@ private void InitializeComponent() // this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.bitsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.bitsToolStripMenuItem.Text = "Bits"; this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -346,13 +346,13 @@ private void InitializeComponent() // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(177, 6); // // floatToolStripMenuItem // this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.floatToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.floatToolStripMenuItem.Text = "Float"; this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -361,7 +361,7 @@ private void InitializeComponent() // this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.doubleToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.doubleToolStripMenuItem.Text = "Double"; this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -369,13 +369,13 @@ private void InitializeComponent() // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(177, 6); // // vector4ToolStripMenuItem // this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.vector4ToolStripMenuItem.Text = "Vector 4"; this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -384,7 +384,7 @@ private void InitializeComponent() // this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.vector3ToolStripMenuItem.Text = "Vector 3"; this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -393,7 +393,7 @@ private void InitializeComponent() // this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.vector2ToolStripMenuItem.Text = "Vector 2"; this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -401,13 +401,13 @@ private void InitializeComponent() // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); // // matrix4x4ToolStripMenuItem // this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -416,7 +416,7 @@ private void InitializeComponent() // this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -425,7 +425,7 @@ private void InitializeComponent() // this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -433,13 +433,13 @@ private void InitializeComponent() // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(177, 6); // // uTF8TextToolStripMenuItem // this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -448,7 +448,7 @@ private void InitializeComponent() // this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -457,7 +457,7 @@ private void InitializeComponent() // this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -466,7 +466,7 @@ private void InitializeComponent() // this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -474,13 +474,13 @@ private void InitializeComponent() // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(177, 6); // // classInstanceToolStripMenuItem // this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.classInstanceToolStripMenuItem.Text = "Class Instance"; this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -489,7 +489,7 @@ private void InitializeComponent() // this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.classPointerToolStripMenuItem.Text = "Class Pointer"; this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -497,13 +497,13 @@ private void InitializeComponent() // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(169, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(177, 6); // // arrayToolStripMenuItem // this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.arrayToolStripMenuItem.Text = "Array of Classes"; this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -512,7 +512,7 @@ private void InitializeComponent() // this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -521,7 +521,7 @@ private void InitializeComponent() // this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -530,7 +530,7 @@ private void InitializeComponent() // this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.functionPointerToolStripMenuItem.Text = "Function Pointer"; this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -539,7 +539,7 @@ private void InitializeComponent() // this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(172, 22); + this.functionToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.functionToolStripMenuItem.Text = "Function"; this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); @@ -823,7 +823,7 @@ private void InitializeComponent() // this.unhideChildNodesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; this.unhideChildNodesToolStripMenuItem.Name = "unhideChildNodesToolStripMenuItem"; - this.unhideChildNodesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideChildNodesToolStripMenuItem.Size = new System.Drawing.Size(163, 22); this.unhideChildNodesToolStripMenuItem.Text = "... Child Node(s)"; this.unhideChildNodesToolStripMenuItem.Click += new System.EventHandler(this.unhideChildNodesToolStripMenuItem_Click); // @@ -831,7 +831,7 @@ private void InitializeComponent() // this.unhideNodesAboveToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; this.unhideNodesAboveToolStripMenuItem.Name = "unhideNodesAboveToolStripMenuItem"; - this.unhideNodesAboveToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideNodesAboveToolStripMenuItem.Size = new System.Drawing.Size(163, 22); this.unhideNodesAboveToolStripMenuItem.Text = "... Node(s) above"; this.unhideNodesAboveToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesAboveToolStripMenuItem_Click); // @@ -839,7 +839,7 @@ private void InitializeComponent() // this.unhideNodesBelowToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Eye; this.unhideNodesBelowToolStripMenuItem.Name = "unhideNodesBelowToolStripMenuItem"; - this.unhideNodesBelowToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.unhideNodesBelowToolStripMenuItem.Size = new System.Drawing.Size(163, 22); this.unhideNodesBelowToolStripMenuItem.Text = "... Node(s) below"; this.unhideNodesBelowToolStripMenuItem.Click += new System.EventHandler(this.unhideNodesBelowToolStripMenuItem_Click); // From 7b30efca0ab851eca9a775485d7bd6cd59a2c905 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 4 Jan 2019 14:46:34 +0100 Subject: [PATCH 327/777] Added NodeTypesBuilder. --- ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/UI/NodeTypesBuilder.cs | 158 +++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 ReClass.NET/UI/NodeTypesBuilder.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index d272eb40..aa23e3ea 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -339,6 +339,7 @@ MemoryViewControl.cs + Component diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs new file mode 100644 index 00000000..1dd4ae30 --- /dev/null +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using ReClassNET.Extensions; +using ReClassNET.Nodes; +using ReClassNET.Plugins; + +namespace ReClassNET.UI +{ + public static class NodeTypesBuilder + { + private static readonly List defaultNodeTypeGroupList = new List(); + private static readonly Dictionary> pluginNodeTypes = new Dictionary>(); + + static NodeTypesBuilder() + { + defaultNodeTypeGroupList.Add(new[] { typeof(Hex64Node), typeof(Hex32Node), typeof(Hex16Node), typeof(Hex8Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(Int64Node), typeof(Int32Node), typeof(Int16Node), typeof(Int8Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(UInt64Node), typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(BoolNode), typeof(BitFieldNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(FloatNode), typeof(DoubleNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode), typeof(ClassPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); + } + + public static List RegisterPluginNodeGroup(Plugin plugin) + { + Contract.Requires(plugin != null); + + if (!pluginNodeTypes.TryGetValue(plugin, out var types)) + { + types = new List(); + + pluginNodeTypes.Add(plugin, types); + } + + return types; + } + + public static IEnumerable CreateToolStripButtons(Action handler) + { + Contract.Requires(handler != null); + + var clickHandler = new EventHandler((sender, e) => handler(((TypeToolStripButton)sender).Value)); + + return CreateToolStripItems(t => + { + GetNodeInfoFromType(t, out var label, out var icon); + + var item = new TypeToolStripButton + { + Value = t, + ToolTipText = label, + DisplayStyle = ToolStripItemDisplayStyle.Image, + Image = icon + }; + item.Click += clickHandler; + return item; + }, p => new ToolStripDropDownButton + { + ToolTipText = "", + Image = p.Icon + }); + } + + public static IEnumerable CreateToolStripMenuItems(Action handler) + { + Contract.Requires(handler != null); + + return CreateToolStripMenuItems(handler, true); + } + + public static IEnumerable CreateToolStripMenuItems(Action handler, bool addNoneType) + { + Contract.Requires(handler != null); + + var clickHandler = new EventHandler((sender, e) => handler(((TypeToolStripMenuItem)sender).Value)); + + var items = CreateToolStripItems(t => + { + GetNodeInfoFromType(t, out var label, out var icon); + + var item = new TypeToolStripMenuItem + { + Value = t, + Text = label, + Image = icon + }; + item.Click += clickHandler; + return item; + }, p => new ToolStripMenuItem + { + Text = p.GetType().ToString(), + Image = p.Icon + }); + + if (addNoneType) + { + ToolStripItem noneItem = new TypeToolStripMenuItem + { + Value = null, + Text = "None" + }; + + items = noneItem.Yield().Append(new ToolStripSeparator()).Concat(items); + } + + return items; + } + + private static IEnumerable CreateToolStripItems(Func createItem, Func createPluginContainerItem) + { + Contract.Requires(createItem != null); + + if (!defaultNodeTypeGroupList.Any()) + { + return new ToolStripItem[0]; + } + + var items = defaultNodeTypeGroupList + .Select(t => t.Select(createItem)) + .Aggregate((l1, l2) => l1.Append(new ToolStripSeparator()).Concat(l2)); + + if (pluginNodeTypes.Any()) + { + foreach (var kv in pluginNodeTypes) + { + var pluginContainerItem = createPluginContainerItem(kv.Key); + pluginContainerItem.DropDownItems.AddRange( + kv.Value + .Select(createItem) + .ToArray() + ); + items = items.Append(new ToolStripSeparator()).Append(pluginContainerItem); + } + } + + return items; + } + + private static bool GetNodeInfoFromType(Type nodeType, out string label, out Image icon) + { + Contract.Requires(nodeType != null); + + //TODO Read info from node (virtual method?). + + label = nodeType.ToString(); + icon = null; + + return true; + } + } +} From 257669dae7460b12fb57c55793d87906effcc018 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 4 Jan 2019 14:54:11 +0100 Subject: [PATCH 328/777] Added Append extension method. --- ReClass.NET/Extensions/LinqExtensions.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index a2b548ea..0ad956f7 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -131,6 +131,15 @@ public static IEnumerable Yield(this TSource item) yield return item; } + [DebuggerStepThrough] + public static IEnumerable Append(this IEnumerable source, TSource item) + { + Contract.Ensures(Contract.Result>() != null); + Contract.Requires(source != null); + + return source.Concat(Yield(item)); + } + [DebuggerStepThrough] public static IEnumerable Traverse(this IEnumerable source, Func> childSelector) { From dbe4879a81dc35eb3c35d9fa04a24db9d5b07290 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 4 Jan 2019 15:29:49 +0100 Subject: [PATCH 329/777] Added GetUserInterfaceInfo method. --- ReClass.NET/DataExchange/ReClass/ReClassFile.cs | 5 +++++ ReClass.NET/Nodes/BaseNode.cs | 2 ++ ReClass.NET/Nodes/BitFieldNode.cs | 6 ++++++ ReClass.NET/Nodes/BoolNode.cs | 12 ++++++------ ReClass.NET/Nodes/ClassInstanceArrayNode.cs | 8 ++++++-- ReClass.NET/Nodes/ClassInstanceNode.cs | 13 ++++++------- ReClass.NET/Nodes/ClassNode.cs | 11 +++++------ ReClass.NET/Nodes/ClassPtrArrayNode.cs | 6 ++++++ ReClass.NET/Nodes/ClassPtrNode.cs | 7 ++++++- ReClass.NET/Nodes/DoubleNode.cs | 6 ++++++ ReClass.NET/Nodes/FloatNode.cs | 6 ++++++ ReClass.NET/Nodes/FunctionNode.cs | 7 ++++++- ReClass.NET/Nodes/FunctionPtrNode.cs | 6 ++++++ ReClass.NET/Nodes/Hex16Node.cs | 16 ++++++---------- ReClass.NET/Nodes/Hex32Node.cs | 16 ++++++---------- ReClass.NET/Nodes/Hex64Node.cs | 16 ++++++---------- ReClass.NET/Nodes/Hex8Node.cs | 6 ++++++ ReClass.NET/Nodes/Int16Node.cs | 7 ++++++- ReClass.NET/Nodes/Int32Node.cs | 7 ++++++- ReClass.NET/Nodes/Int64Node.cs | 7 ++++++- ReClass.NET/Nodes/Int8Node.cs | 7 ++++++- ReClass.NET/Nodes/Matrix3x3Node.cs | 15 ++++++++------- ReClass.NET/Nodes/Matrix3x4Node.cs | 11 ++++++----- ReClass.NET/Nodes/Matrix4x4Node.cs | 11 ++++++----- ReClass.NET/Nodes/PointerNode.cs | 12 ++++++------ ReClass.NET/Nodes/UInt16Node.cs | 7 ++++++- ReClass.NET/Nodes/UInt32Node.cs | 7 ++++++- ReClass.NET/Nodes/UInt64Node.cs | 7 ++++++- ReClass.NET/Nodes/UInt8Node.cs | 7 ++++++- ReClass.NET/Nodes/UTF16TextNode.cs | 6 ++++++ ReClass.NET/Nodes/UTF16TextPtrNode.cs | 6 ++++++ ReClass.NET/Nodes/UTF32TextNode.cs | 6 ++++++ ReClass.NET/Nodes/UTF32TextPtrNode.cs | 6 ++++++ ReClass.NET/Nodes/UTF8TextNode.cs | 6 ++++++ ReClass.NET/Nodes/UTF8TextPtrNode.cs | 6 ++++++ ReClass.NET/Nodes/VMethodNode.cs | 10 +++++----- ReClass.NET/Nodes/VTableNode.cs | 6 ++++++ ReClass.NET/Nodes/Vector2Node.cs | 11 ++++++----- ReClass.NET/Nodes/Vector3Node.cs | 11 ++++++----- ReClass.NET/Nodes/Vector4Node.cs | 11 ++++++----- ReClass.NET/UI/NodeTypesBuilder.cs | 13 +++++++------ 41 files changed, 242 insertions(+), 110 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 18875ae8..1fb284cb 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -295,6 +295,11 @@ private class CustomNode : BaseNode { public override int MemorySize => throw new NotImplementedException(); + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new NotImplementedException(); + } + public override int CalculateDrawnHeight(ViewInfo view) { throw new NotImplementedException(); diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index a7cdeb99..273328c5 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -75,6 +75,8 @@ protected BaseNode() levelsOpen[0] = true; } + public abstract void GetUserInterfaceInfo(out string name, out Image icon); + /// Clears the selection of the node. public virtual void ClearSelection() { diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 768e474d..78149528 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -51,6 +51,12 @@ public BitFieldNode() levelsOpen.DefaultValue = true; } + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Bitfield"; + icon = Properties.Resources.B16x16_Button_Bits; + } + public override void CopyFromNode(BaseNode node) { base.CopyFromNode(node); diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 845a8e78..0807671a 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -5,14 +5,14 @@ namespace ReClassNET.Nodes { public class BoolNode : BaseNumericNode { - /// Size of the node in bytes. public override int MemorySize => 1; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Bool"; + icon = Properties.Resources.B16x16_Button_Bool; + } + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) diff --git a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs index 30dc803d..e2f13241 100644 --- a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs @@ -1,17 +1,21 @@ using System.Drawing; using ReClassNET.Extensions; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { public class ClassInstanceArrayNode : BaseArrayNode { - /// Size of the node in bytes. public override int MemorySize => InnerNode.MemorySize * Count; public override bool PerformCycleCheck => true; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Class Instance Array"; + icon = Properties.Resources.B16x16_Button_Array; + } + public override void Intialize() { InnerNode = ClassNode.Create(); diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index f021f3a0..99f4463c 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -2,28 +2,27 @@ using System.Drawing; using ReClassNET.Extensions; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { public class ClassInstanceNode : BaseReferenceNode { - /// Size of the node in bytes. public override int MemorySize => InnerNode.MemorySize; public override bool PerformCycleCheck => true; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Class Instance"; + icon = Properties.Resources.B16x16_Button_Class_Instance; + } + public override void Intialize() { InnerNode = ClassNode.Create(); InnerNode.Intialize(); } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden) diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 23cbc7b1..4fa82b0b 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -23,7 +23,6 @@ public class ClassNode : BaseContainerNode public static IntPtr DefaultAddress { get; } = (IntPtr)0x400000; #endif - /// Size of the node in bytes. public override int MemorySize => Nodes.Sum(n => n.MemorySize); private NodeUuid uuid; @@ -73,6 +72,11 @@ public static ClassNode Create() return new ClassNode(true); } + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new InvalidOperationException($"The '{nameof(ClassNode)}' node should not be accessible from the ui."); + } + public override void Intialize() { AddBytes(IntPtr.Size); @@ -88,11 +92,6 @@ public override void ClearSelection() } } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { AddSelection(view, 0, y, view.Font.Height); diff --git a/ReClass.NET/Nodes/ClassPtrArrayNode.cs b/ReClass.NET/Nodes/ClassPtrArrayNode.cs index c2e7b212..ead92fc3 100644 --- a/ReClass.NET/Nodes/ClassPtrArrayNode.cs +++ b/ReClass.NET/Nodes/ClassPtrArrayNode.cs @@ -13,6 +13,12 @@ public class ClassPtrArrayNode : BaseArrayNode public override bool PerformCycleCheck => false; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Class Pointer Array"; + icon = Properties.Resources.B16x16_Button_Pointer_Array; + } + public override void Intialize() { var node = ClassNode.Create(); diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs index 0e1a223d..b3a51e84 100644 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ b/ReClass.NET/Nodes/ClassPtrNode.cs @@ -4,7 +4,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -16,6 +15,12 @@ public class ClassPtrNode : BaseReferenceNode public override bool PerformCycleCheck => false; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Class Pointer"; + icon = Properties.Resources.B16x16_Button_Class_Pointer; + } + public override void Intialize() { var node = ClassNode.Create(); diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index 93bc588a..495935fc 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -8,6 +8,12 @@ public class DoubleNode : BaseNumericNode { public override int MemorySize => 8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Double"; + icon = Properties.Resources.B16x16_Button_Double; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000"), null); diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 43a64302..e607b26f 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -8,6 +8,12 @@ public class FloatNode : BaseNumericNode { public override int MemorySize => 4; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Float"; + icon = Properties.Resources.B16x16_Button_Float; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawNumeric(view, x, y, Icons.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000"), null); diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 393f1cb8..6f0ea23b 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -15,9 +15,14 @@ public class FunctionNode : BaseFunctionNode public ClassNode BelongsToClass { get; set; } private int memorySize = IntPtr.Size; - /// Size of the node in bytes. public override int MemorySize => memorySize; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Function"; + icon = Properties.Resources.B16x16_Button_Function; + } + public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) { DisassembleRemoteCode(memory, spot.Address); diff --git a/ReClass.NET/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs index 0740623a..7530d91c 100644 --- a/ReClass.NET/Nodes/FunctionPtrNode.cs +++ b/ReClass.NET/Nodes/FunctionPtrNode.cs @@ -5,6 +5,12 @@ namespace ReClassNET.Nodes { public class FunctionPtrNode : BaseFunctionPtrNode { + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Function Pointer"; + icon = Properties.Resources.B16x16_Button_Function_Pointer; + } + public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "FunctionPtr", Name); diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index a93d13f5..b63fbddc 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -6,13 +6,14 @@ namespace ReClassNET.Nodes { public class Hex16Node : BaseHexNode { - /// Size of the node in bytes. public override int MemorySize => 2; - /// Gets informations about this node to show in a tool tip. - /// The spot. - /// The process memory. - /// The information to show in a tool tip. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Hex16"; + icon = Properties.Resources.B16x16_Button_Hex_16; + } + public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) { var value = memory.ReadObject(Offset); @@ -20,11 +21,6 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) return $"Int16: {value.ShortValue}\nUInt16: 0x{value.UShortValue:X04}"; } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 2) + " " : null, 2); diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 8310408d..0ccfb4d3 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -7,9 +7,14 @@ namespace ReClassNET.Nodes { public class Hex32Node : BaseHexCommentNode { - /// Size of the node in bytes. public override int MemorySize => 4; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Hex32"; + icon = Properties.Resources.B16x16_Button_Hex_32; + } + public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) { var value = memory.ReadObject(Offset); @@ -19,10 +24,6 @@ public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, return memory.Process?.GetNamedAddress(value.IntPtr) != null; } - /// Gets informations about this node to show in a tool tip. - /// The spot. - /// The process memory. - /// The information to show in a tool tip. public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) { var value = memory.ReadObject(Offset); @@ -30,11 +31,6 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) return $"Int32: {value.IntValue}\nUInt32: 0x{value.UIntValue:X08}\nFloat: {value.FloatValue:0.000}"; } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 4) + " " : null, 4); diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index ab297773..82a54782 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -7,9 +7,14 @@ namespace ReClassNET.Nodes { public class Hex64Node : BaseHexCommentNode { - /// Size of the node in bytes. public override int MemorySize => 8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Hex64"; + icon = Properties.Resources.B16x16_Button_Hex_64; + } + public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) { var value = memory.ReadObject(Offset); @@ -19,10 +24,6 @@ public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, return memory.Process.GetSectionToPointer(value.IntPtr) != null; } - /// Gets informations about this node to show in a tool tip. - /// The spot. - /// The process memory. - /// The information to show in a tool tip. public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) { var value = memory.ReadObject(Offset); @@ -30,11 +31,6 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) return $"Int64: {value.LongValue}\nUInt64: 0x{value.ULongValue:X016}\nFloat: {value.FloatValue:0.000}\nDouble: {value.DoubleValue:0.000}"; } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 8) + " " : null, 8); diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index f5ab9465..9319f65d 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -8,6 +8,12 @@ public class Hex8Node : BaseHexNode { public override int MemorySize => 1; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Hex8"; + icon = Properties.Resources.B16x16_Button_Hex_8; + } + public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) { var b = memory.ReadUInt8(Offset); diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 213d85a0..e54c9351 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class Int16Node : BaseNumericNode { public override int MemorySize => 2; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Int16"; + icon = Properties.Resources.B16x16_Button_Int_16; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 5c5d9ceb..f2742cbc 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class Int32Node : BaseNumericNode { public override int MemorySize => 4; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Int32"; + icon = Properties.Resources.B16x16_Button_Int_32; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index ab26c3f8..d4146f22 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class Int64Node : BaseNumericNode { public override int MemorySize => 8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Int64"; + icon = Properties.Resources.B16x16_Button_Int_64; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 99316a5a..e1ed38c9 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class Int8Node : BaseNumericNode { public override int MemorySize => 1; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Int8"; + icon = Properties.Resources.B16x16_Button_Int_8; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index 296a6332..6d6b87f1 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -1,7 +1,7 @@ -using System.Drawing; +using System; +using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; -using System; namespace ReClassNET.Nodes { @@ -34,11 +34,12 @@ private struct Matrix3x3Data public override int MemorySize => 9 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Matrix 3x3"; + icon = Properties.Resources.B16x16_Button_Matrix_3x3; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index b3f3f625..d00322da 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -40,11 +40,12 @@ private struct Matrix3x4Data public override int MemorySize => 12 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Matrix 3x4"; + icon = Properties.Resources.B16x16_Button_Matrix_3x4; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index deb1e748..a1ded35e 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -48,11 +48,12 @@ private struct Matrix4x4Data public override int MemorySize => 16 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Matrix 4x4"; + icon = Properties.Resources.B16x16_Button_Matrix_3x3; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawMatrixType(view, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index f2d90b3c..97609290 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.Memory; using ReClassNET.UI; @@ -14,6 +13,12 @@ public class PointerNode : BaseWrapperNode public override bool PerformCycleCheck => false; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Pointer"; + icon = Properties.Resources.B16x16_Pointer_Type; + } + public override bool CanChangeInnerNodeTo(BaseNode node) { return true; @@ -21,7 +26,6 @@ public override bool CanChangeInnerNodeTo(BaseNode node) public override Size Draw(ViewInfo view, int x, int y) { - //return DrawHidden(view, x, y); if (IsHidden) { return DrawHidden(view, x, y); @@ -45,10 +49,6 @@ public override Size Draw(ViewInfo view, int x, int y) if (InnerNode == null) { x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "") + view.Font.Width; - } - else - { - } x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width; diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 1c279379..c0b28138 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class UInt16Node : BaseNumericNode { public override int MemorySize => 2; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UInt16 / WORD"; + icon = Properties.Resources.B16x16_Button_UInt_16; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index fee519af..19925380 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class UInt32Node : BaseNumericNode { public override int MemorySize => 4; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UInt32 / DWORD"; + icon = Properties.Resources.B16x16_Button_UInt_32; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 6a2a61d5..b8a1b8f3 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class UInt64Node : BaseNumericNode { public override int MemorySize => 8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UInt64 / QWORD"; + icon = Properties.Resources.B16x16_Button_UInt_64; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index 6292ac20..7f157a23 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -3,7 +3,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -11,6 +10,12 @@ public class UInt8Node : BaseNumericNode { public override int MemorySize => 1; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UInt8 / BYTE"; + icon = Properties.Resources.B16x16_Button_UInt_8; + } + public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index 8ed4897b..8a7cef54 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -8,6 +8,12 @@ public class Utf16TextNode : BaseTextNode { public override Encoding Encoding => Encoding.Unicode; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF16 / Unicode Text"; + icon = Properties.Resources.B16x16_Button_UText; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text16"); diff --git a/ReClass.NET/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs index 9b6bd111..ec210c23 100644 --- a/ReClass.NET/Nodes/UTF16TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF16TextPtrNode.cs @@ -8,6 +8,12 @@ public class Utf16TextPtrNode : BaseTextPtrNode { public override Encoding Encoding => Encoding.Unicode; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF16 / Unicode Text Pointer"; + icon = Properties.Resources.B16x16_Button_UText_Pointer; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text16Ptr"); diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index 2c3dd84b..0868a3ae 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -8,6 +8,12 @@ public class Utf32TextNode : BaseTextNode { public override Encoding Encoding => Encoding.UTF32; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF32 Text"; + icon = Properties.Resources.B16x16_Button_UText; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text32"); diff --git a/ReClass.NET/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs index cd14be3a..840717fd 100644 --- a/ReClass.NET/Nodes/UTF32TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF32TextPtrNode.cs @@ -8,6 +8,12 @@ public class Utf32TextPtrNode : BaseTextPtrNode { public override Encoding Encoding => Encoding.UTF32; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF32 Text Pointer"; + icon = Properties.Resources.B16x16_Button_UText_Pointer; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text32Ptr"); diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index c724f2a8..934c2d19 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -8,6 +8,12 @@ public class Utf8TextNode : BaseTextNode { public override Encoding Encoding => Encoding.UTF8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF8 / ASCII Text"; + icon = Properties.Resources.B16x16_Button_Text; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text8"); diff --git a/ReClass.NET/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs index 501463b3..71c7bfc8 100644 --- a/ReClass.NET/Nodes/UTF8TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF8TextPtrNode.cs @@ -8,6 +8,12 @@ public class Utf8TextPtrNode : BaseTextPtrNode { public override Encoding Encoding => Encoding.UTF8; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "UTF8 / ASCII Text Pointer"; + icon = Properties.Resources.B16x16_Button_Text_Pointer; + } + public override Size Draw(ViewInfo view, int x, int y) { return DrawText(view, x, y, "Text8Ptr"); diff --git a/ReClass.NET/Nodes/VMethodNode.cs b/ReClass.NET/Nodes/VMethodNode.cs index aaf17416..5d9e3ecd 100644 --- a/ReClass.NET/Nodes/VMethodNode.cs +++ b/ReClass.NET/Nodes/VMethodNode.cs @@ -9,6 +9,11 @@ public class VMethodNode : BaseFunctionPtrNode { public string MethodName => string.IsNullOrEmpty(Name) ? $"Function{Offset.ToInt32() / IntPtr.Size}" : Name; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new InvalidOperationException($"The '{nameof(VMethodNode)}' node should not be accessible from the ui."); + } + public VMethodNode() { Contract.Ensures(Name != null); @@ -16,11 +21,6 @@ public VMethodNode() Name = string.Empty; } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, $"({Offset.ToInt32() / IntPtr.Size})", MethodName); diff --git a/ReClass.NET/Nodes/VTableNode.cs b/ReClass.NET/Nodes/VTableNode.cs index ff06d6f3..0615dcbb 100644 --- a/ReClass.NET/Nodes/VTableNode.cs +++ b/ReClass.NET/Nodes/VTableNode.cs @@ -13,6 +13,12 @@ public class VTableNode : BaseContainerNode public override int MemorySize => IntPtr.Size; + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "VTable Pointer"; + icon = Properties.Resources.B16x16_Button_VTable; + } + public override void Intialize() { AddBytes(10 * IntPtr.Size); diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index 713dca38..b0b1643e 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -19,11 +19,12 @@ private struct Vector2Data public override int MemorySize => 2 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Vector2"; + icon = Properties.Resources.B16x16_Button_Vector_2; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector2", (ref int x, ref int y) => diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index bc5140d9..99c14b49 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -21,11 +21,12 @@ private struct Vector3Data public override int MemorySize => 3 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Vector3"; + icon = Properties.Resources.B16x16_Button_Vector_3; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector3", (ref int x, ref int y) => diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 1db6ce03..2fc086b4 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -23,11 +23,12 @@ private struct Vector4Data public override int MemorySize => 4 * ValueTypeSize; - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Vector4"; + icon = Properties.Resources.B16x16_Button_Vector_4; + } + public override Size Draw(ViewInfo view, int x2, int y2) { return DrawVectorType(view, x2, y2, "Vector4", (ref int x, ref int y) => diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 1dd4ae30..11468ce2 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -143,16 +143,17 @@ private static IEnumerable CreateToolStripItems(Func Date: Fri, 4 Jan 2019 15:35:57 +0100 Subject: [PATCH 330/777] Use dynamic node menu items. --- ReClass.NET/Forms/MainForm.cs | 4 - ReClass.NET/UI/MemoryViewControl.Designer.cs | 469 ------------------- ReClass.NET/UI/MemoryViewControl.cs | 42 +- 3 files changed, 3 insertions(+), 512 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 5ddfe86f..834f2737 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -607,8 +607,6 @@ internal void RegisterNodeType(Type type, string name, Image icon) item.Click += memoryTypeToolStripButton_Click; toolStrip.Items.Add(item); - - memoryViewControl.RegisterNodeType(type, name, icon); } /// Deregisters the node type. @@ -623,8 +621,6 @@ internal void DeregisterNodeType(Type type) item.Click -= memoryTypeToolStripButton_Click; toolStrip.Items.Remove(item); } - - memoryViewControl.DeregisterNodeType(type); } /// Shows the code form with the given . diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 20759b5f..1d589a0f 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -31,48 +31,6 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.hex64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.hex8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.int64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.int8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.uInt64ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt32ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt16ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uInt8ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.boolToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.bitsToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.floatToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.doubleToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.vector4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vector3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vector2ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.matrix4x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.matrix3x4ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.matrix3x3ToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.uTF8TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF8TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF16TextToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.uTF16TextPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.classInstanceToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.classPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.arrayToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.arrayOfPointersToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.vTablePointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.functionPointerToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); - this.functionToolStripMenuItem = new ReClassNET.UI.TypeToolStripMenuItem(); this.addBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); @@ -154,396 +112,11 @@ private void InitializeComponent() // // changeTypeToolStripMenuItem // - this.changeTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.hex64ToolStripMenuItem, - this.hex32ToolStripMenuItem, - this.hex16ToolStripMenuItem, - this.hex8ToolStripMenuItem, - this.toolStripSeparator3, - this.int64ToolStripMenuItem, - this.int32ToolStripMenuItem, - this.int16ToolStripMenuItem, - this.int8ToolStripMenuItem, - this.toolStripSeparator4, - this.uInt64ToolStripMenuItem, - this.uInt32ToolStripMenuItem, - this.uInt16ToolStripMenuItem, - this.uInt8ToolStripMenuItem, - this.toolStripSeparator5, - this.boolToolStripMenuItem, - this.bitsToolStripMenuItem, - this.toolStripSeparator11, - this.floatToolStripMenuItem, - this.doubleToolStripMenuItem, - this.toolStripSeparator6, - this.vector4ToolStripMenuItem, - this.vector3ToolStripMenuItem, - this.vector2ToolStripMenuItem, - this.toolStripSeparator7, - this.matrix4x4ToolStripMenuItem, - this.matrix3x4ToolStripMenuItem, - this.matrix3x3ToolStripMenuItem, - this.toolStripSeparator8, - this.uTF8TextToolStripMenuItem, - this.uTF8TextPointerToolStripMenuItem, - this.uTF16TextToolStripMenuItem, - this.uTF16TextPointerToolStripMenuItem, - this.toolStripSeparator9, - this.classInstanceToolStripMenuItem, - this.classPointerToolStripMenuItem, - this.toolStripSeparator10, - this.arrayToolStripMenuItem, - this.arrayOfPointersToolStripMenuItem, - this.vTablePointerToolStripMenuItem, - this.functionToolStripMenuItem, - this.functionPointerToolStripMenuItem}); this.changeTypeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Exchange_Button; this.changeTypeToolStripMenuItem.Name = "changeTypeToolStripMenuItem"; this.changeTypeToolStripMenuItem.Size = new System.Drawing.Size(269, 22); this.changeTypeToolStripMenuItem.Text = "Change Type"; // - // hex64ToolStripMenuItem - // - this.hex64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; - this.hex64ToolStripMenuItem.Name = "hex64ToolStripMenuItem"; - this.hex64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.hex64ToolStripMenuItem.Text = "Hex 64"; - this.hex64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex64Node); - this.hex64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex32ToolStripMenuItem - // - this.hex32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; - this.hex32ToolStripMenuItem.Name = "hex32ToolStripMenuItem"; - this.hex32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.hex32ToolStripMenuItem.Text = "Hex 32"; - this.hex32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex32Node); - this.hex32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex16ToolStripMenuItem - // - this.hex16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; - this.hex16ToolStripMenuItem.Name = "hex16ToolStripMenuItem"; - this.hex16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.hex16ToolStripMenuItem.Text = "Hex 16"; - this.hex16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex16Node); - this.hex16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // hex8ToolStripMenuItem - // - this.hex8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; - this.hex8ToolStripMenuItem.Name = "hex8ToolStripMenuItem"; - this.hex8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.hex8ToolStripMenuItem.Text = "Hex 8"; - this.hex8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Hex8Node); - this.hex8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); - // - // int64ToolStripMenuItem - // - this.int64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; - this.int64ToolStripMenuItem.Name = "int64ToolStripMenuItem"; - this.int64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.int64ToolStripMenuItem.Text = "Int 64"; - this.int64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int64Node); - this.int64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int32ToolStripMenuItem - // - this.int32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; - this.int32ToolStripMenuItem.Name = "int32ToolStripMenuItem"; - this.int32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.int32ToolStripMenuItem.Text = "Int 32"; - this.int32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int32Node); - this.int32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int16ToolStripMenuItem - // - this.int16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; - this.int16ToolStripMenuItem.Name = "int16ToolStripMenuItem"; - this.int16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.int16ToolStripMenuItem.Text = "Int 16"; - this.int16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int16Node); - this.int16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // int8ToolStripMenuItem - // - this.int8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; - this.int8ToolStripMenuItem.Name = "int8ToolStripMenuItem"; - this.int8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.int8ToolStripMenuItem.Text = "Int 8"; - this.int8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Int8Node); - this.int8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(177, 6); - // - // uInt64ToolStripMenuItem - // - this.uInt64ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; - this.uInt64ToolStripMenuItem.Name = "uInt64ToolStripMenuItem"; - this.uInt64ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uInt64ToolStripMenuItem.Text = "UInt 64"; - this.uInt64ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt64Node); - this.uInt64ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt32ToolStripMenuItem - // - this.uInt32ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; - this.uInt32ToolStripMenuItem.Name = "uInt32ToolStripMenuItem"; - this.uInt32ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uInt32ToolStripMenuItem.Text = "UInt 32"; - this.uInt32ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt32Node); - this.uInt32ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt16ToolStripMenuItem - // - this.uInt16ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; - this.uInt16ToolStripMenuItem.Name = "uInt16ToolStripMenuItem"; - this.uInt16ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uInt16ToolStripMenuItem.Text = "UInt 16"; - this.uInt16ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt16Node); - this.uInt16ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uInt8ToolStripMenuItem - // - this.uInt8ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; - this.uInt8ToolStripMenuItem.Name = "uInt8ToolStripMenuItem"; - this.uInt8ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uInt8ToolStripMenuItem.Text = "UInt 8"; - this.uInt8ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.UInt8Node); - this.uInt8ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(177, 6); - // - // boolToolStripMenuItem - // - this.boolToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; - this.boolToolStripMenuItem.Name = "boolToolStripMenuItem"; - this.boolToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.boolToolStripMenuItem.Text = "Bool"; - this.boolToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BoolNode); - this.boolToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // bitsToolStripMenuItem - // - this.bitsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; - this.bitsToolStripMenuItem.Name = "bitsToolStripMenuItem"; - this.bitsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.bitsToolStripMenuItem.Text = "Bits"; - this.bitsToolStripMenuItem.Value = typeof(ReClassNET.Nodes.BitFieldNode); - this.bitsToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(177, 6); - // - // floatToolStripMenuItem - // - this.floatToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; - this.floatToolStripMenuItem.Name = "floatToolStripMenuItem"; - this.floatToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.floatToolStripMenuItem.Text = "Float"; - this.floatToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FloatNode); - this.floatToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // doubleToolStripMenuItem - // - this.doubleToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; - this.doubleToolStripMenuItem.Name = "doubleToolStripMenuItem"; - this.doubleToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.doubleToolStripMenuItem.Text = "Double"; - this.doubleToolStripMenuItem.Value = typeof(ReClassNET.Nodes.DoubleNode); - this.doubleToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(177, 6); - // - // vector4ToolStripMenuItem - // - this.vector4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; - this.vector4ToolStripMenuItem.Name = "vector4ToolStripMenuItem"; - this.vector4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.vector4ToolStripMenuItem.Text = "Vector 4"; - this.vector4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector4Node); - this.vector4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vector3ToolStripMenuItem - // - this.vector3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; - this.vector3ToolStripMenuItem.Name = "vector3ToolStripMenuItem"; - this.vector3ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.vector3ToolStripMenuItem.Text = "Vector 3"; - this.vector3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector3Node); - this.vector3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vector2ToolStripMenuItem - // - this.vector2ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; - this.vector2ToolStripMenuItem.Name = "vector2ToolStripMenuItem"; - this.vector2ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.vector2ToolStripMenuItem.Text = "Vector 2"; - this.vector2ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Vector2Node); - this.vector2ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); - // - // matrix4x4ToolStripMenuItem - // - this.matrix4x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; - this.matrix4x4ToolStripMenuItem.Name = "matrix4x4ToolStripMenuItem"; - this.matrix4x4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.matrix4x4ToolStripMenuItem.Text = "Matrix 4x4"; - this.matrix4x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); - this.matrix4x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // matrix3x4ToolStripMenuItem - // - this.matrix3x4ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; - this.matrix3x4ToolStripMenuItem.Name = "matrix3x4ToolStripMenuItem"; - this.matrix3x4ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.matrix3x4ToolStripMenuItem.Text = "Matrix 3x4"; - this.matrix3x4ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); - this.matrix3x4ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // matrix3x3ToolStripMenuItem - // - this.matrix3x3ToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; - this.matrix3x3ToolStripMenuItem.Name = "matrix3x3ToolStripMenuItem"; - this.matrix3x3ToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.matrix3x3ToolStripMenuItem.Text = "Matrix 3x3"; - this.matrix3x3ToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); - this.matrix3x3ToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(177, 6); - // - // uTF8TextToolStripMenuItem - // - this.uTF8TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; - this.uTF8TextToolStripMenuItem.Name = "uTF8TextToolStripMenuItem"; - this.uTF8TextToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uTF8TextToolStripMenuItem.Text = "UTF8 Text"; - this.uTF8TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextNode); - this.uTF8TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF8TextPointerToolStripMenuItem - // - this.uTF8TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; - this.uTF8TextPointerToolStripMenuItem.Name = "uTF8TextPointerToolStripMenuItem"; - this.uTF8TextPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uTF8TextPointerToolStripMenuItem.Text = "UTF8 Text Pointer"; - this.uTF8TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); - this.uTF8TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF16TextToolStripMenuItem - // - this.uTF16TextToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; - this.uTF16TextToolStripMenuItem.Name = "uTF16TextToolStripMenuItem"; - this.uTF16TextToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uTF16TextToolStripMenuItem.Text = "UTF16 Text"; - this.uTF16TextToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextNode); - this.uTF16TextToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // uTF16TextPointerToolStripMenuItem - // - this.uTF16TextPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; - this.uTF16TextPointerToolStripMenuItem.Name = "uTF16TextPointerToolStripMenuItem"; - this.uTF16TextPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.uTF16TextPointerToolStripMenuItem.Text = "UTF16 Text Pointer"; - this.uTF16TextPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); - this.uTF16TextPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(177, 6); - // - // classInstanceToolStripMenuItem - // - this.classInstanceToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; - this.classInstanceToolStripMenuItem.Name = "classInstanceToolStripMenuItem"; - this.classInstanceToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.classInstanceToolStripMenuItem.Text = "Class Instance"; - this.classInstanceToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); - this.classInstanceToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // classPointerToolStripMenuItem - // - this.classPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; - this.classPointerToolStripMenuItem.Name = "classPointerToolStripMenuItem"; - this.classPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.classPointerToolStripMenuItem.Text = "Class Pointer"; - this.classPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrNode); - this.classPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(177, 6); - // - // arrayToolStripMenuItem - // - this.arrayToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; - this.arrayToolStripMenuItem.Name = "arrayToolStripMenuItem"; - this.arrayToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.arrayToolStripMenuItem.Text = "Array of Classes"; - this.arrayToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); - this.arrayToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // arrayOfPointersToolStripMenuItem - // - this.arrayOfPointersToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; - this.arrayOfPointersToolStripMenuItem.Name = "arrayOfPointersToolStripMenuItem"; - this.arrayOfPointersToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.arrayOfPointersToolStripMenuItem.Text = "Array of Pointers"; - this.arrayOfPointersToolStripMenuItem.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); - this.arrayOfPointersToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // vTablePointerToolStripMenuItem - // - this.vTablePointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; - this.vTablePointerToolStripMenuItem.Name = "vTablePointerToolStripMenuItem"; - this.vTablePointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.vTablePointerToolStripMenuItem.Text = "VTable Pointer"; - this.vTablePointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.VTableNode); - this.vTablePointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // functionPointerToolStripMenuItem - // - this.functionPointerToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; - this.functionPointerToolStripMenuItem.Name = "functionPointerToolStripMenuItem"; - this.functionPointerToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.functionPointerToolStripMenuItem.Text = "Function Pointer"; - this.functionPointerToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); - this.functionPointerToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // - // functionToolStripMenuItem - // - this.functionToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; - this.functionToolStripMenuItem.Name = "functionToolStripMenuItem"; - this.functionToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.functionToolStripMenuItem.Text = "Function"; - this.functionToolStripMenuItem.Value = typeof(ReClassNET.Nodes.FunctionNode); - this.functionToolStripMenuItem.Click += new System.EventHandler(this.memoryTypeToolStripMenuItem_Click); - // // addBytesToolStripMenuItem // this.addBytesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -937,46 +510,6 @@ private void InitializeComponent() private System.Windows.Forms.Timer repaintTimer; private HotSpotTextBox editBox; private System.Windows.Forms.ToolTip nodeInfoToolTip; - private UI.TypeToolStripMenuItem hex64ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex32ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex16ToolStripMenuItem; - private UI.TypeToolStripMenuItem hex8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private UI.TypeToolStripMenuItem int64ToolStripMenuItem; - private UI.TypeToolStripMenuItem int32ToolStripMenuItem; - private UI.TypeToolStripMenuItem int16ToolStripMenuItem; - private UI.TypeToolStripMenuItem int8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private UI.TypeToolStripMenuItem uInt64ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt32ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt16ToolStripMenuItem; - private UI.TypeToolStripMenuItem uInt8ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private UI.TypeToolStripMenuItem floatToolStripMenuItem; - private UI.TypeToolStripMenuItem doubleToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private UI.TypeToolStripMenuItem vector4ToolStripMenuItem; - private UI.TypeToolStripMenuItem vector3ToolStripMenuItem; - private UI.TypeToolStripMenuItem vector2ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private UI.TypeToolStripMenuItem matrix4x4ToolStripMenuItem; - private UI.TypeToolStripMenuItem matrix3x4ToolStripMenuItem; - private UI.TypeToolStripMenuItem matrix3x3ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private UI.TypeToolStripMenuItem uTF8TextToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF8TextPointerToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF16TextToolStripMenuItem; - private UI.TypeToolStripMenuItem uTF16TextPointerToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private UI.TypeToolStripMenuItem classInstanceToolStripMenuItem; - private UI.TypeToolStripMenuItem classPointerToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private UI.TypeToolStripMenuItem arrayToolStripMenuItem; - private UI.TypeToolStripMenuItem vTablePointerToolStripMenuItem; - private UI.TypeToolStripMenuItem functionPointerToolStripMenuItem; - private UI.TypeToolStripMenuItem arrayOfPointersToolStripMenuItem; - private UI.TypeToolStripMenuItem bitsToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; private System.Windows.Forms.ToolStripMenuItem copyNodeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem pasteNodesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem hideNodesToolStripMenuItem; @@ -986,8 +519,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripMenuItem createClassFromNodesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private UI.TypeToolStripMenuItem boolToolStripMenuItem; - private UI.TypeToolStripMenuItem functionToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findOutWhatAccessesThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findOutWhatWritesToThisAddressToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 12e45a9d..e1a771bc 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -110,35 +110,6 @@ protected override void OnLoad(EventArgs e) HorizontalScroll.SmallChange = 100; } - internal void RegisterNodeType(Type type, string name, Image icon) - { - Contract.Requires(type != null); - Contract.Requires(name != null); - Contract.Requires(icon != null); - - var item = new TypeToolStripMenuItem - { - Image = icon, - Text = name, - Value = type - }; - item.Click += memoryTypeToolStripMenuItem_Click; - - changeTypeToolStripMenuItem.DropDownItems.Add(item); - } - - internal void DeregisterNodeType(Type type) - { - Contract.Requires(type != null); - - var item = changeTypeToolStripMenuItem.DropDownItems.OfType().FirstOrDefault(i => i.Value == type); - if (item != null) - { - item.Click -= memoryTypeToolStripMenuItem_Click; - changeTypeToolStripMenuItem.DropDownItems.Remove(item); - } - } - protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); @@ -757,6 +728,9 @@ private void editBox_Committed(object sender, EventArgs e) private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs e) { + changeTypeToolStripMenuItem.DropDownItems.Clear(); + changeTypeToolStripMenuItem.DropDownItems.AddRange(NodeTypesBuilder.CreateToolStripMenuItems(ReplaceSelectedNodesWithType, false).ToArray()); + var count = selectedNodes.Count; var node = selectedNodes.Select(s => s.Node).FirstOrDefault(); var parentNode = node?.ParentNode; @@ -827,16 +801,6 @@ private void insertBytesToolStripMenuItem_Click(object sender, EventArgs e) InsertBytes(item.Value); } - private void memoryTypeToolStripMenuItem_Click(object sender, EventArgs e) - { - if (!(sender is TypeToolStripMenuItem item)) - { - return; - } - - ReplaceSelectedNodesWithType(item.Value); - } - private void createClassFromNodesToolStripMenuItem_Click(object sender, EventArgs e) { if (selectedNodes.Count > 0 && !(selectedNodes[0].Node is ClassNode)) From a50ea42606d975ae52387680acdca3e4ec27dc5a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 4 Jan 2019 15:41:02 +0100 Subject: [PATCH 331/777] Fixed icon. --- ReClass.NET/Nodes/Matrix4x4Node.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index a1ded35e..a2adb2f0 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -51,7 +51,7 @@ private struct Matrix4x4Data public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "Matrix 4x4"; - icon = Properties.Resources.B16x16_Button_Matrix_3x3; + icon = Properties.Resources.B16x16_Button_Matrix_4x4; } public override Size Draw(ViewInfo view, int x2, int y2) From 9ae4bdd49b84b55e8eb55bec2f48d0985a1caf72 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 4 Jan 2019 15:43:46 +0100 Subject: [PATCH 332/777] Use dynamic node toolstrip items. --- ReClass.NET/Forms/MainForm.Designer.cs | 548 +------------------------ ReClass.NET/Forms/MainForm.cs | 30 +- 2 files changed, 12 insertions(+), 566 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index bafa9bb9..62856bcd 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -59,49 +59,7 @@ private void InitializeComponent() this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); this.insertXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.hex64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.hex8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.int64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.int8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.uint64ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint32ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint16ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.uint8ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.boolToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.bitFieldToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); - this.floatToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.doubleToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.vec4ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vec3ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vec2ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat44ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat34ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.mat33ToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.utf8TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf8TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf16TextToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.utf16TextPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.classInstanceToolStripButton6 = new ReClassNET.UI.TypeToolStripButton(); - this.classPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.arrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.ptrArrayToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.vtableToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.fnPtrToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.fnTypeToolStripButton = new ReClassNET.UI.TypeToolStripButton(); - this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); + this.nodeTypesToolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.processInfoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.infoToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); @@ -204,49 +162,7 @@ private void InitializeComponent() this.newClassToolStripButton, this.addBytesToolStripDropDownButton, this.insertBytesToolStripDropDownButton, - this.toolStripSeparator8, - this.hex64ToolStripButton, - this.hex32ToolStripButton, - this.hex16ToolStripButton, - this.hex8ToolStripButton, - this.toolStripSeparator9, - this.int64ToolStripButton, - this.int32ToolStripButton, - this.int16ToolStripButton, - this.int8ToolStripButton, - this.toolStripSeparator10, - this.uint64ToolStripButton, - this.uint32ToolStripButton, - this.uint16ToolStripButton, - this.uint8ToolStripButton, - this.toolStripSeparator11, - this.boolToolStripButton, - this.bitFieldToolStripButton, - this.toolStripSeparator18, - this.floatToolStripButton, - this.doubleToolStripButton, - this.toolStripSeparator12, - this.vec4ToolStripButton, - this.vec3ToolStripButton, - this.vec2ToolStripButton, - this.mat44ToolStripButton, - this.mat34ToolStripButton, - this.mat33ToolStripButton, - this.toolStripSeparator13, - this.utf8TextToolStripButton, - this.utf8TextPtrToolStripButton, - this.utf16TextToolStripButton, - this.utf16TextPtrToolStripButton, - this.toolStripSeparator14, - this.classInstanceToolStripButton6, - this.classPtrToolStripButton, - this.toolStripSeparator15, - this.arrayToolStripButton, - this.ptrArrayToolStripButton, - this.vtableToolStripButton, - this.fnTypeToolStripButton, - this.fnPtrToolStripButton, - this.toolStripSeparator19}); + this.nodeTypesToolStripSeparator}); this.toolStrip.Location = new System.Drawing.Point(0, 24); this.toolStrip.Name = "toolStrip"; this.toolStrip.Size = new System.Drawing.Size(1141, 25); @@ -484,418 +400,10 @@ private void InitializeComponent() this.insertXBytesToolStripMenuItem.Text = "Insert ... Bytes"; this.insertXBytesToolStripMenuItem.Click += new System.EventHandler(this.insertXBytesToolStripMenuItem_Click); // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(6, 25); - // - // hex64ToolStripButton - // - this.hex64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_64; - this.hex64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex64ToolStripButton.Name = "hex64ToolStripButton"; - this.hex64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex64ToolStripButton.ToolTipText = "Hex64"; - this.hex64ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex64Node); - this.hex64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex32ToolStripButton - // - this.hex32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_32; - this.hex32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex32ToolStripButton.Name = "hex32ToolStripButton"; - this.hex32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex32ToolStripButton.ToolTipText = "Hex32"; - this.hex32ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex32Node); - this.hex32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex16ToolStripButton - // - this.hex16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_16; - this.hex16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex16ToolStripButton.Name = "hex16ToolStripButton"; - this.hex16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex16ToolStripButton.ToolTipText = "Hex16"; - this.hex16ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex16Node); - this.hex16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // hex8ToolStripButton - // - this.hex8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.hex8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Hex_8; - this.hex8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.hex8ToolStripButton.Name = "hex8ToolStripButton"; - this.hex8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.hex8ToolStripButton.ToolTipText = "Hex8"; - this.hex8ToolStripButton.Value = typeof(ReClassNET.Nodes.Hex8Node); - this.hex8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // - // int64ToolStripButton - // - this.int64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_64; - this.int64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int64ToolStripButton.Name = "int64ToolStripButton"; - this.int64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int64ToolStripButton.ToolTipText = "Int64"; - this.int64ToolStripButton.Value = typeof(ReClassNET.Nodes.Int64Node); - this.int64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int32ToolStripButton - // - this.int32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_32; - this.int32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int32ToolStripButton.Name = "int32ToolStripButton"; - this.int32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int32ToolStripButton.ToolTipText = "Int32"; - this.int32ToolStripButton.Value = typeof(ReClassNET.Nodes.Int32Node); - this.int32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int16ToolStripButton - // - this.int16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_16; - this.int16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int16ToolStripButton.Name = "int16ToolStripButton"; - this.int16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int16ToolStripButton.ToolTipText = "Int16"; - this.int16ToolStripButton.Value = typeof(ReClassNET.Nodes.Int16Node); - this.int16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // int8ToolStripButton - // - this.int8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.int8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Int_8; - this.int8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.int8ToolStripButton.Name = "int8ToolStripButton"; - this.int8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.int8ToolStripButton.ToolTipText = "Int8"; - this.int8ToolStripButton.Value = typeof(ReClassNET.Nodes.Int8Node); - this.int8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(6, 25); - // - // uint64ToolStripButton - // - this.uint64ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint64ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_64; - this.uint64ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint64ToolStripButton.Name = "uint64ToolStripButton"; - this.uint64ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint64ToolStripButton.ToolTipText = "UInt64 / QWORD"; - this.uint64ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt64Node); - this.uint64ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint32ToolStripButton - // - this.uint32ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint32ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_32; - this.uint32ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint32ToolStripButton.Name = "uint32ToolStripButton"; - this.uint32ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint32ToolStripButton.ToolTipText = "UInt32 / DWORD"; - this.uint32ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt32Node); - this.uint32ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint16ToolStripButton - // - this.uint16ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint16ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_16; - this.uint16ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint16ToolStripButton.Name = "uint16ToolStripButton"; - this.uint16ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint16ToolStripButton.ToolTipText = "UInt16 / WORD"; - this.uint16ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt16Node); - this.uint16ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // uint8ToolStripButton - // - this.uint8ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.uint8ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UInt_8; - this.uint8ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.uint8ToolStripButton.Name = "uint8ToolStripButton"; - this.uint8ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.uint8ToolStripButton.ToolTipText = "UInt8 / BYTE"; - this.uint8ToolStripButton.Value = typeof(ReClassNET.Nodes.UInt8Node); - this.uint8ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(6, 25); - // - // boolToolStripButton - // - this.boolToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.boolToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bool; - this.boolToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.boolToolStripButton.Name = "boolToolStripButton"; - this.boolToolStripButton.Size = new System.Drawing.Size(23, 22); - this.boolToolStripButton.ToolTipText = "Bool"; - this.boolToolStripButton.Value = typeof(ReClassNET.Nodes.BoolNode); - this.boolToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // bitFieldToolStripButton - // - this.bitFieldToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.bitFieldToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Bits; - this.bitFieldToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.bitFieldToolStripButton.Name = "bitFieldToolStripButton"; - this.bitFieldToolStripButton.Size = new System.Drawing.Size(23, 22); - this.bitFieldToolStripButton.ToolTipText = "Bit Field"; - this.bitFieldToolStripButton.Value = typeof(ReClassNET.Nodes.BitFieldNode); - this.bitFieldToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator18 - // - this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(6, 25); - // - // floatToolStripButton - // - this.floatToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.floatToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Float; - this.floatToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.floatToolStripButton.Name = "floatToolStripButton"; - this.floatToolStripButton.Size = new System.Drawing.Size(23, 22); - this.floatToolStripButton.ToolTipText = "Float"; - this.floatToolStripButton.Value = typeof(ReClassNET.Nodes.FloatNode); - this.floatToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // doubleToolStripButton - // - this.doubleToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.doubleToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Double; - this.doubleToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.doubleToolStripButton.Name = "doubleToolStripButton"; - this.doubleToolStripButton.Size = new System.Drawing.Size(23, 22); - this.doubleToolStripButton.ToolTipText = "Double"; - this.doubleToolStripButton.Value = typeof(ReClassNET.Nodes.DoubleNode); - this.doubleToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(6, 25); - // - // vec4ToolStripButton - // - this.vec4ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec4ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_4; - this.vec4ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec4ToolStripButton.Name = "vec4ToolStripButton"; - this.vec4ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec4ToolStripButton.ToolTipText = "Vector4"; - this.vec4ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector4Node); - this.vec4ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vec3ToolStripButton - // - this.vec3ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec3ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_3; - this.vec3ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec3ToolStripButton.Name = "vec3ToolStripButton"; - this.vec3ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec3ToolStripButton.ToolTipText = "Vector3"; - this.vec3ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector3Node); - this.vec3ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vec2ToolStripButton - // - this.vec2ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vec2ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Vector_2; - this.vec2ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vec2ToolStripButton.Name = "vec2ToolStripButton"; - this.vec2ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vec2ToolStripButton.ToolTipText = "Vector2"; - this.vec2ToolStripButton.Value = typeof(ReClassNET.Nodes.Vector2Node); - this.vec2ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat44ToolStripButton - // - this.mat44ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat44ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_4x4; - this.mat44ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat44ToolStripButton.Name = "mat44ToolStripButton"; - this.mat44ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat44ToolStripButton.ToolTipText = "4x4 Matrix"; - this.mat44ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix4x4Node); - this.mat44ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat34ToolStripButton - // - this.mat34ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat34ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x4; - this.mat34ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat34ToolStripButton.Name = "mat34ToolStripButton"; - this.mat34ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat34ToolStripButton.ToolTipText = "3x4 Matrix"; - this.mat34ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x4Node); - this.mat34ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // mat33ToolStripButton - // - this.mat33ToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mat33ToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Matrix_3x3; - this.mat33ToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.mat33ToolStripButton.Name = "mat33ToolStripButton"; - this.mat33ToolStripButton.Size = new System.Drawing.Size(23, 22); - this.mat33ToolStripButton.ToolTipText = "3x3 Matrix"; - this.mat33ToolStripButton.Value = typeof(ReClassNET.Nodes.Matrix3x3Node); - this.mat33ToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25); - // - // utf8TextToolStripButton - // - this.utf8TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf8TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text; - this.utf8TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf8TextToolStripButton.Name = "utf8TextToolStripButton"; - this.utf8TextToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf8TextToolStripButton.ToolTipText = "UTF8 Text"; - this.utf8TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextNode); - this.utf8TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf8TextPtrToolStripButton - // - this.utf8TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf8TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Text_Pointer; - this.utf8TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf8TextPtrToolStripButton.Name = "utf8TextPtrToolStripButton"; - this.utf8TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf8TextPtrToolStripButton.ToolTipText = "Pointer to UTF8 text"; - this.utf8TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf8TextPtrNode); - this.utf8TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf16TextToolStripButton - // - this.utf16TextToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf16TextToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText; - this.utf16TextToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf16TextToolStripButton.Name = "utf16TextToolStripButton"; - this.utf16TextToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf16TextToolStripButton.ToolTipText = "UTF16 / Unicode Text"; - this.utf16TextToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextNode); - this.utf16TextToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // utf16TextPtrToolStripButton - // - this.utf16TextPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.utf16TextPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_UText_Pointer; - this.utf16TextPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.utf16TextPtrToolStripButton.Name = "utf16TextPtrToolStripButton"; - this.utf16TextPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.utf16TextPtrToolStripButton.ToolTipText = "Pointer to UTF16 / Unicode text"; - this.utf16TextPtrToolStripButton.Value = typeof(ReClassNET.Nodes.Utf16TextPtrNode); - this.utf16TextPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(6, 25); - // - // classInstanceToolStripButton6 - // - this.classInstanceToolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.classInstanceToolStripButton6.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Instance; - this.classInstanceToolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; - this.classInstanceToolStripButton6.Name = "classInstanceToolStripButton6"; - this.classInstanceToolStripButton6.Size = new System.Drawing.Size(23, 22); - this.classInstanceToolStripButton6.ToolTipText = "Class instance"; - this.classInstanceToolStripButton6.Value = typeof(ReClassNET.Nodes.ClassInstanceNode); - this.classInstanceToolStripButton6.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // classPtrToolStripButton - // - this.classPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.classPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Pointer; - this.classPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.classPtrToolStripButton.Name = "classPtrToolStripButton"; - this.classPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.classPtrToolStripButton.ToolTipText = "Pointer to class instance"; - this.classPtrToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrNode); - this.classPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(6, 25); - // - // arrayToolStripButton - // - this.arrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.arrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Array; - this.arrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.arrayToolStripButton.Name = "arrayToolStripButton"; - this.arrayToolStripButton.Size = new System.Drawing.Size(23, 22); - this.arrayToolStripButton.ToolTipText = "Array of Classes"; - this.arrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassInstanceArrayNode); - this.arrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // ptrArrayToolStripButton - // - this.ptrArrayToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ptrArrayToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Pointer_Array; - this.ptrArrayToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.ptrArrayToolStripButton.Name = "ptrArrayToolStripButton"; - this.ptrArrayToolStripButton.Size = new System.Drawing.Size(23, 22); - this.ptrArrayToolStripButton.ToolTipText = "Array of Pointers"; - this.ptrArrayToolStripButton.Value = typeof(ReClassNET.Nodes.ClassPtrArrayNode); - this.ptrArrayToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // vtableToolStripButton - // - this.vtableToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.vtableToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_VTable; - this.vtableToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.vtableToolStripButton.Name = "vtableToolStripButton"; - this.vtableToolStripButton.Size = new System.Drawing.Size(23, 22); - this.vtableToolStripButton.ToolTipText = "Pointer to VTable"; - this.vtableToolStripButton.Value = typeof(ReClassNET.Nodes.VTableNode); - this.vtableToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // fnPtrToolStripButton - // - this.fnPtrToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.fnPtrToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function_Pointer; - this.fnPtrToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.fnPtrToolStripButton.Name = "fnPtrToolStripButton"; - this.fnPtrToolStripButton.Size = new System.Drawing.Size(23, 22); - this.fnPtrToolStripButton.ToolTipText = "Pointer to a function"; - this.fnPtrToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionPtrNode); - this.fnPtrToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // fnTypeToolStripButton - // - this.fnTypeToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.fnTypeToolStripButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Function; - this.fnTypeToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.fnTypeToolStripButton.Name = "fnTypeToolStripButton"; - this.fnTypeToolStripButton.Size = new System.Drawing.Size(23, 22); - this.fnTypeToolStripButton.ToolTipText = "Function"; - this.fnTypeToolStripButton.Value = typeof(ReClassNET.Nodes.FunctionNode); - this.fnTypeToolStripButton.Click += new System.EventHandler(this.memoryTypeToolStripButton_Click); - // - // toolStripSeparator19 - // - this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(6, 25); + // nodeTypesToolStripSeparator + // + this.nodeTypesToolStripSeparator.Name = "nodeTypesToolStripSeparator"; + this.nodeTypesToolStripSeparator.Size = new System.Drawing.Size(6, 25); // // statusStrip // @@ -1299,47 +807,10 @@ private void InitializeComponent() private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem addXBytesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem insertXBytesToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private UI.TypeToolStripButton hex64ToolStripButton; - private UI.TypeToolStripButton hex32ToolStripButton; - private UI.TypeToolStripButton hex16ToolStripButton; - private UI.TypeToolStripButton hex8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; - private UI.TypeToolStripButton int64ToolStripButton; - private UI.TypeToolStripButton int32ToolStripButton; - private UI.TypeToolStripButton int16ToolStripButton; - private UI.TypeToolStripButton int8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; - private UI.TypeToolStripButton uint64ToolStripButton; - private UI.TypeToolStripButton uint32ToolStripButton; - private UI.TypeToolStripButton uint16ToolStripButton; - private UI.TypeToolStripButton uint8ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private UI.TypeToolStripButton floatToolStripButton; - private UI.TypeToolStripButton doubleToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; - private UI.TypeToolStripButton vec4ToolStripButton; - private UI.TypeToolStripButton vec3ToolStripButton; - private UI.TypeToolStripButton vec2ToolStripButton; - private UI.TypeToolStripButton mat44ToolStripButton; - private UI.TypeToolStripButton mat34ToolStripButton; - private UI.TypeToolStripButton mat33ToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private UI.TypeToolStripButton utf8TextToolStripButton; - private UI.TypeToolStripButton utf8TextPtrToolStripButton; - private UI.TypeToolStripButton utf16TextToolStripButton; - private UI.TypeToolStripButton utf16TextPtrToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private UI.TypeToolStripButton classInstanceToolStripButton6; - private UI.TypeToolStripButton classPtrToolStripButton; - private UI.TypeToolStripButton arrayToolStripButton; - private UI.TypeToolStripButton vtableToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; - private UI.TypeToolStripButton fnPtrToolStripButton; + private System.Windows.Forms.ToolStripSeparator nodeTypesToolStripSeparator; private UI.ClassNodeView classesView; private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem cleanUnusedClassesToolStripMenuItem; - private UI.TypeToolStripButton ptrArrayToolStripButton; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; private System.Windows.Forms.ToolStripMenuItem generateCppCodeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem generateCSharpCodeToolStripMenuItem; @@ -1347,14 +818,9 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; private System.Windows.Forms.ToolStripMenuItem loadSymbolToolStripMenuItem; private System.Windows.Forms.ToolStripButton openProjectToolStripButton; - private UI.TypeToolStripButton bitFieldToolStripButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator18; private System.Windows.Forms.ToolStripStatusLabel infoToolStripStatusLabel; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; private System.Windows.Forms.ToolStripMenuItem mergeWithProjectToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem detachToolStripMenuItem; - private UI.TypeToolStripButton boolToolStripButton; - private UI.TypeToolStripButton fnTypeToolStripButton; private System.Windows.Forms.ToolStripMenuItem memorySearcherToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem reattachToProcessToolStripMenuItem; private System.Windows.Forms.ToolStripSplitButton attachToProcessToolStripSplitButton; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 834f2737..4c4d78e9 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -76,6 +76,8 @@ protected override void OnLoad(EventArgs e) pluginManager.LoadAllPlugins(Path.Combine(Application.StartupPath, Constants.PluginsFolder), Program.Logger); + toolStrip.Items.AddRange(NodeTypesBuilder.CreateToolStripButtons(t => memoryViewControl.ReplaceSelectedNodesWithType(t)).ToArray()); + var createDefaultProject = true; if (Program.CommandLineArgs.FileName != null) @@ -415,6 +417,7 @@ private void attachToProcessToolStripSplitButton_DropDownOpening(object sender, Program.CoreFunctions.EnumerateProcesses() .OrderBy(p => p.Name).ThenBy(p => p.Id, IntPtrComparer.Instance) .Select(p => new ToolStripMenuItem($"[{p.Id}] {p.Name}", p.Icon, (sender2, e2) => AttachToProcess(p))) + .Cast() .ToArray() ); } @@ -449,16 +452,6 @@ private void insertXBytesToolStripMenuItem_Click(object sender, EventArgs e) AskAddOrInsertBytes("Insert Bytes", memoryViewControl.InsertBytes); } - private void memoryTypeToolStripButton_Click(object sender, EventArgs e) - { - if (!(sender is TypeToolStripButton item)) - { - return; - } - - memoryViewControl.ReplaceSelectedNodesWithType(item.Value); - } - #endregion private void MainForm_DragEnter(object sender, DragEventArgs e) @@ -598,15 +591,7 @@ internal void RegisterNodeType(Type type, string name, Image icon) Contract.Requires(name != null); Contract.Requires(icon != null); - var item = new TypeToolStripButton - { - Image = icon, - ToolTipText = name, - Value = type - }; - item.Click += memoryTypeToolStripButton_Click; - - toolStrip.Items.Add(item); + //TODO } /// Deregisters the node type. @@ -615,12 +600,7 @@ internal void DeregisterNodeType(Type type) { Contract.Requires(type != null); - var item = toolStrip.Items.OfType().FirstOrDefault(i => i.Value == type); - if (item != null) - { - item.Click -= memoryTypeToolStripButton_Click; - toolStrip.Items.Remove(item); - } + //TODO } /// Shows the code form with the given . From e556581d052c4f59fc001ae8d5bfcd70ce4e5de4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 5 Jan 2019 23:13:00 +0100 Subject: [PATCH 333/777] Added CreateInstanceFromType. --- ReClass.NET/DataExchange/ReClass/ReClass2007File.cs | 2 +- ReClass.NET/DataExchange/ReClass/ReClassFile.cs | 2 +- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs | 2 +- ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs | 2 +- ReClass.NET/Nodes/BaseContainerNode.cs | 3 ++- ReClass.NET/Nodes/BaseNode.cs | 5 +++++ ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 7 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs index b109cc93..58690987 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs @@ -136,7 +136,7 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode continue; } - var node = Activator.CreateInstance(nodeType) as BaseNode; + var node = BaseNode.CreateInstanceFromType(nodeType); if (node == null) { logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 1fb284cb..54ffd964 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -155,7 +155,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - var node = Activator.CreateInstance(nodeType) as BaseNode; + var node = BaseNode.CreateInstanceFromType(nodeType); if (node == null) { logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 86537abc..f44550fa 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -122,7 +122,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - var node = Activator.CreateInstance(nodeType) as BaseNode; + var node = BaseNode.CreateInstanceFromType(nodeType); if (node == null) { logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs index aee438cd..7eeb3e27 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs @@ -135,7 +135,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C continue; } - var node = Activator.CreateInstance(nodeType) as BaseNode; + var node = BaseNode.CreateInstanceFromType(nodeType); if (node == null) { logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index a22f7a35..97c5db4f 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -124,7 +124,8 @@ public virtual bool ReplaceChildNode(int index, Type nodeType, ref ListConstructor which sets a unique . protected BaseNode() { diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 11468ce2..ad114002 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -147,7 +147,7 @@ private static void GetNodeInfoFromType(Type nodeType, out string label, out Ima { Contract.Requires(nodeType != null); - var node = Activator.CreateInstance(nodeType) as BaseNode; + var node = BaseNode.CreateInstanceFromType(nodeType); if (node == null) { throw new InvalidOperationException($"'{nodeType}' is not a valid node type."); From 8b62ed999acc2517a3625034b1a519e523d5f783 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 5 Jan 2019 23:47:37 +0100 Subject: [PATCH 334/777] Fixed icon offset. Why was it 2? --- ReClass.NET/Nodes/BaseNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index b29793b9..ea521098 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -416,7 +416,7 @@ protected void DrawInvalidMemoryIndicator(ViewInfo view, int y) { if (!view.Memory.ContainsValidData) { - AddIcon(view, 2, y, Properties.Resources.B16x16_Error, -1, HotSpotType.None); + AddIcon(view, 0, y, Properties.Resources.B16x16_Error, -1, HotSpotType.None); } } } From a57742c8e9865b6625243548fbe00e052e8012c7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 5 Jan 2019 23:48:28 +0100 Subject: [PATCH 335/777] Removed unused comment. --- ReClass.NET/Nodes/ClassInstanceArrayNode.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs index e2f13241..8faf5657 100644 --- a/ReClass.NET/Nodes/ClassInstanceArrayNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceArrayNode.cs @@ -22,11 +22,6 @@ public override void Intialize() InnerNode.Intialize(); } - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "Array", HotSpotType.ChangeClassType); From d1b4b17c9723464b5f23c85e3d8d36ca1b29685c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 5 Jan 2019 23:50:02 +0100 Subject: [PATCH 336/777] Auto open node. --- ReClass.NET/Nodes/ClassNode.cs | 2 ++ ReClass.NET/Nodes/PointerNode.cs | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 4fa82b0b..0b9b4edc 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -55,6 +55,8 @@ internal ClassNode(bool notifyClassCreated) { Contract.Ensures(AddressFormula != null); + levelsOpen.DefaultValue = true; + Uuid = new NodeUuid(true); Address = DefaultAddress; diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 97609290..ee589540 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -13,6 +13,11 @@ public class PointerNode : BaseWrapperNode public override bool PerformCycleCheck => false; + public PointerNode() + { + levelsOpen.DefaultValue = true; + } + public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "Pointer"; From 3bc68bac4ccc86118023114ad411ed0045103ff2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 5 Jan 2019 23:50:56 +0100 Subject: [PATCH 337/777] Added PointerNode logic. --- ReClass.NET/UI/MemoryViewControl.cs | 19 +++++++++++++++++++ ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index e1a771bc..ea195cf8 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -401,6 +401,25 @@ protected override void OnMouseClick(MouseEventArgs e) break; } + else if (hotSpot.Type == HotSpotType.ChangeWrappedType) + { + if (hitObject is BaseWrapperNode wrapperNode) + { + var items = NodeTypesBuilder.CreateToolStripMenuItems(t => + { + var node = BaseNode.CreateInstanceFromType(t); + node.Intialize(); + if (wrapperNode.CanChangeInnerNodeTo(node)) + { + wrapperNode.ChangeInnerNode(node); + } + }, true); + + var menu = new ContextMenuStrip(); + menu.Items.AddRange(items.ToArray()); + menu.Show(this, e.Location); + } + } } catch (Exception ex) { diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index ad114002..78cf8b6e 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -25,7 +25,7 @@ static NodeTypesBuilder() defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode), typeof(ClassPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); } public static List RegisterPluginNodeGroup(Plugin plugin) From d180bb721408a9ee8bdd8dce1ebc1e3d16fcf7f2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 00:23:02 +0100 Subject: [PATCH 338/777] Show open/close only if a inner node is set. --- ReClass.NET/Nodes/PointerNode.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index ee589540..adf8b51e 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -43,7 +43,14 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x = AddOpenClose(view, x, y); + if (InnerNode != null) + { + x = AddOpenClose(view, x, y); + } + else + { + x += TextPadding; + } x = AddIcon(view, x, y, Icons.Pointer, -1, HotSpotType.None); var tx = x; From 82ead061d9b342bfe53f43fb3152906d716c9ba5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 01:28:39 +0100 Subject: [PATCH 339/777] Added BaseNode.IsWrapped. --- ReClass.NET/Nodes/BaseNode.cs | 17 ++++++++++------- ReClass.NET/Nodes/BaseNumericNode.cs | 7 +++++-- ReClass.NET/Nodes/BaseWrapperNode.cs | 2 ++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index ea521098..2298eed1 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -40,10 +40,13 @@ public abstract class BaseNode /// Gets or sets the parent node. public BaseContainerNode ParentNode { get; internal set; } - /// Gets or sets a value indicating whether this object is hidden. + /// Gets or sets a value indicating whether this node is wrapped into an other node. + public bool IsWrapped { get; internal set; } + + /// Gets or sets a value indicating whether this node is hidden. public bool IsHidden { get; set; } - /// Gets or sets a value indicating whether this object is selected. + /// Gets or sets a value indicating whether this node is selected. public bool IsSelected { get; set; } /// Size of the node in bytes. @@ -273,7 +276,7 @@ protected void AddSelection(ViewInfo view, int x, int y, int height) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (y > view.ClientArea.Bottom || y + height < 0) + if (y > view.ClientArea.Bottom || y + height < 0 || IsWrapped) { return; } @@ -286,7 +289,7 @@ protected void AddSelection(ViewInfo view, int x, int y, int height) } } - AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, -1, HotSpotType.Select); + AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); } /// Draws an icon and adds a if is not . @@ -310,7 +313,7 @@ protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotTy view.Context.DrawImage(icon, x + 2, y, Icons.Dimensions, Icons.Dimensions); - if (id != -1) + if (id != HotSpot.NoneId) { AddHotSpot(view, new Rectangle(x, y, Icons.Dimensions, Icons.Dimensions), string.Empty, id, type); } @@ -344,7 +347,7 @@ protected void AddTypeDrop(ViewInfo view, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (view.MultipleNodesSelected || (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0)) + if (view.MultipleNodesSelected || y > view.ClientArea.Bottom || y + Icons.Dimensions < 0 || IsWrapped) { return; } @@ -363,7 +366,7 @@ protected void AddDelete(ViewInfo view, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0) + if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0 || IsWrapped) { return; } diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index b389614a..52ec99f0 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -22,7 +22,7 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, Contract.Requires(type != null); Contract.Requires(value != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -39,7 +39,10 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, 0, value) + view.Font.Width; if (alternativeValue != null) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 59887487..443d00ce 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -26,6 +26,8 @@ public void ChangeInnerNode(BaseNode node) { InnerNode = node; + node.IsWrapped = true; + InnerNodeChanged?.Invoke(this); ParentNode?.ChildHasChanged(this); From 05a57b858ff3baf7f3a0c4d21c56252316329996 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 15:05:05 +0100 Subject: [PATCH 340/777] Use IsWrapped. --- ReClass.NET/Nodes/BaseMatrixNode.cs | 14 ++++++++++---- ReClass.NET/Nodes/BitFieldNode.cs | 7 +++++-- ReClass.NET/Nodes/BoolNode.cs | 7 +++++-- ReClass.NET/Nodes/FunctionNode.cs | 7 +++++-- ReClass.NET/Nodes/PointerNode.cs | 7 +++++-- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index fd31d0ef..05bd0d33 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -22,7 +22,7 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr Contract.Requires(type != null); Contract.Requires(drawValues != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -43,7 +43,10 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + } x = AddOpenClose(view, x, y); x += view.Font.Width; @@ -68,7 +71,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect Contract.Requires(type != null); Contract.Requires(drawValues != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -86,7 +89,10 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + } x = AddOpenClose(view, x, y); if (levelsOpen[view.Level]) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 78149528..150c3b24 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -93,7 +93,7 @@ private string ConvertValueToBitString(MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -110,7 +110,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bits") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddOpenClose(view, x, y) + view.Font.Width; diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 0807671a..119b4bda 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -15,7 +15,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -31,7 +31,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bool") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; var value = view.Memory.ReadUInt8(Offset); diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 6f0ea23b..9c87b2e7 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -34,7 +34,7 @@ public override Size Draw(ViewInfo view, int x, int y) { Contract.Requires(view != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -54,7 +54,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Function") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddOpenClose(view, x, y) + view.Font.Width; diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index adf8b51e..685ca322 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -31,7 +31,7 @@ public override bool CanChangeInnerNodeTo(BaseNode node) public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -57,7 +57,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } if (InnerNode == null) { x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "") + view.Font.Width; From 7501825455bf260700f71b1159abfc92b6d7422d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 15:18:27 +0100 Subject: [PATCH 341/777] Added TODO list. --- ReClass.NET.sln | 1 + TODO.txt | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 TODO.txt diff --git a/ReClass.NET.sln b/ReClass.NET.sln index fed7d3e0..469cd220 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -18,6 +18,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{19CF2B0F-2722-4108-8308-B628D91F7A1E}" ProjectSection(SolutionItems) = preProject README.md = README.md + TODO.txt = TODO.txt EndProjectSection EndProject Global diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 00000000..41d96023 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,4 @@ +BaseWrapperNode Import/Export +BaseWrapperNode CodeGenerator +Remove BaseReferenceNode +NodeTypesBuilder Plugin support \ No newline at end of file From a133f90a719e2df2582f307ba77e642e21403fab Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 15:19:26 +0100 Subject: [PATCH 342/777] Added todo. --- TODO.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO.txt b/TODO.txt index 41d96023..c8d1b37d 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,5 @@ BaseWrapperNode Import/Export BaseWrapperNode CodeGenerator Remove BaseReferenceNode -NodeTypesBuilder Plugin support \ No newline at end of file +NodeTypesBuilder Plugin support +Rebuild class cycle check with BaseWrapperNode \ No newline at end of file From 1a9e13bb1723fba9b1487b1ca3dc8184f54cb3a8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 6 Jan 2019 15:33:49 +0100 Subject: [PATCH 343/777] Use IsWrapped (2/2). --- ReClass.NET/Nodes/BaseArrayNode.cs | 9 ++++++--- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 7 +++++-- ReClass.NET/Nodes/BaseHexNode.cs | 6 +++--- ReClass.NET/Nodes/BaseMatrixNode.cs | 2 +- ReClass.NET/Nodes/BaseNumericNode.cs | 2 +- ReClass.NET/Nodes/BaseTextNode.cs | 11 ++++++----- ReClass.NET/Nodes/BaseTextPtrNode.cs | 9 ++++++--- ReClass.NET/Nodes/BitFieldNode.cs | 2 +- ReClass.NET/Nodes/BoolNode.cs | 2 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 9 ++++++--- ReClass.NET/Nodes/ClassPtrNode.cs | 9 ++++++--- ReClass.NET/Nodes/FunctionNode.cs | 2 +- ReClass.NET/Nodes/PointerNode.cs | 2 +- ReClass.NET/Nodes/VTableNode.cs | 9 ++++++--- 14 files changed, 50 insertions(+), 31 deletions(-) diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs index 4fd50ec4..d79a4298 100644 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ b/ReClass.NET/Nodes/BaseArrayNode.cs @@ -16,7 +16,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan Contract.Requires(view != null); Contract.Requires(type != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -34,7 +34,10 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + } x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); x = AddText(view, x, y, view.Settings.IndexColor, 0, Count.ToString()); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]"); @@ -73,7 +76,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index fab9cbd2..f1e1b8d7 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -28,7 +28,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) Contract.Requires(type != null); Contract.Requires(name != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -48,7 +48,10 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, name) + view.Font.Width; + } x = AddOpenClose(view, x, y) + view.Font.Width; diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index 5c93f446..c4d31853 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -30,7 +30,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) { Contract.Requires(view != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -93,7 +93,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } /// Updates the node from the given spot. Sets the value of the selected byte. @@ -103,7 +103,7 @@ public void Update(HotSpot spot, int maxId) { Contract.Requires(spot != null); - base.Update(spot); + Update(spot); if (spot.Id >= 0 && spot.Id < maxId) { diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 05bd0d33..f792e04c 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -112,7 +112,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index 52ec99f0..ee4de395 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -60,7 +60,7 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } } } diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 0e5f5f82..923d0ae1 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -4,7 +4,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -12,7 +11,6 @@ public abstract class BaseTextNode : BaseNode { public int Length { get; set; } - /// Size of the node in bytes. public override int MemorySize => Length * CharacterSize; /// The encoding of the string. @@ -31,7 +29,7 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) Contract.Requires(view != null); Contract.Requires(type != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -50,7 +48,10 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + } x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); x = AddText(view, x, y, view.Settings.IndexColor, 0, length.ToString()); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]") + view.Font.Width; @@ -69,7 +70,7 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 2e61bac9..b1641872 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -24,7 +24,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) Contract.Requires(view != null); Contract.Requires(type != null); - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -43,7 +43,10 @@ public Size DrawText(ViewInfo view, int x, int y, string type) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "= '"); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text); @@ -59,7 +62,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } } } diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 150c3b24..1e8e4057 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -157,7 +157,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 119b4bda..01a2e92e 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -50,7 +50,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - return IsHidden ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } /// Updates the node from the given spot and sets the value. diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index 99f4463c..d1779ac4 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -25,7 +25,7 @@ public override void Intialize() public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -44,7 +44,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Instance") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; @@ -74,7 +77,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs index b3a51e84..0099e13d 100644 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ b/ReClass.NET/Nodes/ClassPtrNode.cs @@ -31,7 +31,7 @@ public override void Intialize() public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -50,7 +50,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; @@ -89,7 +92,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 9c87b2e7..f1e35a97 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -96,7 +96,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 685ca322..cc87180b 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -102,7 +102,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } diff --git a/ReClass.NET/Nodes/VTableNode.cs b/ReClass.NET/Nodes/VTableNode.cs index 0615dcbb..14423e94 100644 --- a/ReClass.NET/Nodes/VTableNode.cs +++ b/ReClass.NET/Nodes/VTableNode.cs @@ -36,7 +36,7 @@ public override void ClearSelection() public override Size Draw(ViewInfo view, int x, int y) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); } @@ -55,7 +55,10 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.VTableColor, HotSpot.NoneId, $"VTable[{nodes.Count}]") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } x = AddComment(view, x, y); @@ -94,7 +97,7 @@ public override Size Draw(ViewInfo view, int x, int y) public override int CalculateDrawnHeight(ViewInfo view) { - if (IsHidden) + if (IsHidden && !IsWrapped) { return HiddenHeight; } From cd176f1fed071ce466c48ace857617a495a9a3b5 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 8 Jan 2019 09:01:03 -0500 Subject: [PATCH 344/777] Force unix core to link with all symbols or fail with warning --- NativeCore/Unix/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index e1c21204..3d3ecd69 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -11,7 +11,7 @@ CFLAGS = -Wall -fPIC -DRECLASSNET64=1 RESINC = LIBDIR = LIB = -lstdc++fs -LDFLAGS = -shared +LDFLAGS = -shared -Wl,--no-undefined INC_DEBUG = $(INC) CFLAGS_DEBUG = $(CFLAGS) -g From ed10c5f469526c90de3a01411756ef4625ad346f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 8 Jan 2019 17:28:55 +0100 Subject: [PATCH 345/777] Added IsEmptyNodeAllowed. --- ReClass.NET/Nodes/BaseWrapperNode.cs | 3 +++ ReClass.NET/Nodes/PointerNode.cs | 2 ++ ReClass.NET/UI/MemoryViewControl.cs | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 443d00ce..01f7831c 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -11,6 +11,9 @@ public abstract class BaseWrapperNode : BaseNode /// True to perform class cycle checks when changing the inner node. public abstract bool PerformCycleCheck { get; } + /// True if this wrapper supports an inexistent inner node. + public abstract bool IsEmptyNodeAllowed { get; } + /// /// Should be called before to test if the node can handle the inner node type. /// diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index cc87180b..24f5f442 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -11,6 +11,8 @@ public class PointerNode : BaseWrapperNode public override int MemorySize => IntPtr.Size; + public override bool IsEmptyNodeAllowed => true; + public override bool PerformCycleCheck => false; public PointerNode() diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index ea195cf8..bdd914ca 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -413,7 +413,7 @@ protected override void OnMouseClick(MouseEventArgs e) { wrapperNode.ChangeInnerNode(node); } - }, true); + }, wrapperNode.IsEmptyNodeAllowed); var menu = new ContextMenuStrip(); menu.Items.AddRange(items.ToArray()); From dd87da2b85bc6dd6edc9b96d595cedda649a817f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 8 Jan 2019 17:29:10 +0100 Subject: [PATCH 346/777] Added todo. --- TODO.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO.txt b/TODO.txt index c8d1b37d..99158c15 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,4 +2,5 @@ BaseWrapperNode Import/Export BaseWrapperNode CodeGenerator Remove BaseReferenceNode NodeTypesBuilder Plugin support -Rebuild class cycle check with BaseWrapperNode \ No newline at end of file +Rebuild class cycle check with BaseWrapperNode +Prevent double click on click hotspots \ No newline at end of file From ac71e0b6e8b0fca0916374335216b8946ccd7835 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 8 Jan 2019 13:07:34 -0500 Subject: [PATCH 347/777] Fixes native core missing symbols --- NativeCore/Unix/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index 3d3ecd69..1a99feff 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -10,7 +10,7 @@ INC = -I../Dependencies/distorm/include CFLAGS = -Wall -fPIC -DRECLASSNET64=1 RESINC = LIBDIR = -LIB = -lstdc++fs +LIB = -lstdc++fs -lstdc++ LDFLAGS = -shared -Wl,--no-undefined INC_DEBUG = $(INC) From 8d5643062d3ccf69ec11f89417b96ae789869da1 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 8 Jan 2019 13:20:56 -0500 Subject: [PATCH 348/777] Fix scroll bar minimum --- ReClass.NET/UI/MemoryViewControl.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 36ddbcbc..af9a97ef 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -59,12 +59,13 @@ public ClassNode ClassNode OnSelectionChanged(); classNode = value; - - VerticalScroll.Value = 0; + + VerticalScroll.Value = VerticalScroll.Minimum; if (classNode != null && Memory?.Process != null) { classNode.UpdateAddress(Memory.Process); } + Invalidate(); } } @@ -215,7 +216,7 @@ protected override void OnPaint(PaintEventArgs e) { VerticalScroll.Enabled = false; - VerticalScroll.Value = 0; + VerticalScroll.Value = VerticalScroll.Minimum; } if (drawnSize.Width > ClientSize.Width) @@ -229,7 +230,7 @@ protected override void OnPaint(PaintEventArgs e) { HorizontalScroll.Enabled = false; - HorizontalScroll.Value = 0; + HorizontalScroll.Value = HorizontalScroll.Minimum; } } catch (Exception) From 7a44b84d297b9e8d885e9694ed46e096241e62ae Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 8 Jan 2019 21:59:47 +0100 Subject: [PATCH 349/777] Added BaseWrapperArrayNode. --- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 156 ++++++++++++++++++++++ ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET/Nodes/BaseWrapperArrayNode.cs diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs new file mode 100644 index 00000000..94463fe5 --- /dev/null +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -0,0 +1,156 @@ +using System; +using System.Drawing; +using ReClassNET.Extensions; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class BaseWrapperArrayNode : BaseWrapperNode + { + public override int MemorySize => InnerNode.MemorySize * Count; + + public int CurrentIndex { get; set; } + public int Count { get; set; } = 1; + public bool IsReadOnly { get; protected set; } + + public override bool IsEmptyNodeAllowed => false; + + public override bool PerformCycleCheck => true; + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Array"; + icon = Properties.Resources.B16x16_Button_Array; + } + + public override void Intialize() + { + InnerNode = IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node(); + } + + public override bool CanChangeInnerNodeTo(BaseNode node) + { + return node != null; + } + + public override Size Draw(ViewInfo view, int x, int y) + { + if (IsHidden && !IsWrapped) + { + return DrawHidden(view, x, y); + } + + DrawInvalidMemoryIndicator(view, y); + + var origX = x; + + AddSelection(view, x, y, view.Font.Height); + + x = AddOpenClose(view, x, y); + x = AddIcon(view, x, y, Icons.Array, -1, HotSpotType.None); + + var tx = x; + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Array") + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + } + x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); + x = AddText(view, x, y, view.Settings.IndexColor, IsReadOnly ? HotSpot.NoneId : 0, Count.ToString()); + x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]"); + + x = AddIcon(view, x, y, Icons.LeftArrow, 2, HotSpotType.Click); + x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "("); + x = AddText(view, x, y, view.Settings.IndexColor, 1, CurrentIndex.ToString()); + x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, ")"); + x = AddIcon(view, x, y, Icons.RightArrow, 3, HotSpotType.Click) + view.Font.Width; + + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"") + view.Font.Width; + x = AddIcon(view, x + 2, y, Icons.Change, 4, HotSpotType.ChangeWrappedType); + + x += view.Font.Width; + x = AddComment(view, x, y); + + AddTypeDrop(view, y); + AddDelete(view, y); + + y += view.Font.Height; + + var size = new Size(x - origX, view.Font.Height); + + if (levelsOpen[view.Level]) + { + var v = view.Clone(); + v.Address = view.Address.Add(Offset) + InnerNode.MemorySize * CurrentIndex; + v.Memory = view.Memory.Clone(); + v.Memory.Offset += Offset.ToInt32() + InnerNode.MemorySize * CurrentIndex; + + var childSize = InnerNode.Draw(v, tx, y); + + size.Width = Math.Max(size.Width, childSize.Width + tx - origX); + size.Height += childSize.Height; + } + + return size; + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + if (IsHidden && !IsWrapped) + { + return HiddenHeight; + } + + var height = view.Font.Height; + if (levelsOpen[view.Level]) + { + height += InnerNode.CalculateDrawnHeight(view); + } + return height; + } + + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0 || spot.Id == 1) + { + if (int.TryParse(spot.Text, out var value)) + { + if (spot.Id == 0 && !IsReadOnly) + { + if (value != 0) + { + Count = value; + + ParentNode.ChildHasChanged(this); + } + } + else + { + if (value < Count) + { + CurrentIndex = value; + } + } + } + } + else if (spot.Id == 2) + { + if (CurrentIndex > 0) + { + --CurrentIndex; + } + } + else if (spot.Id == 3) + { + if (CurrentIndex < Count - 1) + { + ++CurrentIndex; + } + } + } + } +} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index aa23e3ea..da99ed32 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -242,6 +242,7 @@ + diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 78cf8b6e..431d856a 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -25,7 +25,7 @@ static NodeTypesBuilder() defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode), typeof(ClassPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(BaseWrapperArrayNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); } public static List RegisterPluginNodeGroup(Plugin plugin) From 312aadc3b9bebb510d0249377f8eefd3c54a36e2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 8 Jan 2019 22:02:43 +0100 Subject: [PATCH 350/777] Removed unused variable. --- ReClass.NET/Nodes/BaseArrayNode.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs index ebe38099..4fd50ec4 100644 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ b/ReClass.NET/Nodes/BaseArrayNode.cs @@ -24,7 +24,6 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan DrawInvalidMemoryIndicator(view, y); var origX = x; - var origY = y; AddSelection(view, x, y, view.Font.Height); @@ -57,7 +56,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchan y += view.Font.Height; - var size = new Size(x - origX, y - origY); + var size = new Size(x - origX, view.Font.Height); if (levelsOpen[view.Level]) { From 1dbc9c83dbf24dbc51cb60458ca0346ea0efb401 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 8 Jan 2019 22:03:03 +0100 Subject: [PATCH 351/777] Removed unused comment. --- ReClass.NET/Nodes/FunctionPtrNode.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ReClass.NET/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs index 1ab2f3c8..0740623a 100644 --- a/ReClass.NET/Nodes/FunctionPtrNode.cs +++ b/ReClass.NET/Nodes/FunctionPtrNode.cs @@ -5,11 +5,6 @@ namespace ReClassNET.Nodes { public class FunctionPtrNode : BaseFunctionPtrNode { - /// Draws this node. - /// The view information. - /// The x coordinate. - /// The y coordinate. - /// The pixel size the node occupies. public override Size Draw(ViewInfo view, int x, int y) { return Draw(view, x, y, "FunctionPtr", Name); From 015ce6bea88c3ea9bc49cca4f414f2bdfdd628fc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 10 Jan 2019 11:54:53 +0100 Subject: [PATCH 352/777] Added null check. --- ReClass.NET/Nodes/BaseWrapperNode.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 01f7831c..c8c0250b 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Nodes +using System; + +namespace ReClassNET.Nodes { public abstract class BaseWrapperNode : BaseNode { @@ -25,11 +27,19 @@ public abstract class BaseWrapperNode : BaseNode /// The new node. public void ChangeInnerNode(BaseNode node) { + if (node == null && !IsEmptyNodeAllowed) + { + throw new InvalidOperationException("An empty node is not allowed."); + } + if (InnerNode != node) { InnerNode = node; - node.IsWrapped = true; + if (node != null) + { + node.IsWrapped = true; + } InnerNodeChanged?.Invoke(this); From f5e09eaf1c7695768b8122eb6c081a4dbee741d4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 10 Jan 2019 14:26:59 +0100 Subject: [PATCH 353/777] Added ArrayNode. --- ReClass.NET/Nodes/ArrayNode.cs | 41 +++++++++++++++++++++++ ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 29 ++++------------ ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 4 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 ReClass.NET/Nodes/ArrayNode.cs diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs new file mode 100644 index 00000000..a3615794 --- /dev/null +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -0,0 +1,41 @@ +using System; +using System.Drawing; +using ReClassNET.Extensions; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class ArrayNode : BaseWrapperArrayNode + { + public ArrayNode() + { + IsReadOnly = false; + } + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Array"; + icon = Properties.Resources.B16x16_Button_Array; + } + + public override void Intialize() + { + InnerNode = IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node(); + } + + public override Size Draw(ViewInfo view, int x, int y) + { + return Draw(view, x, y, "Array"); + } + + protected override Size DrawChild(ViewInfo view, int x, int y) + { + var v = view.Clone(); + v.Address = view.Address.Add(Offset) + InnerNode.MemorySize * CurrentIndex; + v.Memory = view.Memory.Clone(); + v.Memory.Offset += Offset.ToInt32() + InnerNode.MemorySize * CurrentIndex; + + return InnerNode.Draw(v, x, y); + } + } +} diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 94463fe5..556766b9 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -1,11 +1,10 @@ using System; using System.Drawing; -using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes { - public class BaseWrapperArrayNode : BaseWrapperNode + public abstract class BaseWrapperArrayNode : BaseWrapperNode { public override int MemorySize => InnerNode.MemorySize * Count; @@ -17,23 +16,12 @@ public class BaseWrapperArrayNode : BaseWrapperNode public override bool PerformCycleCheck => true; - public override void GetUserInterfaceInfo(out string name, out Image icon) - { - name = "Array"; - icon = Properties.Resources.B16x16_Button_Array; - } - - public override void Intialize() - { - InnerNode = IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node(); - } - public override bool CanChangeInnerNodeTo(BaseNode node) { return node != null; } - public override Size Draw(ViewInfo view, int x, int y) + protected Size Draw(ViewInfo view, int x, int y, string type) { if (IsHidden && !IsWrapped) { @@ -52,7 +40,7 @@ public override Size Draw(ViewInfo view, int x, int y) var tx = x; x = AddAddressOffset(view, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Array") + view.Font.Width; + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; if (!IsWrapped) { x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); @@ -82,12 +70,7 @@ public override Size Draw(ViewInfo view, int x, int y) if (levelsOpen[view.Level]) { - var v = view.Clone(); - v.Address = view.Address.Add(Offset) + InnerNode.MemorySize * CurrentIndex; - v.Memory = view.Memory.Clone(); - v.Memory.Offset += Offset.ToInt32() + InnerNode.MemorySize * CurrentIndex; - - var childSize = InnerNode.Draw(v, tx, y); + var childSize = DrawChild(view, tx, y); size.Width = Math.Max(size.Width, childSize.Width + tx - origX); size.Height += childSize.Height; @@ -96,6 +79,8 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } + protected abstract Size DrawChild(ViewInfo view, int x, int y); + public override int CalculateDrawnHeight(ViewInfo view) { if (IsHidden && !IsWrapped) @@ -125,7 +110,7 @@ public override void Update(HotSpot spot) { Count = value; - ParentNode.ChildHasChanged(this); + ParentNode?.ChildHasChanged(this); } } else diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index da99ed32..8e6d17c0 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -241,6 +241,7 @@ + diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 431d856a..18304239 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -25,7 +25,7 @@ static NodeTypesBuilder() defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode), typeof(ClassPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(BaseWrapperArrayNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ArrayNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); } public static List RegisterPluginNodeGroup(Plugin plugin) From 3d6c963e868894949491c3532056da85bc1a8e4a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 10 Jan 2019 15:04:36 +0100 Subject: [PATCH 354/777] Fixed double click bug. --- ReClass.NET/UI/HotSpot.cs | 2 +- ReClass.NET/UI/MemoryViewControl.cs | 39 +++++++++++++++++++---------- TODO.txt | 3 +-- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ReClass.NET/UI/HotSpot.cs b/ReClass.NET/UI/HotSpot.cs index 1619efea..b386ec6d 100644 --- a/ReClass.NET/UI/HotSpot.cs +++ b/ReClass.NET/UI/HotSpot.cs @@ -13,10 +13,10 @@ public enum HotSpotType Select, Drop, Click, + DoubleClick, ChangeClassType, ChangeWrappedType, Delete, - RTTI, Address, Name, Comment diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index bdd914ca..c2ff692e 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -220,7 +220,7 @@ protected override void OnMouseClick(MouseEventArgs e) { Contract.Requires(e != null); - bool invalidate = false; + var invalidate = false; foreach (var hotSpot in hotSpots) { @@ -442,17 +442,28 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) { Contract.Requires(e != null); - base.OnMouseDoubleClick(e); - editBox.Visible = false; - BaseNode toggleNode = null; - var level = 0; + var invalidate = false; - foreach (var hotSpot in hotSpots.Where(h => h.Type == HotSpotType.Edit || h.Type == HotSpotType.Select)) + // Order the hotspots: 1. DoubleClick 2. Click 3. Edit 4. Select + var spots = hotSpots.Where(h => h.Type == HotSpotType.DoubleClick) + .Concat(hotSpots.Where(h => h.Type == HotSpotType.Click)) + .Concat(hotSpots.Where(h => h.Type == HotSpotType.Edit)) + .Concat(hotSpots.Where(h => h.Type == HotSpotType.Select)); + + foreach (var hotSpot in spots) { if (hotSpot.Rect.Contains(e.Location)) { + if (hotSpot.Type == HotSpotType.DoubleClick || hotSpot.Type == HotSpotType.Click) + { + hotSpot.Node.Update(hotSpot); + + invalidate = true; + + break; + } if (hotSpot.Type == HotSpotType.Edit) { editBox.BackColor = Program.Settings.SelectedColor; @@ -461,23 +472,25 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; - return; + break; } - if (hotSpot.Type == HotSpotType.Select) { - toggleNode = hotSpot.Node; - level = hotSpot.Level; + hotSpot.Node.ToggleLevelOpen(hotSpot.Level); + + invalidate = true; + + break; } } } - if (toggleNode != null) + if (invalidate) { - toggleNode.ToggleLevelOpen(level); - Invalidate(); } + + base.OnMouseDoubleClick(e); } private Point toolTipPosition; diff --git a/TODO.txt b/TODO.txt index 99158c15..c8d1b37d 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,5 +2,4 @@ BaseWrapperNode Import/Export BaseWrapperNode CodeGenerator Remove BaseReferenceNode NodeTypesBuilder Plugin support -Rebuild class cycle check with BaseWrapperNode -Prevent double click on click hotspots \ No newline at end of file +Rebuild class cycle check with BaseWrapperNode \ No newline at end of file From 83a4313a59d472ed97f0df6826fb3b92158efaa4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 10 Jan 2019 19:07:52 +0100 Subject: [PATCH 355/777] Simplified code. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index b005496c..b279d09d 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -6,7 +6,6 @@ using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; -using ReClassNET.Util; namespace ReClassNET.CodeGenerator { @@ -117,7 +116,7 @@ public string GenerateCode(IEnumerable classes, ILogger logger) return sb.ToString(); } - private IEnumerable OrderByInheritance(IEnumerable classes) + private static IEnumerable OrderByInheritance(IEnumerable classes) { Contract.Requires(classes != null); Contract.Requires(Contract.ForAll(classes, c => c != null)); @@ -128,7 +127,7 @@ private IEnumerable OrderByInheritance(IEnumerable classes return classes.SelectMany(c => YieldReversedHierarchy(c, alreadySeen)).Distinct(); } - private IEnumerable YieldReversedHierarchy(ClassNode node, HashSet alreadySeen) + private static IEnumerable YieldReversedHierarchy(ClassNode node, ISet alreadySeen) { Contract.Requires(node != null); Contract.Requires(alreadySeen != null); @@ -187,9 +186,9 @@ private IEnumerable YieldMemberDefinitions(IEnumerable YieldMemberDefinitions(IEnumerable YieldMemberDefinitions(IEnumerable Date: Thu, 10 Jan 2019 19:12:12 +0100 Subject: [PATCH 356/777] Implemented data save and load. --- .../ReClass/ReClassNetFile.Read.cs | 29 +++++++++++++++++-- .../ReClass/ReClassNetFile.Write.cs | 14 +++++++++ .../DataExchange/ReClass/ReClassNetFile.cs | 4 ++- TODO.txt | 1 - 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index f44550fa..2929fc5a 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -98,7 +98,6 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { Contract.Requires(elements != null); Contract.Requires(Contract.ForAll(elements, e => e != null)); - Contract.Requires(parent != null); Contract.Requires(logger != null); foreach (var element in elements) @@ -156,6 +155,20 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C referenceNode.ChangeInnerNode(innerClassNode); } + if (node is BaseWrapperNode wrapperNode) + { + var innerNode = ReadNodeElements(element.Elements(), null, logger).FirstOrDefault(); + + if (wrapperNode.CanChangeInnerNodeTo(innerNode)) + { + wrapperNode.ChangeInnerNode(innerNode); + } + else + { + logger.Log(LogLevel.Error, $"The node {innerNode} is not a valid child for {node}."); + } + } + switch (node) { case VTableNode vtableNode: @@ -166,7 +179,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C { Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, - IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false + IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false }) .ForEach(vtableNode.AddNode); break; @@ -177,6 +190,12 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C arrayNode.Count = count; break; } + case BaseWrapperArrayNode arrayNode: + { + TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); + arrayNode.Count = count; + break; + } case BaseTextNode textNode: { TryGetAttributeValue(element, XmlLengthAttribute, out var length, logger); @@ -243,7 +262,11 @@ public static Tuple, List> ReadNodes(Stream input, ReC { if (templateProject != null) { - classes.AddRange(project.Classes.Where(c => c != serialisationClassNode).Where(classNode => !templateProject.ContainsClass(classNode.Uuid))); + var collection = project.Classes + .Where(c => c != serialisationClassNode) + .Where(classNode => !templateProject.ContainsClass(classNode.Uuid)); + + classes.AddRange(collection); } nodes.AddRange(serialisationClassNode.Nodes); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 67eec212..cf94bbe8 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -4,6 +4,7 @@ using System.IO.Compression; using System.Linq; using System.Xml.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; @@ -98,6 +99,14 @@ private static IEnumerable CreateNodeElements(IEnumerable no element.SetAttributeValue(XmlReferenceAttribute, referenceNode.InnerNode.Uuid.ToBase64String()); } + if (node is BaseWrapperNode wrapperNode) + { + if (wrapperNode.InnerNode != null) + { + element.Add(CreateNodeElements(wrapperNode.InnerNode.Yield(), logger)); + } + } + switch (node) { case VTableNode vtableNode: @@ -115,6 +124,11 @@ private static IEnumerable CreateNodeElements(IEnumerable no element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); break; } + case BaseWrapperArrayNode arrayNode: + { + element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); + break; + } case BaseTextNode textNode: { element.SetAttributeValue(XmlLengthAttribute, textNode.Length); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index 3200764d..163e0f75 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -64,7 +64,9 @@ static ReClassNetFile() typeof(Vector2Node), typeof(Vector3Node), typeof(Vector4Node), - typeof(VTableNode) + typeof(VTableNode), + typeof(ArrayNode), + typeof(PointerNode) }.ToDictionary(t => t.Name, t => t); private static readonly Dictionary buildInTypeToStringMap = buildInStringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key); diff --git a/TODO.txt b/TODO.txt index c8d1b37d..d064bd91 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,3 @@ -BaseWrapperNode Import/Export BaseWrapperNode CodeGenerator Remove BaseReferenceNode NodeTypesBuilder Plugin support From 0cefd07626c2fa8391e55ed7c0a5e2bf9c6c0395 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 12 Jan 2019 23:56:32 +0100 Subject: [PATCH 357/777] Removed IsEmptyNodeAllowed. --- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 4 ++-- ReClass.NET/Nodes/BaseWrapperNode.cs | 7 ++----- ReClass.NET/Nodes/PointerNode.cs | 2 -- ReClass.NET/UI/MemoryViewControl.cs | 6 +++--- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 556766b9..61690654 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -12,12 +12,12 @@ public abstract class BaseWrapperArrayNode : BaseWrapperNode public int Count { get; set; } = 1; public bool IsReadOnly { get; protected set; } - public override bool IsEmptyNodeAllowed => false; - public override bool PerformCycleCheck => true; public override bool CanChangeInnerNodeTo(BaseNode node) { + // A null node (aka void) is not allowed for instances. + return node != null; } diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index c8c0250b..b95a8907 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -13,9 +13,6 @@ public abstract class BaseWrapperNode : BaseNode /// True to perform class cycle checks when changing the inner node. public abstract bool PerformCycleCheck { get; } - /// True if this wrapper supports an inexistent inner node. - public abstract bool IsEmptyNodeAllowed { get; } - /// /// Should be called before to test if the node can handle the inner node type. /// @@ -27,9 +24,9 @@ public abstract class BaseWrapperNode : BaseNode /// The new node. public void ChangeInnerNode(BaseNode node) { - if (node == null && !IsEmptyNodeAllowed) + if (!CanChangeInnerNodeTo(node)) { - throw new InvalidOperationException("An empty node is not allowed."); + throw new InvalidOperationException($"Can't change inner node to '{node?.GetType().ToString() ?? "null"}'"); } if (InnerNode != node) diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 24f5f442..cc87180b 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -11,8 +11,6 @@ public class PointerNode : BaseWrapperNode public override int MemorySize => IntPtr.Size; - public override bool IsEmptyNodeAllowed => true; - public override bool PerformCycleCheck => false; public PointerNode() diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index c2ff692e..7a8a028d 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -381,14 +381,14 @@ protected override void OnMouseClick(MouseEventArgs e) } } } - else if (hitObject is BaseReferenceNode refNode) + else if (hitObject is BaseWrapperNode refNode) { using (var csf = new ClassSelectionForm(project.Classes.OrderBy(c => c.Name))) { if (csf.ShowDialog() == DialogResult.OK) { var selectedClassNode = csf.SelectedClass; - if (selectedClassNode != null) + if (refNode.CanChangeInnerNodeTo(selectedClassNode)) { if (!refNode.PerformCycleCheck || IsCycleFree(refNode.ParentNode as ClassNode, selectedClassNode)) { @@ -413,7 +413,7 @@ protected override void OnMouseClick(MouseEventArgs e) { wrapperNode.ChangeInnerNode(node); } - }, wrapperNode.IsEmptyNodeAllowed); + }, wrapperNode.CanChangeInnerNodeTo(null)); var menu = new ContextMenuStrip(); menu.Items.AddRange(items.ToArray()); From ad40b69f87bda8b2d8e72b0fb1122fd09d23f87d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 13 Jan 2019 00:02:04 +0100 Subject: [PATCH 358/777] Removed obsolete types. --- ReClass.NET/UI/NodeTypesBuilder.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 18304239..143c72e9 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -24,8 +24,9 @@ static NodeTypesBuilder() defaultNodeTypeGroupList.Add(new[] { typeof(FloatNode), typeof(DoubleNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode), typeof(ClassPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ArrayNode), typeof(ClassInstanceArrayNode), typeof(ClassPtrArrayNode), typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ArrayNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(VTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); } public static List RegisterPluginNodeGroup(Plugin plugin) From 7c60824e90f450650eee8a868a7dfcd7e06fbf82 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 13 Jan 2019 11:57:59 +0100 Subject: [PATCH 359/777] Made methods static. --- ReClass.NET/DataExchange/ReClass/ReClass2007File.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs index 58690987..c7e00ae0 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs @@ -112,7 +112,7 @@ public void Load(string filePath, ILogger logger) } } - private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode parent, IReadOnlyDictionary classes, IReadOnlyDictionary vtables, ILogger logger) + private static IEnumerable ReadNodeRows(IEnumerable rows, ClassNode parent, IReadOnlyDictionary classes, IReadOnlyDictionary vtables, ILogger logger) { Contract.Requires(rows != null); Contract.Requires(parent != null); @@ -166,7 +166,7 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode } var innerClassNode = classes[reference]; - if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, classes.Values)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); @@ -184,7 +184,7 @@ private IEnumerable ReadNodeRows(IEnumerable rows, ClassNode } } - private IEnumerable Query(SQLiteConnection connection, string query) + private static IEnumerable Query(SQLiteConnection connection, string query) { Contract.Requires(connection != null); Contract.Requires(query != null); From 0bea038227c4a3c98fb215cfceba9ba2f7892a5b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 13 Jan 2019 21:54:44 +0100 Subject: [PATCH 360/777] Added new cycle check. --- ReClass.NET/Forms/MainForm.cs | 2 - ReClass.NET/Nodes/ClassUtil.cs | 85 ++++++++++++++---- ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/Util/DirectedGraph.cs | 139 ++++++++++++++++++++++++++++++ 4 files changed, 210 insertions(+), 17 deletions(-) create mode 100644 ReClass.NET/Util/DirectedGraph.cs diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 4c4d78e9..98672565 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -571,8 +571,6 @@ public void SetProject(ReClassNetProject newProject) currentProject = newProject; - ClassUtil.Classes = currentProject.Classes; - ClassNode.ClassCreated += currentProject.AddClass; classesView.Project = currentProject; diff --git a/ReClass.NET/Nodes/ClassUtil.cs b/ReClass.NET/Nodes/ClassUtil.cs index 17f82666..74e1a6c8 100644 --- a/ReClass.NET/Nodes/ClassUtil.cs +++ b/ReClass.NET/Nodes/ClassUtil.cs @@ -8,21 +8,6 @@ namespace ReClassNET.Nodes { public class ClassUtil { - internal static IEnumerable Classes; - - public static bool IsCycleFree(ClassNode parent, ClassNode check) - { - Contract.Requires(parent != null); - Contract.Requires(check != null); - - if (Classes == null) - { - return true; - } - - return IsCycleFree(parent, check, Classes); - } - public static bool IsCycleFree(ClassNode parent, ClassNode check, IEnumerable classes) { Contract.Requires(parent != null); @@ -71,5 +56,75 @@ private static bool IsCycleFree(ClassNode root, HashSet seen, IEnumer return true; } + + /// + /// Tests if the class to check can be inserted into the parent class without creating a cycle. + /// + /// The class into which + /// The class which should get inserted. + /// An enumeration of all available classes. + /// True if a cycle is detected, false otherwise. + public static bool IsCyclicIfClassIsAccessibleFromParent(ClassNode parent, ClassNode classToCheck, IEnumerable classes) + { + Contract.Requires(parent != null); + Contract.Requires(classToCheck != null); + Contract.Requires(classes != null); + Contract.Requires(Contract.ForAll(classes, c => c != null)); + + var graph = new DirectedGraph(); + graph.AddVertices(classes); + + graph.AddEdge(parent, classToCheck); + + foreach (var c in graph.Vertices) + { + foreach (var wrapperNode in c.Nodes.OfType()) + { + if (TryResolveWrappedClassNode(wrapperNode, out var classNode)) + { + graph.AddEdge(c, classNode); + } + } + } + + return graph.ContainsCycle(); + } + + /// + /// Walks the inner nodes of chained s until a is found or + /// the property of an inner node is false. + /// + /// + /// + /// True if the wrapper chain ends in a , false otherwise. + private static bool TryResolveWrappedClassNode(BaseWrapperNode node, out ClassNode classNode) + { + Contract.Requires(node != null); + + classNode = null; + + while (true) + { + if (!node.PerformCycleCheck) + { + return false; + } + + if (node.InnerNode is BaseWrapperNode innerWrapperNode) + { + node = innerWrapperNode; + } + else if (node.InnerNode is ClassNode wrappedClassNode) + { + classNode = wrappedClassNode; + + return true; + } + else + { + return false; + } + } + } } } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 8e6d17c0..ee544d15 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -360,6 +360,7 @@ + Form diff --git a/ReClass.NET/Util/DirectedGraph.cs b/ReClass.NET/Util/DirectedGraph.cs new file mode 100644 index 00000000..9e07ab9a --- /dev/null +++ b/ReClass.NET/Util/DirectedGraph.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ReClassNET.Util +{ + public class DirectedGraph + { + private readonly IDictionary> adjacencyList = new Dictionary>(); + + /// + /// Gets an enumeration of all vertices in the graph. + /// + public IEnumerable Vertices => adjacencyList.Keys; + + /// + /// Adds the vertex to the graph. + /// + /// + /// + public bool AddVertex(T vertex) + { + if (adjacencyList.ContainsKey(vertex)) + { + return false; + } + + adjacencyList.Add(vertex, new HashSet()); + + return true; + } + + /// + /// Adds the vertices to the graph. + /// + /// + public void AddVertices(IEnumerable vertices) + { + foreach (var vertex in vertices) + { + AddVertex(vertex); + } + } + + /// + /// Tests if the graph contains the given vertex. + /// + /// + /// + public bool HasVertex(T vertex) + { + return adjacencyList.ContainsKey(vertex); + } + + /// + /// Adds an edge between both vertices to the graph. + /// + /// + /// + /// True if a new edge was added, false otherwise. + public bool AddEdge(T from, T to) + { + if (!HasVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) + { + throw new ArgumentException("Vertex does not exist in graph."); + } + + return edges.Add(to); + } + + /// + /// Tests if the graph contains an edge between both vertices. + /// + /// + /// + /// + public bool HasEdge(T from, T to) + { + if (!HasVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) + { + throw new ArgumentException("Vertex does not exist in graph."); + } + + return edges.Contains(to); + } + + /// + /// Gets all neighbours of the given vertex. + /// + /// The vertex to check. + /// An enumeration of all neighbours of the given vertex. + public IEnumerable GetNeighbours(T vertex) + { + if (!adjacencyList.TryGetValue(vertex, out var edges)) + { + throw new ArgumentException("Vertex does not exist in graph."); + } + + return edges; + } + + /// + /// Tests with a depth first search if the graph contains a cycle. + /// + /// True if a cycle exists, false otherwise. + public bool ContainsCycle() + { + var visited = new HashSet(); + var recursionStack = new HashSet(); + + bool IsCyclic(T source) + { + if (visited.Add(source)) + { + recursionStack.Add(source); + + foreach (var adjacent in GetNeighbours(source)) + { + if (!visited.Contains(adjacent) && IsCyclic(adjacent)) + { + return true; + } + + if (recursionStack.Contains(adjacent)) + { + return true; + } + } + } + + recursionStack.Remove(source); + + return false; + } + + return adjacencyList.Keys.Any(IsCyclic); + } + } +} From c8dc89b4a3c8fd0b0ae4680646a1cb5aac66d14f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 15:50:13 +0100 Subject: [PATCH 361/777] Added legacy nodes. --- .../ReClass/Legacy/ClassArrayNode.cs | 34 +++++++++++ .../ReClass/Legacy/ClassInstanceArrayNode.cs | 21 +++++++ .../ReClass/Legacy/ClassPointerArrayNode.cs | 23 +++++++ .../ReClass/Legacy/ClassPointerNode.cs | 45 ++++++++++++++ .../DataExchange/ReClass/Legacy/CustomNode.cs | 61 +++++++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 ReClass.NET/DataExchange/ReClass/Legacy/ClassArrayNode.cs create mode 100644 ReClass.NET/DataExchange/ReClass/Legacy/ClassInstanceArrayNode.cs create mode 100644 ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerArrayNode.cs create mode 100644 ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs create mode 100644 ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassArrayNode.cs new file mode 100644 index 00000000..039fcc5e --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassArrayNode.cs @@ -0,0 +1,34 @@ +using System; +using System.Drawing; +using ReClassNET.Nodes; +using ReClassNET.UI; + +namespace ReClassNET.DataExchange.ReClass.Legacy +{ + public abstract class ClassArrayNode : BaseWrapperNode + { + public override int MemorySize => throw new NotImplementedException(); + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new NotImplementedException(); + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + throw new NotImplementedException(); + } + + public override Size Draw(ViewInfo view, int x, int y) + { + throw new NotImplementedException(); + } + + public override bool CanChangeInnerNodeTo(BaseNode node) + { + return node is ClassNode; + } + + public abstract BaseNode GetEquivalentNode(int count, ClassNode classNode); + } +} diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassInstanceArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassInstanceArrayNode.cs new file mode 100644 index 00000000..c2444745 --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassInstanceArrayNode.cs @@ -0,0 +1,21 @@ +using ReClassNET.Nodes; + +namespace ReClassNET.DataExchange.ReClass.Legacy +{ + public class ClassInstanceArrayNode : ClassArrayNode + { + public override bool PerformCycleCheck => true; + + public override BaseNode GetEquivalentNode(int count, ClassNode classNode) + { + var arrayNode = new ArrayNode { Count = count }; + + var classInstanceNode = new ClassInstanceNode(); + classInstanceNode.CanChangeInnerNodeTo(classNode); + + arrayNode.ChangeInnerNode(classInstanceNode); + + return arrayNode; + } + } +} diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerArrayNode.cs new file mode 100644 index 00000000..cd36f7c8 --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerArrayNode.cs @@ -0,0 +1,23 @@ +using ReClassNET.Nodes; + +namespace ReClassNET.DataExchange.ReClass.Legacy +{ + public class ClassPointerArrayNode : ClassArrayNode + { + public override bool PerformCycleCheck => false; + + public override BaseNode GetEquivalentNode(int count, ClassNode classNode) + { + var classInstanceNode = new ClassInstanceNode(); + classInstanceNode.CanChangeInnerNodeTo(classNode); + + var pointerNode = new PointerNode(); + pointerNode.ChangeInnerNode(classInstanceNode); + + var arrayNode = new ArrayNode { Count = count }; + arrayNode.ChangeInnerNode(pointerNode); + + return arrayNode; + } + } +} diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs new file mode 100644 index 00000000..0c21771d --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs @@ -0,0 +1,45 @@ +using System; +using System.Drawing; +using ReClassNET.Nodes; +using ReClassNET.UI; + +namespace ReClassNET.DataExchange.ReClass.Legacy +{ + public class ClassPointerNode : BaseWrapperNode + { + public override int MemorySize => throw new NotImplementedException(); + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new NotImplementedException(); + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + throw new NotImplementedException(); + } + + public override Size Draw(ViewInfo view, int x, int y) + { + throw new NotImplementedException(); + } + + public override bool PerformCycleCheck => false; + + public override bool CanChangeInnerNodeTo(BaseNode node) + { + return node is ClassNode; + } + + public BaseNode GetEquivalentNode(ClassNode classNode) + { + var classInstanceNode = new ClassInstanceNode(); + classInstanceNode.ChangeInnerNode(classNode); + + var pointerNode = new PointerNode(); + pointerNode.ChangeInnerNode(classInstanceNode); + + return pointerNode; + } + } +} diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs new file mode 100644 index 00000000..96238c84 --- /dev/null +++ b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using ReClassNET.Nodes; +using ReClassNET.UI; + +namespace ReClassNET.DataExchange.ReClass.Legacy +{ + public class CustomNode : BaseNode + { + public override int MemorySize => throw new NotImplementedException(); + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + throw new NotImplementedException(); + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + throw new NotImplementedException(); + } + + public override Size Draw(ViewInfo view, int x, int y) + { + throw new NotImplementedException(); + } + + public IEnumerable GetEquivalentNodes(int size) + { + while (size != 0) + { + BaseNode paddingNode; +#if RECLASSNET64 + if (size >= 8) + { + paddingNode = new Hex64Node(); + } + else +#endif + if (size >= 4) + { + paddingNode = new Hex32Node(); + } + else if (size >= 2) + { + paddingNode = new Hex16Node(); + } + else + { + paddingNode = new Hex8Node(); + } + + paddingNode.Comment = Comment; + + size -= paddingNode.MemorySize; + + yield return paddingNode; + } + } + } +} From e99b7f5a017574fd4fca2866342354cc4d7ddb1d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 15:53:44 +0100 Subject: [PATCH 362/777] Implemented data exchange for wrapped nodes. --- .../DataExchange/ReClass/ReClass2007File.cs | 18 +- .../DataExchange/ReClass/ReClassFile.cs | 109 ++++------ .../ReClass/ReClassNetFile.Constants.cs | 2 + .../ReClass/ReClassNetFile.Read.cs | 190 +++++++++--------- .../ReClass/ReClassNetFile.Write.cs | 137 +++++++------ .../DataExchange/ReClass/ReClassNetFile.cs | 9 +- .../DataExchange/ReClass/ReClassQtFile.cs | 68 ++++--- 7 files changed, 262 insertions(+), 271 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs index c7e00ae0..65a3a3aa 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs @@ -4,10 +4,10 @@ using System.Data.SQLite; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.DataExchange.ReClass.Legacy; using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; -using ReClassNET.Util; namespace ReClassNET.DataExchange.ReClass { @@ -25,7 +25,7 @@ public class ReClass2007File : IReClassImport typeof(Hex32Node), typeof(Hex16Node), typeof(Hex8Node), - typeof(ClassPtrNode), + typeof(ClassPointerNode), typeof(Int32Node), typeof(Int16Node), typeof(Int8Node), @@ -147,7 +147,8 @@ private static IEnumerable ReadNodeRows(IEnumerable rows, Cla node.Name = Convert.ToString(row["variable"]); node.Comment = Convert.ToString(row["comment"]); - if (node is BaseReferenceNode referenceNode) + // ClassInstanceNode, ClassPointerNode + if (node is BaseWrapperNode wrapperNode) { var reference = Convert.ToInt32(row["ref"]); if (!classes.ContainsKey(reference)) @@ -166,14 +167,21 @@ private static IEnumerable ReadNodeRows(IEnumerable rows, Cla } var innerClassNode = classes[reference]; - if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, classes.Values)) + if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, classes.Values)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); continue; } - referenceNode.ChangeInnerNode(innerClassNode); + if (node is ClassPointerNode classPointerNode) + { + node = classPointerNode.GetEquivalentNode(innerClassNode); + } + else + { + wrapperNode.ChangeInnerNode(innerClassNode); + } } if (node is BaseTextNode textNode) { diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 54ffd964..1501d9c0 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using System.Drawing; using System.Linq; using System.Xml.Linq; +using ReClassNET.DataExchange.ReClass.Legacy; using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; -using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.DataExchange.ReClass { @@ -168,51 +166,37 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.IsHidden = element.Attribute("bHidden")?.Value.Equals("1") ?? false; // Convert the Custom node into normal hex nodes. - if (node is CustomNode) + if (node is CustomNode customNode) { int.TryParse(element.Attribute("Size")?.Value, out var size); - while (size != 0) + foreach (var paddingNode in customNode.GetEquivalentNodes(size)) { - BaseNode paddingNode; -#if RECLASSNET64 - if (size >= 8) - { - paddingNode = new Hex64Node(); - } - else -#endif - if (size >= 4) - { - paddingNode = new Hex32Node(); - } - else if (size >= 2) - { - paddingNode = new Hex16Node(); - } - else - { - paddingNode = new Hex8Node(); - } - - paddingNode.Comment = node.Comment; - - size -= paddingNode.MemorySize; - yield return paddingNode; } continue; } - if (node is BaseReferenceNode referenceNode) + // ClassInstanceNode, ClassPointerNode, ClassInstanceArrayNode, ClassPointerArrayNode + if (node is BaseWrapperNode baseWrapperNode) { string reference; - if (referenceNode is ClassInstanceArrayNode) + int arrayCount = 0; + if (node is ClassArrayNode) // ClassInstanceArrayNode, ClassPointerArrayNode { reference = element.Element("Array")?.Attribute("Name")?.Value; + + if (node is ClassInstanceArrayNode) + { + TryGetAttributeValue(element, "Total", out arrayCount, logger); + } + else + { + TryGetAttributeValue(element, "Count", out arrayCount, logger); + } } - else + else // ClassInstanceNode, ClassPointerNode { reference = element.Attribute("Pointer")?.Value ?? element.Attribute("Instance")?.Value; } @@ -226,14 +210,26 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } var innerClassNode = classes[reference]; - if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + if (baseWrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); continue; } - referenceNode.ChangeInnerNode(innerClassNode); + // ClassPointerNode, ClassInstanceArrayNode and ClassPointerArrayNode need to be converted to supported nodes. + if (node is ClassArrayNode classArrayNode) // ClassInstanceArrayNode, ClassPointerArrayNode + { + node = classArrayNode.GetEquivalentNode(arrayCount, innerClassNode); + } + else if (node is ClassPointerNode classPointerNode) // ClassPointerNode + { + node = classPointerNode.GetEquivalentNode(innerClassNode); + } + else // ClassInstanceNode, ClassPointerNode + { + baseWrapperNode.ChangeInnerNode(innerClassNode); + } } switch (node) @@ -249,18 +245,6 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C }) .ForEach(vtableNode.AddNode); break; - case ClassInstanceArrayNode classInstanceArrayNode: - { - TryGetAttributeValue(element, "Total", out var count, logger); - classInstanceArrayNode.Count = count; - break; - } - case ClassPtrArrayNode classPtrArrayNode: - { - TryGetAttributeValue(element, "Size", out var count, logger); - classPtrArrayNode.Count = count / IntPtr.Size; - break; - } case BaseTextNode textNode: { TryGetAttributeValue(element, "Size", out var length, logger); @@ -290,30 +274,9 @@ private static void TryGetAttributeValue(XElement element, string attribute, out } } - /// Dummy node to represent the ReClass Custom node. - private class CustomNode : BaseNode - { - public override int MemorySize => throw new NotImplementedException(); - - public override void GetUserInterfaceInfo(out string name, out Image icon) - { - throw new NotImplementedException(); - } - - public override int CalculateDrawnHeight(ViewInfo view) - { - throw new NotImplementedException(); - } - - public override Size Draw(ViewInfo view, int x, int y) - { - throw new NotImplementedException(); - } - } - #region ReClass 2011 / ReClass 2013 - private static readonly Type[] typeMap2013 = new Type[] + private static readonly Type[] typeMap2013 = { null, typeof(ClassInstanceNode), @@ -322,7 +285,7 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(Hex32Node), typeof(Hex16Node), typeof(Hex8Node), - typeof(ClassPtrNode), + typeof(ClassPointerNode), typeof(Int32Node), typeof(Int16Node), typeof(Int8Node), @@ -345,14 +308,14 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(Int64Node), typeof(DoubleNode), typeof(Utf16TextNode), - typeof(ClassPtrArrayNode) + typeof(ClassPointerArrayNode) }; #endregion #region ReClass 2015 / ReClass 2016 - private static readonly Type[] typeMap2016 = new Type[] + private static readonly Type[] typeMap2016 = { null, typeof(ClassInstanceNode), @@ -362,7 +325,7 @@ public override Size Draw(ViewInfo view, int x, int y) typeof(Hex64Node), typeof(Hex16Node), typeof(Hex8Node), - typeof(ClassPtrNode), + typeof(ClassPointerNode), typeof(Int64Node), typeof(Int32Node), typeof(Int16Node), diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs index 82ff9e8e..01b6bff0 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs @@ -6,7 +6,9 @@ public partial class ReClassNetFile public const string FileExtension = ".rcnet"; public const string FileExtensionId = "rcnetfile"; + private const string CurrentVersion = "2"; private const string Version1 = "1"; + private const string Version2 = "2"; private const string DataFileName = "Data.xml"; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 2929fc5a..b66cb4e2 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -8,7 +8,6 @@ using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; -using ReClassNET.Util; namespace ReClassNET.DataExchange.ReClass { @@ -43,7 +42,11 @@ public void Load(Stream input, ILogger logger) return; } - //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + if (version != CurrentVersion) + { + logger.Log(LogLevel.Warning, $"Version mismatch ({version} vs {CurrentVersion})."); + } var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; if (platform != Constants.Platform) { @@ -102,38 +105,49 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C foreach (var element in elements) { - var converter = CustomNodeConvert.GetReadConverter(element); - if (converter != null) - { - if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out var customNode)) - { - yield return customNode; - } + yield return ReadNodeElement(element, parent, logger); + } + } - continue; - } + private BaseNode ReadNodeElement(XElement element, ClassNode parent, ILogger logger) + { + Contract.Requires(element != null); + Contract.Requires(logger != null); - if (!buildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType)) + var converter = CustomNodeConvert.GetReadConverter(element); + if (converter != null) + { + if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out var customNode)) { - logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(XmlTypeAttribute)?.Value}"); - logger.Log(LogLevel.Warning, element.ToString()); - - continue; + return customNode; } + } - var node = BaseNode.CreateInstanceFromType(nodeType); - if (node == null) - { - logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); + if (!buildInStringToTypeMap.TryGetValue(element.Attribute(XmlTypeAttribute)?.Value ?? string.Empty, out var nodeType)) + { + logger.Log(LogLevel.Error, $"Skipping node with unknown type: {element.Attribute(XmlTypeAttribute)?.Value}"); + logger.Log(LogLevel.Warning, element.ToString()); - continue; - } + return null; + } + + var node = BaseNode.CreateInstanceFromType(nodeType); + if (node == null) + { + logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); + + return null; + } - node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty; - node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty; - node.IsHidden = bool.TryParse(element.Attribute(XmlHiddenAttribute)?.Value, out var val) && val; + node.Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty; + node.Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty; + node.IsHidden = bool.TryParse(element.Attribute(XmlHiddenAttribute)?.Value, out var val) && val; - if (node is BaseReferenceNode referenceNode) + if (node is BaseWrapperNode wrapperNode) + { + BaseNode innerNode = null; + + if (node is ClassInstanceNode classInstanceNode) { var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); if (!project.ContainsClass(reference)) @@ -141,88 +155,82 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C logger.Log(LogLevel.Error, $"Skipping node with unknown reference: {reference}"); logger.Log(LogLevel.Warning, element.ToString()); - continue; + return null; } - var innerClassNode = project.GetClassByUuid(reference); - if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + // TODO Cycle check + innerNode = project.GetClassByUuid(reference); + } + else + { + var innerElement = element.Elements().FirstOrDefault(); + if (innerElement != null) { - logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); - - continue; + innerNode = ReadNodeElement(innerElement, null, logger); } + } - referenceNode.ChangeInnerNode(innerClassNode); + if (wrapperNode.CanChangeInnerNodeTo(innerNode)) + { + wrapperNode.ChangeInnerNode(innerNode); } + else + { + logger.Log(LogLevel.Error, $"The node {innerNode} is not a valid child for {node}."); + } + } - if (node is BaseWrapperNode wrapperNode) + switch (node) + { + case VTableNode vtableNode: { - var innerNode = ReadNodeElements(element.Elements(), null, logger).FirstOrDefault(); + var nodes = element + .Elements(XmlMethodElement) + .Select(e => new VMethodNode + { + Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, + Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, + IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false + }); - if (wrapperNode.CanChangeInnerNodeTo(innerNode)) + foreach (var vmethodNode in nodes) { - wrapperNode.ChangeInnerNode(innerNode); - } - else - { - logger.Log(LogLevel.Error, $"The node {innerNode} is not a valid child for {node}."); + vtableNode.AddNode(vmethodNode); } + break; } - - switch (node) + case BaseWrapperArrayNode arrayNode: { - case VTableNode vtableNode: - { - element - .Elements(XmlMethodElement) - .Select(e => new VMethodNode - { - Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, - Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, - IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false - }) - .ForEach(vtableNode.AddNode); - break; - } - case BaseArrayNode arrayNode: - { - TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); - arrayNode.Count = count; - break; - } - case BaseWrapperArrayNode arrayNode: - { - TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); - arrayNode.Count = count; - break; - } - case BaseTextNode textNode: - { - TryGetAttributeValue(element, XmlLengthAttribute, out var length, logger); - textNode.Length = length; - break; - } - case BitFieldNode bitFieldNode: - { - TryGetAttributeValue(element, XmlBitsAttribute, out var bits, logger); - bitFieldNode.Bits = bits; - break; - } - case FunctionNode functionNode: - { - functionNode.Signature = element.Attribute(XmlSignatureAttribute)?.Value ?? string.Empty; + TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); + arrayNode.Count = count; + break; + } + case BaseTextNode textNode: + { + TryGetAttributeValue(element, XmlLengthAttribute, out var length, logger); + textNode.Length = length; + break; + } + case BitFieldNode bitFieldNode: + { + TryGetAttributeValue(element, XmlBitsAttribute, out var bits, logger); + bitFieldNode.Bits = bits; + break; + } + case FunctionNode functionNode: + { + functionNode.Signature = element.Attribute(XmlSignatureAttribute)?.Value ?? string.Empty; - var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); - if (project.ContainsClass(reference)) - { - functionNode.BelongsToClass = project.GetClassByUuid(reference); - } - break; + var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); + if (project.ContainsClass(reference)) + { + functionNode.BelongsToClass = project.GetClassByUuid(reference); } + break; } - - yield return node; } + + return node; } private static void TryGetAttributeValue(XElement element, string attribute, out int val, ILogger logger) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index cf94bbe8..46f859e9 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -4,7 +4,6 @@ using System.IO.Compression; using System.Linq; using System.Xml.Linq; -using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; @@ -32,7 +31,7 @@ public void Save(Stream output, ILogger logger) new XComment($"Website: {Constants.HomepageUrl}"), new XElement( XmlRootElement, - new XAttribute(XmlVersionAttribute, Version1), + new XAttribute(XmlVersionAttribute, Version2), new XAttribute(XmlPlatformAttribute, Constants.Platform), new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)), new XElement(XmlCustomDataElement, project.CustomData.Select(kv => new XElement(kv.Key, kv.Value))) @@ -70,86 +69,86 @@ private static IEnumerable CreateNodeElements(IEnumerable no foreach (var node in nodes) { - var converter = CustomNodeConvert.GetWriteConverter(node); - if (converter != null) - { - yield return converter.CreateElementFromNode(node, logger); + yield return CreateNodeElement(node, logger); + } + } - continue; - } + private static XElement CreateNodeElement(BaseNode node, ILogger logger) + { + Contract.Requires(node != null); + Contract.Requires(logger != null); - if (!buildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString)) - { - logger.Log(LogLevel.Error, $"Skipping node with unknown type: {node.Name}"); - logger.Log(LogLevel.Warning, node.GetType().ToString()); + var converter = CustomNodeConvert.GetWriteConverter(node); + if (converter != null) + { + return converter.CreateElementFromNode(node, logger); + } - continue; - } + if (!buildInTypeToStringMap.TryGetValue(node.GetType(), out var typeString)) + { + logger.Log(LogLevel.Error, $"Skipping node with unknown type: {node.Name}"); + logger.Log(LogLevel.Warning, node.GetType().ToString()); - var element = new XElement( - XmlNodeElement, - new XAttribute(XmlNameAttribute, node.Name ?? string.Empty), - new XAttribute(XmlCommentAttribute, node.Comment ?? string.Empty), - new XAttribute(XmlHiddenAttribute, node.IsHidden.ToString()), - new XAttribute(XmlTypeAttribute, typeString) - ); + return null; + } + + var element = new XElement( + XmlNodeElement, + new XAttribute(XmlNameAttribute, node.Name ?? string.Empty), + new XAttribute(XmlCommentAttribute, node.Comment ?? string.Empty), + new XAttribute(XmlHiddenAttribute, node.IsHidden.ToString()), + new XAttribute(XmlTypeAttribute, typeString) + ); - if (node is BaseReferenceNode referenceNode) + if (node is BaseWrapperNode wrapperNode) + { + if (node is ClassInstanceNode classInstanceNode) { - element.SetAttributeValue(XmlReferenceAttribute, referenceNode.InnerNode.Uuid.ToBase64String()); + element.SetAttributeValue(XmlReferenceAttribute, ((ClassNode)classInstanceNode.InnerNode).Uuid.ToBase64String()); } - - if (node is BaseWrapperNode wrapperNode) + else if (wrapperNode.InnerNode != null) { - if (wrapperNode.InnerNode != null) - { - element.Add(CreateNodeElements(wrapperNode.InnerNode.Yield(), logger)); - } + element.Add(CreateNodeElement(wrapperNode.InnerNode, logger)); } + } - switch (node) + switch (node) + { + case VTableNode vtableNode: { - case VTableNode vtableNode: - { - element.Add(vtableNode.Nodes.Select(n => new XElement( - XmlMethodElement, - new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), - new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty), - new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) - ))); - break; - } - case BaseArrayNode arrayNode: - { - element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); - break; - } - case BaseWrapperArrayNode arrayNode: - { - element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); - break; - } - case BaseTextNode textNode: - { - element.SetAttributeValue(XmlLengthAttribute, textNode.Length); - break; - } - case BitFieldNode bitFieldNode: - { - element.SetAttributeValue(XmlBitsAttribute, bitFieldNode.Bits); - break; - } - case FunctionNode functionNode: - { - var uuid = functionNode.BelongsToClass == null ? NodeUuid.Zero : functionNode.BelongsToClass.Uuid; - element.SetAttributeValue(XmlReferenceAttribute, uuid.ToBase64String()); - element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); - break; - } + element.Add(vtableNode.Nodes.Select(n => new XElement( + XmlMethodElement, + new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), + new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty), + new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) + ))); + break; + } + case BaseWrapperArrayNode arrayNode: + { + element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); + break; + } + case BaseTextNode textNode: + { + element.SetAttributeValue(XmlLengthAttribute, textNode.Length); + break; + } + case BitFieldNode bitFieldNode: + { + element.SetAttributeValue(XmlBitsAttribute, bitFieldNode.Bits); + break; + } + case FunctionNode functionNode: + { + var uuid = functionNode.BelongsToClass == null ? NodeUuid.Zero : functionNode.BelongsToClass.Uuid; + element.SetAttributeValue(XmlReferenceAttribute, uuid.ToBase64String()); + element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); + break; } - - yield return element; } + + return element; } public static void WriteNodes(Stream output, IEnumerable nodes, ILogger logger) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index 163e0f75..16ba06a9 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; +using ReClassNET.DataExchange.ReClass.Legacy; using ReClassNET.Nodes; namespace ReClassNET.DataExchange.ReClass @@ -26,16 +27,18 @@ static ReClassNetFile() buildInStringToTypeMap["UTF16TextPtrNode"] = typeof(Utf16TextPtrNode); buildInStringToTypeMap["UTF32TextNode"] = typeof(Utf32TextNode); buildInStringToTypeMap["UTF32TextPtrNode"] = typeof(Utf32TextPtrNode); + + // Legacy + buildInStringToTypeMap["ClassInstanceArrayNode"] = typeof(ClassInstanceArrayNode); + buildInStringToTypeMap["ClassPtrArrayNode"] = typeof(ClassPointerArrayNode); + buildInStringToTypeMap["ClassPtrNode"] = typeof(ClassPointerNode); } private static readonly Dictionary buildInStringToTypeMap = new[] { typeof(BoolNode), typeof(BitFieldNode), - typeof(ClassInstanceArrayNode), typeof(ClassInstanceNode), - typeof(ClassPtrArrayNode), - typeof(ClassPtrNode), typeof(DoubleNode), typeof(FloatNode), typeof(FunctionNode), diff --git a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs index 7eeb3e27..ef295ab1 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs @@ -3,18 +3,43 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Xml.Linq; +using ReClassNET.DataExchange.ReClass.Legacy; using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; -using ReClassNET.Util; namespace ReClassNET.DataExchange.ReClass { - class ReClassQtFile : IReClassImport + public class ReClassQtFile : IReClassImport { public const string FormatName = "ReClassQt File"; public const string FileExtension = ".reclassqt"; + private readonly Type[] typeMap = { + null, + null, + typeof(ClassPointerNode), + typeof(ClassInstanceNode), + typeof(Hex64Node), + typeof(Hex32Node), + typeof(Hex16Node), + typeof(Hex8Node), + typeof(Int64Node), + typeof(Int32Node), + typeof(Int16Node), + typeof(Int8Node), + typeof(UInt32Node), + null, + null, + typeof(UInt32Node), //bool + null, + typeof(FloatNode), + typeof(DoubleNode), + typeof(Vector4Node), + typeof(Vector3Node), + typeof(Vector2Node) + }; + private readonly ReClassNetProject project; public ReClassQtFile(ReClassNetProject project) @@ -83,31 +108,6 @@ private static string ParseAddressString(XElement element) return address; } - private readonly Type[] typeMap = { - null, - null, - typeof(ClassPtrNode), - typeof(ClassInstanceNode), - typeof(Hex64Node), - typeof(Hex32Node), - typeof(Hex16Node), - typeof(Hex8Node), - typeof(Int64Node), - typeof(Int32Node), - typeof(Int16Node), - typeof(Int8Node), - typeof(UInt32Node), - null, - null, - typeof(UInt32Node), //bool - null, - typeof(FloatNode), - typeof(DoubleNode), - typeof(Vector4Node), - typeof(Vector3Node), - typeof(Vector2Node) - }; - private IEnumerable ReadNodeElements(IEnumerable elements, ClassNode parent, IReadOnlyDictionary classes, ILogger logger) { Contract.Requires(elements != null); @@ -146,7 +146,8 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C node.Name = element.Attribute("Name")?.Value ?? string.Empty; node.Comment = element.Attribute("Comments")?.Value ?? string.Empty; - if (node is BaseReferenceNode referenceNode) + // ClassInstanceNode, ClassPointerNode + if (node is BaseWrapperNode wrapperNode) { var pointToClassId = element.Attribute("PointToClass")?.Value; if (pointToClassId == null || !classes.ContainsKey(pointToClassId)) @@ -158,14 +159,21 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } var innerClassNode = classes[pointToClassId]; - if (referenceNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); continue; } - referenceNode.ChangeInnerNode(innerClassNode); + if (node is ClassPointerNode classPointerNode) + { + node = classPointerNode.GetEquivalentNode(innerClassNode); + } + else // ClassInstanceNode + { + wrapperNode.ChangeInnerNode(innerClassNode); + } } yield return node; From 4455c5ce114c48bc5f9a79447ff34408cf414283 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 15:56:07 +0100 Subject: [PATCH 363/777] Added new todo. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs | 1 + ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs | 1 + TODO.txt | 9 +++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index b66cb4e2..c88cd8b9 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -117,6 +117,7 @@ private BaseNode ReadNodeElement(XElement element, ClassNode parent, ILogger log var converter = CustomNodeConvert.GetReadConverter(element); if (converter != null) { + // TODO 5 if (converter.TryCreateNodeFromElement(element, parent, project.Classes, logger, out var customNode)) { return customNode; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 46f859e9..077dc58e 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -81,6 +81,7 @@ private static XElement CreateNodeElement(BaseNode node, ILogger logger) var converter = CustomNodeConvert.GetWriteConverter(node); if (converter != null) { + // TODO 5 return converter.CreateElementFromNode(node, logger); } diff --git a/TODO.txt b/TODO.txt index d064bd91..42583fb6 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,5 @@ -BaseWrapperNode CodeGenerator -Remove BaseReferenceNode -NodeTypesBuilder Plugin support -Rebuild class cycle check with BaseWrapperNode \ No newline at end of file +1 BaseWrapperNode CodeGenerator +2 Remove BaseReferenceNode +3 NodeTypesBuilder Plugin support +4 Rebuild class cycle check with BaseWrapperNode +5 Custom data exchange needs access to the build in node handling for wrapped nodes \ No newline at end of file From e351b4a2e293ec41755b2ecebef769abe691827e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 15:56:42 +0100 Subject: [PATCH 364/777] Removed obsolete nodes. --- ReClass.NET/Nodes/BaseArrayNode.cs | 145 ------------------------- ReClass.NET/Nodes/ClassPtrArrayNode.cs | 50 --------- ReClass.NET/Nodes/ClassPtrNode.cs | 127 ---------------------- ReClass.NET/ReClass.NET.csproj | 9 +- 4 files changed, 5 insertions(+), 326 deletions(-) delete mode 100644 ReClass.NET/Nodes/BaseArrayNode.cs delete mode 100644 ReClass.NET/Nodes/ClassPtrArrayNode.cs delete mode 100644 ReClass.NET/Nodes/ClassPtrNode.cs diff --git a/ReClass.NET/Nodes/BaseArrayNode.cs b/ReClass.NET/Nodes/BaseArrayNode.cs deleted file mode 100644 index d79a4298..00000000 --- a/ReClass.NET/Nodes/BaseArrayNode.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Diagnostics.Contracts; -using System.Drawing; -using ReClassNET.UI; - -namespace ReClassNET.Nodes -{ - [ContractClass(typeof(BaseArrayNodeContract))] - public abstract class BaseArrayNode : BaseReferenceNode - { - public int CurrentIndex { get; set; } - public int Count { get; set; } = 1; - - protected Size Draw(ViewInfo view, int x, int y, string type, HotSpotType exchange) - { - Contract.Requires(view != null); - Contract.Requires(type != null); - - if (IsHidden && !IsWrapped) - { - return DrawHidden(view, x, y); - } - - DrawInvalidMemoryIndicator(view, y); - - var origX = x; - - AddSelection(view, x, y, view.Font.Height); - - x = AddOpenClose(view, x, y); - x = AddIcon(view, x, y, Icons.Array, -1, HotSpotType.None); - - var tx = x; - x = AddAddressOffset(view, x, y); - - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; - if (!IsWrapped) - { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); - } - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); - x = AddText(view, x, y, view.Settings.IndexColor, 0, Count.ToString()); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]"); - - x = AddIcon(view, x, y, Icons.LeftArrow, 2, HotSpotType.Click); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "("); - x = AddText(view, x, y, view.Settings.IndexColor, 1, CurrentIndex.ToString()); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, ")"); - x = AddIcon(view, x, y, Icons.RightArrow, 3, HotSpotType.Click) + view.Font.Width; - - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name} Size={MemorySize}>") + view.Font.Width; - x = AddIcon(view, x + 2, y, Icons.Change, 4, exchange); - - x += view.Font.Width; - x = AddComment(view, x, y); - - AddTypeDrop(view, y); - AddDelete(view, y); - - y += view.Font.Height; - - var size = new Size(x - origX, view.Font.Height); - - if (levelsOpen[view.Level]) - { - var childSize = DrawChild(view, tx, y); - - size.Width = Math.Max(size.Width, childSize.Width + tx - origX); - size.Height += childSize.Height; - } - - return size; - } - - protected abstract Size DrawChild(ViewInfo view, int x, int y); - - public override int CalculateDrawnHeight(ViewInfo view) - { - if (IsHidden && !IsWrapped) - { - return HiddenHeight; - } - - var height = view.Font.Height; - if (levelsOpen[view.Level]) - { - height += InnerNode.CalculateDrawnHeight(view); - } - return height; - } - - public override void Update(HotSpot spot) - { - base.Update(spot); - - if (spot.Id == 0 || spot.Id == 1) - { - if (int.TryParse(spot.Text, out var value)) - { - if (spot.Id == 0) - { - if (value != 0) - { - Count = value; - - ParentNode.ChildHasChanged(this); - } - } - else - { - if (value < Count) - { - CurrentIndex = value; - } - } - } - } - else if (spot.Id == 2) - { - if (CurrentIndex > 0) - { - --CurrentIndex; - } - } - else if (spot.Id == 3) - { - if (CurrentIndex < Count - 1) - { - ++CurrentIndex; - } - } - } - } - - [ContractClassFor(typeof(BaseArrayNode))] - internal abstract class BaseArrayNodeContract : BaseArrayNode - { - protected override Size DrawChild(ViewInfo view, int x, int y) - { - Contract.Requires(view != null); - - throw new NotImplementedException(); - } - } -} diff --git a/ReClass.NET/Nodes/ClassPtrArrayNode.cs b/ReClass.NET/Nodes/ClassPtrArrayNode.cs deleted file mode 100644 index ead92fc3..00000000 --- a/ReClass.NET/Nodes/ClassPtrArrayNode.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Drawing; -using ReClassNET.Memory; -using ReClassNET.UI; - -namespace ReClassNET.Nodes -{ - public class ClassPtrArrayNode : BaseArrayNode - { - private readonly MemoryBuffer memory = new MemoryBuffer(); - - public override int MemorySize => IntPtr.Size * Count; - - public override bool PerformCycleCheck => false; - - public override void GetUserInterfaceInfo(out string name, out Image icon) - { - name = "Class Pointer Array"; - icon = Properties.Resources.B16x16_Button_Pointer_Array; - } - - public override void Intialize() - { - var node = ClassNode.Create(); - node.Intialize(); - node.AddBytes(64); - InnerNode = node; - } - - public override Size Draw(ViewInfo view, int x, int y) - { - return Draw(view, x, y, "PtrArray", HotSpotType.ChangeClassType); - } - - protected override Size DrawChild(ViewInfo view, int x, int y) - { - var ptr = view.Memory.ReadIntPtr(Offset + IntPtr.Size * CurrentIndex); - - memory.Size = InnerNode.MemorySize; - memory.Process = view.Memory.Process; - memory.Update(ptr); - - var v = view.Clone(); - v.Address = ptr; - v.Memory = memory; - - return InnerNode.Draw(v, x, y); - } - } -} diff --git a/ReClass.NET/Nodes/ClassPtrNode.cs b/ReClass.NET/Nodes/ClassPtrNode.cs deleted file mode 100644 index 0099e13d..00000000 --- a/ReClass.NET/Nodes/ClassPtrNode.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Drawing; -using System.Globalization; -using ReClassNET.Extensions; -using ReClassNET.Memory; -using ReClassNET.UI; - -namespace ReClassNET.Nodes -{ - public class ClassPtrNode : BaseReferenceNode - { - private readonly MemoryBuffer memory = new MemoryBuffer(); - - public override int MemorySize => IntPtr.Size; - - public override bool PerformCycleCheck => false; - - public override void GetUserInterfaceInfo(out string name, out Image icon) - { - name = "Class Pointer"; - icon = Properties.Resources.B16x16_Button_Class_Pointer; - } - - public override void Intialize() - { - var node = ClassNode.Create(); - node.Intialize(); - node.AddBytes(64); - InnerNode = node; - } - - public override Size Draw(ViewInfo view, int x, int y) - { - if (IsHidden && !IsWrapped) - { - return DrawHidden(view, x, y); - } - - DrawInvalidMemoryIndicator(view, y); - - var origX = x; - var origY = y; - - AddSelection(view, x, y, view.Font.Height); - - x = AddOpenClose(view, x, y); - x = AddIcon(view, x, y, Icons.Pointer, -1, HotSpotType.None); - - var tx = x; - x = AddAddressOffset(view, x, y); - - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; - if (!IsWrapped) - { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; - - var ptr = view.Memory.ReadIntPtr(Offset); - - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, 0, "0x" + ptr.ToString(Constants.AddressHexFormat)) + view.Font.Width; - - x = AddComment(view, x, y); - - AddTypeDrop(view, y); - AddDelete(view, y); - - y += view.Font.Height; - - var size = new Size(x - origX, y - origY); - - if (levelsOpen[view.Level]) - { - memory.Size = InnerNode.MemorySize; - memory.Process = view.Memory.Process; - memory.Update(ptr); - - var v = view.Clone(); - v.Address = ptr; - v.Memory = memory; - - var innerSize = InnerNode.Draw(v, tx, y); - - size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); - size.Height += innerSize.Height; - } - - return size; - } - - public override int CalculateDrawnHeight(ViewInfo view) - { - if (IsHidden && !IsWrapped) - { - return HiddenHeight; - } - - var height = view.Font.Height; - if (levelsOpen[view.Level]) - { - height += InnerNode.CalculateDrawnHeight(view); - } - return height; - } - - public override void Update(HotSpot spot) - { - base.Update(spot); - - if (spot.Id == 0) - { - if (spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, null, out var val)) - { -#if RECLASSNET64 - var address = (IntPtr)val; -#else - var address = (IntPtr)unchecked((int)val); -#endif - - spot.Memory.Process.WriteRemoteMemory(spot.Address, address); - } - } - } - } -} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index ee544d15..01411442 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -156,6 +156,11 @@ + + + + + @@ -400,8 +405,6 @@ UserControl - - @@ -413,7 +416,6 @@ - @@ -425,7 +427,6 @@ - From 74f93a2b2fa7fd6c7ac2c310bf6b25844d497b23 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 15:57:14 +0100 Subject: [PATCH 365/777] Made ClassInstanceNode a BaseWrapperNode. --- ReClass.NET/Nodes/ClassInstanceNode.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index d1779ac4..b7502981 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -5,7 +5,7 @@ namespace ReClassNET.Nodes { - public class ClassInstanceNode : BaseReferenceNode + public class ClassInstanceNode : BaseWrapperNode { public override int MemorySize => InnerNode.MemorySize; @@ -23,6 +23,11 @@ public override void Intialize() InnerNode.Intialize(); } + public override bool CanChangeInnerNodeTo(BaseNode node) + { + return node is ClassNode; + } + public override Size Draw(ViewInfo view, int x, int y) { if (IsHidden && !IsWrapped) From 37917c0bdb5595a3f254adbfbc21540da555ac87 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 17:29:36 +0100 Subject: [PATCH 366/777] Removed old class cycle check. --- .../DataExchange/ReClass/ReClass2007File.cs | 2 +- .../DataExchange/ReClass/ReClassFile.cs | 2 +- .../DataExchange/ReClass/ReClassQtFile.cs | 2 +- ReClass.NET/Nodes/ClassUtil.cs | 50 ------------------- 4 files changed, 3 insertions(+), 53 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs index 65a3a3aa..a3e895a4 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs @@ -167,7 +167,7 @@ private static IEnumerable ReadNodeRows(IEnumerable rows, Cla } var innerClassNode = classes[reference]; - if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, classes.Values)) + if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCyclicIfClassIsAccessibleFromParent(parent, innerClassNode, classes.Values)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index 1501d9c0..6f293766 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -210,7 +210,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } var innerClassNode = classes[reference]; - if (baseWrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + if (baseWrapperNode.PerformCycleCheck && !ClassUtil.IsCyclicIfClassIsAccessibleFromParent(parent, innerClassNode, project.Classes)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs index ef295ab1..bae24c2d 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs @@ -159,7 +159,7 @@ private IEnumerable ReadNodeElements(IEnumerable elements, C } var innerClassNode = classes[pointToClassId]; - if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCycleFree(parent, innerClassNode, project.Classes)) + if (wrapperNode.PerformCycleCheck && !ClassUtil.IsCyclicIfClassIsAccessibleFromParent(parent, innerClassNode, project.Classes)) { logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); diff --git a/ReClass.NET/Nodes/ClassUtil.cs b/ReClass.NET/Nodes/ClassUtil.cs index 74e1a6c8..0e1507a7 100644 --- a/ReClass.NET/Nodes/ClassUtil.cs +++ b/ReClass.NET/Nodes/ClassUtil.cs @@ -1,62 +1,12 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; -using ReClassNET.Extensions; using ReClassNET.Util; namespace ReClassNET.Nodes { public class ClassUtil { - public static bool IsCycleFree(ClassNode parent, ClassNode check, IEnumerable classes) - { - Contract.Requires(parent != null); - Contract.Requires(check != null); - Contract.Requires(classes != null); - Contract.Requires(Contract.ForAll(classes, c => c != null)); - - var toCheck = new HashSet( - check.Yield() - .Traverse( - c => c.Nodes - .Where(n => n is ClassInstanceNode || n is ClassInstanceArrayNode) - .Select(n => ((BaseReferenceNode)n).InnerNode) - ) - ); - - return IsCycleFree(parent, toCheck, classes); - } - - private static bool IsCycleFree(ClassNode root, HashSet seen, IEnumerable classes) - { - Contract.Requires(root != null); - Contract.Requires(seen != null); - Contract.Requires(Contract.ForAll(seen, c => c != null)); - Contract.Requires(Contract.ForAll(classes, c => c != null)); - - if (!seen.Add(root)) - { - return false; - } - - var classNodes = classes as IList ?? classes.ToList(); - foreach (var cls in classNodes/*.Except(seen)*/) - { - if (cls.Nodes - .OfType() - .Where(n => n is ClassInstanceNode || n is ClassInstanceArrayNode) - .Any(n => n.InnerNode == root)) - { - if (!IsCycleFree(cls, seen, classNodes)) - { - return false; - } - } - } - - return true; - } - /// /// Tests if the class to check can be inserted into the parent class without creating a cycle. /// From 807661e6a8b633225a6931d76f0ef0556d3b7d15 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 17:31:55 +0100 Subject: [PATCH 367/777] Filter nulls. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 077dc58e..60ef6461 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -69,7 +69,11 @@ private static IEnumerable CreateNodeElements(IEnumerable no foreach (var node in nodes) { - yield return CreateNodeElement(node, logger); + var element = CreateNodeElement(node, logger); + if (element != null) + { + yield return element; + } } } From 8da3ab8f2f4ce049d1c148394344bebac9636d37 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 21:02:47 +0100 Subject: [PATCH 368/777] Switched BaseReferenceNode to BaseWrapperNode. --- ReClass.NET/Nodes/BaseWrapperNode.cs | 15 ++++++++++++++- ReClass.NET/ReClassNetProject.cs | 4 +++- ReClass.NET/UI/ClassNodeView.cs | 7 ++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index b95a8907..52aef001 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace ReClassNET.Nodes { @@ -43,5 +43,18 @@ public void ChangeInnerNode(BaseNode node) ParentNode?.ChildHasChanged(this); } } + + public BaseNode ResolveInnerNode() + { + if (InnerNode == null) + { + return null; + } + if (InnerNode is BaseWrapperNode baseWrapperNode) + { + return baseWrapperNode.ResolveInnerNode(); + } + return InnerNode; + } } } diff --git a/ReClass.NET/ReClassNetProject.cs b/ReClass.NET/ReClassNetProject.cs index 4c074d65..c1ead31f 100644 --- a/ReClass.NET/ReClassNetProject.cs +++ b/ReClass.NET/ReClassNetProject.cs @@ -82,7 +82,9 @@ private IEnumerable GetClassReferences(ClassNode node) { Contract.Requires(node != null); - return classes.Where(c => c != node).Where(c => c.Descendants().Any(n => (n as BaseReferenceNode)?.InnerNode == node)); + return classes + .Where(c => c != node) + .Where(c => c.Nodes.OfType().Any(w => w.ResolveInnerNode() == node)); } public void Remove(ClassNode node) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 622036c1..8be32f93 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -85,10 +85,11 @@ private void RebuildClassHierarchy(HashSet seen) } var distinctClasses = ClassNode.Nodes - .OfType() - .Select(r => r.InnerNode) + .OfType() + .Select(w => w.ResolveInnerNode()) + .OfType() .Distinct() - .ToList(); + .ToArray(); if (distinctClasses.SequenceEqualsEx(Nodes.Cast().Select(t => t.ClassNode))) { From a5e19cfcd97b632155313d527890bf2ddc992d1f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 21:09:35 +0100 Subject: [PATCH 369/777] Changed field to property. --- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 4 ++-- ReClass.NET/Nodes/BaseMatrixNode.cs | 8 ++++---- ReClass.NET/Nodes/BaseNode.cs | 14 +++++++------- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 4 ++-- ReClass.NET/Nodes/BitFieldNode.cs | 6 +++--- ReClass.NET/Nodes/ClassInstanceNode.cs | 4 ++-- ReClass.NET/Nodes/ClassNode.cs | 6 +++--- ReClass.NET/Nodes/FunctionNode.cs | 4 ++-- ReClass.NET/Nodes/PointerNode.cs | 6 +++--- ReClass.NET/Nodes/VTableNode.cs | 4 ++-- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index f1e1b8d7..95ce6b70 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -78,7 +78,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) var size = new Size(x - origX, view.Font.Height); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var ptr = view.Memory.ReadIntPtr(Offset); @@ -101,7 +101,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += instructions.Count * view.Font.Height; } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index f792e04c..36331af7 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -11,7 +11,7 @@ public abstract class BaseMatrixNode : BaseNode protected BaseMatrixNode() { - levelsOpen.DefaultValue = true; + LevelsOpen.DefaultValue = true; } protected delegate void DrawMatrixValues(int x, ref int maxX, ref int y); @@ -56,7 +56,7 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr AddTypeDrop(view, y); AddDelete(view, y); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { drawValues(tx, ref x, ref y); } @@ -95,7 +95,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect } x = AddOpenClose(view, x, y); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { drawValues(ref x, ref y); } @@ -118,7 +118,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += CalculateValuesHeight(view); } diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 2298eed1..b6a0f751 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -55,7 +55,7 @@ public abstract class BaseNode public event NodeEventHandler NameChanged; public event NodeEventHandler CommentChanged; - protected readonly GrowingList levelsOpen = new GrowingList(false); + protected GrowingList LevelsOpen { get; } = new GrowingList(false); [ContractInvariantMethod] private void ObjectInvariants() @@ -63,7 +63,7 @@ private void ObjectInvariants() Contract.Invariant(name != null); Contract.Invariant(comment != null); Contract.Invariant(Offset.ToInt32() >= 0); - Contract.Invariant(levelsOpen != null); + Contract.Invariant(LevelsOpen != null); } public static BaseNode CreateInstanceFromType(Type nodeType) @@ -80,7 +80,7 @@ protected BaseNode() Name = $"N{nodeIndex++:X08}"; Comment = string.Empty; - levelsOpen[0] = true; + LevelsOpen[0] = true; } public abstract void GetUserInterfaceInfo(out string name, out Image icon); @@ -166,7 +166,7 @@ public virtual void Update(HotSpot spot) /// The level to toggle. internal void ToggleLevelOpen(int level) { - levelsOpen[level] = !levelsOpen[level]; + LevelsOpen[level] = !LevelsOpen[level]; } /// Sets the specific level. @@ -174,7 +174,7 @@ internal void ToggleLevelOpen(int level) /// True to open. internal void SetLevelOpen(int level, bool open) { - levelsOpen[level] = open; + LevelsOpen[level] = open; } /// Adds a the user can interact with. @@ -336,7 +336,7 @@ protected int AddOpenClose(ViewInfo view, int x, int y) return x + Icons.Dimensions; } - return AddIcon(view, x, y, levelsOpen[view.Level] ? Icons.OpenCloseOpen : Icons.OpenCloseClosed, 0, HotSpotType.OpenClose); + return AddIcon(view, x, y, LevelsOpen[view.Level] ? Icons.OpenCloseOpen : Icons.OpenCloseClosed, 0, HotSpotType.OpenClose); } /// Draws a type drop icon if the node is selected. diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 61690654..ce1d1809 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -68,7 +68,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type) var size = new Size(x - origX, view.Font.Height); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var childSize = DrawChild(view, tx, y); @@ -89,7 +89,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += InnerNode.CalculateDrawnHeight(view); } diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 1e8e4057..61f9585b 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -48,7 +48,7 @@ public BitFieldNode() { Bits = IntPtr.Size * 8; - levelsOpen.DefaultValue = true; + LevelsOpen.DefaultValue = true; } public override void GetUserInterfaceInfo(out string name, out Image icon) @@ -133,7 +133,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddTypeDrop(view, y); AddDelete(view, y); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { y += view.Font.Height; @@ -163,7 +163,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += view.Font.Height + 2; } diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index b7502981..75911212 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -65,7 +65,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, y - origY); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var v = view.Clone(); v.Address = view.Address.Add(Offset); @@ -88,7 +88,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += InnerNode.CalculateDrawnHeight(view); } diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 0b9b4edc..1ee5a5ea 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -55,7 +55,7 @@ internal ClassNode(bool notifyClassCreated) { Contract.Ensures(AddressFormula != null); - levelsOpen.DefaultValue = true; + LevelsOpen.DefaultValue = true; Uuid = new NodeUuid(true); @@ -117,7 +117,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, y - origY); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var childOffset = tx - origX; @@ -171,7 +171,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var nv = view.Clone(); nv.Level++; diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index f1e35a97..79488f59 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -71,7 +71,7 @@ public override Size Draw(ViewInfo view, int x, int y) var ptr = view.Address.Add(Offset); DisassembleRemoteCode(view.Memory, ptr); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { y += view.Font.Height; x = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; @@ -102,7 +102,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += instructions.Count * view.Font.Height; } diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index cc87180b..e87e37a5 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -15,7 +15,7 @@ public class PointerNode : BaseWrapperNode public PointerNode() { - levelsOpen.DefaultValue = true; + LevelsOpen.DefaultValue = true; } public override void GetUserInterfaceInfo(out string name, out Image icon) @@ -81,7 +81,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, y - origY); - if (levelsOpen[view.Level] && InnerNode != null) + if (LevelsOpen[view.Level] && InnerNode != null) { memory.Size = InnerNode.MemorySize; memory.Process = view.Memory.Process; @@ -108,7 +108,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level] && InnerNode != null) + if (LevelsOpen[view.Level] && InnerNode != null) { height += InnerNode.CalculateDrawnHeight(view); } diff --git a/ReClass.NET/Nodes/VTableNode.cs b/ReClass.NET/Nodes/VTableNode.cs index 14423e94..2dbacc68 100644 --- a/ReClass.NET/Nodes/VTableNode.cs +++ b/ReClass.NET/Nodes/VTableNode.cs @@ -69,7 +69,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, y - origY); - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { var ptr = view.Memory.ReadIntPtr(Offset); @@ -103,7 +103,7 @@ public override int CalculateDrawnHeight(ViewInfo view) } var height = view.Font.Height; - if (levelsOpen[view.Level]) + if (LevelsOpen[view.Level]) { height += nodes.Sum(n => n.CalculateDrawnHeight(view)); } From 9064bfdc34e8516741f64f3fdfef00b39768bbfd Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 21:29:17 +0100 Subject: [PATCH 370/777] Changed method name. --- ReClass.NET/Nodes/BaseWrapperNode.cs | 8 ++++++-- ReClass.NET/ReClassNetProject.cs | 2 +- ReClass.NET/UI/ClassNodeView.cs | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 52aef001..46e6da53 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -44,7 +44,11 @@ public void ChangeInnerNode(BaseNode node) } } - public BaseNode ResolveInnerNode() + /// + /// Resolve the most inner node of a chain. + /// + /// The most inner node or null. + public BaseNode ResolveMostInnerNode() { if (InnerNode == null) { @@ -52,7 +56,7 @@ public BaseNode ResolveInnerNode() } if (InnerNode is BaseWrapperNode baseWrapperNode) { - return baseWrapperNode.ResolveInnerNode(); + return baseWrapperNode.ResolveMostInnerNode(); } return InnerNode; } diff --git a/ReClass.NET/ReClassNetProject.cs b/ReClass.NET/ReClassNetProject.cs index c1ead31f..246aa712 100644 --- a/ReClass.NET/ReClassNetProject.cs +++ b/ReClass.NET/ReClassNetProject.cs @@ -84,7 +84,7 @@ private IEnumerable GetClassReferences(ClassNode node) return classes .Where(c => c != node) - .Where(c => c.Nodes.OfType().Any(w => w.ResolveInnerNode() == node)); + .Where(c => c.Nodes.OfType().Any(w => w.ResolveMostInnerNode() == node)); } public void Remove(ClassNode node) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 8be32f93..488f2ef5 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -86,7 +86,7 @@ private void RebuildClassHierarchy(HashSet seen) var distinctClasses = ClassNode.Nodes .OfType() - .Select(w => w.ResolveInnerNode()) + .Select(w => w.ResolveMostInnerNode()) .OfType() .Distinct() .ToArray(); From 76888015e9e0e5e53ad024bc6332d61731bb644f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 14 Jan 2019 22:56:06 +0100 Subject: [PATCH 371/777] Updated packages. --- ReClass.NET/ReClass.NET.csproj | 10 ---------- ReClass.NET/packages.config | 4 ---- 2 files changed, 14 deletions(-) delete mode 100644 ReClass.NET/packages.config diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 01411442..d529c656 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -122,9 +122,6 @@ - - ..\packages\System.Data.SQLite.Core.1.0.106.0\lib\net46\System.Data.SQLite.dll - @@ -564,7 +561,6 @@ Resources.Designer.cs - SettingsSingleFileGenerator Settings.Designer.cs @@ -970,12 +966,6 @@ powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" date +"%Y/%m/%d %H:%M:%S" > $(ProjectDir)/Resources/BuildDate.txt - - - Missing file: "{0}". - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index fb0c1454..3281ce04 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -171,6 +171,12 @@ + + Form + + + EnumSelectionForm.cs + Form @@ -496,6 +502,9 @@ AboutForm.cs + + EnumSelectionForm.cs + NamedAddressesForm.cs From efdf3729f7c74256b9be0888515711a6f39da514 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Mar 2019 11:46:27 +0100 Subject: [PATCH 489/777] Use unmanaged and Enum constraints. --- ReClass.NET/Memory/MemoryBuffer.cs | 4 ++-- ReClass.NET/Memory/RemoteProcess.cs | 4 ++-- ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/UI/EnumComboBox.cs | 8 ++++---- ReClass.NET/UI/EnumDescriptionDisplay.cs | 3 +-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index 2910a478..b2dfa895 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -157,14 +157,14 @@ public void ReadBytes(int offset, byte[] buffer) Array.Copy(data, offset, buffer, 0, buffer.Length); } - public T ReadObject(IntPtr offset) where T : struct + public T ReadObject(IntPtr offset) where T : unmanaged { Contract.Requires(offset.ToInt32() >= 0); return ReadObject(offset.ToInt32()); } - public T ReadObject(int offset) where T : struct + public T ReadObject(int offset) where T : unmanaged { Contract.Requires(offset >= 0); diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index c3f4d938..b26275ec 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -206,7 +206,7 @@ public byte[] ReadRemoteMemory(IntPtr address, int size) /// Type of the value to read. /// The address to read from. /// The remote object. - public T ReadRemoteObject(IntPtr address) where T : struct + public T ReadRemoteObject(IntPtr address) where T : unmanaged { var data = ReadRemoteMemory(address, Marshal.SizeOf()); @@ -569,7 +569,7 @@ public bool WriteRemoteMemory(IntPtr address, byte[] data) /// The address to write to. /// The value to write. /// True if it succeeds, false if it fails. - public bool WriteRemoteMemory(IntPtr address, T value) where T : struct + public bool WriteRemoteMemory(IntPtr address, T value) where T : unmanaged { var data = new byte[Marshal.SizeOf()]; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 3281ce04..64fc51ae 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -70,6 +70,7 @@ Full %28none%29 3 + latest x86 diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/UI/EnumComboBox.cs index c266a9fa..75bc3dd1 100644 --- a/ReClass.NET/UI/EnumComboBox.cs +++ b/ReClass.NET/UI/EnumComboBox.cs @@ -1,14 +1,14 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.UI { - public class EnumComboBox : ComboBox where TEnum : struct + public class EnumComboBox : ComboBox where TEnum : Enum { #region Properties @@ -52,7 +52,7 @@ public class EnumComboBox : ComboBox where TEnum : struct [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new TEnum SelectedValue { - get => ((EnumDescriptionDisplay)base.SelectedItem)?.Value ?? default(TEnum); + get => ((EnumDescriptionDisplay)base.SelectedItem).Value; set => base.SelectedItem = base.Items.Cast>().PredicateOrFirst(e => e.Value.Equals(value)); } diff --git a/ReClass.NET/UI/EnumDescriptionDisplay.cs b/ReClass.NET/UI/EnumDescriptionDisplay.cs index 692b22ce..3c495fb6 100644 --- a/ReClass.NET/UI/EnumDescriptionDisplay.cs +++ b/ReClass.NET/UI/EnumDescriptionDisplay.cs @@ -5,11 +5,10 @@ using System.Linq; using System.Reflection; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.UI { - public class EnumDescriptionDisplay where TEnum : struct + public class EnumDescriptionDisplay where TEnum : Enum { public TEnum Value { get; internal set; } public string Description { get; internal set; } From 92b5d08d74643ca6893d031f255e7db1e38ed114 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Mar 2019 14:52:04 +0100 Subject: [PATCH 490/777] Enforce sorted values. --- ReClass.NET/Nodes/EnumNode.cs | 15 ++++++--------- ReClass.NET/Project/EnumMetaData.cs | 15 +++++++-------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 47d132d0..98081850 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -87,13 +87,13 @@ private string GetStringRepresentation(long value) { if (!MetaData.UseFlagsMode) { - var index = MetaData.Values.FindIndex(v => v == value); + var index = MetaData.Values.FindIndex(kv => kv.Key == value); if (index == -1) { return value.ToString(); } - return MetaData.Names[index]; + return MetaData.Values[index].Value; } return GetFlagsStringRepresentation(value); @@ -103,11 +103,8 @@ private string GetFlagsStringRepresentation(long value) { var result = (ulong)value; - var names = MetaData.Names; var values = MetaData.Values; - Contract.Assert(names.Count == values.Count); - var index = values.Count - 1; var retval = new StringBuilder(); var firstTime = true; @@ -115,7 +112,7 @@ private string GetFlagsStringRepresentation(long value) while (index >= 0) { - var temp = (ulong)values[index]; + var temp = (ulong)values[index].Key; if (index == 0 && temp == 0) { break; @@ -129,7 +126,7 @@ private string GetFlagsStringRepresentation(long value) retval.Prepend(" | "); } - retval.Prepend(names[index]); + retval.Prepend(values[index].Value); firstTime = false; } @@ -143,9 +140,9 @@ private string GetFlagsStringRepresentation(long value) if (saveResult == 0) { - if (values.Count > 0 && values[0] == 0) + if (values.Count > 0 && values[0].Key == 0) { - return names[0]; + return values[0].Value; } return "0"; diff --git a/ReClass.NET/Project/EnumMetaData.cs b/ReClass.NET/Project/EnumMetaData.cs index 73e9b8ba..27e917a3 100644 --- a/ReClass.NET/Project/EnumMetaData.cs +++ b/ReClass.NET/Project/EnumMetaData.cs @@ -14,16 +14,16 @@ public class EnumMetaData public int UnderlyingTypeSize { get; private set; } = sizeof(int); - public IReadOnlyList Values { get; private set; } + public IReadOnlyList> Values { get; private set; } - public IReadOnlyList Names { get; private set; } - - public void SetData(bool useFlagsMode, int underlyingTypeSize, IDictionary values) + public void SetData(bool useFlagsMode, int underlyingTypeSize, IEnumerable> values) { if (!(underlyingTypeSize == 1 || underlyingTypeSize == 2 || underlyingTypeSize == 4 || underlyingTypeSize == 8)) { throw new ArgumentOutOfRangeException(nameof(underlyingTypeSize)); } + + var temp = values.OrderBy(t => t.Key).ToList(); if (useFlagsMode) { @@ -41,7 +41,7 @@ public void SetData(bool useFlagsMode, int underlyingTypeSize, IDictionary (ulong)v).Max() > maxPossibleValue) + if (temp.Select(kv => (ulong)kv.Key).Max() > maxPossibleValue) { throw new ArgumentOutOfRangeException(); } @@ -66,15 +66,14 @@ public void SetData(bool useFlagsMode, int underlyingTypeSize, IDictionary maxPossibleValue || values.Keys.Min() < minPossibleValue) + if (temp.Max(kv => kv.Key) > maxPossibleValue || temp.Min(kv => kv.Key) < minPossibleValue) { throw new ArgumentOutOfRangeException(); } } UseFlagsMode = useFlagsMode; - Values = values.Keys.ToList(); - Names = values.Values.ToList(); + Values = temp; } } } From b364fcd57363624345f04f892b62a1b97b7a456a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Mar 2019 15:15:15 +0100 Subject: [PATCH 491/777] Added EnumEditorForm. --- ReClass.NET/Forms/EnumEditorForm.Designer.cs | 201 +++++++++++++++++++ ReClass.NET/Forms/EnumEditorForm.cs | 84 ++++++++ ReClass.NET/Forms/EnumEditorForm.resx | 132 ++++++++++++ ReClass.NET/ReClass.NET.csproj | 11 +- 4 files changed, 427 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET/Forms/EnumEditorForm.Designer.cs create mode 100644 ReClass.NET/Forms/EnumEditorForm.cs create mode 100644 ReClass.NET/Forms/EnumEditorForm.resx diff --git a/ReClass.NET/Forms/EnumEditorForm.Designer.cs b/ReClass.NET/Forms/EnumEditorForm.Designer.cs new file mode 100644 index 00000000..c36a0c61 --- /dev/null +++ b/ReClass.NET/Forms/EnumEditorForm.Designer.cs @@ -0,0 +1,201 @@ +namespace ReClassNET.Forms +{ + partial class EnumEditorForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.saveButton = new System.Windows.Forms.Button(); + this.enumNameLabel = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.enumFlagCheckBox = new System.Windows.Forms.CheckBox(); + this.enumNameTextBox = new System.Windows.Forms.TextBox(); + this.enumDataGridView = new System.Windows.Forms.DataGridView(); + this.enumUnderlyingTypeSizeComboBox = new System.Windows.Forms.ComboBox(); + this.enumUnderlyingTypeSizeLabel = new System.Windows.Forms.Label(); + this.enumValueKeyColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.enumValueNameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.enumDataGridView)).BeginInit(); + this.SuspendLayout(); + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B16x16_Class_Type; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(380, 48); + this.bannerBox.TabIndex = 15; + this.bannerBox.Text = "Edit an enum of the project."; + this.bannerBox.Title = "Enum Editor"; + // + // saveButton + // + this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.saveButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.saveButton.Location = new System.Drawing.Point(214, 250); + this.saveButton.Name = "saveButton"; + this.saveButton.Size = new System.Drawing.Size(75, 23); + this.saveButton.TabIndex = 22; + this.saveButton.Text = "Save"; + this.saveButton.UseVisualStyleBackColor = true; + this.saveButton.Click += new System.EventHandler(this.saveButton_Click); + // + // enumNameLabel + // + this.enumNameLabel.AutoSize = true; + this.enumNameLabel.Location = new System.Drawing.Point(9, 57); + this.enumNameLabel.Name = "enumNameLabel"; + this.enumNameLabel.Size = new System.Drawing.Size(38, 13); + this.enumNameLabel.TabIndex = 21; + this.enumNameLabel.Text = "Name:"; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(295, 250); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 19; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // enumFlagCheckBox + // + this.enumFlagCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.enumFlagCheckBox.AutoSize = true; + this.enumFlagCheckBox.Location = new System.Drawing.Point(267, 82); + this.enumFlagCheckBox.Name = "enumFlagCheckBox"; + this.enumFlagCheckBox.Size = new System.Drawing.Size(103, 17); + this.enumFlagCheckBox.TabIndex = 18; + this.enumFlagCheckBox.Text = "Use Flags Mode"; + this.enumFlagCheckBox.UseVisualStyleBackColor = true; + // + // enumNameTextBox + // + this.enumNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.enumNameTextBox.Location = new System.Drawing.Point(53, 54); + this.enumNameTextBox.Name = "enumNameTextBox"; + this.enumNameTextBox.Size = new System.Drawing.Size(315, 20); + this.enumNameTextBox.TabIndex = 17; + // + // enumDataGridView + // + this.enumDataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.enumDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.enumDataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.enumValueKeyColumn, + this.enumValueNameColumn}); + this.enumDataGridView.Location = new System.Drawing.Point(12, 108); + this.enumDataGridView.Name = "enumDataGridView"; + this.enumDataGridView.RowHeadersVisible = false; + this.enumDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.enumDataGridView.Size = new System.Drawing.Size(358, 136); + this.enumDataGridView.TabIndex = 16; + this.enumDataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.enumDataGridView_CellValidating); + this.enumDataGridView.DefaultValuesNeeded += new System.Windows.Forms.DataGridViewRowEventHandler(this.enumDataGridView_DefaultValuesNeeded); + // + // enumUnderlyingTypeSizeComboBox + // + this.enumUnderlyingTypeSizeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.enumUnderlyingTypeSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.enumUnderlyingTypeSizeComboBox.FormattingEnabled = true; + this.enumUnderlyingTypeSizeComboBox.Items.AddRange(new object[] { + "1 Byte", + "2 Bytes", + "4 Bytes", + "8 Bytes"}); + this.enumUnderlyingTypeSizeComboBox.Location = new System.Drawing.Point(53, 80); + this.enumUnderlyingTypeSizeComboBox.Name = "enumUnderlyingTypeSizeComboBox"; + this.enumUnderlyingTypeSizeComboBox.Size = new System.Drawing.Size(208, 21); + this.enumUnderlyingTypeSizeComboBox.TabIndex = 23; + // + // enumUnderlyingTypeSizeLabel + // + this.enumUnderlyingTypeSizeLabel.AutoSize = true; + this.enumUnderlyingTypeSizeLabel.Location = new System.Drawing.Point(9, 83); + this.enumUnderlyingTypeSizeLabel.Name = "enumUnderlyingTypeSizeLabel"; + this.enumUnderlyingTypeSizeLabel.Size = new System.Drawing.Size(30, 13); + this.enumUnderlyingTypeSizeLabel.TabIndex = 24; + this.enumUnderlyingTypeSizeLabel.Text = "Size:"; + // + // enumValueKeyColumn + // + this.enumValueKeyColumn.HeaderText = "Value"; + this.enumValueKeyColumn.Name = "enumValueKeyColumn"; + // + // enumValueNameColumn + // + this.enumValueNameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.enumValueNameColumn.HeaderText = "Name"; + this.enumValueNameColumn.Name = "enumValueNameColumn"; + // + // EnumEditorForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(380, 282); + this.Controls.Add(this.enumUnderlyingTypeSizeLabel); + this.Controls.Add(this.enumUnderlyingTypeSizeComboBox); + this.Controls.Add(this.saveButton); + this.Controls.Add(this.enumNameLabel); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.enumFlagCheckBox); + this.Controls.Add(this.enumNameTextBox); + this.Controls.Add(this.enumDataGridView); + this.Controls.Add(this.bannerBox); + this.MinimumSize = new System.Drawing.Size(396, 321); + this.Name = "EnumEditorForm"; + this.Text = "ReClass.NET - Enum Editor"; + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.enumDataGridView)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private UI.BannerBox bannerBox; + private System.Windows.Forms.Button saveButton; + private System.Windows.Forms.Label enumNameLabel; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.CheckBox enumFlagCheckBox; + private System.Windows.Forms.TextBox enumNameTextBox; + private System.Windows.Forms.DataGridView enumDataGridView; + private System.Windows.Forms.ComboBox enumUnderlyingTypeSizeComboBox; + private System.Windows.Forms.Label enumUnderlyingTypeSizeLabel; + private System.Windows.Forms.DataGridViewTextBoxColumn enumValueKeyColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn enumValueNameColumn; + } +} \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs new file mode 100644 index 00000000..2ea46ee1 --- /dev/null +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Windows.Forms; +using ReClassNET.Project; + +namespace ReClassNET.Forms +{ + public partial class EnumEditorForm : IconForm + { + private readonly EnumMetaData enumMetaData; + + public EnumEditorForm(EnumMetaData enumMetaData) + { + Contract.Requires(enumMetaData != null); + + InitializeComponent(); + + this.enumMetaData = enumMetaData; + + enumNameTextBox.Text = enumMetaData.Name; + enumFlagCheckBox.Checked = enumMetaData.UseFlagsMode; + + foreach (var kv in enumMetaData.Values) + { + enumDataGridView.Rows.Add(kv.Key, kv.Value); + } + } + + private void enumDataGridView_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) + { + long value = e.Row.Index; + if (enumFlagCheckBox.Checked) + { + value = (long)Math.Pow(2, e.Row.Index); + } + + e.Row.Cells[0].Value = value; + } + + private void saveButton_Click(object sender, EventArgs e) + { + enumMetaData.Name = enumNameTextBox.Text; + + var values = new Dictionary(); + + foreach (var row in enumDataGridView.Rows.Cast().Where(r => r.IsNewRow == false)) + { + if (!long.TryParse(Convert.ToString(row.Cells[0].Value), out var valueKey)) + { + continue; + } + + var valueName = Convert.ToString(row.Cells[1].Value); + + values.Add(valueKey, valueName); + } + + enumMetaData.SetData(enumFlagCheckBox.Checked, 4, values); + } + + private void enumDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) + { + void SetErrorText(string text) + { + enumDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = text; + } + + SetErrorText(null); + + var formattedValue = Convert.ToString(e.FormattedValue); + + if (e.ColumnIndex == 0 && !long.TryParse(formattedValue, out _)) + { + SetErrorText($"'{formattedValue}' is not a valid value."); + } + else if (e.ColumnIndex == 1 && string.IsNullOrWhiteSpace(formattedValue)) + { + SetErrorText("Empty names are not allowed."); + } + } + } +} diff --git a/ReClass.NET/Forms/EnumEditorForm.resx b/ReClass.NET/Forms/EnumEditorForm.resx new file mode 100644 index 00000000..8ff01df4 --- /dev/null +++ b/ReClass.NET/Forms/EnumEditorForm.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 64fc51ae..3ccd5f91 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -172,6 +172,12 @@ + + Form + + + EnumEditorForm.cs + Form @@ -503,6 +509,9 @@ AboutForm.cs + + EnumEditorForm.cs + EnumSelectionForm.cs From c9d44f9b07ade99899a01d3de5936ae745adb042 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Mar 2019 16:20:55 +0100 Subject: [PATCH 492/777] Added enum management. --- ReClass.NET/Forms/EnumEditorForm.Designer.cs | 47 ++++++------- ReClass.NET/Forms/EnumEditorForm.cs | 22 ++++--- .../Forms/EnumSelectionForm.Designer.cs | 50 +++++++++++++- ReClass.NET/Forms/EnumSelectionForm.cs | 66 +++++++++++++++---- ReClass.NET/Nodes/EnumNode.cs | 24 +++---- ReClass.NET/Project/EnumMetaData.cs | 34 +++++----- ReClass.NET/Project/ReClassNetProject.cs | 56 +++++++++++++++- 7 files changed, 221 insertions(+), 78 deletions(-) diff --git a/ReClass.NET/Forms/EnumEditorForm.Designer.cs b/ReClass.NET/Forms/EnumEditorForm.Designer.cs index c36a0c61..998c6184 100644 --- a/ReClass.NET/Forms/EnumEditorForm.Designer.cs +++ b/ReClass.NET/Forms/EnumEditorForm.Designer.cs @@ -35,10 +35,10 @@ private void InitializeComponent() this.enumFlagCheckBox = new System.Windows.Forms.CheckBox(); this.enumNameTextBox = new System.Windows.Forms.TextBox(); this.enumDataGridView = new System.Windows.Forms.DataGridView(); - this.enumUnderlyingTypeSizeComboBox = new System.Windows.Forms.ComboBox(); - this.enumUnderlyingTypeSizeLabel = new System.Windows.Forms.Label(); this.enumValueKeyColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.enumValueNameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.enumUnderlyingTypeSizeLabel = new System.Windows.Forms.Label(); + this.enumUnderlyingTypeSizeComboBox = new ReClassNET.Forms.UnderlyingSizeComboBox(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.enumDataGridView)).BeginInit(); this.SuspendLayout(); @@ -124,21 +124,16 @@ private void InitializeComponent() this.enumDataGridView.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.enumDataGridView_CellValidating); this.enumDataGridView.DefaultValuesNeeded += new System.Windows.Forms.DataGridViewRowEventHandler(this.enumDataGridView_DefaultValuesNeeded); // - // enumUnderlyingTypeSizeComboBox + // enumValueKeyColumn // - this.enumUnderlyingTypeSizeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.enumUnderlyingTypeSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.enumUnderlyingTypeSizeComboBox.FormattingEnabled = true; - this.enumUnderlyingTypeSizeComboBox.Items.AddRange(new object[] { - "1 Byte", - "2 Bytes", - "4 Bytes", - "8 Bytes"}); - this.enumUnderlyingTypeSizeComboBox.Location = new System.Drawing.Point(53, 80); - this.enumUnderlyingTypeSizeComboBox.Name = "enumUnderlyingTypeSizeComboBox"; - this.enumUnderlyingTypeSizeComboBox.Size = new System.Drawing.Size(208, 21); - this.enumUnderlyingTypeSizeComboBox.TabIndex = 23; + this.enumValueKeyColumn.HeaderText = "Value"; + this.enumValueKeyColumn.Name = "enumValueKeyColumn"; + // + // enumValueNameColumn + // + this.enumValueNameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.enumValueNameColumn.HeaderText = "Name"; + this.enumValueNameColumn.Name = "enumValueNameColumn"; // // enumUnderlyingTypeSizeLabel // @@ -149,24 +144,22 @@ private void InitializeComponent() this.enumUnderlyingTypeSizeLabel.TabIndex = 24; this.enumUnderlyingTypeSizeLabel.Text = "Size:"; // - // enumValueKeyColumn - // - this.enumValueKeyColumn.HeaderText = "Value"; - this.enumValueKeyColumn.Name = "enumValueKeyColumn"; - // - // enumValueNameColumn + // enumUnderlyingTypeSizeComboBox // - this.enumValueNameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.enumValueNameColumn.HeaderText = "Name"; - this.enumValueNameColumn.Name = "enumValueNameColumn"; + this.enumUnderlyingTypeSizeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.enumUnderlyingTypeSizeComboBox.Location = new System.Drawing.Point(53, 80); + this.enumUnderlyingTypeSizeComboBox.Name = "enumUnderlyingTypeSizeComboBox"; + this.enumUnderlyingTypeSizeComboBox.Size = new System.Drawing.Size(208, 21); + this.enumUnderlyingTypeSizeComboBox.TabIndex = 25; // // EnumEditorForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(380, 282); - this.Controls.Add(this.enumUnderlyingTypeSizeLabel); this.Controls.Add(this.enumUnderlyingTypeSizeComboBox); + this.Controls.Add(this.enumUnderlyingTypeSizeLabel); this.Controls.Add(this.saveButton); this.Controls.Add(this.enumNameLabel); this.Controls.Add(this.cancelButton); @@ -193,9 +186,9 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox enumFlagCheckBox; private System.Windows.Forms.TextBox enumNameTextBox; private System.Windows.Forms.DataGridView enumDataGridView; - private System.Windows.Forms.ComboBox enumUnderlyingTypeSizeComboBox; private System.Windows.Forms.Label enumUnderlyingTypeSizeLabel; private System.Windows.Forms.DataGridViewTextBoxColumn enumValueKeyColumn; private System.Windows.Forms.DataGridViewTextBoxColumn enumValueNameColumn; + private UnderlyingSizeComboBox enumUnderlyingTypeSizeComboBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index 2ea46ee1..a0d64a5b 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -4,25 +4,27 @@ using System.Linq; using System.Windows.Forms; using ReClassNET.Project; +using ReClassNET.UI; namespace ReClassNET.Forms { public partial class EnumEditorForm : IconForm { - private readonly EnumMetaData enumMetaData; + private readonly EnumMetaData @enum; - public EnumEditorForm(EnumMetaData enumMetaData) + public EnumEditorForm(EnumMetaData @enum) { - Contract.Requires(enumMetaData != null); + Contract.Requires(@enum != null); InitializeComponent(); - this.enumMetaData = enumMetaData; + this.@enum = @enum; - enumNameTextBox.Text = enumMetaData.Name; - enumFlagCheckBox.Checked = enumMetaData.UseFlagsMode; + enumNameTextBox.Text = @enum.Name; + enumUnderlyingTypeSizeComboBox.SelectedValue = @enum.Size; + enumFlagCheckBox.Checked = @enum.UseFlagsMode; - foreach (var kv in enumMetaData.Values) + foreach (var kv in @enum.Values) { enumDataGridView.Rows.Add(kv.Key, kv.Value); } @@ -41,7 +43,7 @@ private void enumDataGridView_DefaultValuesNeeded(object sender, DataGridViewRow private void saveButton_Click(object sender, EventArgs e) { - enumMetaData.Name = enumNameTextBox.Text; + @enum.Name = enumNameTextBox.Text; var values = new Dictionary(); @@ -57,7 +59,7 @@ private void saveButton_Click(object sender, EventArgs e) values.Add(valueKey, valueName); } - enumMetaData.SetData(enumFlagCheckBox.Checked, 4, values); + @enum.SetData(enumFlagCheckBox.Checked, enumUnderlyingTypeSizeComboBox.SelectedValue, values); } private void enumDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) @@ -81,4 +83,6 @@ void SetErrorText(string text) } } } + + internal class UnderlyingSizeComboBox : EnumComboBox { } } diff --git a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs index 05dc7221..1c4b3166 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs @@ -33,6 +33,9 @@ private void InitializeComponent() this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); this.itemListBox = new System.Windows.Forms.ListBox(); this.bannerBox = new ReClassNET.UI.BannerBox(); + this.addEnumIconButton = new ReClassNET.UI.IconButton(); + this.removeEnumIconButton = new ReClassNET.UI.IconButton(); + this.editEnumIconButton = new ReClassNET.UI.IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); // @@ -66,7 +69,7 @@ private void InitializeComponent() this.filterNameTextBox.Location = new System.Drawing.Point(12, 60); this.filterNameTextBox.Name = "filterNameTextBox"; this.filterNameTextBox.PlaceholderText = "Filter by Enum Name..."; - this.filterNameTextBox.Size = new System.Drawing.Size(492, 20); + this.filterNameTextBox.Size = new System.Drawing.Size(411, 20); this.filterNameTextBox.TabIndex = 10; this.filterNameTextBox.TextChanged += new System.EventHandler(this.filterNameTextBox_TextChanged); // @@ -94,6 +97,45 @@ private void InitializeComponent() this.bannerBox.Text = "Select an enum of the project."; this.bannerBox.Title = "Enum Selection"; // + // addEnumIconButton + // + this.addEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.addEnumIconButton.Enabled = false; + this.addEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add; + this.addEnumIconButton.Location = new System.Drawing.Point(456, 59); + this.addEnumIconButton.Name = "addEnumIconButton"; + this.addEnumIconButton.Pressed = false; + this.addEnumIconButton.Selected = false; + this.addEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.addEnumIconButton.TabIndex = 15; + this.addEnumIconButton.Click += new System.EventHandler(this.addEnumIconButton_Click); + // + // removeEnumIconButton + // + this.removeEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.removeEnumIconButton.Enabled = false; + this.removeEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Remove; + this.removeEnumIconButton.Location = new System.Drawing.Point(481, 59); + this.removeEnumIconButton.Name = "removeEnumIconButton"; + this.removeEnumIconButton.Pressed = false; + this.removeEnumIconButton.Selected = false; + this.removeEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.removeEnumIconButton.TabIndex = 16; + this.removeEnumIconButton.Click += new System.EventHandler(this.removeEnumIconButton_Click); + // + // editEnumIconButton + // + this.editEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.editEnumIconButton.Enabled = false; + this.editEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; + this.editEnumIconButton.Location = new System.Drawing.Point(431, 59); + this.editEnumIconButton.Name = "editEnumIconButton"; + this.editEnumIconButton.Pressed = false; + this.editEnumIconButton.Selected = false; + this.editEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.editEnumIconButton.TabIndex = 16; + this.editEnumIconButton.Click += new System.EventHandler(this.editEnumIconButton_Click); + // // EnumSelectionForm // this.AcceptButton = this.selectButton; @@ -101,6 +143,9 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.cancelButton; this.ClientSize = new System.Drawing.Size(516, 306); + this.Controls.Add(this.editEnumIconButton); + this.Controls.Add(this.addEnumIconButton); + this.Controls.Add(this.removeEnumIconButton); this.Controls.Add(this.selectButton); this.Controls.Add(this.cancelButton); this.Controls.Add(this.filterNameTextBox); @@ -122,5 +167,8 @@ private void InitializeComponent() private UI.PlaceholderTextBox filterNameTextBox; private System.Windows.Forms.ListBox itemListBox; private UI.BannerBox bannerBox; + private UI.IconButton addEnumIconButton; + private UI.IconButton removeEnumIconButton; + private UI.IconButton editEnumIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumSelectionForm.cs b/ReClass.NET/Forms/EnumSelectionForm.cs index 35e48eec..11e2908a 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; @@ -10,19 +9,19 @@ namespace ReClassNET.Forms { public partial class EnumSelectionForm : IconForm { - private readonly IReadOnlyList allEnums; + private readonly ReClassNetProject project; public EnumMetaData SelectedItem => itemListBox.SelectedItem as EnumMetaData; - public EnumSelectionForm(IEnumerable classes) + public EnumSelectionForm(ReClassNetProject project) { - Contract.Requires(classes != null); + Contract.Requires(project != null); - allEnums = classes.ToList(); + this.project = project; InitializeComponent(); - ShowFilteredClasses(); + ShowFilteredEnums(); } protected override void OnLoad(EventArgs e) @@ -41,7 +40,7 @@ protected override void OnFormClosed(FormClosedEventArgs e) private void filterNameTextBox_TextChanged(object sender, EventArgs e) { - ShowFilteredClasses(); + ShowFilteredEnums(); } private void itemListBox_SelectedIndexChanged(object sender, EventArgs e) @@ -49,16 +48,61 @@ private void itemListBox_SelectedIndexChanged(object sender, EventArgs e) selectButton.Enabled = SelectedItem != null; } - private void ShowFilteredClasses() + private void editEnumIconButton_Click(object sender, EventArgs e) { - IEnumerable classes = allEnums; + var @enum = SelectedItem; + if (@enum == null) + { + return; + } + + using (var eef = new EnumEditorForm(@enum)) + { + eef.ShowDialog(); + } + } + + private void addEnumIconButton_Click(object sender, EventArgs e) + { + var @enum = new EnumMetaData + { + Name = "Enum" + }; + + using (var eef = new EnumEditorForm(@enum)) + { + if (eef.ShowDialog() == DialogResult.OK) + { + project.AddEnum(@enum); + + ShowFilteredEnums(); + } + } + } + + private void removeEnumIconButton_Click(object sender, EventArgs e) + { + var @enum = SelectedItem; + if (@enum == null) + { + return; + } + + project.RemoveEnum(@enum); + + ShowFilteredEnums(); + } + + private void ShowFilteredEnums() + { + var enums = project.Enums; if (!string.IsNullOrEmpty(filterNameTextBox.Text)) { - classes = classes.Where(c => c.Name.IndexOf(filterNameTextBox.Text, StringComparison.OrdinalIgnoreCase) >= 0); + enums = enums.Where(c => c.Name.IndexOf(filterNameTextBox.Text, StringComparison.OrdinalIgnoreCase) >= 0); } - itemListBox.DataSource = classes.ToList(); + itemListBox.DataSource = enums.ToList(); } } } diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 98081850..902db74e 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -12,7 +12,7 @@ namespace ReClassNET.Nodes { public class EnumNode : BaseNode { - public override int MemorySize => MetaData.UnderlyingTypeSize; + public override int MemorySize => (int)MetaData.Size; public EnumMetaData MetaData { get; private set; } = EnumMetaData.Default; @@ -22,7 +22,7 @@ public EnumNode() { Name = "TestEnum" }; - MetaData.SetData(true, 4, new SortedDictionary + MetaData.SetData(true, EnumMetaData.UnderlyingTypeSize.FourBytes, new SortedDictionary { { 0, "Val0" }, { 1, "Val1" }, @@ -51,15 +51,15 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) /// public BaseNumericNode GetUnderlayingNode() { - switch (MetaData.UnderlyingTypeSize) + switch (MetaData.Size) { - case 1: + case EnumMetaData.UnderlyingTypeSize.OneByte: return new UInt8Node(); - case 2: + case EnumMetaData.UnderlyingTypeSize.TwoBytes: return new UInt16Node(); - case 4: + case EnumMetaData.UnderlyingTypeSize.FourBytes: return new UInt32Node(); - case 8: + case EnumMetaData.UnderlyingTypeSize.EightBytes: return new UInt64Node(); } @@ -68,15 +68,15 @@ public BaseNumericNode GetUnderlayingNode() public long ReadValueFromMemory(MemoryBuffer memory) { - switch (MetaData.UnderlyingTypeSize) + switch (MetaData.Size) { - case 1: + case EnumMetaData.UnderlyingTypeSize.OneByte: return memory.ReadInt8(Offset); - case 2: + case EnumMetaData.UnderlyingTypeSize.TwoBytes: return memory.ReadInt16(Offset); - case 4: + case EnumMetaData.UnderlyingTypeSize.FourBytes: return memory.ReadInt32(Offset); - case 8: + case EnumMetaData.UnderlyingTypeSize.EightBytes: return memory.ReadInt64(Offset); } diff --git a/ReClass.NET/Project/EnumMetaData.cs b/ReClass.NET/Project/EnumMetaData.cs index 27e917a3..0cbe3374 100644 --- a/ReClass.NET/Project/EnumMetaData.cs +++ b/ReClass.NET/Project/EnumMetaData.cs @@ -6,37 +6,40 @@ namespace ReClassNET.Project { public class EnumMetaData { + public enum UnderlyingTypeSize + { + OneByte = 1, + TwoBytes = 2, + FourBytes = 4, + EightBytes = 8 + } + public static EnumMetaData Default => new EnumMetaData { Name = "DummyEnum" }; public string Name { get; set; } public bool UseFlagsMode { get; private set; } - public int UnderlyingTypeSize { get; private set; } = sizeof(int); + public UnderlyingTypeSize Size { get; private set; } = UnderlyingTypeSize.FourBytes; public IReadOnlyList> Values { get; private set; } - public void SetData(bool useFlagsMode, int underlyingTypeSize, IEnumerable> values) + public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable> values) { - if (!(underlyingTypeSize == 1 || underlyingTypeSize == 2 || underlyingTypeSize == 4 || underlyingTypeSize == 8)) - { - throw new ArgumentOutOfRangeException(nameof(underlyingTypeSize)); - } - var temp = values.OrderBy(t => t.Key).ToList(); if (useFlagsMode) { var maxPossibleValue = ulong.MaxValue; - switch (underlyingTypeSize) + switch (size) { - case 1: + case UnderlyingTypeSize.OneByte: maxPossibleValue = byte.MaxValue; break; - case 2: + case UnderlyingTypeSize.TwoBytes: maxPossibleValue = ushort.MaxValue; break; - case 4: + case UnderlyingTypeSize.FourBytes: maxPossibleValue = uint.MaxValue; break; } @@ -50,17 +53,17 @@ public void SetData(bool useFlagsMode, int underlyingTypeSize, IEnumerable e.GetParentClass()).Distinct()); + } + + enums.Remove(@enum); + } + + private IEnumerable GetEnumReferences(EnumMetaData @enum) + { + Contract.Requires(@enum != null); + + return classes + .SelectMany(c => c.Nodes.Where(n => n is EnumNode || (n as BaseWrapperNode)?.ResolveMostInnerNode() is EnumNode)) + .Cast() + .Where(e => e.MetaData == @enum); + } } public class ClassReferencedException : Exception { + public ClassNode ClassNode { get; } + public IEnumerable References { get; } + + public ClassReferencedException(ClassNode node, IEnumerable references) + : base($"The class '{node.Name}' is referenced in other classes.") + { + Contract.Requires(node != null); + Contract.Requires(references != null); + Contract.Requires(Contract.ForAll(references, c => c != null)); + + ClassNode = node; + References = references; + } + } + + public class EnumReferencedException : Exception + { + public EnumMetaData Enum { get; } public IEnumerable References { get; } - public ClassReferencedException(IEnumerable references) - : base("This class has references.") + public EnumReferencedException(EnumMetaData @enum, IEnumerable references) + : base($"The enum '{@enum.Name}' is referenced in other classes.") { + Contract.Requires(@enum != null); Contract.Requires(references != null); Contract.Requires(Contract.ForAll(references, c => c != null)); + Enum = @enum; References = references; } } From 9c4a25adbfdcc839c1e03c0d6914992cee913ea5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 Mar 2019 20:12:34 +0100 Subject: [PATCH 493/777] Extended NodeClickEventArgs. --- ReClass.NET/UI/MemoryViewControl.cs | 21 +++++---------------- ReClass.NET/UI/NodeClickEventArgs.cs | 10 +++++++++- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 7b5e6521..a61ad250 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -368,24 +368,13 @@ protected override void OnMouseClick(MouseEventArgs e) break; } - else if (hotSpot.Type == HotSpotType.ChangeClassType) + else if (hotSpot.Type == HotSpotType.ChangeClassType || hotSpot.Type == HotSpotType.ChangeWrappedType || hotSpot.Type == HotSpotType.ChangeEnumType) { - var handler = ChangeClassTypeClick; - handler?.Invoke(this, new NodeClickEventArgs(hitObject, e.Button, e.Location)); + var handler = hotSpot.Type == HotSpotType.ChangeClassType + ? ChangeClassTypeClick : hotSpot.Type == HotSpotType.ChangeWrappedType + ? ChangeWrappedTypeClick : ChangeEnumTypeClick; - break; - } - else if (hotSpot.Type == HotSpotType.ChangeWrappedType) - { - var handler = ChangeWrappedTypeClick; - handler?.Invoke(this, new NodeClickEventArgs(hitObject, e.Button, e.Location)); - - break; - } - else if (hotSpot.Type == HotSpotType.ChangeEnumType) - { - var handler = ChangeEnumTypeClick; - handler?.Invoke(this, new NodeClickEventArgs(hitObject, e.Button, e.Location)); + handler?.Invoke(this, new NodeClickEventArgs(hitObject, hotSpot.Address, hotSpot.Memory, e.Button, e.Location)); break; } diff --git a/ReClass.NET/UI/NodeClickEventArgs.cs b/ReClass.NET/UI/NodeClickEventArgs.cs index efad9a98..70f3948a 100644 --- a/ReClass.NET/UI/NodeClickEventArgs.cs +++ b/ReClass.NET/UI/NodeClickEventArgs.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Windows.Forms; +using ReClassNET.Memory; using ReClassNET.Nodes; namespace ReClassNET.UI @@ -10,15 +11,22 @@ public class NodeClickEventArgs : EventArgs { public BaseNode Node { get; } + public IntPtr Address { get; } + + public MemoryBuffer Memory { get; } + public MouseButtons Button { get; } public Point Location { get; } - public NodeClickEventArgs(BaseNode node, MouseButtons button, Point location) + public NodeClickEventArgs(BaseNode node, IntPtr address, MemoryBuffer memory, MouseButtons button, Point location) { Contract.Requires(node != null); + Contract.Requires(memory != null); Node = node; + Address = address; + Memory = memory; Button = button; Location = location; } From 1381ea8739fe339746fadbf8a5843e1025b14854 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 08:26:25 +0100 Subject: [PATCH 494/777] Fixed button enabled state. --- ReClass.NET/Forms/EnumSelectionForm.Designer.cs | 1 - ReClass.NET/Forms/EnumSelectionForm.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs index 1c4b3166..52916429 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs @@ -100,7 +100,6 @@ private void InitializeComponent() // addEnumIconButton // this.addEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.addEnumIconButton.Enabled = false; this.addEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add; this.addEnumIconButton.Location = new System.Drawing.Point(456, 59); this.addEnumIconButton.Name = "addEnumIconButton"; diff --git a/ReClass.NET/Forms/EnumSelectionForm.cs b/ReClass.NET/Forms/EnumSelectionForm.cs index 11e2908a..cfc5a75b 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.cs @@ -45,7 +45,7 @@ private void filterNameTextBox_TextChanged(object sender, EventArgs e) private void itemListBox_SelectedIndexChanged(object sender, EventArgs e) { - selectButton.Enabled = SelectedItem != null; + selectButton.Enabled = editEnumIconButton.Enabled = removeEnumIconButton.Enabled = SelectedItem != null; } private void editEnumIconButton_Click(object sender, EventArgs e) From 27987fb7d536bc8f2ba3fa6908deaa3517b10028 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 08:27:34 +0100 Subject: [PATCH 495/777] Provide default values. --- ReClass.NET/Project/EnumMetaData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Project/EnumMetaData.cs b/ReClass.NET/Project/EnumMetaData.cs index 0cbe3374..f9ee63e8 100644 --- a/ReClass.NET/Project/EnumMetaData.cs +++ b/ReClass.NET/Project/EnumMetaData.cs @@ -16,13 +16,13 @@ public enum UnderlyingTypeSize public static EnumMetaData Default => new EnumMetaData { Name = "DummyEnum" }; - public string Name { get; set; } + public string Name { get; set; } = string.Empty; public bool UseFlagsMode { get; private set; } public UnderlyingTypeSize Size { get; private set; } = UnderlyingTypeSize.FourBytes; - public IReadOnlyList> Values { get; private set; } + public IReadOnlyList> Values { get; private set; } = new Dictionary().ToList(); public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable> values) { From 98e53ba1602b2257c287ce03399f2318ef74b689 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 08:29:03 +0100 Subject: [PATCH 496/777] Removed exception handling from the control. --- ReClass.NET/UI/MemoryViewControl.cs | 202 ++++++++++++++-------------- 1 file changed, 98 insertions(+), 104 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index a61ad250..a485bd45 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -9,7 +9,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Nodes; -using ReClassNET.Project; using ReClassNET.Util; namespace ReClassNET.UI @@ -219,6 +218,8 @@ protected override void OnPaint(PaintEventArgs e) catch (Exception) { Debug.Assert(false); + + throw; } } @@ -239,149 +240,142 @@ protected override void OnMouseClick(MouseEventArgs e) { if (hotSpot.Rect.Contains(e.Location)) { - try - { - var hitObject = hotSpot.Node; + var hitObject = hotSpot.Node; - if (hotSpot.Type == HotSpotType.OpenClose) - { - hitObject.ToggleLevelOpen(hotSpot.Level); + if (hotSpot.Type == HotSpotType.OpenClose) + { + hitObject.ToggleLevelOpen(hotSpot.Level); - invalidate = true; + invalidate = true; - break; - } - if (hotSpot.Type == HotSpotType.Click) - { - hitObject.Update(hotSpot); + break; + } + if (hotSpot.Type == HotSpotType.Click) + { + hitObject.Update(hotSpot); - invalidate = true; + invalidate = true; - break; - } - if (hotSpot.Type == HotSpotType.Select) + break; + } + if (hotSpot.Type == HotSpotType.Select) + { + if (e.Button == MouseButtons.Left) { - if (e.Button == MouseButtons.Left) + if (ModifierKeys == Keys.None) { - if (ModifierKeys == Keys.None) - { - ClearSelection(); + ClearSelection(); - hitObject.IsSelected = true; + hitObject.IsSelected = true; - selectedNodes.Add(hotSpot); + selectedNodes.Add(hotSpot); - OnSelectionChanged(); + OnSelectionChanged(); - selectionAnchor = selectionCaret = hotSpot; + selectionAnchor = selectionCaret = hotSpot; + } + else if (ModifierKeys == Keys.Control) + { + hitObject.IsSelected = !hitObject.IsSelected; + + if (hitObject.IsSelected) + { + selectedNodes.Add(hotSpot); } - else if (ModifierKeys == Keys.Control) + else { - hitObject.IsSelected = !hitObject.IsSelected; + selectedNodes.Remove(selectedNodes.FirstOrDefault(c => c.Node == hitObject)); + } - if (hitObject.IsSelected) + OnSelectionChanged(); + } + else if (ModifierKeys == Keys.Shift) + { + if (selectedNodes.Count > 0) + { + var selectedNode = selectedNodes[0].Node; + if (hitObject.GetParentContainer() != null && selectedNode.GetParentContainer() != hitObject.GetParentContainer()) { - selectedNodes.Add(hotSpot); + continue; } - else + + if (hotSpot.Node is BaseContainerNode) { - selectedNodes.Remove(selectedNodes.FirstOrDefault(c => c.Node == hitObject)); + continue; } - OnSelectionChanged(); - } - else if (ModifierKeys == Keys.Shift) - { - if (selectedNodes.Count > 0) - { - var selectedNode = selectedNodes[0].Node; - if (hitObject.GetParentContainer() != null && selectedNode.GetParentContainer() != hitObject.GetParentContainer()) - { - continue; - } + var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset.ToInt32()); + var last = first == hotSpot ? selectedNodes[0] : hotSpot; - if (hotSpot.Node is BaseContainerNode) - { - continue; - } - - var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset.ToInt32()); - var last = first == hotSpot ? selectedNodes[0] : hotSpot; - - ClearSelection(); - - var containerNode = selectedNode.GetParentContainer(); - foreach (var spot in containerNode.Nodes - .SkipWhile(n => n != first.Node) - .TakeUntil(n => n == last.Node) - .Select(n => new HotSpot - { - Address = containerNode.Offset.Add(n.Offset), - Node = n, - Memory = first.Memory, - Level = first.Level - })) + ClearSelection(); + + var containerNode = selectedNode.GetParentContainer(); + foreach (var spot in containerNode.Nodes + .SkipWhile(n => n != first.Node) + .TakeUntil(n => n == last.Node) + .Select(n => new HotSpot { - spot.Node.IsSelected = true; - selectedNodes.Add(spot); - } + Address = containerNode.Offset.Add(n.Offset), + Node = n, + Memory = first.Memory, + Level = first.Level + })) + { + spot.Node.IsSelected = true; + selectedNodes.Add(spot); + } - OnSelectionChanged(); + OnSelectionChanged(); - selectionAnchor = first; - selectionCaret = last; - } + selectionAnchor = first; + selectionCaret = last; } } - else if (e.Button == MouseButtons.Right) + } + else if (e.Button == MouseButtons.Right) + { + // If there is only one selected node, select the node the user clicked at. + if (selectedNodes.Count <= 1) { - // If there is only one selected node, select the node the user clicked at. - if (selectedNodes.Count <= 1) - { - ClearSelection(); - - hitObject.IsSelected = true; + ClearSelection(); - selectedNodes.Add(hotSpot); + hitObject.IsSelected = true; - OnSelectionChanged(); + selectedNodes.Add(hotSpot); - selectionAnchor = selectionCaret = hotSpot; - } + OnSelectionChanged(); - ShowNodeContextMenu(e.Location); + selectionAnchor = selectionCaret = hotSpot; } - invalidate = true; - } - else if (hotSpot.Type == HotSpotType.Drop) - { ShowNodeContextMenu(e.Location); - - break; } - else if (hotSpot.Type == HotSpotType.Delete) - { - hotSpot.Node.GetParentContainer().RemoveNode(hotSpot.Node); - invalidate = true; + invalidate = true; + } + else if (hotSpot.Type == HotSpotType.Drop) + { + ShowNodeContextMenu(e.Location); - break; - } - else if (hotSpot.Type == HotSpotType.ChangeClassType || hotSpot.Type == HotSpotType.ChangeWrappedType || hotSpot.Type == HotSpotType.ChangeEnumType) - { - var handler = hotSpot.Type == HotSpotType.ChangeClassType - ? ChangeClassTypeClick : hotSpot.Type == HotSpotType.ChangeWrappedType - ? ChangeWrappedTypeClick : ChangeEnumTypeClick; + break; + } + else if (hotSpot.Type == HotSpotType.Delete) + { + hotSpot.Node.GetParentContainer().RemoveNode(hotSpot.Node); - handler?.Invoke(this, new NodeClickEventArgs(hitObject, hotSpot.Address, hotSpot.Memory, e.Button, e.Location)); + invalidate = true; - break; - } + break; } - catch (Exception ex) + else if (hotSpot.Type == HotSpotType.ChangeClassType || hotSpot.Type == HotSpotType.ChangeWrappedType || hotSpot.Type == HotSpotType.ChangeEnumType) { - Program.Logger.Log(ex); + var handler = hotSpot.Type == HotSpotType.ChangeClassType + ? ChangeClassTypeClick : hotSpot.Type == HotSpotType.ChangeWrappedType + ? ChangeWrappedTypeClick : ChangeEnumTypeClick; + + handler?.Invoke(this, new NodeClickEventArgs(hitObject, hotSpot.Address, hotSpot.Memory, e.Button, e.Location)); + + break; } } } From 400d46735d56e577169857ea194131603569b205 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 08:29:22 +0100 Subject: [PATCH 497/777] Implemented event handler. --- ReClass.NET/Forms/MainForm.cs | 17 +++++++++++++++-- ReClass.NET/Nodes/EnumNode.cs | 30 +++++++----------------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 1fd46fd0..9adf7774 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -856,9 +856,22 @@ private void memoryViewControl_ChangeWrappedTypeClick(object sender, NodeClickEv } } - private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEventArgs args) + private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEventArgs e) { - + if (e.Node is EnumNode enumNode) + { + using (var csf = new EnumSelectionForm(CurrentProject)) + { + if (csf.ShowDialog() == DialogResult.OK) + { + var @enum = csf.SelectedItem; + if (@enum != null) + { + enumNode.ChangeEnum(@enum); + } + } + } + } } private void showCodeOfClassToolStripMenuItem2_Click(object sender, EventArgs e) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 902db74e..b74407ec 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -16,35 +16,19 @@ public class EnumNode : BaseNode public EnumMetaData MetaData { get; private set; } = EnumMetaData.Default; - public EnumNode() - { - MetaData = new EnumMetaData - { - Name = "TestEnum" - }; - MetaData.SetData(true, EnumMetaData.UnderlyingTypeSize.FourBytes, new SortedDictionary - { - { 0, "Val0" }, - { 1, "Val1" }, - { 2, "Val2" }, - { 4, "Val4" }, - { 8, "Val8" }, - { 16, "Val16" }, - { 32, "Val32" }, - { 64, "Val64" }, - { 128, "Val128" }, - { 256, "Val256" }, - { 512, "Val512" }, - { 1024, "Val1024" } - }); - } - public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "Enum"; icon = Properties.Resources.B16x16_Button_Enum; } + public void ChangeEnum(EnumMetaData @enum) + { + Contract.Requires(@enum != null); + + MetaData = @enum; + } + /// /// Gets the underlaying node for the enum field. /// From 83073af7bfb0c3c6baac0e52c3165d25e37f81cf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 08:37:31 +0100 Subject: [PATCH 498/777] Update the parent container because of size changes. --- ReClass.NET/Forms/MainForm.cs | 8 ++++++++ ReClass.NET/Nodes/EnumNode.cs | 2 ++ 2 files changed, 10 insertions(+) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 9adf7774..cc0b5fc4 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -862,6 +862,8 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent { using (var csf = new EnumSelectionForm(CurrentProject)) { + var size = enumNode.MetaData.Size; + if (csf.ShowDialog() == DialogResult.OK) { var @enum = csf.SelectedItem; @@ -870,6 +872,12 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent enumNode.ChangeEnum(@enum); } } + + if (size != enumNode.MetaData.Size) + { + // Update the parent container because the enum size has changed. + enumNode.GetParentContainer()?.ChildHasChanged(enumNode); + } } } } diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index b74407ec..29ad608d 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -27,6 +27,8 @@ public void ChangeEnum(EnumMetaData @enum) Contract.Requires(@enum != null); MetaData = @enum; + + GetParentContainer()?.ChildHasChanged(this); } /// From 0418c963f382af51ff9b2759bed9eba16d3a9555 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 15:49:38 +0100 Subject: [PATCH 499/777] Added serialisation of enums. --- .../ReClass/ReClassNetFile.Constants.cs | 6 ++ .../ReClass/ReClassNetFile.Read.cs | 63 ++++++++++++++----- .../ReClass/ReClassNetFile.Write.cs | 20 +++++- .../Extensions/XAttributeExtensions.cs | 18 ++++++ ReClass.NET/ReClass.NET.csproj | 1 + 5 files changed, 90 insertions(+), 18 deletions(-) create mode 100644 ReClass.NET/Extensions/XAttributeExtensions.cs diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs index f13d0d99..d44c645f 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Constants.cs @@ -16,6 +16,8 @@ public partial class ReClassNetFile public const string XmlRootElement = "reclass"; public const string XmlCustomDataElement = "custom_data"; public const string XmlTypeMappingElement = "type_mapping"; + public const string XmlEnumsElement = "enums"; + public const string XmlEnumElement = "enum"; public const string XmlClassesElement = "classes"; public const string XmlClassElement = "class"; public const string XmlNodeElement = "node"; @@ -32,6 +34,10 @@ public partial class ReClassNetFile public const string XmlCountAttribute = "count"; public const string XmlBitsAttribute = "bits"; public const string XmlLengthAttribute = "length"; + public const string XmlSizeAttribute = "size"; public const string XmlSignatureAttribute = "signature"; + public const string XmlFlagsAttribute = "flags"; + public const string XmlItemElement = "item"; + public const string XmlValueAttribute = "value"; } } diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index fcd2d373..b9465491 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -67,26 +67,57 @@ public void Load(Stream input, ILogger logger) project.TypeMapping.Deserialize(typeMappingElement); } - var classes = new List>(); - - foreach (var element in document.Root - .Element(XmlClassesElement) - .Elements(XmlClassElement) - .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value)) + var enumsElement = document.Root.Element(XmlEnumsElement); + if (enumsElement != null) { - var node = new ClassNode(false) + foreach (var enumElement in enumsElement.Elements(XmlEnumElement)) { - Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), - Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, - Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, - AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty - }; + var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; + var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; + var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); + + var values = new Dictionary(); + foreach (var itemElement in enumElement.Elements(XmlItemElement)) + { + var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; + var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0; + + values.Add(itemValue, itemName); + } + + var @enum = new EnumMetaData + { + Name = name + }; + @enum.SetData(useFlagsMode, size, values); + + project.AddEnum(@enum); + } + } - if (!project.ContainsClass(node.Uuid)) - { - project.AddClass(node); + var classes = new List>(); - classes.Add(Tuple.Create(element, node)); + var classesElement = document.Root.Element(XmlClassesElement); + if (classesElement != null) + { + foreach (var element in classesElement + .Elements(XmlClassElement) + .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value)) + { + var node = new ClassNode(false) + { + Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), + Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, + Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, + AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty + }; + + if (!project.ContainsClass(node.Uuid)) + { + project.AddClass(node); + + classes.Add(Tuple.Create(element, node)); + } } } diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index d7c75175..3f938708 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -34,9 +34,10 @@ public void Save(Stream output, ILogger logger) XmlRootElement, new XAttribute(XmlVersionAttribute, FileVersion), new XAttribute(XmlPlatformAttribute, Constants.Platform), - new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)), project.CustomData.Serialize(XmlCustomDataElement), - project.TypeMapping.Serialize(XmlTypeMappingElement) + project.TypeMapping.Serialize(XmlTypeMappingElement), + new XElement(XmlEnumsElement, CreateEnumElements(project.Enums)), + new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)) ) ); @@ -45,6 +46,21 @@ public void Save(Stream output, ILogger logger) } } + private static IEnumerable CreateEnumElements(IEnumerable enums) + { + return enums.Select(e => new XElement( + XmlEnumElement, + new XAttribute(XmlNameAttribute, e.Name), + new XAttribute(XmlSizeAttribute, e.Size), + new XAttribute(XmlFlagsAttribute, e.UseFlagsMode), + e.Values.Select(kv => new XElement( + XmlItemElement, + new XAttribute(XmlValueAttribute, kv.Key), + new XAttribute(XmlNameAttribute, kv.Value) + )) + )); + } + private static IEnumerable CreateClassElements(IEnumerable classes, ILogger logger) { Contract.Requires(classes != null); diff --git a/ReClass.NET/Extensions/XAttributeExtensions.cs b/ReClass.NET/Extensions/XAttributeExtensions.cs new file mode 100644 index 00000000..ed5d4039 --- /dev/null +++ b/ReClass.NET/Extensions/XAttributeExtensions.cs @@ -0,0 +1,18 @@ +using System; +using System.Xml.Linq; + +namespace ReClassNET.Extensions +{ + public static class XAttributeExtensions + { + public static TEnum GetEnumValue(this XAttribute attribute) where TEnum : struct, Enum + { + TEnum @enum = default; + if (attribute != null) + { + Enum.TryParse(attribute.Value, out @enum); + } + return @enum; + } + } +} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 3ccd5f91..dee95d1a 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -172,6 +172,7 @@ + Form From 6d07e27fec020dfd9cf02b77e06529a1e00282c5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 16:00:28 +0100 Subject: [PATCH 500/777] Added serialisation of EnumNode nodes. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs | 8 ++++++++ ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs | 5 +++++ ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs | 1 + 3 files changed, 14 insertions(+) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index b9465491..664f7eef 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -299,6 +299,14 @@ ClassNode GetClassNodeFromElementReference() } break; } + case EnumNode enumNode: + { + var enumName = element.Attribute(XmlReferenceAttribute)?.Value ?? string.Empty; + var @enum = project.Enums.FirstOrDefault(e => e.Name == enumName) ?? EnumMetaData.Default; + + enumNode.ChangeEnum(@enum); + break; + } } return node; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 3f938708..fe926c8f 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -163,6 +163,11 @@ XElement CreateElement() element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); break; } + case EnumNode enumNode: + { + element.SetAttributeValue(XmlReferenceAttribute, enumNode.MetaData.Name); + break; + } } return element; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index bd6e2644..1815fa70 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -40,6 +40,7 @@ static ReClassNetFile() { typeof(BoolNode), typeof(BitFieldNode), + typeof(EnumNode), typeof(ClassInstanceNode), typeof(DoubleNode), typeof(FloatNode), From 069297e294a82cdda91b3b938cef1e1fcb38b39c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 16:07:39 +0100 Subject: [PATCH 501/777] Switched key and value. --- .../DataExchange/ReClass/ReClassNetFile.Read.cs | 6 +++--- .../DataExchange/ReClass/ReClassNetFile.Write.cs | 4 ++-- ReClass.NET/Forms/EnumEditorForm.cs | 8 ++++---- ReClass.NET/Nodes/EnumNode.cs | 12 ++++++------ ReClass.NET/Project/EnumMetaData.cs | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 664f7eef..a90c4d4b 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -76,13 +76,13 @@ public void Load(Stream input, ILogger logger) var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); - var values = new Dictionary(); + var values = new Dictionary(); foreach (var itemElement in enumElement.Elements(XmlItemElement)) { var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; - var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0; + var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0L; - values.Add(itemValue, itemName); + values.Add(itemName, itemValue); } var @enum = new EnumMetaData diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index fe926c8f..a911fcd0 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -55,8 +55,8 @@ private static IEnumerable CreateEnumElements(IEnumerable new XElement( XmlItemElement, - new XAttribute(XmlValueAttribute, kv.Key), - new XAttribute(XmlNameAttribute, kv.Value) + new XAttribute(XmlNameAttribute, kv.Key), + new XAttribute(XmlValueAttribute, kv.Value) )) )); } diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index a0d64a5b..6b2d48a3 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -45,18 +45,18 @@ private void saveButton_Click(object sender, EventArgs e) { @enum.Name = enumNameTextBox.Text; - var values = new Dictionary(); + var values = new Dictionary(); foreach (var row in enumDataGridView.Rows.Cast().Where(r => r.IsNewRow == false)) { - if (!long.TryParse(Convert.ToString(row.Cells[0].Value), out var valueKey)) + if (!long.TryParse(Convert.ToString(row.Cells[0].Value), out var itemValue)) { continue; } - var valueName = Convert.ToString(row.Cells[1].Value); + var itemName = Convert.ToString(row.Cells[1].Value); - values.Add(valueKey, valueName); + values.Add(itemName, itemValue); } @enum.SetData(enumFlagCheckBox.Checked, enumUnderlyingTypeSizeComboBox.SelectedValue, values); diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 29ad608d..9846d67d 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -73,13 +73,13 @@ private string GetStringRepresentation(long value) { if (!MetaData.UseFlagsMode) { - var index = MetaData.Values.FindIndex(kv => kv.Key == value); + var index = MetaData.Values.FindIndex(kv => kv.Value == value); if (index == -1) { return value.ToString(); } - return MetaData.Values[index].Value; + return MetaData.Values[index].Key; } return GetFlagsStringRepresentation(value); @@ -98,7 +98,7 @@ private string GetFlagsStringRepresentation(long value) while (index >= 0) { - var temp = (ulong)values[index].Key; + var temp = (ulong)values[index].Value; if (index == 0 && temp == 0) { break; @@ -112,7 +112,7 @@ private string GetFlagsStringRepresentation(long value) retval.Prepend(" | "); } - retval.Prepend(values[index].Value); + retval.Prepend(values[index].Key); firstTime = false; } @@ -126,9 +126,9 @@ private string GetFlagsStringRepresentation(long value) if (saveResult == 0) { - if (values.Count > 0 && values[0].Key == 0) + if (values.Count > 0 && values[0].Value == 0) { - return values[0].Value; + return values[0].Key; } return "0"; diff --git a/ReClass.NET/Project/EnumMetaData.cs b/ReClass.NET/Project/EnumMetaData.cs index f9ee63e8..d2e8d106 100644 --- a/ReClass.NET/Project/EnumMetaData.cs +++ b/ReClass.NET/Project/EnumMetaData.cs @@ -22,9 +22,9 @@ public enum UnderlyingTypeSize public UnderlyingTypeSize Size { get; private set; } = UnderlyingTypeSize.FourBytes; - public IReadOnlyList> Values { get; private set; } = new Dictionary().ToList(); + public IReadOnlyList> Values { get; private set; } = new Dictionary().ToList(); - public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable> values) + public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable> values) { var temp = values.OrderBy(t => t.Key).ToList(); @@ -44,7 +44,7 @@ public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable (ulong)kv.Key).Max() > maxPossibleValue) + if (temp.Select(kv => (ulong)kv.Value).Max() > maxPossibleValue) { throw new ArgumentOutOfRangeException(); } @@ -69,7 +69,7 @@ public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable kv.Key) > maxPossibleValue || temp.Min(kv => kv.Key) < minPossibleValue) + if (temp.Max(kv => kv.Value) > maxPossibleValue || temp.Min(kv => kv.Value) < minPossibleValue) { throw new ArgumentOutOfRangeException(); } From b163b5fe429b5cafd8c727f6c91e40d6b6b10806 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 Mar 2019 19:56:49 +0100 Subject: [PATCH 502/777] Fixed "Clear Project" not working. Fixed #93. --- ReClass.NET/Forms/MainForm.Functions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 9eb8346f..411cdcda 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -86,6 +86,8 @@ void UpdateClassNodes(BaseNode node) ClassNode.ClassCreated += currentProject.AddClass; + classesView.Clear(); + classesView.AddClasses(currentProject.Classes); memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault(); } From 33985fb7af47561f2a2e357d7c036743c2b3750f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Mar 2019 11:09:08 +0100 Subject: [PATCH 503/777] Removed TryGetAttributeValue method. --- .../ReClass/ReClassNetFile.Read.cs | 26 +++---------------- .../ReClass/ReClassNetFile.Write.cs | 4 +-- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index a90c4d4b..844405b8 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -261,7 +261,7 @@ ClassNode GetClassNodeFromElementReference() { Name = e.Attribute(XmlNameAttribute)?.Value ?? string.Empty, Comment = e.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, - IsHidden = e.Attribute(XmlHiddenAttribute)?.Value.Equals("True") ?? false + IsHidden = (bool?)e.Attribute(XmlHiddenAttribute) ?? false }); foreach (var vmethodNode in nodes) @@ -272,20 +272,17 @@ ClassNode GetClassNodeFromElementReference() } case BaseWrapperArrayNode arrayNode: { - TryGetAttributeValue(element, XmlCountAttribute, out var count, logger); - arrayNode.Count = count; + arrayNode.Count = (int?)element.Attribute(XmlCountAttribute) ?? 0; break; } case BaseTextNode textNode: { - TryGetAttributeValue(element, XmlLengthAttribute, out var length, logger); - textNode.Length = length; + textNode.Length = (int?)element.Attribute(XmlLengthAttribute) ?? 0; break; } case BitFieldNode bitFieldNode: { - TryGetAttributeValue(element, XmlBitsAttribute, out var bits, logger); - bitFieldNode.Bits = bits; + bitFieldNode.Bits = (int?)element.Attribute(XmlBitsAttribute) ?? 0; break; } case FunctionNode functionNode: @@ -312,21 +309,6 @@ ClassNode GetClassNodeFromElementReference() return node; } - private static void TryGetAttributeValue(XElement element, string attribute, out int val, ILogger logger) - { - Contract.Requires(element != null); - Contract.Requires(attribute != null); - Contract.Requires(logger != null); - - if (!int.TryParse(element.Attribute(attribute)?.Value, out val)) - { - val = 0; - - logger.Log(LogLevel.Error, $"Node is missing a valid '{attribute}' attribute, defaulting to 0."); - logger.Log(LogLevel.Warning, element.ToString()); - } - } - public static Tuple, List> DeserializeNodesFromStream(Stream input, ReClassNetProject templateProject, ILogger logger) { Contract.Requires(input != null); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index a911fcd0..885bf835 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -115,7 +115,7 @@ XElement CreateElement() element.SetAttributeValue(XmlNameAttribute, node.Name ?? string.Empty); element.SetAttributeValue(XmlCommentAttribute, node.Comment ?? string.Empty); - element.SetAttributeValue(XmlHiddenAttribute, node.IsHidden.ToString()); + element.SetAttributeValue(XmlHiddenAttribute, node.IsHidden); if (node is BaseWrapperNode wrapperNode) { @@ -137,7 +137,7 @@ XElement CreateElement() XmlMethodElement, new XAttribute(XmlNameAttribute, n.Name ?? string.Empty), new XAttribute(XmlCommentAttribute, n.Comment ?? string.Empty), - new XAttribute(XmlHiddenAttribute, n.IsHidden.ToString()) + new XAttribute(XmlHiddenAttribute, n.IsHidden) ))); break; } From 03d1126bb2f5a4fafc0acfec3fa353bff83e3774 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Mar 2019 15:39:47 +0100 Subject: [PATCH 504/777] Use IReadOnlyList instead of IEnumerable. --- ReClass.NET/Forms/MainForm.Functions.cs | 6 +++--- ReClass.NET/Memory/RemoteProcess.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 411cdcda..4c0b76b1 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -254,10 +254,10 @@ private void LoadAllSymbolsForCurrentProcess() int index = 0; - var progress = new Progress>>( + var progress = new Progress>>( report => { - infoToolStripStatusLabel.Text = $"[{++index}/{report.Item2.Count()}] Loading symbols for module: {report.Item1.Name}"; + infoToolStripStatusLabel.Text = $"[{++index}/{report.Item2.Count}] Loading symbols for module: {report.Item1.Name}"; } ); diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index b26275ec..9c24322d 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -744,7 +744,7 @@ public IntPtr ParseAddress(string addressFormula) /// The progress reporter is called for every module. Can be null. /// The token used to cancel the task. /// The task. - public Task LoadAllSymbolsAsync(IProgress>> progress, CancellationToken token) + public Task LoadAllSymbolsAsync(IProgress>> progress, CancellationToken token) { List copy; lock (modules) @@ -762,7 +762,7 @@ public Task LoadAllSymbolsAsync(IProgress>> pr { token.ThrowIfCancellationRequested(); - progress?.Report(Tuple.Create>(module, copy)); + progress?.Report(Tuple.Create>(module, copy)); Symbols.TryResolveSymbolsForModule(module); } From 8f7864e369063e1b55b73f02525afee9b1d7aa20 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 8 Mar 2019 23:21:17 +0100 Subject: [PATCH 505/777] Show enums in left view. --- ReClass.NET/Forms/MainForm.Functions.cs | 4 +- ReClass.NET/Forms/MainForm.cs | 5 + ReClass.NET/Project/ReClassNetProject.cs | 23 +++- ReClass.NET/UI/ClassNodeView.cs | 136 ++++++++++++++++++----- 4 files changed, 136 insertions(+), 32 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 4c0b76b1..ab358776 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -83,10 +83,12 @@ void UpdateClassNodes(BaseNode node) c.NodesChanged -= UpdateClassNodes; c.NameChanged -= UpdateClassNodes; }; + currentProject.EnumAdded += e => { classesView.AddEnum(e); }; ClassNode.ClassCreated += currentProject.AddClass; classesView.Clear(); + classesView.AddEnums(currentProject.Enums); classesView.AddClasses(currentProject.Classes); memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault(); } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index cc0b5fc4..e37173cc 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -879,6 +879,11 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent enumNode.GetParentContainer()?.ChildHasChanged(enumNode); } } + + foreach (var @enum in CurrentProject.Enums) + { + classesView.UpdateEnumNode(@enum); + } } } diff --git a/ReClass.NET/Project/ReClassNetProject.cs b/ReClass.NET/Project/ReClassNetProject.cs index 60a2b9bd..df69ce03 100644 --- a/ReClass.NET/Project/ReClassNetProject.cs +++ b/ReClass.NET/Project/ReClassNetProject.cs @@ -13,6 +13,10 @@ public class ReClassNetProject : IDisposable public event ClassesChangedEvent ClassAdded; public event ClassesChangedEvent ClassRemoved; + public delegate void EnumsChangedEvent(EnumMetaData sender); + public event EnumsChangedEvent EnumAdded; + public event EnumsChangedEvent EnumRemoved; + private readonly List enums = new List(); private readonly List classes = new List(); @@ -39,6 +43,9 @@ public void Dispose() ClassAdded = null; ClassRemoved = null; + + EnumAdded = null; + EnumRemoved = null; } public void AddClass(ClassNode node) @@ -83,6 +90,15 @@ public void Clear() ClassRemoved?.Invoke(node); } + + var temp2 = enums.ToList(); + + enums.Clear(); + + foreach (var @enum in temp2) + { + EnumRemoved?.Invoke(@enum); + } } private IEnumerable GetClassReferences(ClassNode node) @@ -132,6 +148,8 @@ public void AddEnum(EnumMetaData @enum) Contract.Requires(@enum != null); enums.Add(@enum); + + EnumAdded?.Invoke(@enum); } public void RemoveEnum(EnumMetaData @enum) @@ -144,7 +162,10 @@ public void RemoveEnum(EnumMetaData @enum) throw new EnumReferencedException(@enum, refrences.Select(e => e.GetParentClass()).Distinct()); } - enums.Remove(@enum); + if (enums.Remove(@enum)) + { + EnumRemoved?.Invoke(@enum); + } } private IEnumerable GetEnumReferences(EnumMetaData @enum) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index 686b64c8..a1b83781 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -6,6 +6,7 @@ using System.Windows.Forms; using ReClassNET.Extensions; using ReClassNET.Nodes; +using ReClassNET.Project; namespace ReClassNET.UI { @@ -93,22 +94,47 @@ private void RebuildClassHierarchy(HashSet seen) } } + public class EnumTreeNode : TreeNode + { + public EnumMetaData Enum { get; } + + public EnumTreeNode(EnumMetaData @enum) + { + Contract.Requires(@enum != null); + + Enum = @enum; + + ImageIndex = 3; + SelectedImageIndex = 3; + } + + public void Update() + { + Text = Enum.Name; + } + } + private class NodeSorter : IComparer { public int Compare(object x, object y) { var compare = Application.CurrentCulture.CompareInfo; - if (x is ClassTreeNode n1 && y is ClassTreeNode n2) + if (x is ClassTreeNode cn1 && y is ClassTreeNode cn2) { - return compare.Compare(n1.Text, n2.Text); + return compare.Compare(cn1.Text, cn2.Text); + } + if (x is EnumTreeNode en1 && y is EnumTreeNode en2) + { + return compare.Compare(en1.Text, en2.Text); } return 0; } } - private readonly TreeNode root; + private readonly TreeNode enumsRootNode; + private readonly TreeNode classesRootNode; private ClassNode selectedClass; @@ -166,9 +192,9 @@ public bool EnableClassHierarchyView { enableClassHierarchyView = value; - var classes = root.Nodes.Cast().Select(t => t.ClassNode).ToList(); + var classes = classesRootNode.Nodes.Cast().Select(t => t.ClassNode).ToList(); - root.Nodes.Clear(); + classesRootNode.Nodes.Clear(); AddClasses(classes); } @@ -181,7 +207,7 @@ public bool EnableClassHierarchyView public ClassNodeView() { - Contract.Ensures(root != null); + Contract.Ensures(classesRootNode != null); InitializeComponent(); @@ -191,15 +217,26 @@ public ClassNodeView() classesTreeView.ImageList = new ImageList(); classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Text_List_Bullets); classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Class_Type); + classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Category); + classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Enum_Type); - root = new TreeNode + classesRootNode = new TreeNode { Text = "Classes", ImageIndex = 0, SelectedImageIndex = 0 }; - classesTreeView.Nodes.Add(root); + classesTreeView.Nodes.Add(classesRootNode); + + enumsRootNode = new TreeNode + { + Text = "Enums", + ImageIndex = 2, + SelectedImageIndex = 2 + }; + + classesTreeView.Nodes.Add(enumsRootNode); } #region Event Handler @@ -242,7 +279,7 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e) var cms = ClassTreeNodeContextMenuStrip; cms?.Show(classesTreeView, e.Location); } - else + else if (node == classesRootNode) { var cms = ProjectTreeNodeContextMenuStrip; cms?.Show(classesTreeView, e.Location); @@ -277,12 +314,12 @@ private void classesTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArg public void ExpandAllClassNodes() { - root.ExpandAll(); + classesRootNode.ExpandAll(); } public void CollapseAllClassNodes() { - foreach (var tn in root.Nodes.Cast()) + foreach (var tn in classesRootNode.Nodes.Cast()) { tn.Collapse(); } @@ -290,7 +327,8 @@ public void CollapseAllClassNodes() public void Clear() { - root.Nodes.Clear(); + classesRootNode.Nodes.Clear(); + enumsRootNode.Nodes.Clear(); } /// Adds the class to the view. @@ -310,27 +348,16 @@ public void AddClasses(IEnumerable nodes) foreach (var node in nodes) { - AddClassInternal(node); + classesRootNode.Nodes.Add(new ClassTreeNode(node, this)); } + classesRootNode.Expand(); + classesTreeView.Sort(); classesTreeView.EndUpdate(); } - /// - /// Adds a new to the tree. - /// - /// The class to add. - private void AddClassInternal(ClassNode node) - { - Contract.Requires(node != null); - - root.Nodes.Add(new ClassTreeNode(node, this)); - - root.Expand(); - } - /// Removes the class from the view. /// The class to remove. public void RemoveClass(ClassNode node) @@ -344,9 +371,9 @@ public void RemoveClass(ClassNode node) if (selectedClass == node) { - if (root.Nodes.Count > 0) + if (classesRootNode.Nodes.Count > 0) { - classesTreeView.SelectedNode = root.Nodes[0]; + classesTreeView.SelectedNode = classesRootNode.Nodes[0]; } else { @@ -362,7 +389,7 @@ private ClassTreeNode FindMainClassTreeNode(ClassNode node) { Contract.Requires(node != null); - return root.Nodes + return classesRootNode.Nodes .Cast() .FirstOrDefault(t => t.ClassNode == node); } @@ -374,7 +401,7 @@ private IEnumerable FindClassTreeNodes(ClassNode node) { Contract.Requires(node != null); - return root.Nodes + return classesRootNode.Nodes .Cast() .Traverse(t => t.Nodes.Cast()) .Where(n => n.ClassNode == node); @@ -395,5 +422,54 @@ public void UpdateClassNode(ClassNode node) classesTreeView.EndUpdate(); } + + public void AddEnum(EnumMetaData @enum) + { + Contract.Requires(@enum != null); + + AddEnums(new[] { @enum }); + } + + public void AddEnums(IEnumerable enums) + { + Contract.Requires(enums != null); + + classesTreeView.BeginUpdate(); + + foreach (var @enum in enums) + { + enumsRootNode.Nodes.Add(new EnumTreeNode(@enum)); + } + + enumsRootNode.ExpandAll(); + + classesTreeView.Sort(); + + classesTreeView.EndUpdate(); + } + + public void UpdateEnumNode(EnumMetaData @enum) + { + Contract.Requires(@enum != null); + + classesTreeView.BeginUpdate(); + + var nodes = enumsRootNode.Nodes + .Cast() + .Where(n => n.Enum == @enum); + foreach (var tn in nodes) + { + tn.Update(); + } + + if (nodes.None()) + { + AddEnum(@enum); + } + + classesTreeView.Sort(); + + classesTreeView.EndUpdate(); + } } } From 088157dc346e2d67dc45224fb8a014e84600abe2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 9 Mar 2019 18:55:10 +0100 Subject: [PATCH 506/777] Prevent sorting of root nodes. --- ReClass.NET/UI/ClassNodeView.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ClassNodeView.cs index a1b83781..4884c521 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ClassNodeView.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -128,6 +128,10 @@ public int Compare(object x, object y) { return compare.Compare(en1.Text, en2.Text); } + if (x is TreeNode tn1 && tn1.Parent == null && y is TreeNode tn2 && tn2.Parent == null) + { + return (int)tn1.Tag - (int)tn2.Tag; + } return 0; } @@ -224,7 +228,8 @@ public ClassNodeView() { Text = "Classes", ImageIndex = 0, - SelectedImageIndex = 0 + SelectedImageIndex = 0, + Tag = 0 }; classesTreeView.Nodes.Add(classesRootNode); @@ -233,7 +238,8 @@ public ClassNodeView() { Text = "Enums", ImageIndex = 2, - SelectedImageIndex = 2 + SelectedImageIndex = 2, + Tag = 1 }; classesTreeView.Nodes.Add(enumsRootNode); From ea5dfa10ee843ea50f9d3c0d6816ab900e03d822 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 9 Mar 2019 19:02:34 +0100 Subject: [PATCH 507/777] Renamed class. --- ReClass.NET/Forms/MainForm.Designer.cs | 56 ++++++++-------- ReClass.NET/Forms/MainForm.Functions.cs | 14 ++-- ReClass.NET/Forms/MainForm.cs | 18 ++--- ReClass.NET/Forms/MainForm.resx | 4 +- ReClass.NET/ReClass.NET.csproj | 10 +-- ReClass.NET/UI/LinkedWindowFeatures.cs | 4 +- ...ew.Designer.cs => ProjectView.Designer.cs} | 36 +++++----- .../UI/{ClassNodeView.cs => ProjectView.cs} | 66 +++++++++---------- .../{ClassNodeView.resx => ProjectView.resx} | 0 9 files changed, 104 insertions(+), 104 deletions(-) rename ReClass.NET/UI/{ClassNodeView.Designer.cs => ProjectView.Designer.cs} (58%) rename ReClass.NET/UI/{ClassNodeView.cs => ProjectView.cs} (85%) rename ReClass.NET/UI/{ClassNodeView.resx => ProjectView.resx} (100%) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 6c1e0735..e0fd9b24 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -32,14 +32,14 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); this.splitContainer = new System.Windows.Forms.SplitContainer(); - this.classesView = new ReClassNET.UI.ClassNodeView(); - this.classTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.projectView = new ReClassNET.UI.ProjectView(); + this.projectClassTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.deleteClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); this.removeUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); this.showCodeOfClassToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.projectTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.projectClassesTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.enableHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.autoExpandHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); @@ -162,8 +162,8 @@ private void InitializeComponent() this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); - this.classTreeNodeContextMenuStrip.SuspendLayout(); - this.projectTreeNodeContextMenuStrip.SuspendLayout(); + this.projectClassTreeNodeContextMenuStrip.SuspendLayout(); + this.projectClassesTreeNodeContextMenuStrip.SuspendLayout(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.toolStrip.SuspendLayout(); this.statusStrip.SuspendLayout(); @@ -185,7 +185,7 @@ private void InitializeComponent() // // splitContainer.Panel1 // - this.splitContainer.Panel1.Controls.Add(this.classesView); + this.splitContainer.Panel1.Controls.Add(this.projectView); // // splitContainer.Panel2 // @@ -195,27 +195,27 @@ private void InitializeComponent() this.splitContainer.SplitterDistance = 201; this.splitContainer.TabIndex = 4; // - // classesView + // projectView // - this.classesView.ClassTreeNodeContextMenuStrip = this.classTreeNodeContextMenuStrip; - this.classesView.Dock = System.Windows.Forms.DockStyle.Fill; - this.classesView.Location = new System.Drawing.Point(0, 0); - this.classesView.Name = "classesView"; - this.classesView.ProjectTreeNodeContextMenuStrip = this.projectTreeNodeContextMenuStrip; - this.classesView.Size = new System.Drawing.Size(201, 524); - this.classesView.TabIndex = 0; - this.classesView.SelectionChanged += new ReClassNET.UI.ClassNodeView.SelectionChangedEvent(this.classesView_ClassSelected); + this.projectView.ClassTreeNodeContextMenuStrip = this.projectClassTreeNodeContextMenuStrip; + this.projectView.Dock = System.Windows.Forms.DockStyle.Fill; + this.projectView.Location = new System.Drawing.Point(0, 0); + this.projectView.Name = "projectView"; + this.projectView.ProjectTreeNodeContextMenuStrip = this.projectClassesTreeNodeContextMenuStrip; + this.projectView.Size = new System.Drawing.Size(201, 524); + this.projectView.TabIndex = 0; + this.projectView.SelectionChanged += new ReClassNET.UI.ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); // - // classTreeNodeContextMenuStrip + // projectClassTreeNodeContextMenuStrip // - this.classTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.projectClassTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.deleteClassToolStripMenuItem, this.toolStripSeparator19, this.removeUnusedClassesToolStripMenuItem, this.toolStripSeparator20, this.showCodeOfClassToolStripMenuItem2}); - this.classTreeNodeContextMenuStrip.Name = "contextMenuStrip"; - this.classTreeNodeContextMenuStrip.Size = new System.Drawing.Size(206, 82); + this.projectClassTreeNodeContextMenuStrip.Name = "contextMenuStrip"; + this.projectClassTreeNodeContextMenuStrip.Size = new System.Drawing.Size(206, 104); // // deleteClassToolStripMenuItem // @@ -251,9 +251,9 @@ private void InitializeComponent() this.showCodeOfClassToolStripMenuItem2.Text = "Show C++ Code of Class"; this.showCodeOfClassToolStripMenuItem2.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem2_Click); // - // projectTreeNodeContextMenuStrip + // projectClassesTreeNodeContextMenuStrip // - this.projectTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.projectClassesTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.enableHierarchyViewToolStripMenuItem, this.autoExpandHierarchyViewToolStripMenuItem, this.toolStripSeparator21, @@ -261,8 +261,8 @@ private void InitializeComponent() this.collapseAllClassesToolStripMenuItem, this.toolStripSeparator22, this.addNewClassToolStripMenuItem}); - this.projectTreeNodeContextMenuStrip.Name = "rootContextMenuStrip"; - this.projectTreeNodeContextMenuStrip.Size = new System.Drawing.Size(221, 126); + this.projectClassesTreeNodeContextMenuStrip.Name = "rootContextMenuStrip"; + this.projectClassesTreeNodeContextMenuStrip.Size = new System.Drawing.Size(221, 126); // // enableHierarchyViewToolStripMenuItem // @@ -1319,8 +1319,8 @@ private void InitializeComponent() this.splitContainer.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); this.splitContainer.ResumeLayout(false); - this.classTreeNodeContextMenuStrip.ResumeLayout(false); - this.projectTreeNodeContextMenuStrip.ResumeLayout(false); + this.projectClassTreeNodeContextMenuStrip.ResumeLayout(false); + this.projectClassesTreeNodeContextMenuStrip.ResumeLayout(false); this.selectedNodeContextMenuStrip.ResumeLayout(false); this.toolStrip.ResumeLayout(false); this.toolStrip.PerformLayout(); @@ -1387,7 +1387,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem addXBytesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem insertXBytesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator nodeTypesToolStripSeparator; - private UI.ClassNodeView classesView; + private UI.ProjectView projectView; private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem cleanUnusedClassesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; @@ -1450,13 +1450,13 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; private System.Windows.Forms.ToolStripMenuItem goToClassToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip classTreeNodeContextMenuStrip; + private System.Windows.Forms.ContextMenuStrip projectClassTreeNodeContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem deleteClassToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; private System.Windows.Forms.ToolStripMenuItem removeUnusedClassesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem2; - private System.Windows.Forms.ContextMenuStrip projectTreeNodeContextMenuStrip; + private System.Windows.Forms.ContextMenuStrip projectClassesTreeNodeContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem enableHierarchyViewToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem autoExpandHierarchyViewToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index ab358776..d81c927f 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -67,29 +67,29 @@ public void SetProject(ReClassNetProject newProject) void UpdateClassNodes(BaseNode node) { - classesView.UpdateClassNode((ClassNode)node); + projectView.UpdateClassNode((ClassNode)node); } currentProject = newProject; currentProject.ClassAdded += c => { - classesView.AddClass(c); + projectView.AddClass(c); c.NodesChanged += UpdateClassNodes; c.NameChanged += UpdateClassNodes; }; currentProject.ClassRemoved += c => { - classesView.RemoveClass(c); + projectView.RemoveClass(c); c.NodesChanged -= UpdateClassNodes; c.NameChanged -= UpdateClassNodes; }; - currentProject.EnumAdded += e => { classesView.AddEnum(e); }; + currentProject.EnumAdded += e => { projectView.AddEnum(e); }; ClassNode.ClassCreated += currentProject.AddClass; - classesView.Clear(); - classesView.AddEnums(currentProject.Enums); - classesView.AddClasses(currentProject.Classes); + projectView.Clear(); + projectView.AddEnums(currentProject.Enums); + projectView.AddClasses(currentProject.Classes); memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault(); } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index e37173cc..a27186aa 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -33,7 +33,7 @@ public partial class MainForm : IconForm private Task loadSymbolsTask; private CancellationTokenSource loadSymbolsTaskToken; - public ClassNodeView ClassView => classesView; + public ProjectView ProjectView => projectView; public MenuStrip MainMenu => mainMenuStrip; @@ -243,7 +243,7 @@ private void goToClassToolStripMenuItem_Click(object sender, EventArgs e) var selectedClassNode = csf.SelectedClass; if (selectedClassNode != null) { - classesView.SelectedClass = selectedClassNode; + projectView.SelectedClass = selectedClassNode; } } } @@ -882,14 +882,14 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent foreach (var @enum in CurrentProject.Enums) { - classesView.UpdateEnumNode(@enum); + projectView.UpdateEnumNode(@enum); } } } private void showCodeOfClassToolStripMenuItem2_Click(object sender, EventArgs e) { - var classNode = classesView.SelectedClass; + var classNode = projectView.SelectedClass; if (classNode == null) { return; @@ -906,7 +906,7 @@ private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs expandAllClassesToolStripMenuItem.Enabled = collapseAllClassesToolStripMenuItem.Enabled = isChecked; - classesView.EnableClassHierarchyView = isChecked; + projectView.EnableClassHierarchyView = isChecked; } private void autoExpandHierarchyViewToolStripMenuItem_Click(object sender, EventArgs e) @@ -915,17 +915,17 @@ private void autoExpandHierarchyViewToolStripMenuItem_Click(object sender, Event autoExpandHierarchyViewToolStripMenuItem.Checked = isChecked; - classesView.AutoExpandClassNodes = isChecked; + projectView.AutoExpandClassNodes = isChecked; } private void expandAllClassesToolStripMenuItem_Click(object sender, EventArgs e) { - classesView.ExpandAllClassNodes(); + projectView.ExpandAllClassNodes(); } private void collapseAllClassesToolStripMenuItem_Click(object sender, EventArgs e) { - classesView.CollapseAllClassNodes(); + projectView.CollapseAllClassNodes(); } private void removeUnusedClassesToolStripMenuItem_Click(object sender, EventArgs e) @@ -935,7 +935,7 @@ private void removeUnusedClassesToolStripMenuItem_Click(object sender, EventArgs private void deleteClassToolStripMenuItem_Click(object sender, EventArgs e) { - var classNode = classesView.SelectedClass; + var classNode = projectView.SelectedClass; if (classNode == null) { return; diff --git a/ReClass.NET/Forms/MainForm.resx b/ReClass.NET/Forms/MainForm.resx index 6f5154a5..69f3a7b7 100644 --- a/ReClass.NET/Forms/MainForm.resx +++ b/ReClass.NET/Forms/MainForm.resx @@ -120,10 +120,10 @@ 366, 17 - + 756, 17 - + 986, 17 diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index dee95d1a..e8d60d43 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -302,11 +302,11 @@ - + UserControl - - ClassNodeView.cs + + ProjectView.cs Form @@ -538,8 +538,8 @@ ScannerForm.cs - - ClassNodeView.cs + + ProjectView.cs Designer diff --git a/ReClass.NET/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs index 7e460160..623d9862 100644 --- a/ReClass.NET/UI/LinkedWindowFeatures.cs +++ b/ReClass.NET/UI/LinkedWindowFeatures.cs @@ -19,7 +19,7 @@ public static ClassNode CreateClassAtAddress(IntPtr address, bool addDefaultByte { Contract.Ensures(Contract.Result() != null); - var classView = Program.MainForm.ClassView; + var classView = Program.MainForm.ProjectView; var node = ClassNode.Create(); node.Address = address; @@ -50,7 +50,7 @@ public static ClassNode CreateDefaultClass() public static void SetCurrentClassAddress(IntPtr address) { - var classNode = Program.MainForm.ClassView.SelectedClass; + var classNode = Program.MainForm.ProjectView.SelectedClass; if (classNode == null) { return; diff --git a/ReClass.NET/UI/ClassNodeView.Designer.cs b/ReClass.NET/UI/ProjectView.Designer.cs similarity index 58% rename from ReClass.NET/UI/ClassNodeView.Designer.cs rename to ReClass.NET/UI/ProjectView.Designer.cs index e28397f0..53e5144d 100644 --- a/ReClass.NET/UI/ClassNodeView.Designer.cs +++ b/ReClass.NET/UI/ProjectView.Designer.cs @@ -1,6 +1,6 @@ namespace ReClassNET.UI { - partial class ClassNodeView + partial class ProjectView { /// /// Erforderliche Designervariable. @@ -28,30 +28,30 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.classesTreeView = new System.Windows.Forms.TreeView(); + this.projectTreeView = new System.Windows.Forms.TreeView(); this.SuspendLayout(); // - // classesTreeView + // projectTreeView // - this.classesTreeView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.classesTreeView.Dock = System.Windows.Forms.DockStyle.Fill; - this.classesTreeView.HideSelection = false; - this.classesTreeView.LabelEdit = true; - this.classesTreeView.Location = new System.Drawing.Point(0, 0); - this.classesTreeView.Name = "classesTreeView"; - this.classesTreeView.ShowRootLines = false; - this.classesTreeView.Size = new System.Drawing.Size(150, 150); - this.classesTreeView.TabIndex = 0; - this.classesTreeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_BeforeLabelEdit); - this.classesTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_AfterLabelEdit); - this.classesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.classesTreeView_AfterSelect); - this.classesTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.classesTreeView_MouseUp); + this.projectTreeView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.projectTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.projectTreeView.HideSelection = false; + this.projectTreeView.LabelEdit = true; + this.projectTreeView.Location = new System.Drawing.Point(0, 0); + this.projectTreeView.Name = "projectTreeView"; + this.projectTreeView.ShowRootLines = false; + this.projectTreeView.Size = new System.Drawing.Size(150, 150); + this.projectTreeView.TabIndex = 0; + this.projectTreeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_BeforeLabelEdit); + this.projectTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_AfterLabelEdit); + this.projectTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.classesTreeView_AfterSelect); + this.projectTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.classesTreeView_MouseUp); // // ClassNodeView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.classesTreeView); + this.Controls.Add(this.projectTreeView); this.Name = "ClassNodeView"; this.ResumeLayout(false); @@ -59,6 +59,6 @@ private void InitializeComponent() #endregion - private System.Windows.Forms.TreeView classesTreeView; + private System.Windows.Forms.TreeView projectTreeView; } } diff --git a/ReClass.NET/UI/ClassNodeView.cs b/ReClass.NET/UI/ProjectView.cs similarity index 85% rename from ReClass.NET/UI/ClassNodeView.cs rename to ReClass.NET/UI/ProjectView.cs index 4884c521..f67f9eb1 100644 --- a/ReClass.NET/UI/ClassNodeView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -10,26 +10,26 @@ namespace ReClassNET.UI { - public partial class ClassNodeView : UserControl + public partial class ProjectView : UserControl { /// A custom tree node for class nodes with hierarchical structure. private class ClassTreeNode : TreeNode { - private readonly ClassNodeView control; + private readonly ProjectView control; public ClassNode ClassNode { get; } /// Constructor of the class. /// The class node. - /// The instance this node should belong to. - public ClassTreeNode(ClassNode node, ClassNodeView control) + /// The instance this node should belong to. + public ClassTreeNode(ClassNode node, ProjectView control) : this(node, control, null) { Contract.Requires(node != null); Contract.Requires(control != null); } - private ClassTreeNode(ClassNode node, ClassNodeView control, HashSet seen) + private ClassTreeNode(ClassNode node, ProjectView control, HashSet seen) { Contract.Requires(node != null); Contract.Requires(control != null); @@ -160,7 +160,7 @@ public ClassNode SelectedClass selectedClass = value; if (selectedClass != null) { - classesTreeView.SelectedNode = FindMainClassTreeNode(selectedClass); + projectTreeView.SelectedNode = FindMainClassTreeNode(selectedClass); } SelectionChanged?.Invoke(this, selectedClass); @@ -209,7 +209,7 @@ public bool EnableClassHierarchyView public ContextMenuStrip ClassTreeNodeContextMenuStrip { get; set; } - public ClassNodeView() + public ProjectView() { Contract.Ensures(classesRootNode != null); @@ -217,12 +217,12 @@ public ClassNodeView() DoubleBuffered = true; - classesTreeView.TreeViewNodeSorter = new NodeSorter(); - classesTreeView.ImageList = new ImageList(); - classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Text_List_Bullets); - classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Class_Type); - classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Category); - classesTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Enum_Type); + projectTreeView.TreeViewNodeSorter = new NodeSorter(); + projectTreeView.ImageList = new ImageList(); + projectTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Text_List_Bullets); + projectTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Class_Type); + projectTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Category); + projectTreeView.ImageList.Images.Add(Properties.Resources.B16x16_Enum_Type); classesRootNode = new TreeNode { @@ -232,7 +232,7 @@ public ClassNodeView() Tag = 0 }; - classesTreeView.Nodes.Add(classesRootNode); + projectTreeView.Nodes.Add(classesRootNode); enumsRootNode = new TreeNode { @@ -242,7 +242,7 @@ public ClassNodeView() Tag = 1 }; - classesTreeView.Nodes.Add(enumsRootNode); + projectTreeView.Nodes.Add(enumsRootNode); } #region Event Handler @@ -272,7 +272,7 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e) return; } - var node = classesTreeView.GetNodeAt(e.X, e.Y); + var node = projectTreeView.GetNodeAt(e.X, e.Y); if (node == null) { return; @@ -280,15 +280,15 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e) if (node is ClassTreeNode) { - classesTreeView.SelectedNode = node; + projectTreeView.SelectedNode = node; var cms = ClassTreeNodeContextMenuStrip; - cms?.Show(classesTreeView, e.Location); + cms?.Show(projectTreeView, e.Location); } else if (node == classesRootNode) { var cms = ProjectTreeNodeContextMenuStrip; - cms?.Show(classesTreeView, e.Location); + cms?.Show(projectTreeView, e.Location); } } @@ -350,7 +350,7 @@ public void AddClasses(IEnumerable nodes) { Contract.Requires(nodes != null); - classesTreeView.BeginUpdate(); + projectTreeView.BeginUpdate(); foreach (var node in nodes) { @@ -359,9 +359,9 @@ public void AddClasses(IEnumerable nodes) classesRootNode.Expand(); - classesTreeView.Sort(); + projectTreeView.Sort(); - classesTreeView.EndUpdate(); + projectTreeView.EndUpdate(); } /// Removes the class from the view. @@ -379,7 +379,7 @@ public void RemoveClass(ClassNode node) { if (classesRootNode.Nodes.Count > 0) { - classesTreeView.SelectedNode = classesRootNode.Nodes[0]; + projectTreeView.SelectedNode = classesRootNode.Nodes[0]; } else { @@ -417,16 +417,16 @@ public void UpdateClassNode(ClassNode node) { Contract.Requires(node != null); - classesTreeView.BeginUpdate(); + projectTreeView.BeginUpdate(); foreach (var tn in FindClassTreeNodes(node)) { tn.Update(); } - classesTreeView.Sort(); + projectTreeView.Sort(); - classesTreeView.EndUpdate(); + projectTreeView.EndUpdate(); } public void AddEnum(EnumMetaData @enum) @@ -440,7 +440,7 @@ public void AddEnums(IEnumerable enums) { Contract.Requires(enums != null); - classesTreeView.BeginUpdate(); + projectTreeView.BeginUpdate(); foreach (var @enum in enums) { @@ -449,16 +449,16 @@ public void AddEnums(IEnumerable enums) enumsRootNode.ExpandAll(); - classesTreeView.Sort(); + projectTreeView.Sort(); - classesTreeView.EndUpdate(); + projectTreeView.EndUpdate(); } public void UpdateEnumNode(EnumMetaData @enum) { Contract.Requires(@enum != null); - classesTreeView.BeginUpdate(); + projectTreeView.BeginUpdate(); var nodes = enumsRootNode.Nodes .Cast() @@ -473,9 +473,9 @@ public void UpdateEnumNode(EnumMetaData @enum) AddEnum(@enum); } - classesTreeView.Sort(); + projectTreeView.Sort(); - classesTreeView.EndUpdate(); + projectTreeView.EndUpdate(); } } } diff --git a/ReClass.NET/UI/ClassNodeView.resx b/ReClass.NET/UI/ProjectView.resx similarity index 100% rename from ReClass.NET/UI/ClassNodeView.resx rename to ReClass.NET/UI/ProjectView.resx From 759ce7a825a5988d00fe8d20365ff80caa3fc0be Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 00:38:01 +0100 Subject: [PATCH 508/777] Renamed class. --- .../ReClass/ReClassNetFile.Read.cs | 6 +-- .../ReClass/ReClassNetFile.Write.cs | 4 +- ReClass.NET/Forms/EnumEditorForm.cs | 6 +-- ReClass.NET/Forms/EnumSelectionForm.cs | 4 +- ReClass.NET/Forms/MainForm.cs | 4 +- ReClass.NET/Nodes/EnumNode.cs | 38 +++++++++---------- .../{EnumMetaData.cs => EnumDescription.cs} | 4 +- ReClass.NET/Project/ReClassNetProject.cs | 18 ++++----- ReClass.NET/ReClass.NET.csproj | 2 +- ReClass.NET/UI/ProjectView.cs | 10 ++--- 10 files changed, 48 insertions(+), 48 deletions(-) rename ReClass.NET/Project/{EnumMetaData.cs => EnumDescription.cs} (94%) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 844405b8..fd32f013 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -74,7 +74,7 @@ public void Load(Stream input, ILogger logger) { var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; - var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); + var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); var values = new Dictionary(); foreach (var itemElement in enumElement.Elements(XmlItemElement)) @@ -85,7 +85,7 @@ public void Load(Stream input, ILogger logger) values.Add(itemName, itemValue); } - var @enum = new EnumMetaData + var @enum = new EnumDescription { Name = name }; @@ -299,7 +299,7 @@ ClassNode GetClassNodeFromElementReference() case EnumNode enumNode: { var enumName = element.Attribute(XmlReferenceAttribute)?.Value ?? string.Empty; - var @enum = project.Enums.FirstOrDefault(e => e.Name == enumName) ?? EnumMetaData.Default; + var @enum = project.Enums.FirstOrDefault(e => e.Name == enumName) ?? EnumDescription.Default; enumNode.ChangeEnum(@enum); break; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 885bf835..3ed5f5a3 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -46,7 +46,7 @@ public void Save(Stream output, ILogger logger) } } - private static IEnumerable CreateEnumElements(IEnumerable enums) + private static IEnumerable CreateEnumElements(IEnumerable enums) { return enums.Select(e => new XElement( XmlEnumElement, @@ -165,7 +165,7 @@ XElement CreateElement() } case EnumNode enumNode: { - element.SetAttributeValue(XmlReferenceAttribute, enumNode.MetaData.Name); + element.SetAttributeValue(XmlReferenceAttribute, enumNode.Enum.Name); break; } } diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index 6b2d48a3..8e1bdf77 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -10,9 +10,9 @@ namespace ReClassNET.Forms { public partial class EnumEditorForm : IconForm { - private readonly EnumMetaData @enum; + private readonly EnumDescription @enum; - public EnumEditorForm(EnumMetaData @enum) + public EnumEditorForm(EnumDescription @enum) { Contract.Requires(@enum != null); @@ -84,5 +84,5 @@ void SetErrorText(string text) } } - internal class UnderlyingSizeComboBox : EnumComboBox { } + internal class UnderlyingSizeComboBox : EnumComboBox { } } diff --git a/ReClass.NET/Forms/EnumSelectionForm.cs b/ReClass.NET/Forms/EnumSelectionForm.cs index cfc5a75b..83bca974 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.cs @@ -11,7 +11,7 @@ public partial class EnumSelectionForm : IconForm { private readonly ReClassNetProject project; - public EnumMetaData SelectedItem => itemListBox.SelectedItem as EnumMetaData; + public EnumDescription SelectedItem => itemListBox.SelectedItem as EnumDescription; public EnumSelectionForm(ReClassNetProject project) { @@ -64,7 +64,7 @@ private void editEnumIconButton_Click(object sender, EventArgs e) private void addEnumIconButton_Click(object sender, EventArgs e) { - var @enum = new EnumMetaData + var @enum = new EnumDescription { Name = "Enum" }; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index a27186aa..fad5745c 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -862,7 +862,7 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent { using (var csf = new EnumSelectionForm(CurrentProject)) { - var size = enumNode.MetaData.Size; + var size = enumNode.Enum.Size; if (csf.ShowDialog() == DialogResult.OK) { @@ -873,7 +873,7 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent } } - if (size != enumNode.MetaData.Size) + if (size != enumNode.Enum.Size) { // Update the parent container because the enum size has changed. enumNode.GetParentContainer()?.ChildHasChanged(enumNode); diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 9846d67d..070a3a8e 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -12,9 +12,9 @@ namespace ReClassNET.Nodes { public class EnumNode : BaseNode { - public override int MemorySize => (int)MetaData.Size; + public override int MemorySize => (int)Enum.Size; - public EnumMetaData MetaData { get; private set; } = EnumMetaData.Default; + public EnumDescription Enum { get; private set; } = EnumDescription.Default; public override void GetUserInterfaceInfo(out string name, out Image icon) { @@ -22,11 +22,11 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Enum; } - public void ChangeEnum(EnumMetaData @enum) + public void ChangeEnum(EnumDescription @enum) { Contract.Requires(@enum != null); - MetaData = @enum; + Enum = @enum; GetParentContainer()?.ChildHasChanged(this); } @@ -37,15 +37,15 @@ public void ChangeEnum(EnumMetaData @enum) /// public BaseNumericNode GetUnderlayingNode() { - switch (MetaData.Size) + switch (Enum.Size) { - case EnumMetaData.UnderlyingTypeSize.OneByte: + case EnumDescription.UnderlyingTypeSize.OneByte: return new UInt8Node(); - case EnumMetaData.UnderlyingTypeSize.TwoBytes: + case EnumDescription.UnderlyingTypeSize.TwoBytes: return new UInt16Node(); - case EnumMetaData.UnderlyingTypeSize.FourBytes: + case EnumDescription.UnderlyingTypeSize.FourBytes: return new UInt32Node(); - case EnumMetaData.UnderlyingTypeSize.EightBytes: + case EnumDescription.UnderlyingTypeSize.EightBytes: return new UInt64Node(); } @@ -54,15 +54,15 @@ public BaseNumericNode GetUnderlayingNode() public long ReadValueFromMemory(MemoryBuffer memory) { - switch (MetaData.Size) + switch (Enum.Size) { - case EnumMetaData.UnderlyingTypeSize.OneByte: + case EnumDescription.UnderlyingTypeSize.OneByte: return memory.ReadInt8(Offset); - case EnumMetaData.UnderlyingTypeSize.TwoBytes: + case EnumDescription.UnderlyingTypeSize.TwoBytes: return memory.ReadInt16(Offset); - case EnumMetaData.UnderlyingTypeSize.FourBytes: + case EnumDescription.UnderlyingTypeSize.FourBytes: return memory.ReadInt32(Offset); - case EnumMetaData.UnderlyingTypeSize.EightBytes: + case EnumDescription.UnderlyingTypeSize.EightBytes: return memory.ReadInt64(Offset); } @@ -71,15 +71,15 @@ public long ReadValueFromMemory(MemoryBuffer memory) private string GetStringRepresentation(long value) { - if (!MetaData.UseFlagsMode) + if (!Enum.UseFlagsMode) { - var index = MetaData.Values.FindIndex(kv => kv.Value == value); + var index = Enum.Values.FindIndex(kv => kv.Value == value); if (index == -1) { return value.ToString(); } - return MetaData.Values[index].Key; + return Enum.Values[index].Key; } return GetFlagsStringRepresentation(value); @@ -89,7 +89,7 @@ private string GetFlagsStringRepresentation(long value) { var result = (ulong)value; - var values = MetaData.Values; + var values = Enum.Values; var index = values.Count - 1; var retval = new StringBuilder(); @@ -158,7 +158,7 @@ public override Size Draw(ViewInfo view, int x, int y) { x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{MetaData.Name}>") + view.Font.Width; + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + view.Font.Width; x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; diff --git a/ReClass.NET/Project/EnumMetaData.cs b/ReClass.NET/Project/EnumDescription.cs similarity index 94% rename from ReClass.NET/Project/EnumMetaData.cs rename to ReClass.NET/Project/EnumDescription.cs index d2e8d106..e40d647c 100644 --- a/ReClass.NET/Project/EnumMetaData.cs +++ b/ReClass.NET/Project/EnumDescription.cs @@ -4,7 +4,7 @@ namespace ReClassNET.Project { - public class EnumMetaData + public class EnumDescription { public enum UnderlyingTypeSize { @@ -14,7 +14,7 @@ public enum UnderlyingTypeSize EightBytes = 8 } - public static EnumMetaData Default => new EnumMetaData { Name = "DummyEnum" }; + public static EnumDescription Default => new EnumDescription { Name = "DummyEnum" }; public string Name { get; set; } = string.Empty; diff --git a/ReClass.NET/Project/ReClassNetProject.cs b/ReClass.NET/Project/ReClassNetProject.cs index df69ce03..2154bf06 100644 --- a/ReClass.NET/Project/ReClassNetProject.cs +++ b/ReClass.NET/Project/ReClassNetProject.cs @@ -13,14 +13,14 @@ public class ReClassNetProject : IDisposable public event ClassesChangedEvent ClassAdded; public event ClassesChangedEvent ClassRemoved; - public delegate void EnumsChangedEvent(EnumMetaData sender); + public delegate void EnumsChangedEvent(EnumDescription sender); public event EnumsChangedEvent EnumAdded; public event EnumsChangedEvent EnumRemoved; - private readonly List enums = new List(); + private readonly List enums = new List(); private readonly List classes = new List(); - public IEnumerable Enums => enums; + public IEnumerable Enums => enums; public IEnumerable Classes => classes; @@ -143,7 +143,7 @@ public void RemoveUnusedClasses() } } - public void AddEnum(EnumMetaData @enum) + public void AddEnum(EnumDescription @enum) { Contract.Requires(@enum != null); @@ -152,7 +152,7 @@ public void AddEnum(EnumMetaData @enum) EnumAdded?.Invoke(@enum); } - public void RemoveEnum(EnumMetaData @enum) + public void RemoveEnum(EnumDescription @enum) { Contract.Requires(@enum != null); @@ -168,14 +168,14 @@ public void RemoveEnum(EnumMetaData @enum) } } - private IEnumerable GetEnumReferences(EnumMetaData @enum) + private IEnumerable GetEnumReferences(EnumDescription @enum) { Contract.Requires(@enum != null); return classes .SelectMany(c => c.Nodes.Where(n => n is EnumNode || (n as BaseWrapperNode)?.ResolveMostInnerNode() is EnumNode)) .Cast() - .Where(e => e.MetaData == @enum); + .Where(e => e.Enum == @enum); } } @@ -198,10 +198,10 @@ public ClassReferencedException(ClassNode node, IEnumerable reference public class EnumReferencedException : Exception { - public EnumMetaData Enum { get; } + public EnumDescription Enum { get; } public IEnumerable References { get; } - public EnumReferencedException(EnumMetaData @enum, IEnumerable references) + public EnumReferencedException(EnumDescription @enum, IEnumerable references) : base($"The enum '{@enum.Name}' is referenced in other classes.") { Contract.Requires(@enum != null); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index e8d60d43..faa05642 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -273,7 +273,7 @@ - + Component diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index f67f9eb1..6f481df4 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -96,9 +96,9 @@ private void RebuildClassHierarchy(HashSet seen) public class EnumTreeNode : TreeNode { - public EnumMetaData Enum { get; } + public EnumDescription Enum { get; } - public EnumTreeNode(EnumMetaData @enum) + public EnumTreeNode(EnumDescription @enum) { Contract.Requires(@enum != null); @@ -429,14 +429,14 @@ public void UpdateClassNode(ClassNode node) projectTreeView.EndUpdate(); } - public void AddEnum(EnumMetaData @enum) + public void AddEnum(EnumDescription @enum) { Contract.Requires(@enum != null); AddEnums(new[] { @enum }); } - public void AddEnums(IEnumerable enums) + public void AddEnums(IEnumerable enums) { Contract.Requires(enums != null); @@ -454,7 +454,7 @@ public void AddEnums(IEnumerable enums) projectTreeView.EndUpdate(); } - public void UpdateEnumNode(EnumMetaData @enum) + public void UpdateEnumNode(EnumDescription @enum) { Contract.Requires(@enum != null); From aae0b9d2f52c58798a135eafb7189ac223cb61a1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 00:45:57 +0100 Subject: [PATCH 509/777] Removed unused settings. --- ReClass.NET/Settings.cs | 36 ---------------- ReClass.NET/Util/SettingsSerializer.cs | 58 -------------------------- 2 files changed, 94 deletions(-) diff --git a/ReClass.NET/Settings.cs b/ReClass.NET/Settings.cs index 11ae5a72..16421515 100644 --- a/ReClass.NET/Settings.cs +++ b/ReClass.NET/Settings.cs @@ -67,42 +67,6 @@ public class Settings public Color PluginColor { get; set; } = Color.FromArgb(255, 0, 255); - // Type Definitions - - public string TypePadding { get; set; } = "char"; - - public string TypeBool { get; set; } = "bool"; - - public string TypeInt8 { get; set; } = "int8_t"; - public string TypeInt16 { get; set; } = "int16_t"; - public string TypeInt32 { get; set; } = "int32_t"; - public string TypeInt64 { get; set; } = "int64_t"; - - public string TypeUInt8 { get; set; } = "uint8_t"; - public string TypeUInt16 { get; set; } = "uint16_t"; - public string TypeUInt32 { get; set; } = "uint32_t"; - public string TypeUInt64 { get; set; } = "uint64_t"; - - public string TypeFloat { get; set; } = "float"; - public string TypeDouble { get; set; } = "double"; - - public string TypeVector2 { get; set; } = "Vector2"; - public string TypeVector3 { get; set; } = "Vector3"; - public string TypeVector4 { get; set; } = "Vector4"; - - public string TypeMatrix3x3 { get; set; } = "Matrix3x3"; - public string TypeMatrix3x4 { get; set; } = "Matrix3x4"; - public string TypeMatrix4x4 { get; set; } = "Matrix4x4"; - - public string TypeUTF8Text { get; set; } = "char"; - public string TypeUTF8TextPtr { get; set; } = "char*"; - public string TypeUTF16Text { get; set; } = "wchar_t"; // Should be char16_t, but this type isn't well supported at the moment. - public string TypeUTF16TextPtr { get; set; } = "wchar_t*"; - public string TypeUTF32Text { get; set; } = "char32_t"; - public string TypeUTF32TextPtr { get; set; } = "char32_t*"; - - public string TypeFunctionPtr { get; set; } = "void*"; - public CustomDataMap CustomData { get; } = new CustomDataMap(); public Settings Clone() => MemberwiseClone() as Settings; diff --git a/ReClass.NET/Util/SettingsSerializer.cs b/ReClass.NET/Util/SettingsSerializer.cs index 10842210..30897511 100644 --- a/ReClass.NET/Util/SettingsSerializer.cs +++ b/ReClass.NET/Util/SettingsSerializer.cs @@ -11,7 +11,6 @@ internal sealed class SettingsSerializer private const string XmlGeneralElement = "General"; private const string XmlDisplayElement = "Display"; private const string XmlColorsElement = "Colors"; - private const string XmlTypeDefinitionsElement = "TypeDefinitions"; private const string XmlCustomDataElement = "CustomData"; #region Read Settings @@ -69,35 +68,6 @@ public static Settings Load() XElementSerializer.TryRead(colors, nameof(settings.TextColor), e => settings.TextColor = XElementSerializer.ToColor(e)); XElementSerializer.TryRead(colors, nameof(settings.VTableColor), e => settings.VTableColor = XElementSerializer.ToColor(e)); } - var typeDefinitions = root?.Element(XmlTypeDefinitionsElement); - if (typeDefinitions != null) - { - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypePadding), e => settings.TypePadding = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeBool), e => settings.TypeBool = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeInt8), e => settings.TypeInt8 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeInt16), e => settings.TypeInt16 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeInt32), e => settings.TypeInt32 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeInt64), e => settings.TypeInt64 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUInt8), e => settings.TypeUInt8 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUInt16), e => settings.TypeUInt16 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUInt32), e => settings.TypeUInt32 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUInt64), e => settings.TypeUInt64 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeFloat), e => settings.TypeFloat = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeDouble), e => settings.TypeDouble = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeVector2), e => settings.TypeVector2 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeVector3), e => settings.TypeVector3 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeVector4), e => settings.TypeVector4 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeMatrix3x3), e => settings.TypeMatrix3x3 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeMatrix3x4), e => settings.TypeMatrix3x4 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeMatrix4x4), e => settings.TypeMatrix4x4 = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF8Text), e => settings.TypeUTF8Text = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF8TextPtr), e => settings.TypeUTF8TextPtr = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF16Text), e => settings.TypeUTF16Text = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF16TextPtr), e => settings.TypeUTF16TextPtr = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF32Text), e => settings.TypeUTF32Text = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeUTF32TextPtr), e => settings.TypeUTF32TextPtr = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(typeDefinitions, nameof(settings.TypeFunctionPtr), e => settings.TypeFunctionPtr = XElementSerializer.ToString(e)); - } var customData = root?.Element(XmlCustomDataElement); if (customData != null) { @@ -167,34 +137,6 @@ public static void Save(Settings settings) XElementSerializer.ToXml(nameof(settings.TextColor), settings.TextColor), XElementSerializer.ToXml(nameof(settings.VTableColor), settings.VTableColor) ), - new XElement( - XmlTypeDefinitionsElement, - XElementSerializer.ToXml(nameof(settings.TypePadding), settings.TypePadding), - XElementSerializer.ToXml(nameof(settings.TypeBool), settings.TypeBool), - XElementSerializer.ToXml(nameof(settings.TypeInt8), settings.TypeInt8), - XElementSerializer.ToXml(nameof(settings.TypeInt16), settings.TypeInt16), - XElementSerializer.ToXml(nameof(settings.TypeInt32), settings.TypeInt32), - XElementSerializer.ToXml(nameof(settings.TypeInt64), settings.TypeInt64), - XElementSerializer.ToXml(nameof(settings.TypeUInt8), settings.TypeUInt8), - XElementSerializer.ToXml(nameof(settings.TypeUInt16), settings.TypeUInt16), - XElementSerializer.ToXml(nameof(settings.TypeUInt32), settings.TypeUInt32), - XElementSerializer.ToXml(nameof(settings.TypeUInt64), settings.TypeUInt64), - XElementSerializer.ToXml(nameof(settings.TypeFloat), settings.TypeFloat), - XElementSerializer.ToXml(nameof(settings.TypeDouble), settings.TypeDouble), - XElementSerializer.ToXml(nameof(settings.TypeVector2), settings.TypeVector2), - XElementSerializer.ToXml(nameof(settings.TypeVector3), settings.TypeVector3), - XElementSerializer.ToXml(nameof(settings.TypeVector4), settings.TypeVector4), - XElementSerializer.ToXml(nameof(settings.TypeMatrix3x3), settings.TypeMatrix3x3), - XElementSerializer.ToXml(nameof(settings.TypeMatrix3x4), settings.TypeMatrix3x4), - XElementSerializer.ToXml(nameof(settings.TypeMatrix4x4), settings.TypeMatrix4x4), - XElementSerializer.ToXml(nameof(settings.TypeUTF8Text), settings.TypeUTF8Text), - XElementSerializer.ToXml(nameof(settings.TypeUTF8TextPtr), settings.TypeUTF8TextPtr), - XElementSerializer.ToXml(nameof(settings.TypeUTF16Text), settings.TypeUTF16Text), - XElementSerializer.ToXml(nameof(settings.TypeUTF16TextPtr), settings.TypeUTF16TextPtr), - XElementSerializer.ToXml(nameof(settings.TypeUTF32Text), settings.TypeUTF32Text), - XElementSerializer.ToXml(nameof(settings.TypeUTF32TextPtr), settings.TypeUTF32TextPtr), - XElementSerializer.ToXml(nameof(settings.TypeFunctionPtr), settings.TypeFunctionPtr) - ), settings.CustomData.Serialize(XmlCustomDataElement) ) ); From 0f22f0d9894c4967a9c20c2c7e801bc5f195424d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 01:11:44 +0100 Subject: [PATCH 510/777] Use IReadOnlyList. Moved methods to MainForm. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 4 +-- ReClass.NET/CodeGenerator/ICodeGenerator.cs | 4 +-- ReClass.NET/Forms/CodeForm.cs | 2 +- ReClass.NET/Forms/MainForm.Functions.cs | 33 +++++++++++++------ ReClass.NET/Forms/MainForm.cs | 8 ++--- ReClass.NET/Project/ReClassNetProject.cs | 4 +-- ReClass.NET/UI/LinkedWindowFeatures.cs | 16 --------- 7 files changed, 34 insertions(+), 37 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 5571ba2b..6789091a 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -108,9 +108,9 @@ public CppCodeGenerator(CppTypeMapping typeMapping) }; } - public string GenerateCode(IEnumerable classes, ILogger logger) + public string GenerateCode(IReadOnlyList classes, ILogger logger) { - var classNodes = classes as IList ?? classes.ToList(); + var classNodes = classes; var sb = new StringBuilder(); sb.AppendLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); diff --git a/ReClass.NET/CodeGenerator/ICodeGenerator.cs b/ReClass.NET/CodeGenerator/ICodeGenerator.cs index 525cb744..ff1951f3 100644 --- a/ReClass.NET/CodeGenerator/ICodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/ICodeGenerator.cs @@ -16,7 +16,7 @@ public interface ICodeGenerator /// The classes to generate code from. /// The logger used to output messages. /// The code for the classes. - string GenerateCode(IEnumerable classes, ILogger logger); + string GenerateCode(IReadOnlyList classes, ILogger logger); } [ContractClassFor(typeof(ICodeGenerator))] @@ -24,7 +24,7 @@ internal abstract class CodeGeneratorContract : ICodeGenerator { public Language Language => throw new NotImplementedException(); - public string GenerateCode(IEnumerable classes, ILogger logger) + public string GenerateCode(IReadOnlyList classes, ILogger logger) { Contract.Requires(classes != null); Contract.Requires(Contract.ForAll(classes, c => c != null)); diff --git a/ReClass.NET/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs index d6b08984..655ad9a6 100644 --- a/ReClass.NET/Forms/CodeForm.cs +++ b/ReClass.NET/Forms/CodeForm.cs @@ -19,7 +19,7 @@ namespace ReClassNET.Forms { public partial class CodeForm : IconForm { - public CodeForm(ICodeGenerator generator, IEnumerable classes, ILogger logger) + public CodeForm(ICodeGenerator generator, IReadOnlyList classes, ILogger logger) { Contract.Requires(generator != null); Contract.Requires(classes != null); diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index d81c927f..f9b948fe 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -20,8 +20,30 @@ namespace ReClassNET.Forms { - public partial class MainForm : IconForm + public partial class MainForm { + public void ShowDefaultCodeGeneratorForm(IReadOnlyList classes) + { + Contract.Requires(classes != null); + + ShowCodeGeneratorForm(classes, new CppCodeGenerator(currentProject.TypeMapping)); + } + + public void ShowCodeGeneratorForm(ICodeGenerator generator) + { + Contract.Requires(generator != null); + + ShowCodeGeneratorForm(currentProject.Classes, generator); + } + + public void ShowCodeGeneratorForm(IReadOnlyList classes, ICodeGenerator generator) + { + Contract.Requires(classes != null); + Contract.Requires(generator != null); + + new CodeForm(generator, classes, Program.Logger).Show(); + } + public void AttachToProcess(string processName) { var info = Program.CoreFunctions.EnumerateProcesses().FirstOrDefault(p => string.Equals(p.Name, processName, StringComparison.OrdinalIgnoreCase)); @@ -93,15 +115,6 @@ void UpdateClassNodes(BaseNode node) memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault(); } - /// Shows the code form with the given . - /// The generator. - private void ShowCodeForm(ICodeGenerator generator) - { - Contract.Requires(generator != null); - - LinkedWindowFeatures.ShowCodeGeneratorForm(currentProject.Classes, generator); - } - /// Opens the and calls with the result. /// The title of the input form. /// The function to call afterwards. diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index fad5745c..1e942c40 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -383,12 +383,12 @@ private void cleanUnusedClassesToolStripMenuItem_Click(object sender, EventArgs private void generateCppCodeToolStripMenuItem_Click(object sender, EventArgs e) { - ShowCodeForm(new CppCodeGenerator(CurrentProject.TypeMapping)); + ShowCodeGeneratorForm(new CppCodeGenerator(currentProject.TypeMapping)); } private void generateCSharpCodeToolStripMenuItem_Click(object sender, EventArgs e) { - ShowCodeForm(new CSharpCodeGenerator()); + ShowCodeGeneratorForm(new CSharpCodeGenerator()); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) @@ -679,7 +679,7 @@ private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) { if (memoryViewControl.GetSelectedNodes().FirstOrDefault()?.Node is ClassNode node) { - LinkedWindowFeatures.ShowCodeGeneratorForm(node.Yield(), CurrentProject.TypeMapping); + ShowDefaultCodeGeneratorForm(new[] { node }); } } @@ -895,7 +895,7 @@ private void showCodeOfClassToolStripMenuItem2_Click(object sender, EventArgs e) return; } - LinkedWindowFeatures.ShowCodeGeneratorForm(classNode.Yield(), CurrentProject.TypeMapping); + ShowDefaultCodeGeneratorForm(new[] { classNode }); } private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/ReClass.NET/Project/ReClassNetProject.cs b/ReClass.NET/Project/ReClassNetProject.cs index 2154bf06..c91a3286 100644 --- a/ReClass.NET/Project/ReClassNetProject.cs +++ b/ReClass.NET/Project/ReClassNetProject.cs @@ -20,9 +20,9 @@ public class ReClassNetProject : IDisposable private readonly List enums = new List(); private readonly List classes = new List(); - public IEnumerable Enums => enums; + public IReadOnlyList Enums => enums; - public IEnumerable Classes => classes; + public IReadOnlyList Classes => classes; public string Path { get; set; } diff --git a/ReClass.NET/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs index 623d9862..d2d4950d 100644 --- a/ReClass.NET/UI/LinkedWindowFeatures.cs +++ b/ReClass.NET/UI/LinkedWindowFeatures.cs @@ -132,21 +132,5 @@ public static void StartMemoryScan(IScanComparer comparer) sf.ExcuteScan(settings, comparer); } - - public static void ShowCodeGeneratorForm(IEnumerable classes, CppTypeMapping typeMapping) - { - Contract.Requires(classes != null); - Contract.Requires(typeMapping != null); - - ShowCodeGeneratorForm(classes, new CppCodeGenerator(typeMapping)); - } - - public static void ShowCodeGeneratorForm(IEnumerable classes, ICodeGenerator generator) - { - Contract.Requires(classes != null); - Contract.Requires(generator != null); - - new CodeForm(generator, classes, Program.Logger).Show(); - } } } From ccc87b656cb291f2bdf4a0c416594d52c7276cba Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 01:31:37 +0100 Subject: [PATCH 511/777] Added enum code generation. --- .../CodeGenerator/CSharpCodeGenerator.cs | 3 +- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 43 ++++++++++++++++++- ReClass.NET/CodeGenerator/ICodeGenerator.cs | 5 ++- ReClass.NET/Forms/CodeForm.cs | 7 +-- ReClass.NET/Forms/MainForm.Functions.cs | 13 +++--- ReClass.NET/Forms/MainForm.cs | 4 +- 6 files changed, 60 insertions(+), 15 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index dd9ee7c7..3ea62ec4 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -6,6 +6,7 @@ using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; +using ReClassNET.Project; namespace ReClassNET.CodeGenerator { @@ -35,7 +36,7 @@ public class CSharpCodeGenerator : ICodeGenerator public Language Language => Language.CSharp; - public string GenerateCode(IEnumerable classes, ILogger logger) + public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { var sb = new StringBuilder(); sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 6789091a..36ad51d3 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -108,13 +108,50 @@ public CppCodeGenerator(CppTypeMapping typeMapping) }; } - public string GenerateCode(IReadOnlyList classes, ILogger logger) + public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { var classNodes = classes; var sb = new StringBuilder(); sb.AppendLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); sb.AppendLine(); + sb.AppendLine( + string.Join( + Environment.NewLine + Environment.NewLine, + enums.Select(e => + { + var esb = new StringBuilder(); + esb.Append("enum class "); + esb.Append(e.Name); + esb.Append(" : "); + switch (e.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int8Node)]); + break; + case EnumDescription.UnderlyingTypeSize.TwoBytes: + esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int16Node)]); + break; + case EnumDescription.UnderlyingTypeSize.FourBytes: + esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int32Node)]); + break; + case EnumDescription.UnderlyingTypeSize.EightBytes: + esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int64Node)]); + break; + } + esb.AppendLine("{"); + esb.AppendLine( + string.Join( + "," + Environment.NewLine, + e.Values.Select(kv => $"\t{kv.Key} = {kv.Value}") + ) + ); + esb.AppendLine("};"); + + return esb.ToString(); + }) + ) + ); sb.AppendLine( string.Join( Environment.NewLine + Environment.NewLine, @@ -297,6 +334,10 @@ private string GetTypeDefinition(BaseNode node, ILogger logger) { return $"class {classInstanceNode.InnerNode.Name}"; } + if (node is EnumNode enumNode) + { + return enumNode.Enum.Name; + } return null; } diff --git a/ReClass.NET/CodeGenerator/ICodeGenerator.cs b/ReClass.NET/CodeGenerator/ICodeGenerator.cs index ff1951f3..159a64d4 100644 --- a/ReClass.NET/CodeGenerator/ICodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/ICodeGenerator.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using ReClassNET.Logger; using ReClassNET.Nodes; +using ReClassNET.Project; namespace ReClassNET.CodeGenerator { @@ -16,7 +17,7 @@ public interface ICodeGenerator /// The classes to generate code from. /// The logger used to output messages. /// The code for the classes. - string GenerateCode(IReadOnlyList classes, ILogger logger); + string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger); } [ContractClassFor(typeof(ICodeGenerator))] @@ -24,7 +25,7 @@ internal abstract class CodeGeneratorContract : ICodeGenerator { public Language Language => throw new NotImplementedException(); - public string GenerateCode(IReadOnlyList classes, ILogger logger) + public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { Contract.Requires(classes != null); Contract.Requires(Contract.ForAll(classes, c => c != null)); diff --git a/ReClass.NET/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs index 655ad9a6..8e94a4e3 100644 --- a/ReClass.NET/Forms/CodeForm.cs +++ b/ReClass.NET/Forms/CodeForm.cs @@ -11,24 +11,25 @@ using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; +using ReClassNET.Project; using ReClassNET.UI; -using ReClassNET.Util; using ReClassNET.Util.Rtf; namespace ReClassNET.Forms { public partial class CodeForm : IconForm { - public CodeForm(ICodeGenerator generator, IReadOnlyList classes, ILogger logger) + public CodeForm(ICodeGenerator generator, IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { Contract.Requires(generator != null); Contract.Requires(classes != null); + Contract.Requires(enums != null); InitializeComponent(); codeRichTextBox.SetInnerPadding(5, 5, 5, 5); - var code = generator.GenerateCode(classes, logger); + var code = generator.GenerateCode(classes, enums, logger); var buffer = new StringBuilder(code.Length * 2); using (var writer = new StringWriter(buffer)) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index f9b948fe..df790059 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -22,26 +22,27 @@ namespace ReClassNET.Forms { public partial class MainForm { - public void ShowDefaultCodeGeneratorForm(IReadOnlyList classes) + public void ShowPartialCodeGeneratorForm(IReadOnlyList partialClasses) { - Contract.Requires(classes != null); + Contract.Requires(partialClasses != null); - ShowCodeGeneratorForm(classes, new CppCodeGenerator(currentProject.TypeMapping)); + ShowCodeGeneratorForm(partialClasses, new EnumDescription[0], new CppCodeGenerator(currentProject.TypeMapping)); } public void ShowCodeGeneratorForm(ICodeGenerator generator) { Contract.Requires(generator != null); - ShowCodeGeneratorForm(currentProject.Classes, generator); + ShowCodeGeneratorForm(currentProject.Classes, currentProject.Enums, generator); } - public void ShowCodeGeneratorForm(IReadOnlyList classes, ICodeGenerator generator) + public void ShowCodeGeneratorForm(IReadOnlyList classes, IReadOnlyList enums, ICodeGenerator generator) { Contract.Requires(classes != null); Contract.Requires(generator != null); + Contract.Requires(enums != null); - new CodeForm(generator, classes, Program.Logger).Show(); + new CodeForm(generator, classes, enums, Program.Logger).Show(); } public void AttachToProcess(string processName) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 1e942c40..8cc7f6fc 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -679,7 +679,7 @@ private void showCodeOfClassToolStripMenuItem_Click(object sender, EventArgs e) { if (memoryViewControl.GetSelectedNodes().FirstOrDefault()?.Node is ClassNode node) { - ShowDefaultCodeGeneratorForm(new[] { node }); + ShowPartialCodeGeneratorForm(new[] { node }); } } @@ -895,7 +895,7 @@ private void showCodeOfClassToolStripMenuItem2_Click(object sender, EventArgs e) return; } - ShowDefaultCodeGeneratorForm(new[] { classNode }); + ShowPartialCodeGeneratorForm(new[] { classNode }); } private void enableHierarchyViewToolStripMenuItem_Click(object sender, EventArgs e) From 9c03b88419b086b728321db113da1031740c2339 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 01:31:59 +0100 Subject: [PATCH 512/777] Use explicit IEnumerable. --- ReClass.NET/Forms/EnumSelectionForm.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/EnumSelectionForm.cs b/ReClass.NET/Forms/EnumSelectionForm.cs index 83bca974..03d11d69 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; @@ -95,7 +96,7 @@ private void removeEnumIconButton_Click(object sender, EventArgs e) private void ShowFilteredEnums() { - var enums = project.Enums; + IEnumerable enums = project.Enums; if (!string.IsNullOrEmpty(filterNameTextBox.Text)) { From f147b317d66d4200c6d85ff3fac38045e5b65faf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 10 Mar 2019 19:18:18 +0100 Subject: [PATCH 513/777] Use internal parse. --- ReClass.NET/Forms/MainForm.Functions.cs | 2 -- ReClass.NET/Util/XElementSerializer.cs | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index df790059..c1e262f2 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; -using System.Drawing; using System.IO; using System.Linq; using System.Threading; @@ -377,7 +376,6 @@ private void PasteNodeFromClipboardToSelection() var classNode = selectedNode.GetParentClass(); if (containerNode != null && classNode != null) { - foreach (var node in result.Item2) { if (node is BaseWrapperNode) diff --git a/ReClass.NET/Util/XElementSerializer.cs b/ReClass.NET/Util/XElementSerializer.cs index 2249b4c8..bc96f697 100644 --- a/ReClass.NET/Util/XElementSerializer.cs +++ b/ReClass.NET/Util/XElementSerializer.cs @@ -28,8 +28,8 @@ public static bool TryRead(XContainer element, string name, Action iff return false; } - public static bool ToBool(XElement value) => bool.Parse(value.Value); - public static int ToInt(XElement value) => int.Parse(value.Value); + public static bool ToBool(XElement value) => (bool?)value ?? false; + public static int ToInt(XElement value) => (int?)value ?? 0; public static string ToString(XElement value) => value.Value; public static Color ToColor(XElement value) => Color.FromArgb((int)(0xFF000000 | int.Parse(value.Value, NumberStyles.HexNumber))); public static Dictionary ToDictionary(XContainer value) => value.Elements().ToDictionary(e => e.Name.ToString(), e => e.Value); From f7284287e0dc4954b4a03d3a84e073bee7dc4782 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 11 Mar 2019 16:12:06 +0100 Subject: [PATCH 514/777] Changed hotspot name. --- ReClass.NET/Nodes/BaseNode.cs | 4 ++-- ReClass.NET/UI/HotSpot.cs | 2 +- ReClass.NET/UI/MemoryViewControl.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 166e5bfa..a0db16c6 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -448,7 +448,7 @@ protected void AddTypeDrop(ViewInfo view, int y) if (IsSelected) { - AddIcon(view, 0, y, Icons.DropArrow, 0, HotSpotType.Drop); + AddIcon(view, 0, y, Icons.DropArrow, 0, HotSpotType.Context); } } diff --git a/ReClass.NET/UI/HotSpot.cs b/ReClass.NET/UI/HotSpot.cs index 6336ac0f..fc5e1dfc 100644 --- a/ReClass.NET/UI/HotSpot.cs +++ b/ReClass.NET/UI/HotSpot.cs @@ -11,12 +11,12 @@ public enum HotSpotType Edit, OpenClose, Select, - Drop, Click, DoubleClick, ChangeClassType, ChangeWrappedType, ChangeEnumType, + Context, Delete, Address, Name, diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index a485bd45..6206b847 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -353,7 +353,7 @@ protected override void OnMouseClick(MouseEventArgs e) invalidate = true; } - else if (hotSpot.Type == HotSpotType.Drop) + else if (hotSpot.Type == HotSpotType.Context) { ShowNodeContextMenu(e.Location); From 2254588556dd7b3ec042d474495a636e72a2aad7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 11 Mar 2019 16:13:22 +0100 Subject: [PATCH 515/777] Changed method names. --- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 8 ++++---- ReClass.NET/Nodes/BaseHexNode.cs | 8 ++++---- ReClass.NET/Nodes/BaseMatrixNode.cs | 16 ++++++++-------- ReClass.NET/Nodes/BaseNode.cs | 12 ++++++------ ReClass.NET/Nodes/BaseNumericNode.cs | 6 +++--- ReClass.NET/Nodes/BaseTextNode.cs | 6 +++--- ReClass.NET/Nodes/BaseTextPtrNode.cs | 6 +++--- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 8 ++++---- ReClass.NET/Nodes/BitFieldNode.cs | 8 ++++---- ReClass.NET/Nodes/BoolNode.cs | 6 +++--- ReClass.NET/Nodes/ClassInstanceNode.cs | 8 ++++---- ReClass.NET/Nodes/ClassNode.cs | 2 +- ReClass.NET/Nodes/EnumNode.cs | 8 ++++---- ReClass.NET/Nodes/FunctionNode.cs | 8 ++++---- ReClass.NET/Nodes/PointerNode.cs | 8 ++++---- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 8 ++++---- 16 files changed, 63 insertions(+), 63 deletions(-) diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 7dc00311..c151c674 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -51,7 +51,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, name) + view.Font.Width; } - x = AddOpenClose(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(view, x, y) + view.Font.Width; x = AddComment(view, x, y); @@ -71,9 +71,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) } } - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); var size = new Size(x - origX, view.Font.Height); diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index 130f4895..055aa689 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; @@ -88,9 +88,9 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 21d86f71..5a31bc84 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -45,15 +45,15 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr { x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); } - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); x += view.Font.Width; x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); if (LevelsOpen[view.Level]) { @@ -75,7 +75,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect return DrawHidden(view, x, y); } - DrawInvalidMemoryIndicator(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); var origX = x; var origY = y; @@ -92,7 +92,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect { x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); } - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); if (LevelsOpen[view.Level]) { @@ -103,8 +103,8 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect x = AddComment(view, x, y); - AddTypeDrop(view, y); - AddDelete(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, y - origY + view.Font.Height); } diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index a0db16c6..4f782c45 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -420,7 +420,7 @@ protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotTy /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the icon. - protected int AddOpenClose(ViewInfo view, int x, int y) + protected int AddOpenCloseIcon(ViewInfo view, int x, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); @@ -433,10 +433,10 @@ protected int AddOpenClose(ViewInfo view, int x, int y) return AddIcon(view, x, y, LevelsOpen[view.Level] ? Icons.OpenCloseOpen : Icons.OpenCloseClosed, 0, HotSpotType.OpenClose); } - /// Draws a type drop icon if the node is selected. + /// Draws a context drop icon if the node is selected. /// The view information. /// The y coordinate. - protected void AddTypeDrop(ViewInfo view, int y) + protected void AddContextDropDownIcon(ViewInfo view, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); @@ -455,7 +455,7 @@ protected void AddTypeDrop(ViewInfo view, int y) /// Draws a delete icon if the node is selected. /// The view information. /// The y coordinate. - protected void AddDelete(ViewInfo view, int y) + protected void AddDeleteIcon(ViewInfo view, int y) { Contract.Requires(view != null); Contract.Requires(view.Context != null); @@ -509,7 +509,7 @@ protected Size DrawHidden(ViewInfo view, int x, int y) /// Draws an error indicator if the used memory buffer is not valid. /// The view information. /// The y coordinate. - protected void DrawInvalidMemoryIndicator(ViewInfo view, int y) + protected void DrawInvalidMemoryIndicatorIcon(ViewInfo view, int y) { if (!view.Memory.ContainsValidData) { diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index 0445f92f..edbbfacc 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -50,9 +50,9 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 7e29193f..e5ab03ce 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -60,9 +60,9 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index e2114cd5..13857f2d 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -52,9 +52,9 @@ public Size DrawText(ViewInfo view, int x, int y, string type) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 9ad4b021..462940da 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -38,7 +38,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type) AddSelection(view, x, y, view.Font.Height); - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); x = AddIcon(view, x, y, Icons.Array, HotSpot.NoneId, HotSpotType.None); var tx = x; @@ -65,9 +65,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type) x += view.Font.Width; x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); y += view.Font.Height; diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index ca9c2ff4..174e811a 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -134,7 +134,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; } - x = AddOpenClose(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(view, x, y) + view.Font.Width; var tx = x - 3; @@ -149,9 +149,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); if (LevelsOpen[view.Level]) { diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 4702acd1..ba97f7ed 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -40,9 +40,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index 2a0846ef..49dd1ef2 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -29,7 +29,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); x = AddIcon(view, x, y, Icons.Class, HotSpot.NoneId, HotSpotType.None); var tx = x; @@ -45,9 +45,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); y += view.Font.Height; diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index deb68578..bd9f9ec3 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -106,7 +106,7 @@ public override Size Draw(ViewInfo view, int x, int y) var origX = x; var origY = y; - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); var tx = x; diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 070a3a8e..db5c064b 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -148,7 +148,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); x = AddIcon(view, x, y, Icons.Class, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); @@ -169,9 +169,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); return new Size(x - origX, view.Font.Height); } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index fdf7f09f..fb2dfe44 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -57,13 +57,13 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; } - x = AddOpenClose(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(view, x, y) + view.Font.Width; x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); var size = new Size(x - origX, view.Font.Height); diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index f07ffbff..04c001b1 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -59,7 +59,7 @@ public override Size Draw(ViewInfo view, int x, int y) if (InnerNode != null) { - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); } else { @@ -88,9 +88,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); y += view.Font.Height; diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index deda0b9b..76465ec9 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -45,7 +45,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x = AddOpenClose(view, x, y); + x = AddOpenCloseIcon(view, x, y); x = AddIcon(view, x, y, Icons.VTable, HotSpot.NoneId, HotSpotType.None); var tx = x; @@ -59,9 +59,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddComment(view, x, y); - DrawInvalidMemoryIndicator(view, y); - AddTypeDrop(view, y); - AddDelete(view, y); + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); y += view.Font.Height; From 2d1db0efd54c4d338a91c4feccb75a6c5542b899 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 09:40:04 +0100 Subject: [PATCH 516/777] Fixed warning. --- NativeCore/Windows/Input.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NativeCore/Windows/Input.cpp b/NativeCore/Windows/Input.cpp index 054397ed..8216bd07 100644 --- a/NativeCore/Windows/Input.cpp +++ b/NativeCore/Windows/Input.cpp @@ -11,6 +11,13 @@ Keys mapping[]; class DirectInput { public: + DirectInput() = default; + + DirectInput(const DirectInput&) = delete; + DirectInput(const DirectInput&&) = delete; + DirectInput& operator=(DirectInput const&) = delete; + DirectInput& operator=(DirectInput const&&) = delete; + ~DirectInput() { if (keyboardDevice) From b4fbc2e644e3165eb0728c4253660cc25f629620 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 10:46:25 +0100 Subject: [PATCH 517/777] Updated distorm to v3.4.1. --- .../Dependencies/distorm/include/distorm.h | 6 +- .../Dependencies/distorm/include/mnemonics.h | 482 +- NativeCore/Dependencies/distorm/src/config.h | 29 +- NativeCore/Dependencies/distorm/src/decoder.c | 2 +- NativeCore/Dependencies/distorm/src/distorm.c | 4 +- .../Dependencies/distorm/src/instructions.c | 2 +- .../Dependencies/distorm/src/instructions.h | 2 +- NativeCore/Dependencies/distorm/src/insts.c | 15799 ++++++++-------- NativeCore/Dependencies/distorm/src/insts.h | 2 +- .../Dependencies/distorm/src/mnemonics.c | 514 +- .../Dependencies/distorm/src/operands.c | 2 +- .../Dependencies/distorm/src/operands.h | 2 +- NativeCore/Dependencies/distorm/src/prefix.c | 2 +- NativeCore/Dependencies/distorm/src/prefix.h | 2 +- .../Dependencies/distorm/src/textdefs.c | 2 +- .../Dependencies/distorm/src/textdefs.h | 2 +- NativeCore/Dependencies/distorm/src/wstring.c | 2 +- NativeCore/Dependencies/distorm/src/wstring.h | 2 +- NativeCore/Dependencies/distorm/src/x86defs.h | 2 +- 19 files changed, 8450 insertions(+), 8410 deletions(-) diff --git a/NativeCore/Dependencies/distorm/include/distorm.h b/NativeCore/Dependencies/distorm/include/distorm.h index 10071646..d99bbc39 100644 --- a/NativeCore/Dependencies/distorm/include/distorm.h +++ b/NativeCore/Dependencies/distorm/include/distorm.h @@ -1,4 +1,4 @@ -/* diStorm 3.3.3 */ +/* diStorm 3.4.0 */ /* distorm.h @@ -6,7 +6,7 @@ distorm.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -471,7 +471,7 @@ typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR, D * * Output: unsigned int - version of compiled library. */ -unsigned int distorm_version(); +unsigned int distorm_version(void); #endif /* DISTORM_STATIC */ diff --git a/NativeCore/Dependencies/distorm/include/mnemonics.h b/NativeCore/Dependencies/distorm/include/mnemonics.h index ef9889c8..32d71be8 100644 --- a/NativeCore/Dependencies/distorm/include/mnemonics.h +++ b/NativeCore/Dependencies/distorm/include/mnemonics.h @@ -4,7 +4,7 @@ mnemonics.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -41,246 +41,246 @@ extern const _WRegister _REGISTERS[]; #define GET_MNEMONIC_NAME(m) ((_WMnemonic*)&_MNEMONICS[(m)])->p typedef enum { - I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3132, - I_ADDPS = 3125, I_ADDSD = 3146, I_ADDSS = 3139, I_ADDSUBPD = 6416, I_ADDSUBPS = 6426, - I_AESDEC = 9231, I_AESDECLAST = 9248, I_AESENC = 9189, I_AESENCLAST = 9206, - I_AESIMC = 9172, I_AESKEYGENASSIST = 9817, I_AND = 41, I_ANDNPD = 3043, I_ANDNPS = 3035, - I_ANDPD = 3012, I_ANDPS = 3005, I_ARPL = 111, I_BLENDPD = 9394, I_BLENDPS = 9375, - I_BLENDVPD = 7641, I_BLENDVPS = 7631, I_BOUND = 104, I_BSF = 4368, I_BSR = 4380, - I_BSWAP = 960, I_BT = 872, I_BTC = 934, I_BTR = 912, I_BTS = 887, I_CALL = 456, - I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLC = 492, I_CLD = 512, - I_CLFLUSH = 4351, I_CLGI = 1855, I_CLI = 502, I_CLTS = 541, I_CMC = 487, I_CMOVA = 694, - I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, I_CMOVGE = 738, - I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, I_CMOVNS = 708, - I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, I_CMOVZ = 671, - I_CMP = 71, I_CMPEQPD = 4471, I_CMPEQPS = 4392, I_CMPEQSD = 4629, I_CMPEQSS = 4550, - I_CMPLEPD = 4489, I_CMPLEPS = 4410, I_CMPLESD = 4647, I_CMPLESS = 4568, I_CMPLTPD = 4480, - I_CMPLTPS = 4401, I_CMPLTSD = 4638, I_CMPLTSS = 4559, I_CMPNEQPD = 4510, I_CMPNEQPS = 4431, - I_CMPNEQSD = 4668, I_CMPNEQSS = 4589, I_CMPNLEPD = 4530, I_CMPNLEPS = 4451, - I_CMPNLESD = 4688, I_CMPNLESS = 4609, I_CMPNLTPD = 4520, I_CMPNLTPS = 4441, - I_CMPNLTSD = 4678, I_CMPNLTSS = 4599, I_CMPORDPD = 4540, I_CMPORDPS = 4461, - I_CMPORDSD = 4698, I_CMPORDSS = 4619, I_CMPS = 301, I_CMPUNORDPD = 4498, I_CMPUNORDPS = 4419, - I_CMPUNORDSD = 4656, I_CMPUNORDSS = 4577, I_CMPXCHG = 898, I_CMPXCHG16B = 6395, - I_CMPXCHG8B = 6384, I_COMISD = 2801, I_COMISS = 2793, I_CPUID = 865, I_CQO = 255, - I_CRC32 = 9280, I_CVTDQ2PD = 6809, I_CVTDQ2PS = 3329, I_CVTPD2DQ = 6819, I_CVTPD2PI = 2703, - I_CVTPD2PS = 3255, I_CVTPH2PS = 4183, I_CVTPI2PD = 2517, I_CVTPI2PS = 2507, - I_CVTPS2DQ = 3339, I_CVTPS2PD = 3245, I_CVTPS2PH = 4193, I_CVTPS2PI = 2693, - I_CVTSD2SI = 2723, I_CVTSD2SS = 3275, I_CVTSI2SD = 2537, I_CVTSI2SS = 2527, - I_CVTSS2SD = 3265, I_CVTSS2SI = 2713, I_CVTTPD2DQ = 6798, I_CVTTPD2PI = 2636, - I_CVTTPS2DQ = 3349, I_CVTTPS2PI = 2625, I_CVTTSD2SI = 2658, I_CVTTSS2SI = 2647, - I_CWD = 245, I_CWDE = 233, I_DAA = 46, I_DAS = 56, I_DEC = 86, I_DIV = 1646, - I_DIVPD = 3521, I_DIVPS = 3514, I_DIVSD = 3535, I_DIVSS = 3528, I_DPPD = 9637, - I_DPPS = 9624, I_EMMS = 4122, I_ENTER = 340, I_EXTRACTPS = 9502, I_EXTRQ = 4158, - I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, I_FADDP = 1549, I_FBLD = 1601, - I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7311, I_FCMOVB = 1376, I_FCMOVBE = 1392, - I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, I_FCMOVNE = 1454, I_FCMOVNU = 1473, - I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, I_FCOMIP = 1623, I_FCOMP = 1041, - I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, I_FDIV = 1061, I_FDIVP = 1594, - I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, I_FEMMS = 574, I_FENI = 1482, - I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, I_FICOMP = 1338, I_FIDIV = 1361, - I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, I_FINCSTP = 1247, I_FINIT = 7326, - I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, I_FISUB = 1346, I_FISUBR = 1353, - I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, I_FLDENV = 1090, I_FLDL2E = 1155, - I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, I_FLDPI = 1163, I_FLDZ = 1186, - I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7303, I_FNINIT = 7318, I_FNOP = 1111, - I_FNSAVE = 7333, I_FNSTCW = 7288, I_FNSTENV = 7271, I_FNSTSW = 7348, I_FPATAN = 1213, - I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, I_FRNDINT = 1288, I_FRSTOR = 1519, - I_FSAVE = 7341, I_FSCALE = 1297, I_FSETPM = 1496, I_FSIN = 1305, I_FSINCOS = 1279, - I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7296, I_FSTENV = 7280, I_FSTP = 1084, - I_FSTSW = 7356, I_FSUB = 1048, I_FSUBP = 1579, I_FSUBR = 1054, I_FSUBRP = 1571, - I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, I_FUCOMIP = 1614, I_FUCOMP = 1541, - I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, I_FXRSTOR = 9914, I_FXRSTOR64 = 9923, - I_FXSAVE = 9886, I_FXSAVE64 = 9894, I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, - I_GETSEC = 633, I_HADDPD = 4203, I_HADDPS = 4211, I_HLT = 482, I_HSUBPD = 4237, - I_HSUBPS = 4245, I_IDIV = 1651, I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, - I_INSERTPS = 9569, I_INSERTQ = 4165, I_INT = 367, I_INT_3 = 360, I_INT1 = 476, - I_INTO = 372, I_INVD = 555, I_INVEPT = 8306, I_INVLPG = 1727, I_INVLPGA = 1869, - I_INVPCID = 8323, I_INVVPID = 8314, I_IRET = 378, I_JA = 166, I_JAE = 147, - I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, I_JG = 202, I_JGE = 192, - I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, I_JNO = 138, I_JNP = 183, - I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, I_JRCXZ = 440, I_JS = 170, - I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7016, I_LDMXCSR = 9944, I_LDS = 335, - I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4287, I_LFS = 917, I_LGDT = 1703, - I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, I_LODS = 313, I_LOOP = 421, - I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, I_LTR = 1674, I_LZCNT = 4385, - I_MASKMOVDQU = 7141, I_MASKMOVQ = 7131, I_MAXPD = 3581, I_MAXPS = 3574, I_MAXSD = 3595, - I_MAXSS = 3588, I_MFENCE = 4313, I_MINPD = 3461, I_MINPS = 3454, I_MINSD = 3475, - I_MINSS = 3468, I_MONITOR = 1771, I_MOV = 218, I_MOVAPD = 2481, I_MOVAPS = 2473, - I_MOVBE = 9273, I_MOVD = 3942, I_MOVDDUP = 2208, I_MOVDQ2Q = 6544, I_MOVDQA = 3968, - I_MOVDQU = 3976, I_MOVHLPS = 2173, I_MOVHPD = 2367, I_MOVHPS = 2359, I_MOVLHPS = 2350, - I_MOVLPD = 2190, I_MOVLPS = 2182, I_MOVMSKPD = 2837, I_MOVMSKPS = 2827, I_MOVNTDQ = 6871, - I_MOVNTDQA = 7917, I_MOVNTI = 952, I_MOVNTPD = 2578, I_MOVNTPS = 2569, I_MOVNTQ = 6863, - I_MOVNTSD = 2596, I_MOVNTSS = 2587, I_MOVQ = 3948, I_MOVQ2DQ = 6535, I_MOVS = 295, - I_MOVSD = 2132, I_MOVSHDUP = 2375, I_MOVSLDUP = 2198, I_MOVSS = 2125, I_MOVSX = 939, - I_MOVSXD = 10027, I_MOVUPD = 2117, I_MOVUPS = 2109, I_MOVZX = 927, I_MPSADBW = 9650, - I_MUL = 1641, I_MULPD = 3192, I_MULPS = 3185, I_MULSD = 3206, I_MULSS = 3199, - I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, I_NOT = 1631, I_OR = 27, I_ORPD = 3075, - I_ORPS = 3069, I_OUT = 451, I_OUTS = 128, I_PABSB = 7710, I_PABSD = 7740, I_PABSW = 7725, - I_PACKSSDW = 3871, I_PACKSSWB = 3703, I_PACKUSDW = 7938, I_PACKUSWB = 3781, - I_PADDB = 7226, I_PADDD = 7256, I_PADDQ = 6503, I_PADDSB = 6952, I_PADDSW = 6969, - I_PADDUSB = 6642, I_PADDUSW = 6661, I_PADDW = 7241, I_PALIGNR = 9432, I_PAND = 6629, - I_PANDN = 6687, I_PAUSE = 10035, I_PAVGB = 6702, I_PAVGUSB = 2100, I_PAVGW = 6747, - I_PBLENDVB = 7621, I_PBLENDW = 9413, I_PCLMULQDQ = 9669, I_PCMPEQB = 4065, - I_PCMPEQD = 4103, I_PCMPEQQ = 7898, I_PCMPEQW = 4084, I_PCMPESTRI = 9748, - I_PCMPESTRM = 9725, I_PCMPGTB = 3724, I_PCMPGTD = 3762, I_PCMPGTQ = 8109, - I_PCMPGTW = 3743, I_PCMPISTRI = 9794, I_PCMPISTRM = 9771, I_PEXTRB = 9451, - I_PEXTRD = 9468, I_PEXTRQ = 9476, I_PEXTRW = 6333, I_PF2ID = 1936, I_PF2IW = 1929, - I_PFACC = 2050, I_PFADD = 1999, I_PFCMPEQ = 2057, I_PFCMPGE = 1960, I_PFCMPGT = 2006, - I_PFMAX = 2015, I_PFMIN = 1969, I_PFMUL = 2066, I_PFNACC = 1943, I_PFPNACC = 1951, - I_PFRCP = 1976, I_PFRCPIT1 = 2022, I_PFRCPIT2 = 2073, I_PFRSQIT1 = 2032, I_PFRSQRT = 1983, - I_PFSUB = 1992, I_PFSUBR = 2042, I_PHADDD = 7397, I_PHADDSW = 7414, I_PHADDW = 7380, - I_PHMINPOSUW = 8281, I_PHSUBD = 7473, I_PHSUBSW = 7490, I_PHSUBW = 7456, I_PI2FD = 1922, - I_PI2FW = 1915, I_PINSRB = 9552, I_PINSRD = 9590, I_PINSRQ = 9598, I_PINSRW = 6316, - I_PMADDUBSW = 7433, I_PMADDWD = 7095, I_PMAXSB = 8196, I_PMAXSD = 8213, I_PMAXSW = 6986, - I_PMAXUB = 6670, I_PMAXUD = 8247, I_PMAXUW = 8230, I_PMINSB = 8128, I_PMINSD = 8145, - I_PMINSW = 6924, I_PMINUB = 6612, I_PMINUD = 8179, I_PMINUW = 8162, I_PMOVMSKB = 6553, - I_PMOVSXBD = 7776, I_PMOVSXBQ = 7797, I_PMOVSXBW = 7755, I_PMOVSXDQ = 7860, - I_PMOVSXWD = 7818, I_PMOVSXWQ = 7839, I_PMOVZXBD = 8004, I_PMOVZXBQ = 8025, - I_PMOVZXBW = 7983, I_PMOVZXDQ = 8088, I_PMOVZXWD = 8046, I_PMOVZXWQ = 8067, - I_PMULDQ = 7881, I_PMULHRSW = 7560, I_PMULHRW = 2083, I_PMULHUW = 6762, I_PMULHW = 6781, - I_PMULLD = 8264, I_PMULLW = 6518, I_PMULUDQ = 7076, I_POP = 22, I_POPA = 98, - I_POPCNT = 4360, I_POPF = 277, I_POR = 6941, I_PREFETCH = 1894, I_PREFETCHNTA = 2424, - I_PREFETCHT0 = 2437, I_PREFETCHT1 = 2449, I_PREFETCHT2 = 2461, I_PREFETCHW = 1904, - I_PSADBW = 7114, I_PSHUFB = 7363, I_PSHUFD = 4010, I_PSHUFHW = 4018, I_PSHUFLW = 4027, - I_PSHUFW = 4002, I_PSIGNB = 7509, I_PSIGND = 7543, I_PSIGNW = 7526, I_PSLLD = 7046, - I_PSLLDQ = 9869, I_PSLLQ = 7061, I_PSLLW = 7031, I_PSRAD = 6732, I_PSRAW = 6717, - I_PSRLD = 6473, I_PSRLDQ = 9852, I_PSRLQ = 6488, I_PSRLW = 6458, I_PSUBB = 7166, - I_PSUBD = 7196, I_PSUBQ = 7211, I_PSUBSB = 6890, I_PSUBSW = 6907, I_PSUBUSB = 6574, - I_PSUBUSW = 6593, I_PSUBW = 7181, I_PSWAPD = 2092, I_PTEST = 7651, I_PUNPCKHBW = 3802, - I_PUNPCKHDQ = 3848, I_PUNPCKHQDQ = 3917, I_PUNPCKHWD = 3825, I_PUNPCKLBW = 3634, - I_PUNPCKLDQ = 3680, I_PUNPCKLQDQ = 3892, I_PUNPCKLWD = 3657, I_PUSH = 16, - I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7003, I_RCL = 977, I_RCPPS = 2975, I_RCPSS = 2982, - I_RCR = 982, I_RDFSBASE = 9904, I_RDGSBASE = 9934, I_RDMSR = 600, I_RDPMC = 607, - I_RDRAND = 10048, I_RDTSC = 593, I_RDTSCP = 1886, I_RET = 325, I_RETF = 354, - I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9318, I_ROUNDPS = 9299, I_ROUNDSD = 9356, - I_ROUNDSS = 9337, I_RSM = 882, I_RSQRTPS = 2937, I_RSQRTSS = 2946, I_SAHF = 283, - I_SAL = 997, I_SALC = 394, I_SAR = 1002, I_SBB = 36, I_SCAS = 319, I_SETA = 807, - I_SETAE = 780, I_SETB = 774, I_SETBE = 800, I_SETG = 859, I_SETGE = 845, I_SETL = 839, - I_SETLE = 852, I_SETNO = 767, I_SETNP = 832, I_SETNS = 819, I_SETNZ = 793, - I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4343, I_SGDT = 1691, - I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6358, I_SHUFPS = 6350, - I_SIDT = 1697, I_SKINIT = 1861, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2877, - I_SQRTPS = 2869, I_SQRTSD = 2893, I_SQRTSS = 2885, I_STC = 497, I_STD = 517, - I_STGI = 1849, I_STI = 507, I_STMXCSR = 9973, I_STOS = 307, I_STR = 1663, I_SUB = 51, - I_SUBPD = 3401, I_SUBPS = 3394, I_SUBSD = 3415, I_SUBSS = 3408, I_SWAPGS = 1878, - I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, I_TEST = 206, - I_TZCNT = 4373, I_UCOMISD = 2764, I_UCOMISS = 2755, I_UD2 = 569, I_UNPCKHPD = 2318, - I_UNPCKHPS = 2308, I_UNPCKLPD = 2276, I_UNPCKLPS = 2266, I_VADDPD = 3161, - I_VADDPS = 3153, I_VADDSD = 3177, I_VADDSS = 3169, I_VADDSUBPD = 6436, I_VADDSUBPS = 6447, - I_VAESDEC = 9239, I_VAESDECLAST = 9260, I_VAESENC = 9197, I_VAESENCLAST = 9218, - I_VAESIMC = 9180, I_VAESKEYGENASSIST = 9834, I_VANDNPD = 3060, I_VANDNPS = 3051, - I_VANDPD = 3027, I_VANDPS = 3019, I_VBLENDPD = 9403, I_VBLENDPS = 9384, I_VBLENDVPD = 9703, - I_VBLENDVPS = 9692, I_VBROADCASTF128 = 7694, I_VBROADCASTSD = 7680, I_VBROADCASTSS = 7666, - I_VCMPEQPD = 5110, I_VCMPEQPS = 4708, I_VCMPEQSD = 5914, I_VCMPEQSS = 5512, - I_VCMPEQ_OSPD = 5291, I_VCMPEQ_OSPS = 4889, I_VCMPEQ_OSSD = 6095, I_VCMPEQ_OSSS = 5693, - I_VCMPEQ_UQPD = 5197, I_VCMPEQ_UQPS = 4795, I_VCMPEQ_UQSD = 6001, I_VCMPEQ_UQSS = 5599, - I_VCMPEQ_USPD = 5400, I_VCMPEQ_USPS = 4998, I_VCMPEQ_USSD = 6204, I_VCMPEQ_USSS = 5802, - I_VCMPFALSEPD = 5232, I_VCMPFALSEPS = 4830, I_VCMPFALSESD = 6036, I_VCMPFALSESS = 5634, - I_VCMPFALSE_OSPD = 5441, I_VCMPFALSE_OSPS = 5039, I_VCMPFALSE_OSSD = 6245, - I_VCMPFALSE_OSSS = 5843, I_VCMPGEPD = 5259, I_VCMPGEPS = 4857, I_VCMPGESD = 6063, - I_VCMPGESS = 5661, I_VCMPGE_OQPD = 5471, I_VCMPGE_OQPS = 5069, I_VCMPGE_OQSD = 6275, - I_VCMPGE_OQSS = 5873, I_VCMPGTPD = 5269, I_VCMPGTPS = 4867, I_VCMPGTSD = 6073, - I_VCMPGTSS = 5671, I_VCMPGT_OQPD = 5484, I_VCMPGT_OQPS = 5082, I_VCMPGT_OQSD = 6288, - I_VCMPGT_OQSS = 5886, I_VCMPLEPD = 5130, I_VCMPLEPS = 4728, I_VCMPLESD = 5934, - I_VCMPLESS = 5532, I_VCMPLE_OQPD = 5317, I_VCMPLE_OQPS = 4915, I_VCMPLE_OQSD = 6121, - I_VCMPLE_OQSS = 5719, I_VCMPLTPD = 5120, I_VCMPLTPS = 4718, I_VCMPLTSD = 5924, - I_VCMPLTSS = 5522, I_VCMPLT_OQPD = 5304, I_VCMPLT_OQPS = 4902, I_VCMPLT_OQSD = 6108, - I_VCMPLT_OQSS = 5706, I_VCMPNEQPD = 5153, I_VCMPNEQPS = 4751, I_VCMPNEQSD = 5957, - I_VCMPNEQSS = 5555, I_VCMPNEQ_OQPD = 5245, I_VCMPNEQ_OQPS = 4843, I_VCMPNEQ_OQSD = 6049, - I_VCMPNEQ_OQSS = 5647, I_VCMPNEQ_OSPD = 5457, I_VCMPNEQ_OSPS = 5055, I_VCMPNEQ_OSSD = 6261, - I_VCMPNEQ_OSSS = 5859, I_VCMPNEQ_USPD = 5345, I_VCMPNEQ_USPS = 4943, I_VCMPNEQ_USSD = 6149, - I_VCMPNEQ_USSS = 5747, I_VCMPNGEPD = 5210, I_VCMPNGEPS = 4808, I_VCMPNGESD = 6014, - I_VCMPNGESS = 5612, I_VCMPNGE_UQPD = 5413, I_VCMPNGE_UQPS = 5011, I_VCMPNGE_UQSD = 6217, - I_VCMPNGE_UQSS = 5815, I_VCMPNGTPD = 5221, I_VCMPNGTPS = 4819, I_VCMPNGTSD = 6025, - I_VCMPNGTSS = 5623, I_VCMPNGT_UQPD = 5427, I_VCMPNGT_UQPS = 5025, I_VCMPNGT_UQSD = 6231, - I_VCMPNGT_UQSS = 5829, I_VCMPNLEPD = 5175, I_VCMPNLEPS = 4773, I_VCMPNLESD = 5979, - I_VCMPNLESS = 5577, I_VCMPNLE_UQPD = 5373, I_VCMPNLE_UQPS = 4971, I_VCMPNLE_UQSD = 6177, - I_VCMPNLE_UQSS = 5775, I_VCMPNLTPD = 5164, I_VCMPNLTPS = 4762, I_VCMPNLTSD = 5968, - I_VCMPNLTSS = 5566, I_VCMPNLT_UQPD = 5359, I_VCMPNLT_UQPS = 4957, I_VCMPNLT_UQSD = 6163, - I_VCMPNLT_UQSS = 5761, I_VCMPORDPD = 5186, I_VCMPORDPS = 4784, I_VCMPORDSD = 5990, - I_VCMPORDSS = 5588, I_VCMPORD_SPD = 5387, I_VCMPORD_SPS = 4985, I_VCMPORD_SSD = 6191, - I_VCMPORD_SSS = 5789, I_VCMPTRUEPD = 5279, I_VCMPTRUEPS = 4877, I_VCMPTRUESD = 6083, - I_VCMPTRUESS = 5681, I_VCMPTRUE_USPD = 5497, I_VCMPTRUE_USPS = 5095, I_VCMPTRUE_USSD = 6301, - I_VCMPTRUE_USSS = 5899, I_VCMPUNORDPD = 5140, I_VCMPUNORDPS = 4738, I_VCMPUNORDSD = 5944, - I_VCMPUNORDSS = 5542, I_VCMPUNORD_SPD = 5330, I_VCMPUNORD_SPS = 4928, I_VCMPUNORD_SSD = 6134, - I_VCMPUNORD_SSS = 5732, I_VCOMISD = 2818, I_VCOMISS = 2809, I_VCVTDQ2PD = 6841, - I_VCVTDQ2PS = 3360, I_VCVTPD2DQ = 6852, I_VCVTPD2PS = 3296, I_VCVTPS2DQ = 3371, - I_VCVTPS2PD = 3285, I_VCVTSD2SI = 2744, I_VCVTSD2SS = 3318, I_VCVTSI2SD = 2558, - I_VCVTSI2SS = 2547, I_VCVTSS2SD = 3307, I_VCVTSS2SI = 2733, I_VCVTTPD2DQ = 6829, - I_VCVTTPS2DQ = 3382, I_VCVTTSD2SI = 2681, I_VCVTTSS2SI = 2669, I_VDIVPD = 3550, - I_VDIVPS = 3542, I_VDIVSD = 3566, I_VDIVSS = 3558, I_VDPPD = 9643, I_VDPPS = 9630, - I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9538, I_VEXTRACTPS = 9513, - I_VFMADD132PD = 8409, I_VFMADD132PS = 8396, I_VFMADD132SD = 8435, I_VFMADD132SS = 8422, - I_VFMADD213PD = 8689, I_VFMADD213PS = 8676, I_VFMADD213SD = 8715, I_VFMADD213SS = 8702, - I_VFMADD231PD = 8969, I_VFMADD231PS = 8956, I_VFMADD231SD = 8995, I_VFMADD231SS = 8982, - I_VFMADDSUB132PD = 8348, I_VFMADDSUB132PS = 8332, I_VFMADDSUB213PD = 8628, - I_VFMADDSUB213PS = 8612, I_VFMADDSUB231PD = 8908, I_VFMADDSUB231PS = 8892, - I_VFMSUB132PD = 8461, I_VFMSUB132PS = 8448, I_VFMSUB132SD = 8487, I_VFMSUB132SS = 8474, - I_VFMSUB213PD = 8741, I_VFMSUB213PS = 8728, I_VFMSUB213SD = 8767, I_VFMSUB213SS = 8754, - I_VFMSUB231PD = 9021, I_VFMSUB231PS = 9008, I_VFMSUB231SD = 9047, I_VFMSUB231SS = 9034, - I_VFMSUBADD132PD = 8380, I_VFMSUBADD132PS = 8364, I_VFMSUBADD213PD = 8660, - I_VFMSUBADD213PS = 8644, I_VFMSUBADD231PD = 8940, I_VFMSUBADD231PS = 8924, - I_VFNMADD132PD = 8514, I_VFNMADD132PS = 8500, I_VFNMADD132SD = 8542, I_VFNMADD132SS = 8528, - I_VFNMADD213PD = 8794, I_VFNMADD213PS = 8780, I_VFNMADD213SD = 8822, I_VFNMADD213SS = 8808, - I_VFNMADD231PD = 9074, I_VFNMADD231PS = 9060, I_VFNMADD231SD = 9102, I_VFNMADD231SS = 9088, - I_VFNMSUB132PD = 8570, I_VFNMSUB132PS = 8556, I_VFNMSUB132SD = 8598, I_VFNMSUB132SS = 8584, - I_VFNMSUB213PD = 8850, I_VFNMSUB213PS = 8836, I_VFNMSUB213SD = 8878, I_VFNMSUB213SS = 8864, - I_VFNMSUB231PD = 9130, I_VFNMSUB231PS = 9116, I_VFNMSUB231SD = 9158, I_VFNMSUB231SS = 9144, - I_VHADDPD = 4219, I_VHADDPS = 4228, I_VHSUBPD = 4253, I_VHSUBPS = 4262, I_VINSERTF128 = 9525, - I_VINSERTPS = 9579, I_VLDDQU = 7023, I_VLDMXCSR = 9963, I_VMASKMOVDQU = 7153, - I_VMASKMOVPD = 7971, I_VMASKMOVPS = 7959, I_VMAXPD = 3610, I_VMAXPS = 3602, - I_VMAXSD = 3626, I_VMAXSS = 3618, I_VMCALL = 1735, I_VMCLEAR = 10011, I_VMFUNC = 1803, - I_VMINPD = 3490, I_VMINPS = 3482, I_VMINSD = 3506, I_VMINSS = 3498, I_VMLAUNCH = 1743, - I_VMLOAD = 1833, I_VMMCALL = 1824, I_VMOVAPD = 2498, I_VMOVAPS = 2489, I_VMOVD = 3954, - I_VMOVDDUP = 2256, I_VMOVDQA = 3984, I_VMOVDQU = 3993, I_VMOVHLPS = 2217, - I_VMOVHPD = 2404, I_VMOVHPS = 2395, I_VMOVLHPS = 2385, I_VMOVLPD = 2236, I_VMOVLPS = 2227, - I_VMOVMSKPD = 2858, I_VMOVMSKPS = 2847, I_VMOVNTDQ = 6880, I_VMOVNTDQA = 7927, - I_VMOVNTPD = 2615, I_VMOVNTPS = 2605, I_VMOVQ = 3961, I_VMOVSD = 2165, I_VMOVSHDUP = 2413, - I_VMOVSLDUP = 2245, I_VMOVSS = 2157, I_VMOVUPD = 2148, I_VMOVUPS = 2139, I_VMPSADBW = 9659, - I_VMPTRLD = 10002, I_VMPTRST = 6407, I_VMREAD = 4150, I_VMRESUME = 1753, I_VMRUN = 1817, - I_VMSAVE = 1841, I_VMULPD = 3221, I_VMULPS = 3213, I_VMULSD = 3237, I_VMULSS = 3229, - I_VMWRITE = 4174, I_VMXOFF = 1763, I_VMXON = 10020, I_VORPD = 3088, I_VORPS = 3081, - I_VPABSB = 7717, I_VPABSD = 7747, I_VPABSW = 7732, I_VPACKSSDW = 3881, I_VPACKSSWB = 3713, - I_VPACKUSDW = 7948, I_VPACKUSWB = 3791, I_VPADDB = 7233, I_VPADDD = 7263, - I_VPADDQ = 6510, I_VPADDSB = 6960, I_VPADDSW = 6977, I_VPADDUSW = 6651, I_VPADDW = 7248, - I_VPALIGNR = 9441, I_VPAND = 6635, I_VPANDN = 6694, I_VPAVGB = 6709, I_VPAVGW = 6754, - I_VPBLENDVB = 9714, I_VPBLENDW = 9422, I_VPCLMULQDQ = 9680, I_VPCMPEQB = 4074, - I_VPCMPEQD = 4112, I_VPCMPEQQ = 7907, I_VPCMPEQW = 4093, I_VPCMPESTRI = 9759, - I_VPCMPESTRM = 9736, I_VPCMPGTB = 3733, I_VPCMPGTD = 3771, I_VPCMPGTQ = 8118, - I_VPCMPGTW = 3752, I_VPCMPISTRI = 9805, I_VPCMPISTRM = 9782, I_VPERM2F128 = 9287, - I_VPERMILPD = 7592, I_VPERMILPS = 7581, I_VPEXTRB = 9459, I_VPEXTRD = 9484, - I_VPEXTRQ = 9493, I_VPEXTRW = 6341, I_VPHADDD = 7405, I_VPHADDSW = 7423, I_VPHADDW = 7388, - I_VPHMINPOSUW = 8293, I_VPHSUBD = 7481, I_VPHSUBSW = 7499, I_VPHSUBW = 7464, - I_VPINSRB = 9560, I_VPINSRD = 9606, I_VPINSRQ = 9615, I_VPINSRW = 6324, I_VPMADDUBSW = 7444, - I_VPMADDWD = 7104, I_VPMAXSB = 8204, I_VPMAXSD = 8221, I_VPMAXSW = 6994, I_VPMAXUB = 6678, - I_VPMAXUD = 8255, I_VPMAXUW = 8238, I_VPMINSB = 8136, I_VPMINSD = 8153, I_VPMINSW = 6932, - I_VPMINUB = 6620, I_VPMINUD = 8187, I_VPMINUW = 8170, I_VPMOVMSKB = 6563, - I_VPMOVSXBD = 7786, I_VPMOVSXBQ = 7807, I_VPMOVSXBW = 7765, I_VPMOVSXDQ = 7870, - I_VPMOVSXWD = 7828, I_VPMOVSXWQ = 7849, I_VPMOVZXBD = 8014, I_VPMOVZXBQ = 8035, - I_VPMOVZXBW = 7993, I_VPMOVZXDQ = 8098, I_VPMOVZXWD = 8056, I_VPMOVZXWQ = 8077, - I_VPMULDQ = 7889, I_VPMULHRSW = 7570, I_VPMULHUW = 6771, I_VPMULHW = 6789, - I_VPMULLD = 8272, I_VPMULLW = 6526, I_VPMULUDQ = 7085, I_VPOR = 6946, I_VPSADBW = 7122, - I_VPSHUFB = 7371, I_VPSHUFD = 4036, I_VPSHUFHW = 4045, I_VPSHUFLW = 4055, - I_VPSIGNB = 7517, I_VPSIGND = 7551, I_VPSIGNW = 7534, I_VPSLLD = 7053, I_VPSLLDQ = 9877, - I_VPSLLQ = 7068, I_VPSLLW = 7038, I_VPSRAD = 6739, I_VPSRAW = 6724, I_VPSRLD = 6480, - I_VPSRLDQ = 9860, I_VPSRLQ = 6495, I_VPSRLW = 6465, I_VPSUBB = 7173, I_VPSUBD = 7203, - I_VPSUBQ = 7218, I_VPSUBSB = 6898, I_VPSUBSW = 6915, I_VPSUBUSB = 6583, I_VPSUBUSW = 6602, - I_VPSUBW = 7188, I_VPTEST = 7658, I_VPUNPCKHBW = 3813, I_VPUNPCKHDQ = 3859, - I_VPUNPCKHQDQ = 3929, I_VPUNPCKHWD = 3836, I_VPUNPCKLBW = 3645, I_VPUNPCKLDQ = 3691, - I_VPUNPCKLQDQ = 3904, I_VPUNPCKLWD = 3668, I_VPXOR = 7009, I_VRCPPS = 2989, - I_VRCPSS = 2997, I_VROUNDPD = 9327, I_VROUNDPS = 9308, I_VROUNDSD = 9365, - I_VROUNDSS = 9346, I_VRSQRTPS = 2955, I_VRSQRTSS = 2965, I_VSHUFPD = 6375, - I_VSHUFPS = 6366, I_VSQRTPD = 2910, I_VSQRTPS = 2901, I_VSQRTSD = 2928, I_VSQRTSS = 2919, - I_VSTMXCSR = 9992, I_VSUBPD = 3430, I_VSUBPS = 3422, I_VSUBSD = 3446, I_VSUBSS = 3438, - I_VTESTPD = 7612, I_VTESTPS = 7603, I_VUCOMISD = 2783, I_VUCOMISS = 2773, - I_VUNPCKHPD = 2339, I_VUNPCKHPS = 2328, I_VUNPCKLPD = 2297, I_VUNPCKLPS = 2286, - I_VXORPD = 3117, I_VXORPS = 3109, I_VZEROALL = 4140, I_VZEROUPPER = 4128, - I_WAIT = 10042, I_WBINVD = 561, I_WRFSBASE = 9953, I_WRGSBASE = 9982, I_WRMSR = 586, - I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1811, - I_XGETBV = 1787, I_XLAT = 400, I_XOR = 61, I_XORPD = 3102, I_XORPS = 3095, - I_XRSTOR = 4295, I_XRSTOR64 = 4303, I_XSAVE = 4271, I_XSAVE64 = 4278, I_XSAVEOPT = 4321, - I_XSAVEOPT64 = 4331, I_XSETBV = 1795, I__3DNOW = 10056 - } _InstructionType; + I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3132, + I_ADDPS = 3125, I_ADDSD = 3146, I_ADDSS = 3139, I_ADDSUBPD = 6416, I_ADDSUBPS = 6426, + I_AESDEC = 9231, I_AESDECLAST = 9248, I_AESENC = 9189, I_AESENCLAST = 9206, + I_AESIMC = 9172, I_AESKEYGENASSIST = 9817, I_AND = 41, I_ANDNPD = 3043, I_ANDNPS = 3035, + I_ANDPD = 3012, I_ANDPS = 3005, I_ARPL = 111, I_BLENDPD = 9394, I_BLENDPS = 9375, + I_BLENDVPD = 7641, I_BLENDVPS = 7631, I_BOUND = 104, I_BSF = 4368, I_BSR = 4380, + I_BSWAP = 960, I_BT = 872, I_BTC = 934, I_BTR = 912, I_BTS = 887, I_CALL = 456, + I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLC = 492, I_CLD = 512, + I_CLFLUSH = 4351, I_CLGI = 1855, I_CLI = 502, I_CLTS = 541, I_CMC = 487, I_CMOVA = 694, + I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, I_CMOVGE = 738, + I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, I_CMOVNS = 708, + I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, I_CMOVZ = 671, + I_CMP = 71, I_CMPEQPD = 4471, I_CMPEQPS = 4392, I_CMPEQSD = 4629, I_CMPEQSS = 4550, + I_CMPLEPD = 4489, I_CMPLEPS = 4410, I_CMPLESD = 4647, I_CMPLESS = 4568, I_CMPLTPD = 4480, + I_CMPLTPS = 4401, I_CMPLTSD = 4638, I_CMPLTSS = 4559, I_CMPNEQPD = 4510, I_CMPNEQPS = 4431, + I_CMPNEQSD = 4668, I_CMPNEQSS = 4589, I_CMPNLEPD = 4530, I_CMPNLEPS = 4451, + I_CMPNLESD = 4688, I_CMPNLESS = 4609, I_CMPNLTPD = 4520, I_CMPNLTPS = 4441, + I_CMPNLTSD = 4678, I_CMPNLTSS = 4599, I_CMPORDPD = 4540, I_CMPORDPS = 4461, + I_CMPORDSD = 4698, I_CMPORDSS = 4619, I_CMPS = 301, I_CMPUNORDPD = 4498, I_CMPUNORDPS = 4419, + I_CMPUNORDSD = 4656, I_CMPUNORDSS = 4577, I_CMPXCHG = 898, I_CMPXCHG16B = 6395, + I_CMPXCHG8B = 6384, I_COMISD = 2801, I_COMISS = 2793, I_CPUID = 865, I_CQO = 255, + I_CRC32 = 9280, I_CVTDQ2PD = 6809, I_CVTDQ2PS = 3329, I_CVTPD2DQ = 6819, I_CVTPD2PI = 2703, + I_CVTPD2PS = 3255, I_CVTPH2PS = 4183, I_CVTPI2PD = 2517, I_CVTPI2PS = 2507, + I_CVTPS2DQ = 3339, I_CVTPS2PD = 3245, I_CVTPS2PH = 4193, I_CVTPS2PI = 2693, + I_CVTSD2SI = 2723, I_CVTSD2SS = 3275, I_CVTSI2SD = 2537, I_CVTSI2SS = 2527, + I_CVTSS2SD = 3265, I_CVTSS2SI = 2713, I_CVTTPD2DQ = 6798, I_CVTTPD2PI = 2636, + I_CVTTPS2DQ = 3349, I_CVTTPS2PI = 2625, I_CVTTSD2SI = 2658, I_CVTTSS2SI = 2647, + I_CWD = 245, I_CWDE = 233, I_DAA = 46, I_DAS = 56, I_DEC = 86, I_DIV = 1646, + I_DIVPD = 3521, I_DIVPS = 3514, I_DIVSD = 3535, I_DIVSS = 3528, I_DPPD = 9637, + I_DPPS = 9624, I_EMMS = 4122, I_ENTER = 340, I_EXTRACTPS = 9502, I_EXTRQ = 4158, + I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, I_FADDP = 1549, I_FBLD = 1601, + I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7311, I_FCMOVB = 1376, I_FCMOVBE = 1392, + I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, I_FCMOVNE = 1454, I_FCMOVNU = 1473, + I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, I_FCOMIP = 1623, I_FCOMP = 1041, + I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, I_FDIV = 1061, I_FDIVP = 1594, + I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, I_FEMMS = 574, I_FENI = 1482, + I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, I_FICOMP = 1338, I_FIDIV = 1361, + I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, I_FINCSTP = 1247, I_FINIT = 7326, + I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, I_FISUB = 1346, I_FISUBR = 1353, + I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, I_FLDENV = 1090, I_FLDL2E = 1155, + I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, I_FLDPI = 1163, I_FLDZ = 1186, + I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7303, I_FNINIT = 7318, I_FNOP = 1111, + I_FNSAVE = 7333, I_FNSTCW = 7288, I_FNSTENV = 7271, I_FNSTSW = 7348, I_FPATAN = 1213, + I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, I_FRNDINT = 1288, I_FRSTOR = 1519, + I_FSAVE = 7341, I_FSCALE = 1297, I_FSETPM = 1496, I_FSIN = 1305, I_FSINCOS = 1279, + I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7296, I_FSTENV = 7280, I_FSTP = 1084, + I_FSTSW = 7356, I_FSUB = 1048, I_FSUBP = 1579, I_FSUBR = 1054, I_FSUBRP = 1571, + I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, I_FUCOMIP = 1614, I_FUCOMP = 1541, + I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, I_FXRSTOR = 9914, I_FXRSTOR64 = 9923, + I_FXSAVE = 9886, I_FXSAVE64 = 9894, I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, + I_GETSEC = 633, I_HADDPD = 4203, I_HADDPS = 4211, I_HLT = 482, I_HSUBPD = 4237, + I_HSUBPS = 4245, I_IDIV = 1651, I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, + I_INSERTPS = 9569, I_INSERTQ = 4165, I_INT = 367, I_INT_3 = 360, I_INT1 = 476, + I_INTO = 372, I_INVD = 555, I_INVEPT = 8306, I_INVLPG = 1727, I_INVLPGA = 1869, + I_INVPCID = 8323, I_INVVPID = 8314, I_IRET = 378, I_JA = 166, I_JAE = 147, + I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, I_JG = 202, I_JGE = 192, + I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, I_JNO = 138, I_JNP = 183, + I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, I_JRCXZ = 440, I_JS = 170, + I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7016, I_LDMXCSR = 9944, I_LDS = 335, + I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4287, I_LFS = 917, I_LGDT = 1703, + I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, I_LODS = 313, I_LOOP = 421, + I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, I_LTR = 1674, I_LZCNT = 4385, + I_MASKMOVDQU = 7141, I_MASKMOVQ = 7131, I_MAXPD = 3581, I_MAXPS = 3574, I_MAXSD = 3595, + I_MAXSS = 3588, I_MFENCE = 4313, I_MINPD = 3461, I_MINPS = 3454, I_MINSD = 3475, + I_MINSS = 3468, I_MONITOR = 1771, I_MOV = 218, I_MOVAPD = 2481, I_MOVAPS = 2473, + I_MOVBE = 9273, I_MOVD = 3942, I_MOVDDUP = 2208, I_MOVDQ2Q = 6544, I_MOVDQA = 3968, + I_MOVDQU = 3976, I_MOVHLPS = 2173, I_MOVHPD = 2367, I_MOVHPS = 2359, I_MOVLHPS = 2350, + I_MOVLPD = 2190, I_MOVLPS = 2182, I_MOVMSKPD = 2837, I_MOVMSKPS = 2827, I_MOVNTDQ = 6871, + I_MOVNTDQA = 7917, I_MOVNTI = 952, I_MOVNTPD = 2578, I_MOVNTPS = 2569, I_MOVNTQ = 6863, + I_MOVNTSD = 2596, I_MOVNTSS = 2587, I_MOVQ = 3948, I_MOVQ2DQ = 6535, I_MOVS = 295, + I_MOVSD = 2132, I_MOVSHDUP = 2375, I_MOVSLDUP = 2198, I_MOVSS = 2125, I_MOVSX = 939, + I_MOVSXD = 10027, I_MOVUPD = 2117, I_MOVUPS = 2109, I_MOVZX = 927, I_MPSADBW = 9650, + I_MUL = 1641, I_MULPD = 3192, I_MULPS = 3185, I_MULSD = 3206, I_MULSS = 3199, + I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, I_NOT = 1631, I_OR = 27, I_ORPD = 3075, + I_ORPS = 3069, I_OUT = 451, I_OUTS = 128, I_PABSB = 7710, I_PABSD = 7740, I_PABSW = 7725, + I_PACKSSDW = 3871, I_PACKSSWB = 3703, I_PACKUSDW = 7938, I_PACKUSWB = 3781, + I_PADDB = 7226, I_PADDD = 7256, I_PADDQ = 6503, I_PADDSB = 6952, I_PADDSW = 6969, + I_PADDUSB = 6642, I_PADDUSW = 6661, I_PADDW = 7241, I_PALIGNR = 9432, I_PAND = 6629, + I_PANDN = 6687, I_PAUSE = 10035, I_PAVGB = 6702, I_PAVGUSB = 2100, I_PAVGW = 6747, + I_PBLENDVB = 7621, I_PBLENDW = 9413, I_PCLMULQDQ = 9669, I_PCMPEQB = 4065, + I_PCMPEQD = 4103, I_PCMPEQQ = 7898, I_PCMPEQW = 4084, I_PCMPESTRI = 9748, + I_PCMPESTRM = 9725, I_PCMPGTB = 3724, I_PCMPGTD = 3762, I_PCMPGTQ = 8109, + I_PCMPGTW = 3743, I_PCMPISTRI = 9794, I_PCMPISTRM = 9771, I_PEXTRB = 9451, + I_PEXTRD = 9468, I_PEXTRQ = 9476, I_PEXTRW = 6333, I_PF2ID = 1936, I_PF2IW = 1929, + I_PFACC = 2050, I_PFADD = 1999, I_PFCMPEQ = 2057, I_PFCMPGE = 1960, I_PFCMPGT = 2006, + I_PFMAX = 2015, I_PFMIN = 1969, I_PFMUL = 2066, I_PFNACC = 1943, I_PFPNACC = 1951, + I_PFRCP = 1976, I_PFRCPIT1 = 2022, I_PFRCPIT2 = 2073, I_PFRSQIT1 = 2032, I_PFRSQRT = 1983, + I_PFSUB = 1992, I_PFSUBR = 2042, I_PHADDD = 7397, I_PHADDSW = 7414, I_PHADDW = 7380, + I_PHMINPOSUW = 8281, I_PHSUBD = 7473, I_PHSUBSW = 7490, I_PHSUBW = 7456, I_PI2FD = 1922, + I_PI2FW = 1915, I_PINSRB = 9552, I_PINSRD = 9590, I_PINSRQ = 9598, I_PINSRW = 6316, + I_PMADDUBSW = 7433, I_PMADDWD = 7095, I_PMAXSB = 8196, I_PMAXSD = 8213, I_PMAXSW = 6986, + I_PMAXUB = 6670, I_PMAXUD = 8247, I_PMAXUW = 8230, I_PMINSB = 8128, I_PMINSD = 8145, + I_PMINSW = 6924, I_PMINUB = 6612, I_PMINUD = 8179, I_PMINUW = 8162, I_PMOVMSKB = 6553, + I_PMOVSXBD = 7776, I_PMOVSXBQ = 7797, I_PMOVSXBW = 7755, I_PMOVSXDQ = 7860, + I_PMOVSXWD = 7818, I_PMOVSXWQ = 7839, I_PMOVZXBD = 8004, I_PMOVZXBQ = 8025, + I_PMOVZXBW = 7983, I_PMOVZXDQ = 8088, I_PMOVZXWD = 8046, I_PMOVZXWQ = 8067, + I_PMULDQ = 7881, I_PMULHRSW = 7560, I_PMULHRW = 2083, I_PMULHUW = 6762, I_PMULHW = 6781, + I_PMULLD = 8264, I_PMULLW = 6518, I_PMULUDQ = 7076, I_POP = 22, I_POPA = 98, + I_POPCNT = 4360, I_POPF = 277, I_POR = 6941, I_PREFETCH = 1894, I_PREFETCHNTA = 2424, + I_PREFETCHT0 = 2437, I_PREFETCHT1 = 2449, I_PREFETCHT2 = 2461, I_PREFETCHW = 1904, + I_PSADBW = 7114, I_PSHUFB = 7363, I_PSHUFD = 4010, I_PSHUFHW = 4018, I_PSHUFLW = 4027, + I_PSHUFW = 4002, I_PSIGNB = 7509, I_PSIGND = 7543, I_PSIGNW = 7526, I_PSLLD = 7046, + I_PSLLDQ = 9869, I_PSLLQ = 7061, I_PSLLW = 7031, I_PSRAD = 6732, I_PSRAW = 6717, + I_PSRLD = 6473, I_PSRLDQ = 9852, I_PSRLQ = 6488, I_PSRLW = 6458, I_PSUBB = 7166, + I_PSUBD = 7196, I_PSUBQ = 7211, I_PSUBSB = 6890, I_PSUBSW = 6907, I_PSUBUSB = 6574, + I_PSUBUSW = 6593, I_PSUBW = 7181, I_PSWAPD = 2092, I_PTEST = 7651, I_PUNPCKHBW = 3802, + I_PUNPCKHDQ = 3848, I_PUNPCKHQDQ = 3917, I_PUNPCKHWD = 3825, I_PUNPCKLBW = 3634, + I_PUNPCKLDQ = 3680, I_PUNPCKLQDQ = 3892, I_PUNPCKLWD = 3657, I_PUSH = 16, + I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7003, I_RCL = 977, I_RCPPS = 2975, I_RCPSS = 2982, + I_RCR = 982, I_RDFSBASE = 9904, I_RDGSBASE = 9934, I_RDMSR = 600, I_RDPMC = 607, + I_RDRAND = 10048, I_RDTSC = 593, I_RDTSCP = 1886, I_RET = 325, I_RETF = 354, + I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9318, I_ROUNDPS = 9299, I_ROUNDSD = 9356, + I_ROUNDSS = 9337, I_RSM = 882, I_RSQRTPS = 2937, I_RSQRTSS = 2946, I_SAHF = 283, + I_SAL = 997, I_SALC = 394, I_SAR = 1002, I_SBB = 36, I_SCAS = 319, I_SETA = 807, + I_SETAE = 780, I_SETB = 774, I_SETBE = 800, I_SETG = 859, I_SETGE = 845, I_SETL = 839, + I_SETLE = 852, I_SETNO = 767, I_SETNP = 832, I_SETNS = 819, I_SETNZ = 793, + I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4343, I_SGDT = 1691, + I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6358, I_SHUFPS = 6350, + I_SIDT = 1697, I_SKINIT = 1861, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2877, + I_SQRTPS = 2869, I_SQRTSD = 2893, I_SQRTSS = 2885, I_STC = 497, I_STD = 517, + I_STGI = 1849, I_STI = 507, I_STMXCSR = 9973, I_STOS = 307, I_STR = 1663, I_SUB = 51, + I_SUBPD = 3401, I_SUBPS = 3394, I_SUBSD = 3415, I_SUBSS = 3408, I_SWAPGS = 1878, + I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, I_TEST = 206, + I_TZCNT = 4373, I_UCOMISD = 2764, I_UCOMISS = 2755, I_UD2 = 569, I_UNPCKHPD = 2318, + I_UNPCKHPS = 2308, I_UNPCKLPD = 2276, I_UNPCKLPS = 2266, I_VADDPD = 3161, + I_VADDPS = 3153, I_VADDSD = 3177, I_VADDSS = 3169, I_VADDSUBPD = 6436, I_VADDSUBPS = 6447, + I_VAESDEC = 9239, I_VAESDECLAST = 9260, I_VAESENC = 9197, I_VAESENCLAST = 9218, + I_VAESIMC = 9180, I_VAESKEYGENASSIST = 9834, I_VANDNPD = 3060, I_VANDNPS = 3051, + I_VANDPD = 3027, I_VANDPS = 3019, I_VBLENDPD = 9403, I_VBLENDPS = 9384, I_VBLENDVPD = 9703, + I_VBLENDVPS = 9692, I_VBROADCASTF128 = 7694, I_VBROADCASTSD = 7680, I_VBROADCASTSS = 7666, + I_VCMPEQPD = 5110, I_VCMPEQPS = 4708, I_VCMPEQSD = 5914, I_VCMPEQSS = 5512, + I_VCMPEQ_OSPD = 5291, I_VCMPEQ_OSPS = 4889, I_VCMPEQ_OSSD = 6095, I_VCMPEQ_OSSS = 5693, + I_VCMPEQ_UQPD = 5197, I_VCMPEQ_UQPS = 4795, I_VCMPEQ_UQSD = 6001, I_VCMPEQ_UQSS = 5599, + I_VCMPEQ_USPD = 5400, I_VCMPEQ_USPS = 4998, I_VCMPEQ_USSD = 6204, I_VCMPEQ_USSS = 5802, + I_VCMPFALSEPD = 5232, I_VCMPFALSEPS = 4830, I_VCMPFALSESD = 6036, I_VCMPFALSESS = 5634, + I_VCMPFALSE_OSPD = 5441, I_VCMPFALSE_OSPS = 5039, I_VCMPFALSE_OSSD = 6245, + I_VCMPFALSE_OSSS = 5843, I_VCMPGEPD = 5259, I_VCMPGEPS = 4857, I_VCMPGESD = 6063, + I_VCMPGESS = 5661, I_VCMPGE_OQPD = 5471, I_VCMPGE_OQPS = 5069, I_VCMPGE_OQSD = 6275, + I_VCMPGE_OQSS = 5873, I_VCMPGTPD = 5269, I_VCMPGTPS = 4867, I_VCMPGTSD = 6073, + I_VCMPGTSS = 5671, I_VCMPGT_OQPD = 5484, I_VCMPGT_OQPS = 5082, I_VCMPGT_OQSD = 6288, + I_VCMPGT_OQSS = 5886, I_VCMPLEPD = 5130, I_VCMPLEPS = 4728, I_VCMPLESD = 5934, + I_VCMPLESS = 5532, I_VCMPLE_OQPD = 5317, I_VCMPLE_OQPS = 4915, I_VCMPLE_OQSD = 6121, + I_VCMPLE_OQSS = 5719, I_VCMPLTPD = 5120, I_VCMPLTPS = 4718, I_VCMPLTSD = 5924, + I_VCMPLTSS = 5522, I_VCMPLT_OQPD = 5304, I_VCMPLT_OQPS = 4902, I_VCMPLT_OQSD = 6108, + I_VCMPLT_OQSS = 5706, I_VCMPNEQPD = 5153, I_VCMPNEQPS = 4751, I_VCMPNEQSD = 5957, + I_VCMPNEQSS = 5555, I_VCMPNEQ_OQPD = 5245, I_VCMPNEQ_OQPS = 4843, I_VCMPNEQ_OQSD = 6049, + I_VCMPNEQ_OQSS = 5647, I_VCMPNEQ_OSPD = 5457, I_VCMPNEQ_OSPS = 5055, I_VCMPNEQ_OSSD = 6261, + I_VCMPNEQ_OSSS = 5859, I_VCMPNEQ_USPD = 5345, I_VCMPNEQ_USPS = 4943, I_VCMPNEQ_USSD = 6149, + I_VCMPNEQ_USSS = 5747, I_VCMPNGEPD = 5210, I_VCMPNGEPS = 4808, I_VCMPNGESD = 6014, + I_VCMPNGESS = 5612, I_VCMPNGE_UQPD = 5413, I_VCMPNGE_UQPS = 5011, I_VCMPNGE_UQSD = 6217, + I_VCMPNGE_UQSS = 5815, I_VCMPNGTPD = 5221, I_VCMPNGTPS = 4819, I_VCMPNGTSD = 6025, + I_VCMPNGTSS = 5623, I_VCMPNGT_UQPD = 5427, I_VCMPNGT_UQPS = 5025, I_VCMPNGT_UQSD = 6231, + I_VCMPNGT_UQSS = 5829, I_VCMPNLEPD = 5175, I_VCMPNLEPS = 4773, I_VCMPNLESD = 5979, + I_VCMPNLESS = 5577, I_VCMPNLE_UQPD = 5373, I_VCMPNLE_UQPS = 4971, I_VCMPNLE_UQSD = 6177, + I_VCMPNLE_UQSS = 5775, I_VCMPNLTPD = 5164, I_VCMPNLTPS = 4762, I_VCMPNLTSD = 5968, + I_VCMPNLTSS = 5566, I_VCMPNLT_UQPD = 5359, I_VCMPNLT_UQPS = 4957, I_VCMPNLT_UQSD = 6163, + I_VCMPNLT_UQSS = 5761, I_VCMPORDPD = 5186, I_VCMPORDPS = 4784, I_VCMPORDSD = 5990, + I_VCMPORDSS = 5588, I_VCMPORD_SPD = 5387, I_VCMPORD_SPS = 4985, I_VCMPORD_SSD = 6191, + I_VCMPORD_SSS = 5789, I_VCMPTRUEPD = 5279, I_VCMPTRUEPS = 4877, I_VCMPTRUESD = 6083, + I_VCMPTRUESS = 5681, I_VCMPTRUE_USPD = 5497, I_VCMPTRUE_USPS = 5095, I_VCMPTRUE_USSD = 6301, + I_VCMPTRUE_USSS = 5899, I_VCMPUNORDPD = 5140, I_VCMPUNORDPS = 4738, I_VCMPUNORDSD = 5944, + I_VCMPUNORDSS = 5542, I_VCMPUNORD_SPD = 5330, I_VCMPUNORD_SPS = 4928, I_VCMPUNORD_SSD = 6134, + I_VCMPUNORD_SSS = 5732, I_VCOMISD = 2818, I_VCOMISS = 2809, I_VCVTDQ2PD = 6841, + I_VCVTDQ2PS = 3360, I_VCVTPD2DQ = 6852, I_VCVTPD2PS = 3296, I_VCVTPS2DQ = 3371, + I_VCVTPS2PD = 3285, I_VCVTSD2SI = 2744, I_VCVTSD2SS = 3318, I_VCVTSI2SD = 2558, + I_VCVTSI2SS = 2547, I_VCVTSS2SD = 3307, I_VCVTSS2SI = 2733, I_VCVTTPD2DQ = 6829, + I_VCVTTPS2DQ = 3382, I_VCVTTSD2SI = 2681, I_VCVTTSS2SI = 2669, I_VDIVPD = 3550, + I_VDIVPS = 3542, I_VDIVSD = 3566, I_VDIVSS = 3558, I_VDPPD = 9643, I_VDPPS = 9630, + I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9538, I_VEXTRACTPS = 9513, + I_VFMADD132PD = 8409, I_VFMADD132PS = 8396, I_VFMADD132SD = 8435, I_VFMADD132SS = 8422, + I_VFMADD213PD = 8689, I_VFMADD213PS = 8676, I_VFMADD213SD = 8715, I_VFMADD213SS = 8702, + I_VFMADD231PD = 8969, I_VFMADD231PS = 8956, I_VFMADD231SD = 8995, I_VFMADD231SS = 8982, + I_VFMADDSUB132PD = 8348, I_VFMADDSUB132PS = 8332, I_VFMADDSUB213PD = 8628, + I_VFMADDSUB213PS = 8612, I_VFMADDSUB231PD = 8908, I_VFMADDSUB231PS = 8892, + I_VFMSUB132PD = 8461, I_VFMSUB132PS = 8448, I_VFMSUB132SD = 8487, I_VFMSUB132SS = 8474, + I_VFMSUB213PD = 8741, I_VFMSUB213PS = 8728, I_VFMSUB213SD = 8767, I_VFMSUB213SS = 8754, + I_VFMSUB231PD = 9021, I_VFMSUB231PS = 9008, I_VFMSUB231SD = 9047, I_VFMSUB231SS = 9034, + I_VFMSUBADD132PD = 8380, I_VFMSUBADD132PS = 8364, I_VFMSUBADD213PD = 8660, + I_VFMSUBADD213PS = 8644, I_VFMSUBADD231PD = 8940, I_VFMSUBADD231PS = 8924, + I_VFNMADD132PD = 8514, I_VFNMADD132PS = 8500, I_VFNMADD132SD = 8542, I_VFNMADD132SS = 8528, + I_VFNMADD213PD = 8794, I_VFNMADD213PS = 8780, I_VFNMADD213SD = 8822, I_VFNMADD213SS = 8808, + I_VFNMADD231PD = 9074, I_VFNMADD231PS = 9060, I_VFNMADD231SD = 9102, I_VFNMADD231SS = 9088, + I_VFNMSUB132PD = 8570, I_VFNMSUB132PS = 8556, I_VFNMSUB132SD = 8598, I_VFNMSUB132SS = 8584, + I_VFNMSUB213PD = 8850, I_VFNMSUB213PS = 8836, I_VFNMSUB213SD = 8878, I_VFNMSUB213SS = 8864, + I_VFNMSUB231PD = 9130, I_VFNMSUB231PS = 9116, I_VFNMSUB231SD = 9158, I_VFNMSUB231SS = 9144, + I_VHADDPD = 4219, I_VHADDPS = 4228, I_VHSUBPD = 4253, I_VHSUBPS = 4262, I_VINSERTF128 = 9525, + I_VINSERTPS = 9579, I_VLDDQU = 7023, I_VLDMXCSR = 9963, I_VMASKMOVDQU = 7153, + I_VMASKMOVPD = 7971, I_VMASKMOVPS = 7959, I_VMAXPD = 3610, I_VMAXPS = 3602, + I_VMAXSD = 3626, I_VMAXSS = 3618, I_VMCALL = 1735, I_VMCLEAR = 10011, I_VMFUNC = 1803, + I_VMINPD = 3490, I_VMINPS = 3482, I_VMINSD = 3506, I_VMINSS = 3498, I_VMLAUNCH = 1743, + I_VMLOAD = 1833, I_VMMCALL = 1824, I_VMOVAPD = 2498, I_VMOVAPS = 2489, I_VMOVD = 3954, + I_VMOVDDUP = 2256, I_VMOVDQA = 3984, I_VMOVDQU = 3993, I_VMOVHLPS = 2217, + I_VMOVHPD = 2404, I_VMOVHPS = 2395, I_VMOVLHPS = 2385, I_VMOVLPD = 2236, I_VMOVLPS = 2227, + I_VMOVMSKPD = 2858, I_VMOVMSKPS = 2847, I_VMOVNTDQ = 6880, I_VMOVNTDQA = 7927, + I_VMOVNTPD = 2615, I_VMOVNTPS = 2605, I_VMOVQ = 3961, I_VMOVSD = 2165, I_VMOVSHDUP = 2413, + I_VMOVSLDUP = 2245, I_VMOVSS = 2157, I_VMOVUPD = 2148, I_VMOVUPS = 2139, I_VMPSADBW = 9659, + I_VMPTRLD = 10002, I_VMPTRST = 6407, I_VMREAD = 4150, I_VMRESUME = 1753, I_VMRUN = 1817, + I_VMSAVE = 1841, I_VMULPD = 3221, I_VMULPS = 3213, I_VMULSD = 3237, I_VMULSS = 3229, + I_VMWRITE = 4174, I_VMXOFF = 1763, I_VMXON = 10020, I_VORPD = 3088, I_VORPS = 3081, + I_VPABSB = 7717, I_VPABSD = 7747, I_VPABSW = 7732, I_VPACKSSDW = 3881, I_VPACKSSWB = 3713, + I_VPACKUSDW = 7948, I_VPACKUSWB = 3791, I_VPADDB = 7233, I_VPADDD = 7263, + I_VPADDQ = 6510, I_VPADDSB = 6960, I_VPADDSW = 6977, I_VPADDUSW = 6651, I_VPADDW = 7248, + I_VPALIGNR = 9441, I_VPAND = 6635, I_VPANDN = 6694, I_VPAVGB = 6709, I_VPAVGW = 6754, + I_VPBLENDVB = 9714, I_VPBLENDW = 9422, I_VPCLMULQDQ = 9680, I_VPCMPEQB = 4074, + I_VPCMPEQD = 4112, I_VPCMPEQQ = 7907, I_VPCMPEQW = 4093, I_VPCMPESTRI = 9759, + I_VPCMPESTRM = 9736, I_VPCMPGTB = 3733, I_VPCMPGTD = 3771, I_VPCMPGTQ = 8118, + I_VPCMPGTW = 3752, I_VPCMPISTRI = 9805, I_VPCMPISTRM = 9782, I_VPERM2F128 = 9287, + I_VPERMILPD = 7592, I_VPERMILPS = 7581, I_VPEXTRB = 9459, I_VPEXTRD = 9484, + I_VPEXTRQ = 9493, I_VPEXTRW = 6341, I_VPHADDD = 7405, I_VPHADDSW = 7423, I_VPHADDW = 7388, + I_VPHMINPOSUW = 8293, I_VPHSUBD = 7481, I_VPHSUBSW = 7499, I_VPHSUBW = 7464, + I_VPINSRB = 9560, I_VPINSRD = 9606, I_VPINSRQ = 9615, I_VPINSRW = 6324, I_VPMADDUBSW = 7444, + I_VPMADDWD = 7104, I_VPMAXSB = 8204, I_VPMAXSD = 8221, I_VPMAXSW = 6994, I_VPMAXUB = 6678, + I_VPMAXUD = 8255, I_VPMAXUW = 8238, I_VPMINSB = 8136, I_VPMINSD = 8153, I_VPMINSW = 6932, + I_VPMINUB = 6620, I_VPMINUD = 8187, I_VPMINUW = 8170, I_VPMOVMSKB = 6563, + I_VPMOVSXBD = 7786, I_VPMOVSXBQ = 7807, I_VPMOVSXBW = 7765, I_VPMOVSXDQ = 7870, + I_VPMOVSXWD = 7828, I_VPMOVSXWQ = 7849, I_VPMOVZXBD = 8014, I_VPMOVZXBQ = 8035, + I_VPMOVZXBW = 7993, I_VPMOVZXDQ = 8098, I_VPMOVZXWD = 8056, I_VPMOVZXWQ = 8077, + I_VPMULDQ = 7889, I_VPMULHRSW = 7570, I_VPMULHUW = 6771, I_VPMULHW = 6789, + I_VPMULLD = 8272, I_VPMULLW = 6526, I_VPMULUDQ = 7085, I_VPOR = 6946, I_VPSADBW = 7122, + I_VPSHUFB = 7371, I_VPSHUFD = 4036, I_VPSHUFHW = 4045, I_VPSHUFLW = 4055, + I_VPSIGNB = 7517, I_VPSIGND = 7551, I_VPSIGNW = 7534, I_VPSLLD = 7053, I_VPSLLDQ = 9877, + I_VPSLLQ = 7068, I_VPSLLW = 7038, I_VPSRAD = 6739, I_VPSRAW = 6724, I_VPSRLD = 6480, + I_VPSRLDQ = 9860, I_VPSRLQ = 6495, I_VPSRLW = 6465, I_VPSUBB = 7173, I_VPSUBD = 7203, + I_VPSUBQ = 7218, I_VPSUBSB = 6898, I_VPSUBSW = 6915, I_VPSUBUSB = 6583, I_VPSUBUSW = 6602, + I_VPSUBW = 7188, I_VPTEST = 7658, I_VPUNPCKHBW = 3813, I_VPUNPCKHDQ = 3859, + I_VPUNPCKHQDQ = 3929, I_VPUNPCKHWD = 3836, I_VPUNPCKLBW = 3645, I_VPUNPCKLDQ = 3691, + I_VPUNPCKLQDQ = 3904, I_VPUNPCKLWD = 3668, I_VPXOR = 7009, I_VRCPPS = 2989, + I_VRCPSS = 2997, I_VROUNDPD = 9327, I_VROUNDPS = 9308, I_VROUNDSD = 9365, + I_VROUNDSS = 9346, I_VRSQRTPS = 2955, I_VRSQRTSS = 2965, I_VSHUFPD = 6375, + I_VSHUFPS = 6366, I_VSQRTPD = 2910, I_VSQRTPS = 2901, I_VSQRTSD = 2928, I_VSQRTSS = 2919, + I_VSTMXCSR = 9992, I_VSUBPD = 3430, I_VSUBPS = 3422, I_VSUBSD = 3446, I_VSUBSS = 3438, + I_VTESTPD = 7612, I_VTESTPS = 7603, I_VUCOMISD = 2783, I_VUCOMISS = 2773, + I_VUNPCKHPD = 2339, I_VUNPCKHPS = 2328, I_VUNPCKLPD = 2297, I_VUNPCKLPS = 2286, + I_VXORPD = 3117, I_VXORPS = 3109, I_VZEROALL = 4140, I_VZEROUPPER = 4128, + I_WAIT = 10042, I_WBINVD = 561, I_WRFSBASE = 9953, I_WRGSBASE = 9982, I_WRMSR = 586, + I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1811, + I_XGETBV = 1787, I_XLAT = 400, I_XOR = 61, I_XORPD = 3102, I_XORPS = 3095, + I_XRSTOR = 4295, I_XRSTOR64 = 4303, I_XSAVE = 4271, I_XSAVE64 = 4278, I_XSAVEOPT = 4321, + I_XSAVEOPT64 = 4331, I_XSETBV = 1795, I__3DNOW = 10056 +} _InstructionType; typedef enum { R_RAX, R_RCX, R_RDX, R_RBX, R_RSP, R_RBP, R_RSI, R_RDI, R_R8, R_R9, R_R10, R_R11, R_R12, R_R13, R_R14, R_R15, diff --git a/NativeCore/Dependencies/distorm/src/config.h b/NativeCore/Dependencies/distorm/src/config.h index 164536f2..3fdaf44a 100644 --- a/NativeCore/Dependencies/distorm/src/config.h +++ b/NativeCore/Dependencies/distorm/src/config.h @@ -4,7 +4,7 @@ config.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -13,7 +13,7 @@ This library is licensed under the BSD license. See the file COPYING. #define CONFIG_H /* diStorm version number. */ -#define __DISTORMV__ 0x030304 +#define __DISTORMV__ 0x030400 #include /* memset, memcpy - can be easily self implemented for libc independency. */ @@ -128,34 +128,45 @@ This library is licensed under the BSD license. See the file COPYING. /* Define stream read functions for big endian systems. */ #ifdef BE_SYSTEM + +/* Avoid defining 'static static' for GCC. */ +#ifndef __GNUC__ +#define STATIC_INLINE static _INLINE_ +#else +#define STATIC_INLINE static +#endif + /* - * These functions can read from the stream safely! + * Assumption: These functions can read from the stream safely! * Swap endianity of input to little endian. */ -static _INLINE_ int16_t RSHORT(const uint8_t *s) +STATIC_INLINE int16_t RSHORT(const uint8_t *s) { return s[0] | (s[1] << 8); } -static _INLINE_ uint16_t RUSHORT(const uint8_t *s) +STATIC_INLINE uint16_t RUSHORT(const uint8_t *s) { return s[0] | (s[1] << 8); } -static _INLINE_ int32_t RLONG(const uint8_t *s) +STATIC_INLINE int32_t RLONG(const uint8_t *s) { return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24); } -static _INLINE_ uint32_t RULONG(const uint8_t *s) +STATIC_INLINE uint32_t RULONG(const uint8_t *s) { return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24); } -static _INLINE_ int64_t RLLONG(const uint8_t *s) +STATIC_INLINE int64_t RLLONG(const uint8_t *s) { return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24) | ((uint64_t)s[4] << 32) | ((uint64_t)s[5] << 40) | ((uint64_t)s[6] << 48) | ((uint64_t)s[7] << 56); } -static _INLINE_ uint64_t RULLONG(const uint8_t *s) +STATIC_INLINE uint64_t RULLONG(const uint8_t *s) { return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24) | ((uint64_t)s[4] << 32) | ((uint64_t)s[5] << 40) | ((uint64_t)s[6] << 48) | ((uint64_t)s[7] << 56); } + +#undef STATIC_INLINE + #else /* Little endian macro's will just make the cast. */ #define RSHORT(x) *(int16_t *)x diff --git a/NativeCore/Dependencies/distorm/src/decoder.c b/NativeCore/Dependencies/distorm/src/decoder.c index b76f7105..188996df 100644 --- a/NativeCore/Dependencies/distorm/src/decoder.c +++ b/NativeCore/Dependencies/distorm/src/decoder.c @@ -4,7 +4,7 @@ decoder.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/distorm.c b/NativeCore/Dependencies/distorm/src/distorm.c index 351b38a1..12f360fd 100644 --- a/NativeCore/Dependencies/distorm/src/distorm.c +++ b/NativeCore/Dependencies/distorm/src/distorm.c @@ -5,7 +5,7 @@ diStorm3 C Library Interface diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -407,7 +407,7 @@ static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t #endif /* DISTORM_LIGHT */ -_DLLEXPORT_ unsigned int distorm_version() +_DLLEXPORT_ unsigned int distorm_version(void) { return __DISTORMV__; } diff --git a/NativeCore/Dependencies/distorm/src/instructions.c b/NativeCore/Dependencies/distorm/src/instructions.c index 0f120de6..9107b6b0 100644 --- a/NativeCore/Dependencies/distorm/src/instructions.c +++ b/NativeCore/Dependencies/distorm/src/instructions.c @@ -4,7 +4,7 @@ instructions.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/instructions.h b/NativeCore/Dependencies/distorm/src/instructions.h index b8d8a64a..f6c2c53b 100644 --- a/NativeCore/Dependencies/distorm/src/instructions.h +++ b/NativeCore/Dependencies/distorm/src/instructions.h @@ -4,7 +4,7 @@ instructions.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/insts.c b/NativeCore/Dependencies/distorm/src/insts.c index a081a2d4..f7d283e5 100644 --- a/NativeCore/Dependencies/distorm/src/insts.c +++ b/NativeCore/Dependencies/distorm/src/insts.c @@ -4,7 +4,7 @@ insts.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -15,118 +15,118 @@ This library is licensed under the BSD license. See the file COPYING. /* -* GENERATED BY disOps at Sun Jul 09 21:22:14 2017 -*/ + * GENERATED BY disOps at Sat Nov 10 19:20:27 2018 + */ -_InstInfo II_MOVSXD = /*II*/{ 0x1d3, 10027 }; -_InstInfo II_NOP = /*II*/{ 0x53, 581 }; -_InstInfo II_PAUSE = /*II*/{ 0x88, 10035 }; -_InstInfo II_WAIT = /*II*/{ 0x53, 10042 }; -_InstInfo II_RDRAND = /*II*/{ 0x1d4, 10048 }; -_InstInfo II_3DNOW = /*II*/{ 0x1d5, 10056 }; +_InstInfo II_MOVSXD = /*II*/ {0x1d4, 10027}; +_InstInfo II_NOP = /*II*/ {0x53, 581}; +_InstInfo II_PAUSE = /*II*/ {0x88, 10035}; +_InstInfo II_WAIT = /*II*/ {0x53, 10042}; +_InstInfo II_RDRAND = /*II*/ {0x1d5, 10048}; +_InstInfo II_3DNOW = /*II*/ {0x1d6, 10056}; _iflags FlagsTable[101] = { - 0x80000011, - 0x80000000, - 0x800400, - 0x80800400, - 0x800080, - 0x800100, - 0x80800100, - 0x800200, - 0x80800200, - 0x800000, - 0x1, - 0x0, - 0x80800000, - 0x1000000, - 0x81000000, - 0x808000, - 0x800001, - 0x80020001, - 0x1002000, - 0x60, - 0x64, - 0x80000001, - 0x4010000, - 0x1008000, - 0x80000060, - 0x83000064, - 0x3000064, - 0x83000000, - 0x3008000, - 0x200, - 0xc000, - 0x4014000, - 0x8, - 0x81000009, - 0x9, - 0x80000009, - 0x1000808, - 0x81000808, - 0x80020009, - 0x1001008, - 0x81001008, - 0x80000019, - 0x3000009, - 0x83000009, - 0x83000008, - 0xc0000011, - 0x40000001, - 0xc0800011, - 0x40800001, - 0xc0000019, - 0xc1000001, - 0xc0000001, - 0xc0000003, - 0x41000000, - 0x40000000, - 0x40000008, - 0x40000009, - 0x41000001, - 0x43000001, - 0x40000003, - 0x48000000, - 0x200009, - 0x20000009, - 0x60020009, - 0x60000009, - 0x80090009, - 0x200b0009, - 0x20020009, - 0x80100009, - 0x21100009, - 0x87000009, - 0x20009, - 0x20000008, - 0x1000009, - 0x10020009, - 0x160009, - 0x100009, - 0x47000009, - 0x47090009, - 0x40090009, - 0x80002009, - 0xc0000009, - 0x2001, - 0x80002001, - 0x410009, - 0x20420009, - 0x20060009, - 0x120009, - 0x21020009, - 0xc7000019, - 0x20100009, - 0xc0002009, - 0x40002008, - 0xc0000000, - 0xc0002008, - 0x4020009, - 0x40100009, - 0x60120009, - 0x41000009, - 0x83000001, - 0x200001 +0x80000011, +0x80000000, +0x800400, +0x80800400, +0x800080, +0x800100, +0x80800100, +0x800200, +0x80800200, +0x800000, +0x1, +0x0, +0x80800000, +0x1000000, +0x81000000, +0x808000, +0x800001, +0x80020001, +0x1002000, +0x60, +0x64, +0x80000001, +0x4010000, +0x1008000, +0x80000060, +0x83000064, +0x3000064, +0x83000000, +0x3008000, +0x200, +0xc000, +0x4014000, +0x8, +0x81000009, +0x9, +0x80000009, +0x1000808, +0x81000808, +0x80020009, +0x1001008, +0x81001008, +0x80000019, +0x3000009, +0x83000009, +0x83000008, +0xc0000011, +0x40000001, +0xc0800011, +0x40800001, +0xc0000019, +0xc1000001, +0xc0000001, +0xc0000003, +0x41000000, +0x40000000, +0x40000008, +0x40000009, +0x41000001, +0x43000001, +0x40000003, +0x48000000, +0x200009, +0x20000009, +0x60020009, +0x60000009, +0x80090009, +0x200b0009, +0x20020009, +0x80100009, +0x21100009, +0x87000009, +0x20009, +0x20000008, +0x1000009, +0x10020009, +0x160009, +0x100009, +0x47000009, +0x47090009, +0x40090009, +0x80002009, +0xc0000009, +0x2001, +0x80002001, +0x410009, +0x20420009, +0x20060009, +0x120009, +0x21020009, +0xc7000019, +0x20100009, +0xc0002009, +0x40002008, +0xc0000000, +0xc0002008, +0x4020009, +0x40100009, +0x60120009, +0x41000009, +0x83000001, +0x200001 }; _InstNode Table_0F = 256; @@ -135,7805 +135,7806 @@ _InstNode Table_0F_38 = 1896; _InstNode Table_0F_3A = 2152; _InstInfo InstInfos[1246] = { - /*II_00*/{ 0x0, 11 }, - /*II_01*/{ 0x1, 11 }, - /*II_02*/{ 0x2, 11 }, - /*II_03*/{ 0x3, 11 }, - /*II_04*/{ 0x4, 11 }, - /*II_05*/{ 0x5, 11 }, - /*II_06*/{ 0x6, 16 }, - /*II_07*/{ 0x7, 22 }, - /*II_08*/{ 0x8, 27 }, - /*II_09*/{ 0x9, 27 }, - /*II_0A*/{ 0xa, 27 }, - /*II_0B*/{ 0xb, 27 }, - /*II_0C*/{ 0xc, 27 }, - /*II_0D*/{ 0xd, 27 }, - /*II_0E*/{ 0xe, 16 }, - /*II_10*/{ 0xf, 31 }, - /*II_11*/{ 0x10, 31 }, - /*II_12*/{ 0x11, 31 }, - /*II_13*/{ 0x12, 31 }, - /*II_14*/{ 0x13, 31 }, - /*II_15*/{ 0x14, 31 }, - /*II_16*/{ 0x15, 16 }, - /*II_17*/{ 0x16, 22 }, - /*II_18*/{ 0xf, 36 }, - /*II_19*/{ 0x10, 36 }, - /*II_1A*/{ 0x11, 36 }, - /*II_1B*/{ 0x12, 36 }, - /*II_1C*/{ 0x13, 36 }, - /*II_1D*/{ 0x14, 36 }, - /*II_1E*/{ 0x17, 16 }, - /*II_1F*/{ 0x18, 22 }, - /*II_20*/{ 0x19, 41 }, - /*II_21*/{ 0x1a, 41 }, - /*II_22*/{ 0x1b, 41 }, - /*II_23*/{ 0x1c, 41 }, - /*II_24*/{ 0x1d, 41 }, - /*II_25*/{ 0x1e, 41 }, - /*II_27*/{ 0x1f, 46 }, - /*II_28*/{ 0x0, 51 }, - /*II_29*/{ 0x1, 51 }, - /*II_2A*/{ 0x2, 51 }, - /*II_2B*/{ 0x3, 51 }, - /*II_2C*/{ 0x4, 51 }, - /*II_2D*/{ 0x5, 51 }, - /*II_2F*/{ 0x1f, 56 }, - /*II_30*/{ 0x20, 61 }, - /*II_31*/{ 0x21, 61 }, - /*II_32*/{ 0x22, 61 }, - /*II_33*/{ 0x23, 61 }, - /*II_34*/{ 0x24, 61 }, - /*II_35*/{ 0x25, 61 }, - /*II_37*/{ 0x26, 66 }, - /*II_38*/{ 0x27, 71 }, - /*II_39*/{ 0x28, 71 }, - /*II_3A*/{ 0x29, 71 }, - /*II_3B*/{ 0x2a, 71 }, - /*II_3C*/{ 0x2b, 71 }, - /*II_3D*/{ 0x2c, 71 }, - /*II_3F*/{ 0x26, 76 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_40*/{ 0x2d, 81 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_48*/{ 0x2d, 86 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_50*/{ 0x2e, 16 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_58*/{ 0x2f, 22 }, - /*II_60*/{ 0x30, 91 }, - /*II_61*/{ 0x30, 98 }, - /*II_62*/{ 0x31, 104 }, - /*II_63*/{ 0x32, 111 }, - /*II_68*/{ 0x33, 16 }, - /*II_6A*/{ 0x35, 16 }, - /*II_6C*/{ 0x36, 32891 }, - /*II_6D*/{ 0x37, 32891 }, - /*II_6E*/{ 0x38, 32896 }, - /*II_6F*/{ 0x39, 32896 }, - /*II_70*/{ 0x3a, 134 }, - /*II_71*/{ 0x3a, 138 }, - /*II_72*/{ 0x3b, 143 }, - /*II_73*/{ 0x3b, 147 }, - /*II_74*/{ 0x3c, 152 }, - /*II_75*/{ 0x3c, 156 }, - /*II_76*/{ 0x3d, 161 }, - /*II_77*/{ 0x3d, 166 }, - /*II_78*/{ 0x3e, 170 }, - /*II_79*/{ 0x3e, 174 }, - /*II_7A*/{ 0x3f, 179 }, - /*II_7B*/{ 0x3f, 183 }, - /*II_7C*/{ 0x40, 188 }, - /*II_7D*/{ 0x40, 192 }, - /*II_7E*/{ 0x41, 197 }, - /*II_7F*/{ 0x41, 202 }, - /*II_84*/{ 0x42, 206 }, - /*II_85*/{ 0x43, 206 }, - /*II_86*/{ 0x44, 212 }, - /*II_87*/{ 0x45, 212 }, - /*II_88*/{ 0x46, 218 }, - /*II_89*/{ 0x47, 218 }, - /*II_8A*/{ 0x48, 218 }, - /*II_8B*/{ 0x49, 218 }, - /*II_8C*/{ 0x4a, 218 }, - /*II_8D*/{ 0x4b, 223 }, - /*II_8E*/{ 0x4c, 218 }, - /*II_90*/{ 0x4d, 212 }, - /*II_91*/{ 0x4d, 212 }, - /*II_92*/{ 0x4d, 212 }, - /*II_93*/{ 0x4d, 212 }, - /*II_94*/{ 0x4d, 212 }, - /*II_95*/{ 0x4d, 212 }, - /*II_96*/{ 0x4d, 212 }, - /*II_97*/{ 0x4d, 212 }, - /*II_9A*/{ 0x4f, 260 }, - /*II_9C*/{ 0x50, 270 }, - /*II_9D*/{ 0x51, 277 }, - /*II_9E*/{ 0x52, 283 }, - /*II_9F*/{ 0x53, 289 }, - /*II_A0*/{ 0x54, 218 }, - /*II_A1*/{ 0x55, 218 }, - /*II_A2*/{ 0x56, 218 }, - /*II_A3*/{ 0x57, 218 }, - /*II_A4*/{ 0x58, 295 }, - /*II_A5*/{ 0x59, 295 }, - /*II_A6*/{ 0x5a, 301 }, - /*II_A7*/{ 0x5b, 301 }, - /*II_A8*/{ 0x5c, 206 }, - /*II_A9*/{ 0x5d, 206 }, - /*II_AA*/{ 0x5e, 307 }, - /*II_AB*/{ 0x5f, 307 }, - /*II_AC*/{ 0x60, 313 }, - /*II_AD*/{ 0x61, 313 }, - /*II_AE*/{ 0x62, 319 }, - /*II_AF*/{ 0x63, 319 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B0*/{ 0x64, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_B8*/{ 0x65, 218 }, - /*II_C2*/{ 0x66, 325 }, - /*II_C3*/{ 0x67, 325 }, - /*II_C4*/{ 0x68, 330 }, - /*II_C5*/{ 0x68, 335 }, - /*II_C8*/{ 0x69, 340 }, - /*II_C9*/{ 0x6a, 347 }, - /*II_CA*/{ 0x6b, 354 }, - /*II_CB*/{ 0x6c, 354 }, - /*II_CC*/{ 0x6d, 360 }, - /*II_CD*/{ 0x6e, 367 }, - /*II_CE*/{ 0x6f, 372 }, - /*II_CF*/{ 0x70, 33146 }, - /*II_D4*/{ 0x71, 384 }, - /*II_D5*/{ 0x71, 389 }, - /*II_D6*/{ 0x72, 394 }, - /*II_D7*/{ 0x73, 400 }, - /*II_E0*/{ 0x74, 406 }, - /*II_E1*/{ 0x74, 414 }, - /*II_E2*/{ 0x75, 421 }, - /*II_E4*/{ 0x77, 33215 }, - /*II_E5*/{ 0x78, 33215 }, - /*II_E6*/{ 0x79, 33219 }, - /*II_E7*/{ 0x7a, 33219 }, - /*II_E8*/{ 0x7b, 456 }, - /*II_E9*/{ 0x7c, 462 }, - /*II_EA*/{ 0x7d, 467 }, - /*II_EB*/{ 0x7e, 462 }, - /*II_EC*/{ 0x7f, 33215 }, - /*II_ED*/{ 0x80, 33215 }, - /*II_EE*/{ 0x81, 33219 }, - /*II_EF*/{ 0x82, 33219 }, - /*II_F1*/{ 0x6d, 476 }, - /*II_F4*/{ 0x53, 33250 }, - /*II_F5*/{ 0x83, 487 }, - /*II_F8*/{ 0x83, 492 }, - /*II_F9*/{ 0x83, 497 }, - /*II_FA*/{ 0x84, 33270 }, - /*II_FB*/{ 0x84, 33275 }, - /*II_FC*/{ 0x85, 512 }, - /*II_FD*/{ 0x85, 517 }, - /*II_0F_02*/{ 0x86, 522 }, - /*II_0F_03*/{ 0x86, 527 }, - /*II_0F_05*/{ 0x87, 532 }, - /*II_0F_06*/{ 0x88, 33309 }, - /*II_0F_07*/{ 0x87, 547 }, - /*II_0F_08*/{ 0x88, 33323 }, - /*II_0F_09*/{ 0x88, 33329 }, - /*II_0F_0B*/{ 0x89, 569 }, - /*II_0F_0E*/{ 0x8a, 574 }, - /*II_0F_1F*/{ 0x8b, 581 }, - /*II_0F_20*/{ 0x8c, 32986 }, - /*II_0F_21*/{ 0x8d, 32986 }, - /*II_0F_22*/{ 0x8e, 32986 }, - /*II_0F_23*/{ 0x8f, 32986 }, - /*II_0F_30*/{ 0x88, 33354 }, - /*II_0F_31*/{ 0x88, 33361 }, - /*II_0F_32*/{ 0x88, 33368 }, - /*II_0F_33*/{ 0x88, 33375 }, - /*II_0F_34*/{ 0x87, 614 }, - /*II_0F_35*/{ 0x87, 624 }, - /*II_0F_37*/{ 0x90, 633 }, - /*II_0F_40*/{ 0x91, 641 }, - /*II_0F_41*/{ 0x91, 648 }, - /*II_0F_42*/{ 0x92, 656 }, - /*II_0F_43*/{ 0x92, 663 }, - /*II_0F_44*/{ 0x93, 671 }, - /*II_0F_45*/{ 0x93, 678 }, - /*II_0F_46*/{ 0x94, 686 }, - /*II_0F_47*/{ 0x94, 694 }, - /*II_0F_48*/{ 0x95, 701 }, - /*II_0F_49*/{ 0x95, 708 }, - /*II_0F_4A*/{ 0x96, 716 }, - /*II_0F_4B*/{ 0x96, 723 }, - /*II_0F_4C*/{ 0x97, 731 }, - /*II_0F_4D*/{ 0x97, 738 }, - /*II_0F_4E*/{ 0x98, 746 }, - /*II_0F_4F*/{ 0x98, 754 }, - /*II_0F_80*/{ 0x99, 134 }, - /*II_0F_81*/{ 0x99, 138 }, - /*II_0F_82*/{ 0x9a, 143 }, - /*II_0F_83*/{ 0x9a, 147 }, - /*II_0F_84*/{ 0x9b, 152 }, - /*II_0F_85*/{ 0x9b, 156 }, - /*II_0F_86*/{ 0x9c, 161 }, - /*II_0F_87*/{ 0x9c, 166 }, - /*II_0F_88*/{ 0x9d, 170 }, - /*II_0F_89*/{ 0x9d, 174 }, - /*II_0F_8A*/{ 0x9e, 179 }, - /*II_0F_8B*/{ 0x9e, 183 }, - /*II_0F_8C*/{ 0x9f, 188 }, - /*II_0F_8D*/{ 0x9f, 192 }, - /*II_0F_8E*/{ 0xa0, 197 }, - /*II_0F_8F*/{ 0xa0, 202 }, - /*II_0F_90*/{ 0xa1, 761 }, - /*II_0F_91*/{ 0xa1, 767 }, - /*II_0F_92*/{ 0xa2, 774 }, - /*II_0F_93*/{ 0xa2, 780 }, - /*II_0F_94*/{ 0xa3, 787 }, - /*II_0F_95*/{ 0xa3, 793 }, - /*II_0F_96*/{ 0xa4, 800 }, - /*II_0F_97*/{ 0xa4, 807 }, - /*II_0F_98*/{ 0xa5, 813 }, - /*II_0F_99*/{ 0xa5, 819 }, - /*II_0F_9A*/{ 0xa6, 826 }, - /*II_0F_9B*/{ 0xa6, 832 }, - /*II_0F_9C*/{ 0xa7, 839 }, - /*II_0F_9D*/{ 0xa7, 845 }, - /*II_0F_9E*/{ 0xa8, 852 }, - /*II_0F_9F*/{ 0xa8, 859 }, - /*II_0F_A0*/{ 0xa9, 16 }, - /*II_0F_A1*/{ 0xaa, 22 }, - /*II_0F_A2*/{ 0x88, 865 }, - /*II_0F_A3*/{ 0xab, 872 }, - /*II_0F_A8*/{ 0xad, 16 }, - /*II_0F_A9*/{ 0xae, 22 }, - /*II_0F_AA*/{ 0xaf, 882 }, - /*II_0F_AB*/{ 0xb0, 887 }, - /*II_0F_AF*/{ 0xb1, 117 }, - /*II_0F_B0*/{ 0xb2, 898 }, - /*II_0F_B1*/{ 0xb3, 898 }, - /*II_0F_B2*/{ 0xb4, 907 }, - /*II_0F_B3*/{ 0xb0, 912 }, - /*II_0F_B4*/{ 0xb4, 917 }, - /*II_0F_B5*/{ 0xb4, 922 }, - /*II_0F_B6*/{ 0xb5, 927 }, - /*II_0F_B7*/{ 0xb6, 927 }, - /*II_0F_B9*/{ 0x89, 569 }, - /*II_0F_BB*/{ 0xb0, 934 }, - /*II_0F_BE*/{ 0xb5, 939 }, - /*II_0F_BF*/{ 0xb6, 939 }, - /*II_0F_C0*/{ 0xb2, 946 }, - /*II_0F_C1*/{ 0xb3, 946 }, - /*II_0F_C3*/{ 0xb7, 952 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_0F_C8*/{ 0xb8, 960 }, - /*II_80_00*/{ 0xb9, 11 }, - /*II_80_01*/{ 0xba, 27 }, - /*II_80_02*/{ 0xbb, 31 }, - /*II_80_03*/{ 0xbb, 36 }, - /*II_80_04*/{ 0xbc, 41 }, - /*II_80_05*/{ 0xb9, 51 }, - /*II_80_06*/{ 0xbd, 61 }, - /*II_80_07*/{ 0xbe, 71 }, - /*II_81_00*/{ 0xbf, 11 }, - /*II_81_01*/{ 0xc0, 27 }, - /*II_81_02*/{ 0xc1, 31 }, - /*II_81_03*/{ 0xc1, 36 }, - /*II_81_04*/{ 0xc2, 41 }, - /*II_81_05*/{ 0xbf, 51 }, - /*II_81_06*/{ 0xc3, 61 }, - /*II_81_07*/{ 0xc4, 71 }, - /*II_82_00*/{ 0xc5, 11 }, - /*II_82_01*/{ 0xc6, 27 }, - /*II_82_02*/{ 0xc7, 31 }, - /*II_82_03*/{ 0xc7, 36 }, - /*II_82_04*/{ 0xc8, 41 }, - /*II_82_05*/{ 0xc5, 51 }, - /*II_82_06*/{ 0xc9, 61 }, - /*II_82_07*/{ 0xca, 71 }, - /*II_83_00*/{ 0xcb, 11 }, - /*II_83_01*/{ 0xcc, 27 }, - /*II_83_02*/{ 0xcd, 31 }, - /*II_83_03*/{ 0xcd, 36 }, - /*II_83_04*/{ 0xce, 41 }, - /*II_83_05*/{ 0xcb, 51 }, - /*II_83_06*/{ 0xcf, 61 }, - /*II_83_07*/{ 0xd0, 71 }, - /*II_8F_00*/{ 0xd1, 22 }, - /*II_C0_00*/{ 0xd2, 967 }, - /*II_C0_01*/{ 0xd2, 972 }, - /*II_C0_02*/{ 0xd3, 977 }, - /*II_C0_03*/{ 0xd3, 982 }, - /*II_C0_04*/{ 0xd4, 987 }, - /*II_C0_05*/{ 0xd4, 992 }, - /*II_C0_06*/{ 0xd4, 997 }, - /*II_C0_07*/{ 0xd4, 1002 }, - /*II_C1_00*/{ 0xd5, 967 }, - /*II_C1_01*/{ 0xd5, 972 }, - /*II_C1_02*/{ 0xd6, 977 }, - /*II_C1_03*/{ 0xd6, 982 }, - /*II_C1_04*/{ 0xd7, 987 }, - /*II_C1_05*/{ 0xd7, 992 }, - /*II_C1_06*/{ 0xd7, 997 }, - /*II_C1_07*/{ 0xd7, 1002 }, - /*II_C6_00*/{ 0xd8, 218 }, - /*II_C6_F8*/{ 0xd9, 1007 }, - /*II_C7_00*/{ 0xda, 218 }, - /*II_C7_F8*/{ 0xdb, 1015 }, - /*II_D0_00*/{ 0xdc, 967 }, - /*II_D0_01*/{ 0xdc, 972 }, - /*II_D0_02*/{ 0xdd, 977 }, - /*II_D0_03*/{ 0xdd, 982 }, - /*II_D0_04*/{ 0xde, 987 }, - /*II_D0_05*/{ 0xde, 992 }, - /*II_D0_06*/{ 0xde, 997 }, - /*II_D0_07*/{ 0xde, 1002 }, - /*II_D1_00*/{ 0xdf, 967 }, - /*II_D1_01*/{ 0xdf, 972 }, - /*II_D1_02*/{ 0xe0, 977 }, - /*II_D1_03*/{ 0xe0, 982 }, - /*II_D1_04*/{ 0xe1, 987 }, - /*II_D1_05*/{ 0xe1, 992 }, - /*II_D1_06*/{ 0xe1, 997 }, - /*II_D1_07*/{ 0xe1, 1002 }, - /*II_D2_00*/{ 0xe2, 967 }, - /*II_D2_01*/{ 0xe2, 972 }, - /*II_D2_02*/{ 0xe3, 977 }, - /*II_D2_03*/{ 0xe3, 982 }, - /*II_D2_04*/{ 0xe4, 987 }, - /*II_D2_05*/{ 0xe4, 992 }, - /*II_D2_06*/{ 0xe4, 997 }, - /*II_D2_07*/{ 0xe4, 1002 }, - /*II_D3_00*/{ 0xe5, 967 }, - /*II_D3_01*/{ 0xe5, 972 }, - /*II_D3_02*/{ 0xe6, 977 }, - /*II_D3_03*/{ 0xe6, 982 }, - /*II_D3_04*/{ 0xe7, 987 }, - /*II_D3_05*/{ 0xe7, 992 }, - /*II_D3_06*/{ 0xe7, 997 }, - /*II_D3_07*/{ 0xe7, 1002 }, - /*II_D8_00*/{ 0xe8, 1023 }, - /*II_D8_01*/{ 0xe8, 1029 }, - /*II_D8_02*/{ 0xe8, 1035 }, - /*II_D8_03*/{ 0xe8, 1041 }, - /*II_D8_04*/{ 0xe8, 1048 }, - /*II_D8_05*/{ 0xe8, 1054 }, - /*II_D8_06*/{ 0xe8, 1061 }, - /*II_D8_07*/{ 0xe8, 1067 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C0*/{ 0xe9, 1023 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_C8*/{ 0xe9, 1029 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D0*/{ 0xea, 1035 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D9*/{ 0xeb, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_D8*/{ 0xea, 1041 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E0*/{ 0xe9, 1048 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_E8*/{ 0xe9, 1054 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F0*/{ 0xe9, 1061 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D8_F8*/{ 0xe9, 1067 }, - /*II_D9_00*/{ 0xe8, 1074 }, - /*II_D9_02*/{ 0xec, 1079 }, - /*II_D9_03*/{ 0xec, 1084 }, - /*II_D9_04*/{ 0xed, 1090 }, - /*II_D9_05*/{ 0xee, 1098 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C0*/{ 0xea, 1074 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C9*/{ 0xeb, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_C8*/{ 0xea, 1105 }, - /*II_D9_D0*/{ 0xeb, 1111 }, - /*II_D9_E0*/{ 0xeb, 1117 }, - /*II_D9_E1*/{ 0xeb, 1123 }, - /*II_D9_E4*/{ 0xeb, 1129 }, - /*II_D9_E5*/{ 0xeb, 1135 }, - /*II_D9_E8*/{ 0xeb, 1141 }, - /*II_D9_E9*/{ 0xeb, 1147 }, - /*II_D9_EA*/{ 0xeb, 1155 }, - /*II_D9_EB*/{ 0xeb, 1163 }, - /*II_D9_EC*/{ 0xeb, 1170 }, - /*II_D9_ED*/{ 0xeb, 1178 }, - /*II_D9_EE*/{ 0xeb, 1186 }, - /*II_D9_F0*/{ 0xeb, 1192 }, - /*II_D9_F1*/{ 0xeb, 1199 }, - /*II_D9_F2*/{ 0xeb, 1206 }, - /*II_D9_F3*/{ 0xeb, 1213 }, - /*II_D9_F4*/{ 0xeb, 1221 }, - /*II_D9_F5*/{ 0xeb, 1230 }, - /*II_D9_F6*/{ 0xeb, 1238 }, - /*II_D9_F7*/{ 0xeb, 1247 }, - /*II_D9_F8*/{ 0xeb, 1256 }, - /*II_D9_F9*/{ 0xeb, 1263 }, - /*II_D9_FA*/{ 0xeb, 1272 }, - /*II_D9_FB*/{ 0xeb, 1279 }, - /*II_D9_FC*/{ 0xeb, 1288 }, - /*II_D9_FD*/{ 0xeb, 1297 }, - /*II_D9_FE*/{ 0xeb, 1305 }, - /*II_D9_FF*/{ 0xeb, 1311 }, - /*II_DA_00*/{ 0xe8, 1317 }, - /*II_DA_01*/{ 0xe8, 1324 }, - /*II_DA_02*/{ 0xe8, 1331 }, - /*II_DA_03*/{ 0xe8, 1338 }, - /*II_DA_04*/{ 0xe8, 1346 }, - /*II_DA_05*/{ 0xe8, 1353 }, - /*II_DA_06*/{ 0xe8, 1361 }, - /*II_DA_07*/{ 0xe8, 1368 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C0*/{ 0xef, 1376 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_C8*/{ 0xf0, 1384 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D0*/{ 0xf1, 1392 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_D8*/{ 0xf2, 1401 }, - /*II_DA_E9*/{ 0xeb, 1409 }, - /*II_DB_00*/{ 0xe8, 1418 }, - /*II_DB_01*/{ 0xf3, 1424 }, - /*II_DB_02*/{ 0xec, 1432 }, - /*II_DB_03*/{ 0xec, 1438 }, - /*II_DB_05*/{ 0xf4, 1074 }, - /*II_DB_07*/{ 0xf5, 1084 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C0*/{ 0xef, 1445 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_C8*/{ 0xf0, 1454 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D0*/{ 0xf1, 1463 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_D8*/{ 0xf2, 1473 }, - /*II_DB_E0*/{ 0xeb, 1482 }, - /*II_DB_E1*/{ 0xeb, 1488 }, - /*II_DB_E4*/{ 0xeb, 1496 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_E8*/{ 0xf6, 1504 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DB_F0*/{ 0xf7, 1512 }, - /*II_DC_00*/{ 0xf8, 1023 }, - /*II_DC_01*/{ 0xf8, 1029 }, - /*II_DC_02*/{ 0xf8, 1035 }, - /*II_DC_03*/{ 0xf8, 1041 }, - /*II_DC_04*/{ 0xf8, 1048 }, - /*II_DC_05*/{ 0xf8, 1054 }, - /*II_DC_06*/{ 0xf8, 1061 }, - /*II_DC_07*/{ 0xf8, 1067 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C0*/{ 0xf9, 1023 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_C8*/{ 0xf9, 1029 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E0*/{ 0xf9, 1054 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_E8*/{ 0xf9, 1048 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F0*/{ 0xf9, 1067 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DC_F8*/{ 0xf9, 1061 }, - /*II_DD_00*/{ 0xf8, 1074 }, - /*II_DD_01*/{ 0xfa, 1424 }, - /*II_DD_02*/{ 0xfb, 1079 }, - /*II_DD_03*/{ 0xfb, 1084 }, - /*II_DD_04*/{ 0xed, 1519 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_C0*/{ 0xea, 1527 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D0*/{ 0xea, 1079 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_D8*/{ 0xea, 1084 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E1*/{ 0xeb, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E0*/{ 0xf9, 1534 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E9*/{ 0xeb, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DD_E8*/{ 0xea, 1541 }, - /*II_DE_00*/{ 0xee, 1317 }, - /*II_DE_01*/{ 0xee, 1324 }, - /*II_DE_02*/{ 0xee, 1331 }, - /*II_DE_03*/{ 0xee, 1338 }, - /*II_DE_04*/{ 0xee, 1346 }, - /*II_DE_05*/{ 0xee, 1353 }, - /*II_DE_06*/{ 0xee, 1361 }, - /*II_DE_07*/{ 0xee, 1368 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C1*/{ 0xeb, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C0*/{ 0xf9, 1549 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C9*/{ 0xeb, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_C8*/{ 0xf9, 1556 }, - /*II_DE_D9*/{ 0xeb, 1563 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E1*/{ 0xeb, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E0*/{ 0xf9, 1571 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E9*/{ 0xeb, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_E8*/{ 0xf9, 1579 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F1*/{ 0xeb, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F0*/{ 0xf9, 1586 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F9*/{ 0xeb, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DE_F8*/{ 0xf9, 1594 }, - /*II_DF_00*/{ 0xee, 1418 }, - /*II_DF_01*/{ 0xfc, 1424 }, - /*II_DF_02*/{ 0xfd, 1432 }, - /*II_DF_03*/{ 0xfd, 1438 }, - /*II_DF_04*/{ 0xf4, 1601 }, - /*II_DF_05*/{ 0xf8, 1418 }, - /*II_DF_06*/{ 0xf5, 1607 }, - /*II_DF_07*/{ 0xfb, 1438 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_E8*/{ 0xf6, 1614 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_DF_F0*/{ 0xf6, 1623 }, - /*II_F6_00*/{ 0xfe, 206 }, - /*II_F6_02*/{ 0xff, 1631 }, - /*II_F6_03*/{ 0x100, 1636 }, - /*II_F6_04*/{ 0x101, 1641 }, - /*II_F6_05*/{ 0x101, 117 }, - /*II_F6_06*/{ 0x102, 1646 }, - /*II_F6_07*/{ 0x102, 1651 }, - /*II_F7_00*/{ 0x103, 206 }, - /*II_F7_02*/{ 0x104, 1631 }, - /*II_F7_03*/{ 0x105, 1636 }, - /*II_F7_04*/{ 0x106, 1641 }, - /*II_F7_05*/{ 0x106, 117 }, - /*II_F7_06*/{ 0x107, 1646 }, - /*II_F7_07*/{ 0x107, 1651 }, - /*II_FE_00*/{ 0x108, 81 }, - /*II_FE_01*/{ 0x108, 86 }, - /*II_FF_00*/{ 0x109, 81 }, - /*II_FF_01*/{ 0x109, 86 }, - /*II_FF_02*/{ 0x10a, 456 }, - /*II_FF_03*/{ 0x10b, 260 }, - /*II_FF_04*/{ 0x10c, 462 }, - /*II_FF_05*/{ 0x10d, 467 }, - /*II_FF_06*/{ 0x10e, 16 }, - /*II_0F_00_00*/{ 0x10f, 1657 }, - /*II_0F_00_01*/{ 0x110, 1663 }, - /*II_0F_00_02*/{ 0x110, 34436 }, - /*II_0F_00_03*/{ 0x111, 34442 }, - /*II_0F_00_04*/{ 0x112, 1679 }, - /*II_0F_00_05*/{ 0x112, 1685 }, - /*II_0F_01_00*/{ 0x113, 1691 }, - /*II_0F_01_01*/{ 0x113, 1697 }, - /*II_0F_01_02*/{ 0x113, 34471 }, - /*II_0F_01_03*/{ 0x113, 34477 }, - /*II_0F_01_04*/{ 0x114, 1715 }, - /*II_0F_01_06*/{ 0x115, 34489 }, - /*II_0F_01_07*/{ 0x116, 34495 }, - /*II_0F_01_C1*/{ 0x117, 1735 }, - /*II_0F_01_C2*/{ 0x117, 1743 }, - /*II_0F_01_C3*/{ 0x117, 1753 }, - /*II_0F_01_C4*/{ 0x117, 1763 }, - /*II_0F_01_C8*/{ 0x118, 1771 }, - /*II_0F_01_C9*/{ 0x118, 1780 }, - /*II_0F_01_D0*/{ 0x88, 1787 }, - /*II_0F_01_D1*/{ 0x88, 1795 }, - /*II_0F_01_D4*/{ 0x117, 1803 }, - /*II_0F_01_D5*/{ 0x119, 1811 }, - /*II_0F_01_D8*/{ 0x11a, 1817 }, - /*II_0F_01_D9*/{ 0x11b, 1824 }, - /*II_0F_01_DA*/{ 0x11c, 1833 }, - /*II_0F_01_DB*/{ 0x11c, 1841 }, - /*II_0F_01_DC*/{ 0x11b, 1849 }, - /*II_0F_01_DD*/{ 0x11b, 1855 }, - /*II_0F_01_DE*/{ 0x11c, 1861 }, - /*II_0F_01_DF*/{ 0x11d, 1869 }, - /*II_0F_01_F8*/{ 0x11e, 1878 }, - /*II_0F_01_F9*/{ 0x11e, 1886 }, - /*II_0F_0D_00*/{ 0x11f, 1894 }, - /*II_0F_0D_01*/{ 0x11f, 1904 }, - /*II_0F_0F_0C*/{ 0x120, 1915 }, - /*II_0F_0F_0D*/{ 0x121, 1922 }, - /*II_0F_0F_1C*/{ 0x120, 1929 }, - /*II_0F_0F_1D*/{ 0x121, 1936 }, - /*II_0F_0F_8A*/{ 0x120, 1943 }, - /*II_0F_0F_8E*/{ 0x120, 1951 }, - /*II_0F_0F_90*/{ 0x121, 1960 }, - /*II_0F_0F_94*/{ 0x121, 1969 }, - /*II_0F_0F_96*/{ 0x121, 1976 }, - /*II_0F_0F_97*/{ 0x121, 1983 }, - /*II_0F_0F_9A*/{ 0x121, 1992 }, - /*II_0F_0F_9E*/{ 0x121, 1999 }, - /*II_0F_0F_A0*/{ 0x121, 2006 }, - /*II_0F_0F_A4*/{ 0x121, 2015 }, - /*II_0F_0F_A6*/{ 0x121, 2022 }, - /*II_0F_0F_A7*/{ 0x121, 2032 }, - /*II_0F_0F_AA*/{ 0x121, 2042 }, - /*II_0F_0F_AE*/{ 0x121, 2050 }, - /*II_0F_0F_B0*/{ 0x121, 2057 }, - /*II_0F_0F_B4*/{ 0x121, 2066 }, - /*II_0F_0F_B6*/{ 0x121, 2073 }, - /*II_0F_0F_B7*/{ 0x121, 2083 }, - /*II_0F_0F_BB*/{ 0x120, 2092 }, - /*II_0F_0F_BF*/{ 0x121, 2100 }, - /*II_0F_10*/{ 0x122, 2109 }, - /*II_66_0F_10*/{ 0x123, 2117 }, - /*II_F3_0F_10*/{ 0x124, 2125 }, - /*II_F2_0F_10*/{ 0x125, 2132 }, - /*II_0F_11*/{ 0x12a, 2109 }, - /*II_66_0F_11*/{ 0x12b, 2117 }, - /*II_F3_0F_11*/{ 0x12c, 2125 }, - /*II_F2_0F_11*/{ 0x12d, 2132 }, - /*II_66_0F_12*/{ 0x132, 2190 }, - /*II_F3_0F_12*/{ 0x133, 2198 }, - /*II_F2_0F_12*/{ 0x133, 2208 }, - /*II_0F_13*/{ 0x137, 2182 }, - /*II_66_0F_13*/{ 0x138, 2190 }, - /*II_0F_14*/{ 0x13a, 2266 }, - /*II_66_0F_14*/{ 0x13b, 2276 }, - /*II_0F_15*/{ 0x13a, 2308 }, - /*II_66_0F_15*/{ 0x13b, 2318 }, - /*II_66_0F_16*/{ 0x132, 2367 }, - /*II_F3_0F_16*/{ 0x13d, 2375 }, - /*II_0F_17*/{ 0x137, 2359 }, - /*II_66_0F_17*/{ 0x138, 2367 }, - /*II_0F_18_00*/{ 0x13e, 2424 }, - /*II_0F_18_01*/{ 0x13e, 2437 }, - /*II_0F_18_02*/{ 0x13e, 2449 }, - /*II_0F_18_03*/{ 0x13e, 2461 }, - /*II_0F_28*/{ 0x122, 2473 }, - /*II_66_0F_28*/{ 0x123, 2481 }, - /*II_0F_29*/{ 0x12a, 2473 }, - /*II_66_0F_29*/{ 0x12b, 2481 }, - /*II_0F_2A*/{ 0x13f, 2507 }, - /*II_66_0F_2A*/{ 0x140, 2517 }, - /*II_F3_0F_2A*/{ 0x141, 2527 }, - /*II_F2_0F_2A*/{ 0x142, 2537 }, - /*II_0F_2B*/{ 0x143, 2569 }, - /*II_66_0F_2B*/{ 0x144, 2578 }, - /*II_F3_0F_2B*/{ 0x145, 2587 }, - /*II_F2_0F_2B*/{ 0x146, 2596 }, - /*II_0F_2C*/{ 0x148, 2625 }, - /*II_66_0F_2C*/{ 0x149, 2636 }, - /*II_F3_0F_2C*/{ 0x14a, 2647 }, - /*II_F2_0F_2C*/{ 0x14b, 2658 }, - /*II_0F_2D*/{ 0x148, 2693 }, - /*II_66_0F_2D*/{ 0x13b, 2703 }, - /*II_F3_0F_2D*/{ 0x14a, 2713 }, - /*II_F2_0F_2D*/{ 0x14b, 2723 }, - /*II_0F_2E*/{ 0x14d, 2755 }, - /*II_66_0F_2E*/{ 0x14e, 2764 }, - /*II_0F_2F*/{ 0x14d, 2793 }, - /*II_66_0F_2F*/{ 0x14e, 2801 }, - /*II_0F_50*/{ 0x151, 2827 }, - /*II_66_0F_50*/{ 0x152, 2837 }, - /*II_0F_51*/{ 0x13a, 2869 }, - /*II_66_0F_51*/{ 0x13b, 2877 }, - /*II_F3_0F_51*/{ 0x154, 2885 }, - /*II_F2_0F_51*/{ 0x14e, 2893 }, - /*II_0F_52*/{ 0x13a, 2937 }, - /*II_F3_0F_52*/{ 0x154, 2946 }, - /*II_0F_53*/{ 0x13a, 2975 }, - /*II_F3_0F_53*/{ 0x154, 2982 }, - /*II_0F_54*/{ 0x13a, 3005 }, - /*II_66_0F_54*/{ 0x13b, 3012 }, - /*II_0F_55*/{ 0x13a, 3035 }, - /*II_66_0F_55*/{ 0x13b, 3043 }, - /*II_0F_56*/{ 0x13a, 3069 }, - /*II_66_0F_56*/{ 0x13b, 3075 }, - /*II_0F_57*/{ 0x13a, 3095 }, - /*II_66_0F_57*/{ 0x13b, 3102 }, - /*II_0F_58*/{ 0x13a, 3125 }, - /*II_66_0F_58*/{ 0x13b, 3132 }, - /*II_F3_0F_58*/{ 0x154, 3139 }, - /*II_F2_0F_58*/{ 0x14e, 3146 }, - /*II_0F_59*/{ 0x13a, 3185 }, - /*II_66_0F_59*/{ 0x13b, 3192 }, - /*II_F3_0F_59*/{ 0x154, 3199 }, - /*II_F2_0F_59*/{ 0x14e, 3206 }, - /*II_0F_5A*/{ 0x14e, 3245 }, - /*II_66_0F_5A*/{ 0x13b, 3255 }, - /*II_F3_0F_5A*/{ 0x155, 3265 }, - /*II_F2_0F_5A*/{ 0x14e, 3275 }, - /*II_0F_5B*/{ 0x13b, 3329 }, - /*II_66_0F_5B*/{ 0x13b, 3339 }, - /*II_F3_0F_5B*/{ 0x13b, 3349 }, - /*II_0F_5C*/{ 0x13a, 3394 }, - /*II_66_0F_5C*/{ 0x13b, 3401 }, - /*II_F3_0F_5C*/{ 0x154, 3408 }, - /*II_F2_0F_5C*/{ 0x14e, 3415 }, - /*II_0F_5D*/{ 0x13a, 3454 }, - /*II_66_0F_5D*/{ 0x13b, 3461 }, - /*II_F3_0F_5D*/{ 0x154, 3468 }, - /*II_F2_0F_5D*/{ 0x14e, 3475 }, - /*II_0F_5E*/{ 0x13a, 3514 }, - /*II_66_0F_5E*/{ 0x13b, 3521 }, - /*II_F3_0F_5E*/{ 0x154, 3528 }, - /*II_F2_0F_5E*/{ 0x14e, 3535 }, - /*II_0F_5F*/{ 0x13a, 3574 }, - /*II_66_0F_5F*/{ 0x13b, 3581 }, - /*II_F3_0F_5F*/{ 0x154, 3588 }, - /*II_F2_0F_5F*/{ 0x14e, 3595 }, - /*II_0F_60*/{ 0x158, 3634 }, - /*II_66_0F_60*/{ 0x13b, 3634 }, - /*II_0F_61*/{ 0x158, 3657 }, - /*II_66_0F_61*/{ 0x13b, 3657 }, - /*II_0F_62*/{ 0x158, 3680 }, - /*II_66_0F_62*/{ 0x13b, 3680 }, - /*II_0F_63*/{ 0x159, 3703 }, - /*II_66_0F_63*/{ 0x13b, 3703 }, - /*II_0F_64*/{ 0x159, 3724 }, - /*II_66_0F_64*/{ 0x13b, 3724 }, - /*II_0F_65*/{ 0x159, 3743 }, - /*II_66_0F_65*/{ 0x13b, 3743 }, - /*II_0F_66*/{ 0x159, 3762 }, - /*II_66_0F_66*/{ 0x13b, 3762 }, - /*II_0F_67*/{ 0x159, 3781 }, - /*II_66_0F_67*/{ 0x13b, 3781 }, - /*II_0F_68*/{ 0x159, 3802 }, - /*II_66_0F_68*/{ 0x13b, 3802 }, - /*II_0F_69*/{ 0x159, 3825 }, - /*II_66_0F_69*/{ 0x13b, 3825 }, - /*II_0F_6A*/{ 0x159, 3848 }, - /*II_66_0F_6A*/{ 0x13b, 3848 }, - /*II_0F_6B*/{ 0x159, 3871 }, - /*II_66_0F_6B*/{ 0x13b, 3871 }, - /*II_66_0F_6C*/{ 0x13b, 3892 }, - /*II_66_0F_6D*/{ 0x13b, 3917 }, - /*II_0F_6F*/{ 0x15d, 3948 }, - /*II_66_0F_6F*/{ 0x123, 3968 }, - /*II_F3_0F_6F*/{ 0x123, 3976 }, - /*II_0F_74*/{ 0x159, 4065 }, - /*II_66_0F_74*/{ 0x13b, 4065 }, - /*II_0F_75*/{ 0x159, 4084 }, - /*II_66_0F_75*/{ 0x13b, 4084 }, - /*II_0F_76*/{ 0x159, 4103 }, - /*II_66_0F_76*/{ 0x13b, 4103 }, - /*II_0F_77*/{ 0x161, 4122 }, - /*II_0F_78*/{ 0x163, 4150 }, - /*II_0F_79*/{ 0x166, 4174 }, - /*II_66_0F_79*/{ 0x167, 4158 }, - /*II_F2_0F_79*/{ 0x168, 4165 }, - /*II_0F_7A_30*/{ 0x169, 4183 }, - /*II_0F_7A_31*/{ 0x16a, 4193 }, - /*II_66_0F_7C*/{ 0x16b, 4203 }, - /*II_F2_0F_7C*/{ 0x16b, 4211 }, - /*II_66_0F_7D*/{ 0x16b, 4237 }, - /*II_F2_0F_7D*/{ 0x16b, 4245 }, - /*II_F3_0F_7E*/{ 0x125, 3948 }, - /*II_0F_7F*/{ 0x16f, 3948 }, - /*II_66_0F_7F*/{ 0x12b, 3968 }, - /*II_F3_0F_7F*/{ 0x12b, 3976 }, - /*II_F3_0F_B8*/{ 0x173, 4360 }, - /*II_0F_BA_04*/{ 0x174, 872 }, - /*II_0F_BA_05*/{ 0x175, 887 }, - /*II_0F_BA_06*/{ 0x175, 912 }, - /*II_0F_BA_07*/{ 0x175, 934 }, - /*II_0F_BC*/{ 0x176, 4368 }, - /*II_F3_0F_BC*/{ 0x177, 4373 }, - /*II_0F_BD*/{ 0x176, 4380 }, - /*II_F3_0F_BD*/{ 0x178, 4385 }, - /*II_0F_C7_07*/{ 0x188, 6407 }, - /*II_66_0F_D0*/{ 0x16b, 6416 }, - /*II_F2_0F_D0*/{ 0x16b, 6426 }, - /*II_0F_D1*/{ 0x159, 6458 }, - /*II_66_0F_D1*/{ 0x13b, 6458 }, - /*II_0F_D2*/{ 0x159, 6473 }, - /*II_66_0F_D2*/{ 0x13b, 6473 }, - /*II_0F_D3*/{ 0x159, 6488 }, - /*II_66_0F_D3*/{ 0x13b, 6488 }, - /*II_0F_D4*/{ 0x14e, 6503 }, - /*II_66_0F_D4*/{ 0x13b, 6503 }, - /*II_0F_D5*/{ 0x159, 6518 }, - /*II_66_0F_D5*/{ 0x13b, 6518 }, - /*II_66_0F_D6*/{ 0x12d, 3948 }, - /*II_F3_0F_D6*/{ 0x189, 6535 }, - /*II_F2_0F_D6*/{ 0x18a, 6544 }, - /*II_0F_D7*/{ 0x18c, 6553 }, - /*II_66_0F_D7*/{ 0x18d, 6553 }, - /*II_0F_D8*/{ 0x159, 6574 }, - /*II_66_0F_D8*/{ 0x13b, 6574 }, - /*II_0F_D9*/{ 0x159, 6593 }, - /*II_66_0F_D9*/{ 0x13b, 6593 }, - /*II_0F_DA*/{ 0x18f, 6612 }, - /*II_66_0F_DA*/{ 0x13b, 6612 }, - /*II_0F_DB*/{ 0x159, 6629 }, - /*II_66_0F_DB*/{ 0x13b, 6629 }, - /*II_0F_DC*/{ 0x159, 6642 }, - /*II_66_0F_DC*/{ 0x13b, 6642 }, - /*II_0F_DD*/{ 0x159, 6661 }, - /*II_66_0F_DD*/{ 0x13b, 6661 }, - /*II_0F_DE*/{ 0x18f, 6670 }, - /*II_66_0F_DE*/{ 0x13b, 6670 }, - /*II_0F_DF*/{ 0x159, 6687 }, - /*II_66_0F_DF*/{ 0x13b, 6687 }, - /*II_0F_E0*/{ 0x18f, 6702 }, - /*II_66_0F_E0*/{ 0x13b, 6702 }, - /*II_0F_E1*/{ 0x159, 6717 }, - /*II_66_0F_E1*/{ 0x13b, 6717 }, - /*II_0F_E2*/{ 0x159, 6732 }, - /*II_66_0F_E2*/{ 0x13b, 6732 }, - /*II_0F_E3*/{ 0x18f, 6747 }, - /*II_66_0F_E3*/{ 0x13b, 6747 }, - /*II_0F_E4*/{ 0x18f, 6762 }, - /*II_66_0F_E4*/{ 0x13b, 6762 }, - /*II_0F_E5*/{ 0x159, 6781 }, - /*II_66_0F_E5*/{ 0x13b, 6781 }, - /*II_66_0F_E6*/{ 0x13b, 6798 }, - /*II_F3_0F_E6*/{ 0x14e, 6809 }, - /*II_F2_0F_E6*/{ 0x13b, 6819 }, - /*II_0F_E7*/{ 0x190, 6863 }, - /*II_66_0F_E7*/{ 0x144, 6871 }, - /*II_0F_E8*/{ 0x159, 6890 }, - /*II_66_0F_E8*/{ 0x13b, 6890 }, - /*II_0F_E9*/{ 0x159, 6907 }, - /*II_66_0F_E9*/{ 0x13b, 6907 }, - /*II_0F_EA*/{ 0x18f, 6924 }, - /*II_66_0F_EA*/{ 0x13b, 6924 }, - /*II_0F_EB*/{ 0x159, 6941 }, - /*II_66_0F_EB*/{ 0x13b, 6941 }, - /*II_0F_EC*/{ 0x159, 6952 }, - /*II_66_0F_EC*/{ 0x13b, 6952 }, - /*II_0F_ED*/{ 0x159, 6969 }, - /*II_66_0F_ED*/{ 0x13b, 6969 }, - /*II_0F_EE*/{ 0x18f, 6986 }, - /*II_66_0F_EE*/{ 0x13b, 6986 }, - /*II_0F_EF*/{ 0x159, 7003 }, - /*II_66_0F_EF*/{ 0x13b, 7003 }, - /*II_F2_0F_F0*/{ 0x191, 7016 }, - /*II_0F_F1*/{ 0x159, 7031 }, - /*II_66_0F_F1*/{ 0x13b, 7031 }, - /*II_0F_F2*/{ 0x159, 7046 }, - /*II_66_0F_F2*/{ 0x13b, 7046 }, - /*II_0F_F3*/{ 0x159, 7061 }, - /*II_66_0F_F3*/{ 0x13b, 7061 }, - /*II_0F_F4*/{ 0x193, 7076 }, - /*II_66_0F_F4*/{ 0x13b, 7076 }, - /*II_0F_F5*/{ 0x159, 7095 }, - /*II_66_0F_F5*/{ 0x13b, 7095 }, - /*II_0F_F6*/{ 0x18f, 7114 }, - /*II_66_0F_F6*/{ 0x13b, 7114 }, - /*II_0F_F7*/{ 0x194, 7131 }, - /*II_66_0F_F7*/{ 0x195, 7141 }, - /*II_0F_F8*/{ 0x159, 7166 }, - /*II_66_0F_F8*/{ 0x13b, 7166 }, - /*II_0F_F9*/{ 0x159, 7181 }, - /*II_66_0F_F9*/{ 0x13b, 7181 }, - /*II_0F_FA*/{ 0x159, 7196 }, - /*II_66_0F_FA*/{ 0x13b, 7196 }, - /*II_0F_FB*/{ 0x193, 7211 }, - /*II_66_0F_FB*/{ 0x13b, 7211 }, - /*II_0F_FC*/{ 0x159, 7226 }, - /*II_66_0F_FC*/{ 0x13b, 7226 }, - /*II_0F_FD*/{ 0x159, 7241 }, - /*II_66_0F_FD*/{ 0x13b, 7241 }, - /*II_0F_FE*/{ 0x159, 7256 }, - /*II_66_0F_FE*/{ 0x13b, 7256 }, - /*II_D9_06*/{ 0x197, 7271 }, - /*II_9B_D9_06*/{ 0x198, 7280 }, - /*II_D9_07*/{ 0xfd, 7288 }, - /*II_9B_D9_07*/{ 0x199, 7296 }, - /*II_DB_E2*/{ 0xeb, 7303 }, - /*II_9B_DB_E2*/{ 0x19a, 7311 }, - /*II_DB_E3*/{ 0xeb, 7318 }, - /*II_9B_DB_E3*/{ 0x19a, 7326 }, - /*II_DD_06*/{ 0x197, 7333 }, - /*II_9B_DD_06*/{ 0x198, 7341 }, - /*II_DD_07*/{ 0xfd, 7348 }, - /*II_9B_DD_07*/{ 0x199, 7356 }, - /*II_DF_E0*/{ 0x19b, 7348 }, - /*II_9B_DF_E0*/{ 0x19c, 7356 }, - /*II_0F_38_00*/{ 0x19d, 7363 }, - /*II_66_0F_38_00*/{ 0x19e, 7363 }, - /*II_0F_38_01*/{ 0x19d, 7380 }, - /*II_66_0F_38_01*/{ 0x19e, 7380 }, - /*II_0F_38_02*/{ 0x19d, 7397 }, - /*II_66_0F_38_02*/{ 0x19e, 7397 }, - /*II_0F_38_03*/{ 0x19d, 7414 }, - /*II_66_0F_38_03*/{ 0x19e, 7414 }, - /*II_0F_38_04*/{ 0x19d, 7433 }, - /*II_66_0F_38_04*/{ 0x19e, 7433 }, - /*II_0F_38_05*/{ 0x19d, 7456 }, - /*II_66_0F_38_05*/{ 0x19e, 7456 }, - /*II_0F_38_06*/{ 0x19d, 7473 }, - /*II_66_0F_38_06*/{ 0x19e, 7473 }, - /*II_0F_38_07*/{ 0x19d, 7490 }, - /*II_66_0F_38_07*/{ 0x19e, 7490 }, - /*II_0F_38_08*/{ 0x19d, 7509 }, - /*II_66_0F_38_08*/{ 0x19e, 7509 }, - /*II_0F_38_09*/{ 0x19d, 7526 }, - /*II_66_0F_38_09*/{ 0x19e, 7526 }, - /*II_0F_38_0A*/{ 0x19d, 7543 }, - /*II_66_0F_38_0A*/{ 0x19e, 7543 }, - /*II_0F_38_0B*/{ 0x19d, 7560 }, - /*II_66_0F_38_0B*/{ 0x19e, 7560 }, - /*II_66_0F_38_17*/{ 0x1a0, 7651 }, - /*II_0F_38_1C*/{ 0x19d, 7710 }, - /*II_66_0F_38_1C*/{ 0x19e, 7710 }, - /*II_0F_38_1D*/{ 0x19d, 7725 }, - /*II_66_0F_38_1D*/{ 0x19e, 7725 }, - /*II_0F_38_1E*/{ 0x19d, 7740 }, - /*II_66_0F_38_1E*/{ 0x19e, 7740 }, - /*II_66_0F_38_20*/{ 0x1a5, 7755 }, - /*II_66_0F_38_21*/{ 0x1a6, 7776 }, - /*II_66_0F_38_22*/{ 0x1a7, 7797 }, - /*II_66_0F_38_23*/{ 0x1a5, 7818 }, - /*II_66_0F_38_24*/{ 0x1a6, 7839 }, - /*II_66_0F_38_25*/{ 0x1a5, 7860 }, - /*II_66_0F_38_28*/{ 0x1a9, 7881 }, - /*II_66_0F_38_29*/{ 0x1a9, 7898 }, - /*II_66_0F_38_2A*/{ 0x1aa, 7917 }, - /*II_66_0F_38_2B*/{ 0x1a9, 7938 }, - /*II_66_0F_38_30*/{ 0x1a5, 7983 }, - /*II_66_0F_38_31*/{ 0x1a6, 8004 }, - /*II_66_0F_38_32*/{ 0x1a7, 8025 }, - /*II_66_0F_38_33*/{ 0x1a5, 8046 }, - /*II_66_0F_38_34*/{ 0x1a6, 8067 }, - /*II_66_0F_38_35*/{ 0x1a5, 8088 }, - /*II_66_0F_38_37*/{ 0x1a0, 8109 }, - /*II_66_0F_38_38*/{ 0x1a9, 8128 }, - /*II_66_0F_38_39*/{ 0x1a9, 8145 }, - /*II_66_0F_38_3A*/{ 0x1a9, 8162 }, - /*II_66_0F_38_3B*/{ 0x1a9, 8179 }, - /*II_66_0F_38_3C*/{ 0x1a9, 8196 }, - /*II_66_0F_38_3D*/{ 0x1a9, 8213 }, - /*II_66_0F_38_3E*/{ 0x1a9, 8230 }, - /*II_66_0F_38_3F*/{ 0x1a9, 8247 }, - /*II_66_0F_38_40*/{ 0x1a9, 8264 }, - /*II_66_0F_38_41*/{ 0x1a9, 8281 }, - /*II_66_0F_38_80*/{ 0x1ad, 8306 }, - /*II_66_0F_38_81*/{ 0x1ad, 8314 }, - /*II_66_0F_38_82*/{ 0x1ad, 8323 }, - /*II_66_0F_38_DB*/{ 0x1b0, 9172 }, - /*II_66_0F_38_DC*/{ 0x1b0, 9189 }, - /*II_66_0F_38_DD*/{ 0x1b0, 9206 }, - /*II_66_0F_38_DE*/{ 0x1b0, 9231 }, - /*II_66_0F_38_DF*/{ 0x1b0, 9248 }, - /*II_0F_38_F0*/{ 0x1b3, 9273 }, - /*II_F2_0F_38_F0*/{ 0x1b4, 9280 }, - /*II_0F_38_F1*/{ 0x1b5, 9273 }, - /*II_F2_0F_38_F1*/{ 0x1b6, 9280 }, - /*II_0F_71_02*/{ 0x1cd, 6458 }, - /*II_66_0F_71_02*/{ 0x1ce, 6458 }, - /*II_0F_71_04*/{ 0x1cd, 6717 }, - /*II_66_0F_71_04*/{ 0x1ce, 6717 }, - /*II_0F_71_06*/{ 0x1cd, 7031 }, - /*II_66_0F_71_06*/{ 0x1ce, 7031 }, - /*II_0F_72_02*/{ 0x1cd, 6473 }, - /*II_66_0F_72_02*/{ 0x1ce, 6473 }, - /*II_0F_72_04*/{ 0x1cd, 6732 }, - /*II_66_0F_72_04*/{ 0x1ce, 6732 }, - /*II_0F_72_06*/{ 0x1cd, 7046 }, - /*II_66_0F_72_06*/{ 0x1ce, 7046 }, - /*II_0F_73_02*/{ 0x1cd, 6488 }, - /*II_66_0F_73_02*/{ 0x1ce, 6488 }, - /*II_66_0F_73_03*/{ 0x1ce, 9852 }, - /*II_0F_73_06*/{ 0x1cd, 7061 }, - /*II_66_0F_73_06*/{ 0x1ce, 7061 }, - /*II_66_0F_73_07*/{ 0x1ce, 9869 }, - /*II_F3_0F_AE_00*/{ 0x1d0, 9904 }, - /*II_F3_0F_AE_01*/{ 0x1d0, 9934 }, - /*II_0F_AE_02*/{ 0x116, 9944 }, - /*II_F3_0F_AE_02*/{ 0x1d0, 9953 }, - /*II_0F_AE_03*/{ 0x116, 9973 }, - /*II_F3_0F_AE_03*/{ 0x1d0, 9982 }, - /*II_0F_C7_06*/{ 0x1d2, 10002 }, - /*II_66_0F_C7_06*/{ 0x188, 10011 }, - /*II_F3_0F_C7_06*/{ 0x188, 10020 } + /*II_00*/ {0x0, 11}, + /*II_01*/ {0x1, 11}, + /*II_02*/ {0x2, 11}, + /*II_03*/ {0x3, 11}, + /*II_04*/ {0x4, 11}, + /*II_05*/ {0x5, 11}, + /*II_06*/ {0x6, 16}, + /*II_07*/ {0x7, 22}, + /*II_08*/ {0x8, 27}, + /*II_09*/ {0x9, 27}, + /*II_0A*/ {0xa, 27}, + /*II_0B*/ {0xb, 27}, + /*II_0C*/ {0xc, 27}, + /*II_0D*/ {0xd, 27}, + /*II_0E*/ {0xe, 16}, + /*II_10*/ {0xf, 31}, + /*II_11*/ {0x10, 31}, + /*II_12*/ {0x11, 31}, + /*II_13*/ {0x12, 31}, + /*II_14*/ {0x13, 31}, + /*II_15*/ {0x14, 31}, + /*II_16*/ {0x15, 16}, + /*II_17*/ {0x16, 22}, + /*II_18*/ {0xf, 36}, + /*II_19*/ {0x10, 36}, + /*II_1A*/ {0x11, 36}, + /*II_1B*/ {0x12, 36}, + /*II_1C*/ {0x13, 36}, + /*II_1D*/ {0x14, 36}, + /*II_1E*/ {0x17, 16}, + /*II_1F*/ {0x18, 22}, + /*II_20*/ {0x19, 41}, + /*II_21*/ {0x1a, 41}, + /*II_22*/ {0x1b, 41}, + /*II_23*/ {0x1c, 41}, + /*II_24*/ {0x1d, 41}, + /*II_25*/ {0x1e, 41}, + /*II_27*/ {0x1f, 46}, + /*II_28*/ {0x0, 51}, + /*II_29*/ {0x1, 51}, + /*II_2A*/ {0x2, 51}, + /*II_2B*/ {0x3, 51}, + /*II_2C*/ {0x4, 51}, + /*II_2D*/ {0x5, 51}, + /*II_2F*/ {0x1f, 56}, + /*II_30*/ {0x20, 61}, + /*II_31*/ {0x21, 61}, + /*II_32*/ {0x22, 61}, + /*II_33*/ {0x23, 61}, + /*II_34*/ {0x24, 61}, + /*II_35*/ {0x25, 61}, + /*II_37*/ {0x26, 66}, + /*II_38*/ {0x27, 71}, + /*II_39*/ {0x28, 71}, + /*II_3A*/ {0x29, 71}, + /*II_3B*/ {0x2a, 71}, + /*II_3C*/ {0x2b, 71}, + /*II_3D*/ {0x2c, 71}, + /*II_3F*/ {0x26, 76}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_40*/ {0x2d, 81}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_48*/ {0x2d, 86}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_50*/ {0x2e, 16}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_58*/ {0x2f, 22}, + /*II_60*/ {0x30, 91}, + /*II_61*/ {0x30, 98}, + /*II_62*/ {0x31, 104}, + /*II_63*/ {0x32, 111}, + /*II_68*/ {0x33, 16}, + /*II_6A*/ {0x35, 16}, + /*II_6C*/ {0x36, 32891}, + /*II_6D*/ {0x37, 32891}, + /*II_6E*/ {0x38, 32896}, + /*II_6F*/ {0x39, 32896}, + /*II_70*/ {0x3a, 134}, + /*II_71*/ {0x3a, 138}, + /*II_72*/ {0x3b, 143}, + /*II_73*/ {0x3b, 147}, + /*II_74*/ {0x3c, 152}, + /*II_75*/ {0x3c, 156}, + /*II_76*/ {0x3d, 161}, + /*II_77*/ {0x3d, 166}, + /*II_78*/ {0x3e, 170}, + /*II_79*/ {0x3e, 174}, + /*II_7A*/ {0x3f, 179}, + /*II_7B*/ {0x3f, 183}, + /*II_7C*/ {0x40, 188}, + /*II_7D*/ {0x40, 192}, + /*II_7E*/ {0x41, 197}, + /*II_7F*/ {0x41, 202}, + /*II_84*/ {0x42, 206}, + /*II_85*/ {0x43, 206}, + /*II_86*/ {0x44, 212}, + /*II_87*/ {0x45, 212}, + /*II_88*/ {0x46, 218}, + /*II_89*/ {0x47, 218}, + /*II_8A*/ {0x48, 218}, + /*II_8B*/ {0x49, 218}, + /*II_8C*/ {0x4a, 218}, + /*II_8D*/ {0x4b, 223}, + /*II_8E*/ {0x4c, 218}, + /*II_90*/ {0x4d, 212}, + /*II_91*/ {0x4d, 212}, + /*II_92*/ {0x4d, 212}, + /*II_93*/ {0x4d, 212}, + /*II_94*/ {0x4d, 212}, + /*II_95*/ {0x4d, 212}, + /*II_96*/ {0x4d, 212}, + /*II_97*/ {0x4d, 212}, + /*II_9A*/ {0x4f, 260}, + /*II_9C*/ {0x50, 270}, + /*II_9D*/ {0x51, 277}, + /*II_9E*/ {0x52, 283}, + /*II_9F*/ {0x53, 289}, + /*II_A0*/ {0x54, 218}, + /*II_A1*/ {0x55, 218}, + /*II_A2*/ {0x56, 218}, + /*II_A3*/ {0x57, 218}, + /*II_A4*/ {0x58, 295}, + /*II_A5*/ {0x59, 295}, + /*II_A6*/ {0x5a, 301}, + /*II_A7*/ {0x5b, 301}, + /*II_A8*/ {0x5c, 206}, + /*II_A9*/ {0x5d, 206}, + /*II_AA*/ {0x5e, 307}, + /*II_AB*/ {0x5f, 307}, + /*II_AC*/ {0x60, 313}, + /*II_AD*/ {0x61, 313}, + /*II_AE*/ {0x62, 319}, + /*II_AF*/ {0x63, 319}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B0*/ {0x64, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_B8*/ {0x65, 218}, + /*II_C2*/ {0x66, 325}, + /*II_C3*/ {0x67, 325}, + /*II_C4*/ {0x68, 330}, + /*II_C5*/ {0x68, 335}, + /*II_C8*/ {0x69, 340}, + /*II_C9*/ {0x6a, 347}, + /*II_CA*/ {0x6b, 354}, + /*II_CB*/ {0x6c, 354}, + /*II_CC*/ {0x6d, 360}, + /*II_CD*/ {0x6e, 367}, + /*II_CE*/ {0x6f, 372}, + /*II_CF*/ {0x70, 33146}, + /*II_D4*/ {0x71, 384}, + /*II_D5*/ {0x71, 389}, + /*II_D6*/ {0x72, 394}, + /*II_D7*/ {0x73, 400}, + /*II_E0*/ {0x74, 406}, + /*II_E1*/ {0x74, 414}, + /*II_E2*/ {0x75, 421}, + /*II_E4*/ {0x77, 33215}, + /*II_E5*/ {0x78, 33215}, + /*II_E6*/ {0x79, 33219}, + /*II_E7*/ {0x7a, 33219}, + /*II_E8*/ {0x7b, 456}, + /*II_E9*/ {0x7c, 462}, + /*II_EA*/ {0x7d, 467}, + /*II_EB*/ {0x7e, 462}, + /*II_EC*/ {0x7f, 33215}, + /*II_ED*/ {0x80, 33215}, + /*II_EE*/ {0x81, 33219}, + /*II_EF*/ {0x82, 33219}, + /*II_F1*/ {0x6d, 476}, + /*II_F4*/ {0x53, 33250}, + /*II_F5*/ {0x83, 487}, + /*II_F8*/ {0x83, 492}, + /*II_F9*/ {0x83, 497}, + /*II_FA*/ {0x84, 33270}, + /*II_FB*/ {0x84, 33275}, + /*II_FC*/ {0x85, 512}, + /*II_FD*/ {0x85, 517}, + /*II_0F_02*/ {0x86, 522}, + /*II_0F_03*/ {0x86, 527}, + /*II_0F_05*/ {0x87, 532}, + /*II_0F_06*/ {0x88, 33309}, + /*II_0F_07*/ {0x87, 547}, + /*II_0F_08*/ {0x88, 33323}, + /*II_0F_09*/ {0x88, 33329}, + /*II_0F_0B*/ {0x89, 569}, + /*II_0F_0E*/ {0x8a, 574}, + /*II_0F_1F*/ {0x8b, 581}, + /*II_0F_20*/ {0x8c, 32986}, + /*II_0F_21*/ {0x8d, 32986}, + /*II_0F_22*/ {0x8e, 32986}, + /*II_0F_23*/ {0x8f, 32986}, + /*II_0F_30*/ {0x88, 33354}, + /*II_0F_31*/ {0x88, 33361}, + /*II_0F_32*/ {0x88, 33368}, + /*II_0F_33*/ {0x88, 33375}, + /*II_0F_34*/ {0x87, 614}, + /*II_0F_35*/ {0x87, 624}, + /*II_0F_37*/ {0x90, 633}, + /*II_0F_40*/ {0x91, 641}, + /*II_0F_41*/ {0x91, 648}, + /*II_0F_42*/ {0x92, 656}, + /*II_0F_43*/ {0x92, 663}, + /*II_0F_44*/ {0x93, 671}, + /*II_0F_45*/ {0x93, 678}, + /*II_0F_46*/ {0x94, 686}, + /*II_0F_47*/ {0x94, 694}, + /*II_0F_48*/ {0x95, 701}, + /*II_0F_49*/ {0x95, 708}, + /*II_0F_4A*/ {0x96, 716}, + /*II_0F_4B*/ {0x96, 723}, + /*II_0F_4C*/ {0x97, 731}, + /*II_0F_4D*/ {0x97, 738}, + /*II_0F_4E*/ {0x98, 746}, + /*II_0F_4F*/ {0x98, 754}, + /*II_0F_80*/ {0x99, 134}, + /*II_0F_81*/ {0x99, 138}, + /*II_0F_82*/ {0x9a, 143}, + /*II_0F_83*/ {0x9a, 147}, + /*II_0F_84*/ {0x9b, 152}, + /*II_0F_85*/ {0x9b, 156}, + /*II_0F_86*/ {0x9c, 161}, + /*II_0F_87*/ {0x9c, 166}, + /*II_0F_88*/ {0x9d, 170}, + /*II_0F_89*/ {0x9d, 174}, + /*II_0F_8A*/ {0x9e, 179}, + /*II_0F_8B*/ {0x9e, 183}, + /*II_0F_8C*/ {0x9f, 188}, + /*II_0F_8D*/ {0x9f, 192}, + /*II_0F_8E*/ {0xa0, 197}, + /*II_0F_8F*/ {0xa0, 202}, + /*II_0F_90*/ {0xa1, 761}, + /*II_0F_91*/ {0xa1, 767}, + /*II_0F_92*/ {0xa2, 774}, + /*II_0F_93*/ {0xa2, 780}, + /*II_0F_94*/ {0xa3, 787}, + /*II_0F_95*/ {0xa3, 793}, + /*II_0F_96*/ {0xa4, 800}, + /*II_0F_97*/ {0xa4, 807}, + /*II_0F_98*/ {0xa5, 813}, + /*II_0F_99*/ {0xa5, 819}, + /*II_0F_9A*/ {0xa6, 826}, + /*II_0F_9B*/ {0xa6, 832}, + /*II_0F_9C*/ {0xa7, 839}, + /*II_0F_9D*/ {0xa7, 845}, + /*II_0F_9E*/ {0xa8, 852}, + /*II_0F_9F*/ {0xa8, 859}, + /*II_0F_A0*/ {0xa9, 16}, + /*II_0F_A1*/ {0xaa, 22}, + /*II_0F_A2*/ {0x88, 865}, + /*II_0F_A3*/ {0xab, 872}, + /*II_0F_A8*/ {0xad, 16}, + /*II_0F_A9*/ {0xae, 22}, + /*II_0F_AA*/ {0xaf, 882}, + /*II_0F_AB*/ {0xb0, 887}, + /*II_0F_AF*/ {0xb1, 117}, + /*II_0F_B0*/ {0xb2, 898}, + /*II_0F_B1*/ {0xb3, 898}, + /*II_0F_B2*/ {0xb4, 907}, + /*II_0F_B3*/ {0xb0, 912}, + /*II_0F_B4*/ {0xb4, 917}, + /*II_0F_B5*/ {0xb4, 922}, + /*II_0F_B6*/ {0xb5, 927}, + /*II_0F_B7*/ {0xb6, 927}, + /*II_0F_B9*/ {0x89, 569}, + /*II_0F_BB*/ {0xb0, 934}, + /*II_0F_BE*/ {0xb5, 939}, + /*II_0F_BF*/ {0xb6, 939}, + /*II_0F_C0*/ {0xb2, 946}, + /*II_0F_C1*/ {0xb3, 946}, + /*II_0F_C3*/ {0xb7, 952}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_0F_C8*/ {0xb8, 960}, + /*II_80_00*/ {0xb9, 11}, + /*II_80_01*/ {0xba, 27}, + /*II_80_02*/ {0xbb, 31}, + /*II_80_03*/ {0xbb, 36}, + /*II_80_04*/ {0xbc, 41}, + /*II_80_05*/ {0xb9, 51}, + /*II_80_06*/ {0xbd, 61}, + /*II_80_07*/ {0xbe, 71}, + /*II_81_00*/ {0xbf, 11}, + /*II_81_01*/ {0xc0, 27}, + /*II_81_02*/ {0xc1, 31}, + /*II_81_03*/ {0xc1, 36}, + /*II_81_04*/ {0xc2, 41}, + /*II_81_05*/ {0xbf, 51}, + /*II_81_06*/ {0xc3, 61}, + /*II_81_07*/ {0xc4, 71}, + /*II_82_00*/ {0xc5, 11}, + /*II_82_01*/ {0xc6, 27}, + /*II_82_02*/ {0xc7, 31}, + /*II_82_03*/ {0xc7, 36}, + /*II_82_04*/ {0xc8, 41}, + /*II_82_05*/ {0xc5, 51}, + /*II_82_06*/ {0xc9, 61}, + /*II_82_07*/ {0xca, 71}, + /*II_83_00*/ {0xcb, 11}, + /*II_83_01*/ {0xcc, 27}, + /*II_83_02*/ {0xcd, 31}, + /*II_83_03*/ {0xcd, 36}, + /*II_83_04*/ {0xce, 41}, + /*II_83_05*/ {0xcb, 51}, + /*II_83_06*/ {0xcf, 61}, + /*II_83_07*/ {0xd0, 71}, + /*II_8F_00*/ {0xd1, 22}, + /*II_C0_00*/ {0xd2, 967}, + /*II_C0_01*/ {0xd2, 972}, + /*II_C0_02*/ {0xd3, 977}, + /*II_C0_03*/ {0xd3, 982}, + /*II_C0_04*/ {0xd4, 987}, + /*II_C0_05*/ {0xd4, 992}, + /*II_C0_06*/ {0xd4, 997}, + /*II_C0_07*/ {0xd4, 1002}, + /*II_C1_00*/ {0xd5, 967}, + /*II_C1_01*/ {0xd5, 972}, + /*II_C1_02*/ {0xd6, 977}, + /*II_C1_03*/ {0xd6, 982}, + /*II_C1_04*/ {0xd7, 987}, + /*II_C1_05*/ {0xd7, 992}, + /*II_C1_06*/ {0xd7, 997}, + /*II_C1_07*/ {0xd7, 1002}, + /*II_C6_00*/ {0xd8, 218}, + /*II_C6_F8*/ {0xd9, 1007}, + /*II_C7_00*/ {0xda, 218}, + /*II_C7_F8*/ {0xdb, 1015}, + /*II_D0_00*/ {0xdc, 967}, + /*II_D0_01*/ {0xdc, 972}, + /*II_D0_02*/ {0xdd, 977}, + /*II_D0_03*/ {0xdd, 982}, + /*II_D0_04*/ {0xde, 987}, + /*II_D0_05*/ {0xde, 992}, + /*II_D0_06*/ {0xde, 997}, + /*II_D0_07*/ {0xde, 1002}, + /*II_D1_00*/ {0xdf, 967}, + /*II_D1_01*/ {0xdf, 972}, + /*II_D1_02*/ {0xe0, 977}, + /*II_D1_03*/ {0xe0, 982}, + /*II_D1_04*/ {0xe1, 987}, + /*II_D1_05*/ {0xe1, 992}, + /*II_D1_06*/ {0xe1, 997}, + /*II_D1_07*/ {0xe1, 1002}, + /*II_D2_00*/ {0xe2, 967}, + /*II_D2_01*/ {0xe2, 972}, + /*II_D2_02*/ {0xe3, 977}, + /*II_D2_03*/ {0xe3, 982}, + /*II_D2_04*/ {0xe4, 987}, + /*II_D2_05*/ {0xe4, 992}, + /*II_D2_06*/ {0xe4, 997}, + /*II_D2_07*/ {0xe4, 1002}, + /*II_D3_00*/ {0xe5, 967}, + /*II_D3_01*/ {0xe5, 972}, + /*II_D3_02*/ {0xe6, 977}, + /*II_D3_03*/ {0xe6, 982}, + /*II_D3_04*/ {0xe7, 987}, + /*II_D3_05*/ {0xe7, 992}, + /*II_D3_06*/ {0xe7, 997}, + /*II_D3_07*/ {0xe7, 1002}, + /*II_D8_00*/ {0xe8, 1023}, + /*II_D8_01*/ {0xe8, 1029}, + /*II_D8_02*/ {0xe8, 1035}, + /*II_D8_03*/ {0xe8, 1041}, + /*II_D8_04*/ {0xe8, 1048}, + /*II_D8_05*/ {0xe8, 1054}, + /*II_D8_06*/ {0xe8, 1061}, + /*II_D8_07*/ {0xe8, 1067}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C0*/ {0xe9, 1023}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_C8*/ {0xe9, 1029}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D0*/ {0xea, 1035}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D9*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_D8*/ {0xea, 1041}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E0*/ {0xe9, 1048}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_E8*/ {0xe9, 1054}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F0*/ {0xe9, 1061}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D8_F8*/ {0xe9, 1067}, + /*II_D9_00*/ {0xe8, 1074}, + /*II_D9_02*/ {0xec, 1079}, + /*II_D9_03*/ {0xec, 1084}, + /*II_D9_04*/ {0xed, 1090}, + /*II_D9_05*/ {0xee, 1098}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C0*/ {0xea, 1074}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C9*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_C8*/ {0xea, 1105}, + /*II_D9_D0*/ {0xeb, 1111}, + /*II_D9_E0*/ {0xeb, 1117}, + /*II_D9_E1*/ {0xeb, 1123}, + /*II_D9_E4*/ {0xeb, 1129}, + /*II_D9_E5*/ {0xeb, 1135}, + /*II_D9_E8*/ {0xeb, 1141}, + /*II_D9_E9*/ {0xeb, 1147}, + /*II_D9_EA*/ {0xeb, 1155}, + /*II_D9_EB*/ {0xeb, 1163}, + /*II_D9_EC*/ {0xeb, 1170}, + /*II_D9_ED*/ {0xeb, 1178}, + /*II_D9_EE*/ {0xeb, 1186}, + /*II_D9_F0*/ {0xeb, 1192}, + /*II_D9_F1*/ {0xeb, 1199}, + /*II_D9_F2*/ {0xeb, 1206}, + /*II_D9_F3*/ {0xeb, 1213}, + /*II_D9_F4*/ {0xeb, 1221}, + /*II_D9_F5*/ {0xeb, 1230}, + /*II_D9_F6*/ {0xeb, 1238}, + /*II_D9_F7*/ {0xeb, 1247}, + /*II_D9_F8*/ {0xeb, 1256}, + /*II_D9_F9*/ {0xeb, 1263}, + /*II_D9_FA*/ {0xeb, 1272}, + /*II_D9_FB*/ {0xeb, 1279}, + /*II_D9_FC*/ {0xeb, 1288}, + /*II_D9_FD*/ {0xeb, 1297}, + /*II_D9_FE*/ {0xeb, 1305}, + /*II_D9_FF*/ {0xeb, 1311}, + /*II_DA_00*/ {0xe8, 1317}, + /*II_DA_01*/ {0xe8, 1324}, + /*II_DA_02*/ {0xe8, 1331}, + /*II_DA_03*/ {0xe8, 1338}, + /*II_DA_04*/ {0xe8, 1346}, + /*II_DA_05*/ {0xe8, 1353}, + /*II_DA_06*/ {0xe8, 1361}, + /*II_DA_07*/ {0xe8, 1368}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C0*/ {0xef, 1376}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_C8*/ {0xf0, 1384}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D0*/ {0xf1, 1392}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_D8*/ {0xf2, 1401}, + /*II_DA_E9*/ {0xeb, 1409}, + /*II_DB_00*/ {0xe8, 1418}, + /*II_DB_01*/ {0xf3, 1424}, + /*II_DB_02*/ {0xec, 1432}, + /*II_DB_03*/ {0xec, 1438}, + /*II_DB_05*/ {0xf4, 1074}, + /*II_DB_07*/ {0xf5, 1084}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C0*/ {0xef, 1445}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_C8*/ {0xf0, 1454}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D0*/ {0xf1, 1463}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_D8*/ {0xf2, 1473}, + /*II_DB_E0*/ {0xeb, 1482}, + /*II_DB_E1*/ {0xeb, 1488}, + /*II_DB_E4*/ {0xeb, 1496}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_E8*/ {0xf6, 1504}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DB_F0*/ {0xf7, 1512}, + /*II_DC_00*/ {0xf8, 1023}, + /*II_DC_01*/ {0xf8, 1029}, + /*II_DC_02*/ {0xf8, 1035}, + /*II_DC_03*/ {0xf8, 1041}, + /*II_DC_04*/ {0xf8, 1048}, + /*II_DC_05*/ {0xf8, 1054}, + /*II_DC_06*/ {0xf8, 1061}, + /*II_DC_07*/ {0xf8, 1067}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C0*/ {0xf9, 1023}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_C8*/ {0xf9, 1029}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E0*/ {0xf9, 1054}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_E8*/ {0xf9, 1048}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F0*/ {0xf9, 1067}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DC_F8*/ {0xf9, 1061}, + /*II_DD_00*/ {0xf8, 1074}, + /*II_DD_01*/ {0xfa, 1424}, + /*II_DD_02*/ {0xfb, 1079}, + /*II_DD_03*/ {0xfb, 1084}, + /*II_DD_04*/ {0xed, 1519}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_C0*/ {0xea, 1527}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D0*/ {0xea, 1079}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_D8*/ {0xea, 1084}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E1*/ {0xeb, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E0*/ {0xf9, 1534}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E9*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DD_E8*/ {0xea, 1541}, + /*II_DE_00*/ {0xee, 1317}, + /*II_DE_01*/ {0xee, 1324}, + /*II_DE_02*/ {0xee, 1331}, + /*II_DE_03*/ {0xee, 1338}, + /*II_DE_04*/ {0xee, 1346}, + /*II_DE_05*/ {0xee, 1353}, + /*II_DE_06*/ {0xee, 1361}, + /*II_DE_07*/ {0xee, 1368}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C1*/ {0xeb, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C0*/ {0xf9, 1549}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C9*/ {0xeb, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_C8*/ {0xf9, 1556}, + /*II_DE_D9*/ {0xeb, 1563}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E1*/ {0xeb, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E0*/ {0xf9, 1571}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E9*/ {0xeb, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_E8*/ {0xf9, 1579}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F1*/ {0xeb, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F0*/ {0xf9, 1586}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F9*/ {0xeb, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DE_F8*/ {0xf9, 1594}, + /*II_DF_00*/ {0xee, 1418}, + /*II_DF_01*/ {0xfc, 1424}, + /*II_DF_02*/ {0xfd, 1432}, + /*II_DF_03*/ {0xfd, 1438}, + /*II_DF_04*/ {0xf4, 1601}, + /*II_DF_05*/ {0xf8, 1418}, + /*II_DF_06*/ {0xf5, 1607}, + /*II_DF_07*/ {0xfb, 1438}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_E8*/ {0xf6, 1614}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_DF_F0*/ {0xf6, 1623}, + /*II_F6_00*/ {0xfe, 206}, + /*II_F6_02*/ {0xff, 1631}, + /*II_F6_03*/ {0x100, 1636}, + /*II_F6_04*/ {0x101, 1641}, + /*II_F6_05*/ {0x101, 117}, + /*II_F6_06*/ {0x102, 1646}, + /*II_F6_07*/ {0x102, 1651}, + /*II_F7_00*/ {0x103, 206}, + /*II_F7_02*/ {0x104, 1631}, + /*II_F7_03*/ {0x105, 1636}, + /*II_F7_04*/ {0x106, 1641}, + /*II_F7_05*/ {0x106, 117}, + /*II_F7_06*/ {0x107, 1646}, + /*II_F7_07*/ {0x107, 1651}, + /*II_FE_00*/ {0x108, 81}, + /*II_FE_01*/ {0x108, 86}, + /*II_FF_00*/ {0x109, 81}, + /*II_FF_01*/ {0x109, 86}, + /*II_FF_02*/ {0x10a, 456}, + /*II_FF_03*/ {0x10b, 260}, + /*II_FF_04*/ {0x10c, 462}, + /*II_FF_05*/ {0x10d, 467}, + /*II_FF_06*/ {0x10e, 16}, + /*II_0F_00_00*/ {0x10f, 1657}, + /*II_0F_00_01*/ {0x110, 1663}, + /*II_0F_00_02*/ {0x110, 34436}, + /*II_0F_00_03*/ {0x111, 34442}, + /*II_0F_00_04*/ {0x112, 1679}, + /*II_0F_00_05*/ {0x112, 1685}, + /*II_0F_01_00*/ {0x113, 1691}, + /*II_0F_01_01*/ {0x113, 1697}, + /*II_0F_01_02*/ {0x113, 34471}, + /*II_0F_01_03*/ {0x113, 34477}, + /*II_0F_01_04*/ {0x114, 1715}, + /*II_0F_01_06*/ {0x115, 34489}, + /*II_0F_01_07*/ {0x116, 34495}, + /*II_0F_01_C1*/ {0x117, 1735}, + /*II_0F_01_C2*/ {0x117, 1743}, + /*II_0F_01_C3*/ {0x117, 1753}, + /*II_0F_01_C4*/ {0x117, 1763}, + /*II_0F_01_C8*/ {0x118, 1771}, + /*II_0F_01_C9*/ {0x118, 1780}, + /*II_0F_01_D0*/ {0x88, 1787}, + /*II_0F_01_D1*/ {0x88, 1795}, + /*II_0F_01_D4*/ {0x117, 1803}, + /*II_0F_01_D5*/ {0x119, 1811}, + /*II_0F_01_D8*/ {0x11a, 1817}, + /*II_0F_01_D9*/ {0x11b, 1824}, + /*II_0F_01_DA*/ {0x11c, 1833}, + /*II_0F_01_DB*/ {0x11c, 1841}, + /*II_0F_01_DC*/ {0x11b, 1849}, + /*II_0F_01_DD*/ {0x11b, 1855}, + /*II_0F_01_DE*/ {0x11c, 1861}, + /*II_0F_01_DF*/ {0x11d, 1869}, + /*II_0F_01_F8*/ {0x11e, 1878}, + /*II_0F_01_F9*/ {0x11e, 1886}, + /*II_0F_0D_00*/ {0x11f, 1894}, + /*II_0F_0D_01*/ {0x11f, 1904}, + /*II_0F_0F_0C*/ {0x120, 1915}, + /*II_0F_0F_0D*/ {0x121, 1922}, + /*II_0F_0F_1C*/ {0x120, 1929}, + /*II_0F_0F_1D*/ {0x121, 1936}, + /*II_0F_0F_8A*/ {0x120, 1943}, + /*II_0F_0F_8E*/ {0x120, 1951}, + /*II_0F_0F_90*/ {0x121, 1960}, + /*II_0F_0F_94*/ {0x121, 1969}, + /*II_0F_0F_96*/ {0x121, 1976}, + /*II_0F_0F_97*/ {0x121, 1983}, + /*II_0F_0F_9A*/ {0x121, 1992}, + /*II_0F_0F_9E*/ {0x121, 1999}, + /*II_0F_0F_A0*/ {0x121, 2006}, + /*II_0F_0F_A4*/ {0x121, 2015}, + /*II_0F_0F_A6*/ {0x121, 2022}, + /*II_0F_0F_A7*/ {0x121, 2032}, + /*II_0F_0F_AA*/ {0x121, 2042}, + /*II_0F_0F_AE*/ {0x121, 2050}, + /*II_0F_0F_B0*/ {0x121, 2057}, + /*II_0F_0F_B4*/ {0x121, 2066}, + /*II_0F_0F_B6*/ {0x121, 2073}, + /*II_0F_0F_B7*/ {0x121, 2083}, + /*II_0F_0F_BB*/ {0x120, 2092}, + /*II_0F_0F_BF*/ {0x121, 2100}, + /*II_0F_10*/ {0x122, 2109}, + /*II_66_0F_10*/ {0x123, 2117}, + /*II_F3_0F_10*/ {0x124, 2125}, + /*II_F2_0F_10*/ {0x125, 2132}, + /*II_0F_11*/ {0x12a, 2109}, + /*II_66_0F_11*/ {0x12b, 2117}, + /*II_F3_0F_11*/ {0x12c, 2125}, + /*II_F2_0F_11*/ {0x12d, 2132}, + /*II_66_0F_12*/ {0x132, 2190}, + /*II_F3_0F_12*/ {0x133, 2198}, + /*II_F2_0F_12*/ {0x133, 2208}, + /*II_0F_13*/ {0x137, 2182}, + /*II_66_0F_13*/ {0x138, 2190}, + /*II_0F_14*/ {0x13a, 2266}, + /*II_66_0F_14*/ {0x13b, 2276}, + /*II_0F_15*/ {0x13a, 2308}, + /*II_66_0F_15*/ {0x13b, 2318}, + /*II_66_0F_16*/ {0x132, 2367}, + /*II_F3_0F_16*/ {0x13d, 2375}, + /*II_0F_17*/ {0x137, 2359}, + /*II_66_0F_17*/ {0x138, 2367}, + /*II_0F_18_00*/ {0x13e, 2424}, + /*II_0F_18_01*/ {0x13e, 2437}, + /*II_0F_18_02*/ {0x13e, 2449}, + /*II_0F_18_03*/ {0x13e, 2461}, + /*II_0F_28*/ {0x122, 2473}, + /*II_66_0F_28*/ {0x123, 2481}, + /*II_0F_29*/ {0x12a, 2473}, + /*II_66_0F_29*/ {0x12b, 2481}, + /*II_0F_2A*/ {0x13f, 2507}, + /*II_66_0F_2A*/ {0x140, 2517}, + /*II_F3_0F_2A*/ {0x141, 2527}, + /*II_F2_0F_2A*/ {0x142, 2537}, + /*II_0F_2B*/ {0x143, 2569}, + /*II_66_0F_2B*/ {0x144, 2578}, + /*II_F3_0F_2B*/ {0x145, 2587}, + /*II_F2_0F_2B*/ {0x146, 2596}, + /*II_0F_2C*/ {0x148, 2625}, + /*II_66_0F_2C*/ {0x149, 2636}, + /*II_F3_0F_2C*/ {0x14a, 2647}, + /*II_F2_0F_2C*/ {0x14b, 2658}, + /*II_0F_2D*/ {0x148, 2693}, + /*II_66_0F_2D*/ {0x13b, 2703}, + /*II_F3_0F_2D*/ {0x14a, 2713}, + /*II_F2_0F_2D*/ {0x14b, 2723}, + /*II_0F_2E*/ {0x14d, 2755}, + /*II_66_0F_2E*/ {0x14e, 2764}, + /*II_0F_2F*/ {0x14d, 2793}, + /*II_66_0F_2F*/ {0x14e, 2801}, + /*II_0F_50*/ {0x151, 2827}, + /*II_66_0F_50*/ {0x152, 2837}, + /*II_0F_51*/ {0x13a, 2869}, + /*II_66_0F_51*/ {0x13b, 2877}, + /*II_F3_0F_51*/ {0x154, 2885}, + /*II_F2_0F_51*/ {0x14e, 2893}, + /*II_0F_52*/ {0x13a, 2937}, + /*II_F3_0F_52*/ {0x154, 2946}, + /*II_0F_53*/ {0x13a, 2975}, + /*II_F3_0F_53*/ {0x154, 2982}, + /*II_0F_54*/ {0x13a, 3005}, + /*II_66_0F_54*/ {0x13b, 3012}, + /*II_0F_55*/ {0x13a, 3035}, + /*II_66_0F_55*/ {0x13b, 3043}, + /*II_0F_56*/ {0x13a, 3069}, + /*II_66_0F_56*/ {0x13b, 3075}, + /*II_0F_57*/ {0x13a, 3095}, + /*II_66_0F_57*/ {0x13b, 3102}, + /*II_0F_58*/ {0x13a, 3125}, + /*II_66_0F_58*/ {0x13b, 3132}, + /*II_F3_0F_58*/ {0x154, 3139}, + /*II_F2_0F_58*/ {0x14e, 3146}, + /*II_0F_59*/ {0x13a, 3185}, + /*II_66_0F_59*/ {0x13b, 3192}, + /*II_F3_0F_59*/ {0x154, 3199}, + /*II_F2_0F_59*/ {0x14e, 3206}, + /*II_0F_5A*/ {0x14e, 3245}, + /*II_66_0F_5A*/ {0x13b, 3255}, + /*II_F3_0F_5A*/ {0x155, 3265}, + /*II_F2_0F_5A*/ {0x14e, 3275}, + /*II_0F_5B*/ {0x13b, 3329}, + /*II_66_0F_5B*/ {0x13b, 3339}, + /*II_F3_0F_5B*/ {0x13b, 3349}, + /*II_0F_5C*/ {0x13a, 3394}, + /*II_66_0F_5C*/ {0x13b, 3401}, + /*II_F3_0F_5C*/ {0x154, 3408}, + /*II_F2_0F_5C*/ {0x14e, 3415}, + /*II_0F_5D*/ {0x13a, 3454}, + /*II_66_0F_5D*/ {0x13b, 3461}, + /*II_F3_0F_5D*/ {0x154, 3468}, + /*II_F2_0F_5D*/ {0x14e, 3475}, + /*II_0F_5E*/ {0x13a, 3514}, + /*II_66_0F_5E*/ {0x13b, 3521}, + /*II_F3_0F_5E*/ {0x154, 3528}, + /*II_F2_0F_5E*/ {0x14e, 3535}, + /*II_0F_5F*/ {0x13a, 3574}, + /*II_66_0F_5F*/ {0x13b, 3581}, + /*II_F3_0F_5F*/ {0x154, 3588}, + /*II_F2_0F_5F*/ {0x14e, 3595}, + /*II_0F_60*/ {0x158, 3634}, + /*II_66_0F_60*/ {0x13b, 3634}, + /*II_0F_61*/ {0x158, 3657}, + /*II_66_0F_61*/ {0x13b, 3657}, + /*II_0F_62*/ {0x158, 3680}, + /*II_66_0F_62*/ {0x13b, 3680}, + /*II_0F_63*/ {0x159, 3703}, + /*II_66_0F_63*/ {0x13b, 3703}, + /*II_0F_64*/ {0x159, 3724}, + /*II_66_0F_64*/ {0x13b, 3724}, + /*II_0F_65*/ {0x159, 3743}, + /*II_66_0F_65*/ {0x13b, 3743}, + /*II_0F_66*/ {0x159, 3762}, + /*II_66_0F_66*/ {0x13b, 3762}, + /*II_0F_67*/ {0x159, 3781}, + /*II_66_0F_67*/ {0x13b, 3781}, + /*II_0F_68*/ {0x159, 3802}, + /*II_66_0F_68*/ {0x13b, 3802}, + /*II_0F_69*/ {0x159, 3825}, + /*II_66_0F_69*/ {0x13b, 3825}, + /*II_0F_6A*/ {0x159, 3848}, + /*II_66_0F_6A*/ {0x13b, 3848}, + /*II_0F_6B*/ {0x159, 3871}, + /*II_66_0F_6B*/ {0x13b, 3871}, + /*II_66_0F_6C*/ {0x13b, 3892}, + /*II_66_0F_6D*/ {0x13b, 3917}, + /*II_0F_6F*/ {0x15d, 3948}, + /*II_66_0F_6F*/ {0x123, 3968}, + /*II_F3_0F_6F*/ {0x123, 3976}, + /*II_0F_74*/ {0x159, 4065}, + /*II_66_0F_74*/ {0x13b, 4065}, + /*II_0F_75*/ {0x159, 4084}, + /*II_66_0F_75*/ {0x13b, 4084}, + /*II_0F_76*/ {0x159, 4103}, + /*II_66_0F_76*/ {0x13b, 4103}, + /*II_0F_77*/ {0x161, 4122}, + /*II_0F_78*/ {0x163, 4150}, + /*II_0F_79*/ {0x166, 4174}, + /*II_66_0F_79*/ {0x167, 4158}, + /*II_F2_0F_79*/ {0x168, 4165}, + /*II_0F_7A_30*/ {0x169, 4183}, + /*II_0F_7A_31*/ {0x16a, 4193}, + /*II_66_0F_7C*/ {0x16b, 4203}, + /*II_F2_0F_7C*/ {0x16b, 4211}, + /*II_66_0F_7D*/ {0x16b, 4237}, + /*II_F2_0F_7D*/ {0x16b, 4245}, + /*II_F3_0F_7E*/ {0x125, 3948}, + /*II_0F_7F*/ {0x16f, 3948}, + /*II_66_0F_7F*/ {0x12b, 3968}, + /*II_F3_0F_7F*/ {0x12b, 3976}, + /*II_F3_0F_B8*/ {0x173, 4360}, + /*II_0F_BA_04*/ {0x174, 872}, + /*II_0F_BA_05*/ {0x175, 887}, + /*II_0F_BA_06*/ {0x175, 912}, + /*II_0F_BA_07*/ {0x175, 934}, + /*II_0F_BC*/ {0x176, 4368}, + /*II_F3_0F_BC*/ {0x177, 4373}, + /*II_0F_BD*/ {0x176, 4380}, + /*II_F3_0F_BD*/ {0x178, 4385}, + /*II_0F_C7_07*/ {0x188, 6407}, + /*II_66_0F_D0*/ {0x16b, 6416}, + /*II_F2_0F_D0*/ {0x16b, 6426}, + /*II_0F_D1*/ {0x159, 6458}, + /*II_66_0F_D1*/ {0x13b, 6458}, + /*II_0F_D2*/ {0x159, 6473}, + /*II_66_0F_D2*/ {0x13b, 6473}, + /*II_0F_D3*/ {0x159, 6488}, + /*II_66_0F_D3*/ {0x13b, 6488}, + /*II_0F_D4*/ {0x14e, 6503}, + /*II_66_0F_D4*/ {0x13b, 6503}, + /*II_0F_D5*/ {0x159, 6518}, + /*II_66_0F_D5*/ {0x13b, 6518}, + /*II_66_0F_D6*/ {0x12d, 3948}, + /*II_F3_0F_D6*/ {0x189, 6535}, + /*II_F2_0F_D6*/ {0x18a, 6544}, + /*II_0F_D7*/ {0x18c, 6553}, + /*II_66_0F_D7*/ {0x18d, 6553}, + /*II_0F_D8*/ {0x159, 6574}, + /*II_66_0F_D8*/ {0x13b, 6574}, + /*II_0F_D9*/ {0x159, 6593}, + /*II_66_0F_D9*/ {0x13b, 6593}, + /*II_0F_DA*/ {0x18f, 6612}, + /*II_66_0F_DA*/ {0x13b, 6612}, + /*II_0F_DB*/ {0x159, 6629}, + /*II_66_0F_DB*/ {0x13b, 6629}, + /*II_0F_DC*/ {0x159, 6642}, + /*II_66_0F_DC*/ {0x13b, 6642}, + /*II_0F_DD*/ {0x159, 6661}, + /*II_66_0F_DD*/ {0x13b, 6661}, + /*II_0F_DE*/ {0x18f, 6670}, + /*II_66_0F_DE*/ {0x13b, 6670}, + /*II_0F_DF*/ {0x159, 6687}, + /*II_66_0F_DF*/ {0x13b, 6687}, + /*II_0F_E0*/ {0x18f, 6702}, + /*II_66_0F_E0*/ {0x13b, 6702}, + /*II_0F_E1*/ {0x159, 6717}, + /*II_66_0F_E1*/ {0x13b, 6717}, + /*II_0F_E2*/ {0x159, 6732}, + /*II_66_0F_E2*/ {0x13b, 6732}, + /*II_0F_E3*/ {0x18f, 6747}, + /*II_66_0F_E3*/ {0x13b, 6747}, + /*II_0F_E4*/ {0x18f, 6762}, + /*II_66_0F_E4*/ {0x13b, 6762}, + /*II_0F_E5*/ {0x159, 6781}, + /*II_66_0F_E5*/ {0x13b, 6781}, + /*II_66_0F_E6*/ {0x13b, 6798}, + /*II_F3_0F_E6*/ {0x14e, 6809}, + /*II_F2_0F_E6*/ {0x13b, 6819}, + /*II_0F_E7*/ {0x190, 6863}, + /*II_66_0F_E7*/ {0x144, 6871}, + /*II_0F_E8*/ {0x159, 6890}, + /*II_66_0F_E8*/ {0x13b, 6890}, + /*II_0F_E9*/ {0x159, 6907}, + /*II_66_0F_E9*/ {0x13b, 6907}, + /*II_0F_EA*/ {0x18f, 6924}, + /*II_66_0F_EA*/ {0x13b, 6924}, + /*II_0F_EB*/ {0x159, 6941}, + /*II_66_0F_EB*/ {0x13b, 6941}, + /*II_0F_EC*/ {0x159, 6952}, + /*II_66_0F_EC*/ {0x13b, 6952}, + /*II_0F_ED*/ {0x159, 6969}, + /*II_66_0F_ED*/ {0x13b, 6969}, + /*II_0F_EE*/ {0x18f, 6986}, + /*II_66_0F_EE*/ {0x13b, 6986}, + /*II_0F_EF*/ {0x159, 7003}, + /*II_66_0F_EF*/ {0x13b, 7003}, + /*II_F2_0F_F0*/ {0x191, 7016}, + /*II_0F_F1*/ {0x159, 7031}, + /*II_66_0F_F1*/ {0x13b, 7031}, + /*II_0F_F2*/ {0x159, 7046}, + /*II_66_0F_F2*/ {0x13b, 7046}, + /*II_0F_F3*/ {0x159, 7061}, + /*II_66_0F_F3*/ {0x13b, 7061}, + /*II_0F_F4*/ {0x193, 7076}, + /*II_66_0F_F4*/ {0x13b, 7076}, + /*II_0F_F5*/ {0x159, 7095}, + /*II_66_0F_F5*/ {0x13b, 7095}, + /*II_0F_F6*/ {0x18f, 7114}, + /*II_66_0F_F6*/ {0x13b, 7114}, + /*II_0F_F7*/ {0x194, 7131}, + /*II_66_0F_F7*/ {0x195, 7141}, + /*II_0F_F8*/ {0x159, 7166}, + /*II_66_0F_F8*/ {0x13b, 7166}, + /*II_0F_F9*/ {0x159, 7181}, + /*II_66_0F_F9*/ {0x13b, 7181}, + /*II_0F_FA*/ {0x159, 7196}, + /*II_66_0F_FA*/ {0x13b, 7196}, + /*II_0F_FB*/ {0x193, 7211}, + /*II_66_0F_FB*/ {0x13b, 7211}, + /*II_0F_FC*/ {0x159, 7226}, + /*II_66_0F_FC*/ {0x13b, 7226}, + /*II_0F_FD*/ {0x159, 7241}, + /*II_66_0F_FD*/ {0x13b, 7241}, + /*II_0F_FE*/ {0x159, 7256}, + /*II_66_0F_FE*/ {0x13b, 7256}, + /*II_D9_06*/ {0x197, 7271}, + /*II_9B_D9_06*/ {0x198, 7280}, + /*II_D9_07*/ {0xfd, 7288}, + /*II_9B_D9_07*/ {0x199, 7296}, + /*II_DB_E2*/ {0xeb, 7303}, + /*II_9B_DB_E2*/ {0x19a, 7311}, + /*II_DB_E3*/ {0xeb, 7318}, + /*II_9B_DB_E3*/ {0x19a, 7326}, + /*II_DD_06*/ {0x197, 7333}, + /*II_9B_DD_06*/ {0x198, 7341}, + /*II_DD_07*/ {0xfd, 7348}, + /*II_9B_DD_07*/ {0x199, 7356}, + /*II_DF_E0*/ {0x19b, 7348}, + /*II_9B_DF_E0*/ {0x19c, 7356}, + /*II_0F_38_00*/ {0x19d, 7363}, + /*II_66_0F_38_00*/ {0x19e, 7363}, + /*II_0F_38_01*/ {0x19d, 7380}, + /*II_66_0F_38_01*/ {0x19e, 7380}, + /*II_0F_38_02*/ {0x19d, 7397}, + /*II_66_0F_38_02*/ {0x19e, 7397}, + /*II_0F_38_03*/ {0x19d, 7414}, + /*II_66_0F_38_03*/ {0x19e, 7414}, + /*II_0F_38_04*/ {0x19d, 7433}, + /*II_66_0F_38_04*/ {0x19e, 7433}, + /*II_0F_38_05*/ {0x19d, 7456}, + /*II_66_0F_38_05*/ {0x19e, 7456}, + /*II_0F_38_06*/ {0x19d, 7473}, + /*II_66_0F_38_06*/ {0x19e, 7473}, + /*II_0F_38_07*/ {0x19d, 7490}, + /*II_66_0F_38_07*/ {0x19e, 7490}, + /*II_0F_38_08*/ {0x19d, 7509}, + /*II_66_0F_38_08*/ {0x19e, 7509}, + /*II_0F_38_09*/ {0x19d, 7526}, + /*II_66_0F_38_09*/ {0x19e, 7526}, + /*II_0F_38_0A*/ {0x19d, 7543}, + /*II_66_0F_38_0A*/ {0x19e, 7543}, + /*II_0F_38_0B*/ {0x19d, 7560}, + /*II_66_0F_38_0B*/ {0x19e, 7560}, + /*II_66_0F_38_17*/ {0x1a0, 7651}, + /*II_0F_38_1C*/ {0x19d, 7710}, + /*II_66_0F_38_1C*/ {0x19e, 7710}, + /*II_0F_38_1D*/ {0x19d, 7725}, + /*II_66_0F_38_1D*/ {0x19e, 7725}, + /*II_0F_38_1E*/ {0x19d, 7740}, + /*II_66_0F_38_1E*/ {0x19e, 7740}, + /*II_66_0F_38_20*/ {0x1a5, 7755}, + /*II_66_0F_38_21*/ {0x1a6, 7776}, + /*II_66_0F_38_22*/ {0x1a7, 7797}, + /*II_66_0F_38_23*/ {0x1a5, 7818}, + /*II_66_0F_38_24*/ {0x1a6, 7839}, + /*II_66_0F_38_25*/ {0x1a5, 7860}, + /*II_66_0F_38_28*/ {0x1a9, 7881}, + /*II_66_0F_38_29*/ {0x1a9, 7898}, + /*II_66_0F_38_2A*/ {0x1aa, 7917}, + /*II_66_0F_38_2B*/ {0x1a9, 7938}, + /*II_66_0F_38_30*/ {0x1a5, 7983}, + /*II_66_0F_38_31*/ {0x1a6, 8004}, + /*II_66_0F_38_32*/ {0x1a7, 8025}, + /*II_66_0F_38_33*/ {0x1a5, 8046}, + /*II_66_0F_38_34*/ {0x1a6, 8067}, + /*II_66_0F_38_35*/ {0x1a5, 8088}, + /*II_66_0F_38_37*/ {0x1a0, 8109}, + /*II_66_0F_38_38*/ {0x1a9, 8128}, + /*II_66_0F_38_39*/ {0x1a9, 8145}, + /*II_66_0F_38_3A*/ {0x1a9, 8162}, + /*II_66_0F_38_3B*/ {0x1a9, 8179}, + /*II_66_0F_38_3C*/ {0x1a9, 8196}, + /*II_66_0F_38_3D*/ {0x1a9, 8213}, + /*II_66_0F_38_3E*/ {0x1a9, 8230}, + /*II_66_0F_38_3F*/ {0x1a9, 8247}, + /*II_66_0F_38_40*/ {0x1a9, 8264}, + /*II_66_0F_38_41*/ {0x1a9, 8281}, + /*II_66_0F_38_80*/ {0x1ad, 8306}, + /*II_66_0F_38_81*/ {0x1ad, 8314}, + /*II_66_0F_38_82*/ {0x1ad, 8323}, + /*II_66_0F_38_DB*/ {0x1b0, 9172}, + /*II_66_0F_38_DC*/ {0x1b0, 9189}, + /*II_66_0F_38_DD*/ {0x1b0, 9206}, + /*II_66_0F_38_DE*/ {0x1b0, 9231}, + /*II_66_0F_38_DF*/ {0x1b0, 9248}, + /*II_0F_38_F0*/ {0x1b3, 9273}, + /*II_F2_0F_38_F0*/ {0x1b4, 9280}, + /*II_0F_38_F1*/ {0x1b5, 9273}, + /*II_F2_0F_38_F1*/ {0x1b6, 9280}, + /*II_0F_71_02*/ {0x1cd, 6458}, + /*II_66_0F_71_02*/ {0x1ce, 6458}, + /*II_0F_71_04*/ {0x1cd, 6717}, + /*II_66_0F_71_04*/ {0x1ce, 6717}, + /*II_0F_71_06*/ {0x1cd, 7031}, + /*II_66_0F_71_06*/ {0x1ce, 7031}, + /*II_0F_72_02*/ {0x1cd, 6473}, + /*II_66_0F_72_02*/ {0x1ce, 6473}, + /*II_0F_72_04*/ {0x1cd, 6732}, + /*II_66_0F_72_04*/ {0x1ce, 6732}, + /*II_0F_72_06*/ {0x1cd, 7046}, + /*II_66_0F_72_06*/ {0x1ce, 7046}, + /*II_0F_73_02*/ {0x1cd, 6488}, + /*II_66_0F_73_02*/ {0x1ce, 6488}, + /*II_66_0F_73_03*/ {0x1ce, 9852}, + /*II_0F_73_06*/ {0x1cd, 7061}, + /*II_66_0F_73_06*/ {0x1ce, 7061}, + /*II_66_0F_73_07*/ {0x1ce, 9869}, + /*II_F3_0F_AE_00*/ {0x1d0, 9904}, + /*II_F3_0F_AE_01*/ {0x1d0, 9934}, + /*II_0F_AE_02*/ {0x1d1, 9944}, + /*II_F3_0F_AE_02*/ {0x1d0, 9953}, + /*II_0F_AE_03*/ {0x1d1, 9973}, + /*II_F3_0F_AE_03*/ {0x1d0, 9982}, + /*II_0F_C7_06*/ {0x1d3, 10002}, + /*II_66_0F_C7_06*/ {0x188, 10011}, + /*II_F3_0F_C7_06*/ {0x188, 10020} }; _InstInfoEx InstInfosEx[381] = { - /*II_69*/{ { 0x34, 117 }, 0x0, 3, 0, 0, 0 }, - /*II_6B*/{ { 0x34, 117 }, 0x0, 5, 0, 0, 0 }, - /*II_98*/{ { 0x4e, 228 }, 0x0, 0, 0, 233, 239 }, - /*II_99*/{ { 0x4e, 245 }, 0x0, 0, 0, 250, 255 }, - /*II_E3*/{ { 0x76, 427 }, 0x0, 0, 0, 433, 440 }, - /*II_0F_A4*/{ { 0xac, 876 }, 0x0, 1, 0, 0, 0 }, - /*II_0F_A5*/{ { 0xac, 876 }, 0x0, 52, 0, 0, 0 }, - /*II_0F_AC*/{ { 0xac, 892 }, 0x0, 1, 0, 0, 0 }, - /*II_0F_AD*/{ { 0xac, 892 }, 0x0, 52, 0, 0, 0 }, - /*II_V_0F_10*/{ { 0x126, 2139 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_10*/{ { 0x126, 2148 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_10*/{ { 0x127, 2157 }, 0x20, 69, 0, 0, 0 }, - /*II_V_F2_0F_10*/{ { 0x127, 2165 }, 0x20, 69, 0, 0, 0 }, - /*II_VRR_F3_0F_10*/{ { 0x128, 2157 }, 0x60, 0, 0, 0, 0 }, - /*II_VRR_F2_0F_10*/{ { 0x129, 2165 }, 0x60, 0, 0, 0, 0 }, - /*II_V_0F_11*/{ { 0x12e, 2139 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_11*/{ { 0x12e, 2148 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_11*/{ { 0x127, 2157 }, 0x20, 69, 0, 0, 0 }, - /*II_V_F2_0F_11*/{ { 0x127, 2165 }, 0x20, 69, 0, 0, 0 }, - /*II_VRR_F3_0F_11*/{ { 0x12f, 2157 }, 0x60, 0, 0, 0, 0 }, - /*II_VRR_F2_0F_11*/{ { 0x130, 2165 }, 0x60, 0, 0, 0, 0 }, - /*II_0F_12*/{ { 0x131, 2173 }, 0x0, 0, 0, 2182, 0 }, - /*II_V_0F_12*/{ { 0x134, 2217 }, 0x0, 72, 0, 2227, 0 }, - /*II_V_66_0F_12*/{ { 0x135, 2236 }, 0x0, 46, 0, 0, 0 }, - /*II_V_F3_0F_12*/{ { 0x126, 2245 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F2_0F_12*/{ { 0x136, 2256 }, 0x41, 0, 0, 0, 0 }, - /*II_V_0F_13*/{ { 0x139, 2227 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_13*/{ { 0x139, 2236 }, 0x40, 0, 0, 0, 0 }, - /*II_V_0F_14*/{ { 0x13c, 2286 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_14*/{ { 0x13c, 2297 }, 0x1, 90, 0, 0, 0 }, - /*II_V_0F_15*/{ { 0x13c, 2328 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_15*/{ { 0x13c, 2339 }, 0x1, 90, 0, 0, 0 }, - /*II_0F_16*/{ { 0x131, 2350 }, 0x0, 0, 0, 2359, 0 }, - /*II_V_0F_16*/{ { 0x134, 2385 }, 0x0, 72, 0, 2395, 0 }, - /*II_V_66_0F_16*/{ { 0x135, 2404 }, 0x0, 46, 0, 0, 0 }, - /*II_V_F3_0F_16*/{ { 0x126, 2413 }, 0x41, 0, 0, 0, 0 }, - /*II_V_0F_17*/{ { 0x139, 2395 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_17*/{ { 0x139, 2404 }, 0x40, 0, 0, 0, 0 }, - /*II_V_0F_28*/{ { 0x126, 2489 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_28*/{ { 0x126, 2498 }, 0x41, 0, 0, 0, 0 }, - /*II_V_0F_29*/{ { 0x12e, 2489 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_29*/{ { 0x12e, 2498 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_2A*/{ { 0x135, 2547 }, 0x2, 79, 0, 0, 0 }, - /*II_V_F2_0F_2A*/{ { 0x135, 2558 }, 0x2, 79, 0, 0, 0 }, - /*II_V_0F_2B*/{ { 0x147, 2605 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_2B*/{ { 0x147, 2615 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_2C*/{ { 0x14c, 2669 }, 0x42, 0, 0, 0, 0 }, - /*II_V_F2_0F_2C*/{ { 0x14c, 2681 }, 0x42, 0, 0, 0, 0 }, - /*II_V_F3_0F_2D*/{ { 0x14c, 2733 }, 0x42, 0, 0, 0, 0 }, - /*II_V_F2_0F_2D*/{ { 0x14c, 2744 }, 0x42, 0, 0, 0, 0 }, - /*II_V_0F_2E*/{ { 0x14f, 2773 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_2E*/{ { 0x150, 2783 }, 0x40, 0, 0, 0, 0 }, - /*II_V_0F_2F*/{ { 0x14f, 2809 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_2F*/{ { 0x150, 2818 }, 0x40, 0, 0, 0, 0 }, - /*II_V_0F_50*/{ { 0x153, 2847 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_50*/{ { 0x153, 2858 }, 0x41, 0, 0, 0, 0 }, - /*II_V_0F_51*/{ { 0x126, 2901 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_51*/{ { 0x126, 2910 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_51*/{ { 0x135, 2919 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_51*/{ { 0x135, 2928 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_52*/{ { 0x126, 2955 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_52*/{ { 0x135, 2965 }, 0x0, 71, 0, 0, 0 }, - /*II_V_0F_53*/{ { 0x126, 2989 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_53*/{ { 0x135, 2997 }, 0x0, 71, 0, 0, 0 }, - /*II_V_0F_54*/{ { 0x13c, 3019 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_54*/{ { 0x13c, 3027 }, 0x1, 90, 0, 0, 0 }, - /*II_V_0F_55*/{ { 0x13c, 3051 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_55*/{ { 0x13c, 3060 }, 0x1, 90, 0, 0, 0 }, - /*II_V_0F_56*/{ { 0x13c, 3081 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_56*/{ { 0x13c, 3088 }, 0x1, 90, 0, 0, 0 }, - /*II_V_0F_57*/{ { 0x13c, 3109 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_57*/{ { 0x13c, 3117 }, 0x1, 90, 0, 0, 0 }, - /*II_V_0F_58*/{ { 0x13c, 3153 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_58*/{ { 0x13c, 3161 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_58*/{ { 0x135, 3169 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_58*/{ { 0x135, 3177 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_59*/{ { 0x13c, 3213 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_59*/{ { 0x13c, 3221 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_59*/{ { 0x135, 3229 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_59*/{ { 0x135, 3237 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_5A*/{ { 0x156, 3285 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_5A*/{ { 0x157, 3296 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_5A*/{ { 0x135, 3307 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_5A*/{ { 0x135, 3318 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_5B*/{ { 0x126, 3360 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_5B*/{ { 0x126, 3371 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_5B*/{ { 0x126, 3382 }, 0x41, 0, 0, 0, 0 }, - /*II_V_0F_5C*/{ { 0x13c, 3422 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_5C*/{ { 0x13c, 3430 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_5C*/{ { 0x135, 3438 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_5C*/{ { 0x135, 3446 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_5D*/{ { 0x13c, 3482 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_5D*/{ { 0x13c, 3490 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_5D*/{ { 0x135, 3498 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_5D*/{ { 0x135, 3506 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_5E*/{ { 0x13c, 3542 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_5E*/{ { 0x13c, 3550 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_5E*/{ { 0x135, 3558 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_5E*/{ { 0x135, 3566 }, 0x0, 72, 0, 0, 0 }, - /*II_V_0F_5F*/{ { 0x13c, 3602 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_5F*/{ { 0x13c, 3610 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F3_0F_5F*/{ { 0x135, 3618 }, 0x0, 71, 0, 0, 0 }, - /*II_V_F2_0F_5F*/{ { 0x135, 3626 }, 0x0, 72, 0, 0, 0 }, - /*II_V_66_0F_60*/{ { 0x135, 3645 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_61*/{ { 0x135, 3668 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_62*/{ { 0x135, 3691 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_63*/{ { 0x135, 3713 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_64*/{ { 0x135, 3733 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_65*/{ { 0x135, 3752 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_66*/{ { 0x135, 3771 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_67*/{ { 0x135, 3791 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_68*/{ { 0x135, 3813 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_69*/{ { 0x135, 3836 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_6A*/{ { 0x135, 3859 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_6B*/{ { 0x135, 3881 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_6C*/{ { 0x135, 3904 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_6D*/{ { 0x135, 3929 }, 0x0, 73, 0, 0, 0 }, - /*II_0F_6E*/{ { 0x15a, 3942 }, 0x0, 0, 0, 0, 3948 }, - /*II_66_0F_6E*/{ { 0x15b, 3942 }, 0x0, 0, 0, 0, 3948 }, - /*II_V_66_0F_6E*/{ { 0x15c, 3954 }, 0x46, 0, 0, 3961, 0 }, - /*II_V_66_0F_6F*/{ { 0x126, 3984 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_6F*/{ { 0x126, 3993 }, 0x41, 0, 0, 0, 0 }, - /*II_0F_70*/{ { 0x15e, 4002 }, 0x0, 1, 0, 0, 0 }, - /*II_66_0F_70*/{ { 0x15f, 4010 }, 0x0, 1, 0, 0, 0 }, - /*II_F3_0F_70*/{ { 0x15f, 4018 }, 0x0, 1, 0, 0, 0 }, - /*II_F2_0F_70*/{ { 0x15f, 4027 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_70*/{ { 0x160, 4036 }, 0x40, 1, 0, 0, 0 }, - /*II_V_F3_0F_70*/{ { 0x160, 4045 }, 0x40, 1, 0, 0, 0 }, - /*II_V_F2_0F_70*/{ { 0x160, 4055 }, 0x40, 1, 0, 0, 0 }, - /*II_V_66_0F_74*/{ { 0x135, 4074 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_75*/{ { 0x135, 4093 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_76*/{ { 0x135, 4112 }, 0x0, 73, 0, 0, 0 }, - /*II_V_0F_77*/{ { 0x162, 4128 }, 0x49, 0, 0, 4140, 0 }, - /*II_66_0F_78*/{ { 0x164, 4158 }, 0x0, 8, 0, 0, 0 }, - /*II_F2_0F_78*/{ { 0x165, 4165 }, 0x0, 7, 8, 0, 0 }, - /*II_V_66_0F_7C*/{ { 0x13c, 4219 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F2_0F_7C*/{ { 0x13c, 4228 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_7D*/{ { 0x13c, 4253 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F2_0F_7D*/{ { 0x13c, 4262 }, 0x1, 90, 0, 0, 0 }, - /*II_0F_7E*/{ { 0x16c, 3942 }, 0x0, 0, 0, 0, 3948 }, - /*II_66_0F_7E*/{ { 0x16d, 3942 }, 0x0, 0, 0, 0, 3948 }, - /*II_V_66_0F_7E*/{ { 0x16e, 3954 }, 0x46, 0, 0, 3961, 0 }, - /*II_V_F3_0F_7E*/{ { 0x150, 3961 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_7F*/{ { 0x12e, 3984 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_7F*/{ { 0x12e, 3993 }, 0x41, 0, 0, 0, 0 }, - /*II_0F_AE_04*/{ { 0x170, 4271 }, 0x0, 0, 0, 0, 4278 }, - /*II_0F_AE_05*/{ { 0x171, 4287 }, 0x0, 0, 0, 4295, 4303 }, - /*II_0F_AE_06*/{ { 0x171, 4313 }, 0x0, 0, 0, 4321, 4331 }, - /*II_0F_AE_07*/{ { 0x172, 4343 }, 0x0, 0, 0, 4351, 0 }, - /*II_0F_C2*/{ { 0x179, 4392 }, 0x0, 0, 0, 4401, 4410 }, - /*II_66_0F_C2*/{ { 0x17a, 4471 }, 0x0, 0, 0, 4480, 4489 }, - /*II_F3_0F_C2*/{ { 0x17b, 4550 }, 0x0, 0, 0, 4559, 4568 }, - /*II_F2_0F_C2*/{ { 0x17c, 4629 }, 0x0, 0, 0, 4638, 4647 }, - /*II_V_0F_C2*/{ { 0x17d, 4708 }, 0x1, 90, 0, 4718, 4728 }, - /*II_V_66_0F_C2*/{ { 0x17d, 5110 }, 0x1, 90, 0, 5120, 5130 }, - /*II_V_F3_0F_C2*/{ { 0x17e, 5512 }, 0x0, 71, 0, 5522, 5532 }, - /*II_V_F2_0F_C2*/{ { 0x17e, 5914 }, 0x0, 72, 0, 5924, 5934 }, - /*II_0F_C4*/{ { 0x17f, 6316 }, 0x0, 1, 0, 0, 0 }, - /*II_66_0F_C4*/{ { 0x180, 6316 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_C4*/{ { 0x181, 6324 }, 0x0, 25, 1, 0, 0 }, - /*II_0F_C5*/{ { 0x182, 6333 }, 0x0, 1, 0, 0, 0 }, - /*II_66_0F_C5*/{ { 0x183, 6333 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_C5*/{ { 0x184, 6341 }, 0x40, 1, 0, 0, 0 }, - /*II_0F_C6*/{ { 0x185, 6350 }, 0x0, 1, 0, 0, 0 }, - /*II_66_0F_C6*/{ { 0x15f, 6358 }, 0x0, 1, 0, 0, 0 }, - /*II_V_0F_C6*/{ { 0x186, 6366 }, 0x1, 90, 1, 0, 0 }, - /*II_V_66_0F_C6*/{ { 0x186, 6375 }, 0x1, 90, 1, 0, 0 }, - /*II_0F_C7_01*/{ { 0x187, 6384 }, 0x0, 0, 0, 0, 6395 }, - /*II_V_66_0F_D0*/{ { 0x13c, 6436 }, 0x1, 90, 0, 0, 0 }, - /*II_V_F2_0F_D0*/{ { 0x13c, 6447 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_D1*/{ { 0x135, 6465 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D2*/{ { 0x135, 6480 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D3*/{ { 0x135, 6495 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D4*/{ { 0x135, 6510 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D5*/{ { 0x135, 6526 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D6*/{ { 0x18b, 3961 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_D7*/{ { 0x18e, 6563 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_D8*/{ { 0x135, 6583 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_D9*/{ { 0x135, 6602 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DA*/{ { 0x135, 6620 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DB*/{ { 0x135, 6635 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DC*/{ { 0x135, 6651 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DD*/{ { 0x135, 6651 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DE*/{ { 0x135, 6678 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_DF*/{ { 0x135, 6694 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E0*/{ { 0x135, 6709 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E1*/{ { 0x135, 6724 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E2*/{ { 0x135, 6739 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E3*/{ { 0x135, 6754 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E4*/{ { 0x135, 6771 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E5*/{ { 0x135, 6789 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E6*/{ { 0x157, 6829 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F3_0F_E6*/{ { 0x156, 6841 }, 0x41, 0, 0, 0, 0 }, - /*II_V_F2_0F_E6*/{ { 0x157, 6852 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_E7*/{ { 0x147, 6880 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_E8*/{ { 0x135, 6898 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_E9*/{ { 0x135, 6915 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_EA*/{ { 0x135, 6932 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_EB*/{ { 0x135, 6946 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_EC*/{ { 0x135, 6960 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_ED*/{ { 0x135, 6977 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_EE*/{ { 0x135, 6994 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_EF*/{ { 0x135, 7009 }, 0x0, 73, 0, 0, 0 }, - /*II_V_F2_0F_F0*/{ { 0x192, 7023 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_F1*/{ { 0x135, 7038 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F2*/{ { 0x135, 7053 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F3*/{ { 0x135, 7068 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F4*/{ { 0x135, 7085 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F5*/{ { 0x135, 7104 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F6*/{ { 0x135, 7122 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F7*/{ { 0x196, 7153 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_F8*/{ { 0x135, 7173 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_F9*/{ { 0x135, 7188 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_FA*/{ { 0x135, 7203 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_FB*/{ { 0x135, 7218 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_FC*/{ { 0x135, 7233 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_FD*/{ { 0x135, 7248 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_FE*/{ { 0x135, 7263 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_00*/{ { 0x135, 7371 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_01*/{ { 0x135, 7388 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_02*/{ { 0x135, 7405 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_03*/{ { 0x135, 7423 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_04*/{ { 0x135, 7444 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_05*/{ { 0x135, 7464 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_06*/{ { 0x135, 7481 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_07*/{ { 0x135, 7499 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_08*/{ { 0x135, 7517 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_09*/{ { 0x135, 7534 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_0A*/{ { 0x135, 7551 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_0B*/{ { 0x135, 7570 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_0C*/{ { 0x13c, 7581 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_38_0D*/{ { 0x13c, 7592 }, 0x1, 90, 0, 0, 0 }, - /*II_V_66_0F_38_0E*/{ { 0x126, 7603 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_38_0F*/{ { 0x126, 7612 }, 0x41, 0, 0, 0, 0 }, - /*II_66_0F_38_10*/{ { 0x19f, 7621 }, 0x0, 74, 0, 0, 0 }, - /*II_66_0F_38_14*/{ { 0x19f, 7631 }, 0x0, 74, 0, 0, 0 }, - /*II_66_0F_38_15*/{ { 0x19f, 7641 }, 0x0, 74, 0, 0, 0 }, - /*II_V_66_0F_38_17*/{ { 0x126, 7658 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_38_18*/{ { 0x1a1, 7666 }, 0x41, 0, 0, 0, 0 }, - /*II_V_66_0F_38_19*/{ { 0x1a2, 7680 }, 0x50, 0, 0, 0, 0 }, - /*II_V_66_0F_38_1A*/{ { 0x1a3, 7694 }, 0x50, 0, 0, 0, 0 }, - /*II_V_66_0F_38_1C*/{ { 0x1a4, 7717 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_1D*/{ { 0x1a4, 7732 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_1E*/{ { 0x1a4, 7747 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_20*/{ { 0x150, 7765 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_21*/{ { 0x14f, 7786 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_22*/{ { 0x1a8, 7807 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_23*/{ { 0x150, 7828 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_24*/{ { 0x14f, 7849 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_25*/{ { 0x150, 7870 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_28*/{ { 0x135, 7889 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_29*/{ { 0x135, 7907 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_2A*/{ { 0x1ab, 7927 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_2B*/{ { 0x135, 7948 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_2C*/{ { 0x13c, 7959 }, 0x1, 92, 0, 0, 0 }, - /*II_V_66_0F_38_2D*/{ { 0x13c, 7971 }, 0x1, 92, 0, 0, 0 }, - /*II_V_66_0F_38_2E*/{ { 0x1ac, 7959 }, 0x1, 83, 0, 0, 0 }, - /*II_V_66_0F_38_2F*/{ { 0x1ac, 7971 }, 0x1, 83, 0, 0, 0 }, - /*II_V_66_0F_38_30*/{ { 0x150, 7993 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_31*/{ { 0x14f, 8014 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_32*/{ { 0x1a8, 8035 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_33*/{ { 0x150, 8056 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_34*/{ { 0x14f, 8077 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_35*/{ { 0x150, 8098 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_37*/{ { 0x135, 8118 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_38*/{ { 0x135, 8136 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_39*/{ { 0x135, 8153 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3A*/{ { 0x135, 8170 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3B*/{ { 0x135, 8187 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3C*/{ { 0x135, 8204 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3D*/{ { 0x135, 8221 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3E*/{ { 0x135, 8238 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_3F*/{ { 0x135, 8255 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_40*/{ { 0x135, 8272 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_41*/{ { 0x1a4, 8293 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_96*/{ { 0x1ae, 8332 }, 0x7, 90, 0, 8348, 0 }, - /*II_V_66_0F_38_97*/{ { 0x1ae, 8364 }, 0x7, 90, 0, 8380, 0 }, - /*II_V_66_0F_38_98*/{ { 0x1ae, 8396 }, 0x7, 90, 0, 8409, 0 }, - /*II_V_66_0F_38_99*/{ { 0x1af, 8422 }, 0x6, 80, 0, 8435, 0 }, - /*II_V_66_0F_38_9A*/{ { 0x1ae, 8448 }, 0x7, 90, 0, 8461, 0 }, - /*II_V_66_0F_38_9B*/{ { 0x1af, 8474 }, 0x6, 80, 0, 8487, 0 }, - /*II_V_66_0F_38_9C*/{ { 0x1ae, 8500 }, 0x7, 90, 0, 8514, 0 }, - /*II_V_66_0F_38_9D*/{ { 0x1af, 8528 }, 0x6, 80, 0, 8542, 0 }, - /*II_V_66_0F_38_9E*/{ { 0x1ae, 8556 }, 0x7, 90, 0, 8570, 0 }, - /*II_V_66_0F_38_9F*/{ { 0x1af, 8584 }, 0x6, 80, 0, 8598, 0 }, - /*II_V_66_0F_38_A6*/{ { 0x1ae, 8612 }, 0x7, 90, 0, 8628, 0 }, - /*II_V_66_0F_38_A7*/{ { 0x1ae, 8644 }, 0x7, 90, 0, 8660, 0 }, - /*II_V_66_0F_38_A8*/{ { 0x1ae, 8676 }, 0x7, 90, 0, 8689, 0 }, - /*II_V_66_0F_38_A9*/{ { 0x1af, 8702 }, 0x6, 80, 0, 8715, 0 }, - /*II_V_66_0F_38_AA*/{ { 0x1ae, 8728 }, 0x7, 90, 0, 8741, 0 }, - /*II_V_66_0F_38_AB*/{ { 0x1af, 8754 }, 0x6, 80, 0, 8767, 0 }, - /*II_V_66_0F_38_AC*/{ { 0x1ae, 8780 }, 0x7, 90, 0, 8794, 0 }, - /*II_V_66_0F_38_AD*/{ { 0x1af, 8808 }, 0x6, 80, 0, 8822, 0 }, - /*II_V_66_0F_38_AE*/{ { 0x1ae, 8836 }, 0x7, 90, 0, 8850, 0 }, - /*II_V_66_0F_38_AF*/{ { 0x1af, 8864 }, 0x6, 80, 0, 8878, 0 }, - /*II_V_66_0F_38_B6*/{ { 0x1ae, 8892 }, 0x7, 90, 0, 8908, 0 }, - /*II_V_66_0F_38_B7*/{ { 0x1ae, 8924 }, 0x7, 90, 0, 8940, 0 }, - /*II_V_66_0F_38_B8*/{ { 0x1ae, 8956 }, 0x7, 90, 0, 8969, 0 }, - /*II_V_66_0F_38_B9*/{ { 0x1af, 8982 }, 0x6, 80, 0, 8995, 0 }, - /*II_V_66_0F_38_BA*/{ { 0x1ae, 9008 }, 0x7, 90, 0, 9021, 0 }, - /*II_V_66_0F_38_BB*/{ { 0x1af, 9034 }, 0x6, 80, 0, 9047, 0 }, - /*II_V_66_0F_38_BC*/{ { 0x1ae, 9060 }, 0x7, 90, 0, 9074, 0 }, - /*II_V_66_0F_38_BD*/{ { 0x1af, 9088 }, 0x6, 80, 0, 9102, 0 }, - /*II_V_66_0F_38_BE*/{ { 0x1ae, 9116 }, 0x7, 90, 0, 9130, 0 }, - /*II_V_66_0F_38_BF*/{ { 0x1af, 9144 }, 0x6, 80, 0, 9158, 0 }, - /*II_V_66_0F_38_DB*/{ { 0x1b1, 9180 }, 0x40, 0, 0, 0, 0 }, - /*II_V_66_0F_38_DC*/{ { 0x1b2, 9197 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_DD*/{ { 0x1b2, 9218 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_DE*/{ { 0x1b2, 9239 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_38_DF*/{ { 0x1b2, 9260 }, 0x0, 73, 0, 0, 0 }, - /*II_V_66_0F_3A_04*/{ { 0x1b7, 7581 }, 0x41, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_05*/{ { 0x1b7, 7592 }, 0x41, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_06*/{ { 0x1b8, 9287 }, 0x10, 86, 1, 0, 0 }, - /*II_66_0F_3A_08*/{ { 0x19f, 9299 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_08*/{ { 0x1b7, 9308 }, 0x41, 1, 0, 0, 0 }, - /*II_66_0F_3A_09*/{ { 0x19f, 9318 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_09*/{ { 0x1b7, 9327 }, 0x41, 1, 0, 0, 0 }, - /*II_66_0F_3A_0A*/{ { 0x1b9, 9337 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0A*/{ { 0x181, 9346 }, 0x0, 71, 1, 0, 0 }, - /*II_66_0F_3A_0B*/{ { 0x1ba, 9356 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0B*/{ { 0x181, 9365 }, 0x0, 72, 1, 0, 0 }, - /*II_66_0F_3A_0C*/{ { 0x19f, 9375 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0C*/{ { 0x186, 9384 }, 0x1, 90, 1, 0, 0 }, - /*II_66_0F_3A_0D*/{ { 0x19f, 9394 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0D*/{ { 0x186, 9403 }, 0x1, 90, 1, 0, 0 }, - /*II_66_0F_3A_0E*/{ { 0x19f, 9413 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0E*/{ { 0x181, 9422 }, 0x0, 73, 1, 0, 0 }, - /*II_0F_3A_0F*/{ { 0x1bb, 9432 }, 0x0, 1, 0, 0, 0 }, - /*II_66_0F_3A_0F*/{ { 0x1bc, 9432 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_0F*/{ { 0x181, 9441 }, 0x0, 73, 1, 0, 0 }, - /*II_66_0F_3A_14*/{ { 0x1bd, 9451 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_14*/{ { 0x1be, 9459 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_15*/{ { 0x1bf, 6333 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_15*/{ { 0x1c0, 6341 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_16*/{ { 0x1c1, 9468 }, 0x0, 1, 0, 0, 9476 }, - /*II_V_66_0F_3A_16*/{ { 0x1c2, 9484 }, 0x46, 1, 0, 9493, 0 }, - /*II_66_0F_3A_17*/{ { 0x1c3, 9502 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_17*/{ { 0x1c4, 9513 }, 0x40, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_18*/{ { 0x1b8, 9525 }, 0x10, 73, 1, 0, 0 }, - /*II_V_66_0F_3A_19*/{ { 0x1c5, 9538 }, 0x50, 1, 0, 0, 0 }, - /*II_66_0F_3A_20*/{ { 0x1c6, 9552 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_20*/{ { 0x181, 9560 }, 0x0, 76, 1, 0, 0 }, - /*II_66_0F_3A_21*/{ { 0x1b9, 9569 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_21*/{ { 0x181, 9579 }, 0x0, 71, 1, 0, 0 }, - /*II_66_0F_3A_22*/{ { 0x1c7, 9590 }, 0x0, 1, 0, 0, 9598 }, - /*II_V_66_0F_3A_22*/{ { 0x181, 9606 }, 0x6, 79, 1, 9615, 0 }, - /*II_66_0F_3A_40*/{ { 0x19f, 9624 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_40*/{ { 0x186, 9630 }, 0x1, 90, 1, 0, 0 }, - /*II_66_0F_3A_41*/{ { 0x19f, 9637 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_41*/{ { 0x181, 9643 }, 0x0, 73, 1, 0, 0 }, - /*II_66_0F_3A_42*/{ { 0x19f, 9650 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_42*/{ { 0x181, 9659 }, 0x0, 73, 1, 0, 0 }, - /*II_66_0F_3A_44*/{ { 0x1c8, 9669 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_44*/{ { 0x1c9, 9680 }, 0x0, 73, 1, 0, 0 }, - /*II_V_66_0F_3A_4A*/{ { 0x186, 9692 }, 0x1, 90, 84, 0, 0 }, - /*II_V_66_0F_3A_4B*/{ { 0x186, 9703 }, 0x1, 90, 84, 0, 0 }, - /*II_V_66_0F_3A_4C*/{ { 0x181, 9714 }, 0x0, 73, 82, 0, 0 }, - /*II_66_0F_3A_60*/{ { 0x1ca, 9725 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_60*/{ { 0x160, 9736 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_61*/{ { 0x1ca, 9748 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_61*/{ { 0x160, 9759 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_62*/{ { 0x1ca, 9771 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_62*/{ { 0x160, 9782 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_63*/{ { 0x1ca, 9794 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_63*/{ { 0x160, 9805 }, 0x40, 1, 0, 0, 0 }, - /*II_66_0F_3A_DF*/{ { 0x1cb, 9817 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_3A_DF*/{ { 0x1cc, 9834 }, 0x40, 1, 0, 0, 0 }, - /*II_V_66_0F_71_02*/{ { 0x1cf, 6465 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_71_04*/{ { 0x1cf, 6724 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_71_06*/{ { 0x1cf, 7038 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_72_02*/{ { 0x1cf, 6480 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_72_04*/{ { 0x1cf, 6739 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_72_06*/{ { 0x1cf, 7053 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_73_02*/{ { 0x1cf, 6495 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_73_03*/{ { 0x1cf, 9860 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_73_06*/{ { 0x1cf, 7068 }, 0x0, 1, 0, 0, 0 }, - /*II_V_66_0F_73_07*/{ { 0x1cf, 9877 }, 0x0, 1, 0, 0, 0 }, - /*II_0F_AE_00*/{ { 0x170, 9886 }, 0x0, 0, 0, 0, 9894 }, - /*II_0F_AE_01*/{ { 0x170, 9914 }, 0x0, 0, 0, 0, 9923 }, - /*II_V_0F_AE_02*/{ { 0x1d1, 9963 }, 0x40, 0, 0, 0, 0 }, - /*II_V_0F_AE_03*/{ { 0x1d1, 9992 }, 0x40, 0, 0, 0, 0 } + /*II_69*/ {{0x34, 117}, 0x0, 3, 0, 0, 0}, + /*II_6B*/ {{0x34, 117}, 0x0, 5, 0, 0, 0}, + /*II_98*/ {{0x4e, 228}, 0x0, 0, 0, 233, 239}, + /*II_99*/ {{0x4e, 245}, 0x0, 0, 0, 250, 255}, + /*II_E3*/ {{0x76, 427}, 0x0, 0, 0, 433, 440}, + /*II_0F_A4*/ {{0xac, 876}, 0x0, 1, 0, 0, 0}, + /*II_0F_A5*/ {{0xac, 876}, 0x0, 52, 0, 0, 0}, + /*II_0F_AC*/ {{0xac, 892}, 0x0, 1, 0, 0, 0}, + /*II_0F_AD*/ {{0xac, 892}, 0x0, 52, 0, 0, 0}, + /*II_V_0F_10*/ {{0x126, 2139}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_10*/ {{0x126, 2148}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_10*/ {{0x127, 2157}, 0x20, 69, 0, 0, 0}, + /*II_V_F2_0F_10*/ {{0x127, 2165}, 0x20, 69, 0, 0, 0}, + /*II_VRR_F3_0F_10*/ {{0x128, 2157}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_10*/ {{0x129, 2165}, 0x60, 0, 0, 0, 0}, + /*II_V_0F_11*/ {{0x12e, 2139}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_11*/ {{0x12e, 2148}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_11*/ {{0x127, 2157}, 0x20, 69, 0, 0, 0}, + /*II_V_F2_0F_11*/ {{0x127, 2165}, 0x20, 69, 0, 0, 0}, + /*II_VRR_F3_0F_11*/ {{0x12f, 2157}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_11*/ {{0x130, 2165}, 0x60, 0, 0, 0, 0}, + /*II_0F_12*/ {{0x131, 2173}, 0x0, 0, 0, 2182, 0}, + /*II_V_0F_12*/ {{0x134, 2217}, 0x0, 72, 0, 2227, 0}, + /*II_V_66_0F_12*/ {{0x135, 2236}, 0x0, 46, 0, 0, 0}, + /*II_V_F3_0F_12*/ {{0x126, 2245}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_12*/ {{0x136, 2256}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_13*/ {{0x139, 2227}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_13*/ {{0x139, 2236}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_14*/ {{0x13c, 2286}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_14*/ {{0x13c, 2297}, 0x1, 90, 0, 0, 0}, + /*II_V_0F_15*/ {{0x13c, 2328}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_15*/ {{0x13c, 2339}, 0x1, 90, 0, 0, 0}, + /*II_0F_16*/ {{0x131, 2350}, 0x0, 0, 0, 2359, 0}, + /*II_V_0F_16*/ {{0x134, 2385}, 0x0, 72, 0, 2395, 0}, + /*II_V_66_0F_16*/ {{0x135, 2404}, 0x0, 46, 0, 0, 0}, + /*II_V_F3_0F_16*/ {{0x126, 2413}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_17*/ {{0x139, 2395}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_17*/ {{0x139, 2404}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_28*/ {{0x126, 2489}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_28*/ {{0x126, 2498}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_29*/ {{0x12e, 2489}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_29*/ {{0x12e, 2498}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2A*/ {{0x135, 2547}, 0x2, 79, 0, 0, 0}, + /*II_V_F2_0F_2A*/ {{0x135, 2558}, 0x2, 79, 0, 0, 0}, + /*II_V_0F_2B*/ {{0x147, 2605}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_2B*/ {{0x147, 2615}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2C*/ {{0x14c, 2669}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2C*/ {{0x14c, 2681}, 0x42, 0, 0, 0, 0}, + /*II_V_F3_0F_2D*/ {{0x14c, 2733}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2D*/ {{0x14c, 2744}, 0x42, 0, 0, 0, 0}, + /*II_V_0F_2E*/ {{0x14f, 2773}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2E*/ {{0x150, 2783}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_2F*/ {{0x14f, 2809}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2F*/ {{0x150, 2818}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_50*/ {{0x153, 2847}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_50*/ {{0x153, 2858}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_51*/ {{0x126, 2901}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_51*/ {{0x126, 2910}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_51*/ {{0x135, 2919}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_51*/ {{0x135, 2928}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_52*/ {{0x126, 2955}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_52*/ {{0x135, 2965}, 0x0, 71, 0, 0, 0}, + /*II_V_0F_53*/ {{0x126, 2989}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_53*/ {{0x135, 2997}, 0x0, 71, 0, 0, 0}, + /*II_V_0F_54*/ {{0x13c, 3019}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_54*/ {{0x13c, 3027}, 0x1, 90, 0, 0, 0}, + /*II_V_0F_55*/ {{0x13c, 3051}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_55*/ {{0x13c, 3060}, 0x1, 90, 0, 0, 0}, + /*II_V_0F_56*/ {{0x13c, 3081}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_56*/ {{0x13c, 3088}, 0x1, 90, 0, 0, 0}, + /*II_V_0F_57*/ {{0x13c, 3109}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_57*/ {{0x13c, 3117}, 0x1, 90, 0, 0, 0}, + /*II_V_0F_58*/ {{0x13c, 3153}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_58*/ {{0x13c, 3161}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_58*/ {{0x135, 3169}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_58*/ {{0x135, 3177}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_59*/ {{0x13c, 3213}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_59*/ {{0x13c, 3221}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_59*/ {{0x135, 3229}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_59*/ {{0x135, 3237}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_5A*/ {{0x156, 3285}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5A*/ {{0x157, 3296}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5A*/ {{0x135, 3307}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_5A*/ {{0x135, 3318}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_5B*/ {{0x126, 3360}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5B*/ {{0x126, 3371}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5B*/ {{0x126, 3382}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_5C*/ {{0x13c, 3422}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_5C*/ {{0x13c, 3430}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_5C*/ {{0x135, 3438}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_5C*/ {{0x135, 3446}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_5D*/ {{0x13c, 3482}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_5D*/ {{0x13c, 3490}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_5D*/ {{0x135, 3498}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_5D*/ {{0x135, 3506}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_5E*/ {{0x13c, 3542}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_5E*/ {{0x13c, 3550}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_5E*/ {{0x135, 3558}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_5E*/ {{0x135, 3566}, 0x0, 72, 0, 0, 0}, + /*II_V_0F_5F*/ {{0x13c, 3602}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_5F*/ {{0x13c, 3610}, 0x1, 90, 0, 0, 0}, + /*II_V_F3_0F_5F*/ {{0x135, 3618}, 0x0, 71, 0, 0, 0}, + /*II_V_F2_0F_5F*/ {{0x135, 3626}, 0x0, 72, 0, 0, 0}, + /*II_V_66_0F_60*/ {{0x135, 3645}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_61*/ {{0x135, 3668}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_62*/ {{0x135, 3691}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_63*/ {{0x135, 3713}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_64*/ {{0x135, 3733}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_65*/ {{0x135, 3752}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_66*/ {{0x135, 3771}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_67*/ {{0x135, 3791}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_68*/ {{0x135, 3813}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_69*/ {{0x135, 3836}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_6A*/ {{0x135, 3859}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_6B*/ {{0x135, 3881}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_6C*/ {{0x135, 3904}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_6D*/ {{0x135, 3929}, 0x0, 73, 0, 0, 0}, + /*II_0F_6E*/ {{0x15a, 3942}, 0x0, 0, 0, 0, 3948}, + /*II_66_0F_6E*/ {{0x15b, 3942}, 0x0, 0, 0, 0, 3948}, + /*II_V_66_0F_6E*/ {{0x15c, 3954}, 0x46, 0, 0, 3961, 0}, + /*II_V_66_0F_6F*/ {{0x126, 3984}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_6F*/ {{0x126, 3993}, 0x41, 0, 0, 0, 0}, + /*II_0F_70*/ {{0x15e, 4002}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_70*/ {{0x15f, 4010}, 0x0, 1, 0, 0, 0}, + /*II_F3_0F_70*/ {{0x15f, 4018}, 0x0, 1, 0, 0, 0}, + /*II_F2_0F_70*/ {{0x15f, 4027}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_70*/ {{0x160, 4036}, 0x40, 1, 0, 0, 0}, + /*II_V_F3_0F_70*/ {{0x160, 4045}, 0x40, 1, 0, 0, 0}, + /*II_V_F2_0F_70*/ {{0x160, 4055}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_74*/ {{0x135, 4074}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_75*/ {{0x135, 4093}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_76*/ {{0x135, 4112}, 0x0, 73, 0, 0, 0}, + /*II_V_0F_77*/ {{0x162, 4128}, 0x49, 0, 0, 4140, 0}, + /*II_66_0F_78*/ {{0x164, 4158}, 0x0, 8, 0, 0, 0}, + /*II_F2_0F_78*/ {{0x165, 4165}, 0x0, 7, 8, 0, 0}, + /*II_V_66_0F_7C*/ {{0x13c, 4219}, 0x1, 90, 0, 0, 0}, + /*II_V_F2_0F_7C*/ {{0x13c, 4228}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_7D*/ {{0x13c, 4253}, 0x1, 90, 0, 0, 0}, + /*II_V_F2_0F_7D*/ {{0x13c, 4262}, 0x1, 90, 0, 0, 0}, + /*II_0F_7E*/ {{0x16c, 3942}, 0x0, 0, 0, 0, 3948}, + /*II_66_0F_7E*/ {{0x16d, 3942}, 0x0, 0, 0, 0, 3948}, + /*II_V_66_0F_7E*/ {{0x16e, 3954}, 0x46, 0, 0, 3961, 0}, + /*II_V_F3_0F_7E*/ {{0x150, 3961}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_7F*/ {{0x12e, 3984}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_7F*/ {{0x12e, 3993}, 0x41, 0, 0, 0, 0}, + /*II_0F_AE_04*/ {{0x170, 4271}, 0x0, 0, 0, 0, 4278}, + /*II_0F_AE_05*/ {{0x171, 4287}, 0x0, 0, 0, 4295, 4303}, + /*II_0F_AE_06*/ {{0x171, 4313}, 0x0, 0, 0, 4321, 4331}, + /*II_0F_AE_07*/ {{0x172, 4343}, 0x0, 0, 0, 4351, 0}, + /*II_0F_C2*/ {{0x179, 4392}, 0x0, 0, 0, 4401, 4410}, + /*II_66_0F_C2*/ {{0x17a, 4471}, 0x0, 0, 0, 4480, 4489}, + /*II_F3_0F_C2*/ {{0x17b, 4550}, 0x0, 0, 0, 4559, 4568}, + /*II_F2_0F_C2*/ {{0x17c, 4629}, 0x0, 0, 0, 4638, 4647}, + /*II_V_0F_C2*/ {{0x17d, 4708}, 0x1, 90, 0, 4718, 4728}, + /*II_V_66_0F_C2*/ {{0x17d, 5110}, 0x1, 90, 0, 5120, 5130}, + /*II_V_F3_0F_C2*/ {{0x17e, 5512}, 0x0, 71, 0, 5522, 5532}, + /*II_V_F2_0F_C2*/ {{0x17e, 5914}, 0x0, 72, 0, 5924, 5934}, + /*II_0F_C4*/ {{0x17f, 6316}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C4*/ {{0x180, 6316}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C4*/ {{0x181, 6324}, 0x0, 25, 1, 0, 0}, + /*II_0F_C5*/ {{0x182, 6333}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C5*/ {{0x183, 6333}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C5*/ {{0x184, 6341}, 0x40, 1, 0, 0, 0}, + /*II_0F_C6*/ {{0x185, 6350}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C6*/ {{0x15f, 6358}, 0x0, 1, 0, 0, 0}, + /*II_V_0F_C6*/ {{0x186, 6366}, 0x1, 90, 1, 0, 0}, + /*II_V_66_0F_C6*/ {{0x186, 6375}, 0x1, 90, 1, 0, 0}, + /*II_0F_C7_01*/ {{0x187, 6384}, 0x0, 0, 0, 0, 6395}, + /*II_V_66_0F_D0*/ {{0x13c, 6436}, 0x1, 90, 0, 0, 0}, + /*II_V_F2_0F_D0*/ {{0x13c, 6447}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_D1*/ {{0x135, 6465}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D2*/ {{0x135, 6480}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D3*/ {{0x135, 6495}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D4*/ {{0x135, 6510}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D5*/ {{0x135, 6526}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D6*/ {{0x18b, 3961}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D7*/ {{0x18e, 6563}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D8*/ {{0x135, 6583}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_D9*/ {{0x135, 6602}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DA*/ {{0x135, 6620}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DB*/ {{0x135, 6635}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DC*/ {{0x135, 6651}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DD*/ {{0x135, 6651}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DE*/ {{0x135, 6678}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_DF*/ {{0x135, 6694}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E0*/ {{0x135, 6709}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E1*/ {{0x135, 6724}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E2*/ {{0x135, 6739}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E3*/ {{0x135, 6754}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E4*/ {{0x135, 6771}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E5*/ {{0x135, 6789}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E6*/ {{0x157, 6829}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_E6*/ {{0x156, 6841}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_E6*/ {{0x157, 6852}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E7*/ {{0x147, 6880}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E8*/ {{0x135, 6898}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_E9*/ {{0x135, 6915}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_EA*/ {{0x135, 6932}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_EB*/ {{0x135, 6946}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_EC*/ {{0x135, 6960}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_ED*/ {{0x135, 6977}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_EE*/ {{0x135, 6994}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_EF*/ {{0x135, 7009}, 0x0, 73, 0, 0, 0}, + /*II_V_F2_0F_F0*/ {{0x192, 7023}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_F1*/ {{0x135, 7038}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F2*/ {{0x135, 7053}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F3*/ {{0x135, 7068}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F4*/ {{0x135, 7085}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F5*/ {{0x135, 7104}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F6*/ {{0x135, 7122}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F7*/ {{0x196, 7153}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_F8*/ {{0x135, 7173}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_F9*/ {{0x135, 7188}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_FA*/ {{0x135, 7203}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_FB*/ {{0x135, 7218}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_FC*/ {{0x135, 7233}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_FD*/ {{0x135, 7248}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_FE*/ {{0x135, 7263}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_00*/ {{0x135, 7371}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_01*/ {{0x135, 7388}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_02*/ {{0x135, 7405}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_03*/ {{0x135, 7423}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_04*/ {{0x135, 7444}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_05*/ {{0x135, 7464}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_06*/ {{0x135, 7481}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_07*/ {{0x135, 7499}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_08*/ {{0x135, 7517}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_09*/ {{0x135, 7534}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_0A*/ {{0x135, 7551}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_0B*/ {{0x135, 7570}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_0C*/ {{0x13c, 7581}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_38_0D*/ {{0x13c, 7592}, 0x1, 90, 0, 0, 0}, + /*II_V_66_0F_38_0E*/ {{0x126, 7603}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_0F*/ {{0x126, 7612}, 0x41, 0, 0, 0, 0}, + /*II_66_0F_38_10*/ {{0x19f, 7621}, 0x0, 74, 0, 0, 0}, + /*II_66_0F_38_14*/ {{0x19f, 7631}, 0x0, 74, 0, 0, 0}, + /*II_66_0F_38_15*/ {{0x19f, 7641}, 0x0, 74, 0, 0, 0}, + /*II_V_66_0F_38_17*/ {{0x126, 7658}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_18*/ {{0x1a1, 7666}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_19*/ {{0x1a2, 7680}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1A*/ {{0x1a3, 7694}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1C*/ {{0x1a4, 7717}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1D*/ {{0x1a4, 7732}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1E*/ {{0x1a4, 7747}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_20*/ {{0x150, 7765}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_21*/ {{0x14f, 7786}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_22*/ {{0x1a8, 7807}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_23*/ {{0x150, 7828}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_24*/ {{0x14f, 7849}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_25*/ {{0x150, 7870}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_28*/ {{0x135, 7889}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_29*/ {{0x135, 7907}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_2A*/ {{0x1ab, 7927}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_2B*/ {{0x135, 7948}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_2C*/ {{0x13c, 7959}, 0x1, 92, 0, 0, 0}, + /*II_V_66_0F_38_2D*/ {{0x13c, 7971}, 0x1, 92, 0, 0, 0}, + /*II_V_66_0F_38_2E*/ {{0x1ac, 7959}, 0x1, 83, 0, 0, 0}, + /*II_V_66_0F_38_2F*/ {{0x1ac, 7971}, 0x1, 83, 0, 0, 0}, + /*II_V_66_0F_38_30*/ {{0x150, 7993}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_31*/ {{0x14f, 8014}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_32*/ {{0x1a8, 8035}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_33*/ {{0x150, 8056}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_34*/ {{0x14f, 8077}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_35*/ {{0x150, 8098}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_37*/ {{0x135, 8118}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_38*/ {{0x135, 8136}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_39*/ {{0x135, 8153}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3A*/ {{0x135, 8170}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3B*/ {{0x135, 8187}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3C*/ {{0x135, 8204}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3D*/ {{0x135, 8221}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3E*/ {{0x135, 8238}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_3F*/ {{0x135, 8255}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_40*/ {{0x135, 8272}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_41*/ {{0x1a4, 8293}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_96*/ {{0x1ae, 8332}, 0x7, 90, 0, 8348, 0}, + /*II_V_66_0F_38_97*/ {{0x1ae, 8364}, 0x7, 90, 0, 8380, 0}, + /*II_V_66_0F_38_98*/ {{0x1ae, 8396}, 0x7, 90, 0, 8409, 0}, + /*II_V_66_0F_38_99*/ {{0x1af, 8422}, 0x6, 80, 0, 8435, 0}, + /*II_V_66_0F_38_9A*/ {{0x1ae, 8448}, 0x7, 90, 0, 8461, 0}, + /*II_V_66_0F_38_9B*/ {{0x1af, 8474}, 0x6, 80, 0, 8487, 0}, + /*II_V_66_0F_38_9C*/ {{0x1ae, 8500}, 0x7, 90, 0, 8514, 0}, + /*II_V_66_0F_38_9D*/ {{0x1af, 8528}, 0x6, 80, 0, 8542, 0}, + /*II_V_66_0F_38_9E*/ {{0x1ae, 8556}, 0x7, 90, 0, 8570, 0}, + /*II_V_66_0F_38_9F*/ {{0x1af, 8584}, 0x6, 80, 0, 8598, 0}, + /*II_V_66_0F_38_A6*/ {{0x1ae, 8612}, 0x7, 90, 0, 8628, 0}, + /*II_V_66_0F_38_A7*/ {{0x1ae, 8644}, 0x7, 90, 0, 8660, 0}, + /*II_V_66_0F_38_A8*/ {{0x1ae, 8676}, 0x7, 90, 0, 8689, 0}, + /*II_V_66_0F_38_A9*/ {{0x1af, 8702}, 0x6, 80, 0, 8715, 0}, + /*II_V_66_0F_38_AA*/ {{0x1ae, 8728}, 0x7, 90, 0, 8741, 0}, + /*II_V_66_0F_38_AB*/ {{0x1af, 8754}, 0x6, 80, 0, 8767, 0}, + /*II_V_66_0F_38_AC*/ {{0x1ae, 8780}, 0x7, 90, 0, 8794, 0}, + /*II_V_66_0F_38_AD*/ {{0x1af, 8808}, 0x6, 80, 0, 8822, 0}, + /*II_V_66_0F_38_AE*/ {{0x1ae, 8836}, 0x7, 90, 0, 8850, 0}, + /*II_V_66_0F_38_AF*/ {{0x1af, 8864}, 0x6, 80, 0, 8878, 0}, + /*II_V_66_0F_38_B6*/ {{0x1ae, 8892}, 0x7, 90, 0, 8908, 0}, + /*II_V_66_0F_38_B7*/ {{0x1ae, 8924}, 0x7, 90, 0, 8940, 0}, + /*II_V_66_0F_38_B8*/ {{0x1ae, 8956}, 0x7, 90, 0, 8969, 0}, + /*II_V_66_0F_38_B9*/ {{0x1af, 8982}, 0x6, 80, 0, 8995, 0}, + /*II_V_66_0F_38_BA*/ {{0x1ae, 9008}, 0x7, 90, 0, 9021, 0}, + /*II_V_66_0F_38_BB*/ {{0x1af, 9034}, 0x6, 80, 0, 9047, 0}, + /*II_V_66_0F_38_BC*/ {{0x1ae, 9060}, 0x7, 90, 0, 9074, 0}, + /*II_V_66_0F_38_BD*/ {{0x1af, 9088}, 0x6, 80, 0, 9102, 0}, + /*II_V_66_0F_38_BE*/ {{0x1ae, 9116}, 0x7, 90, 0, 9130, 0}, + /*II_V_66_0F_38_BF*/ {{0x1af, 9144}, 0x6, 80, 0, 9158, 0}, + /*II_V_66_0F_38_DB*/ {{0x1b1, 9180}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_DC*/ {{0x1b2, 9197}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_DD*/ {{0x1b2, 9218}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_DE*/ {{0x1b2, 9239}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_38_DF*/ {{0x1b2, 9260}, 0x0, 73, 0, 0, 0}, + /*II_V_66_0F_3A_04*/ {{0x1b7, 7581}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_05*/ {{0x1b7, 7592}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_06*/ {{0x1b8, 9287}, 0x10, 86, 1, 0, 0}, + /*II_66_0F_3A_08*/ {{0x19f, 9299}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_08*/ {{0x1b7, 9308}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_09*/ {{0x19f, 9318}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_09*/ {{0x1b7, 9327}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_0A*/ {{0x1b9, 9337}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0A*/ {{0x181, 9346}, 0x0, 71, 1, 0, 0}, + /*II_66_0F_3A_0B*/ {{0x1ba, 9356}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0B*/ {{0x181, 9365}, 0x0, 72, 1, 0, 0}, + /*II_66_0F_3A_0C*/ {{0x19f, 9375}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0C*/ {{0x186, 9384}, 0x1, 90, 1, 0, 0}, + /*II_66_0F_3A_0D*/ {{0x19f, 9394}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0D*/ {{0x186, 9403}, 0x1, 90, 1, 0, 0}, + /*II_66_0F_3A_0E*/ {{0x19f, 9413}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0E*/ {{0x181, 9422}, 0x0, 73, 1, 0, 0}, + /*II_0F_3A_0F*/ {{0x1bb, 9432}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_3A_0F*/ {{0x1bc, 9432}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0F*/ {{0x181, 9441}, 0x0, 73, 1, 0, 0}, + /*II_66_0F_3A_14*/ {{0x1bd, 9451}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_14*/ {{0x1be, 9459}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_15*/ {{0x1bf, 6333}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_15*/ {{0x1c0, 6341}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_16*/ {{0x1c1, 9468}, 0x0, 1, 0, 0, 9476}, + /*II_V_66_0F_3A_16*/ {{0x1c2, 9484}, 0x46, 1, 0, 9493, 0}, + /*II_66_0F_3A_17*/ {{0x1c3, 9502}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_17*/ {{0x1c4, 9513}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_3A_18*/ {{0x1b8, 9525}, 0x10, 73, 1, 0, 0}, + /*II_V_66_0F_3A_19*/ {{0x1c5, 9538}, 0x50, 1, 0, 0, 0}, + /*II_66_0F_3A_20*/ {{0x1c6, 9552}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_20*/ {{0x181, 9560}, 0x0, 76, 1, 0, 0}, + /*II_66_0F_3A_21*/ {{0x1b9, 9569}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_21*/ {{0x181, 9579}, 0x0, 71, 1, 0, 0}, + /*II_66_0F_3A_22*/ {{0x1c7, 9590}, 0x0, 1, 0, 0, 9598}, + /*II_V_66_0F_3A_22*/ {{0x181, 9606}, 0x6, 79, 1, 9615, 0}, + /*II_66_0F_3A_40*/ {{0x19f, 9624}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_40*/ {{0x186, 9630}, 0x1, 90, 1, 0, 0}, + /*II_66_0F_3A_41*/ {{0x19f, 9637}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_41*/ {{0x181, 9643}, 0x0, 73, 1, 0, 0}, + /*II_66_0F_3A_42*/ {{0x19f, 9650}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_42*/ {{0x181, 9659}, 0x0, 73, 1, 0, 0}, + /*II_66_0F_3A_44*/ {{0x1c8, 9669}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_44*/ {{0x1c9, 9680}, 0x0, 73, 1, 0, 0}, + /*II_V_66_0F_3A_4A*/ {{0x186, 9692}, 0x1, 90, 84, 0, 0}, + /*II_V_66_0F_3A_4B*/ {{0x186, 9703}, 0x1, 90, 84, 0, 0}, + /*II_V_66_0F_3A_4C*/ {{0x181, 9714}, 0x0, 73, 82, 0, 0}, + /*II_66_0F_3A_60*/ {{0x1ca, 9725}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_60*/ {{0x160, 9736}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_61*/ {{0x1ca, 9748}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_61*/ {{0x160, 9759}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_62*/ {{0x1ca, 9771}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_62*/ {{0x160, 9782}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_63*/ {{0x1ca, 9794}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_63*/ {{0x160, 9805}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_DF*/ {{0x1cb, 9817}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_DF*/ {{0x1cc, 9834}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_71_02*/ {{0x1cf, 6465}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_04*/ {{0x1cf, 6724}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_06*/ {{0x1cf, 7038}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_02*/ {{0x1cf, 6480}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_04*/ {{0x1cf, 6739}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_06*/ {{0x1cf, 7053}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_02*/ {{0x1cf, 6495}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_03*/ {{0x1cf, 9860}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_06*/ {{0x1cf, 7068}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_07*/ {{0x1cf, 9877}, 0x0, 1, 0, 0, 0}, + /*II_0F_AE_00*/ {{0x170, 9886}, 0x0, 0, 0, 0, 9894}, + /*II_0F_AE_01*/ {{0x170, 9914}, 0x0, 0, 0, 0, 9923}, + /*II_V_0F_AE_02*/ {{0x1d2, 9963}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_AE_03*/ {{0x1d2, 9992}, 0x40, 0, 0, 0, 0} }; _InstNode InstructionsTree[5688] = { - /* 0 - _00 */ 0x2000, - /* 1 - _01 */ 0x2001, - /* 2 - _02 */ 0x2002, - /* 3 - _03 */ 0x2003, - /* 4 - _04 */ 0x2004, - /* 5 - _05 */ 0x2005, - /* 6 - _06 */ 0x2006, - /* 7 - _07 */ 0x2007, - /* 8 - _08 */ 0x2008, - /* 9 - _09 */ 0x2009, - /* a - _0A */ 0x200a, - /* b - _0B */ 0x200b, - /* c - _0C */ 0x200c, - /* d - _0D */ 0x200d, - /* e - _0E */ 0x200e, - /* f - _0F */ 0x8100, - /* 10 - _10 */ 0x200f, - /* 11 - _11 */ 0x2010, - /* 12 - _12 */ 0x2011, - /* 13 - _13 */ 0x2012, - /* 14 - _14 */ 0x2013, - /* 15 - _15 */ 0x2014, - /* 16 - _16 */ 0x2015, - /* 17 - _17 */ 0x2016, - /* 18 - _18 */ 0x2017, - /* 19 - _19 */ 0x2018, - /* 1a - _1A */ 0x2019, - /* 1b - _1B */ 0x201a, - /* 1c - _1C */ 0x201b, - /* 1d - _1D */ 0x201c, - /* 1e - _1E */ 0x201d, - /* 1f - _1F */ 0x201e, - /* 20 - _20 */ 0x201f, - /* 21 - _21 */ 0x2020, - /* 22 - _22 */ 0x2021, - /* 23 - _23 */ 0x2022, - /* 24 - _24 */ 0x2023, - /* 25 - _25 */ 0x2024, - /* 26 - */ 0, - /* 27 - _27 */ 0x2025, - /* 28 - _28 */ 0x2026, - /* 29 - _29 */ 0x2027, - /* 2a - _2A */ 0x2028, - /* 2b - _2B */ 0x2029, - /* 2c - _2C */ 0x202a, - /* 2d - _2D */ 0x202b, - /* 2e - */ 0, - /* 2f - _2F */ 0x202c, - /* 30 - _30 */ 0x202d, - /* 31 - _31 */ 0x202e, - /* 32 - _32 */ 0x202f, - /* 33 - _33 */ 0x2030, - /* 34 - _34 */ 0x2031, - /* 35 - _35 */ 0x2032, - /* 36 - */ 0, - /* 37 - _37 */ 0x2033, - /* 38 - _38 */ 0x2034, - /* 39 - _39 */ 0x2035, - /* 3a - _3A */ 0x2036, - /* 3b - _3B */ 0x2037, - /* 3c - _3C */ 0x2038, - /* 3d - _3D */ 0x2039, - /* 3e - */ 0, - /* 3f - _3F */ 0x203a, - /* 40 - _40 */ 0x203b, - /* 41 - _40 */ 0x203c, - /* 42 - _40 */ 0x203d, - /* 43 - _40 */ 0x203e, - /* 44 - _40 */ 0x203f, - /* 45 - _40 */ 0x2040, - /* 46 - _40 */ 0x2041, - /* 47 - _40 */ 0x2042, - /* 48 - _48 */ 0x2043, - /* 49 - _48 */ 0x2044, - /* 4a - _48 */ 0x2045, - /* 4b - _48 */ 0x2046, - /* 4c - _48 */ 0x2047, - /* 4d - _48 */ 0x2048, - /* 4e - _48 */ 0x2049, - /* 4f - _48 */ 0x204a, - /* 50 - _50 */ 0x204b, - /* 51 - _50 */ 0x204c, - /* 52 - _50 */ 0x204d, - /* 53 - _50 */ 0x204e, - /* 54 - _50 */ 0x204f, - /* 55 - _50 */ 0x2050, - /* 56 - _50 */ 0x2051, - /* 57 - _50 */ 0x2052, - /* 58 - _58 */ 0x2053, - /* 59 - _58 */ 0x2054, - /* 5a - _58 */ 0x2055, - /* 5b - _58 */ 0x2056, - /* 5c - _58 */ 0x2057, - /* 5d - _58 */ 0x2058, - /* 5e - _58 */ 0x2059, - /* 5f - _58 */ 0x205a, - /* 60 - _60 */ 0x205b, - /* 61 - _61 */ 0x205c, - /* 62 - _62 */ 0x205d, - /* 63 - _63 */ 0x205e, - /* 64 - */ 0, - /* 65 - */ 0, - /* 66 - */ 0, - /* 67 - */ 0, - /* 68 - _68 */ 0x205f, - /* 69 - _69 */ 0x4000, - /* 6a - _6A */ 0x2060, - /* 6b - _6B */ 0x4001, - /* 6c - _6C */ 0x2061, - /* 6d - _6D */ 0x2062, - /* 6e - _6E */ 0x2063, - /* 6f - _6F */ 0x2064, - /* 70 - _70 */ 0x2065, - /* 71 - _71 */ 0x2066, - /* 72 - _72 */ 0x2067, - /* 73 - _73 */ 0x2068, - /* 74 - _74 */ 0x2069, - /* 75 - _75 */ 0x206a, - /* 76 - _76 */ 0x206b, - /* 77 - _77 */ 0x206c, - /* 78 - _78 */ 0x206d, - /* 79 - _79 */ 0x206e, - /* 7a - _7A */ 0x206f, - /* 7b - _7B */ 0x2070, - /* 7c - _7C */ 0x2071, - /* 7d - _7D */ 0x2072, - /* 7e - _7E */ 0x2073, - /* 7f - _7F */ 0x2074, - /* 80 - _80 */ 0x6200, - /* 81 - _81 */ 0x6208, - /* 82 - _82 */ 0x6210, - /* 83 - _83 */ 0x6218, - /* 84 - _84 */ 0x2075, - /* 85 - _85 */ 0x2076, - /* 86 - _86 */ 0x2077, - /* 87 - _87 */ 0x2078, - /* 88 - _88 */ 0x2079, - /* 89 - _89 */ 0x207a, - /* 8a - _8A */ 0x207b, - /* 8b - _8B */ 0x207c, - /* 8c - _8C */ 0x207d, - /* 8d - _8D */ 0x207e, - /* 8e - _8E */ 0x207f, - /* 8f - _8F */ 0x6220, - /* 90 - _90 */ 0x2080, - /* 91 - _91 */ 0x2081, - /* 92 - _92 */ 0x2082, - /* 93 - _93 */ 0x2083, - /* 94 - _94 */ 0x2084, - /* 95 - _95 */ 0x2085, - /* 96 - _96 */ 0x2086, - /* 97 - _97 */ 0x2087, - /* 98 - _98 */ 0x4002, - /* 99 - _99 */ 0x4003, - /* 9a - _9A */ 0x2088, - /* 9b - */ 0, - /* 9c - _9C */ 0x2089, - /* 9d - _9D */ 0x208a, - /* 9e - _9E */ 0x208b, - /* 9f - _9F */ 0x208c, - /* a0 - _A0 */ 0x208d, - /* a1 - _A1 */ 0x208e, - /* a2 - _A2 */ 0x208f, - /* a3 - _A3 */ 0x2090, - /* a4 - _A4 */ 0x2091, - /* a5 - _A5 */ 0x2092, - /* a6 - _A6 */ 0x2093, - /* a7 - _A7 */ 0x2094, - /* a8 - _A8 */ 0x2095, - /* a9 - _A9 */ 0x2096, - /* aa - _AA */ 0x2097, - /* ab - _AB */ 0x2098, - /* ac - _AC */ 0x2099, - /* ad - _AD */ 0x209a, - /* ae - _AE */ 0x209b, - /* af - _AF */ 0x209c, - /* b0 - _B0 */ 0x209d, - /* b1 - _B0 */ 0x209e, - /* b2 - _B0 */ 0x209f, - /* b3 - _B0 */ 0x20a0, - /* b4 - _B0 */ 0x20a1, - /* b5 - _B0 */ 0x20a2, - /* b6 - _B0 */ 0x20a3, - /* b7 - _B0 */ 0x20a4, - /* b8 - _B8 */ 0x20a5, - /* b9 - _B8 */ 0x20a6, - /* ba - _B8 */ 0x20a7, - /* bb - _B8 */ 0x20a8, - /* bc - _B8 */ 0x20a9, - /* bd - _B8 */ 0x20aa, - /* be - _B8 */ 0x20ab, - /* bf - _B8 */ 0x20ac, - /* c0 - _C0 */ 0x6228, - /* c1 - _C1 */ 0x6230, - /* c2 - _C2 */ 0x20ad, - /* c3 - _C3 */ 0x20ae, - /* c4 - _C4 */ 0x20af, - /* c5 - _C5 */ 0x20b0, - /* c6 - _C6 */ 0xa238, - /* c7 - _C7 */ 0xa280, - /* c8 - _C8 */ 0x20b1, - /* c9 - _C9 */ 0x20b2, - /* ca - _CA */ 0x20b3, - /* cb - _CB */ 0x20b4, - /* cc - _CC */ 0x20b5, - /* cd - _CD */ 0x20b6, - /* ce - _CE */ 0x20b7, - /* cf - _CF */ 0x20b8, - /* d0 - _D0 */ 0x62c8, - /* d1 - _D1 */ 0x62d0, - /* d2 - _D2 */ 0x62d8, - /* d3 - _D3 */ 0x62e0, - /* d4 - _D4 */ 0x20b9, - /* d5 - _D5 */ 0x20ba, - /* d6 - _D6 */ 0x20bb, - /* d7 - _D7 */ 0x20bc, - /* d8 - _D8 */ 0xa2e8, - /* d9 - _D9 */ 0xa330, - /* da - _DA */ 0xa378, - /* db - _DB */ 0xa3c0, - /* dc - _DC */ 0xa408, - /* dd - _DD */ 0xa450, - /* de - _DE */ 0xa498, - /* df - _DF */ 0xa4e0, - /* e0 - _E0 */ 0x20bd, - /* e1 - _E1 */ 0x20be, - /* e2 - _E2 */ 0x20bf, - /* e3 - _E3 */ 0x4004, - /* e4 - _E4 */ 0x20c0, - /* e5 - _E5 */ 0x20c1, - /* e6 - _E6 */ 0x20c2, - /* e7 - _E7 */ 0x20c3, - /* e8 - _E8 */ 0x20c4, - /* e9 - _E9 */ 0x20c5, - /* ea - _EA */ 0x20c6, - /* eb - _EB */ 0x20c7, - /* ec - _EC */ 0x20c8, - /* ed - _ED */ 0x20c9, - /* ee - _EE */ 0x20ca, - /* ef - _EF */ 0x20cb, - /* f0 - */ 0, - /* f1 - _F1 */ 0x20cc, - /* f2 - */ 0, - /* f3 - */ 0, - /* f4 - _F4 */ 0x20cd, - /* f5 - _F5 */ 0x20ce, - /* f6 - _F6 */ 0x6528, - /* f7 - _F7 */ 0x6530, - /* f8 - _F8 */ 0x20cf, - /* f9 - _F9 */ 0x20d0, - /* fa - _FA */ 0x20d1, - /* fb - _FB */ 0x20d2, - /* fc - _FC */ 0x20d3, - /* fd - _FD */ 0x20d4, - /* fe - _FE */ 0x6538, - /* ff - _FF */ 0x6540, - /* 100 - _0F_00 */ 0x6548, - /* 101 - _0F_01 */ 0xa550, - /* 102 - _0F_02 */ 0x20d5, - /* 103 - _0F_03 */ 0x20d6, - /* 104 - */ 0, - /* 105 - _0F_05 */ 0x20d7, - /* 106 - _0F_06 */ 0x20d8, - /* 107 - _0F_07 */ 0x20d9, - /* 108 - _0F_08 */ 0x20da, - /* 109 - _0F_09 */ 0x20db, - /* 10a - */ 0, - /* 10b - _0F_0B */ 0x20dc, - /* 10c - */ 0, - /* 10d - _0F_0D */ 0x6598, - /* 10e - _0F_0E */ 0x20dd, - /* 10f - _0F_0F */ 0x85a0, - /* 110 - _0F_10 */ 0xc6a0, - /* 111 - _0F_11 */ 0xc6ac, - /* 112 - _0F_12 */ 0xc6b8, - /* 113 - _0F_13 */ 0xc6c4, - /* 114 - _0F_14 */ 0xc6d0, - /* 115 - _0F_15 */ 0xc6dc, - /* 116 - _0F_16 */ 0xc6e8, - /* 117 - _0F_17 */ 0xc6f4, - /* 118 - _0F_18 */ 0x6700, - /* 119 - */ 0, - /* 11a - */ 0, - /* 11b - */ 0, - /* 11c - */ 0, - /* 11d - */ 0, - /* 11e - */ 0, - /* 11f - _0F_1F */ 0x20de, - /* 120 - _0F_20 */ 0x20df, - /* 121 - _0F_21 */ 0x20e0, - /* 122 - _0F_22 */ 0x20e1, - /* 123 - _0F_23 */ 0x20e2, - /* 124 - */ 0, - /* 125 - */ 0, - /* 126 - */ 0, - /* 127 - */ 0, - /* 128 - _0F_28 */ 0xc708, - /* 129 - _0F_29 */ 0xc714, - /* 12a - _0F_2A */ 0xc720, - /* 12b - _0F_2B */ 0xc72c, - /* 12c - _0F_2C */ 0xc738, - /* 12d - _0F_2D */ 0xc744, - /* 12e - _0F_2E */ 0xc750, - /* 12f - _0F_2F */ 0xc75c, - /* 130 - _0F_30 */ 0x20e3, - /* 131 - _0F_31 */ 0x20e4, - /* 132 - _0F_32 */ 0x20e5, - /* 133 - _0F_33 */ 0x20e6, - /* 134 - _0F_34 */ 0x20e7, - /* 135 - _0F_35 */ 0x20e8, - /* 136 - */ 0, - /* 137 - _0F_37 */ 0x20e9, - /* 138 - _0F_38 */ 0x8768, - /* 139 - */ 0, - /* 13a - _0F_3A */ 0x8868, - /* 13b - */ 0, - /* 13c - */ 0, - /* 13d - */ 0, - /* 13e - */ 0, - /* 13f - */ 0, - /* 140 - _0F_40 */ 0x20ea, - /* 141 - _0F_41 */ 0x20eb, - /* 142 - _0F_42 */ 0x20ec, - /* 143 - _0F_43 */ 0x20ed, - /* 144 - _0F_44 */ 0x20ee, - /* 145 - _0F_45 */ 0x20ef, - /* 146 - _0F_46 */ 0x20f0, - /* 147 - _0F_47 */ 0x20f1, - /* 148 - _0F_48 */ 0x20f2, - /* 149 - _0F_49 */ 0x20f3, - /* 14a - _0F_4A */ 0x20f4, - /* 14b - _0F_4B */ 0x20f5, - /* 14c - _0F_4C */ 0x20f6, - /* 14d - _0F_4D */ 0x20f7, - /* 14e - _0F_4E */ 0x20f8, - /* 14f - _0F_4F */ 0x20f9, - /* 150 - _0F_50 */ 0xc968, - /* 151 - _0F_51 */ 0xc974, - /* 152 - _0F_52 */ 0xc980, - /* 153 - _0F_53 */ 0xc98c, - /* 154 - _0F_54 */ 0xc998, - /* 155 - _0F_55 */ 0xc9a4, - /* 156 - _0F_56 */ 0xc9b0, - /* 157 - _0F_57 */ 0xc9bc, - /* 158 - _0F_58 */ 0xc9c8, - /* 159 - _0F_59 */ 0xc9d4, - /* 15a - _0F_5A */ 0xc9e0, - /* 15b - _0F_5B */ 0xc9ec, - /* 15c - _0F_5C */ 0xc9f8, - /* 15d - _0F_5D */ 0xca04, - /* 15e - _0F_5E */ 0xca10, - /* 15f - _0F_5F */ 0xca1c, - /* 160 - _0F_60 */ 0xca28, - /* 161 - _0F_61 */ 0xca34, - /* 162 - _0F_62 */ 0xca40, - /* 163 - _0F_63 */ 0xca4c, - /* 164 - _0F_64 */ 0xca58, - /* 165 - _0F_65 */ 0xca64, - /* 166 - _0F_66 */ 0xca70, - /* 167 - _0F_67 */ 0xca7c, - /* 168 - _0F_68 */ 0xca88, - /* 169 - _0F_69 */ 0xca94, - /* 16a - _0F_6A */ 0xcaa0, - /* 16b - _0F_6B */ 0xcaac, - /* 16c - _0F_6C */ 0xcab8, - /* 16d - _0F_6D */ 0xcac4, - /* 16e - _0F_6E */ 0xcad0, - /* 16f - _0F_6F */ 0xcadc, - /* 170 - _0F_70 */ 0xcae8, - /* 171 - _0F_71 */ 0x6af4, - /* 172 - _0F_72 */ 0x6afc, - /* 173 - _0F_73 */ 0x6b04, - /* 174 - _0F_74 */ 0xcb0c, - /* 175 - _0F_75 */ 0xcb18, - /* 176 - _0F_76 */ 0xcb24, - /* 177 - _0F_77 */ 0xcb30, - /* 178 - _0F_78 */ 0xcb3c, - /* 179 - _0F_79 */ 0xcb48, - /* 17a - _0F_7A */ 0x8b54, - /* 17b - */ 0, - /* 17c - _0F_7C */ 0xcc54, - /* 17d - _0F_7D */ 0xcc60, - /* 17e - _0F_7E */ 0xcc6c, - /* 17f - _0F_7F */ 0xcc78, - /* 180 - _0F_80 */ 0x20fa, - /* 181 - _0F_81 */ 0x20fb, - /* 182 - _0F_82 */ 0x20fc, - /* 183 - _0F_83 */ 0x20fd, - /* 184 - _0F_84 */ 0x20fe, - /* 185 - _0F_85 */ 0x20ff, - /* 186 - _0F_86 */ 0x2100, - /* 187 - _0F_87 */ 0x2101, - /* 188 - _0F_88 */ 0x2102, - /* 189 - _0F_89 */ 0x2103, - /* 18a - _0F_8A */ 0x2104, - /* 18b - _0F_8B */ 0x2105, - /* 18c - _0F_8C */ 0x2106, - /* 18d - _0F_8D */ 0x2107, - /* 18e - _0F_8E */ 0x2108, - /* 18f - _0F_8F */ 0x2109, - /* 190 - _0F_90 */ 0x210a, - /* 191 - _0F_91 */ 0x210b, - /* 192 - _0F_92 */ 0x210c, - /* 193 - _0F_93 */ 0x210d, - /* 194 - _0F_94 */ 0x210e, - /* 195 - _0F_95 */ 0x210f, - /* 196 - _0F_96 */ 0x2110, - /* 197 - _0F_97 */ 0x2111, - /* 198 - _0F_98 */ 0x2112, - /* 199 - _0F_99 */ 0x2113, - /* 19a - _0F_9A */ 0x2114, - /* 19b - _0F_9B */ 0x2115, - /* 19c - _0F_9C */ 0x2116, - /* 19d - _0F_9D */ 0x2117, - /* 19e - _0F_9E */ 0x2118, - /* 19f - _0F_9F */ 0x2119, - /* 1a0 - _0F_A0 */ 0x211a, - /* 1a1 - _0F_A1 */ 0x211b, - /* 1a2 - _0F_A2 */ 0x211c, - /* 1a3 - _0F_A3 */ 0x211d, - /* 1a4 - _0F_A4 */ 0x4005, - /* 1a5 - _0F_A5 */ 0x4006, - /* 1a6 - */ 0, - /* 1a7 - */ 0, - /* 1a8 - _0F_A8 */ 0x211e, - /* 1a9 - _0F_A9 */ 0x211f, - /* 1aa - _0F_AA */ 0x2120, - /* 1ab - _0F_AB */ 0x2121, - /* 1ac - _0F_AC */ 0x4007, - /* 1ad - _0F_AD */ 0x4008, - /* 1ae - _0F_AE */ 0x6c84, - /* 1af - _0F_AF */ 0x2122, - /* 1b0 - _0F_B0 */ 0x2123, - /* 1b1 - _0F_B1 */ 0x2124, - /* 1b2 - _0F_B2 */ 0x2125, - /* 1b3 - _0F_B3 */ 0x2126, - /* 1b4 - _0F_B4 */ 0x2127, - /* 1b5 - _0F_B5 */ 0x2128, - /* 1b6 - _0F_B6 */ 0x2129, - /* 1b7 - _0F_B7 */ 0x212a, - /* 1b8 - _0F_B8 */ 0xcc8c, - /* 1b9 - _0F_B9 */ 0x212b, - /* 1ba - _0F_BA */ 0x6c98, - /* 1bb - _0F_BB */ 0x212c, - /* 1bc - _0F_BC */ 0xcca0, - /* 1bd - _0F_BD */ 0xccac, - /* 1be - _0F_BE */ 0x212d, - /* 1bf - _0F_BF */ 0x212e, - /* 1c0 - _0F_C0 */ 0x212f, - /* 1c1 - _0F_C1 */ 0x2130, - /* 1c2 - _0F_C2 */ 0xccb8, - /* 1c3 - _0F_C3 */ 0x2131, - /* 1c4 - _0F_C4 */ 0xccc4, - /* 1c5 - _0F_C5 */ 0xccd0, - /* 1c6 - _0F_C6 */ 0xccdc, - /* 1c7 - _0F_C7 */ 0x6ce8, - /* 1c8 - _0F_C8 */ 0x2132, - /* 1c9 - _0F_C8 */ 0x2133, - /* 1ca - _0F_C8 */ 0x2134, - /* 1cb - _0F_C8 */ 0x2135, - /* 1cc - _0F_C8 */ 0x2136, - /* 1cd - _0F_C8 */ 0x2137, - /* 1ce - _0F_C8 */ 0x2138, - /* 1cf - _0F_C8 */ 0x2139, - /* 1d0 - _0F_D0 */ 0xccf0, - /* 1d1 - _0F_D1 */ 0xccfc, - /* 1d2 - _0F_D2 */ 0xcd08, - /* 1d3 - _0F_D3 */ 0xcd14, - /* 1d4 - _0F_D4 */ 0xcd20, - /* 1d5 - _0F_D5 */ 0xcd2c, - /* 1d6 - _0F_D6 */ 0xcd38, - /* 1d7 - _0F_D7 */ 0xcd44, - /* 1d8 - _0F_D8 */ 0xcd50, - /* 1d9 - _0F_D9 */ 0xcd5c, - /* 1da - _0F_DA */ 0xcd68, - /* 1db - _0F_DB */ 0xcd74, - /* 1dc - _0F_DC */ 0xcd80, - /* 1dd - _0F_DD */ 0xcd8c, - /* 1de - _0F_DE */ 0xcd98, - /* 1df - _0F_DF */ 0xcda4, - /* 1e0 - _0F_E0 */ 0xcdb0, - /* 1e1 - _0F_E1 */ 0xcdbc, - /* 1e2 - _0F_E2 */ 0xcdc8, - /* 1e3 - _0F_E3 */ 0xcdd4, - /* 1e4 - _0F_E4 */ 0xcde0, - /* 1e5 - _0F_E5 */ 0xcdec, - /* 1e6 - _0F_E6 */ 0xcdf8, - /* 1e7 - _0F_E7 */ 0xce04, - /* 1e8 - _0F_E8 */ 0xce10, - /* 1e9 - _0F_E9 */ 0xce1c, - /* 1ea - _0F_EA */ 0xce28, - /* 1eb - _0F_EB */ 0xce34, - /* 1ec - _0F_EC */ 0xce40, - /* 1ed - _0F_ED */ 0xce4c, - /* 1ee - _0F_EE */ 0xce58, - /* 1ef - _0F_EF */ 0xce64, - /* 1f0 - _0F_F0 */ 0xce70, - /* 1f1 - _0F_F1 */ 0xce7c, - /* 1f2 - _0F_F2 */ 0xce88, - /* 1f3 - _0F_F3 */ 0xce94, - /* 1f4 - _0F_F4 */ 0xcea0, - /* 1f5 - _0F_F5 */ 0xceac, - /* 1f6 - _0F_F6 */ 0xceb8, - /* 1f7 - _0F_F7 */ 0xcec4, - /* 1f8 - _0F_F8 */ 0xced0, - /* 1f9 - _0F_F9 */ 0xcedc, - /* 1fa - _0F_FA */ 0xcee8, - /* 1fb - _0F_FB */ 0xcef4, - /* 1fc - _0F_FC */ 0xcf00, - /* 1fd - _0F_FD */ 0xcf0c, - /* 1fe - _0F_FE */ 0xcf18, - /* 1ff - */ 0, - /* 200 - _80_00 */ 0x213a, - /* 201 - _80_01 */ 0x213b, - /* 202 - _80_02 */ 0x213c, - /* 203 - _80_03 */ 0x213d, - /* 204 - _80_04 */ 0x213e, - /* 205 - _80_05 */ 0x213f, - /* 206 - _80_06 */ 0x2140, - /* 207 - _80_07 */ 0x2141, - /* 208 - _81_00 */ 0x2142, - /* 209 - _81_01 */ 0x2143, - /* 20a - _81_02 */ 0x2144, - /* 20b - _81_03 */ 0x2145, - /* 20c - _81_04 */ 0x2146, - /* 20d - _81_05 */ 0x2147, - /* 20e - _81_06 */ 0x2148, - /* 20f - _81_07 */ 0x2149, - /* 210 - _82_00 */ 0x214a, - /* 211 - _82_01 */ 0x214b, - /* 212 - _82_02 */ 0x214c, - /* 213 - _82_03 */ 0x214d, - /* 214 - _82_04 */ 0x214e, - /* 215 - _82_05 */ 0x214f, - /* 216 - _82_06 */ 0x2150, - /* 217 - _82_07 */ 0x2151, - /* 218 - _83_00 */ 0x2152, - /* 219 - _83_01 */ 0x2153, - /* 21a - _83_02 */ 0x2154, - /* 21b - _83_03 */ 0x2155, - /* 21c - _83_04 */ 0x2156, - /* 21d - _83_05 */ 0x2157, - /* 21e - _83_06 */ 0x2158, - /* 21f - _83_07 */ 0x2159, - /* 220 - _8F_00 */ 0x215a, - /* 221 - */ 0, - /* 222 - */ 0, - /* 223 - */ 0, - /* 224 - */ 0, - /* 225 - */ 0, - /* 226 - */ 0, - /* 227 - */ 0, - /* 228 - _C0_00 */ 0x215b, - /* 229 - _C0_01 */ 0x215c, - /* 22a - _C0_02 */ 0x215d, - /* 22b - _C0_03 */ 0x215e, - /* 22c - _C0_04 */ 0x215f, - /* 22d - _C0_05 */ 0x2160, - /* 22e - _C0_06 */ 0x2161, - /* 22f - _C0_07 */ 0x2162, - /* 230 - _C1_00 */ 0x2163, - /* 231 - _C1_01 */ 0x2164, - /* 232 - _C1_02 */ 0x2165, - /* 233 - _C1_03 */ 0x2166, - /* 234 - _C1_04 */ 0x2167, - /* 235 - _C1_05 */ 0x2168, - /* 236 - _C1_06 */ 0x2169, - /* 237 - _C1_07 */ 0x216a, - /* 238 - _C6_00 */ 0x216b, - /* 239 - */ 0, - /* 23a - */ 0, - /* 23b - */ 0, - /* 23c - */ 0, - /* 23d - */ 0, - /* 23e - */ 0, - /* 23f - */ 0, - /* 240 - */ 0, - /* 241 - */ 0, - /* 242 - */ 0, - /* 243 - */ 0, - /* 244 - */ 0, - /* 245 - */ 0, - /* 246 - */ 0, - /* 247 - */ 0, - /* 248 - */ 0, - /* 249 - */ 0, - /* 24a - */ 0, - /* 24b - */ 0, - /* 24c - */ 0, - /* 24d - */ 0, - /* 24e - */ 0, - /* 24f - */ 0, - /* 250 - */ 0, - /* 251 - */ 0, - /* 252 - */ 0, - /* 253 - */ 0, - /* 254 - */ 0, - /* 255 - */ 0, - /* 256 - */ 0, - /* 257 - */ 0, - /* 258 - */ 0, - /* 259 - */ 0, - /* 25a - */ 0, - /* 25b - */ 0, - /* 25c - */ 0, - /* 25d - */ 0, - /* 25e - */ 0, - /* 25f - */ 0, - /* 260 - */ 0, - /* 261 - */ 0, - /* 262 - */ 0, - /* 263 - */ 0, - /* 264 - */ 0, - /* 265 - */ 0, - /* 266 - */ 0, - /* 267 - */ 0, - /* 268 - */ 0, - /* 269 - */ 0, - /* 26a - */ 0, - /* 26b - */ 0, - /* 26c - */ 0, - /* 26d - */ 0, - /* 26e - */ 0, - /* 26f - */ 0, - /* 270 - */ 0, - /* 271 - */ 0, - /* 272 - */ 0, - /* 273 - */ 0, - /* 274 - */ 0, - /* 275 - */ 0, - /* 276 - */ 0, - /* 277 - */ 0, - /* 278 - _C6_F8 */ 0x216c, - /* 279 - */ 0, - /* 27a - */ 0, - /* 27b - */ 0, - /* 27c - */ 0, - /* 27d - */ 0, - /* 27e - */ 0, - /* 27f - */ 0, - /* 280 - _C7_00 */ 0x216d, - /* 281 - */ 0, - /* 282 - */ 0, - /* 283 - */ 0, - /* 284 - */ 0, - /* 285 - */ 0, - /* 286 - */ 0, - /* 287 - */ 0, - /* 288 - */ 0, - /* 289 - */ 0, - /* 28a - */ 0, - /* 28b - */ 0, - /* 28c - */ 0, - /* 28d - */ 0, - /* 28e - */ 0, - /* 28f - */ 0, - /* 290 - */ 0, - /* 291 - */ 0, - /* 292 - */ 0, - /* 293 - */ 0, - /* 294 - */ 0, - /* 295 - */ 0, - /* 296 - */ 0, - /* 297 - */ 0, - /* 298 - */ 0, - /* 299 - */ 0, - /* 29a - */ 0, - /* 29b - */ 0, - /* 29c - */ 0, - /* 29d - */ 0, - /* 29e - */ 0, - /* 29f - */ 0, - /* 2a0 - */ 0, - /* 2a1 - */ 0, - /* 2a2 - */ 0, - /* 2a3 - */ 0, - /* 2a4 - */ 0, - /* 2a5 - */ 0, - /* 2a6 - */ 0, - /* 2a7 - */ 0, - /* 2a8 - */ 0, - /* 2a9 - */ 0, - /* 2aa - */ 0, - /* 2ab - */ 0, - /* 2ac - */ 0, - /* 2ad - */ 0, - /* 2ae - */ 0, - /* 2af - */ 0, - /* 2b0 - */ 0, - /* 2b1 - */ 0, - /* 2b2 - */ 0, - /* 2b3 - */ 0, - /* 2b4 - */ 0, - /* 2b5 - */ 0, - /* 2b6 - */ 0, - /* 2b7 - */ 0, - /* 2b8 - */ 0, - /* 2b9 - */ 0, - /* 2ba - */ 0, - /* 2bb - */ 0, - /* 2bc - */ 0, - /* 2bd - */ 0, - /* 2be - */ 0, - /* 2bf - */ 0, - /* 2c0 - _C7_F8 */ 0x216e, - /* 2c1 - */ 0, - /* 2c2 - */ 0, - /* 2c3 - */ 0, - /* 2c4 - */ 0, - /* 2c5 - */ 0, - /* 2c6 - */ 0, - /* 2c7 - */ 0, - /* 2c8 - _D0_00 */ 0x216f, - /* 2c9 - _D0_01 */ 0x2170, - /* 2ca - _D0_02 */ 0x2171, - /* 2cb - _D0_03 */ 0x2172, - /* 2cc - _D0_04 */ 0x2173, - /* 2cd - _D0_05 */ 0x2174, - /* 2ce - _D0_06 */ 0x2175, - /* 2cf - _D0_07 */ 0x2176, - /* 2d0 - _D1_00 */ 0x2177, - /* 2d1 - _D1_01 */ 0x2178, - /* 2d2 - _D1_02 */ 0x2179, - /* 2d3 - _D1_03 */ 0x217a, - /* 2d4 - _D1_04 */ 0x217b, - /* 2d5 - _D1_05 */ 0x217c, - /* 2d6 - _D1_06 */ 0x217d, - /* 2d7 - _D1_07 */ 0x217e, - /* 2d8 - _D2_00 */ 0x217f, - /* 2d9 - _D2_01 */ 0x2180, - /* 2da - _D2_02 */ 0x2181, - /* 2db - _D2_03 */ 0x2182, - /* 2dc - _D2_04 */ 0x2183, - /* 2dd - _D2_05 */ 0x2184, - /* 2de - _D2_06 */ 0x2185, - /* 2df - _D2_07 */ 0x2186, - /* 2e0 - _D3_00 */ 0x2187, - /* 2e1 - _D3_01 */ 0x2188, - /* 2e2 - _D3_02 */ 0x2189, - /* 2e3 - _D3_03 */ 0x218a, - /* 2e4 - _D3_04 */ 0x218b, - /* 2e5 - _D3_05 */ 0x218c, - /* 2e6 - _D3_06 */ 0x218d, - /* 2e7 - _D3_07 */ 0x218e, - /* 2e8 - _D8_00 */ 0x218f, - /* 2e9 - _D8_01 */ 0x2190, - /* 2ea - _D8_02 */ 0x2191, - /* 2eb - _D8_03 */ 0x2192, - /* 2ec - _D8_04 */ 0x2193, - /* 2ed - _D8_05 */ 0x2194, - /* 2ee - _D8_06 */ 0x2195, - /* 2ef - _D8_07 */ 0x2196, - /* 2f0 - _D8_C0 */ 0x2197, - /* 2f1 - _D8_C0 */ 0x2198, - /* 2f2 - _D8_C0 */ 0x2199, - /* 2f3 - _D8_C0 */ 0x219a, - /* 2f4 - _D8_C0 */ 0x219b, - /* 2f5 - _D8_C0 */ 0x219c, - /* 2f6 - _D8_C0 */ 0x219d, - /* 2f7 - _D8_C0 */ 0x219e, - /* 2f8 - _D8_C8 */ 0x219f, - /* 2f9 - _D8_C8 */ 0x21a0, - /* 2fa - _D8_C8 */ 0x21a1, - /* 2fb - _D8_C8 */ 0x21a2, - /* 2fc - _D8_C8 */ 0x21a3, - /* 2fd - _D8_C8 */ 0x21a4, - /* 2fe - _D8_C8 */ 0x21a5, - /* 2ff - _D8_C8 */ 0x21a6, - /* 300 - _D8_D0 */ 0x21a7, - /* 301 - _D8_D0 */ 0x21a8, - /* 302 - _D8_D0 */ 0x21a9, - /* 303 - _D8_D0 */ 0x21aa, - /* 304 - _D8_D0 */ 0x21ab, - /* 305 - _D8_D0 */ 0x21ac, - /* 306 - _D8_D0 */ 0x21ad, - /* 307 - _D8_D0 */ 0x21ae, - /* 308 - _D8_D8 */ 0x21af, - /* 309 - _D8_D9 */ 0x21b0, - /* 30a - _D8_D8 */ 0x21b1, - /* 30b - _D8_D8 */ 0x21b2, - /* 30c - _D8_D8 */ 0x21b3, - /* 30d - _D8_D8 */ 0x21b4, - /* 30e - _D8_D8 */ 0x21b5, - /* 30f - _D8_D8 */ 0x21b6, - /* 310 - _D8_E0 */ 0x21b7, - /* 311 - _D8_E0 */ 0x21b8, - /* 312 - _D8_E0 */ 0x21b9, - /* 313 - _D8_E0 */ 0x21ba, - /* 314 - _D8_E0 */ 0x21bb, - /* 315 - _D8_E0 */ 0x21bc, - /* 316 - _D8_E0 */ 0x21bd, - /* 317 - _D8_E0 */ 0x21be, - /* 318 - _D8_E8 */ 0x21bf, - /* 319 - _D8_E8 */ 0x21c0, - /* 31a - _D8_E8 */ 0x21c1, - /* 31b - _D8_E8 */ 0x21c2, - /* 31c - _D8_E8 */ 0x21c3, - /* 31d - _D8_E8 */ 0x21c4, - /* 31e - _D8_E8 */ 0x21c5, - /* 31f - _D8_E8 */ 0x21c6, - /* 320 - _D8_F0 */ 0x21c7, - /* 321 - _D8_F0 */ 0x21c8, - /* 322 - _D8_F0 */ 0x21c9, - /* 323 - _D8_F0 */ 0x21ca, - /* 324 - _D8_F0 */ 0x21cb, - /* 325 - _D8_F0 */ 0x21cc, - /* 326 - _D8_F0 */ 0x21cd, - /* 327 - _D8_F0 */ 0x21ce, - /* 328 - _D8_F8 */ 0x21cf, - /* 329 - _D8_F8 */ 0x21d0, - /* 32a - _D8_F8 */ 0x21d1, - /* 32b - _D8_F8 */ 0x21d2, - /* 32c - _D8_F8 */ 0x21d3, - /* 32d - _D8_F8 */ 0x21d4, - /* 32e - _D8_F8 */ 0x21d5, - /* 32f - _D8_F8 */ 0x21d6, - /* 330 - _D9_00 */ 0x21d7, - /* 331 - */ 0, - /* 332 - _D9_02 */ 0x21d8, - /* 333 - _D9_03 */ 0x21d9, - /* 334 - _D9_04 */ 0x21da, - /* 335 - _D9_05 */ 0x21db, - /* 336 - _D9_06 */ 0xcf24, - /* 337 - _D9_07 */ 0xcf30, - /* 338 - _D9_C0 */ 0x21dc, - /* 339 - _D9_C0 */ 0x21dd, - /* 33a - _D9_C0 */ 0x21de, - /* 33b - _D9_C0 */ 0x21df, - /* 33c - _D9_C0 */ 0x21e0, - /* 33d - _D9_C0 */ 0x21e1, - /* 33e - _D9_C0 */ 0x21e2, - /* 33f - _D9_C0 */ 0x21e3, - /* 340 - _D9_C8 */ 0x21e4, - /* 341 - _D9_C9 */ 0x21e5, - /* 342 - _D9_C8 */ 0x21e6, - /* 343 - _D9_C8 */ 0x21e7, - /* 344 - _D9_C8 */ 0x21e8, - /* 345 - _D9_C8 */ 0x21e9, - /* 346 - _D9_C8 */ 0x21ea, - /* 347 - _D9_C8 */ 0x21eb, - /* 348 - _D9_D0 */ 0x21ec, - /* 349 - */ 0, - /* 34a - */ 0, - /* 34b - */ 0, - /* 34c - */ 0, - /* 34d - */ 0, - /* 34e - */ 0, - /* 34f - */ 0, - /* 350 - */ 0, - /* 351 - */ 0, - /* 352 - */ 0, - /* 353 - */ 0, - /* 354 - */ 0, - /* 355 - */ 0, - /* 356 - */ 0, - /* 357 - */ 0, - /* 358 - _D9_E0 */ 0x21ed, - /* 359 - _D9_E1 */ 0x21ee, - /* 35a - */ 0, - /* 35b - */ 0, - /* 35c - _D9_E4 */ 0x21ef, - /* 35d - _D9_E5 */ 0x21f0, - /* 35e - */ 0, - /* 35f - */ 0, - /* 360 - _D9_E8 */ 0x21f1, - /* 361 - _D9_E9 */ 0x21f2, - /* 362 - _D9_EA */ 0x21f3, - /* 363 - _D9_EB */ 0x21f4, - /* 364 - _D9_EC */ 0x21f5, - /* 365 - _D9_ED */ 0x21f6, - /* 366 - _D9_EE */ 0x21f7, - /* 367 - */ 0, - /* 368 - _D9_F0 */ 0x21f8, - /* 369 - _D9_F1 */ 0x21f9, - /* 36a - _D9_F2 */ 0x21fa, - /* 36b - _D9_F3 */ 0x21fb, - /* 36c - _D9_F4 */ 0x21fc, - /* 36d - _D9_F5 */ 0x21fd, - /* 36e - _D9_F6 */ 0x21fe, - /* 36f - _D9_F7 */ 0x21ff, - /* 370 - _D9_F8 */ 0x2200, - /* 371 - _D9_F9 */ 0x2201, - /* 372 - _D9_FA */ 0x2202, - /* 373 - _D9_FB */ 0x2203, - /* 374 - _D9_FC */ 0x2204, - /* 375 - _D9_FD */ 0x2205, - /* 376 - _D9_FE */ 0x2206, - /* 377 - _D9_FF */ 0x2207, - /* 378 - _DA_00 */ 0x2208, - /* 379 - _DA_01 */ 0x2209, - /* 37a - _DA_02 */ 0x220a, - /* 37b - _DA_03 */ 0x220b, - /* 37c - _DA_04 */ 0x220c, - /* 37d - _DA_05 */ 0x220d, - /* 37e - _DA_06 */ 0x220e, - /* 37f - _DA_07 */ 0x220f, - /* 380 - _DA_C0 */ 0x2210, - /* 381 - _DA_C0 */ 0x2211, - /* 382 - _DA_C0 */ 0x2212, - /* 383 - _DA_C0 */ 0x2213, - /* 384 - _DA_C0 */ 0x2214, - /* 385 - _DA_C0 */ 0x2215, - /* 386 - _DA_C0 */ 0x2216, - /* 387 - _DA_C0 */ 0x2217, - /* 388 - _DA_C8 */ 0x2218, - /* 389 - _DA_C8 */ 0x2219, - /* 38a - _DA_C8 */ 0x221a, - /* 38b - _DA_C8 */ 0x221b, - /* 38c - _DA_C8 */ 0x221c, - /* 38d - _DA_C8 */ 0x221d, - /* 38e - _DA_C8 */ 0x221e, - /* 38f - _DA_C8 */ 0x221f, - /* 390 - _DA_D0 */ 0x2220, - /* 391 - _DA_D0 */ 0x2221, - /* 392 - _DA_D0 */ 0x2222, - /* 393 - _DA_D0 */ 0x2223, - /* 394 - _DA_D0 */ 0x2224, - /* 395 - _DA_D0 */ 0x2225, - /* 396 - _DA_D0 */ 0x2226, - /* 397 - _DA_D0 */ 0x2227, - /* 398 - _DA_D8 */ 0x2228, - /* 399 - _DA_D8 */ 0x2229, - /* 39a - _DA_D8 */ 0x222a, - /* 39b - _DA_D8 */ 0x222b, - /* 39c - _DA_D8 */ 0x222c, - /* 39d - _DA_D8 */ 0x222d, - /* 39e - _DA_D8 */ 0x222e, - /* 39f - _DA_D8 */ 0x222f, - /* 3a0 - */ 0, - /* 3a1 - */ 0, - /* 3a2 - */ 0, - /* 3a3 - */ 0, - /* 3a4 - */ 0, - /* 3a5 - */ 0, - /* 3a6 - */ 0, - /* 3a7 - */ 0, - /* 3a8 - */ 0, - /* 3a9 - _DA_E9 */ 0x2230, - /* 3aa - */ 0, - /* 3ab - */ 0, - /* 3ac - */ 0, - /* 3ad - */ 0, - /* 3ae - */ 0, - /* 3af - */ 0, - /* 3b0 - */ 0, - /* 3b1 - */ 0, - /* 3b2 - */ 0, - /* 3b3 - */ 0, - /* 3b4 - */ 0, - /* 3b5 - */ 0, - /* 3b6 - */ 0, - /* 3b7 - */ 0, - /* 3b8 - */ 0, - /* 3b9 - */ 0, - /* 3ba - */ 0, - /* 3bb - */ 0, - /* 3bc - */ 0, - /* 3bd - */ 0, - /* 3be - */ 0, - /* 3bf - */ 0, - /* 3c0 - _DB_00 */ 0x2231, - /* 3c1 - _DB_01 */ 0x2232, - /* 3c2 - _DB_02 */ 0x2233, - /* 3c3 - _DB_03 */ 0x2234, - /* 3c4 - */ 0, - /* 3c5 - _DB_05 */ 0x2235, - /* 3c6 - */ 0, - /* 3c7 - _DB_07 */ 0x2236, - /* 3c8 - _DB_C0 */ 0x2237, - /* 3c9 - _DB_C0 */ 0x2238, - /* 3ca - _DB_C0 */ 0x2239, - /* 3cb - _DB_C0 */ 0x223a, - /* 3cc - _DB_C0 */ 0x223b, - /* 3cd - _DB_C0 */ 0x223c, - /* 3ce - _DB_C0 */ 0x223d, - /* 3cf - _DB_C0 */ 0x223e, - /* 3d0 - _DB_C8 */ 0x223f, - /* 3d1 - _DB_C8 */ 0x2240, - /* 3d2 - _DB_C8 */ 0x2241, - /* 3d3 - _DB_C8 */ 0x2242, - /* 3d4 - _DB_C8 */ 0x2243, - /* 3d5 - _DB_C8 */ 0x2244, - /* 3d6 - _DB_C8 */ 0x2245, - /* 3d7 - _DB_C8 */ 0x2246, - /* 3d8 - _DB_D0 */ 0x2247, - /* 3d9 - _DB_D0 */ 0x2248, - /* 3da - _DB_D0 */ 0x2249, - /* 3db - _DB_D0 */ 0x224a, - /* 3dc - _DB_D0 */ 0x224b, - /* 3dd - _DB_D0 */ 0x224c, - /* 3de - _DB_D0 */ 0x224d, - /* 3df - _DB_D0 */ 0x224e, - /* 3e0 - _DB_D8 */ 0x224f, - /* 3e1 - _DB_D8 */ 0x2250, - /* 3e2 - _DB_D8 */ 0x2251, - /* 3e3 - _DB_D8 */ 0x2252, - /* 3e4 - _DB_D8 */ 0x2253, - /* 3e5 - _DB_D8 */ 0x2254, - /* 3e6 - _DB_D8 */ 0x2255, - /* 3e7 - _DB_D8 */ 0x2256, - /* 3e8 - _DB_E0 */ 0x2257, - /* 3e9 - _DB_E1 */ 0x2258, - /* 3ea - _DB_E2 */ 0xcf3c, - /* 3eb - _DB_E3 */ 0xcf48, - /* 3ec - _DB_E4 */ 0x2259, - /* 3ed - */ 0, - /* 3ee - */ 0, - /* 3ef - */ 0, - /* 3f0 - _DB_E8 */ 0x225a, - /* 3f1 - _DB_E8 */ 0x225b, - /* 3f2 - _DB_E8 */ 0x225c, - /* 3f3 - _DB_E8 */ 0x225d, - /* 3f4 - _DB_E8 */ 0x225e, - /* 3f5 - _DB_E8 */ 0x225f, - /* 3f6 - _DB_E8 */ 0x2260, - /* 3f7 - _DB_E8 */ 0x2261, - /* 3f8 - _DB_F0 */ 0x2262, - /* 3f9 - _DB_F0 */ 0x2263, - /* 3fa - _DB_F0 */ 0x2264, - /* 3fb - _DB_F0 */ 0x2265, - /* 3fc - _DB_F0 */ 0x2266, - /* 3fd - _DB_F0 */ 0x2267, - /* 3fe - _DB_F0 */ 0x2268, - /* 3ff - _DB_F0 */ 0x2269, - /* 400 - */ 0, - /* 401 - */ 0, - /* 402 - */ 0, - /* 403 - */ 0, - /* 404 - */ 0, - /* 405 - */ 0, - /* 406 - */ 0, - /* 407 - */ 0, - /* 408 - _DC_00 */ 0x226a, - /* 409 - _DC_01 */ 0x226b, - /* 40a - _DC_02 */ 0x226c, - /* 40b - _DC_03 */ 0x226d, - /* 40c - _DC_04 */ 0x226e, - /* 40d - _DC_05 */ 0x226f, - /* 40e - _DC_06 */ 0x2270, - /* 40f - _DC_07 */ 0x2271, - /* 410 - _DC_C0 */ 0x2272, - /* 411 - _DC_C0 */ 0x2273, - /* 412 - _DC_C0 */ 0x2274, - /* 413 - _DC_C0 */ 0x2275, - /* 414 - _DC_C0 */ 0x2276, - /* 415 - _DC_C0 */ 0x2277, - /* 416 - _DC_C0 */ 0x2278, - /* 417 - _DC_C0 */ 0x2279, - /* 418 - _DC_C8 */ 0x227a, - /* 419 - _DC_C8 */ 0x227b, - /* 41a - _DC_C8 */ 0x227c, - /* 41b - _DC_C8 */ 0x227d, - /* 41c - _DC_C8 */ 0x227e, - /* 41d - _DC_C8 */ 0x227f, - /* 41e - _DC_C8 */ 0x2280, - /* 41f - _DC_C8 */ 0x2281, - /* 420 - */ 0, - /* 421 - */ 0, - /* 422 - */ 0, - /* 423 - */ 0, - /* 424 - */ 0, - /* 425 - */ 0, - /* 426 - */ 0, - /* 427 - */ 0, - /* 428 - */ 0, - /* 429 - */ 0, - /* 42a - */ 0, - /* 42b - */ 0, - /* 42c - */ 0, - /* 42d - */ 0, - /* 42e - */ 0, - /* 42f - */ 0, - /* 430 - _DC_E0 */ 0x2282, - /* 431 - _DC_E0 */ 0x2283, - /* 432 - _DC_E0 */ 0x2284, - /* 433 - _DC_E0 */ 0x2285, - /* 434 - _DC_E0 */ 0x2286, - /* 435 - _DC_E0 */ 0x2287, - /* 436 - _DC_E0 */ 0x2288, - /* 437 - _DC_E0 */ 0x2289, - /* 438 - _DC_E8 */ 0x228a, - /* 439 - _DC_E8 */ 0x228b, - /* 43a - _DC_E8 */ 0x228c, - /* 43b - _DC_E8 */ 0x228d, - /* 43c - _DC_E8 */ 0x228e, - /* 43d - _DC_E8 */ 0x228f, - /* 43e - _DC_E8 */ 0x2290, - /* 43f - _DC_E8 */ 0x2291, - /* 440 - _DC_F0 */ 0x2292, - /* 441 - _DC_F0 */ 0x2293, - /* 442 - _DC_F0 */ 0x2294, - /* 443 - _DC_F0 */ 0x2295, - /* 444 - _DC_F0 */ 0x2296, - /* 445 - _DC_F0 */ 0x2297, - /* 446 - _DC_F0 */ 0x2298, - /* 447 - _DC_F0 */ 0x2299, - /* 448 - _DC_F8 */ 0x229a, - /* 449 - _DC_F8 */ 0x229b, - /* 44a - _DC_F8 */ 0x229c, - /* 44b - _DC_F8 */ 0x229d, - /* 44c - _DC_F8 */ 0x229e, - /* 44d - _DC_F8 */ 0x229f, - /* 44e - _DC_F8 */ 0x22a0, - /* 44f - _DC_F8 */ 0x22a1, - /* 450 - _DD_00 */ 0x22a2, - /* 451 - _DD_01 */ 0x22a3, - /* 452 - _DD_02 */ 0x22a4, - /* 453 - _DD_03 */ 0x22a5, - /* 454 - _DD_04 */ 0x22a6, - /* 455 - */ 0, - /* 456 - _DD_06 */ 0xcf54, - /* 457 - _DD_07 */ 0xcf60, - /* 458 - _DD_C0 */ 0x22a7, - /* 459 - _DD_C0 */ 0x22a8, - /* 45a - _DD_C0 */ 0x22a9, - /* 45b - _DD_C0 */ 0x22aa, - /* 45c - _DD_C0 */ 0x22ab, - /* 45d - _DD_C0 */ 0x22ac, - /* 45e - _DD_C0 */ 0x22ad, - /* 45f - _DD_C0 */ 0x22ae, - /* 460 - */ 0, - /* 461 - */ 0, - /* 462 - */ 0, - /* 463 - */ 0, - /* 464 - */ 0, - /* 465 - */ 0, - /* 466 - */ 0, - /* 467 - */ 0, - /* 468 - _DD_D0 */ 0x22af, - /* 469 - _DD_D0 */ 0x22b0, - /* 46a - _DD_D0 */ 0x22b1, - /* 46b - _DD_D0 */ 0x22b2, - /* 46c - _DD_D0 */ 0x22b3, - /* 46d - _DD_D0 */ 0x22b4, - /* 46e - _DD_D0 */ 0x22b5, - /* 46f - _DD_D0 */ 0x22b6, - /* 470 - _DD_D8 */ 0x22b7, - /* 471 - _DD_D8 */ 0x22b8, - /* 472 - _DD_D8 */ 0x22b9, - /* 473 - _DD_D8 */ 0x22ba, - /* 474 - _DD_D8 */ 0x22bb, - /* 475 - _DD_D8 */ 0x22bc, - /* 476 - _DD_D8 */ 0x22bd, - /* 477 - _DD_D8 */ 0x22be, - /* 478 - _DD_E0 */ 0x22bf, - /* 479 - _DD_E1 */ 0x22c0, - /* 47a - _DD_E0 */ 0x22c1, - /* 47b - _DD_E0 */ 0x22c2, - /* 47c - _DD_E0 */ 0x22c3, - /* 47d - _DD_E0 */ 0x22c4, - /* 47e - _DD_E0 */ 0x22c5, - /* 47f - _DD_E0 */ 0x22c6, - /* 480 - _DD_E8 */ 0x22c7, - /* 481 - _DD_E9 */ 0x22c8, - /* 482 - _DD_E8 */ 0x22c9, - /* 483 - _DD_E8 */ 0x22ca, - /* 484 - _DD_E8 */ 0x22cb, - /* 485 - _DD_E8 */ 0x22cc, - /* 486 - _DD_E8 */ 0x22cd, - /* 487 - _DD_E8 */ 0x22ce, - /* 488 - */ 0, - /* 489 - */ 0, - /* 48a - */ 0, - /* 48b - */ 0, - /* 48c - */ 0, - /* 48d - */ 0, - /* 48e - */ 0, - /* 48f - */ 0, - /* 490 - */ 0, - /* 491 - */ 0, - /* 492 - */ 0, - /* 493 - */ 0, - /* 494 - */ 0, - /* 495 - */ 0, - /* 496 - */ 0, - /* 497 - */ 0, - /* 498 - _DE_00 */ 0x22cf, - /* 499 - _DE_01 */ 0x22d0, - /* 49a - _DE_02 */ 0x22d1, - /* 49b - _DE_03 */ 0x22d2, - /* 49c - _DE_04 */ 0x22d3, - /* 49d - _DE_05 */ 0x22d4, - /* 49e - _DE_06 */ 0x22d5, - /* 49f - _DE_07 */ 0x22d6, - /* 4a0 - _DE_C0 */ 0x22d7, - /* 4a1 - _DE_C1 */ 0x22d8, - /* 4a2 - _DE_C0 */ 0x22d9, - /* 4a3 - _DE_C0 */ 0x22da, - /* 4a4 - _DE_C0 */ 0x22db, - /* 4a5 - _DE_C0 */ 0x22dc, - /* 4a6 - _DE_C0 */ 0x22dd, - /* 4a7 - _DE_C0 */ 0x22de, - /* 4a8 - _DE_C8 */ 0x22df, - /* 4a9 - _DE_C9 */ 0x22e0, - /* 4aa - _DE_C8 */ 0x22e1, - /* 4ab - _DE_C8 */ 0x22e2, - /* 4ac - _DE_C8 */ 0x22e3, - /* 4ad - _DE_C8 */ 0x22e4, - /* 4ae - _DE_C8 */ 0x22e5, - /* 4af - _DE_C8 */ 0x22e6, - /* 4b0 - */ 0, - /* 4b1 - */ 0, - /* 4b2 - */ 0, - /* 4b3 - */ 0, - /* 4b4 - */ 0, - /* 4b5 - */ 0, - /* 4b6 - */ 0, - /* 4b7 - */ 0, - /* 4b8 - */ 0, - /* 4b9 - _DE_D9 */ 0x22e7, - /* 4ba - */ 0, - /* 4bb - */ 0, - /* 4bc - */ 0, - /* 4bd - */ 0, - /* 4be - */ 0, - /* 4bf - */ 0, - /* 4c0 - _DE_E0 */ 0x22e8, - /* 4c1 - _DE_E1 */ 0x22e9, - /* 4c2 - _DE_E0 */ 0x22ea, - /* 4c3 - _DE_E0 */ 0x22eb, - /* 4c4 - _DE_E0 */ 0x22ec, - /* 4c5 - _DE_E0 */ 0x22ed, - /* 4c6 - _DE_E0 */ 0x22ee, - /* 4c7 - _DE_E0 */ 0x22ef, - /* 4c8 - _DE_E8 */ 0x22f0, - /* 4c9 - _DE_E9 */ 0x22f1, - /* 4ca - _DE_E8 */ 0x22f2, - /* 4cb - _DE_E8 */ 0x22f3, - /* 4cc - _DE_E8 */ 0x22f4, - /* 4cd - _DE_E8 */ 0x22f5, - /* 4ce - _DE_E8 */ 0x22f6, - /* 4cf - _DE_E8 */ 0x22f7, - /* 4d0 - _DE_F0 */ 0x22f8, - /* 4d1 - _DE_F1 */ 0x22f9, - /* 4d2 - _DE_F0 */ 0x22fa, - /* 4d3 - _DE_F0 */ 0x22fb, - /* 4d4 - _DE_F0 */ 0x22fc, - /* 4d5 - _DE_F0 */ 0x22fd, - /* 4d6 - _DE_F0 */ 0x22fe, - /* 4d7 - _DE_F0 */ 0x22ff, - /* 4d8 - _DE_F8 */ 0x2300, - /* 4d9 - _DE_F9 */ 0x2301, - /* 4da - _DE_F8 */ 0x2302, - /* 4db - _DE_F8 */ 0x2303, - /* 4dc - _DE_F8 */ 0x2304, - /* 4dd - _DE_F8 */ 0x2305, - /* 4de - _DE_F8 */ 0x2306, - /* 4df - _DE_F8 */ 0x2307, - /* 4e0 - _DF_00 */ 0x2308, - /* 4e1 - _DF_01 */ 0x2309, - /* 4e2 - _DF_02 */ 0x230a, - /* 4e3 - _DF_03 */ 0x230b, - /* 4e4 - _DF_04 */ 0x230c, - /* 4e5 - _DF_05 */ 0x230d, - /* 4e6 - _DF_06 */ 0x230e, - /* 4e7 - _DF_07 */ 0x230f, - /* 4e8 - */ 0, - /* 4e9 - */ 0, - /* 4ea - */ 0, - /* 4eb - */ 0, - /* 4ec - */ 0, - /* 4ed - */ 0, - /* 4ee - */ 0, - /* 4ef - */ 0, - /* 4f0 - */ 0, - /* 4f1 - */ 0, - /* 4f2 - */ 0, - /* 4f3 - */ 0, - /* 4f4 - */ 0, - /* 4f5 - */ 0, - /* 4f6 - */ 0, - /* 4f7 - */ 0, - /* 4f8 - */ 0, - /* 4f9 - */ 0, - /* 4fa - */ 0, - /* 4fb - */ 0, - /* 4fc - */ 0, - /* 4fd - */ 0, - /* 4fe - */ 0, - /* 4ff - */ 0, - /* 500 - */ 0, - /* 501 - */ 0, - /* 502 - */ 0, - /* 503 - */ 0, - /* 504 - */ 0, - /* 505 - */ 0, - /* 506 - */ 0, - /* 507 - */ 0, - /* 508 - _DF_E0 */ 0xcf6c, - /* 509 - */ 0, - /* 50a - */ 0, - /* 50b - */ 0, - /* 50c - */ 0, - /* 50d - */ 0, - /* 50e - */ 0, - /* 50f - */ 0, - /* 510 - _DF_E8 */ 0x2310, - /* 511 - _DF_E8 */ 0x2311, - /* 512 - _DF_E8 */ 0x2312, - /* 513 - _DF_E8 */ 0x2313, - /* 514 - _DF_E8 */ 0x2314, - /* 515 - _DF_E8 */ 0x2315, - /* 516 - _DF_E8 */ 0x2316, - /* 517 - _DF_E8 */ 0x2317, - /* 518 - _DF_F0 */ 0x2318, - /* 519 - _DF_F0 */ 0x2319, - /* 51a - _DF_F0 */ 0x231a, - /* 51b - _DF_F0 */ 0x231b, - /* 51c - _DF_F0 */ 0x231c, - /* 51d - _DF_F0 */ 0x231d, - /* 51e - _DF_F0 */ 0x231e, - /* 51f - _DF_F0 */ 0x231f, - /* 520 - */ 0, - /* 521 - */ 0, - /* 522 - */ 0, - /* 523 - */ 0, - /* 524 - */ 0, - /* 525 - */ 0, - /* 526 - */ 0, - /* 527 - */ 0, - /* 528 - _F6_00 */ 0x2320, - /* 529 - */ 0, - /* 52a - _F6_02 */ 0x2321, - /* 52b - _F6_03 */ 0x2322, - /* 52c - _F6_04 */ 0x2323, - /* 52d - _F6_05 */ 0x2324, - /* 52e - _F6_06 */ 0x2325, - /* 52f - _F6_07 */ 0x2326, - /* 530 - _F7_00 */ 0x2327, - /* 531 - */ 0, - /* 532 - _F7_02 */ 0x2328, - /* 533 - _F7_03 */ 0x2329, - /* 534 - _F7_04 */ 0x232a, - /* 535 - _F7_05 */ 0x232b, - /* 536 - _F7_06 */ 0x232c, - /* 537 - _F7_07 */ 0x232d, - /* 538 - _FE_00 */ 0x232e, - /* 539 - _FE_01 */ 0x232f, - /* 53a - */ 0, - /* 53b - */ 0, - /* 53c - */ 0, - /* 53d - */ 0, - /* 53e - */ 0, - /* 53f - */ 0, - /* 540 - _FF_00 */ 0x2330, - /* 541 - _FF_01 */ 0x2331, - /* 542 - _FF_02 */ 0x2332, - /* 543 - _FF_03 */ 0x2333, - /* 544 - _FF_04 */ 0x2334, - /* 545 - _FF_05 */ 0x2335, - /* 546 - _FF_06 */ 0x2336, - /* 547 - */ 0, - /* 548 - _0F_00_00 */ 0x2337, - /* 549 - _0F_00_01 */ 0x2338, - /* 54a - _0F_00_02 */ 0x2339, - /* 54b - _0F_00_03 */ 0x233a, - /* 54c - _0F_00_04 */ 0x233b, - /* 54d - _0F_00_05 */ 0x233c, - /* 54e - */ 0, - /* 54f - */ 0, - /* 550 - _0F_01_00 */ 0x233d, - /* 551 - _0F_01_01 */ 0x233e, - /* 552 - _0F_01_02 */ 0x233f, - /* 553 - _0F_01_03 */ 0x2340, - /* 554 - _0F_01_04 */ 0x2341, - /* 555 - */ 0, - /* 556 - _0F_01_06 */ 0x2342, - /* 557 - _0F_01_07 */ 0x2343, - /* 558 - */ 0, - /* 559 - _0F_01_C1 */ 0x2344, - /* 55a - _0F_01_C2 */ 0x2345, - /* 55b - _0F_01_C3 */ 0x2346, - /* 55c - _0F_01_C4 */ 0x2347, - /* 55d - */ 0, - /* 55e - */ 0, - /* 55f - */ 0, - /* 560 - _0F_01_C8 */ 0x2348, - /* 561 - _0F_01_C9 */ 0x2349, - /* 562 - */ 0, - /* 563 - */ 0, - /* 564 - */ 0, - /* 565 - */ 0, - /* 566 - */ 0, - /* 567 - */ 0, - /* 568 - _0F_01_D0 */ 0x234a, - /* 569 - _0F_01_D1 */ 0x234b, - /* 56a - */ 0, - /* 56b - */ 0, - /* 56c - _0F_01_D4 */ 0x234c, - /* 56d - _0F_01_D5 */ 0x234d, - /* 56e - */ 0, - /* 56f - */ 0, - /* 570 - _0F_01_D8 */ 0x234e, - /* 571 - _0F_01_D9 */ 0x234f, - /* 572 - _0F_01_DA */ 0x2350, - /* 573 - _0F_01_DB */ 0x2351, - /* 574 - _0F_01_DC */ 0x2352, - /* 575 - _0F_01_DD */ 0x2353, - /* 576 - _0F_01_DE */ 0x2354, - /* 577 - _0F_01_DF */ 0x2355, - /* 578 - */ 0, - /* 579 - */ 0, - /* 57a - */ 0, - /* 57b - */ 0, - /* 57c - */ 0, - /* 57d - */ 0, - /* 57e - */ 0, - /* 57f - */ 0, - /* 580 - */ 0, - /* 581 - */ 0, - /* 582 - */ 0, - /* 583 - */ 0, - /* 584 - */ 0, - /* 585 - */ 0, - /* 586 - */ 0, - /* 587 - */ 0, - /* 588 - */ 0, - /* 589 - */ 0, - /* 58a - */ 0, - /* 58b - */ 0, - /* 58c - */ 0, - /* 58d - */ 0, - /* 58e - */ 0, - /* 58f - */ 0, - /* 590 - _0F_01_F8 */ 0x2356, - /* 591 - _0F_01_F9 */ 0x2357, - /* 592 - */ 0, - /* 593 - */ 0, - /* 594 - */ 0, - /* 595 - */ 0, - /* 596 - */ 0, - /* 597 - */ 0, - /* 598 - _0F_0D_00 */ 0x2358, - /* 599 - _0F_0D_01 */ 0x2359, - /* 59a - */ 0, - /* 59b - */ 0, - /* 59c - */ 0, - /* 59d - */ 0, - /* 59e - */ 0, - /* 59f - */ 0, - /* 5a0 - */ 0, - /* 5a1 - */ 0, - /* 5a2 - */ 0, - /* 5a3 - */ 0, - /* 5a4 - */ 0, - /* 5a5 - */ 0, - /* 5a6 - */ 0, - /* 5a7 - */ 0, - /* 5a8 - */ 0, - /* 5a9 - */ 0, - /* 5aa - */ 0, - /* 5ab - */ 0, - /* 5ac - _0F_0F_0C */ 0x235a, - /* 5ad - _0F_0F_0D */ 0x235b, - /* 5ae - */ 0, - /* 5af - */ 0, - /* 5b0 - */ 0, - /* 5b1 - */ 0, - /* 5b2 - */ 0, - /* 5b3 - */ 0, - /* 5b4 - */ 0, - /* 5b5 - */ 0, - /* 5b6 - */ 0, - /* 5b7 - */ 0, - /* 5b8 - */ 0, - /* 5b9 - */ 0, - /* 5ba - */ 0, - /* 5bb - */ 0, - /* 5bc - _0F_0F_1C */ 0x235c, - /* 5bd - _0F_0F_1D */ 0x235d, - /* 5be - */ 0, - /* 5bf - */ 0, - /* 5c0 - */ 0, - /* 5c1 - */ 0, - /* 5c2 - */ 0, - /* 5c3 - */ 0, - /* 5c4 - */ 0, - /* 5c5 - */ 0, - /* 5c6 - */ 0, - /* 5c7 - */ 0, - /* 5c8 - */ 0, - /* 5c9 - */ 0, - /* 5ca - */ 0, - /* 5cb - */ 0, - /* 5cc - */ 0, - /* 5cd - */ 0, - /* 5ce - */ 0, - /* 5cf - */ 0, - /* 5d0 - */ 0, - /* 5d1 - */ 0, - /* 5d2 - */ 0, - /* 5d3 - */ 0, - /* 5d4 - */ 0, - /* 5d5 - */ 0, - /* 5d6 - */ 0, - /* 5d7 - */ 0, - /* 5d8 - */ 0, - /* 5d9 - */ 0, - /* 5da - */ 0, - /* 5db - */ 0, - /* 5dc - */ 0, - /* 5dd - */ 0, - /* 5de - */ 0, - /* 5df - */ 0, - /* 5e0 - */ 0, - /* 5e1 - */ 0, - /* 5e2 - */ 0, - /* 5e3 - */ 0, - /* 5e4 - */ 0, - /* 5e5 - */ 0, - /* 5e6 - */ 0, - /* 5e7 - */ 0, - /* 5e8 - */ 0, - /* 5e9 - */ 0, - /* 5ea - */ 0, - /* 5eb - */ 0, - /* 5ec - */ 0, - /* 5ed - */ 0, - /* 5ee - */ 0, - /* 5ef - */ 0, - /* 5f0 - */ 0, - /* 5f1 - */ 0, - /* 5f2 - */ 0, - /* 5f3 - */ 0, - /* 5f4 - */ 0, - /* 5f5 - */ 0, - /* 5f6 - */ 0, - /* 5f7 - */ 0, - /* 5f8 - */ 0, - /* 5f9 - */ 0, - /* 5fa - */ 0, - /* 5fb - */ 0, - /* 5fc - */ 0, - /* 5fd - */ 0, - /* 5fe - */ 0, - /* 5ff - */ 0, - /* 600 - */ 0, - /* 601 - */ 0, - /* 602 - */ 0, - /* 603 - */ 0, - /* 604 - */ 0, - /* 605 - */ 0, - /* 606 - */ 0, - /* 607 - */ 0, - /* 608 - */ 0, - /* 609 - */ 0, - /* 60a - */ 0, - /* 60b - */ 0, - /* 60c - */ 0, - /* 60d - */ 0, - /* 60e - */ 0, - /* 60f - */ 0, - /* 610 - */ 0, - /* 611 - */ 0, - /* 612 - */ 0, - /* 613 - */ 0, - /* 614 - */ 0, - /* 615 - */ 0, - /* 616 - */ 0, - /* 617 - */ 0, - /* 618 - */ 0, - /* 619 - */ 0, - /* 61a - */ 0, - /* 61b - */ 0, - /* 61c - */ 0, - /* 61d - */ 0, - /* 61e - */ 0, - /* 61f - */ 0, - /* 620 - */ 0, - /* 621 - */ 0, - /* 622 - */ 0, - /* 623 - */ 0, - /* 624 - */ 0, - /* 625 - */ 0, - /* 626 - */ 0, - /* 627 - */ 0, - /* 628 - */ 0, - /* 629 - */ 0, - /* 62a - _0F_0F_8A */ 0x235e, - /* 62b - */ 0, - /* 62c - */ 0, - /* 62d - */ 0, - /* 62e - _0F_0F_8E */ 0x235f, - /* 62f - */ 0, - /* 630 - _0F_0F_90 */ 0x2360, - /* 631 - */ 0, - /* 632 - */ 0, - /* 633 - */ 0, - /* 634 - _0F_0F_94 */ 0x2361, - /* 635 - */ 0, - /* 636 - _0F_0F_96 */ 0x2362, - /* 637 - _0F_0F_97 */ 0x2363, - /* 638 - */ 0, - /* 639 - */ 0, - /* 63a - _0F_0F_9A */ 0x2364, - /* 63b - */ 0, - /* 63c - */ 0, - /* 63d - */ 0, - /* 63e - _0F_0F_9E */ 0x2365, - /* 63f - */ 0, - /* 640 - _0F_0F_A0 */ 0x2366, - /* 641 - */ 0, - /* 642 - */ 0, - /* 643 - */ 0, - /* 644 - _0F_0F_A4 */ 0x2367, - /* 645 - */ 0, - /* 646 - _0F_0F_A6 */ 0x2368, - /* 647 - _0F_0F_A7 */ 0x2369, - /* 648 - */ 0, - /* 649 - */ 0, - /* 64a - _0F_0F_AA */ 0x236a, - /* 64b - */ 0, - /* 64c - */ 0, - /* 64d - */ 0, - /* 64e - _0F_0F_AE */ 0x236b, - /* 64f - */ 0, - /* 650 - _0F_0F_B0 */ 0x236c, - /* 651 - */ 0, - /* 652 - */ 0, - /* 653 - */ 0, - /* 654 - _0F_0F_B4 */ 0x236d, - /* 655 - */ 0, - /* 656 - _0F_0F_B6 */ 0x236e, - /* 657 - _0F_0F_B7 */ 0x236f, - /* 658 - */ 0, - /* 659 - */ 0, - /* 65a - */ 0, - /* 65b - _0F_0F_BB */ 0x2370, - /* 65c - */ 0, - /* 65d - */ 0, - /* 65e - */ 0, - /* 65f - _0F_0F_BF */ 0x2371, - /* 660 - */ 0, - /* 661 - */ 0, - /* 662 - */ 0, - /* 663 - */ 0, - /* 664 - */ 0, - /* 665 - */ 0, - /* 666 - */ 0, - /* 667 - */ 0, - /* 668 - */ 0, - /* 669 - */ 0, - /* 66a - */ 0, - /* 66b - */ 0, - /* 66c - */ 0, - /* 66d - */ 0, - /* 66e - */ 0, - /* 66f - */ 0, - /* 670 - */ 0, - /* 671 - */ 0, - /* 672 - */ 0, - /* 673 - */ 0, - /* 674 - */ 0, - /* 675 - */ 0, - /* 676 - */ 0, - /* 677 - */ 0, - /* 678 - */ 0, - /* 679 - */ 0, - /* 67a - */ 0, - /* 67b - */ 0, - /* 67c - */ 0, - /* 67d - */ 0, - /* 67e - */ 0, - /* 67f - */ 0, - /* 680 - */ 0, - /* 681 - */ 0, - /* 682 - */ 0, - /* 683 - */ 0, - /* 684 - */ 0, - /* 685 - */ 0, - /* 686 - */ 0, - /* 687 - */ 0, - /* 688 - */ 0, - /* 689 - */ 0, - /* 68a - */ 0, - /* 68b - */ 0, - /* 68c - */ 0, - /* 68d - */ 0, - /* 68e - */ 0, - /* 68f - */ 0, - /* 690 - */ 0, - /* 691 - */ 0, - /* 692 - */ 0, - /* 693 - */ 0, - /* 694 - */ 0, - /* 695 - */ 0, - /* 696 - */ 0, - /* 697 - */ 0, - /* 698 - */ 0, - /* 699 - */ 0, - /* 69a - */ 0, - /* 69b - */ 0, - /* 69c - */ 0, - /* 69d - */ 0, - /* 69e - */ 0, - /* 69f - */ 0, - /* 6a0 - _0F_10 */ 0x2372, - /* 6a1 - _66_0F_10 */ 0x2373, - /* 6a2 - _F3_0F_10 */ 0x2374, - /* 6a3 - _F2_0F_10 */ 0x2375, - /* 6a4 - _V_0F_10 */ 0x4009, - /* 6a5 - _V_66_0F_10 */ 0x400a, - /* 6a6 - _V_F3_0F_10 */ 0x400b, - /* 6a7 - _V_F2_0F_10 */ 0x400c, - /* 6a8 - */ 0, - /* 6a9 - */ 0, - /* 6aa - _VRR_F3_0F_10 */ 0x400d, - /* 6ab - _VRR_F2_0F_10 */ 0x400e, - /* 6ac - _0F_11 */ 0x2376, - /* 6ad - _66_0F_11 */ 0x2377, - /* 6ae - _F3_0F_11 */ 0x2378, - /* 6af - _F2_0F_11 */ 0x2379, - /* 6b0 - _V_0F_11 */ 0x400f, - /* 6b1 - _V_66_0F_11 */ 0x4010, - /* 6b2 - _V_F3_0F_11 */ 0x4011, - /* 6b3 - _V_F2_0F_11 */ 0x4012, - /* 6b4 - */ 0, - /* 6b5 - */ 0, - /* 6b6 - _VRR_F3_0F_11 */ 0x4013, - /* 6b7 - _VRR_F2_0F_11 */ 0x4014, - /* 6b8 - _0F_12 */ 0x4015, - /* 6b9 - _66_0F_12 */ 0x237a, - /* 6ba - _F3_0F_12 */ 0x237b, - /* 6bb - _F2_0F_12 */ 0x237c, - /* 6bc - _V_0F_12 */ 0x4016, - /* 6bd - _V_66_0F_12 */ 0x4017, - /* 6be - _V_F3_0F_12 */ 0x4018, - /* 6bf - _V_F2_0F_12 */ 0x4019, - /* 6c0 - */ 0, - /* 6c1 - */ 0, - /* 6c2 - */ 0, - /* 6c3 - */ 0, - /* 6c4 - _0F_13 */ 0x237d, - /* 6c5 - _66_0F_13 */ 0x237e, - /* 6c6 - */ 0, - /* 6c7 - */ 0, - /* 6c8 - _V_0F_13 */ 0x401a, - /* 6c9 - _V_66_0F_13 */ 0x401b, - /* 6ca - */ 0, - /* 6cb - */ 0, - /* 6cc - */ 0, - /* 6cd - */ 0, - /* 6ce - */ 0, - /* 6cf - */ 0, - /* 6d0 - _0F_14 */ 0x237f, - /* 6d1 - _66_0F_14 */ 0x2380, - /* 6d2 - */ 0, - /* 6d3 - */ 0, - /* 6d4 - _V_0F_14 */ 0x401c, - /* 6d5 - _V_66_0F_14 */ 0x401d, - /* 6d6 - */ 0, - /* 6d7 - */ 0, - /* 6d8 - */ 0, - /* 6d9 - */ 0, - /* 6da - */ 0, - /* 6db - */ 0, - /* 6dc - _0F_15 */ 0x2381, - /* 6dd - _66_0F_15 */ 0x2382, - /* 6de - */ 0, - /* 6df - */ 0, - /* 6e0 - _V_0F_15 */ 0x401e, - /* 6e1 - _V_66_0F_15 */ 0x401f, - /* 6e2 - */ 0, - /* 6e3 - */ 0, - /* 6e4 - */ 0, - /* 6e5 - */ 0, - /* 6e6 - */ 0, - /* 6e7 - */ 0, - /* 6e8 - _0F_16 */ 0x4020, - /* 6e9 - _66_0F_16 */ 0x2383, - /* 6ea - _F3_0F_16 */ 0x2384, - /* 6eb - */ 0, - /* 6ec - _V_0F_16 */ 0x4021, - /* 6ed - _V_66_0F_16 */ 0x4022, - /* 6ee - _V_F3_0F_16 */ 0x4023, - /* 6ef - */ 0, - /* 6f0 - */ 0, - /* 6f1 - */ 0, - /* 6f2 - */ 0, - /* 6f3 - */ 0, - /* 6f4 - _0F_17 */ 0x2385, - /* 6f5 - _66_0F_17 */ 0x2386, - /* 6f6 - */ 0, - /* 6f7 - */ 0, - /* 6f8 - _V_0F_17 */ 0x4024, - /* 6f9 - _V_66_0F_17 */ 0x4025, - /* 6fa - */ 0, - /* 6fb - */ 0, - /* 6fc - */ 0, - /* 6fd - */ 0, - /* 6fe - */ 0, - /* 6ff - */ 0, - /* 700 - _0F_18_00 */ 0x2387, - /* 701 - _0F_18_01 */ 0x2388, - /* 702 - _0F_18_02 */ 0x2389, - /* 703 - _0F_18_03 */ 0x238a, - /* 704 - */ 0, - /* 705 - */ 0, - /* 706 - */ 0, - /* 707 - */ 0, - /* 708 - _0F_28 */ 0x238b, - /* 709 - _66_0F_28 */ 0x238c, - /* 70a - */ 0, - /* 70b - */ 0, - /* 70c - _V_0F_28 */ 0x4026, - /* 70d - _V_66_0F_28 */ 0x4027, - /* 70e - */ 0, - /* 70f - */ 0, - /* 710 - */ 0, - /* 711 - */ 0, - /* 712 - */ 0, - /* 713 - */ 0, - /* 714 - _0F_29 */ 0x238d, - /* 715 - _66_0F_29 */ 0x238e, - /* 716 - */ 0, - /* 717 - */ 0, - /* 718 - _V_0F_29 */ 0x4028, - /* 719 - _V_66_0F_29 */ 0x4029, - /* 71a - */ 0, - /* 71b - */ 0, - /* 71c - */ 0, - /* 71d - */ 0, - /* 71e - */ 0, - /* 71f - */ 0, - /* 720 - _0F_2A */ 0x238f, - /* 721 - _66_0F_2A */ 0x2390, - /* 722 - _F3_0F_2A */ 0x2391, - /* 723 - _F2_0F_2A */ 0x2392, - /* 724 - */ 0, - /* 725 - */ 0, - /* 726 - _V_F3_0F_2A */ 0x402a, - /* 727 - _V_F2_0F_2A */ 0x402b, - /* 728 - */ 0, - /* 729 - */ 0, - /* 72a - */ 0, - /* 72b - */ 0, - /* 72c - _0F_2B */ 0x2393, - /* 72d - _66_0F_2B */ 0x2394, - /* 72e - _F3_0F_2B */ 0x2395, - /* 72f - _F2_0F_2B */ 0x2396, - /* 730 - _V_0F_2B */ 0x402c, - /* 731 - _V_66_0F_2B */ 0x402d, - /* 732 - */ 0, - /* 733 - */ 0, - /* 734 - */ 0, - /* 735 - */ 0, - /* 736 - */ 0, - /* 737 - */ 0, - /* 738 - _0F_2C */ 0x2397, - /* 739 - _66_0F_2C */ 0x2398, - /* 73a - _F3_0F_2C */ 0x2399, - /* 73b - _F2_0F_2C */ 0x239a, - /* 73c - */ 0, - /* 73d - */ 0, - /* 73e - _V_F3_0F_2C */ 0x402e, - /* 73f - _V_F2_0F_2C */ 0x402f, - /* 740 - */ 0, - /* 741 - */ 0, - /* 742 - */ 0, - /* 743 - */ 0, - /* 744 - _0F_2D */ 0x239b, - /* 745 - _66_0F_2D */ 0x239c, - /* 746 - _F3_0F_2D */ 0x239d, - /* 747 - _F2_0F_2D */ 0x239e, - /* 748 - */ 0, - /* 749 - */ 0, - /* 74a - _V_F3_0F_2D */ 0x4030, - /* 74b - _V_F2_0F_2D */ 0x4031, - /* 74c - */ 0, - /* 74d - */ 0, - /* 74e - */ 0, - /* 74f - */ 0, - /* 750 - _0F_2E */ 0x239f, - /* 751 - _66_0F_2E */ 0x23a0, - /* 752 - */ 0, - /* 753 - */ 0, - /* 754 - _V_0F_2E */ 0x4032, - /* 755 - _V_66_0F_2E */ 0x4033, - /* 756 - */ 0, - /* 757 - */ 0, - /* 758 - */ 0, - /* 759 - */ 0, - /* 75a - */ 0, - /* 75b - */ 0, - /* 75c - _0F_2F */ 0x23a1, - /* 75d - _66_0F_2F */ 0x23a2, - /* 75e - */ 0, - /* 75f - */ 0, - /* 760 - _V_0F_2F */ 0x4034, - /* 761 - _V_66_0F_2F */ 0x4035, - /* 762 - */ 0, - /* 763 - */ 0, - /* 764 - */ 0, - /* 765 - */ 0, - /* 766 - */ 0, - /* 767 - */ 0, - /* 768 - _0F_38_00 */ 0xcf78, - /* 769 - _0F_38_01 */ 0xcf84, - /* 76a - _0F_38_02 */ 0xcf90, - /* 76b - _0F_38_03 */ 0xcf9c, - /* 76c - _0F_38_04 */ 0xcfa8, - /* 76d - _0F_38_05 */ 0xcfb4, - /* 76e - _0F_38_06 */ 0xcfc0, - /* 76f - _0F_38_07 */ 0xcfcc, - /* 770 - _0F_38_08 */ 0xcfd8, - /* 771 - _0F_38_09 */ 0xcfe4, - /* 772 - _0F_38_0A */ 0xcff0, - /* 773 - _0F_38_0B */ 0xcffc, - /* 774 - _0F_38_0C */ 0xd008, - /* 775 - _0F_38_0D */ 0xd014, - /* 776 - _0F_38_0E */ 0xd020, - /* 777 - _0F_38_0F */ 0xd02c, - /* 778 - _0F_38_10 */ 0xd038, - /* 779 - */ 0, - /* 77a - */ 0, - /* 77b - */ 0, - /* 77c - _0F_38_14 */ 0xd044, - /* 77d - _0F_38_15 */ 0xd050, - /* 77e - */ 0, - /* 77f - _0F_38_17 */ 0xd05c, - /* 780 - _0F_38_18 */ 0xd068, - /* 781 - _0F_38_19 */ 0xd074, - /* 782 - _0F_38_1A */ 0xd080, - /* 783 - */ 0, - /* 784 - _0F_38_1C */ 0xd08c, - /* 785 - _0F_38_1D */ 0xd098, - /* 786 - _0F_38_1E */ 0xd0a4, - /* 787 - */ 0, - /* 788 - _0F_38_20 */ 0xd0b0, - /* 789 - _0F_38_21 */ 0xd0bc, - /* 78a - _0F_38_22 */ 0xd0c8, - /* 78b - _0F_38_23 */ 0xd0d4, - /* 78c - _0F_38_24 */ 0xd0e0, - /* 78d - _0F_38_25 */ 0xd0ec, - /* 78e - */ 0, - /* 78f - */ 0, - /* 790 - _0F_38_28 */ 0xd0f8, - /* 791 - _0F_38_29 */ 0xd104, - /* 792 - _0F_38_2A */ 0xd110, - /* 793 - _0F_38_2B */ 0xd11c, - /* 794 - _0F_38_2C */ 0xd128, - /* 795 - _0F_38_2D */ 0xd134, - /* 796 - _0F_38_2E */ 0xd140, - /* 797 - _0F_38_2F */ 0xd14c, - /* 798 - _0F_38_30 */ 0xd158, - /* 799 - _0F_38_31 */ 0xd164, - /* 79a - _0F_38_32 */ 0xd170, - /* 79b - _0F_38_33 */ 0xd17c, - /* 79c - _0F_38_34 */ 0xd188, - /* 79d - _0F_38_35 */ 0xd194, - /* 79e - */ 0, - /* 79f - _0F_38_37 */ 0xd1a0, - /* 7a0 - _0F_38_38 */ 0xd1ac, - /* 7a1 - _0F_38_39 */ 0xd1b8, - /* 7a2 - _0F_38_3A */ 0xd1c4, - /* 7a3 - _0F_38_3B */ 0xd1d0, - /* 7a4 - _0F_38_3C */ 0xd1dc, - /* 7a5 - _0F_38_3D */ 0xd1e8, - /* 7a6 - _0F_38_3E */ 0xd1f4, - /* 7a7 - _0F_38_3F */ 0xd200, - /* 7a8 - _0F_38_40 */ 0xd20c, - /* 7a9 - _0F_38_41 */ 0xd218, - /* 7aa - */ 0, - /* 7ab - */ 0, - /* 7ac - */ 0, - /* 7ad - */ 0, - /* 7ae - */ 0, - /* 7af - */ 0, - /* 7b0 - */ 0, - /* 7b1 - */ 0, - /* 7b2 - */ 0, - /* 7b3 - */ 0, - /* 7b4 - */ 0, - /* 7b5 - */ 0, - /* 7b6 - */ 0, - /* 7b7 - */ 0, - /* 7b8 - */ 0, - /* 7b9 - */ 0, - /* 7ba - */ 0, - /* 7bb - */ 0, - /* 7bc - */ 0, - /* 7bd - */ 0, - /* 7be - */ 0, - /* 7bf - */ 0, - /* 7c0 - */ 0, - /* 7c1 - */ 0, - /* 7c2 - */ 0, - /* 7c3 - */ 0, - /* 7c4 - */ 0, - /* 7c5 - */ 0, - /* 7c6 - */ 0, - /* 7c7 - */ 0, - /* 7c8 - */ 0, - /* 7c9 - */ 0, - /* 7ca - */ 0, - /* 7cb - */ 0, - /* 7cc - */ 0, - /* 7cd - */ 0, - /* 7ce - */ 0, - /* 7cf - */ 0, - /* 7d0 - */ 0, - /* 7d1 - */ 0, - /* 7d2 - */ 0, - /* 7d3 - */ 0, - /* 7d4 - */ 0, - /* 7d5 - */ 0, - /* 7d6 - */ 0, - /* 7d7 - */ 0, - /* 7d8 - */ 0, - /* 7d9 - */ 0, - /* 7da - */ 0, - /* 7db - */ 0, - /* 7dc - */ 0, - /* 7dd - */ 0, - /* 7de - */ 0, - /* 7df - */ 0, - /* 7e0 - */ 0, - /* 7e1 - */ 0, - /* 7e2 - */ 0, - /* 7e3 - */ 0, - /* 7e4 - */ 0, - /* 7e5 - */ 0, - /* 7e6 - */ 0, - /* 7e7 - */ 0, - /* 7e8 - _0F_38_80 */ 0xd224, - /* 7e9 - _0F_38_81 */ 0xd230, - /* 7ea - _0F_38_82 */ 0xd23c, - /* 7eb - */ 0, - /* 7ec - */ 0, - /* 7ed - */ 0, - /* 7ee - */ 0, - /* 7ef - */ 0, - /* 7f0 - */ 0, - /* 7f1 - */ 0, - /* 7f2 - */ 0, - /* 7f3 - */ 0, - /* 7f4 - */ 0, - /* 7f5 - */ 0, - /* 7f6 - */ 0, - /* 7f7 - */ 0, - /* 7f8 - */ 0, - /* 7f9 - */ 0, - /* 7fa - */ 0, - /* 7fb - */ 0, - /* 7fc - */ 0, - /* 7fd - */ 0, - /* 7fe - _0F_38_96 */ 0xd248, - /* 7ff - _0F_38_97 */ 0xd254, - /* 800 - _0F_38_98 */ 0xd260, - /* 801 - _0F_38_99 */ 0xd26c, - /* 802 - _0F_38_9A */ 0xd278, - /* 803 - _0F_38_9B */ 0xd284, - /* 804 - _0F_38_9C */ 0xd290, - /* 805 - _0F_38_9D */ 0xd29c, - /* 806 - _0F_38_9E */ 0xd2a8, - /* 807 - _0F_38_9F */ 0xd2b4, - /* 808 - */ 0, - /* 809 - */ 0, - /* 80a - */ 0, - /* 80b - */ 0, - /* 80c - */ 0, - /* 80d - */ 0, - /* 80e - _0F_38_A6 */ 0xd2c0, - /* 80f - _0F_38_A7 */ 0xd2cc, - /* 810 - _0F_38_A8 */ 0xd2d8, - /* 811 - _0F_38_A9 */ 0xd2e4, - /* 812 - _0F_38_AA */ 0xd2f0, - /* 813 - _0F_38_AB */ 0xd2fc, - /* 814 - _0F_38_AC */ 0xd308, - /* 815 - _0F_38_AD */ 0xd314, - /* 816 - _0F_38_AE */ 0xd320, - /* 817 - _0F_38_AF */ 0xd32c, - /* 818 - */ 0, - /* 819 - */ 0, - /* 81a - */ 0, - /* 81b - */ 0, - /* 81c - */ 0, - /* 81d - */ 0, - /* 81e - _0F_38_B6 */ 0xd338, - /* 81f - _0F_38_B7 */ 0xd344, - /* 820 - _0F_38_B8 */ 0xd350, - /* 821 - _0F_38_B9 */ 0xd35c, - /* 822 - _0F_38_BA */ 0xd368, - /* 823 - _0F_38_BB */ 0xd374, - /* 824 - _0F_38_BC */ 0xd380, - /* 825 - _0F_38_BD */ 0xd38c, - /* 826 - _0F_38_BE */ 0xd398, - /* 827 - _0F_38_BF */ 0xd3a4, - /* 828 - */ 0, - /* 829 - */ 0, - /* 82a - */ 0, - /* 82b - */ 0, - /* 82c - */ 0, - /* 82d - */ 0, - /* 82e - */ 0, - /* 82f - */ 0, - /* 830 - */ 0, - /* 831 - */ 0, - /* 832 - */ 0, - /* 833 - */ 0, - /* 834 - */ 0, - /* 835 - */ 0, - /* 836 - */ 0, - /* 837 - */ 0, - /* 838 - */ 0, - /* 839 - */ 0, - /* 83a - */ 0, - /* 83b - */ 0, - /* 83c - */ 0, - /* 83d - */ 0, - /* 83e - */ 0, - /* 83f - */ 0, - /* 840 - */ 0, - /* 841 - */ 0, - /* 842 - */ 0, - /* 843 - _0F_38_DB */ 0xd3b0, - /* 844 - _0F_38_DC */ 0xd3bc, - /* 845 - _0F_38_DD */ 0xd3c8, - /* 846 - _0F_38_DE */ 0xd3d4, - /* 847 - _0F_38_DF */ 0xd3e0, - /* 848 - */ 0, - /* 849 - */ 0, - /* 84a - */ 0, - /* 84b - */ 0, - /* 84c - */ 0, - /* 84d - */ 0, - /* 84e - */ 0, - /* 84f - */ 0, - /* 850 - */ 0, - /* 851 - */ 0, - /* 852 - */ 0, - /* 853 - */ 0, - /* 854 - */ 0, - /* 855 - */ 0, - /* 856 - */ 0, - /* 857 - */ 0, - /* 858 - _0F_38_F0 */ 0xd3ec, - /* 859 - _0F_38_F1 */ 0xd3f8, - /* 85a - */ 0, - /* 85b - */ 0, - /* 85c - */ 0, - /* 85d - */ 0, - /* 85e - */ 0, - /* 85f - */ 0, - /* 860 - */ 0, - /* 861 - */ 0, - /* 862 - */ 0, - /* 863 - */ 0, - /* 864 - */ 0, - /* 865 - */ 0, - /* 866 - */ 0, - /* 867 - */ 0, - /* 868 - */ 0, - /* 869 - */ 0, - /* 86a - */ 0, - /* 86b - */ 0, - /* 86c - _0F_3A_04 */ 0xd404, - /* 86d - _0F_3A_05 */ 0xd410, - /* 86e - _0F_3A_06 */ 0xd41c, - /* 86f - */ 0, - /* 870 - _0F_3A_08 */ 0xd428, - /* 871 - _0F_3A_09 */ 0xd434, - /* 872 - _0F_3A_0A */ 0xd440, - /* 873 - _0F_3A_0B */ 0xd44c, - /* 874 - _0F_3A_0C */ 0xd458, - /* 875 - _0F_3A_0D */ 0xd464, - /* 876 - _0F_3A_0E */ 0xd470, - /* 877 - _0F_3A_0F */ 0xd47c, - /* 878 - */ 0, - /* 879 - */ 0, - /* 87a - */ 0, - /* 87b - */ 0, - /* 87c - _0F_3A_14 */ 0xd488, - /* 87d - _0F_3A_15 */ 0xd494, - /* 87e - _0F_3A_16 */ 0xd4a0, - /* 87f - _0F_3A_17 */ 0xd4ac, - /* 880 - _0F_3A_18 */ 0xd4b8, - /* 881 - _0F_3A_19 */ 0xd4c4, - /* 882 - */ 0, - /* 883 - */ 0, - /* 884 - */ 0, - /* 885 - */ 0, - /* 886 - */ 0, - /* 887 - */ 0, - /* 888 - _0F_3A_20 */ 0xd4d0, - /* 889 - _0F_3A_21 */ 0xd4dc, - /* 88a - _0F_3A_22 */ 0xd4e8, - /* 88b - */ 0, - /* 88c - */ 0, - /* 88d - */ 0, - /* 88e - */ 0, - /* 88f - */ 0, - /* 890 - */ 0, - /* 891 - */ 0, - /* 892 - */ 0, - /* 893 - */ 0, - /* 894 - */ 0, - /* 895 - */ 0, - /* 896 - */ 0, - /* 897 - */ 0, - /* 898 - */ 0, - /* 899 - */ 0, - /* 89a - */ 0, - /* 89b - */ 0, - /* 89c - */ 0, - /* 89d - */ 0, - /* 89e - */ 0, - /* 89f - */ 0, - /* 8a0 - */ 0, - /* 8a1 - */ 0, - /* 8a2 - */ 0, - /* 8a3 - */ 0, - /* 8a4 - */ 0, - /* 8a5 - */ 0, - /* 8a6 - */ 0, - /* 8a7 - */ 0, - /* 8a8 - _0F_3A_40 */ 0xd4f4, - /* 8a9 - _0F_3A_41 */ 0xd500, - /* 8aa - _0F_3A_42 */ 0xd50c, - /* 8ab - */ 0, - /* 8ac - _0F_3A_44 */ 0xd518, - /* 8ad - */ 0, - /* 8ae - */ 0, - /* 8af - */ 0, - /* 8b0 - */ 0, - /* 8b1 - */ 0, - /* 8b2 - _0F_3A_4A */ 0xd524, - /* 8b3 - _0F_3A_4B */ 0xd530, - /* 8b4 - _0F_3A_4C */ 0xd53c, - /* 8b5 - */ 0, - /* 8b6 - */ 0, - /* 8b7 - */ 0, - /* 8b8 - */ 0, - /* 8b9 - */ 0, - /* 8ba - */ 0, - /* 8bb - */ 0, - /* 8bc - */ 0, - /* 8bd - */ 0, - /* 8be - */ 0, - /* 8bf - */ 0, - /* 8c0 - */ 0, - /* 8c1 - */ 0, - /* 8c2 - */ 0, - /* 8c3 - */ 0, - /* 8c4 - */ 0, - /* 8c5 - */ 0, - /* 8c6 - */ 0, - /* 8c7 - */ 0, - /* 8c8 - _0F_3A_60 */ 0xd548, - /* 8c9 - _0F_3A_61 */ 0xd554, - /* 8ca - _0F_3A_62 */ 0xd560, - /* 8cb - _0F_3A_63 */ 0xd56c, - /* 8cc - */ 0, - /* 8cd - */ 0, - /* 8ce - */ 0, - /* 8cf - */ 0, - /* 8d0 - */ 0, - /* 8d1 - */ 0, - /* 8d2 - */ 0, - /* 8d3 - */ 0, - /* 8d4 - */ 0, - /* 8d5 - */ 0, - /* 8d6 - */ 0, - /* 8d7 - */ 0, - /* 8d8 - */ 0, - /* 8d9 - */ 0, - /* 8da - */ 0, - /* 8db - */ 0, - /* 8dc - */ 0, - /* 8dd - */ 0, - /* 8de - */ 0, - /* 8df - */ 0, - /* 8e0 - */ 0, - /* 8e1 - */ 0, - /* 8e2 - */ 0, - /* 8e3 - */ 0, - /* 8e4 - */ 0, - /* 8e5 - */ 0, - /* 8e6 - */ 0, - /* 8e7 - */ 0, - /* 8e8 - */ 0, - /* 8e9 - */ 0, - /* 8ea - */ 0, - /* 8eb - */ 0, - /* 8ec - */ 0, - /* 8ed - */ 0, - /* 8ee - */ 0, - /* 8ef - */ 0, - /* 8f0 - */ 0, - /* 8f1 - */ 0, - /* 8f2 - */ 0, - /* 8f3 - */ 0, - /* 8f4 - */ 0, - /* 8f5 - */ 0, - /* 8f6 - */ 0, - /* 8f7 - */ 0, - /* 8f8 - */ 0, - /* 8f9 - */ 0, - /* 8fa - */ 0, - /* 8fb - */ 0, - /* 8fc - */ 0, - /* 8fd - */ 0, - /* 8fe - */ 0, - /* 8ff - */ 0, - /* 900 - */ 0, - /* 901 - */ 0, - /* 902 - */ 0, - /* 903 - */ 0, - /* 904 - */ 0, - /* 905 - */ 0, - /* 906 - */ 0, - /* 907 - */ 0, - /* 908 - */ 0, - /* 909 - */ 0, - /* 90a - */ 0, - /* 90b - */ 0, - /* 90c - */ 0, - /* 90d - */ 0, - /* 90e - */ 0, - /* 90f - */ 0, - /* 910 - */ 0, - /* 911 - */ 0, - /* 912 - */ 0, - /* 913 - */ 0, - /* 914 - */ 0, - /* 915 - */ 0, - /* 916 - */ 0, - /* 917 - */ 0, - /* 918 - */ 0, - /* 919 - */ 0, - /* 91a - */ 0, - /* 91b - */ 0, - /* 91c - */ 0, - /* 91d - */ 0, - /* 91e - */ 0, - /* 91f - */ 0, - /* 920 - */ 0, - /* 921 - */ 0, - /* 922 - */ 0, - /* 923 - */ 0, - /* 924 - */ 0, - /* 925 - */ 0, - /* 926 - */ 0, - /* 927 - */ 0, - /* 928 - */ 0, - /* 929 - */ 0, - /* 92a - */ 0, - /* 92b - */ 0, - /* 92c - */ 0, - /* 92d - */ 0, - /* 92e - */ 0, - /* 92f - */ 0, - /* 930 - */ 0, - /* 931 - */ 0, - /* 932 - */ 0, - /* 933 - */ 0, - /* 934 - */ 0, - /* 935 - */ 0, - /* 936 - */ 0, - /* 937 - */ 0, - /* 938 - */ 0, - /* 939 - */ 0, - /* 93a - */ 0, - /* 93b - */ 0, - /* 93c - */ 0, - /* 93d - */ 0, - /* 93e - */ 0, - /* 93f - */ 0, - /* 940 - */ 0, - /* 941 - */ 0, - /* 942 - */ 0, - /* 943 - */ 0, - /* 944 - */ 0, - /* 945 - */ 0, - /* 946 - */ 0, - /* 947 - _0F_3A_DF */ 0xd578, - /* 948 - */ 0, - /* 949 - */ 0, - /* 94a - */ 0, - /* 94b - */ 0, - /* 94c - */ 0, - /* 94d - */ 0, - /* 94e - */ 0, - /* 94f - */ 0, - /* 950 - */ 0, - /* 951 - */ 0, - /* 952 - */ 0, - /* 953 - */ 0, - /* 954 - */ 0, - /* 955 - */ 0, - /* 956 - */ 0, - /* 957 - */ 0, - /* 958 - */ 0, - /* 959 - */ 0, - /* 95a - */ 0, - /* 95b - */ 0, - /* 95c - */ 0, - /* 95d - */ 0, - /* 95e - */ 0, - /* 95f - */ 0, - /* 960 - */ 0, - /* 961 - */ 0, - /* 962 - */ 0, - /* 963 - */ 0, - /* 964 - */ 0, - /* 965 - */ 0, - /* 966 - */ 0, - /* 967 - */ 0, - /* 968 - _0F_50 */ 0x23a3, - /* 969 - _66_0F_50 */ 0x23a4, - /* 96a - */ 0, - /* 96b - */ 0, - /* 96c - _V_0F_50 */ 0x4036, - /* 96d - _V_66_0F_50 */ 0x4037, - /* 96e - */ 0, - /* 96f - */ 0, - /* 970 - */ 0, - /* 971 - */ 0, - /* 972 - */ 0, - /* 973 - */ 0, - /* 974 - _0F_51 */ 0x23a5, - /* 975 - _66_0F_51 */ 0x23a6, - /* 976 - _F3_0F_51 */ 0x23a7, - /* 977 - _F2_0F_51 */ 0x23a8, - /* 978 - _V_0F_51 */ 0x4038, - /* 979 - _V_66_0F_51 */ 0x4039, - /* 97a - _V_F3_0F_51 */ 0x403a, - /* 97b - _V_F2_0F_51 */ 0x403b, - /* 97c - */ 0, - /* 97d - */ 0, - /* 97e - */ 0, - /* 97f - */ 0, - /* 980 - _0F_52 */ 0x23a9, - /* 981 - */ 0, - /* 982 - _F3_0F_52 */ 0x23aa, - /* 983 - */ 0, - /* 984 - _V_0F_52 */ 0x403c, - /* 985 - */ 0, - /* 986 - _V_F3_0F_52 */ 0x403d, - /* 987 - */ 0, - /* 988 - */ 0, - /* 989 - */ 0, - /* 98a - */ 0, - /* 98b - */ 0, - /* 98c - _0F_53 */ 0x23ab, - /* 98d - */ 0, - /* 98e - _F3_0F_53 */ 0x23ac, - /* 98f - */ 0, - /* 990 - _V_0F_53 */ 0x403e, - /* 991 - */ 0, - /* 992 - _V_F3_0F_53 */ 0x403f, - /* 993 - */ 0, - /* 994 - */ 0, - /* 995 - */ 0, - /* 996 - */ 0, - /* 997 - */ 0, - /* 998 - _0F_54 */ 0x23ad, - /* 999 - _66_0F_54 */ 0x23ae, - /* 99a - */ 0, - /* 99b - */ 0, - /* 99c - _V_0F_54 */ 0x4040, - /* 99d - _V_66_0F_54 */ 0x4041, - /* 99e - */ 0, - /* 99f - */ 0, - /* 9a0 - */ 0, - /* 9a1 - */ 0, - /* 9a2 - */ 0, - /* 9a3 - */ 0, - /* 9a4 - _0F_55 */ 0x23af, - /* 9a5 - _66_0F_55 */ 0x23b0, - /* 9a6 - */ 0, - /* 9a7 - */ 0, - /* 9a8 - _V_0F_55 */ 0x4042, - /* 9a9 - _V_66_0F_55 */ 0x4043, - /* 9aa - */ 0, - /* 9ab - */ 0, - /* 9ac - */ 0, - /* 9ad - */ 0, - /* 9ae - */ 0, - /* 9af - */ 0, - /* 9b0 - _0F_56 */ 0x23b1, - /* 9b1 - _66_0F_56 */ 0x23b2, - /* 9b2 - */ 0, - /* 9b3 - */ 0, - /* 9b4 - _V_0F_56 */ 0x4044, - /* 9b5 - _V_66_0F_56 */ 0x4045, - /* 9b6 - */ 0, - /* 9b7 - */ 0, - /* 9b8 - */ 0, - /* 9b9 - */ 0, - /* 9ba - */ 0, - /* 9bb - */ 0, - /* 9bc - _0F_57 */ 0x23b3, - /* 9bd - _66_0F_57 */ 0x23b4, - /* 9be - */ 0, - /* 9bf - */ 0, - /* 9c0 - _V_0F_57 */ 0x4046, - /* 9c1 - _V_66_0F_57 */ 0x4047, - /* 9c2 - */ 0, - /* 9c3 - */ 0, - /* 9c4 - */ 0, - /* 9c5 - */ 0, - /* 9c6 - */ 0, - /* 9c7 - */ 0, - /* 9c8 - _0F_58 */ 0x23b5, - /* 9c9 - _66_0F_58 */ 0x23b6, - /* 9ca - _F3_0F_58 */ 0x23b7, - /* 9cb - _F2_0F_58 */ 0x23b8, - /* 9cc - _V_0F_58 */ 0x4048, - /* 9cd - _V_66_0F_58 */ 0x4049, - /* 9ce - _V_F3_0F_58 */ 0x404a, - /* 9cf - _V_F2_0F_58 */ 0x404b, - /* 9d0 - */ 0, - /* 9d1 - */ 0, - /* 9d2 - */ 0, - /* 9d3 - */ 0, - /* 9d4 - _0F_59 */ 0x23b9, - /* 9d5 - _66_0F_59 */ 0x23ba, - /* 9d6 - _F3_0F_59 */ 0x23bb, - /* 9d7 - _F2_0F_59 */ 0x23bc, - /* 9d8 - _V_0F_59 */ 0x404c, - /* 9d9 - _V_66_0F_59 */ 0x404d, - /* 9da - _V_F3_0F_59 */ 0x404e, - /* 9db - _V_F2_0F_59 */ 0x404f, - /* 9dc - */ 0, - /* 9dd - */ 0, - /* 9de - */ 0, - /* 9df - */ 0, - /* 9e0 - _0F_5A */ 0x23bd, - /* 9e1 - _66_0F_5A */ 0x23be, - /* 9e2 - _F3_0F_5A */ 0x23bf, - /* 9e3 - _F2_0F_5A */ 0x23c0, - /* 9e4 - _V_0F_5A */ 0x4050, - /* 9e5 - _V_66_0F_5A */ 0x4051, - /* 9e6 - _V_F3_0F_5A */ 0x4052, - /* 9e7 - _V_F2_0F_5A */ 0x4053, - /* 9e8 - */ 0, - /* 9e9 - */ 0, - /* 9ea - */ 0, - /* 9eb - */ 0, - /* 9ec - _0F_5B */ 0x23c1, - /* 9ed - _66_0F_5B */ 0x23c2, - /* 9ee - _F3_0F_5B */ 0x23c3, - /* 9ef - */ 0, - /* 9f0 - _V_0F_5B */ 0x4054, - /* 9f1 - _V_66_0F_5B */ 0x4055, - /* 9f2 - _V_F3_0F_5B */ 0x4056, - /* 9f3 - */ 0, - /* 9f4 - */ 0, - /* 9f5 - */ 0, - /* 9f6 - */ 0, - /* 9f7 - */ 0, - /* 9f8 - _0F_5C */ 0x23c4, - /* 9f9 - _66_0F_5C */ 0x23c5, - /* 9fa - _F3_0F_5C */ 0x23c6, - /* 9fb - _F2_0F_5C */ 0x23c7, - /* 9fc - _V_0F_5C */ 0x4057, - /* 9fd - _V_66_0F_5C */ 0x4058, - /* 9fe - _V_F3_0F_5C */ 0x4059, - /* 9ff - _V_F2_0F_5C */ 0x405a, - /* a00 - */ 0, - /* a01 - */ 0, - /* a02 - */ 0, - /* a03 - */ 0, - /* a04 - _0F_5D */ 0x23c8, - /* a05 - _66_0F_5D */ 0x23c9, - /* a06 - _F3_0F_5D */ 0x23ca, - /* a07 - _F2_0F_5D */ 0x23cb, - /* a08 - _V_0F_5D */ 0x405b, - /* a09 - _V_66_0F_5D */ 0x405c, - /* a0a - _V_F3_0F_5D */ 0x405d, - /* a0b - _V_F2_0F_5D */ 0x405e, - /* a0c - */ 0, - /* a0d - */ 0, - /* a0e - */ 0, - /* a0f - */ 0, - /* a10 - _0F_5E */ 0x23cc, - /* a11 - _66_0F_5E */ 0x23cd, - /* a12 - _F3_0F_5E */ 0x23ce, - /* a13 - _F2_0F_5E */ 0x23cf, - /* a14 - _V_0F_5E */ 0x405f, - /* a15 - _V_66_0F_5E */ 0x4060, - /* a16 - _V_F3_0F_5E */ 0x4061, - /* a17 - _V_F2_0F_5E */ 0x4062, - /* a18 - */ 0, - /* a19 - */ 0, - /* a1a - */ 0, - /* a1b - */ 0, - /* a1c - _0F_5F */ 0x23d0, - /* a1d - _66_0F_5F */ 0x23d1, - /* a1e - _F3_0F_5F */ 0x23d2, - /* a1f - _F2_0F_5F */ 0x23d3, - /* a20 - _V_0F_5F */ 0x4063, - /* a21 - _V_66_0F_5F */ 0x4064, - /* a22 - _V_F3_0F_5F */ 0x4065, - /* a23 - _V_F2_0F_5F */ 0x4066, - /* a24 - */ 0, - /* a25 - */ 0, - /* a26 - */ 0, - /* a27 - */ 0, - /* a28 - _0F_60 */ 0x23d4, - /* a29 - _66_0F_60 */ 0x23d5, - /* a2a - */ 0, - /* a2b - */ 0, - /* a2c - */ 0, - /* a2d - _V_66_0F_60 */ 0x4067, - /* a2e - */ 0, - /* a2f - */ 0, - /* a30 - */ 0, - /* a31 - */ 0, - /* a32 - */ 0, - /* a33 - */ 0, - /* a34 - _0F_61 */ 0x23d6, - /* a35 - _66_0F_61 */ 0x23d7, - /* a36 - */ 0, - /* a37 - */ 0, - /* a38 - */ 0, - /* a39 - _V_66_0F_61 */ 0x4068, - /* a3a - */ 0, - /* a3b - */ 0, - /* a3c - */ 0, - /* a3d - */ 0, - /* a3e - */ 0, - /* a3f - */ 0, - /* a40 - _0F_62 */ 0x23d8, - /* a41 - _66_0F_62 */ 0x23d9, - /* a42 - */ 0, - /* a43 - */ 0, - /* a44 - */ 0, - /* a45 - _V_66_0F_62 */ 0x4069, - /* a46 - */ 0, - /* a47 - */ 0, - /* a48 - */ 0, - /* a49 - */ 0, - /* a4a - */ 0, - /* a4b - */ 0, - /* a4c - _0F_63 */ 0x23da, - /* a4d - _66_0F_63 */ 0x23db, - /* a4e - */ 0, - /* a4f - */ 0, - /* a50 - */ 0, - /* a51 - _V_66_0F_63 */ 0x406a, - /* a52 - */ 0, - /* a53 - */ 0, - /* a54 - */ 0, - /* a55 - */ 0, - /* a56 - */ 0, - /* a57 - */ 0, - /* a58 - _0F_64 */ 0x23dc, - /* a59 - _66_0F_64 */ 0x23dd, - /* a5a - */ 0, - /* a5b - */ 0, - /* a5c - */ 0, - /* a5d - _V_66_0F_64 */ 0x406b, - /* a5e - */ 0, - /* a5f - */ 0, - /* a60 - */ 0, - /* a61 - */ 0, - /* a62 - */ 0, - /* a63 - */ 0, - /* a64 - _0F_65 */ 0x23de, - /* a65 - _66_0F_65 */ 0x23df, - /* a66 - */ 0, - /* a67 - */ 0, - /* a68 - */ 0, - /* a69 - _V_66_0F_65 */ 0x406c, - /* a6a - */ 0, - /* a6b - */ 0, - /* a6c - */ 0, - /* a6d - */ 0, - /* a6e - */ 0, - /* a6f - */ 0, - /* a70 - _0F_66 */ 0x23e0, - /* a71 - _66_0F_66 */ 0x23e1, - /* a72 - */ 0, - /* a73 - */ 0, - /* a74 - */ 0, - /* a75 - _V_66_0F_66 */ 0x406d, - /* a76 - */ 0, - /* a77 - */ 0, - /* a78 - */ 0, - /* a79 - */ 0, - /* a7a - */ 0, - /* a7b - */ 0, - /* a7c - _0F_67 */ 0x23e2, - /* a7d - _66_0F_67 */ 0x23e3, - /* a7e - */ 0, - /* a7f - */ 0, - /* a80 - */ 0, - /* a81 - _V_66_0F_67 */ 0x406e, - /* a82 - */ 0, - /* a83 - */ 0, - /* a84 - */ 0, - /* a85 - */ 0, - /* a86 - */ 0, - /* a87 - */ 0, - /* a88 - _0F_68 */ 0x23e4, - /* a89 - _66_0F_68 */ 0x23e5, - /* a8a - */ 0, - /* a8b - */ 0, - /* a8c - */ 0, - /* a8d - _V_66_0F_68 */ 0x406f, - /* a8e - */ 0, - /* a8f - */ 0, - /* a90 - */ 0, - /* a91 - */ 0, - /* a92 - */ 0, - /* a93 - */ 0, - /* a94 - _0F_69 */ 0x23e6, - /* a95 - _66_0F_69 */ 0x23e7, - /* a96 - */ 0, - /* a97 - */ 0, - /* a98 - */ 0, - /* a99 - _V_66_0F_69 */ 0x4070, - /* a9a - */ 0, - /* a9b - */ 0, - /* a9c - */ 0, - /* a9d - */ 0, - /* a9e - */ 0, - /* a9f - */ 0, - /* aa0 - _0F_6A */ 0x23e8, - /* aa1 - _66_0F_6A */ 0x23e9, - /* aa2 - */ 0, - /* aa3 - */ 0, - /* aa4 - */ 0, - /* aa5 - _V_66_0F_6A */ 0x4071, - /* aa6 - */ 0, - /* aa7 - */ 0, - /* aa8 - */ 0, - /* aa9 - */ 0, - /* aaa - */ 0, - /* aab - */ 0, - /* aac - _0F_6B */ 0x23ea, - /* aad - _66_0F_6B */ 0x23eb, - /* aae - */ 0, - /* aaf - */ 0, - /* ab0 - */ 0, - /* ab1 - _V_66_0F_6B */ 0x4072, - /* ab2 - */ 0, - /* ab3 - */ 0, - /* ab4 - */ 0, - /* ab5 - */ 0, - /* ab6 - */ 0, - /* ab7 - */ 0, - /* ab8 - */ 0, - /* ab9 - _66_0F_6C */ 0x23ec, - /* aba - */ 0, - /* abb - */ 0, - /* abc - */ 0, - /* abd - _V_66_0F_6C */ 0x4073, - /* abe - */ 0, - /* abf - */ 0, - /* ac0 - */ 0, - /* ac1 - */ 0, - /* ac2 - */ 0, - /* ac3 - */ 0, - /* ac4 - */ 0, - /* ac5 - _66_0F_6D */ 0x23ed, - /* ac6 - */ 0, - /* ac7 - */ 0, - /* ac8 - */ 0, - /* ac9 - _V_66_0F_6D */ 0x4074, - /* aca - */ 0, - /* acb - */ 0, - /* acc - */ 0, - /* acd - */ 0, - /* ace - */ 0, - /* acf - */ 0, - /* ad0 - _0F_6E */ 0x4075, - /* ad1 - _66_0F_6E */ 0x4076, - /* ad2 - */ 0, - /* ad3 - */ 0, - /* ad4 - */ 0, - /* ad5 - _V_66_0F_6E */ 0x4077, - /* ad6 - */ 0, - /* ad7 - */ 0, - /* ad8 - */ 0, - /* ad9 - */ 0, - /* ada - */ 0, - /* adb - */ 0, - /* adc - _0F_6F */ 0x23ee, - /* add - _66_0F_6F */ 0x23ef, - /* ade - _F3_0F_6F */ 0x23f0, - /* adf - */ 0, - /* ae0 - */ 0, - /* ae1 - _V_66_0F_6F */ 0x4078, - /* ae2 - _V_F3_0F_6F */ 0x4079, - /* ae3 - */ 0, - /* ae4 - */ 0, - /* ae5 - */ 0, - /* ae6 - */ 0, - /* ae7 - */ 0, - /* ae8 - _0F_70 */ 0x407a, - /* ae9 - _66_0F_70 */ 0x407b, - /* aea - _F3_0F_70 */ 0x407c, - /* aeb - _F2_0F_70 */ 0x407d, - /* aec - */ 0, - /* aed - _V_66_0F_70 */ 0x407e, - /* aee - _V_F3_0F_70 */ 0x407f, - /* aef - _V_F2_0F_70 */ 0x4080, - /* af0 - */ 0, - /* af1 - */ 0, - /* af2 - */ 0, - /* af3 - */ 0, - /* af4 - */ 0, - /* af5 - */ 0, - /* af6 - _0F_71_02 */ 0xd584, - /* af7 - */ 0, - /* af8 - _0F_71_04 */ 0xd590, - /* af9 - */ 0, - /* afa - _0F_71_06 */ 0xd59c, - /* afb - */ 0, - /* afc - */ 0, - /* afd - */ 0, - /* afe - _0F_72_02 */ 0xd5a8, - /* aff - */ 0, - /* b00 - _0F_72_04 */ 0xd5b4, - /* b01 - */ 0, - /* b02 - _0F_72_06 */ 0xd5c0, - /* b03 - */ 0, - /* b04 - */ 0, - /* b05 - */ 0, - /* b06 - _0F_73_02 */ 0xd5cc, - /* b07 - _0F_73_03 */ 0xd5d8, - /* b08 - */ 0, - /* b09 - */ 0, - /* b0a - _0F_73_06 */ 0xd5e4, - /* b0b - _0F_73_07 */ 0xd5f0, - /* b0c - _0F_74 */ 0x23f1, - /* b0d - _66_0F_74 */ 0x23f2, - /* b0e - */ 0, - /* b0f - */ 0, - /* b10 - */ 0, - /* b11 - _V_66_0F_74 */ 0x4081, - /* b12 - */ 0, - /* b13 - */ 0, - /* b14 - */ 0, - /* b15 - */ 0, - /* b16 - */ 0, - /* b17 - */ 0, - /* b18 - _0F_75 */ 0x23f3, - /* b19 - _66_0F_75 */ 0x23f4, - /* b1a - */ 0, - /* b1b - */ 0, - /* b1c - */ 0, - /* b1d - _V_66_0F_75 */ 0x4082, - /* b1e - */ 0, - /* b1f - */ 0, - /* b20 - */ 0, - /* b21 - */ 0, - /* b22 - */ 0, - /* b23 - */ 0, - /* b24 - _0F_76 */ 0x23f5, - /* b25 - _66_0F_76 */ 0x23f6, - /* b26 - */ 0, - /* b27 - */ 0, - /* b28 - */ 0, - /* b29 - _V_66_0F_76 */ 0x4083, - /* b2a - */ 0, - /* b2b - */ 0, - /* b2c - */ 0, - /* b2d - */ 0, - /* b2e - */ 0, - /* b2f - */ 0, - /* b30 - _0F_77 */ 0x23f7, - /* b31 - */ 0, - /* b32 - */ 0, - /* b33 - */ 0, - /* b34 - _V_0F_77 */ 0x4084, - /* b35 - */ 0, - /* b36 - */ 0, - /* b37 - */ 0, - /* b38 - */ 0, - /* b39 - */ 0, - /* b3a - */ 0, - /* b3b - */ 0, - /* b3c - _0F_78 */ 0x23f8, - /* b3d - _66_0F_78 */ 0x4085, - /* b3e - */ 0, - /* b3f - _F2_0F_78 */ 0x4086, - /* b40 - */ 0, - /* b41 - */ 0, - /* b42 - */ 0, - /* b43 - */ 0, - /* b44 - */ 0, - /* b45 - */ 0, - /* b46 - */ 0, - /* b47 - */ 0, - /* b48 - _0F_79 */ 0x23f9, - /* b49 - _66_0F_79 */ 0x23fa, - /* b4a - */ 0, - /* b4b - _F2_0F_79 */ 0x23fb, - /* b4c - */ 0, - /* b4d - */ 0, - /* b4e - */ 0, - /* b4f - */ 0, - /* b50 - */ 0, - /* b51 - */ 0, - /* b52 - */ 0, - /* b53 - */ 0, - /* b54 - */ 0, - /* b55 - */ 0, - /* b56 - */ 0, - /* b57 - */ 0, - /* b58 - */ 0, - /* b59 - */ 0, - /* b5a - */ 0, - /* b5b - */ 0, - /* b5c - */ 0, - /* b5d - */ 0, - /* b5e - */ 0, - /* b5f - */ 0, - /* b60 - */ 0, - /* b61 - */ 0, - /* b62 - */ 0, - /* b63 - */ 0, - /* b64 - */ 0, - /* b65 - */ 0, - /* b66 - */ 0, - /* b67 - */ 0, - /* b68 - */ 0, - /* b69 - */ 0, - /* b6a - */ 0, - /* b6b - */ 0, - /* b6c - */ 0, - /* b6d - */ 0, - /* b6e - */ 0, - /* b6f - */ 0, - /* b70 - */ 0, - /* b71 - */ 0, - /* b72 - */ 0, - /* b73 - */ 0, - /* b74 - */ 0, - /* b75 - */ 0, - /* b76 - */ 0, - /* b77 - */ 0, - /* b78 - */ 0, - /* b79 - */ 0, - /* b7a - */ 0, - /* b7b - */ 0, - /* b7c - */ 0, - /* b7d - */ 0, - /* b7e - */ 0, - /* b7f - */ 0, - /* b80 - */ 0, - /* b81 - */ 0, - /* b82 - */ 0, - /* b83 - */ 0, - /* b84 - _0F_7A_30 */ 0x23fc, - /* b85 - _0F_7A_31 */ 0x23fd, - /* b86 - */ 0, - /* b87 - */ 0, - /* b88 - */ 0, - /* b89 - */ 0, - /* b8a - */ 0, - /* b8b - */ 0, - /* b8c - */ 0, - /* b8d - */ 0, - /* b8e - */ 0, - /* b8f - */ 0, - /* b90 - */ 0, - /* b91 - */ 0, - /* b92 - */ 0, - /* b93 - */ 0, - /* b94 - */ 0, - /* b95 - */ 0, - /* b96 - */ 0, - /* b97 - */ 0, - /* b98 - */ 0, - /* b99 - */ 0, - /* b9a - */ 0, - /* b9b - */ 0, - /* b9c - */ 0, - /* b9d - */ 0, - /* b9e - */ 0, - /* b9f - */ 0, - /* ba0 - */ 0, - /* ba1 - */ 0, - /* ba2 - */ 0, - /* ba3 - */ 0, - /* ba4 - */ 0, - /* ba5 - */ 0, - /* ba6 - */ 0, - /* ba7 - */ 0, - /* ba8 - */ 0, - /* ba9 - */ 0, - /* baa - */ 0, - /* bab - */ 0, - /* bac - */ 0, - /* bad - */ 0, - /* bae - */ 0, - /* baf - */ 0, - /* bb0 - */ 0, - /* bb1 - */ 0, - /* bb2 - */ 0, - /* bb3 - */ 0, - /* bb4 - */ 0, - /* bb5 - */ 0, - /* bb6 - */ 0, - /* bb7 - */ 0, - /* bb8 - */ 0, - /* bb9 - */ 0, - /* bba - */ 0, - /* bbb - */ 0, - /* bbc - */ 0, - /* bbd - */ 0, - /* bbe - */ 0, - /* bbf - */ 0, - /* bc0 - */ 0, - /* bc1 - */ 0, - /* bc2 - */ 0, - /* bc3 - */ 0, - /* bc4 - */ 0, - /* bc5 - */ 0, - /* bc6 - */ 0, - /* bc7 - */ 0, - /* bc8 - */ 0, - /* bc9 - */ 0, - /* bca - */ 0, - /* bcb - */ 0, - /* bcc - */ 0, - /* bcd - */ 0, - /* bce - */ 0, - /* bcf - */ 0, - /* bd0 - */ 0, - /* bd1 - */ 0, - /* bd2 - */ 0, - /* bd3 - */ 0, - /* bd4 - */ 0, - /* bd5 - */ 0, - /* bd6 - */ 0, - /* bd7 - */ 0, - /* bd8 - */ 0, - /* bd9 - */ 0, - /* bda - */ 0, - /* bdb - */ 0, - /* bdc - */ 0, - /* bdd - */ 0, - /* bde - */ 0, - /* bdf - */ 0, - /* be0 - */ 0, - /* be1 - */ 0, - /* be2 - */ 0, - /* be3 - */ 0, - /* be4 - */ 0, - /* be5 - */ 0, - /* be6 - */ 0, - /* be7 - */ 0, - /* be8 - */ 0, - /* be9 - */ 0, - /* bea - */ 0, - /* beb - */ 0, - /* bec - */ 0, - /* bed - */ 0, - /* bee - */ 0, - /* bef - */ 0, - /* bf0 - */ 0, - /* bf1 - */ 0, - /* bf2 - */ 0, - /* bf3 - */ 0, - /* bf4 - */ 0, - /* bf5 - */ 0, - /* bf6 - */ 0, - /* bf7 - */ 0, - /* bf8 - */ 0, - /* bf9 - */ 0, - /* bfa - */ 0, - /* bfb - */ 0, - /* bfc - */ 0, - /* bfd - */ 0, - /* bfe - */ 0, - /* bff - */ 0, - /* c00 - */ 0, - /* c01 - */ 0, - /* c02 - */ 0, - /* c03 - */ 0, - /* c04 - */ 0, - /* c05 - */ 0, - /* c06 - */ 0, - /* c07 - */ 0, - /* c08 - */ 0, - /* c09 - */ 0, - /* c0a - */ 0, - /* c0b - */ 0, - /* c0c - */ 0, - /* c0d - */ 0, - /* c0e - */ 0, - /* c0f - */ 0, - /* c10 - */ 0, - /* c11 - */ 0, - /* c12 - */ 0, - /* c13 - */ 0, - /* c14 - */ 0, - /* c15 - */ 0, - /* c16 - */ 0, - /* c17 - */ 0, - /* c18 - */ 0, - /* c19 - */ 0, - /* c1a - */ 0, - /* c1b - */ 0, - /* c1c - */ 0, - /* c1d - */ 0, - /* c1e - */ 0, - /* c1f - */ 0, - /* c20 - */ 0, - /* c21 - */ 0, - /* c22 - */ 0, - /* c23 - */ 0, - /* c24 - */ 0, - /* c25 - */ 0, - /* c26 - */ 0, - /* c27 - */ 0, - /* c28 - */ 0, - /* c29 - */ 0, - /* c2a - */ 0, - /* c2b - */ 0, - /* c2c - */ 0, - /* c2d - */ 0, - /* c2e - */ 0, - /* c2f - */ 0, - /* c30 - */ 0, - /* c31 - */ 0, - /* c32 - */ 0, - /* c33 - */ 0, - /* c34 - */ 0, - /* c35 - */ 0, - /* c36 - */ 0, - /* c37 - */ 0, - /* c38 - */ 0, - /* c39 - */ 0, - /* c3a - */ 0, - /* c3b - */ 0, - /* c3c - */ 0, - /* c3d - */ 0, - /* c3e - */ 0, - /* c3f - */ 0, - /* c40 - */ 0, - /* c41 - */ 0, - /* c42 - */ 0, - /* c43 - */ 0, - /* c44 - */ 0, - /* c45 - */ 0, - /* c46 - */ 0, - /* c47 - */ 0, - /* c48 - */ 0, - /* c49 - */ 0, - /* c4a - */ 0, - /* c4b - */ 0, - /* c4c - */ 0, - /* c4d - */ 0, - /* c4e - */ 0, - /* c4f - */ 0, - /* c50 - */ 0, - /* c51 - */ 0, - /* c52 - */ 0, - /* c53 - */ 0, - /* c54 - */ 0, - /* c55 - _66_0F_7C */ 0x23fe, - /* c56 - */ 0, - /* c57 - _F2_0F_7C */ 0x23ff, - /* c58 - */ 0, - /* c59 - _V_66_0F_7C */ 0x4087, - /* c5a - */ 0, - /* c5b - _V_F2_0F_7C */ 0x4088, - /* c5c - */ 0, - /* c5d - */ 0, - /* c5e - */ 0, - /* c5f - */ 0, - /* c60 - */ 0, - /* c61 - _66_0F_7D */ 0x2400, - /* c62 - */ 0, - /* c63 - _F2_0F_7D */ 0x2401, - /* c64 - */ 0, - /* c65 - _V_66_0F_7D */ 0x4089, - /* c66 - */ 0, - /* c67 - _V_F2_0F_7D */ 0x408a, - /* c68 - */ 0, - /* c69 - */ 0, - /* c6a - */ 0, - /* c6b - */ 0, - /* c6c - _0F_7E */ 0x408b, - /* c6d - _66_0F_7E */ 0x408c, - /* c6e - _F3_0F_7E */ 0x2402, - /* c6f - */ 0, - /* c70 - */ 0, - /* c71 - _V_66_0F_7E */ 0x408d, - /* c72 - _V_F3_0F_7E */ 0x408e, - /* c73 - */ 0, - /* c74 - */ 0, - /* c75 - */ 0, - /* c76 - */ 0, - /* c77 - */ 0, - /* c78 - _0F_7F */ 0x2403, - /* c79 - _66_0F_7F */ 0x2404, - /* c7a - _F3_0F_7F */ 0x2405, - /* c7b - */ 0, - /* c7c - */ 0, - /* c7d - _V_66_0F_7F */ 0x408f, - /* c7e - _V_F3_0F_7F */ 0x4090, - /* c7f - */ 0, - /* c80 - */ 0, - /* c81 - */ 0, - /* c82 - */ 0, - /* c83 - */ 0, - /* c84 - _0F_AE_00 */ 0xd5fc, - /* c85 - _0F_AE_01 */ 0xd608, - /* c86 - _0F_AE_02 */ 0xd614, - /* c87 - _0F_AE_03 */ 0xd620, - /* c88 - _0F_AE_04 */ 0x4091, - /* c89 - _0F_AE_05 */ 0x4092, - /* c8a - _0F_AE_06 */ 0x4093, - /* c8b - _0F_AE_07 */ 0x4094, - /* c8c - */ 0, - /* c8d - */ 0, - /* c8e - _F3_0F_B8 */ 0x2406, - /* c8f - */ 0, - /* c90 - */ 0, - /* c91 - */ 0, - /* c92 - */ 0, - /* c93 - */ 0, - /* c94 - */ 0, - /* c95 - */ 0, - /* c96 - */ 0, - /* c97 - */ 0, - /* c98 - */ 0, - /* c99 - */ 0, - /* c9a - */ 0, - /* c9b - */ 0, - /* c9c - _0F_BA_04 */ 0x2407, - /* c9d - _0F_BA_05 */ 0x2408, - /* c9e - _0F_BA_06 */ 0x2409, - /* c9f - _0F_BA_07 */ 0x240a, - /* ca0 - _0F_BC */ 0x240b, - /* ca1 - */ 0, - /* ca2 - _F3_0F_BC */ 0x240c, - /* ca3 - */ 0, - /* ca4 - */ 0, - /* ca5 - */ 0, - /* ca6 - */ 0, - /* ca7 - */ 0, - /* ca8 - */ 0, - /* ca9 - */ 0, - /* caa - */ 0, - /* cab - */ 0, - /* cac - _0F_BD */ 0x240d, - /* cad - */ 0, - /* cae - _F3_0F_BD */ 0x240e, - /* caf - */ 0, - /* cb0 - */ 0, - /* cb1 - */ 0, - /* cb2 - */ 0, - /* cb3 - */ 0, - /* cb4 - */ 0, - /* cb5 - */ 0, - /* cb6 - */ 0, - /* cb7 - */ 0, - /* cb8 - _0F_C2 */ 0x4095, - /* cb9 - _66_0F_C2 */ 0x4096, - /* cba - _F3_0F_C2 */ 0x4097, - /* cbb - _F2_0F_C2 */ 0x4098, - /* cbc - _V_0F_C2 */ 0x4099, - /* cbd - _V_66_0F_C2 */ 0x409a, - /* cbe - _V_F3_0F_C2 */ 0x409b, - /* cbf - _V_F2_0F_C2 */ 0x409c, - /* cc0 - */ 0, - /* cc1 - */ 0, - /* cc2 - */ 0, - /* cc3 - */ 0, - /* cc4 - _0F_C4 */ 0x409d, - /* cc5 - _66_0F_C4 */ 0x409e, - /* cc6 - */ 0, - /* cc7 - */ 0, - /* cc8 - */ 0, - /* cc9 - _V_66_0F_C4 */ 0x409f, - /* cca - */ 0, - /* ccb - */ 0, - /* ccc - */ 0, - /* ccd - */ 0, - /* cce - */ 0, - /* ccf - */ 0, - /* cd0 - _0F_C5 */ 0x40a0, - /* cd1 - _66_0F_C5 */ 0x40a1, - /* cd2 - */ 0, - /* cd3 - */ 0, - /* cd4 - */ 0, - /* cd5 - _V_66_0F_C5 */ 0x40a2, - /* cd6 - */ 0, - /* cd7 - */ 0, - /* cd8 - */ 0, - /* cd9 - */ 0, - /* cda - */ 0, - /* cdb - */ 0, - /* cdc - _0F_C6 */ 0x40a3, - /* cdd - _66_0F_C6 */ 0x40a4, - /* cde - */ 0, - /* cdf - */ 0, - /* ce0 - _V_0F_C6 */ 0x40a5, - /* ce1 - _V_66_0F_C6 */ 0x40a6, - /* ce2 - */ 0, - /* ce3 - */ 0, - /* ce4 - */ 0, - /* ce5 - */ 0, - /* ce6 - */ 0, - /* ce7 - */ 0, - /* ce8 - */ 0, - /* ce9 - _0F_C7_01 */ 0x40a7, - /* cea - */ 0, - /* ceb - */ 0, - /* cec - */ 0, - /* ced - */ 0, - /* cee - _0F_C7_06 */ 0xd62c, - /* cef - _0F_C7_07 */ 0x240f, - /* cf0 - */ 0, - /* cf1 - _66_0F_D0 */ 0x2410, - /* cf2 - */ 0, - /* cf3 - _F2_0F_D0 */ 0x2411, - /* cf4 - */ 0, - /* cf5 - _V_66_0F_D0 */ 0x40a8, - /* cf6 - */ 0, - /* cf7 - _V_F2_0F_D0 */ 0x40a9, - /* cf8 - */ 0, - /* cf9 - */ 0, - /* cfa - */ 0, - /* cfb - */ 0, - /* cfc - _0F_D1 */ 0x2412, - /* cfd - _66_0F_D1 */ 0x2413, - /* cfe - */ 0, - /* cff - */ 0, - /* d00 - */ 0, - /* d01 - _V_66_0F_D1 */ 0x40aa, - /* d02 - */ 0, - /* d03 - */ 0, - /* d04 - */ 0, - /* d05 - */ 0, - /* d06 - */ 0, - /* d07 - */ 0, - /* d08 - _0F_D2 */ 0x2414, - /* d09 - _66_0F_D2 */ 0x2415, - /* d0a - */ 0, - /* d0b - */ 0, - /* d0c - */ 0, - /* d0d - _V_66_0F_D2 */ 0x40ab, - /* d0e - */ 0, - /* d0f - */ 0, - /* d10 - */ 0, - /* d11 - */ 0, - /* d12 - */ 0, - /* d13 - */ 0, - /* d14 - _0F_D3 */ 0x2416, - /* d15 - _66_0F_D3 */ 0x2417, - /* d16 - */ 0, - /* d17 - */ 0, - /* d18 - */ 0, - /* d19 - _V_66_0F_D3 */ 0x40ac, - /* d1a - */ 0, - /* d1b - */ 0, - /* d1c - */ 0, - /* d1d - */ 0, - /* d1e - */ 0, - /* d1f - */ 0, - /* d20 - _0F_D4 */ 0x2418, - /* d21 - _66_0F_D4 */ 0x2419, - /* d22 - */ 0, - /* d23 - */ 0, - /* d24 - */ 0, - /* d25 - _V_66_0F_D4 */ 0x40ad, - /* d26 - */ 0, - /* d27 - */ 0, - /* d28 - */ 0, - /* d29 - */ 0, - /* d2a - */ 0, - /* d2b - */ 0, - /* d2c - _0F_D5 */ 0x241a, - /* d2d - _66_0F_D5 */ 0x241b, - /* d2e - */ 0, - /* d2f - */ 0, - /* d30 - */ 0, - /* d31 - _V_66_0F_D5 */ 0x40ae, - /* d32 - */ 0, - /* d33 - */ 0, - /* d34 - */ 0, - /* d35 - */ 0, - /* d36 - */ 0, - /* d37 - */ 0, - /* d38 - */ 0, - /* d39 - _66_0F_D6 */ 0x241c, - /* d3a - _F3_0F_D6 */ 0x241d, - /* d3b - _F2_0F_D6 */ 0x241e, - /* d3c - */ 0, - /* d3d - _V_66_0F_D6 */ 0x40af, - /* d3e - */ 0, - /* d3f - */ 0, - /* d40 - */ 0, - /* d41 - */ 0, - /* d42 - */ 0, - /* d43 - */ 0, - /* d44 - _0F_D7 */ 0x241f, - /* d45 - _66_0F_D7 */ 0x2420, - /* d46 - */ 0, - /* d47 - */ 0, - /* d48 - */ 0, - /* d49 - _V_66_0F_D7 */ 0x40b0, - /* d4a - */ 0, - /* d4b - */ 0, - /* d4c - */ 0, - /* d4d - */ 0, - /* d4e - */ 0, - /* d4f - */ 0, - /* d50 - _0F_D8 */ 0x2421, - /* d51 - _66_0F_D8 */ 0x2422, - /* d52 - */ 0, - /* d53 - */ 0, - /* d54 - */ 0, - /* d55 - _V_66_0F_D8 */ 0x40b1, - /* d56 - */ 0, - /* d57 - */ 0, - /* d58 - */ 0, - /* d59 - */ 0, - /* d5a - */ 0, - /* d5b - */ 0, - /* d5c - _0F_D9 */ 0x2423, - /* d5d - _66_0F_D9 */ 0x2424, - /* d5e - */ 0, - /* d5f - */ 0, - /* d60 - */ 0, - /* d61 - _V_66_0F_D9 */ 0x40b2, - /* d62 - */ 0, - /* d63 - */ 0, - /* d64 - */ 0, - /* d65 - */ 0, - /* d66 - */ 0, - /* d67 - */ 0, - /* d68 - _0F_DA */ 0x2425, - /* d69 - _66_0F_DA */ 0x2426, - /* d6a - */ 0, - /* d6b - */ 0, - /* d6c - */ 0, - /* d6d - _V_66_0F_DA */ 0x40b3, - /* d6e - */ 0, - /* d6f - */ 0, - /* d70 - */ 0, - /* d71 - */ 0, - /* d72 - */ 0, - /* d73 - */ 0, - /* d74 - _0F_DB */ 0x2427, - /* d75 - _66_0F_DB */ 0x2428, - /* d76 - */ 0, - /* d77 - */ 0, - /* d78 - */ 0, - /* d79 - _V_66_0F_DB */ 0x40b4, - /* d7a - */ 0, - /* d7b - */ 0, - /* d7c - */ 0, - /* d7d - */ 0, - /* d7e - */ 0, - /* d7f - */ 0, - /* d80 - _0F_DC */ 0x2429, - /* d81 - _66_0F_DC */ 0x242a, - /* d82 - */ 0, - /* d83 - */ 0, - /* d84 - */ 0, - /* d85 - _V_66_0F_DC */ 0x40b5, - /* d86 - */ 0, - /* d87 - */ 0, - /* d88 - */ 0, - /* d89 - */ 0, - /* d8a - */ 0, - /* d8b - */ 0, - /* d8c - _0F_DD */ 0x242b, - /* d8d - _66_0F_DD */ 0x242c, - /* d8e - */ 0, - /* d8f - */ 0, - /* d90 - */ 0, - /* d91 - _V_66_0F_DD */ 0x40b6, - /* d92 - */ 0, - /* d93 - */ 0, - /* d94 - */ 0, - /* d95 - */ 0, - /* d96 - */ 0, - /* d97 - */ 0, - /* d98 - _0F_DE */ 0x242d, - /* d99 - _66_0F_DE */ 0x242e, - /* d9a - */ 0, - /* d9b - */ 0, - /* d9c - */ 0, - /* d9d - _V_66_0F_DE */ 0x40b7, - /* d9e - */ 0, - /* d9f - */ 0, - /* da0 - */ 0, - /* da1 - */ 0, - /* da2 - */ 0, - /* da3 - */ 0, - /* da4 - _0F_DF */ 0x242f, - /* da5 - _66_0F_DF */ 0x2430, - /* da6 - */ 0, - /* da7 - */ 0, - /* da8 - */ 0, - /* da9 - _V_66_0F_DF */ 0x40b8, - /* daa - */ 0, - /* dab - */ 0, - /* dac - */ 0, - /* dad - */ 0, - /* dae - */ 0, - /* daf - */ 0, - /* db0 - _0F_E0 */ 0x2431, - /* db1 - _66_0F_E0 */ 0x2432, - /* db2 - */ 0, - /* db3 - */ 0, - /* db4 - */ 0, - /* db5 - _V_66_0F_E0 */ 0x40b9, - /* db6 - */ 0, - /* db7 - */ 0, - /* db8 - */ 0, - /* db9 - */ 0, - /* dba - */ 0, - /* dbb - */ 0, - /* dbc - _0F_E1 */ 0x2433, - /* dbd - _66_0F_E1 */ 0x2434, - /* dbe - */ 0, - /* dbf - */ 0, - /* dc0 - */ 0, - /* dc1 - _V_66_0F_E1 */ 0x40ba, - /* dc2 - */ 0, - /* dc3 - */ 0, - /* dc4 - */ 0, - /* dc5 - */ 0, - /* dc6 - */ 0, - /* dc7 - */ 0, - /* dc8 - _0F_E2 */ 0x2435, - /* dc9 - _66_0F_E2 */ 0x2436, - /* dca - */ 0, - /* dcb - */ 0, - /* dcc - */ 0, - /* dcd - _V_66_0F_E2 */ 0x40bb, - /* dce - */ 0, - /* dcf - */ 0, - /* dd0 - */ 0, - /* dd1 - */ 0, - /* dd2 - */ 0, - /* dd3 - */ 0, - /* dd4 - _0F_E3 */ 0x2437, - /* dd5 - _66_0F_E3 */ 0x2438, - /* dd6 - */ 0, - /* dd7 - */ 0, - /* dd8 - */ 0, - /* dd9 - _V_66_0F_E3 */ 0x40bc, - /* dda - */ 0, - /* ddb - */ 0, - /* ddc - */ 0, - /* ddd - */ 0, - /* dde - */ 0, - /* ddf - */ 0, - /* de0 - _0F_E4 */ 0x2439, - /* de1 - _66_0F_E4 */ 0x243a, - /* de2 - */ 0, - /* de3 - */ 0, - /* de4 - */ 0, - /* de5 - _V_66_0F_E4 */ 0x40bd, - /* de6 - */ 0, - /* de7 - */ 0, - /* de8 - */ 0, - /* de9 - */ 0, - /* dea - */ 0, - /* deb - */ 0, - /* dec - _0F_E5 */ 0x243b, - /* ded - _66_0F_E5 */ 0x243c, - /* dee - */ 0, - /* def - */ 0, - /* df0 - */ 0, - /* df1 - _V_66_0F_E5 */ 0x40be, - /* df2 - */ 0, - /* df3 - */ 0, - /* df4 - */ 0, - /* df5 - */ 0, - /* df6 - */ 0, - /* df7 - */ 0, - /* df8 - */ 0, - /* df9 - _66_0F_E6 */ 0x243d, - /* dfa - _F3_0F_E6 */ 0x243e, - /* dfb - _F2_0F_E6 */ 0x243f, - /* dfc - */ 0, - /* dfd - _V_66_0F_E6 */ 0x40bf, - /* dfe - _V_F3_0F_E6 */ 0x40c0, - /* dff - _V_F2_0F_E6 */ 0x40c1, - /* e00 - */ 0, - /* e01 - */ 0, - /* e02 - */ 0, - /* e03 - */ 0, - /* e04 - _0F_E7 */ 0x2440, - /* e05 - _66_0F_E7 */ 0x2441, - /* e06 - */ 0, - /* e07 - */ 0, - /* e08 - */ 0, - /* e09 - _V_66_0F_E7 */ 0x40c2, - /* e0a - */ 0, - /* e0b - */ 0, - /* e0c - */ 0, - /* e0d - */ 0, - /* e0e - */ 0, - /* e0f - */ 0, - /* e10 - _0F_E8 */ 0x2442, - /* e11 - _66_0F_E8 */ 0x2443, - /* e12 - */ 0, - /* e13 - */ 0, - /* e14 - */ 0, - /* e15 - _V_66_0F_E8 */ 0x40c3, - /* e16 - */ 0, - /* e17 - */ 0, - /* e18 - */ 0, - /* e19 - */ 0, - /* e1a - */ 0, - /* e1b - */ 0, - /* e1c - _0F_E9 */ 0x2444, - /* e1d - _66_0F_E9 */ 0x2445, - /* e1e - */ 0, - /* e1f - */ 0, - /* e20 - */ 0, - /* e21 - _V_66_0F_E9 */ 0x40c4, - /* e22 - */ 0, - /* e23 - */ 0, - /* e24 - */ 0, - /* e25 - */ 0, - /* e26 - */ 0, - /* e27 - */ 0, - /* e28 - _0F_EA */ 0x2446, - /* e29 - _66_0F_EA */ 0x2447, - /* e2a - */ 0, - /* e2b - */ 0, - /* e2c - */ 0, - /* e2d - _V_66_0F_EA */ 0x40c5, - /* e2e - */ 0, - /* e2f - */ 0, - /* e30 - */ 0, - /* e31 - */ 0, - /* e32 - */ 0, - /* e33 - */ 0, - /* e34 - _0F_EB */ 0x2448, - /* e35 - _66_0F_EB */ 0x2449, - /* e36 - */ 0, - /* e37 - */ 0, - /* e38 - */ 0, - /* e39 - _V_66_0F_EB */ 0x40c6, - /* e3a - */ 0, - /* e3b - */ 0, - /* e3c - */ 0, - /* e3d - */ 0, - /* e3e - */ 0, - /* e3f - */ 0, - /* e40 - _0F_EC */ 0x244a, - /* e41 - _66_0F_EC */ 0x244b, - /* e42 - */ 0, - /* e43 - */ 0, - /* e44 - */ 0, - /* e45 - _V_66_0F_EC */ 0x40c7, - /* e46 - */ 0, - /* e47 - */ 0, - /* e48 - */ 0, - /* e49 - */ 0, - /* e4a - */ 0, - /* e4b - */ 0, - /* e4c - _0F_ED */ 0x244c, - /* e4d - _66_0F_ED */ 0x244d, - /* e4e - */ 0, - /* e4f - */ 0, - /* e50 - */ 0, - /* e51 - _V_66_0F_ED */ 0x40c8, - /* e52 - */ 0, - /* e53 - */ 0, - /* e54 - */ 0, - /* e55 - */ 0, - /* e56 - */ 0, - /* e57 - */ 0, - /* e58 - _0F_EE */ 0x244e, - /* e59 - _66_0F_EE */ 0x244f, - /* e5a - */ 0, - /* e5b - */ 0, - /* e5c - */ 0, - /* e5d - _V_66_0F_EE */ 0x40c9, - /* e5e - */ 0, - /* e5f - */ 0, - /* e60 - */ 0, - /* e61 - */ 0, - /* e62 - */ 0, - /* e63 - */ 0, - /* e64 - _0F_EF */ 0x2450, - /* e65 - _66_0F_EF */ 0x2451, - /* e66 - */ 0, - /* e67 - */ 0, - /* e68 - */ 0, - /* e69 - _V_66_0F_EF */ 0x40ca, - /* e6a - */ 0, - /* e6b - */ 0, - /* e6c - */ 0, - /* e6d - */ 0, - /* e6e - */ 0, - /* e6f - */ 0, - /* e70 - */ 0, - /* e71 - */ 0, - /* e72 - */ 0, - /* e73 - _F2_0F_F0 */ 0x2452, - /* e74 - */ 0, - /* e75 - */ 0, - /* e76 - */ 0, - /* e77 - _V_F2_0F_F0 */ 0x40cb, - /* e78 - */ 0, - /* e79 - */ 0, - /* e7a - */ 0, - /* e7b - */ 0, - /* e7c - _0F_F1 */ 0x2453, - /* e7d - _66_0F_F1 */ 0x2454, - /* e7e - */ 0, - /* e7f - */ 0, - /* e80 - */ 0, - /* e81 - _V_66_0F_F1 */ 0x40cc, - /* e82 - */ 0, - /* e83 - */ 0, - /* e84 - */ 0, - /* e85 - */ 0, - /* e86 - */ 0, - /* e87 - */ 0, - /* e88 - _0F_F2 */ 0x2455, - /* e89 - _66_0F_F2 */ 0x2456, - /* e8a - */ 0, - /* e8b - */ 0, - /* e8c - */ 0, - /* e8d - _V_66_0F_F2 */ 0x40cd, - /* e8e - */ 0, - /* e8f - */ 0, - /* e90 - */ 0, - /* e91 - */ 0, - /* e92 - */ 0, - /* e93 - */ 0, - /* e94 - _0F_F3 */ 0x2457, - /* e95 - _66_0F_F3 */ 0x2458, - /* e96 - */ 0, - /* e97 - */ 0, - /* e98 - */ 0, - /* e99 - _V_66_0F_F3 */ 0x40ce, - /* e9a - */ 0, - /* e9b - */ 0, - /* e9c - */ 0, - /* e9d - */ 0, - /* e9e - */ 0, - /* e9f - */ 0, - /* ea0 - _0F_F4 */ 0x2459, - /* ea1 - _66_0F_F4 */ 0x245a, - /* ea2 - */ 0, - /* ea3 - */ 0, - /* ea4 - */ 0, - /* ea5 - _V_66_0F_F4 */ 0x40cf, - /* ea6 - */ 0, - /* ea7 - */ 0, - /* ea8 - */ 0, - /* ea9 - */ 0, - /* eaa - */ 0, - /* eab - */ 0, - /* eac - _0F_F5 */ 0x245b, - /* ead - _66_0F_F5 */ 0x245c, - /* eae - */ 0, - /* eaf - */ 0, - /* eb0 - */ 0, - /* eb1 - _V_66_0F_F5 */ 0x40d0, - /* eb2 - */ 0, - /* eb3 - */ 0, - /* eb4 - */ 0, - /* eb5 - */ 0, - /* eb6 - */ 0, - /* eb7 - */ 0, - /* eb8 - _0F_F6 */ 0x245d, - /* eb9 - _66_0F_F6 */ 0x245e, - /* eba - */ 0, - /* ebb - */ 0, - /* ebc - */ 0, - /* ebd - _V_66_0F_F6 */ 0x40d1, - /* ebe - */ 0, - /* ebf - */ 0, - /* ec0 - */ 0, - /* ec1 - */ 0, - /* ec2 - */ 0, - /* ec3 - */ 0, - /* ec4 - _0F_F7 */ 0x245f, - /* ec5 - _66_0F_F7 */ 0x2460, - /* ec6 - */ 0, - /* ec7 - */ 0, - /* ec8 - */ 0, - /* ec9 - _V_66_0F_F7 */ 0x40d2, - /* eca - */ 0, - /* ecb - */ 0, - /* ecc - */ 0, - /* ecd - */ 0, - /* ece - */ 0, - /* ecf - */ 0, - /* ed0 - _0F_F8 */ 0x2461, - /* ed1 - _66_0F_F8 */ 0x2462, - /* ed2 - */ 0, - /* ed3 - */ 0, - /* ed4 - */ 0, - /* ed5 - _V_66_0F_F8 */ 0x40d3, - /* ed6 - */ 0, - /* ed7 - */ 0, - /* ed8 - */ 0, - /* ed9 - */ 0, - /* eda - */ 0, - /* edb - */ 0, - /* edc - _0F_F9 */ 0x2463, - /* edd - _66_0F_F9 */ 0x2464, - /* ede - */ 0, - /* edf - */ 0, - /* ee0 - */ 0, - /* ee1 - _V_66_0F_F9 */ 0x40d4, - /* ee2 - */ 0, - /* ee3 - */ 0, - /* ee4 - */ 0, - /* ee5 - */ 0, - /* ee6 - */ 0, - /* ee7 - */ 0, - /* ee8 - _0F_FA */ 0x2465, - /* ee9 - _66_0F_FA */ 0x2466, - /* eea - */ 0, - /* eeb - */ 0, - /* eec - */ 0, - /* eed - _V_66_0F_FA */ 0x40d5, - /* eee - */ 0, - /* eef - */ 0, - /* ef0 - */ 0, - /* ef1 - */ 0, - /* ef2 - */ 0, - /* ef3 - */ 0, - /* ef4 - _0F_FB */ 0x2467, - /* ef5 - _66_0F_FB */ 0x2468, - /* ef6 - */ 0, - /* ef7 - */ 0, - /* ef8 - */ 0, - /* ef9 - _V_66_0F_FB */ 0x40d6, - /* efa - */ 0, - /* efb - */ 0, - /* efc - */ 0, - /* efd - */ 0, - /* efe - */ 0, - /* eff - */ 0, - /* f00 - _0F_FC */ 0x2469, - /* f01 - _66_0F_FC */ 0x246a, - /* f02 - */ 0, - /* f03 - */ 0, - /* f04 - */ 0, - /* f05 - _V_66_0F_FC */ 0x40d7, - /* f06 - */ 0, - /* f07 - */ 0, - /* f08 - */ 0, - /* f09 - */ 0, - /* f0a - */ 0, - /* f0b - */ 0, - /* f0c - _0F_FD */ 0x246b, - /* f0d - _66_0F_FD */ 0x246c, - /* f0e - */ 0, - /* f0f - */ 0, - /* f10 - */ 0, - /* f11 - _V_66_0F_FD */ 0x40d8, - /* f12 - */ 0, - /* f13 - */ 0, - /* f14 - */ 0, - /* f15 - */ 0, - /* f16 - */ 0, - /* f17 - */ 0, - /* f18 - _0F_FE */ 0x246d, - /* f19 - _66_0F_FE */ 0x246e, - /* f1a - */ 0, - /* f1b - */ 0, - /* f1c - */ 0, - /* f1d - _V_66_0F_FE */ 0x40d9, - /* f1e - */ 0, - /* f1f - */ 0, - /* f20 - */ 0, - /* f21 - */ 0, - /* f22 - */ 0, - /* f23 - */ 0, - /* f24 - _D9_06 */ 0x246f, - /* f25 - _9B_D9_06 */ 0x2470, - /* f26 - */ 0, - /* f27 - */ 0, - /* f28 - */ 0, - /* f29 - */ 0, - /* f2a - */ 0, - /* f2b - */ 0, - /* f2c - */ 0, - /* f2d - */ 0, - /* f2e - */ 0, - /* f2f - */ 0, - /* f30 - _D9_07 */ 0x2471, - /* f31 - _9B_D9_07 */ 0x2472, - /* f32 - */ 0, - /* f33 - */ 0, - /* f34 - */ 0, - /* f35 - */ 0, - /* f36 - */ 0, - /* f37 - */ 0, - /* f38 - */ 0, - /* f39 - */ 0, - /* f3a - */ 0, - /* f3b - */ 0, - /* f3c - _DB_E2 */ 0x2473, - /* f3d - _9B_DB_E2 */ 0x2474, - /* f3e - */ 0, - /* f3f - */ 0, - /* f40 - */ 0, - /* f41 - */ 0, - /* f42 - */ 0, - /* f43 - */ 0, - /* f44 - */ 0, - /* f45 - */ 0, - /* f46 - */ 0, - /* f47 - */ 0, - /* f48 - _DB_E3 */ 0x2475, - /* f49 - _9B_DB_E3 */ 0x2476, - /* f4a - */ 0, - /* f4b - */ 0, - /* f4c - */ 0, - /* f4d - */ 0, - /* f4e - */ 0, - /* f4f - */ 0, - /* f50 - */ 0, - /* f51 - */ 0, - /* f52 - */ 0, - /* f53 - */ 0, - /* f54 - _DD_06 */ 0x2477, - /* f55 - _9B_DD_06 */ 0x2478, - /* f56 - */ 0, - /* f57 - */ 0, - /* f58 - */ 0, - /* f59 - */ 0, - /* f5a - */ 0, - /* f5b - */ 0, - /* f5c - */ 0, - /* f5d - */ 0, - /* f5e - */ 0, - /* f5f - */ 0, - /* f60 - _DD_07 */ 0x2479, - /* f61 - _9B_DD_07 */ 0x247a, - /* f62 - */ 0, - /* f63 - */ 0, - /* f64 - */ 0, - /* f65 - */ 0, - /* f66 - */ 0, - /* f67 - */ 0, - /* f68 - */ 0, - /* f69 - */ 0, - /* f6a - */ 0, - /* f6b - */ 0, - /* f6c - _DF_E0 */ 0x247b, - /* f6d - _9B_DF_E0 */ 0x247c, - /* f6e - */ 0, - /* f6f - */ 0, - /* f70 - */ 0, - /* f71 - */ 0, - /* f72 - */ 0, - /* f73 - */ 0, - /* f74 - */ 0, - /* f75 - */ 0, - /* f76 - */ 0, - /* f77 - */ 0, - /* f78 - _0F_38_00 */ 0x247d, - /* f79 - _66_0F_38_00 */ 0x247e, - /* f7a - */ 0, - /* f7b - */ 0, - /* f7c - */ 0, - /* f7d - _V_66_0F_38_00 */ 0x40da, - /* f7e - */ 0, - /* f7f - */ 0, - /* f80 - */ 0, - /* f81 - */ 0, - /* f82 - */ 0, - /* f83 - */ 0, - /* f84 - _0F_38_01 */ 0x247f, - /* f85 - _66_0F_38_01 */ 0x2480, - /* f86 - */ 0, - /* f87 - */ 0, - /* f88 - */ 0, - /* f89 - _V_66_0F_38_01 */ 0x40db, - /* f8a - */ 0, - /* f8b - */ 0, - /* f8c - */ 0, - /* f8d - */ 0, - /* f8e - */ 0, - /* f8f - */ 0, - /* f90 - _0F_38_02 */ 0x2481, - /* f91 - _66_0F_38_02 */ 0x2482, - /* f92 - */ 0, - /* f93 - */ 0, - /* f94 - */ 0, - /* f95 - _V_66_0F_38_02 */ 0x40dc, - /* f96 - */ 0, - /* f97 - */ 0, - /* f98 - */ 0, - /* f99 - */ 0, - /* f9a - */ 0, - /* f9b - */ 0, - /* f9c - _0F_38_03 */ 0x2483, - /* f9d - _66_0F_38_03 */ 0x2484, - /* f9e - */ 0, - /* f9f - */ 0, - /* fa0 - */ 0, - /* fa1 - _V_66_0F_38_03 */ 0x40dd, - /* fa2 - */ 0, - /* fa3 - */ 0, - /* fa4 - */ 0, - /* fa5 - */ 0, - /* fa6 - */ 0, - /* fa7 - */ 0, - /* fa8 - _0F_38_04 */ 0x2485, - /* fa9 - _66_0F_38_04 */ 0x2486, - /* faa - */ 0, - /* fab - */ 0, - /* fac - */ 0, - /* fad - _V_66_0F_38_04 */ 0x40de, - /* fae - */ 0, - /* faf - */ 0, - /* fb0 - */ 0, - /* fb1 - */ 0, - /* fb2 - */ 0, - /* fb3 - */ 0, - /* fb4 - _0F_38_05 */ 0x2487, - /* fb5 - _66_0F_38_05 */ 0x2488, - /* fb6 - */ 0, - /* fb7 - */ 0, - /* fb8 - */ 0, - /* fb9 - _V_66_0F_38_05 */ 0x40df, - /* fba - */ 0, - /* fbb - */ 0, - /* fbc - */ 0, - /* fbd - */ 0, - /* fbe - */ 0, - /* fbf - */ 0, - /* fc0 - _0F_38_06 */ 0x2489, - /* fc1 - _66_0F_38_06 */ 0x248a, - /* fc2 - */ 0, - /* fc3 - */ 0, - /* fc4 - */ 0, - /* fc5 - _V_66_0F_38_06 */ 0x40e0, - /* fc6 - */ 0, - /* fc7 - */ 0, - /* fc8 - */ 0, - /* fc9 - */ 0, - /* fca - */ 0, - /* fcb - */ 0, - /* fcc - _0F_38_07 */ 0x248b, - /* fcd - _66_0F_38_07 */ 0x248c, - /* fce - */ 0, - /* fcf - */ 0, - /* fd0 - */ 0, - /* fd1 - _V_66_0F_38_07 */ 0x40e1, - /* fd2 - */ 0, - /* fd3 - */ 0, - /* fd4 - */ 0, - /* fd5 - */ 0, - /* fd6 - */ 0, - /* fd7 - */ 0, - /* fd8 - _0F_38_08 */ 0x248d, - /* fd9 - _66_0F_38_08 */ 0x248e, - /* fda - */ 0, - /* fdb - */ 0, - /* fdc - */ 0, - /* fdd - _V_66_0F_38_08 */ 0x40e2, - /* fde - */ 0, - /* fdf - */ 0, - /* fe0 - */ 0, - /* fe1 - */ 0, - /* fe2 - */ 0, - /* fe3 - */ 0, - /* fe4 - _0F_38_09 */ 0x248f, - /* fe5 - _66_0F_38_09 */ 0x2490, - /* fe6 - */ 0, - /* fe7 - */ 0, - /* fe8 - */ 0, - /* fe9 - _V_66_0F_38_09 */ 0x40e3, - /* fea - */ 0, - /* feb - */ 0, - /* fec - */ 0, - /* fed - */ 0, - /* fee - */ 0, - /* fef - */ 0, - /* ff0 - _0F_38_0A */ 0x2491, - /* ff1 - _66_0F_38_0A */ 0x2492, - /* ff2 - */ 0, - /* ff3 - */ 0, - /* ff4 - */ 0, - /* ff5 - _V_66_0F_38_0A */ 0x40e4, - /* ff6 - */ 0, - /* ff7 - */ 0, - /* ff8 - */ 0, - /* ff9 - */ 0, - /* ffa - */ 0, - /* ffb - */ 0, - /* ffc - _0F_38_0B */ 0x2493, - /* ffd - _66_0F_38_0B */ 0x2494, - /* ffe - */ 0, - /* fff - */ 0, - /* 1000 - */ 0, - /* 1001 - _V_66_0F_38_0B */ 0x40e5, - /* 1002 - */ 0, - /* 1003 - */ 0, - /* 1004 - */ 0, - /* 1005 - */ 0, - /* 1006 - */ 0, - /* 1007 - */ 0, - /* 1008 - */ 0, - /* 1009 - */ 0, - /* 100a - */ 0, - /* 100b - */ 0, - /* 100c - */ 0, - /* 100d - _V_66_0F_38_0C */ 0x40e6, - /* 100e - */ 0, - /* 100f - */ 0, - /* 1010 - */ 0, - /* 1011 - */ 0, - /* 1012 - */ 0, - /* 1013 - */ 0, - /* 1014 - */ 0, - /* 1015 - */ 0, - /* 1016 - */ 0, - /* 1017 - */ 0, - /* 1018 - */ 0, - /* 1019 - _V_66_0F_38_0D */ 0x40e7, - /* 101a - */ 0, - /* 101b - */ 0, - /* 101c - */ 0, - /* 101d - */ 0, - /* 101e - */ 0, - /* 101f - */ 0, - /* 1020 - */ 0, - /* 1021 - */ 0, - /* 1022 - */ 0, - /* 1023 - */ 0, - /* 1024 - */ 0, - /* 1025 - _V_66_0F_38_0E */ 0x40e8, - /* 1026 - */ 0, - /* 1027 - */ 0, - /* 1028 - */ 0, - /* 1029 - */ 0, - /* 102a - */ 0, - /* 102b - */ 0, - /* 102c - */ 0, - /* 102d - */ 0, - /* 102e - */ 0, - /* 102f - */ 0, - /* 1030 - */ 0, - /* 1031 - _V_66_0F_38_0F */ 0x40e9, - /* 1032 - */ 0, - /* 1033 - */ 0, - /* 1034 - */ 0, - /* 1035 - */ 0, - /* 1036 - */ 0, - /* 1037 - */ 0, - /* 1038 - */ 0, - /* 1039 - _66_0F_38_10 */ 0x40ea, - /* 103a - */ 0, - /* 103b - */ 0, - /* 103c - */ 0, - /* 103d - */ 0, - /* 103e - */ 0, - /* 103f - */ 0, - /* 1040 - */ 0, - /* 1041 - */ 0, - /* 1042 - */ 0, - /* 1043 - */ 0, - /* 1044 - */ 0, - /* 1045 - _66_0F_38_14 */ 0x40eb, - /* 1046 - */ 0, - /* 1047 - */ 0, - /* 1048 - */ 0, - /* 1049 - */ 0, - /* 104a - */ 0, - /* 104b - */ 0, - /* 104c - */ 0, - /* 104d - */ 0, - /* 104e - */ 0, - /* 104f - */ 0, - /* 1050 - */ 0, - /* 1051 - _66_0F_38_15 */ 0x40ec, - /* 1052 - */ 0, - /* 1053 - */ 0, - /* 1054 - */ 0, - /* 1055 - */ 0, - /* 1056 - */ 0, - /* 1057 - */ 0, - /* 1058 - */ 0, - /* 1059 - */ 0, - /* 105a - */ 0, - /* 105b - */ 0, - /* 105c - */ 0, - /* 105d - _66_0F_38_17 */ 0x2495, - /* 105e - */ 0, - /* 105f - */ 0, - /* 1060 - */ 0, - /* 1061 - _V_66_0F_38_17 */ 0x40ed, - /* 1062 - */ 0, - /* 1063 - */ 0, - /* 1064 - */ 0, - /* 1065 - */ 0, - /* 1066 - */ 0, - /* 1067 - */ 0, - /* 1068 - */ 0, - /* 1069 - */ 0, - /* 106a - */ 0, - /* 106b - */ 0, - /* 106c - */ 0, - /* 106d - _V_66_0F_38_18 */ 0x40ee, - /* 106e - */ 0, - /* 106f - */ 0, - /* 1070 - */ 0, - /* 1071 - */ 0, - /* 1072 - */ 0, - /* 1073 - */ 0, - /* 1074 - */ 0, - /* 1075 - */ 0, - /* 1076 - */ 0, - /* 1077 - */ 0, - /* 1078 - */ 0, - /* 1079 - _V_66_0F_38_19 */ 0x40ef, - /* 107a - */ 0, - /* 107b - */ 0, - /* 107c - */ 0, - /* 107d - */ 0, - /* 107e - */ 0, - /* 107f - */ 0, - /* 1080 - */ 0, - /* 1081 - */ 0, - /* 1082 - */ 0, - /* 1083 - */ 0, - /* 1084 - */ 0, - /* 1085 - _V_66_0F_38_1A */ 0x40f0, - /* 1086 - */ 0, - /* 1087 - */ 0, - /* 1088 - */ 0, - /* 1089 - */ 0, - /* 108a - */ 0, - /* 108b - */ 0, - /* 108c - _0F_38_1C */ 0x2496, - /* 108d - _66_0F_38_1C */ 0x2497, - /* 108e - */ 0, - /* 108f - */ 0, - /* 1090 - */ 0, - /* 1091 - _V_66_0F_38_1C */ 0x40f1, - /* 1092 - */ 0, - /* 1093 - */ 0, - /* 1094 - */ 0, - /* 1095 - */ 0, - /* 1096 - */ 0, - /* 1097 - */ 0, - /* 1098 - _0F_38_1D */ 0x2498, - /* 1099 - _66_0F_38_1D */ 0x2499, - /* 109a - */ 0, - /* 109b - */ 0, - /* 109c - */ 0, - /* 109d - _V_66_0F_38_1D */ 0x40f2, - /* 109e - */ 0, - /* 109f - */ 0, - /* 10a0 - */ 0, - /* 10a1 - */ 0, - /* 10a2 - */ 0, - /* 10a3 - */ 0, - /* 10a4 - _0F_38_1E */ 0x249a, - /* 10a5 - _66_0F_38_1E */ 0x249b, - /* 10a6 - */ 0, - /* 10a7 - */ 0, - /* 10a8 - */ 0, - /* 10a9 - _V_66_0F_38_1E */ 0x40f3, - /* 10aa - */ 0, - /* 10ab - */ 0, - /* 10ac - */ 0, - /* 10ad - */ 0, - /* 10ae - */ 0, - /* 10af - */ 0, - /* 10b0 - */ 0, - /* 10b1 - _66_0F_38_20 */ 0x249c, - /* 10b2 - */ 0, - /* 10b3 - */ 0, - /* 10b4 - */ 0, - /* 10b5 - _V_66_0F_38_20 */ 0x40f4, - /* 10b6 - */ 0, - /* 10b7 - */ 0, - /* 10b8 - */ 0, - /* 10b9 - */ 0, - /* 10ba - */ 0, - /* 10bb - */ 0, - /* 10bc - */ 0, - /* 10bd - _66_0F_38_21 */ 0x249d, - /* 10be - */ 0, - /* 10bf - */ 0, - /* 10c0 - */ 0, - /* 10c1 - _V_66_0F_38_21 */ 0x40f5, - /* 10c2 - */ 0, - /* 10c3 - */ 0, - /* 10c4 - */ 0, - /* 10c5 - */ 0, - /* 10c6 - */ 0, - /* 10c7 - */ 0, - /* 10c8 - */ 0, - /* 10c9 - _66_0F_38_22 */ 0x249e, - /* 10ca - */ 0, - /* 10cb - */ 0, - /* 10cc - */ 0, - /* 10cd - _V_66_0F_38_22 */ 0x40f6, - /* 10ce - */ 0, - /* 10cf - */ 0, - /* 10d0 - */ 0, - /* 10d1 - */ 0, - /* 10d2 - */ 0, - /* 10d3 - */ 0, - /* 10d4 - */ 0, - /* 10d5 - _66_0F_38_23 */ 0x249f, - /* 10d6 - */ 0, - /* 10d7 - */ 0, - /* 10d8 - */ 0, - /* 10d9 - _V_66_0F_38_23 */ 0x40f7, - /* 10da - */ 0, - /* 10db - */ 0, - /* 10dc - */ 0, - /* 10dd - */ 0, - /* 10de - */ 0, - /* 10df - */ 0, - /* 10e0 - */ 0, - /* 10e1 - _66_0F_38_24 */ 0x24a0, - /* 10e2 - */ 0, - /* 10e3 - */ 0, - /* 10e4 - */ 0, - /* 10e5 - _V_66_0F_38_24 */ 0x40f8, - /* 10e6 - */ 0, - /* 10e7 - */ 0, - /* 10e8 - */ 0, - /* 10e9 - */ 0, - /* 10ea - */ 0, - /* 10eb - */ 0, - /* 10ec - */ 0, - /* 10ed - _66_0F_38_25 */ 0x24a1, - /* 10ee - */ 0, - /* 10ef - */ 0, - /* 10f0 - */ 0, - /* 10f1 - _V_66_0F_38_25 */ 0x40f9, - /* 10f2 - */ 0, - /* 10f3 - */ 0, - /* 10f4 - */ 0, - /* 10f5 - */ 0, - /* 10f6 - */ 0, - /* 10f7 - */ 0, - /* 10f8 - */ 0, - /* 10f9 - _66_0F_38_28 */ 0x24a2, - /* 10fa - */ 0, - /* 10fb - */ 0, - /* 10fc - */ 0, - /* 10fd - _V_66_0F_38_28 */ 0x40fa, - /* 10fe - */ 0, - /* 10ff - */ 0, - /* 1100 - */ 0, - /* 1101 - */ 0, - /* 1102 - */ 0, - /* 1103 - */ 0, - /* 1104 - */ 0, - /* 1105 - _66_0F_38_29 */ 0x24a3, - /* 1106 - */ 0, - /* 1107 - */ 0, - /* 1108 - */ 0, - /* 1109 - _V_66_0F_38_29 */ 0x40fb, - /* 110a - */ 0, - /* 110b - */ 0, - /* 110c - */ 0, - /* 110d - */ 0, - /* 110e - */ 0, - /* 110f - */ 0, - /* 1110 - */ 0, - /* 1111 - _66_0F_38_2A */ 0x24a4, - /* 1112 - */ 0, - /* 1113 - */ 0, - /* 1114 - */ 0, - /* 1115 - _V_66_0F_38_2A */ 0x40fc, - /* 1116 - */ 0, - /* 1117 - */ 0, - /* 1118 - */ 0, - /* 1119 - */ 0, - /* 111a - */ 0, - /* 111b - */ 0, - /* 111c - */ 0, - /* 111d - _66_0F_38_2B */ 0x24a5, - /* 111e - */ 0, - /* 111f - */ 0, - /* 1120 - */ 0, - /* 1121 - _V_66_0F_38_2B */ 0x40fd, - /* 1122 - */ 0, - /* 1123 - */ 0, - /* 1124 - */ 0, - /* 1125 - */ 0, - /* 1126 - */ 0, - /* 1127 - */ 0, - /* 1128 - */ 0, - /* 1129 - */ 0, - /* 112a - */ 0, - /* 112b - */ 0, - /* 112c - */ 0, - /* 112d - _V_66_0F_38_2C */ 0x40fe, - /* 112e - */ 0, - /* 112f - */ 0, - /* 1130 - */ 0, - /* 1131 - */ 0, - /* 1132 - */ 0, - /* 1133 - */ 0, - /* 1134 - */ 0, - /* 1135 - */ 0, - /* 1136 - */ 0, - /* 1137 - */ 0, - /* 1138 - */ 0, - /* 1139 - _V_66_0F_38_2D */ 0x40ff, - /* 113a - */ 0, - /* 113b - */ 0, - /* 113c - */ 0, - /* 113d - */ 0, - /* 113e - */ 0, - /* 113f - */ 0, - /* 1140 - */ 0, - /* 1141 - */ 0, - /* 1142 - */ 0, - /* 1143 - */ 0, - /* 1144 - */ 0, - /* 1145 - _V_66_0F_38_2E */ 0x4100, - /* 1146 - */ 0, - /* 1147 - */ 0, - /* 1148 - */ 0, - /* 1149 - */ 0, - /* 114a - */ 0, - /* 114b - */ 0, - /* 114c - */ 0, - /* 114d - */ 0, - /* 114e - */ 0, - /* 114f - */ 0, - /* 1150 - */ 0, - /* 1151 - _V_66_0F_38_2F */ 0x4101, - /* 1152 - */ 0, - /* 1153 - */ 0, - /* 1154 - */ 0, - /* 1155 - */ 0, - /* 1156 - */ 0, - /* 1157 - */ 0, - /* 1158 - */ 0, - /* 1159 - _66_0F_38_30 */ 0x24a6, - /* 115a - */ 0, - /* 115b - */ 0, - /* 115c - */ 0, - /* 115d - _V_66_0F_38_30 */ 0x4102, - /* 115e - */ 0, - /* 115f - */ 0, - /* 1160 - */ 0, - /* 1161 - */ 0, - /* 1162 - */ 0, - /* 1163 - */ 0, - /* 1164 - */ 0, - /* 1165 - _66_0F_38_31 */ 0x24a7, - /* 1166 - */ 0, - /* 1167 - */ 0, - /* 1168 - */ 0, - /* 1169 - _V_66_0F_38_31 */ 0x4103, - /* 116a - */ 0, - /* 116b - */ 0, - /* 116c - */ 0, - /* 116d - */ 0, - /* 116e - */ 0, - /* 116f - */ 0, - /* 1170 - */ 0, - /* 1171 - _66_0F_38_32 */ 0x24a8, - /* 1172 - */ 0, - /* 1173 - */ 0, - /* 1174 - */ 0, - /* 1175 - _V_66_0F_38_32 */ 0x4104, - /* 1176 - */ 0, - /* 1177 - */ 0, - /* 1178 - */ 0, - /* 1179 - */ 0, - /* 117a - */ 0, - /* 117b - */ 0, - /* 117c - */ 0, - /* 117d - _66_0F_38_33 */ 0x24a9, - /* 117e - */ 0, - /* 117f - */ 0, - /* 1180 - */ 0, - /* 1181 - _V_66_0F_38_33 */ 0x4105, - /* 1182 - */ 0, - /* 1183 - */ 0, - /* 1184 - */ 0, - /* 1185 - */ 0, - /* 1186 - */ 0, - /* 1187 - */ 0, - /* 1188 - */ 0, - /* 1189 - _66_0F_38_34 */ 0x24aa, - /* 118a - */ 0, - /* 118b - */ 0, - /* 118c - */ 0, - /* 118d - _V_66_0F_38_34 */ 0x4106, - /* 118e - */ 0, - /* 118f - */ 0, - /* 1190 - */ 0, - /* 1191 - */ 0, - /* 1192 - */ 0, - /* 1193 - */ 0, - /* 1194 - */ 0, - /* 1195 - _66_0F_38_35 */ 0x24ab, - /* 1196 - */ 0, - /* 1197 - */ 0, - /* 1198 - */ 0, - /* 1199 - _V_66_0F_38_35 */ 0x4107, - /* 119a - */ 0, - /* 119b - */ 0, - /* 119c - */ 0, - /* 119d - */ 0, - /* 119e - */ 0, - /* 119f - */ 0, - /* 11a0 - */ 0, - /* 11a1 - _66_0F_38_37 */ 0x24ac, - /* 11a2 - */ 0, - /* 11a3 - */ 0, - /* 11a4 - */ 0, - /* 11a5 - _V_66_0F_38_37 */ 0x4108, - /* 11a6 - */ 0, - /* 11a7 - */ 0, - /* 11a8 - */ 0, - /* 11a9 - */ 0, - /* 11aa - */ 0, - /* 11ab - */ 0, - /* 11ac - */ 0, - /* 11ad - _66_0F_38_38 */ 0x24ad, - /* 11ae - */ 0, - /* 11af - */ 0, - /* 11b0 - */ 0, - /* 11b1 - _V_66_0F_38_38 */ 0x4109, - /* 11b2 - */ 0, - /* 11b3 - */ 0, - /* 11b4 - */ 0, - /* 11b5 - */ 0, - /* 11b6 - */ 0, - /* 11b7 - */ 0, - /* 11b8 - */ 0, - /* 11b9 - _66_0F_38_39 */ 0x24ae, - /* 11ba - */ 0, - /* 11bb - */ 0, - /* 11bc - */ 0, - /* 11bd - _V_66_0F_38_39 */ 0x410a, - /* 11be - */ 0, - /* 11bf - */ 0, - /* 11c0 - */ 0, - /* 11c1 - */ 0, - /* 11c2 - */ 0, - /* 11c3 - */ 0, - /* 11c4 - */ 0, - /* 11c5 - _66_0F_38_3A */ 0x24af, - /* 11c6 - */ 0, - /* 11c7 - */ 0, - /* 11c8 - */ 0, - /* 11c9 - _V_66_0F_38_3A */ 0x410b, - /* 11ca - */ 0, - /* 11cb - */ 0, - /* 11cc - */ 0, - /* 11cd - */ 0, - /* 11ce - */ 0, - /* 11cf - */ 0, - /* 11d0 - */ 0, - /* 11d1 - _66_0F_38_3B */ 0x24b0, - /* 11d2 - */ 0, - /* 11d3 - */ 0, - /* 11d4 - */ 0, - /* 11d5 - _V_66_0F_38_3B */ 0x410c, - /* 11d6 - */ 0, - /* 11d7 - */ 0, - /* 11d8 - */ 0, - /* 11d9 - */ 0, - /* 11da - */ 0, - /* 11db - */ 0, - /* 11dc - */ 0, - /* 11dd - _66_0F_38_3C */ 0x24b1, - /* 11de - */ 0, - /* 11df - */ 0, - /* 11e0 - */ 0, - /* 11e1 - _V_66_0F_38_3C */ 0x410d, - /* 11e2 - */ 0, - /* 11e3 - */ 0, - /* 11e4 - */ 0, - /* 11e5 - */ 0, - /* 11e6 - */ 0, - /* 11e7 - */ 0, - /* 11e8 - */ 0, - /* 11e9 - _66_0F_38_3D */ 0x24b2, - /* 11ea - */ 0, - /* 11eb - */ 0, - /* 11ec - */ 0, - /* 11ed - _V_66_0F_38_3D */ 0x410e, - /* 11ee - */ 0, - /* 11ef - */ 0, - /* 11f0 - */ 0, - /* 11f1 - */ 0, - /* 11f2 - */ 0, - /* 11f3 - */ 0, - /* 11f4 - */ 0, - /* 11f5 - _66_0F_38_3E */ 0x24b3, - /* 11f6 - */ 0, - /* 11f7 - */ 0, - /* 11f8 - */ 0, - /* 11f9 - _V_66_0F_38_3E */ 0x410f, - /* 11fa - */ 0, - /* 11fb - */ 0, - /* 11fc - */ 0, - /* 11fd - */ 0, - /* 11fe - */ 0, - /* 11ff - */ 0, - /* 1200 - */ 0, - /* 1201 - _66_0F_38_3F */ 0x24b4, - /* 1202 - */ 0, - /* 1203 - */ 0, - /* 1204 - */ 0, - /* 1205 - _V_66_0F_38_3F */ 0x4110, - /* 1206 - */ 0, - /* 1207 - */ 0, - /* 1208 - */ 0, - /* 1209 - */ 0, - /* 120a - */ 0, - /* 120b - */ 0, - /* 120c - */ 0, - /* 120d - _66_0F_38_40 */ 0x24b5, - /* 120e - */ 0, - /* 120f - */ 0, - /* 1210 - */ 0, - /* 1211 - _V_66_0F_38_40 */ 0x4111, - /* 1212 - */ 0, - /* 1213 - */ 0, - /* 1214 - */ 0, - /* 1215 - */ 0, - /* 1216 - */ 0, - /* 1217 - */ 0, - /* 1218 - */ 0, - /* 1219 - _66_0F_38_41 */ 0x24b6, - /* 121a - */ 0, - /* 121b - */ 0, - /* 121c - */ 0, - /* 121d - _V_66_0F_38_41 */ 0x4112, - /* 121e - */ 0, - /* 121f - */ 0, - /* 1220 - */ 0, - /* 1221 - */ 0, - /* 1222 - */ 0, - /* 1223 - */ 0, - /* 1224 - */ 0, - /* 1225 - _66_0F_38_80 */ 0x24b7, - /* 1226 - */ 0, - /* 1227 - */ 0, - /* 1228 - */ 0, - /* 1229 - */ 0, - /* 122a - */ 0, - /* 122b - */ 0, - /* 122c - */ 0, - /* 122d - */ 0, - /* 122e - */ 0, - /* 122f - */ 0, - /* 1230 - */ 0, - /* 1231 - _66_0F_38_81 */ 0x24b8, - /* 1232 - */ 0, - /* 1233 - */ 0, - /* 1234 - */ 0, - /* 1235 - */ 0, - /* 1236 - */ 0, - /* 1237 - */ 0, - /* 1238 - */ 0, - /* 1239 - */ 0, - /* 123a - */ 0, - /* 123b - */ 0, - /* 123c - */ 0, - /* 123d - _66_0F_38_82 */ 0x24b9, - /* 123e - */ 0, - /* 123f - */ 0, - /* 1240 - */ 0, - /* 1241 - */ 0, - /* 1242 - */ 0, - /* 1243 - */ 0, - /* 1244 - */ 0, - /* 1245 - */ 0, - /* 1246 - */ 0, - /* 1247 - */ 0, - /* 1248 - */ 0, - /* 1249 - */ 0, - /* 124a - */ 0, - /* 124b - */ 0, - /* 124c - */ 0, - /* 124d - _V_66_0F_38_96 */ 0x4113, - /* 124e - */ 0, - /* 124f - */ 0, - /* 1250 - */ 0, - /* 1251 - */ 0, - /* 1252 - */ 0, - /* 1253 - */ 0, - /* 1254 - */ 0, - /* 1255 - */ 0, - /* 1256 - */ 0, - /* 1257 - */ 0, - /* 1258 - */ 0, - /* 1259 - _V_66_0F_38_97 */ 0x4114, - /* 125a - */ 0, - /* 125b - */ 0, - /* 125c - */ 0, - /* 125d - */ 0, - /* 125e - */ 0, - /* 125f - */ 0, - /* 1260 - */ 0, - /* 1261 - */ 0, - /* 1262 - */ 0, - /* 1263 - */ 0, - /* 1264 - */ 0, - /* 1265 - _V_66_0F_38_98 */ 0x4115, - /* 1266 - */ 0, - /* 1267 - */ 0, - /* 1268 - */ 0, - /* 1269 - */ 0, - /* 126a - */ 0, - /* 126b - */ 0, - /* 126c - */ 0, - /* 126d - */ 0, - /* 126e - */ 0, - /* 126f - */ 0, - /* 1270 - */ 0, - /* 1271 - _V_66_0F_38_99 */ 0x4116, - /* 1272 - */ 0, - /* 1273 - */ 0, - /* 1274 - */ 0, - /* 1275 - */ 0, - /* 1276 - */ 0, - /* 1277 - */ 0, - /* 1278 - */ 0, - /* 1279 - */ 0, - /* 127a - */ 0, - /* 127b - */ 0, - /* 127c - */ 0, - /* 127d - _V_66_0F_38_9A */ 0x4117, - /* 127e - */ 0, - /* 127f - */ 0, - /* 1280 - */ 0, - /* 1281 - */ 0, - /* 1282 - */ 0, - /* 1283 - */ 0, - /* 1284 - */ 0, - /* 1285 - */ 0, - /* 1286 - */ 0, - /* 1287 - */ 0, - /* 1288 - */ 0, - /* 1289 - _V_66_0F_38_9B */ 0x4118, - /* 128a - */ 0, - /* 128b - */ 0, - /* 128c - */ 0, - /* 128d - */ 0, - /* 128e - */ 0, - /* 128f - */ 0, - /* 1290 - */ 0, - /* 1291 - */ 0, - /* 1292 - */ 0, - /* 1293 - */ 0, - /* 1294 - */ 0, - /* 1295 - _V_66_0F_38_9C */ 0x4119, - /* 1296 - */ 0, - /* 1297 - */ 0, - /* 1298 - */ 0, - /* 1299 - */ 0, - /* 129a - */ 0, - /* 129b - */ 0, - /* 129c - */ 0, - /* 129d - */ 0, - /* 129e - */ 0, - /* 129f - */ 0, - /* 12a0 - */ 0, - /* 12a1 - _V_66_0F_38_9D */ 0x411a, - /* 12a2 - */ 0, - /* 12a3 - */ 0, - /* 12a4 - */ 0, - /* 12a5 - */ 0, - /* 12a6 - */ 0, - /* 12a7 - */ 0, - /* 12a8 - */ 0, - /* 12a9 - */ 0, - /* 12aa - */ 0, - /* 12ab - */ 0, - /* 12ac - */ 0, - /* 12ad - _V_66_0F_38_9E */ 0x411b, - /* 12ae - */ 0, - /* 12af - */ 0, - /* 12b0 - */ 0, - /* 12b1 - */ 0, - /* 12b2 - */ 0, - /* 12b3 - */ 0, - /* 12b4 - */ 0, - /* 12b5 - */ 0, - /* 12b6 - */ 0, - /* 12b7 - */ 0, - /* 12b8 - */ 0, - /* 12b9 - _V_66_0F_38_9F */ 0x411c, - /* 12ba - */ 0, - /* 12bb - */ 0, - /* 12bc - */ 0, - /* 12bd - */ 0, - /* 12be - */ 0, - /* 12bf - */ 0, - /* 12c0 - */ 0, - /* 12c1 - */ 0, - /* 12c2 - */ 0, - /* 12c3 - */ 0, - /* 12c4 - */ 0, - /* 12c5 - _V_66_0F_38_A6 */ 0x411d, - /* 12c6 - */ 0, - /* 12c7 - */ 0, - /* 12c8 - */ 0, - /* 12c9 - */ 0, - /* 12ca - */ 0, - /* 12cb - */ 0, - /* 12cc - */ 0, - /* 12cd - */ 0, - /* 12ce - */ 0, - /* 12cf - */ 0, - /* 12d0 - */ 0, - /* 12d1 - _V_66_0F_38_A7 */ 0x411e, - /* 12d2 - */ 0, - /* 12d3 - */ 0, - /* 12d4 - */ 0, - /* 12d5 - */ 0, - /* 12d6 - */ 0, - /* 12d7 - */ 0, - /* 12d8 - */ 0, - /* 12d9 - */ 0, - /* 12da - */ 0, - /* 12db - */ 0, - /* 12dc - */ 0, - /* 12dd - _V_66_0F_38_A8 */ 0x411f, - /* 12de - */ 0, - /* 12df - */ 0, - /* 12e0 - */ 0, - /* 12e1 - */ 0, - /* 12e2 - */ 0, - /* 12e3 - */ 0, - /* 12e4 - */ 0, - /* 12e5 - */ 0, - /* 12e6 - */ 0, - /* 12e7 - */ 0, - /* 12e8 - */ 0, - /* 12e9 - _V_66_0F_38_A9 */ 0x4120, - /* 12ea - */ 0, - /* 12eb - */ 0, - /* 12ec - */ 0, - /* 12ed - */ 0, - /* 12ee - */ 0, - /* 12ef - */ 0, - /* 12f0 - */ 0, - /* 12f1 - */ 0, - /* 12f2 - */ 0, - /* 12f3 - */ 0, - /* 12f4 - */ 0, - /* 12f5 - _V_66_0F_38_AA */ 0x4121, - /* 12f6 - */ 0, - /* 12f7 - */ 0, - /* 12f8 - */ 0, - /* 12f9 - */ 0, - /* 12fa - */ 0, - /* 12fb - */ 0, - /* 12fc - */ 0, - /* 12fd - */ 0, - /* 12fe - */ 0, - /* 12ff - */ 0, - /* 1300 - */ 0, - /* 1301 - _V_66_0F_38_AB */ 0x4122, - /* 1302 - */ 0, - /* 1303 - */ 0, - /* 1304 - */ 0, - /* 1305 - */ 0, - /* 1306 - */ 0, - /* 1307 - */ 0, - /* 1308 - */ 0, - /* 1309 - */ 0, - /* 130a - */ 0, - /* 130b - */ 0, - /* 130c - */ 0, - /* 130d - _V_66_0F_38_AC */ 0x4123, - /* 130e - */ 0, - /* 130f - */ 0, - /* 1310 - */ 0, - /* 1311 - */ 0, - /* 1312 - */ 0, - /* 1313 - */ 0, - /* 1314 - */ 0, - /* 1315 - */ 0, - /* 1316 - */ 0, - /* 1317 - */ 0, - /* 1318 - */ 0, - /* 1319 - _V_66_0F_38_AD */ 0x4124, - /* 131a - */ 0, - /* 131b - */ 0, - /* 131c - */ 0, - /* 131d - */ 0, - /* 131e - */ 0, - /* 131f - */ 0, - /* 1320 - */ 0, - /* 1321 - */ 0, - /* 1322 - */ 0, - /* 1323 - */ 0, - /* 1324 - */ 0, - /* 1325 - _V_66_0F_38_AE */ 0x4125, - /* 1326 - */ 0, - /* 1327 - */ 0, - /* 1328 - */ 0, - /* 1329 - */ 0, - /* 132a - */ 0, - /* 132b - */ 0, - /* 132c - */ 0, - /* 132d - */ 0, - /* 132e - */ 0, - /* 132f - */ 0, - /* 1330 - */ 0, - /* 1331 - _V_66_0F_38_AF */ 0x4126, - /* 1332 - */ 0, - /* 1333 - */ 0, - /* 1334 - */ 0, - /* 1335 - */ 0, - /* 1336 - */ 0, - /* 1337 - */ 0, - /* 1338 - */ 0, - /* 1339 - */ 0, - /* 133a - */ 0, - /* 133b - */ 0, - /* 133c - */ 0, - /* 133d - _V_66_0F_38_B6 */ 0x4127, - /* 133e - */ 0, - /* 133f - */ 0, - /* 1340 - */ 0, - /* 1341 - */ 0, - /* 1342 - */ 0, - /* 1343 - */ 0, - /* 1344 - */ 0, - /* 1345 - */ 0, - /* 1346 - */ 0, - /* 1347 - */ 0, - /* 1348 - */ 0, - /* 1349 - _V_66_0F_38_B7 */ 0x4128, - /* 134a - */ 0, - /* 134b - */ 0, - /* 134c - */ 0, - /* 134d - */ 0, - /* 134e - */ 0, - /* 134f - */ 0, - /* 1350 - */ 0, - /* 1351 - */ 0, - /* 1352 - */ 0, - /* 1353 - */ 0, - /* 1354 - */ 0, - /* 1355 - _V_66_0F_38_B8 */ 0x4129, - /* 1356 - */ 0, - /* 1357 - */ 0, - /* 1358 - */ 0, - /* 1359 - */ 0, - /* 135a - */ 0, - /* 135b - */ 0, - /* 135c - */ 0, - /* 135d - */ 0, - /* 135e - */ 0, - /* 135f - */ 0, - /* 1360 - */ 0, - /* 1361 - _V_66_0F_38_B9 */ 0x412a, - /* 1362 - */ 0, - /* 1363 - */ 0, - /* 1364 - */ 0, - /* 1365 - */ 0, - /* 1366 - */ 0, - /* 1367 - */ 0, - /* 1368 - */ 0, - /* 1369 - */ 0, - /* 136a - */ 0, - /* 136b - */ 0, - /* 136c - */ 0, - /* 136d - _V_66_0F_38_BA */ 0x412b, - /* 136e - */ 0, - /* 136f - */ 0, - /* 1370 - */ 0, - /* 1371 - */ 0, - /* 1372 - */ 0, - /* 1373 - */ 0, - /* 1374 - */ 0, - /* 1375 - */ 0, - /* 1376 - */ 0, - /* 1377 - */ 0, - /* 1378 - */ 0, - /* 1379 - _V_66_0F_38_BB */ 0x412c, - /* 137a - */ 0, - /* 137b - */ 0, - /* 137c - */ 0, - /* 137d - */ 0, - /* 137e - */ 0, - /* 137f - */ 0, - /* 1380 - */ 0, - /* 1381 - */ 0, - /* 1382 - */ 0, - /* 1383 - */ 0, - /* 1384 - */ 0, - /* 1385 - _V_66_0F_38_BC */ 0x412d, - /* 1386 - */ 0, - /* 1387 - */ 0, - /* 1388 - */ 0, - /* 1389 - */ 0, - /* 138a - */ 0, - /* 138b - */ 0, - /* 138c - */ 0, - /* 138d - */ 0, - /* 138e - */ 0, - /* 138f - */ 0, - /* 1390 - */ 0, - /* 1391 - _V_66_0F_38_BD */ 0x412e, - /* 1392 - */ 0, - /* 1393 - */ 0, - /* 1394 - */ 0, - /* 1395 - */ 0, - /* 1396 - */ 0, - /* 1397 - */ 0, - /* 1398 - */ 0, - /* 1399 - */ 0, - /* 139a - */ 0, - /* 139b - */ 0, - /* 139c - */ 0, - /* 139d - _V_66_0F_38_BE */ 0x412f, - /* 139e - */ 0, - /* 139f - */ 0, - /* 13a0 - */ 0, - /* 13a1 - */ 0, - /* 13a2 - */ 0, - /* 13a3 - */ 0, - /* 13a4 - */ 0, - /* 13a5 - */ 0, - /* 13a6 - */ 0, - /* 13a7 - */ 0, - /* 13a8 - */ 0, - /* 13a9 - _V_66_0F_38_BF */ 0x4130, - /* 13aa - */ 0, - /* 13ab - */ 0, - /* 13ac - */ 0, - /* 13ad - */ 0, - /* 13ae - */ 0, - /* 13af - */ 0, - /* 13b0 - */ 0, - /* 13b1 - _66_0F_38_DB */ 0x24ba, - /* 13b2 - */ 0, - /* 13b3 - */ 0, - /* 13b4 - */ 0, - /* 13b5 - _V_66_0F_38_DB */ 0x4131, - /* 13b6 - */ 0, - /* 13b7 - */ 0, - /* 13b8 - */ 0, - /* 13b9 - */ 0, - /* 13ba - */ 0, - /* 13bb - */ 0, - /* 13bc - */ 0, - /* 13bd - _66_0F_38_DC */ 0x24bb, - /* 13be - */ 0, - /* 13bf - */ 0, - /* 13c0 - */ 0, - /* 13c1 - _V_66_0F_38_DC */ 0x4132, - /* 13c2 - */ 0, - /* 13c3 - */ 0, - /* 13c4 - */ 0, - /* 13c5 - */ 0, - /* 13c6 - */ 0, - /* 13c7 - */ 0, - /* 13c8 - */ 0, - /* 13c9 - _66_0F_38_DD */ 0x24bc, - /* 13ca - */ 0, - /* 13cb - */ 0, - /* 13cc - */ 0, - /* 13cd - _V_66_0F_38_DD */ 0x4133, - /* 13ce - */ 0, - /* 13cf - */ 0, - /* 13d0 - */ 0, - /* 13d1 - */ 0, - /* 13d2 - */ 0, - /* 13d3 - */ 0, - /* 13d4 - */ 0, - /* 13d5 - _66_0F_38_DE */ 0x24bd, - /* 13d6 - */ 0, - /* 13d7 - */ 0, - /* 13d8 - */ 0, - /* 13d9 - _V_66_0F_38_DE */ 0x4134, - /* 13da - */ 0, - /* 13db - */ 0, - /* 13dc - */ 0, - /* 13dd - */ 0, - /* 13de - */ 0, - /* 13df - */ 0, - /* 13e0 - */ 0, - /* 13e1 - _66_0F_38_DF */ 0x24be, - /* 13e2 - */ 0, - /* 13e3 - */ 0, - /* 13e4 - */ 0, - /* 13e5 - _V_66_0F_38_DF */ 0x4135, - /* 13e6 - */ 0, - /* 13e7 - */ 0, - /* 13e8 - */ 0, - /* 13e9 - */ 0, - /* 13ea - */ 0, - /* 13eb - */ 0, - /* 13ec - _0F_38_F0 */ 0x24bf, - /* 13ed - */ 0, - /* 13ee - */ 0, - /* 13ef - _F2_0F_38_F0 */ 0x24c0, - /* 13f0 - */ 0, - /* 13f1 - */ 0, - /* 13f2 - */ 0, - /* 13f3 - */ 0, - /* 13f4 - */ 0, - /* 13f5 - */ 0, - /* 13f6 - */ 0, - /* 13f7 - */ 0, - /* 13f8 - _0F_38_F1 */ 0x24c1, - /* 13f9 - */ 0, - /* 13fa - */ 0, - /* 13fb - _F2_0F_38_F1 */ 0x24c2, - /* 13fc - */ 0, - /* 13fd - */ 0, - /* 13fe - */ 0, - /* 13ff - */ 0, - /* 1400 - */ 0, - /* 1401 - */ 0, - /* 1402 - */ 0, - /* 1403 - */ 0, - /* 1404 - */ 0, - /* 1405 - */ 0, - /* 1406 - */ 0, - /* 1407 - */ 0, - /* 1408 - */ 0, - /* 1409 - _V_66_0F_3A_04 */ 0x4136, - /* 140a - */ 0, - /* 140b - */ 0, - /* 140c - */ 0, - /* 140d - */ 0, - /* 140e - */ 0, - /* 140f - */ 0, - /* 1410 - */ 0, - /* 1411 - */ 0, - /* 1412 - */ 0, - /* 1413 - */ 0, - /* 1414 - */ 0, - /* 1415 - _V_66_0F_3A_05 */ 0x4137, - /* 1416 - */ 0, - /* 1417 - */ 0, - /* 1418 - */ 0, - /* 1419 - */ 0, - /* 141a - */ 0, - /* 141b - */ 0, - /* 141c - */ 0, - /* 141d - */ 0, - /* 141e - */ 0, - /* 141f - */ 0, - /* 1420 - */ 0, - /* 1421 - _V_66_0F_3A_06 */ 0x4138, - /* 1422 - */ 0, - /* 1423 - */ 0, - /* 1424 - */ 0, - /* 1425 - */ 0, - /* 1426 - */ 0, - /* 1427 - */ 0, - /* 1428 - */ 0, - /* 1429 - _66_0F_3A_08 */ 0x4139, - /* 142a - */ 0, - /* 142b - */ 0, - /* 142c - */ 0, - /* 142d - _V_66_0F_3A_08 */ 0x413a, - /* 142e - */ 0, - /* 142f - */ 0, - /* 1430 - */ 0, - /* 1431 - */ 0, - /* 1432 - */ 0, - /* 1433 - */ 0, - /* 1434 - */ 0, - /* 1435 - _66_0F_3A_09 */ 0x413b, - /* 1436 - */ 0, - /* 1437 - */ 0, - /* 1438 - */ 0, - /* 1439 - _V_66_0F_3A_09 */ 0x413c, - /* 143a - */ 0, - /* 143b - */ 0, - /* 143c - */ 0, - /* 143d - */ 0, - /* 143e - */ 0, - /* 143f - */ 0, - /* 1440 - */ 0, - /* 1441 - _66_0F_3A_0A */ 0x413d, - /* 1442 - */ 0, - /* 1443 - */ 0, - /* 1444 - */ 0, - /* 1445 - _V_66_0F_3A_0A */ 0x413e, - /* 1446 - */ 0, - /* 1447 - */ 0, - /* 1448 - */ 0, - /* 1449 - */ 0, - /* 144a - */ 0, - /* 144b - */ 0, - /* 144c - */ 0, - /* 144d - _66_0F_3A_0B */ 0x413f, - /* 144e - */ 0, - /* 144f - */ 0, - /* 1450 - */ 0, - /* 1451 - _V_66_0F_3A_0B */ 0x4140, - /* 1452 - */ 0, - /* 1453 - */ 0, - /* 1454 - */ 0, - /* 1455 - */ 0, - /* 1456 - */ 0, - /* 1457 - */ 0, - /* 1458 - */ 0, - /* 1459 - _66_0F_3A_0C */ 0x4141, - /* 145a - */ 0, - /* 145b - */ 0, - /* 145c - */ 0, - /* 145d - _V_66_0F_3A_0C */ 0x4142, - /* 145e - */ 0, - /* 145f - */ 0, - /* 1460 - */ 0, - /* 1461 - */ 0, - /* 1462 - */ 0, - /* 1463 - */ 0, - /* 1464 - */ 0, - /* 1465 - _66_0F_3A_0D */ 0x4143, - /* 1466 - */ 0, - /* 1467 - */ 0, - /* 1468 - */ 0, - /* 1469 - _V_66_0F_3A_0D */ 0x4144, - /* 146a - */ 0, - /* 146b - */ 0, - /* 146c - */ 0, - /* 146d - */ 0, - /* 146e - */ 0, - /* 146f - */ 0, - /* 1470 - */ 0, - /* 1471 - _66_0F_3A_0E */ 0x4145, - /* 1472 - */ 0, - /* 1473 - */ 0, - /* 1474 - */ 0, - /* 1475 - _V_66_0F_3A_0E */ 0x4146, - /* 1476 - */ 0, - /* 1477 - */ 0, - /* 1478 - */ 0, - /* 1479 - */ 0, - /* 147a - */ 0, - /* 147b - */ 0, - /* 147c - _0F_3A_0F */ 0x4147, - /* 147d - _66_0F_3A_0F */ 0x4148, - /* 147e - */ 0, - /* 147f - */ 0, - /* 1480 - */ 0, - /* 1481 - _V_66_0F_3A_0F */ 0x4149, - /* 1482 - */ 0, - /* 1483 - */ 0, - /* 1484 - */ 0, - /* 1485 - */ 0, - /* 1486 - */ 0, - /* 1487 - */ 0, - /* 1488 - */ 0, - /* 1489 - _66_0F_3A_14 */ 0x414a, - /* 148a - */ 0, - /* 148b - */ 0, - /* 148c - */ 0, - /* 148d - _V_66_0F_3A_14 */ 0x414b, - /* 148e - */ 0, - /* 148f - */ 0, - /* 1490 - */ 0, - /* 1491 - */ 0, - /* 1492 - */ 0, - /* 1493 - */ 0, - /* 1494 - */ 0, - /* 1495 - _66_0F_3A_15 */ 0x414c, - /* 1496 - */ 0, - /* 1497 - */ 0, - /* 1498 - */ 0, - /* 1499 - _V_66_0F_3A_15 */ 0x414d, - /* 149a - */ 0, - /* 149b - */ 0, - /* 149c - */ 0, - /* 149d - */ 0, - /* 149e - */ 0, - /* 149f - */ 0, - /* 14a0 - */ 0, - /* 14a1 - _66_0F_3A_16 */ 0x414e, - /* 14a2 - */ 0, - /* 14a3 - */ 0, - /* 14a4 - */ 0, - /* 14a5 - _V_66_0F_3A_16 */ 0x414f, - /* 14a6 - */ 0, - /* 14a7 - */ 0, - /* 14a8 - */ 0, - /* 14a9 - */ 0, - /* 14aa - */ 0, - /* 14ab - */ 0, - /* 14ac - */ 0, - /* 14ad - _66_0F_3A_17 */ 0x4150, - /* 14ae - */ 0, - /* 14af - */ 0, - /* 14b0 - */ 0, - /* 14b1 - _V_66_0F_3A_17 */ 0x4151, - /* 14b2 - */ 0, - /* 14b3 - */ 0, - /* 14b4 - */ 0, - /* 14b5 - */ 0, - /* 14b6 - */ 0, - /* 14b7 - */ 0, - /* 14b8 - */ 0, - /* 14b9 - */ 0, - /* 14ba - */ 0, - /* 14bb - */ 0, - /* 14bc - */ 0, - /* 14bd - _V_66_0F_3A_18 */ 0x4152, - /* 14be - */ 0, - /* 14bf - */ 0, - /* 14c0 - */ 0, - /* 14c1 - */ 0, - /* 14c2 - */ 0, - /* 14c3 - */ 0, - /* 14c4 - */ 0, - /* 14c5 - */ 0, - /* 14c6 - */ 0, - /* 14c7 - */ 0, - /* 14c8 - */ 0, - /* 14c9 - _V_66_0F_3A_19 */ 0x4153, - /* 14ca - */ 0, - /* 14cb - */ 0, - /* 14cc - */ 0, - /* 14cd - */ 0, - /* 14ce - */ 0, - /* 14cf - */ 0, - /* 14d0 - */ 0, - /* 14d1 - _66_0F_3A_20 */ 0x4154, - /* 14d2 - */ 0, - /* 14d3 - */ 0, - /* 14d4 - */ 0, - /* 14d5 - _V_66_0F_3A_20 */ 0x4155, - /* 14d6 - */ 0, - /* 14d7 - */ 0, - /* 14d8 - */ 0, - /* 14d9 - */ 0, - /* 14da - */ 0, - /* 14db - */ 0, - /* 14dc - */ 0, - /* 14dd - _66_0F_3A_21 */ 0x4156, - /* 14de - */ 0, - /* 14df - */ 0, - /* 14e0 - */ 0, - /* 14e1 - _V_66_0F_3A_21 */ 0x4157, - /* 14e2 - */ 0, - /* 14e3 - */ 0, - /* 14e4 - */ 0, - /* 14e5 - */ 0, - /* 14e6 - */ 0, - /* 14e7 - */ 0, - /* 14e8 - */ 0, - /* 14e9 - _66_0F_3A_22 */ 0x4158, - /* 14ea - */ 0, - /* 14eb - */ 0, - /* 14ec - */ 0, - /* 14ed - _V_66_0F_3A_22 */ 0x4159, - /* 14ee - */ 0, - /* 14ef - */ 0, - /* 14f0 - */ 0, - /* 14f1 - */ 0, - /* 14f2 - */ 0, - /* 14f3 - */ 0, - /* 14f4 - */ 0, - /* 14f5 - _66_0F_3A_40 */ 0x415a, - /* 14f6 - */ 0, - /* 14f7 - */ 0, - /* 14f8 - */ 0, - /* 14f9 - _V_66_0F_3A_40 */ 0x415b, - /* 14fa - */ 0, - /* 14fb - */ 0, - /* 14fc - */ 0, - /* 14fd - */ 0, - /* 14fe - */ 0, - /* 14ff - */ 0, - /* 1500 - */ 0, - /* 1501 - _66_0F_3A_41 */ 0x415c, - /* 1502 - */ 0, - /* 1503 - */ 0, - /* 1504 - */ 0, - /* 1505 - _V_66_0F_3A_41 */ 0x415d, - /* 1506 - */ 0, - /* 1507 - */ 0, - /* 1508 - */ 0, - /* 1509 - */ 0, - /* 150a - */ 0, - /* 150b - */ 0, - /* 150c - */ 0, - /* 150d - _66_0F_3A_42 */ 0x415e, - /* 150e - */ 0, - /* 150f - */ 0, - /* 1510 - */ 0, - /* 1511 - _V_66_0F_3A_42 */ 0x415f, - /* 1512 - */ 0, - /* 1513 - */ 0, - /* 1514 - */ 0, - /* 1515 - */ 0, - /* 1516 - */ 0, - /* 1517 - */ 0, - /* 1518 - */ 0, - /* 1519 - _66_0F_3A_44 */ 0x4160, - /* 151a - */ 0, - /* 151b - */ 0, - /* 151c - */ 0, - /* 151d - _V_66_0F_3A_44 */ 0x4161, - /* 151e - */ 0, - /* 151f - */ 0, - /* 1520 - */ 0, - /* 1521 - */ 0, - /* 1522 - */ 0, - /* 1523 - */ 0, - /* 1524 - */ 0, - /* 1525 - */ 0, - /* 1526 - */ 0, - /* 1527 - */ 0, - /* 1528 - */ 0, - /* 1529 - _V_66_0F_3A_4A */ 0x4162, - /* 152a - */ 0, - /* 152b - */ 0, - /* 152c - */ 0, - /* 152d - */ 0, - /* 152e - */ 0, - /* 152f - */ 0, - /* 1530 - */ 0, - /* 1531 - */ 0, - /* 1532 - */ 0, - /* 1533 - */ 0, - /* 1534 - */ 0, - /* 1535 - _V_66_0F_3A_4B */ 0x4163, - /* 1536 - */ 0, - /* 1537 - */ 0, - /* 1538 - */ 0, - /* 1539 - */ 0, - /* 153a - */ 0, - /* 153b - */ 0, - /* 153c - */ 0, - /* 153d - */ 0, - /* 153e - */ 0, - /* 153f - */ 0, - /* 1540 - */ 0, - /* 1541 - _V_66_0F_3A_4C */ 0x4164, - /* 1542 - */ 0, - /* 1543 - */ 0, - /* 1544 - */ 0, - /* 1545 - */ 0, - /* 1546 - */ 0, - /* 1547 - */ 0, - /* 1548 - */ 0, - /* 1549 - _66_0F_3A_60 */ 0x4165, - /* 154a - */ 0, - /* 154b - */ 0, - /* 154c - */ 0, - /* 154d - _V_66_0F_3A_60 */ 0x4166, - /* 154e - */ 0, - /* 154f - */ 0, - /* 1550 - */ 0, - /* 1551 - */ 0, - /* 1552 - */ 0, - /* 1553 - */ 0, - /* 1554 - */ 0, - /* 1555 - _66_0F_3A_61 */ 0x4167, - /* 1556 - */ 0, - /* 1557 - */ 0, - /* 1558 - */ 0, - /* 1559 - _V_66_0F_3A_61 */ 0x4168, - /* 155a - */ 0, - /* 155b - */ 0, - /* 155c - */ 0, - /* 155d - */ 0, - /* 155e - */ 0, - /* 155f - */ 0, - /* 1560 - */ 0, - /* 1561 - _66_0F_3A_62 */ 0x4169, - /* 1562 - */ 0, - /* 1563 - */ 0, - /* 1564 - */ 0, - /* 1565 - _V_66_0F_3A_62 */ 0x416a, - /* 1566 - */ 0, - /* 1567 - */ 0, - /* 1568 - */ 0, - /* 1569 - */ 0, - /* 156a - */ 0, - /* 156b - */ 0, - /* 156c - */ 0, - /* 156d - _66_0F_3A_63 */ 0x416b, - /* 156e - */ 0, - /* 156f - */ 0, - /* 1570 - */ 0, - /* 1571 - _V_66_0F_3A_63 */ 0x416c, - /* 1572 - */ 0, - /* 1573 - */ 0, - /* 1574 - */ 0, - /* 1575 - */ 0, - /* 1576 - */ 0, - /* 1577 - */ 0, - /* 1578 - */ 0, - /* 1579 - _66_0F_3A_DF */ 0x416d, - /* 157a - */ 0, - /* 157b - */ 0, - /* 157c - */ 0, - /* 157d - _V_66_0F_3A_DF */ 0x416e, - /* 157e - */ 0, - /* 157f - */ 0, - /* 1580 - */ 0, - /* 1581 - */ 0, - /* 1582 - */ 0, - /* 1583 - */ 0, - /* 1584 - _0F_71_02 */ 0x24c3, - /* 1585 - _66_0F_71_02 */ 0x24c4, - /* 1586 - */ 0, - /* 1587 - */ 0, - /* 1588 - */ 0, - /* 1589 - _V_66_0F_71_02 */ 0x416f, - /* 158a - */ 0, - /* 158b - */ 0, - /* 158c - */ 0, - /* 158d - */ 0, - /* 158e - */ 0, - /* 158f - */ 0, - /* 1590 - _0F_71_04 */ 0x24c5, - /* 1591 - _66_0F_71_04 */ 0x24c6, - /* 1592 - */ 0, - /* 1593 - */ 0, - /* 1594 - */ 0, - /* 1595 - _V_66_0F_71_04 */ 0x4170, - /* 1596 - */ 0, - /* 1597 - */ 0, - /* 1598 - */ 0, - /* 1599 - */ 0, - /* 159a - */ 0, - /* 159b - */ 0, - /* 159c - _0F_71_06 */ 0x24c7, - /* 159d - _66_0F_71_06 */ 0x24c8, - /* 159e - */ 0, - /* 159f - */ 0, - /* 15a0 - */ 0, - /* 15a1 - _V_66_0F_71_06 */ 0x4171, - /* 15a2 - */ 0, - /* 15a3 - */ 0, - /* 15a4 - */ 0, - /* 15a5 - */ 0, - /* 15a6 - */ 0, - /* 15a7 - */ 0, - /* 15a8 - _0F_72_02 */ 0x24c9, - /* 15a9 - _66_0F_72_02 */ 0x24ca, - /* 15aa - */ 0, - /* 15ab - */ 0, - /* 15ac - */ 0, - /* 15ad - _V_66_0F_72_02 */ 0x4172, - /* 15ae - */ 0, - /* 15af - */ 0, - /* 15b0 - */ 0, - /* 15b1 - */ 0, - /* 15b2 - */ 0, - /* 15b3 - */ 0, - /* 15b4 - _0F_72_04 */ 0x24cb, - /* 15b5 - _66_0F_72_04 */ 0x24cc, - /* 15b6 - */ 0, - /* 15b7 - */ 0, - /* 15b8 - */ 0, - /* 15b9 - _V_66_0F_72_04 */ 0x4173, - /* 15ba - */ 0, - /* 15bb - */ 0, - /* 15bc - */ 0, - /* 15bd - */ 0, - /* 15be - */ 0, - /* 15bf - */ 0, - /* 15c0 - _0F_72_06 */ 0x24cd, - /* 15c1 - _66_0F_72_06 */ 0x24ce, - /* 15c2 - */ 0, - /* 15c3 - */ 0, - /* 15c4 - */ 0, - /* 15c5 - _V_66_0F_72_06 */ 0x4174, - /* 15c6 - */ 0, - /* 15c7 - */ 0, - /* 15c8 - */ 0, - /* 15c9 - */ 0, - /* 15ca - */ 0, - /* 15cb - */ 0, - /* 15cc - _0F_73_02 */ 0x24cf, - /* 15cd - _66_0F_73_02 */ 0x24d0, - /* 15ce - */ 0, - /* 15cf - */ 0, - /* 15d0 - */ 0, - /* 15d1 - _V_66_0F_73_02 */ 0x4175, - /* 15d2 - */ 0, - /* 15d3 - */ 0, - /* 15d4 - */ 0, - /* 15d5 - */ 0, - /* 15d6 - */ 0, - /* 15d7 - */ 0, - /* 15d8 - */ 0, - /* 15d9 - _66_0F_73_03 */ 0x24d1, - /* 15da - */ 0, - /* 15db - */ 0, - /* 15dc - */ 0, - /* 15dd - _V_66_0F_73_03 */ 0x4176, - /* 15de - */ 0, - /* 15df - */ 0, - /* 15e0 - */ 0, - /* 15e1 - */ 0, - /* 15e2 - */ 0, - /* 15e3 - */ 0, - /* 15e4 - _0F_73_06 */ 0x24d2, - /* 15e5 - _66_0F_73_06 */ 0x24d3, - /* 15e6 - */ 0, - /* 15e7 - */ 0, - /* 15e8 - */ 0, - /* 15e9 - _V_66_0F_73_06 */ 0x4177, - /* 15ea - */ 0, - /* 15eb - */ 0, - /* 15ec - */ 0, - /* 15ed - */ 0, - /* 15ee - */ 0, - /* 15ef - */ 0, - /* 15f0 - */ 0, - /* 15f1 - _66_0F_73_07 */ 0x24d4, - /* 15f2 - */ 0, - /* 15f3 - */ 0, - /* 15f4 - */ 0, - /* 15f5 - _V_66_0F_73_07 */ 0x4178, - /* 15f6 - */ 0, - /* 15f7 - */ 0, - /* 15f8 - */ 0, - /* 15f9 - */ 0, - /* 15fa - */ 0, - /* 15fb - */ 0, - /* 15fc - _0F_AE_00 */ 0x4179, - /* 15fd - */ 0, - /* 15fe - _F3_0F_AE_00 */ 0x24d5, - /* 15ff - */ 0, - /* 1600 - */ 0, - /* 1601 - */ 0, - /* 1602 - */ 0, - /* 1603 - */ 0, - /* 1604 - */ 0, - /* 1605 - */ 0, - /* 1606 - */ 0, - /* 1607 - */ 0, - /* 1608 - _0F_AE_01 */ 0x417a, - /* 1609 - */ 0, - /* 160a - _F3_0F_AE_01 */ 0x24d6, - /* 160b - */ 0, - /* 160c - */ 0, - /* 160d - */ 0, - /* 160e - */ 0, - /* 160f - */ 0, - /* 1610 - */ 0, - /* 1611 - */ 0, - /* 1612 - */ 0, - /* 1613 - */ 0, - /* 1614 - _0F_AE_02 */ 0x24d7, - /* 1615 - */ 0, - /* 1616 - _F3_0F_AE_02 */ 0x24d8, - /* 1617 - */ 0, - /* 1618 - _V_0F_AE_02 */ 0x417b, - /* 1619 - */ 0, - /* 161a - */ 0, - /* 161b - */ 0, - /* 161c - */ 0, - /* 161d - */ 0, - /* 161e - */ 0, - /* 161f - */ 0, - /* 1620 - _0F_AE_03 */ 0x24d9, - /* 1621 - */ 0, - /* 1622 - _F3_0F_AE_03 */ 0x24da, - /* 1623 - */ 0, - /* 1624 - _V_0F_AE_03 */ 0x417c, - /* 1625 - */ 0, - /* 1626 - */ 0, - /* 1627 - */ 0, - /* 1628 - */ 0, - /* 1629 - */ 0, - /* 162a - */ 0, - /* 162b - */ 0, - /* 162c - _0F_C7_06 */ 0x24db, - /* 162d - _66_0F_C7_06 */ 0x24dc, - /* 162e - _F3_0F_C7_06 */ 0x24dd, - /* 162f - */ 0, - /* 1630 - */ 0, - /* 1631 - */ 0, - /* 1632 - */ 0, - /* 1633 - */ 0, - /* 1634 - */ 0, - /* 1635 - */ 0, - /* 1636 - */ 0, - /* 1637 - */ 0 +/* 0 - _00 */ 0x2000, +/* 1 - _01 */ 0x2001, +/* 2 - _02 */ 0x2002, +/* 3 - _03 */ 0x2003, +/* 4 - _04 */ 0x2004, +/* 5 - _05 */ 0x2005, +/* 6 - _06 */ 0x2006, +/* 7 - _07 */ 0x2007, +/* 8 - _08 */ 0x2008, +/* 9 - _09 */ 0x2009, +/* a - _0A */ 0x200a, +/* b - _0B */ 0x200b, +/* c - _0C */ 0x200c, +/* d - _0D */ 0x200d, +/* e - _0E */ 0x200e, +/* f - _0F */ 0x8100, +/* 10 - _10 */ 0x200f, +/* 11 - _11 */ 0x2010, +/* 12 - _12 */ 0x2011, +/* 13 - _13 */ 0x2012, +/* 14 - _14 */ 0x2013, +/* 15 - _15 */ 0x2014, +/* 16 - _16 */ 0x2015, +/* 17 - _17 */ 0x2016, +/* 18 - _18 */ 0x2017, +/* 19 - _19 */ 0x2018, +/* 1a - _1A */ 0x2019, +/* 1b - _1B */ 0x201a, +/* 1c - _1C */ 0x201b, +/* 1d - _1D */ 0x201c, +/* 1e - _1E */ 0x201d, +/* 1f - _1F */ 0x201e, +/* 20 - _20 */ 0x201f, +/* 21 - _21 */ 0x2020, +/* 22 - _22 */ 0x2021, +/* 23 - _23 */ 0x2022, +/* 24 - _24 */ 0x2023, +/* 25 - _25 */ 0x2024, +/* 26 - */ 0, +/* 27 - _27 */ 0x2025, +/* 28 - _28 */ 0x2026, +/* 29 - _29 */ 0x2027, +/* 2a - _2A */ 0x2028, +/* 2b - _2B */ 0x2029, +/* 2c - _2C */ 0x202a, +/* 2d - _2D */ 0x202b, +/* 2e - */ 0, +/* 2f - _2F */ 0x202c, +/* 30 - _30 */ 0x202d, +/* 31 - _31 */ 0x202e, +/* 32 - _32 */ 0x202f, +/* 33 - _33 */ 0x2030, +/* 34 - _34 */ 0x2031, +/* 35 - _35 */ 0x2032, +/* 36 - */ 0, +/* 37 - _37 */ 0x2033, +/* 38 - _38 */ 0x2034, +/* 39 - _39 */ 0x2035, +/* 3a - _3A */ 0x2036, +/* 3b - _3B */ 0x2037, +/* 3c - _3C */ 0x2038, +/* 3d - _3D */ 0x2039, +/* 3e - */ 0, +/* 3f - _3F */ 0x203a, +/* 40 - _40 */ 0x203b, +/* 41 - _40 */ 0x203c, +/* 42 - _40 */ 0x203d, +/* 43 - _40 */ 0x203e, +/* 44 - _40 */ 0x203f, +/* 45 - _40 */ 0x2040, +/* 46 - _40 */ 0x2041, +/* 47 - _40 */ 0x2042, +/* 48 - _48 */ 0x2043, +/* 49 - _48 */ 0x2044, +/* 4a - _48 */ 0x2045, +/* 4b - _48 */ 0x2046, +/* 4c - _48 */ 0x2047, +/* 4d - _48 */ 0x2048, +/* 4e - _48 */ 0x2049, +/* 4f - _48 */ 0x204a, +/* 50 - _50 */ 0x204b, +/* 51 - _50 */ 0x204c, +/* 52 - _50 */ 0x204d, +/* 53 - _50 */ 0x204e, +/* 54 - _50 */ 0x204f, +/* 55 - _50 */ 0x2050, +/* 56 - _50 */ 0x2051, +/* 57 - _50 */ 0x2052, +/* 58 - _58 */ 0x2053, +/* 59 - _58 */ 0x2054, +/* 5a - _58 */ 0x2055, +/* 5b - _58 */ 0x2056, +/* 5c - _58 */ 0x2057, +/* 5d - _58 */ 0x2058, +/* 5e - _58 */ 0x2059, +/* 5f - _58 */ 0x205a, +/* 60 - _60 */ 0x205b, +/* 61 - _61 */ 0x205c, +/* 62 - _62 */ 0x205d, +/* 63 - _63 */ 0x205e, +/* 64 - */ 0, +/* 65 - */ 0, +/* 66 - */ 0, +/* 67 - */ 0, +/* 68 - _68 */ 0x205f, +/* 69 - _69 */ 0x4000, +/* 6a - _6A */ 0x2060, +/* 6b - _6B */ 0x4001, +/* 6c - _6C */ 0x2061, +/* 6d - _6D */ 0x2062, +/* 6e - _6E */ 0x2063, +/* 6f - _6F */ 0x2064, +/* 70 - _70 */ 0x2065, +/* 71 - _71 */ 0x2066, +/* 72 - _72 */ 0x2067, +/* 73 - _73 */ 0x2068, +/* 74 - _74 */ 0x2069, +/* 75 - _75 */ 0x206a, +/* 76 - _76 */ 0x206b, +/* 77 - _77 */ 0x206c, +/* 78 - _78 */ 0x206d, +/* 79 - _79 */ 0x206e, +/* 7a - _7A */ 0x206f, +/* 7b - _7B */ 0x2070, +/* 7c - _7C */ 0x2071, +/* 7d - _7D */ 0x2072, +/* 7e - _7E */ 0x2073, +/* 7f - _7F */ 0x2074, +/* 80 - _80 */ 0x6200, +/* 81 - _81 */ 0x6208, +/* 82 - _82 */ 0x6210, +/* 83 - _83 */ 0x6218, +/* 84 - _84 */ 0x2075, +/* 85 - _85 */ 0x2076, +/* 86 - _86 */ 0x2077, +/* 87 - _87 */ 0x2078, +/* 88 - _88 */ 0x2079, +/* 89 - _89 */ 0x207a, +/* 8a - _8A */ 0x207b, +/* 8b - _8B */ 0x207c, +/* 8c - _8C */ 0x207d, +/* 8d - _8D */ 0x207e, +/* 8e - _8E */ 0x207f, +/* 8f - _8F */ 0x6220, +/* 90 - _90 */ 0x2080, +/* 91 - _91 */ 0x2081, +/* 92 - _92 */ 0x2082, +/* 93 - _93 */ 0x2083, +/* 94 - _94 */ 0x2084, +/* 95 - _95 */ 0x2085, +/* 96 - _96 */ 0x2086, +/* 97 - _97 */ 0x2087, +/* 98 - _98 */ 0x4002, +/* 99 - _99 */ 0x4003, +/* 9a - _9A */ 0x2088, +/* 9b - */ 0, +/* 9c - _9C */ 0x2089, +/* 9d - _9D */ 0x208a, +/* 9e - _9E */ 0x208b, +/* 9f - _9F */ 0x208c, +/* a0 - _A0 */ 0x208d, +/* a1 - _A1 */ 0x208e, +/* a2 - _A2 */ 0x208f, +/* a3 - _A3 */ 0x2090, +/* a4 - _A4 */ 0x2091, +/* a5 - _A5 */ 0x2092, +/* a6 - _A6 */ 0x2093, +/* a7 - _A7 */ 0x2094, +/* a8 - _A8 */ 0x2095, +/* a9 - _A9 */ 0x2096, +/* aa - _AA */ 0x2097, +/* ab - _AB */ 0x2098, +/* ac - _AC */ 0x2099, +/* ad - _AD */ 0x209a, +/* ae - _AE */ 0x209b, +/* af - _AF */ 0x209c, +/* b0 - _B0 */ 0x209d, +/* b1 - _B0 */ 0x209e, +/* b2 - _B0 */ 0x209f, +/* b3 - _B0 */ 0x20a0, +/* b4 - _B0 */ 0x20a1, +/* b5 - _B0 */ 0x20a2, +/* b6 - _B0 */ 0x20a3, +/* b7 - _B0 */ 0x20a4, +/* b8 - _B8 */ 0x20a5, +/* b9 - _B8 */ 0x20a6, +/* ba - _B8 */ 0x20a7, +/* bb - _B8 */ 0x20a8, +/* bc - _B8 */ 0x20a9, +/* bd - _B8 */ 0x20aa, +/* be - _B8 */ 0x20ab, +/* bf - _B8 */ 0x20ac, +/* c0 - _C0 */ 0x6228, +/* c1 - _C1 */ 0x6230, +/* c2 - _C2 */ 0x20ad, +/* c3 - _C3 */ 0x20ae, +/* c4 - _C4 */ 0x20af, +/* c5 - _C5 */ 0x20b0, +/* c6 - _C6 */ 0xa238, +/* c7 - _C7 */ 0xa280, +/* c8 - _C8 */ 0x20b1, +/* c9 - _C9 */ 0x20b2, +/* ca - _CA */ 0x20b3, +/* cb - _CB */ 0x20b4, +/* cc - _CC */ 0x20b5, +/* cd - _CD */ 0x20b6, +/* ce - _CE */ 0x20b7, +/* cf - _CF */ 0x20b8, +/* d0 - _D0 */ 0x62c8, +/* d1 - _D1 */ 0x62d0, +/* d2 - _D2 */ 0x62d8, +/* d3 - _D3 */ 0x62e0, +/* d4 - _D4 */ 0x20b9, +/* d5 - _D5 */ 0x20ba, +/* d6 - _D6 */ 0x20bb, +/* d7 - _D7 */ 0x20bc, +/* d8 - _D8 */ 0xa2e8, +/* d9 - _D9 */ 0xa330, +/* da - _DA */ 0xa378, +/* db - _DB */ 0xa3c0, +/* dc - _DC */ 0xa408, +/* dd - _DD */ 0xa450, +/* de - _DE */ 0xa498, +/* df - _DF */ 0xa4e0, +/* e0 - _E0 */ 0x20bd, +/* e1 - _E1 */ 0x20be, +/* e2 - _E2 */ 0x20bf, +/* e3 - _E3 */ 0x4004, +/* e4 - _E4 */ 0x20c0, +/* e5 - _E5 */ 0x20c1, +/* e6 - _E6 */ 0x20c2, +/* e7 - _E7 */ 0x20c3, +/* e8 - _E8 */ 0x20c4, +/* e9 - _E9 */ 0x20c5, +/* ea - _EA */ 0x20c6, +/* eb - _EB */ 0x20c7, +/* ec - _EC */ 0x20c8, +/* ed - _ED */ 0x20c9, +/* ee - _EE */ 0x20ca, +/* ef - _EF */ 0x20cb, +/* f0 - */ 0, +/* f1 - _F1 */ 0x20cc, +/* f2 - */ 0, +/* f3 - */ 0, +/* f4 - _F4 */ 0x20cd, +/* f5 - _F5 */ 0x20ce, +/* f6 - _F6 */ 0x6528, +/* f7 - _F7 */ 0x6530, +/* f8 - _F8 */ 0x20cf, +/* f9 - _F9 */ 0x20d0, +/* fa - _FA */ 0x20d1, +/* fb - _FB */ 0x20d2, +/* fc - _FC */ 0x20d3, +/* fd - _FD */ 0x20d4, +/* fe - _FE */ 0x6538, +/* ff - _FF */ 0x6540, +/* 100 - _0F_00 */ 0x6548, +/* 101 - _0F_01 */ 0xa550, +/* 102 - _0F_02 */ 0x20d5, +/* 103 - _0F_03 */ 0x20d6, +/* 104 - */ 0, +/* 105 - _0F_05 */ 0x20d7, +/* 106 - _0F_06 */ 0x20d8, +/* 107 - _0F_07 */ 0x20d9, +/* 108 - _0F_08 */ 0x20da, +/* 109 - _0F_09 */ 0x20db, +/* 10a - */ 0, +/* 10b - _0F_0B */ 0x20dc, +/* 10c - */ 0, +/* 10d - _0F_0D */ 0x6598, +/* 10e - _0F_0E */ 0x20dd, +/* 10f - _0F_0F */ 0x85a0, +/* 110 - _0F_10 */ 0xc6a0, +/* 111 - _0F_11 */ 0xc6ac, +/* 112 - _0F_12 */ 0xc6b8, +/* 113 - _0F_13 */ 0xc6c4, +/* 114 - _0F_14 */ 0xc6d0, +/* 115 - _0F_15 */ 0xc6dc, +/* 116 - _0F_16 */ 0xc6e8, +/* 117 - _0F_17 */ 0xc6f4, +/* 118 - _0F_18 */ 0x6700, +/* 119 - */ 0, +/* 11a - */ 0, +/* 11b - */ 0, +/* 11c - */ 0, +/* 11d - */ 0, +/* 11e - */ 0, +/* 11f - _0F_1F */ 0x20de, +/* 120 - _0F_20 */ 0x20df, +/* 121 - _0F_21 */ 0x20e0, +/* 122 - _0F_22 */ 0x20e1, +/* 123 - _0F_23 */ 0x20e2, +/* 124 - */ 0, +/* 125 - */ 0, +/* 126 - */ 0, +/* 127 - */ 0, +/* 128 - _0F_28 */ 0xc708, +/* 129 - _0F_29 */ 0xc714, +/* 12a - _0F_2A */ 0xc720, +/* 12b - _0F_2B */ 0xc72c, +/* 12c - _0F_2C */ 0xc738, +/* 12d - _0F_2D */ 0xc744, +/* 12e - _0F_2E */ 0xc750, +/* 12f - _0F_2F */ 0xc75c, +/* 130 - _0F_30 */ 0x20e3, +/* 131 - _0F_31 */ 0x20e4, +/* 132 - _0F_32 */ 0x20e5, +/* 133 - _0F_33 */ 0x20e6, +/* 134 - _0F_34 */ 0x20e7, +/* 135 - _0F_35 */ 0x20e8, +/* 136 - */ 0, +/* 137 - _0F_37 */ 0x20e9, +/* 138 - _0F_38 */ 0x8768, +/* 139 - */ 0, +/* 13a - _0F_3A */ 0x8868, +/* 13b - */ 0, +/* 13c - */ 0, +/* 13d - */ 0, +/* 13e - */ 0, +/* 13f - */ 0, +/* 140 - _0F_40 */ 0x20ea, +/* 141 - _0F_41 */ 0x20eb, +/* 142 - _0F_42 */ 0x20ec, +/* 143 - _0F_43 */ 0x20ed, +/* 144 - _0F_44 */ 0x20ee, +/* 145 - _0F_45 */ 0x20ef, +/* 146 - _0F_46 */ 0x20f0, +/* 147 - _0F_47 */ 0x20f1, +/* 148 - _0F_48 */ 0x20f2, +/* 149 - _0F_49 */ 0x20f3, +/* 14a - _0F_4A */ 0x20f4, +/* 14b - _0F_4B */ 0x20f5, +/* 14c - _0F_4C */ 0x20f6, +/* 14d - _0F_4D */ 0x20f7, +/* 14e - _0F_4E */ 0x20f8, +/* 14f - _0F_4F */ 0x20f9, +/* 150 - _0F_50 */ 0xc968, +/* 151 - _0F_51 */ 0xc974, +/* 152 - _0F_52 */ 0xc980, +/* 153 - _0F_53 */ 0xc98c, +/* 154 - _0F_54 */ 0xc998, +/* 155 - _0F_55 */ 0xc9a4, +/* 156 - _0F_56 */ 0xc9b0, +/* 157 - _0F_57 */ 0xc9bc, +/* 158 - _0F_58 */ 0xc9c8, +/* 159 - _0F_59 */ 0xc9d4, +/* 15a - _0F_5A */ 0xc9e0, +/* 15b - _0F_5B */ 0xc9ec, +/* 15c - _0F_5C */ 0xc9f8, +/* 15d - _0F_5D */ 0xca04, +/* 15e - _0F_5E */ 0xca10, +/* 15f - _0F_5F */ 0xca1c, +/* 160 - _0F_60 */ 0xca28, +/* 161 - _0F_61 */ 0xca34, +/* 162 - _0F_62 */ 0xca40, +/* 163 - _0F_63 */ 0xca4c, +/* 164 - _0F_64 */ 0xca58, +/* 165 - _0F_65 */ 0xca64, +/* 166 - _0F_66 */ 0xca70, +/* 167 - _0F_67 */ 0xca7c, +/* 168 - _0F_68 */ 0xca88, +/* 169 - _0F_69 */ 0xca94, +/* 16a - _0F_6A */ 0xcaa0, +/* 16b - _0F_6B */ 0xcaac, +/* 16c - _0F_6C */ 0xcab8, +/* 16d - _0F_6D */ 0xcac4, +/* 16e - _0F_6E */ 0xcad0, +/* 16f - _0F_6F */ 0xcadc, +/* 170 - _0F_70 */ 0xcae8, +/* 171 - _0F_71 */ 0x6af4, +/* 172 - _0F_72 */ 0x6afc, +/* 173 - _0F_73 */ 0x6b04, +/* 174 - _0F_74 */ 0xcb0c, +/* 175 - _0F_75 */ 0xcb18, +/* 176 - _0F_76 */ 0xcb24, +/* 177 - _0F_77 */ 0xcb30, +/* 178 - _0F_78 */ 0xcb3c, +/* 179 - _0F_79 */ 0xcb48, +/* 17a - _0F_7A */ 0x8b54, +/* 17b - */ 0, +/* 17c - _0F_7C */ 0xcc54, +/* 17d - _0F_7D */ 0xcc60, +/* 17e - _0F_7E */ 0xcc6c, +/* 17f - _0F_7F */ 0xcc78, +/* 180 - _0F_80 */ 0x20fa, +/* 181 - _0F_81 */ 0x20fb, +/* 182 - _0F_82 */ 0x20fc, +/* 183 - _0F_83 */ 0x20fd, +/* 184 - _0F_84 */ 0x20fe, +/* 185 - _0F_85 */ 0x20ff, +/* 186 - _0F_86 */ 0x2100, +/* 187 - _0F_87 */ 0x2101, +/* 188 - _0F_88 */ 0x2102, +/* 189 - _0F_89 */ 0x2103, +/* 18a - _0F_8A */ 0x2104, +/* 18b - _0F_8B */ 0x2105, +/* 18c - _0F_8C */ 0x2106, +/* 18d - _0F_8D */ 0x2107, +/* 18e - _0F_8E */ 0x2108, +/* 18f - _0F_8F */ 0x2109, +/* 190 - _0F_90 */ 0x210a, +/* 191 - _0F_91 */ 0x210b, +/* 192 - _0F_92 */ 0x210c, +/* 193 - _0F_93 */ 0x210d, +/* 194 - _0F_94 */ 0x210e, +/* 195 - _0F_95 */ 0x210f, +/* 196 - _0F_96 */ 0x2110, +/* 197 - _0F_97 */ 0x2111, +/* 198 - _0F_98 */ 0x2112, +/* 199 - _0F_99 */ 0x2113, +/* 19a - _0F_9A */ 0x2114, +/* 19b - _0F_9B */ 0x2115, +/* 19c - _0F_9C */ 0x2116, +/* 19d - _0F_9D */ 0x2117, +/* 19e - _0F_9E */ 0x2118, +/* 19f - _0F_9F */ 0x2119, +/* 1a0 - _0F_A0 */ 0x211a, +/* 1a1 - _0F_A1 */ 0x211b, +/* 1a2 - _0F_A2 */ 0x211c, +/* 1a3 - _0F_A3 */ 0x211d, +/* 1a4 - _0F_A4 */ 0x4005, +/* 1a5 - _0F_A5 */ 0x4006, +/* 1a6 - */ 0, +/* 1a7 - */ 0, +/* 1a8 - _0F_A8 */ 0x211e, +/* 1a9 - _0F_A9 */ 0x211f, +/* 1aa - _0F_AA */ 0x2120, +/* 1ab - _0F_AB */ 0x2121, +/* 1ac - _0F_AC */ 0x4007, +/* 1ad - _0F_AD */ 0x4008, +/* 1ae - _0F_AE */ 0x6c84, +/* 1af - _0F_AF */ 0x2122, +/* 1b0 - _0F_B0 */ 0x2123, +/* 1b1 - _0F_B1 */ 0x2124, +/* 1b2 - _0F_B2 */ 0x2125, +/* 1b3 - _0F_B3 */ 0x2126, +/* 1b4 - _0F_B4 */ 0x2127, +/* 1b5 - _0F_B5 */ 0x2128, +/* 1b6 - _0F_B6 */ 0x2129, +/* 1b7 - _0F_B7 */ 0x212a, +/* 1b8 - _0F_B8 */ 0xcc8c, +/* 1b9 - _0F_B9 */ 0x212b, +/* 1ba - _0F_BA */ 0x6c98, +/* 1bb - _0F_BB */ 0x212c, +/* 1bc - _0F_BC */ 0xcca0, +/* 1bd - _0F_BD */ 0xccac, +/* 1be - _0F_BE */ 0x212d, +/* 1bf - _0F_BF */ 0x212e, +/* 1c0 - _0F_C0 */ 0x212f, +/* 1c1 - _0F_C1 */ 0x2130, +/* 1c2 - _0F_C2 */ 0xccb8, +/* 1c3 - _0F_C3 */ 0x2131, +/* 1c4 - _0F_C4 */ 0xccc4, +/* 1c5 - _0F_C5 */ 0xccd0, +/* 1c6 - _0F_C6 */ 0xccdc, +/* 1c7 - _0F_C7 */ 0x6ce8, +/* 1c8 - _0F_C8 */ 0x2132, +/* 1c9 - _0F_C8 */ 0x2133, +/* 1ca - _0F_C8 */ 0x2134, +/* 1cb - _0F_C8 */ 0x2135, +/* 1cc - _0F_C8 */ 0x2136, +/* 1cd - _0F_C8 */ 0x2137, +/* 1ce - _0F_C8 */ 0x2138, +/* 1cf - _0F_C8 */ 0x2139, +/* 1d0 - _0F_D0 */ 0xccf0, +/* 1d1 - _0F_D1 */ 0xccfc, +/* 1d2 - _0F_D2 */ 0xcd08, +/* 1d3 - _0F_D3 */ 0xcd14, +/* 1d4 - _0F_D4 */ 0xcd20, +/* 1d5 - _0F_D5 */ 0xcd2c, +/* 1d6 - _0F_D6 */ 0xcd38, +/* 1d7 - _0F_D7 */ 0xcd44, +/* 1d8 - _0F_D8 */ 0xcd50, +/* 1d9 - _0F_D9 */ 0xcd5c, +/* 1da - _0F_DA */ 0xcd68, +/* 1db - _0F_DB */ 0xcd74, +/* 1dc - _0F_DC */ 0xcd80, +/* 1dd - _0F_DD */ 0xcd8c, +/* 1de - _0F_DE */ 0xcd98, +/* 1df - _0F_DF */ 0xcda4, +/* 1e0 - _0F_E0 */ 0xcdb0, +/* 1e1 - _0F_E1 */ 0xcdbc, +/* 1e2 - _0F_E2 */ 0xcdc8, +/* 1e3 - _0F_E3 */ 0xcdd4, +/* 1e4 - _0F_E4 */ 0xcde0, +/* 1e5 - _0F_E5 */ 0xcdec, +/* 1e6 - _0F_E6 */ 0xcdf8, +/* 1e7 - _0F_E7 */ 0xce04, +/* 1e8 - _0F_E8 */ 0xce10, +/* 1e9 - _0F_E9 */ 0xce1c, +/* 1ea - _0F_EA */ 0xce28, +/* 1eb - _0F_EB */ 0xce34, +/* 1ec - _0F_EC */ 0xce40, +/* 1ed - _0F_ED */ 0xce4c, +/* 1ee - _0F_EE */ 0xce58, +/* 1ef - _0F_EF */ 0xce64, +/* 1f0 - _0F_F0 */ 0xce70, +/* 1f1 - _0F_F1 */ 0xce7c, +/* 1f2 - _0F_F2 */ 0xce88, +/* 1f3 - _0F_F3 */ 0xce94, +/* 1f4 - _0F_F4 */ 0xcea0, +/* 1f5 - _0F_F5 */ 0xceac, +/* 1f6 - _0F_F6 */ 0xceb8, +/* 1f7 - _0F_F7 */ 0xcec4, +/* 1f8 - _0F_F8 */ 0xced0, +/* 1f9 - _0F_F9 */ 0xcedc, +/* 1fa - _0F_FA */ 0xcee8, +/* 1fb - _0F_FB */ 0xcef4, +/* 1fc - _0F_FC */ 0xcf00, +/* 1fd - _0F_FD */ 0xcf0c, +/* 1fe - _0F_FE */ 0xcf18, +/* 1ff - */ 0, +/* 200 - _80_00 */ 0x213a, +/* 201 - _80_01 */ 0x213b, +/* 202 - _80_02 */ 0x213c, +/* 203 - _80_03 */ 0x213d, +/* 204 - _80_04 */ 0x213e, +/* 205 - _80_05 */ 0x213f, +/* 206 - _80_06 */ 0x2140, +/* 207 - _80_07 */ 0x2141, +/* 208 - _81_00 */ 0x2142, +/* 209 - _81_01 */ 0x2143, +/* 20a - _81_02 */ 0x2144, +/* 20b - _81_03 */ 0x2145, +/* 20c - _81_04 */ 0x2146, +/* 20d - _81_05 */ 0x2147, +/* 20e - _81_06 */ 0x2148, +/* 20f - _81_07 */ 0x2149, +/* 210 - _82_00 */ 0x214a, +/* 211 - _82_01 */ 0x214b, +/* 212 - _82_02 */ 0x214c, +/* 213 - _82_03 */ 0x214d, +/* 214 - _82_04 */ 0x214e, +/* 215 - _82_05 */ 0x214f, +/* 216 - _82_06 */ 0x2150, +/* 217 - _82_07 */ 0x2151, +/* 218 - _83_00 */ 0x2152, +/* 219 - _83_01 */ 0x2153, +/* 21a - _83_02 */ 0x2154, +/* 21b - _83_03 */ 0x2155, +/* 21c - _83_04 */ 0x2156, +/* 21d - _83_05 */ 0x2157, +/* 21e - _83_06 */ 0x2158, +/* 21f - _83_07 */ 0x2159, +/* 220 - _8F_00 */ 0x215a, +/* 221 - */ 0, +/* 222 - */ 0, +/* 223 - */ 0, +/* 224 - */ 0, +/* 225 - */ 0, +/* 226 - */ 0, +/* 227 - */ 0, +/* 228 - _C0_00 */ 0x215b, +/* 229 - _C0_01 */ 0x215c, +/* 22a - _C0_02 */ 0x215d, +/* 22b - _C0_03 */ 0x215e, +/* 22c - _C0_04 */ 0x215f, +/* 22d - _C0_05 */ 0x2160, +/* 22e - _C0_06 */ 0x2161, +/* 22f - _C0_07 */ 0x2162, +/* 230 - _C1_00 */ 0x2163, +/* 231 - _C1_01 */ 0x2164, +/* 232 - _C1_02 */ 0x2165, +/* 233 - _C1_03 */ 0x2166, +/* 234 - _C1_04 */ 0x2167, +/* 235 - _C1_05 */ 0x2168, +/* 236 - _C1_06 */ 0x2169, +/* 237 - _C1_07 */ 0x216a, +/* 238 - _C6_00 */ 0x216b, +/* 239 - */ 0, +/* 23a - */ 0, +/* 23b - */ 0, +/* 23c - */ 0, +/* 23d - */ 0, +/* 23e - */ 0, +/* 23f - */ 0, +/* 240 - */ 0, +/* 241 - */ 0, +/* 242 - */ 0, +/* 243 - */ 0, +/* 244 - */ 0, +/* 245 - */ 0, +/* 246 - */ 0, +/* 247 - */ 0, +/* 248 - */ 0, +/* 249 - */ 0, +/* 24a - */ 0, +/* 24b - */ 0, +/* 24c - */ 0, +/* 24d - */ 0, +/* 24e - */ 0, +/* 24f - */ 0, +/* 250 - */ 0, +/* 251 - */ 0, +/* 252 - */ 0, +/* 253 - */ 0, +/* 254 - */ 0, +/* 255 - */ 0, +/* 256 - */ 0, +/* 257 - */ 0, +/* 258 - */ 0, +/* 259 - */ 0, +/* 25a - */ 0, +/* 25b - */ 0, +/* 25c - */ 0, +/* 25d - */ 0, +/* 25e - */ 0, +/* 25f - */ 0, +/* 260 - */ 0, +/* 261 - */ 0, +/* 262 - */ 0, +/* 263 - */ 0, +/* 264 - */ 0, +/* 265 - */ 0, +/* 266 - */ 0, +/* 267 - */ 0, +/* 268 - */ 0, +/* 269 - */ 0, +/* 26a - */ 0, +/* 26b - */ 0, +/* 26c - */ 0, +/* 26d - */ 0, +/* 26e - */ 0, +/* 26f - */ 0, +/* 270 - */ 0, +/* 271 - */ 0, +/* 272 - */ 0, +/* 273 - */ 0, +/* 274 - */ 0, +/* 275 - */ 0, +/* 276 - */ 0, +/* 277 - */ 0, +/* 278 - _C6_F8 */ 0x216c, +/* 279 - */ 0, +/* 27a - */ 0, +/* 27b - */ 0, +/* 27c - */ 0, +/* 27d - */ 0, +/* 27e - */ 0, +/* 27f - */ 0, +/* 280 - _C7_00 */ 0x216d, +/* 281 - */ 0, +/* 282 - */ 0, +/* 283 - */ 0, +/* 284 - */ 0, +/* 285 - */ 0, +/* 286 - */ 0, +/* 287 - */ 0, +/* 288 - */ 0, +/* 289 - */ 0, +/* 28a - */ 0, +/* 28b - */ 0, +/* 28c - */ 0, +/* 28d - */ 0, +/* 28e - */ 0, +/* 28f - */ 0, +/* 290 - */ 0, +/* 291 - */ 0, +/* 292 - */ 0, +/* 293 - */ 0, +/* 294 - */ 0, +/* 295 - */ 0, +/* 296 - */ 0, +/* 297 - */ 0, +/* 298 - */ 0, +/* 299 - */ 0, +/* 29a - */ 0, +/* 29b - */ 0, +/* 29c - */ 0, +/* 29d - */ 0, +/* 29e - */ 0, +/* 29f - */ 0, +/* 2a0 - */ 0, +/* 2a1 - */ 0, +/* 2a2 - */ 0, +/* 2a3 - */ 0, +/* 2a4 - */ 0, +/* 2a5 - */ 0, +/* 2a6 - */ 0, +/* 2a7 - */ 0, +/* 2a8 - */ 0, +/* 2a9 - */ 0, +/* 2aa - */ 0, +/* 2ab - */ 0, +/* 2ac - */ 0, +/* 2ad - */ 0, +/* 2ae - */ 0, +/* 2af - */ 0, +/* 2b0 - */ 0, +/* 2b1 - */ 0, +/* 2b2 - */ 0, +/* 2b3 - */ 0, +/* 2b4 - */ 0, +/* 2b5 - */ 0, +/* 2b6 - */ 0, +/* 2b7 - */ 0, +/* 2b8 - */ 0, +/* 2b9 - */ 0, +/* 2ba - */ 0, +/* 2bb - */ 0, +/* 2bc - */ 0, +/* 2bd - */ 0, +/* 2be - */ 0, +/* 2bf - */ 0, +/* 2c0 - _C7_F8 */ 0x216e, +/* 2c1 - */ 0, +/* 2c2 - */ 0, +/* 2c3 - */ 0, +/* 2c4 - */ 0, +/* 2c5 - */ 0, +/* 2c6 - */ 0, +/* 2c7 - */ 0, +/* 2c8 - _D0_00 */ 0x216f, +/* 2c9 - _D0_01 */ 0x2170, +/* 2ca - _D0_02 */ 0x2171, +/* 2cb - _D0_03 */ 0x2172, +/* 2cc - _D0_04 */ 0x2173, +/* 2cd - _D0_05 */ 0x2174, +/* 2ce - _D0_06 */ 0x2175, +/* 2cf - _D0_07 */ 0x2176, +/* 2d0 - _D1_00 */ 0x2177, +/* 2d1 - _D1_01 */ 0x2178, +/* 2d2 - _D1_02 */ 0x2179, +/* 2d3 - _D1_03 */ 0x217a, +/* 2d4 - _D1_04 */ 0x217b, +/* 2d5 - _D1_05 */ 0x217c, +/* 2d6 - _D1_06 */ 0x217d, +/* 2d7 - _D1_07 */ 0x217e, +/* 2d8 - _D2_00 */ 0x217f, +/* 2d9 - _D2_01 */ 0x2180, +/* 2da - _D2_02 */ 0x2181, +/* 2db - _D2_03 */ 0x2182, +/* 2dc - _D2_04 */ 0x2183, +/* 2dd - _D2_05 */ 0x2184, +/* 2de - _D2_06 */ 0x2185, +/* 2df - _D2_07 */ 0x2186, +/* 2e0 - _D3_00 */ 0x2187, +/* 2e1 - _D3_01 */ 0x2188, +/* 2e2 - _D3_02 */ 0x2189, +/* 2e3 - _D3_03 */ 0x218a, +/* 2e4 - _D3_04 */ 0x218b, +/* 2e5 - _D3_05 */ 0x218c, +/* 2e6 - _D3_06 */ 0x218d, +/* 2e7 - _D3_07 */ 0x218e, +/* 2e8 - _D8_00 */ 0x218f, +/* 2e9 - _D8_01 */ 0x2190, +/* 2ea - _D8_02 */ 0x2191, +/* 2eb - _D8_03 */ 0x2192, +/* 2ec - _D8_04 */ 0x2193, +/* 2ed - _D8_05 */ 0x2194, +/* 2ee - _D8_06 */ 0x2195, +/* 2ef - _D8_07 */ 0x2196, +/* 2f0 - _D8_C0 */ 0x2197, +/* 2f1 - _D8_C0 */ 0x2198, +/* 2f2 - _D8_C0 */ 0x2199, +/* 2f3 - _D8_C0 */ 0x219a, +/* 2f4 - _D8_C0 */ 0x219b, +/* 2f5 - _D8_C0 */ 0x219c, +/* 2f6 - _D8_C0 */ 0x219d, +/* 2f7 - _D8_C0 */ 0x219e, +/* 2f8 - _D8_C8 */ 0x219f, +/* 2f9 - _D8_C8 */ 0x21a0, +/* 2fa - _D8_C8 */ 0x21a1, +/* 2fb - _D8_C8 */ 0x21a2, +/* 2fc - _D8_C8 */ 0x21a3, +/* 2fd - _D8_C8 */ 0x21a4, +/* 2fe - _D8_C8 */ 0x21a5, +/* 2ff - _D8_C8 */ 0x21a6, +/* 300 - _D8_D0 */ 0x21a7, +/* 301 - _D8_D0 */ 0x21a8, +/* 302 - _D8_D0 */ 0x21a9, +/* 303 - _D8_D0 */ 0x21aa, +/* 304 - _D8_D0 */ 0x21ab, +/* 305 - _D8_D0 */ 0x21ac, +/* 306 - _D8_D0 */ 0x21ad, +/* 307 - _D8_D0 */ 0x21ae, +/* 308 - _D8_D8 */ 0x21af, +/* 309 - _D8_D9 */ 0x21b0, +/* 30a - _D8_D8 */ 0x21b1, +/* 30b - _D8_D8 */ 0x21b2, +/* 30c - _D8_D8 */ 0x21b3, +/* 30d - _D8_D8 */ 0x21b4, +/* 30e - _D8_D8 */ 0x21b5, +/* 30f - _D8_D8 */ 0x21b6, +/* 310 - _D8_E0 */ 0x21b7, +/* 311 - _D8_E0 */ 0x21b8, +/* 312 - _D8_E0 */ 0x21b9, +/* 313 - _D8_E0 */ 0x21ba, +/* 314 - _D8_E0 */ 0x21bb, +/* 315 - _D8_E0 */ 0x21bc, +/* 316 - _D8_E0 */ 0x21bd, +/* 317 - _D8_E0 */ 0x21be, +/* 318 - _D8_E8 */ 0x21bf, +/* 319 - _D8_E8 */ 0x21c0, +/* 31a - _D8_E8 */ 0x21c1, +/* 31b - _D8_E8 */ 0x21c2, +/* 31c - _D8_E8 */ 0x21c3, +/* 31d - _D8_E8 */ 0x21c4, +/* 31e - _D8_E8 */ 0x21c5, +/* 31f - _D8_E8 */ 0x21c6, +/* 320 - _D8_F0 */ 0x21c7, +/* 321 - _D8_F0 */ 0x21c8, +/* 322 - _D8_F0 */ 0x21c9, +/* 323 - _D8_F0 */ 0x21ca, +/* 324 - _D8_F0 */ 0x21cb, +/* 325 - _D8_F0 */ 0x21cc, +/* 326 - _D8_F0 */ 0x21cd, +/* 327 - _D8_F0 */ 0x21ce, +/* 328 - _D8_F8 */ 0x21cf, +/* 329 - _D8_F8 */ 0x21d0, +/* 32a - _D8_F8 */ 0x21d1, +/* 32b - _D8_F8 */ 0x21d2, +/* 32c - _D8_F8 */ 0x21d3, +/* 32d - _D8_F8 */ 0x21d4, +/* 32e - _D8_F8 */ 0x21d5, +/* 32f - _D8_F8 */ 0x21d6, +/* 330 - _D9_00 */ 0x21d7, +/* 331 - */ 0, +/* 332 - _D9_02 */ 0x21d8, +/* 333 - _D9_03 */ 0x21d9, +/* 334 - _D9_04 */ 0x21da, +/* 335 - _D9_05 */ 0x21db, +/* 336 - _D9_06 */ 0xcf24, +/* 337 - _D9_07 */ 0xcf30, +/* 338 - _D9_C0 */ 0x21dc, +/* 339 - _D9_C0 */ 0x21dd, +/* 33a - _D9_C0 */ 0x21de, +/* 33b - _D9_C0 */ 0x21df, +/* 33c - _D9_C0 */ 0x21e0, +/* 33d - _D9_C0 */ 0x21e1, +/* 33e - _D9_C0 */ 0x21e2, +/* 33f - _D9_C0 */ 0x21e3, +/* 340 - _D9_C8 */ 0x21e4, +/* 341 - _D9_C9 */ 0x21e5, +/* 342 - _D9_C8 */ 0x21e6, +/* 343 - _D9_C8 */ 0x21e7, +/* 344 - _D9_C8 */ 0x21e8, +/* 345 - _D9_C8 */ 0x21e9, +/* 346 - _D9_C8 */ 0x21ea, +/* 347 - _D9_C8 */ 0x21eb, +/* 348 - _D9_D0 */ 0x21ec, +/* 349 - */ 0, +/* 34a - */ 0, +/* 34b - */ 0, +/* 34c - */ 0, +/* 34d - */ 0, +/* 34e - */ 0, +/* 34f - */ 0, +/* 350 - */ 0, +/* 351 - */ 0, +/* 352 - */ 0, +/* 353 - */ 0, +/* 354 - */ 0, +/* 355 - */ 0, +/* 356 - */ 0, +/* 357 - */ 0, +/* 358 - _D9_E0 */ 0x21ed, +/* 359 - _D9_E1 */ 0x21ee, +/* 35a - */ 0, +/* 35b - */ 0, +/* 35c - _D9_E4 */ 0x21ef, +/* 35d - _D9_E5 */ 0x21f0, +/* 35e - */ 0, +/* 35f - */ 0, +/* 360 - _D9_E8 */ 0x21f1, +/* 361 - _D9_E9 */ 0x21f2, +/* 362 - _D9_EA */ 0x21f3, +/* 363 - _D9_EB */ 0x21f4, +/* 364 - _D9_EC */ 0x21f5, +/* 365 - _D9_ED */ 0x21f6, +/* 366 - _D9_EE */ 0x21f7, +/* 367 - */ 0, +/* 368 - _D9_F0 */ 0x21f8, +/* 369 - _D9_F1 */ 0x21f9, +/* 36a - _D9_F2 */ 0x21fa, +/* 36b - _D9_F3 */ 0x21fb, +/* 36c - _D9_F4 */ 0x21fc, +/* 36d - _D9_F5 */ 0x21fd, +/* 36e - _D9_F6 */ 0x21fe, +/* 36f - _D9_F7 */ 0x21ff, +/* 370 - _D9_F8 */ 0x2200, +/* 371 - _D9_F9 */ 0x2201, +/* 372 - _D9_FA */ 0x2202, +/* 373 - _D9_FB */ 0x2203, +/* 374 - _D9_FC */ 0x2204, +/* 375 - _D9_FD */ 0x2205, +/* 376 - _D9_FE */ 0x2206, +/* 377 - _D9_FF */ 0x2207, +/* 378 - _DA_00 */ 0x2208, +/* 379 - _DA_01 */ 0x2209, +/* 37a - _DA_02 */ 0x220a, +/* 37b - _DA_03 */ 0x220b, +/* 37c - _DA_04 */ 0x220c, +/* 37d - _DA_05 */ 0x220d, +/* 37e - _DA_06 */ 0x220e, +/* 37f - _DA_07 */ 0x220f, +/* 380 - _DA_C0 */ 0x2210, +/* 381 - _DA_C0 */ 0x2211, +/* 382 - _DA_C0 */ 0x2212, +/* 383 - _DA_C0 */ 0x2213, +/* 384 - _DA_C0 */ 0x2214, +/* 385 - _DA_C0 */ 0x2215, +/* 386 - _DA_C0 */ 0x2216, +/* 387 - _DA_C0 */ 0x2217, +/* 388 - _DA_C8 */ 0x2218, +/* 389 - _DA_C8 */ 0x2219, +/* 38a - _DA_C8 */ 0x221a, +/* 38b - _DA_C8 */ 0x221b, +/* 38c - _DA_C8 */ 0x221c, +/* 38d - _DA_C8 */ 0x221d, +/* 38e - _DA_C8 */ 0x221e, +/* 38f - _DA_C8 */ 0x221f, +/* 390 - _DA_D0 */ 0x2220, +/* 391 - _DA_D0 */ 0x2221, +/* 392 - _DA_D0 */ 0x2222, +/* 393 - _DA_D0 */ 0x2223, +/* 394 - _DA_D0 */ 0x2224, +/* 395 - _DA_D0 */ 0x2225, +/* 396 - _DA_D0 */ 0x2226, +/* 397 - _DA_D0 */ 0x2227, +/* 398 - _DA_D8 */ 0x2228, +/* 399 - _DA_D8 */ 0x2229, +/* 39a - _DA_D8 */ 0x222a, +/* 39b - _DA_D8 */ 0x222b, +/* 39c - _DA_D8 */ 0x222c, +/* 39d - _DA_D8 */ 0x222d, +/* 39e - _DA_D8 */ 0x222e, +/* 39f - _DA_D8 */ 0x222f, +/* 3a0 - */ 0, +/* 3a1 - */ 0, +/* 3a2 - */ 0, +/* 3a3 - */ 0, +/* 3a4 - */ 0, +/* 3a5 - */ 0, +/* 3a6 - */ 0, +/* 3a7 - */ 0, +/* 3a8 - */ 0, +/* 3a9 - _DA_E9 */ 0x2230, +/* 3aa - */ 0, +/* 3ab - */ 0, +/* 3ac - */ 0, +/* 3ad - */ 0, +/* 3ae - */ 0, +/* 3af - */ 0, +/* 3b0 - */ 0, +/* 3b1 - */ 0, +/* 3b2 - */ 0, +/* 3b3 - */ 0, +/* 3b4 - */ 0, +/* 3b5 - */ 0, +/* 3b6 - */ 0, +/* 3b7 - */ 0, +/* 3b8 - */ 0, +/* 3b9 - */ 0, +/* 3ba - */ 0, +/* 3bb - */ 0, +/* 3bc - */ 0, +/* 3bd - */ 0, +/* 3be - */ 0, +/* 3bf - */ 0, +/* 3c0 - _DB_00 */ 0x2231, +/* 3c1 - _DB_01 */ 0x2232, +/* 3c2 - _DB_02 */ 0x2233, +/* 3c3 - _DB_03 */ 0x2234, +/* 3c4 - */ 0, +/* 3c5 - _DB_05 */ 0x2235, +/* 3c6 - */ 0, +/* 3c7 - _DB_07 */ 0x2236, +/* 3c8 - _DB_C0 */ 0x2237, +/* 3c9 - _DB_C0 */ 0x2238, +/* 3ca - _DB_C0 */ 0x2239, +/* 3cb - _DB_C0 */ 0x223a, +/* 3cc - _DB_C0 */ 0x223b, +/* 3cd - _DB_C0 */ 0x223c, +/* 3ce - _DB_C0 */ 0x223d, +/* 3cf - _DB_C0 */ 0x223e, +/* 3d0 - _DB_C8 */ 0x223f, +/* 3d1 - _DB_C8 */ 0x2240, +/* 3d2 - _DB_C8 */ 0x2241, +/* 3d3 - _DB_C8 */ 0x2242, +/* 3d4 - _DB_C8 */ 0x2243, +/* 3d5 - _DB_C8 */ 0x2244, +/* 3d6 - _DB_C8 */ 0x2245, +/* 3d7 - _DB_C8 */ 0x2246, +/* 3d8 - _DB_D0 */ 0x2247, +/* 3d9 - _DB_D0 */ 0x2248, +/* 3da - _DB_D0 */ 0x2249, +/* 3db - _DB_D0 */ 0x224a, +/* 3dc - _DB_D0 */ 0x224b, +/* 3dd - _DB_D0 */ 0x224c, +/* 3de - _DB_D0 */ 0x224d, +/* 3df - _DB_D0 */ 0x224e, +/* 3e0 - _DB_D8 */ 0x224f, +/* 3e1 - _DB_D8 */ 0x2250, +/* 3e2 - _DB_D8 */ 0x2251, +/* 3e3 - _DB_D8 */ 0x2252, +/* 3e4 - _DB_D8 */ 0x2253, +/* 3e5 - _DB_D8 */ 0x2254, +/* 3e6 - _DB_D8 */ 0x2255, +/* 3e7 - _DB_D8 */ 0x2256, +/* 3e8 - _DB_E0 */ 0x2257, +/* 3e9 - _DB_E1 */ 0x2258, +/* 3ea - _DB_E2 */ 0xcf3c, +/* 3eb - _DB_E3 */ 0xcf48, +/* 3ec - _DB_E4 */ 0x2259, +/* 3ed - */ 0, +/* 3ee - */ 0, +/* 3ef - */ 0, +/* 3f0 - _DB_E8 */ 0x225a, +/* 3f1 - _DB_E8 */ 0x225b, +/* 3f2 - _DB_E8 */ 0x225c, +/* 3f3 - _DB_E8 */ 0x225d, +/* 3f4 - _DB_E8 */ 0x225e, +/* 3f5 - _DB_E8 */ 0x225f, +/* 3f6 - _DB_E8 */ 0x2260, +/* 3f7 - _DB_E8 */ 0x2261, +/* 3f8 - _DB_F0 */ 0x2262, +/* 3f9 - _DB_F0 */ 0x2263, +/* 3fa - _DB_F0 */ 0x2264, +/* 3fb - _DB_F0 */ 0x2265, +/* 3fc - _DB_F0 */ 0x2266, +/* 3fd - _DB_F0 */ 0x2267, +/* 3fe - _DB_F0 */ 0x2268, +/* 3ff - _DB_F0 */ 0x2269, +/* 400 - */ 0, +/* 401 - */ 0, +/* 402 - */ 0, +/* 403 - */ 0, +/* 404 - */ 0, +/* 405 - */ 0, +/* 406 - */ 0, +/* 407 - */ 0, +/* 408 - _DC_00 */ 0x226a, +/* 409 - _DC_01 */ 0x226b, +/* 40a - _DC_02 */ 0x226c, +/* 40b - _DC_03 */ 0x226d, +/* 40c - _DC_04 */ 0x226e, +/* 40d - _DC_05 */ 0x226f, +/* 40e - _DC_06 */ 0x2270, +/* 40f - _DC_07 */ 0x2271, +/* 410 - _DC_C0 */ 0x2272, +/* 411 - _DC_C0 */ 0x2273, +/* 412 - _DC_C0 */ 0x2274, +/* 413 - _DC_C0 */ 0x2275, +/* 414 - _DC_C0 */ 0x2276, +/* 415 - _DC_C0 */ 0x2277, +/* 416 - _DC_C0 */ 0x2278, +/* 417 - _DC_C0 */ 0x2279, +/* 418 - _DC_C8 */ 0x227a, +/* 419 - _DC_C8 */ 0x227b, +/* 41a - _DC_C8 */ 0x227c, +/* 41b - _DC_C8 */ 0x227d, +/* 41c - _DC_C8 */ 0x227e, +/* 41d - _DC_C8 */ 0x227f, +/* 41e - _DC_C8 */ 0x2280, +/* 41f - _DC_C8 */ 0x2281, +/* 420 - */ 0, +/* 421 - */ 0, +/* 422 - */ 0, +/* 423 - */ 0, +/* 424 - */ 0, +/* 425 - */ 0, +/* 426 - */ 0, +/* 427 - */ 0, +/* 428 - */ 0, +/* 429 - */ 0, +/* 42a - */ 0, +/* 42b - */ 0, +/* 42c - */ 0, +/* 42d - */ 0, +/* 42e - */ 0, +/* 42f - */ 0, +/* 430 - _DC_E0 */ 0x2282, +/* 431 - _DC_E0 */ 0x2283, +/* 432 - _DC_E0 */ 0x2284, +/* 433 - _DC_E0 */ 0x2285, +/* 434 - _DC_E0 */ 0x2286, +/* 435 - _DC_E0 */ 0x2287, +/* 436 - _DC_E0 */ 0x2288, +/* 437 - _DC_E0 */ 0x2289, +/* 438 - _DC_E8 */ 0x228a, +/* 439 - _DC_E8 */ 0x228b, +/* 43a - _DC_E8 */ 0x228c, +/* 43b - _DC_E8 */ 0x228d, +/* 43c - _DC_E8 */ 0x228e, +/* 43d - _DC_E8 */ 0x228f, +/* 43e - _DC_E8 */ 0x2290, +/* 43f - _DC_E8 */ 0x2291, +/* 440 - _DC_F0 */ 0x2292, +/* 441 - _DC_F0 */ 0x2293, +/* 442 - _DC_F0 */ 0x2294, +/* 443 - _DC_F0 */ 0x2295, +/* 444 - _DC_F0 */ 0x2296, +/* 445 - _DC_F0 */ 0x2297, +/* 446 - _DC_F0 */ 0x2298, +/* 447 - _DC_F0 */ 0x2299, +/* 448 - _DC_F8 */ 0x229a, +/* 449 - _DC_F8 */ 0x229b, +/* 44a - _DC_F8 */ 0x229c, +/* 44b - _DC_F8 */ 0x229d, +/* 44c - _DC_F8 */ 0x229e, +/* 44d - _DC_F8 */ 0x229f, +/* 44e - _DC_F8 */ 0x22a0, +/* 44f - _DC_F8 */ 0x22a1, +/* 450 - _DD_00 */ 0x22a2, +/* 451 - _DD_01 */ 0x22a3, +/* 452 - _DD_02 */ 0x22a4, +/* 453 - _DD_03 */ 0x22a5, +/* 454 - _DD_04 */ 0x22a6, +/* 455 - */ 0, +/* 456 - _DD_06 */ 0xcf54, +/* 457 - _DD_07 */ 0xcf60, +/* 458 - _DD_C0 */ 0x22a7, +/* 459 - _DD_C0 */ 0x22a8, +/* 45a - _DD_C0 */ 0x22a9, +/* 45b - _DD_C0 */ 0x22aa, +/* 45c - _DD_C0 */ 0x22ab, +/* 45d - _DD_C0 */ 0x22ac, +/* 45e - _DD_C0 */ 0x22ad, +/* 45f - _DD_C0 */ 0x22ae, +/* 460 - */ 0, +/* 461 - */ 0, +/* 462 - */ 0, +/* 463 - */ 0, +/* 464 - */ 0, +/* 465 - */ 0, +/* 466 - */ 0, +/* 467 - */ 0, +/* 468 - _DD_D0 */ 0x22af, +/* 469 - _DD_D0 */ 0x22b0, +/* 46a - _DD_D0 */ 0x22b1, +/* 46b - _DD_D0 */ 0x22b2, +/* 46c - _DD_D0 */ 0x22b3, +/* 46d - _DD_D0 */ 0x22b4, +/* 46e - _DD_D0 */ 0x22b5, +/* 46f - _DD_D0 */ 0x22b6, +/* 470 - _DD_D8 */ 0x22b7, +/* 471 - _DD_D8 */ 0x22b8, +/* 472 - _DD_D8 */ 0x22b9, +/* 473 - _DD_D8 */ 0x22ba, +/* 474 - _DD_D8 */ 0x22bb, +/* 475 - _DD_D8 */ 0x22bc, +/* 476 - _DD_D8 */ 0x22bd, +/* 477 - _DD_D8 */ 0x22be, +/* 478 - _DD_E0 */ 0x22bf, +/* 479 - _DD_E1 */ 0x22c0, +/* 47a - _DD_E0 */ 0x22c1, +/* 47b - _DD_E0 */ 0x22c2, +/* 47c - _DD_E0 */ 0x22c3, +/* 47d - _DD_E0 */ 0x22c4, +/* 47e - _DD_E0 */ 0x22c5, +/* 47f - _DD_E0 */ 0x22c6, +/* 480 - _DD_E8 */ 0x22c7, +/* 481 - _DD_E9 */ 0x22c8, +/* 482 - _DD_E8 */ 0x22c9, +/* 483 - _DD_E8 */ 0x22ca, +/* 484 - _DD_E8 */ 0x22cb, +/* 485 - _DD_E8 */ 0x22cc, +/* 486 - _DD_E8 */ 0x22cd, +/* 487 - _DD_E8 */ 0x22ce, +/* 488 - */ 0, +/* 489 - */ 0, +/* 48a - */ 0, +/* 48b - */ 0, +/* 48c - */ 0, +/* 48d - */ 0, +/* 48e - */ 0, +/* 48f - */ 0, +/* 490 - */ 0, +/* 491 - */ 0, +/* 492 - */ 0, +/* 493 - */ 0, +/* 494 - */ 0, +/* 495 - */ 0, +/* 496 - */ 0, +/* 497 - */ 0, +/* 498 - _DE_00 */ 0x22cf, +/* 499 - _DE_01 */ 0x22d0, +/* 49a - _DE_02 */ 0x22d1, +/* 49b - _DE_03 */ 0x22d2, +/* 49c - _DE_04 */ 0x22d3, +/* 49d - _DE_05 */ 0x22d4, +/* 49e - _DE_06 */ 0x22d5, +/* 49f - _DE_07 */ 0x22d6, +/* 4a0 - _DE_C0 */ 0x22d7, +/* 4a1 - _DE_C1 */ 0x22d8, +/* 4a2 - _DE_C0 */ 0x22d9, +/* 4a3 - _DE_C0 */ 0x22da, +/* 4a4 - _DE_C0 */ 0x22db, +/* 4a5 - _DE_C0 */ 0x22dc, +/* 4a6 - _DE_C0 */ 0x22dd, +/* 4a7 - _DE_C0 */ 0x22de, +/* 4a8 - _DE_C8 */ 0x22df, +/* 4a9 - _DE_C9 */ 0x22e0, +/* 4aa - _DE_C8 */ 0x22e1, +/* 4ab - _DE_C8 */ 0x22e2, +/* 4ac - _DE_C8 */ 0x22e3, +/* 4ad - _DE_C8 */ 0x22e4, +/* 4ae - _DE_C8 */ 0x22e5, +/* 4af - _DE_C8 */ 0x22e6, +/* 4b0 - */ 0, +/* 4b1 - */ 0, +/* 4b2 - */ 0, +/* 4b3 - */ 0, +/* 4b4 - */ 0, +/* 4b5 - */ 0, +/* 4b6 - */ 0, +/* 4b7 - */ 0, +/* 4b8 - */ 0, +/* 4b9 - _DE_D9 */ 0x22e7, +/* 4ba - */ 0, +/* 4bb - */ 0, +/* 4bc - */ 0, +/* 4bd - */ 0, +/* 4be - */ 0, +/* 4bf - */ 0, +/* 4c0 - _DE_E0 */ 0x22e8, +/* 4c1 - _DE_E1 */ 0x22e9, +/* 4c2 - _DE_E0 */ 0x22ea, +/* 4c3 - _DE_E0 */ 0x22eb, +/* 4c4 - _DE_E0 */ 0x22ec, +/* 4c5 - _DE_E0 */ 0x22ed, +/* 4c6 - _DE_E0 */ 0x22ee, +/* 4c7 - _DE_E0 */ 0x22ef, +/* 4c8 - _DE_E8 */ 0x22f0, +/* 4c9 - _DE_E9 */ 0x22f1, +/* 4ca - _DE_E8 */ 0x22f2, +/* 4cb - _DE_E8 */ 0x22f3, +/* 4cc - _DE_E8 */ 0x22f4, +/* 4cd - _DE_E8 */ 0x22f5, +/* 4ce - _DE_E8 */ 0x22f6, +/* 4cf - _DE_E8 */ 0x22f7, +/* 4d0 - _DE_F0 */ 0x22f8, +/* 4d1 - _DE_F1 */ 0x22f9, +/* 4d2 - _DE_F0 */ 0x22fa, +/* 4d3 - _DE_F0 */ 0x22fb, +/* 4d4 - _DE_F0 */ 0x22fc, +/* 4d5 - _DE_F0 */ 0x22fd, +/* 4d6 - _DE_F0 */ 0x22fe, +/* 4d7 - _DE_F0 */ 0x22ff, +/* 4d8 - _DE_F8 */ 0x2300, +/* 4d9 - _DE_F9 */ 0x2301, +/* 4da - _DE_F8 */ 0x2302, +/* 4db - _DE_F8 */ 0x2303, +/* 4dc - _DE_F8 */ 0x2304, +/* 4dd - _DE_F8 */ 0x2305, +/* 4de - _DE_F8 */ 0x2306, +/* 4df - _DE_F8 */ 0x2307, +/* 4e0 - _DF_00 */ 0x2308, +/* 4e1 - _DF_01 */ 0x2309, +/* 4e2 - _DF_02 */ 0x230a, +/* 4e3 - _DF_03 */ 0x230b, +/* 4e4 - _DF_04 */ 0x230c, +/* 4e5 - _DF_05 */ 0x230d, +/* 4e6 - _DF_06 */ 0x230e, +/* 4e7 - _DF_07 */ 0x230f, +/* 4e8 - */ 0, +/* 4e9 - */ 0, +/* 4ea - */ 0, +/* 4eb - */ 0, +/* 4ec - */ 0, +/* 4ed - */ 0, +/* 4ee - */ 0, +/* 4ef - */ 0, +/* 4f0 - */ 0, +/* 4f1 - */ 0, +/* 4f2 - */ 0, +/* 4f3 - */ 0, +/* 4f4 - */ 0, +/* 4f5 - */ 0, +/* 4f6 - */ 0, +/* 4f7 - */ 0, +/* 4f8 - */ 0, +/* 4f9 - */ 0, +/* 4fa - */ 0, +/* 4fb - */ 0, +/* 4fc - */ 0, +/* 4fd - */ 0, +/* 4fe - */ 0, +/* 4ff - */ 0, +/* 500 - */ 0, +/* 501 - */ 0, +/* 502 - */ 0, +/* 503 - */ 0, +/* 504 - */ 0, +/* 505 - */ 0, +/* 506 - */ 0, +/* 507 - */ 0, +/* 508 - _DF_E0 */ 0xcf6c, +/* 509 - */ 0, +/* 50a - */ 0, +/* 50b - */ 0, +/* 50c - */ 0, +/* 50d - */ 0, +/* 50e - */ 0, +/* 50f - */ 0, +/* 510 - _DF_E8 */ 0x2310, +/* 511 - _DF_E8 */ 0x2311, +/* 512 - _DF_E8 */ 0x2312, +/* 513 - _DF_E8 */ 0x2313, +/* 514 - _DF_E8 */ 0x2314, +/* 515 - _DF_E8 */ 0x2315, +/* 516 - _DF_E8 */ 0x2316, +/* 517 - _DF_E8 */ 0x2317, +/* 518 - _DF_F0 */ 0x2318, +/* 519 - _DF_F0 */ 0x2319, +/* 51a - _DF_F0 */ 0x231a, +/* 51b - _DF_F0 */ 0x231b, +/* 51c - _DF_F0 */ 0x231c, +/* 51d - _DF_F0 */ 0x231d, +/* 51e - _DF_F0 */ 0x231e, +/* 51f - _DF_F0 */ 0x231f, +/* 520 - */ 0, +/* 521 - */ 0, +/* 522 - */ 0, +/* 523 - */ 0, +/* 524 - */ 0, +/* 525 - */ 0, +/* 526 - */ 0, +/* 527 - */ 0, +/* 528 - _F6_00 */ 0x2320, +/* 529 - */ 0, +/* 52a - _F6_02 */ 0x2321, +/* 52b - _F6_03 */ 0x2322, +/* 52c - _F6_04 */ 0x2323, +/* 52d - _F6_05 */ 0x2324, +/* 52e - _F6_06 */ 0x2325, +/* 52f - _F6_07 */ 0x2326, +/* 530 - _F7_00 */ 0x2327, +/* 531 - */ 0, +/* 532 - _F7_02 */ 0x2328, +/* 533 - _F7_03 */ 0x2329, +/* 534 - _F7_04 */ 0x232a, +/* 535 - _F7_05 */ 0x232b, +/* 536 - _F7_06 */ 0x232c, +/* 537 - _F7_07 */ 0x232d, +/* 538 - _FE_00 */ 0x232e, +/* 539 - _FE_01 */ 0x232f, +/* 53a - */ 0, +/* 53b - */ 0, +/* 53c - */ 0, +/* 53d - */ 0, +/* 53e - */ 0, +/* 53f - */ 0, +/* 540 - _FF_00 */ 0x2330, +/* 541 - _FF_01 */ 0x2331, +/* 542 - _FF_02 */ 0x2332, +/* 543 - _FF_03 */ 0x2333, +/* 544 - _FF_04 */ 0x2334, +/* 545 - _FF_05 */ 0x2335, +/* 546 - _FF_06 */ 0x2336, +/* 547 - */ 0, +/* 548 - _0F_00_00 */ 0x2337, +/* 549 - _0F_00_01 */ 0x2338, +/* 54a - _0F_00_02 */ 0x2339, +/* 54b - _0F_00_03 */ 0x233a, +/* 54c - _0F_00_04 */ 0x233b, +/* 54d - _0F_00_05 */ 0x233c, +/* 54e - */ 0, +/* 54f - */ 0, +/* 550 - _0F_01_00 */ 0x233d, +/* 551 - _0F_01_01 */ 0x233e, +/* 552 - _0F_01_02 */ 0x233f, +/* 553 - _0F_01_03 */ 0x2340, +/* 554 - _0F_01_04 */ 0x2341, +/* 555 - */ 0, +/* 556 - _0F_01_06 */ 0x2342, +/* 557 - _0F_01_07 */ 0x2343, +/* 558 - */ 0, +/* 559 - _0F_01_C1 */ 0x2344, +/* 55a - _0F_01_C2 */ 0x2345, +/* 55b - _0F_01_C3 */ 0x2346, +/* 55c - _0F_01_C4 */ 0x2347, +/* 55d - */ 0, +/* 55e - */ 0, +/* 55f - */ 0, +/* 560 - _0F_01_C8 */ 0x2348, +/* 561 - _0F_01_C9 */ 0x2349, +/* 562 - */ 0, +/* 563 - */ 0, +/* 564 - */ 0, +/* 565 - */ 0, +/* 566 - */ 0, +/* 567 - */ 0, +/* 568 - _0F_01_D0 */ 0x234a, +/* 569 - _0F_01_D1 */ 0x234b, +/* 56a - */ 0, +/* 56b - */ 0, +/* 56c - _0F_01_D4 */ 0x234c, +/* 56d - _0F_01_D5 */ 0x234d, +/* 56e - */ 0, +/* 56f - */ 0, +/* 570 - _0F_01_D8 */ 0x234e, +/* 571 - _0F_01_D9 */ 0x234f, +/* 572 - _0F_01_DA */ 0x2350, +/* 573 - _0F_01_DB */ 0x2351, +/* 574 - _0F_01_DC */ 0x2352, +/* 575 - _0F_01_DD */ 0x2353, +/* 576 - _0F_01_DE */ 0x2354, +/* 577 - _0F_01_DF */ 0x2355, +/* 578 - */ 0, +/* 579 - */ 0, +/* 57a - */ 0, +/* 57b - */ 0, +/* 57c - */ 0, +/* 57d - */ 0, +/* 57e - */ 0, +/* 57f - */ 0, +/* 580 - */ 0, +/* 581 - */ 0, +/* 582 - */ 0, +/* 583 - */ 0, +/* 584 - */ 0, +/* 585 - */ 0, +/* 586 - */ 0, +/* 587 - */ 0, +/* 588 - */ 0, +/* 589 - */ 0, +/* 58a - */ 0, +/* 58b - */ 0, +/* 58c - */ 0, +/* 58d - */ 0, +/* 58e - */ 0, +/* 58f - */ 0, +/* 590 - _0F_01_F8 */ 0x2356, +/* 591 - _0F_01_F9 */ 0x2357, +/* 592 - */ 0, +/* 593 - */ 0, +/* 594 - */ 0, +/* 595 - */ 0, +/* 596 - */ 0, +/* 597 - */ 0, +/* 598 - _0F_0D_00 */ 0x2358, +/* 599 - _0F_0D_01 */ 0x2359, +/* 59a - */ 0, +/* 59b - */ 0, +/* 59c - */ 0, +/* 59d - */ 0, +/* 59e - */ 0, +/* 59f - */ 0, +/* 5a0 - */ 0, +/* 5a1 - */ 0, +/* 5a2 - */ 0, +/* 5a3 - */ 0, +/* 5a4 - */ 0, +/* 5a5 - */ 0, +/* 5a6 - */ 0, +/* 5a7 - */ 0, +/* 5a8 - */ 0, +/* 5a9 - */ 0, +/* 5aa - */ 0, +/* 5ab - */ 0, +/* 5ac - _0F_0F_0C */ 0x235a, +/* 5ad - _0F_0F_0D */ 0x235b, +/* 5ae - */ 0, +/* 5af - */ 0, +/* 5b0 - */ 0, +/* 5b1 - */ 0, +/* 5b2 - */ 0, +/* 5b3 - */ 0, +/* 5b4 - */ 0, +/* 5b5 - */ 0, +/* 5b6 - */ 0, +/* 5b7 - */ 0, +/* 5b8 - */ 0, +/* 5b9 - */ 0, +/* 5ba - */ 0, +/* 5bb - */ 0, +/* 5bc - _0F_0F_1C */ 0x235c, +/* 5bd - _0F_0F_1D */ 0x235d, +/* 5be - */ 0, +/* 5bf - */ 0, +/* 5c0 - */ 0, +/* 5c1 - */ 0, +/* 5c2 - */ 0, +/* 5c3 - */ 0, +/* 5c4 - */ 0, +/* 5c5 - */ 0, +/* 5c6 - */ 0, +/* 5c7 - */ 0, +/* 5c8 - */ 0, +/* 5c9 - */ 0, +/* 5ca - */ 0, +/* 5cb - */ 0, +/* 5cc - */ 0, +/* 5cd - */ 0, +/* 5ce - */ 0, +/* 5cf - */ 0, +/* 5d0 - */ 0, +/* 5d1 - */ 0, +/* 5d2 - */ 0, +/* 5d3 - */ 0, +/* 5d4 - */ 0, +/* 5d5 - */ 0, +/* 5d6 - */ 0, +/* 5d7 - */ 0, +/* 5d8 - */ 0, +/* 5d9 - */ 0, +/* 5da - */ 0, +/* 5db - */ 0, +/* 5dc - */ 0, +/* 5dd - */ 0, +/* 5de - */ 0, +/* 5df - */ 0, +/* 5e0 - */ 0, +/* 5e1 - */ 0, +/* 5e2 - */ 0, +/* 5e3 - */ 0, +/* 5e4 - */ 0, +/* 5e5 - */ 0, +/* 5e6 - */ 0, +/* 5e7 - */ 0, +/* 5e8 - */ 0, +/* 5e9 - */ 0, +/* 5ea - */ 0, +/* 5eb - */ 0, +/* 5ec - */ 0, +/* 5ed - */ 0, +/* 5ee - */ 0, +/* 5ef - */ 0, +/* 5f0 - */ 0, +/* 5f1 - */ 0, +/* 5f2 - */ 0, +/* 5f3 - */ 0, +/* 5f4 - */ 0, +/* 5f5 - */ 0, +/* 5f6 - */ 0, +/* 5f7 - */ 0, +/* 5f8 - */ 0, +/* 5f9 - */ 0, +/* 5fa - */ 0, +/* 5fb - */ 0, +/* 5fc - */ 0, +/* 5fd - */ 0, +/* 5fe - */ 0, +/* 5ff - */ 0, +/* 600 - */ 0, +/* 601 - */ 0, +/* 602 - */ 0, +/* 603 - */ 0, +/* 604 - */ 0, +/* 605 - */ 0, +/* 606 - */ 0, +/* 607 - */ 0, +/* 608 - */ 0, +/* 609 - */ 0, +/* 60a - */ 0, +/* 60b - */ 0, +/* 60c - */ 0, +/* 60d - */ 0, +/* 60e - */ 0, +/* 60f - */ 0, +/* 610 - */ 0, +/* 611 - */ 0, +/* 612 - */ 0, +/* 613 - */ 0, +/* 614 - */ 0, +/* 615 - */ 0, +/* 616 - */ 0, +/* 617 - */ 0, +/* 618 - */ 0, +/* 619 - */ 0, +/* 61a - */ 0, +/* 61b - */ 0, +/* 61c - */ 0, +/* 61d - */ 0, +/* 61e - */ 0, +/* 61f - */ 0, +/* 620 - */ 0, +/* 621 - */ 0, +/* 622 - */ 0, +/* 623 - */ 0, +/* 624 - */ 0, +/* 625 - */ 0, +/* 626 - */ 0, +/* 627 - */ 0, +/* 628 - */ 0, +/* 629 - */ 0, +/* 62a - _0F_0F_8A */ 0x235e, +/* 62b - */ 0, +/* 62c - */ 0, +/* 62d - */ 0, +/* 62e - _0F_0F_8E */ 0x235f, +/* 62f - */ 0, +/* 630 - _0F_0F_90 */ 0x2360, +/* 631 - */ 0, +/* 632 - */ 0, +/* 633 - */ 0, +/* 634 - _0F_0F_94 */ 0x2361, +/* 635 - */ 0, +/* 636 - _0F_0F_96 */ 0x2362, +/* 637 - _0F_0F_97 */ 0x2363, +/* 638 - */ 0, +/* 639 - */ 0, +/* 63a - _0F_0F_9A */ 0x2364, +/* 63b - */ 0, +/* 63c - */ 0, +/* 63d - */ 0, +/* 63e - _0F_0F_9E */ 0x2365, +/* 63f - */ 0, +/* 640 - _0F_0F_A0 */ 0x2366, +/* 641 - */ 0, +/* 642 - */ 0, +/* 643 - */ 0, +/* 644 - _0F_0F_A4 */ 0x2367, +/* 645 - */ 0, +/* 646 - _0F_0F_A6 */ 0x2368, +/* 647 - _0F_0F_A7 */ 0x2369, +/* 648 - */ 0, +/* 649 - */ 0, +/* 64a - _0F_0F_AA */ 0x236a, +/* 64b - */ 0, +/* 64c - */ 0, +/* 64d - */ 0, +/* 64e - _0F_0F_AE */ 0x236b, +/* 64f - */ 0, +/* 650 - _0F_0F_B0 */ 0x236c, +/* 651 - */ 0, +/* 652 - */ 0, +/* 653 - */ 0, +/* 654 - _0F_0F_B4 */ 0x236d, +/* 655 - */ 0, +/* 656 - _0F_0F_B6 */ 0x236e, +/* 657 - _0F_0F_B7 */ 0x236f, +/* 658 - */ 0, +/* 659 - */ 0, +/* 65a - */ 0, +/* 65b - _0F_0F_BB */ 0x2370, +/* 65c - */ 0, +/* 65d - */ 0, +/* 65e - */ 0, +/* 65f - _0F_0F_BF */ 0x2371, +/* 660 - */ 0, +/* 661 - */ 0, +/* 662 - */ 0, +/* 663 - */ 0, +/* 664 - */ 0, +/* 665 - */ 0, +/* 666 - */ 0, +/* 667 - */ 0, +/* 668 - */ 0, +/* 669 - */ 0, +/* 66a - */ 0, +/* 66b - */ 0, +/* 66c - */ 0, +/* 66d - */ 0, +/* 66e - */ 0, +/* 66f - */ 0, +/* 670 - */ 0, +/* 671 - */ 0, +/* 672 - */ 0, +/* 673 - */ 0, +/* 674 - */ 0, +/* 675 - */ 0, +/* 676 - */ 0, +/* 677 - */ 0, +/* 678 - */ 0, +/* 679 - */ 0, +/* 67a - */ 0, +/* 67b - */ 0, +/* 67c - */ 0, +/* 67d - */ 0, +/* 67e - */ 0, +/* 67f - */ 0, +/* 680 - */ 0, +/* 681 - */ 0, +/* 682 - */ 0, +/* 683 - */ 0, +/* 684 - */ 0, +/* 685 - */ 0, +/* 686 - */ 0, +/* 687 - */ 0, +/* 688 - */ 0, +/* 689 - */ 0, +/* 68a - */ 0, +/* 68b - */ 0, +/* 68c - */ 0, +/* 68d - */ 0, +/* 68e - */ 0, +/* 68f - */ 0, +/* 690 - */ 0, +/* 691 - */ 0, +/* 692 - */ 0, +/* 693 - */ 0, +/* 694 - */ 0, +/* 695 - */ 0, +/* 696 - */ 0, +/* 697 - */ 0, +/* 698 - */ 0, +/* 699 - */ 0, +/* 69a - */ 0, +/* 69b - */ 0, +/* 69c - */ 0, +/* 69d - */ 0, +/* 69e - */ 0, +/* 69f - */ 0, +/* 6a0 - _0F_10 */ 0x2372, +/* 6a1 - _66_0F_10 */ 0x2373, +/* 6a2 - _F3_0F_10 */ 0x2374, +/* 6a3 - _F2_0F_10 */ 0x2375, +/* 6a4 - _V_0F_10 */ 0x4009, +/* 6a5 - _V_66_0F_10 */ 0x400a, +/* 6a6 - _V_F3_0F_10 */ 0x400b, +/* 6a7 - _V_F2_0F_10 */ 0x400c, +/* 6a8 - */ 0, +/* 6a9 - */ 0, +/* 6aa - _VRR_F3_0F_10 */ 0x400d, +/* 6ab - _VRR_F2_0F_10 */ 0x400e, +/* 6ac - _0F_11 */ 0x2376, +/* 6ad - _66_0F_11 */ 0x2377, +/* 6ae - _F3_0F_11 */ 0x2378, +/* 6af - _F2_0F_11 */ 0x2379, +/* 6b0 - _V_0F_11 */ 0x400f, +/* 6b1 - _V_66_0F_11 */ 0x4010, +/* 6b2 - _V_F3_0F_11 */ 0x4011, +/* 6b3 - _V_F2_0F_11 */ 0x4012, +/* 6b4 - */ 0, +/* 6b5 - */ 0, +/* 6b6 - _VRR_F3_0F_11 */ 0x4013, +/* 6b7 - _VRR_F2_0F_11 */ 0x4014, +/* 6b8 - _0F_12 */ 0x4015, +/* 6b9 - _66_0F_12 */ 0x237a, +/* 6ba - _F3_0F_12 */ 0x237b, +/* 6bb - _F2_0F_12 */ 0x237c, +/* 6bc - _V_0F_12 */ 0x4016, +/* 6bd - _V_66_0F_12 */ 0x4017, +/* 6be - _V_F3_0F_12 */ 0x4018, +/* 6bf - _V_F2_0F_12 */ 0x4019, +/* 6c0 - */ 0, +/* 6c1 - */ 0, +/* 6c2 - */ 0, +/* 6c3 - */ 0, +/* 6c4 - _0F_13 */ 0x237d, +/* 6c5 - _66_0F_13 */ 0x237e, +/* 6c6 - */ 0, +/* 6c7 - */ 0, +/* 6c8 - _V_0F_13 */ 0x401a, +/* 6c9 - _V_66_0F_13 */ 0x401b, +/* 6ca - */ 0, +/* 6cb - */ 0, +/* 6cc - */ 0, +/* 6cd - */ 0, +/* 6ce - */ 0, +/* 6cf - */ 0, +/* 6d0 - _0F_14 */ 0x237f, +/* 6d1 - _66_0F_14 */ 0x2380, +/* 6d2 - */ 0, +/* 6d3 - */ 0, +/* 6d4 - _V_0F_14 */ 0x401c, +/* 6d5 - _V_66_0F_14 */ 0x401d, +/* 6d6 - */ 0, +/* 6d7 - */ 0, +/* 6d8 - */ 0, +/* 6d9 - */ 0, +/* 6da - */ 0, +/* 6db - */ 0, +/* 6dc - _0F_15 */ 0x2381, +/* 6dd - _66_0F_15 */ 0x2382, +/* 6de - */ 0, +/* 6df - */ 0, +/* 6e0 - _V_0F_15 */ 0x401e, +/* 6e1 - _V_66_0F_15 */ 0x401f, +/* 6e2 - */ 0, +/* 6e3 - */ 0, +/* 6e4 - */ 0, +/* 6e5 - */ 0, +/* 6e6 - */ 0, +/* 6e7 - */ 0, +/* 6e8 - _0F_16 */ 0x4020, +/* 6e9 - _66_0F_16 */ 0x2383, +/* 6ea - _F3_0F_16 */ 0x2384, +/* 6eb - */ 0, +/* 6ec - _V_0F_16 */ 0x4021, +/* 6ed - _V_66_0F_16 */ 0x4022, +/* 6ee - _V_F3_0F_16 */ 0x4023, +/* 6ef - */ 0, +/* 6f0 - */ 0, +/* 6f1 - */ 0, +/* 6f2 - */ 0, +/* 6f3 - */ 0, +/* 6f4 - _0F_17 */ 0x2385, +/* 6f5 - _66_0F_17 */ 0x2386, +/* 6f6 - */ 0, +/* 6f7 - */ 0, +/* 6f8 - _V_0F_17 */ 0x4024, +/* 6f9 - _V_66_0F_17 */ 0x4025, +/* 6fa - */ 0, +/* 6fb - */ 0, +/* 6fc - */ 0, +/* 6fd - */ 0, +/* 6fe - */ 0, +/* 6ff - */ 0, +/* 700 - _0F_18_00 */ 0x2387, +/* 701 - _0F_18_01 */ 0x2388, +/* 702 - _0F_18_02 */ 0x2389, +/* 703 - _0F_18_03 */ 0x238a, +/* 704 - */ 0, +/* 705 - */ 0, +/* 706 - */ 0, +/* 707 - */ 0, +/* 708 - _0F_28 */ 0x238b, +/* 709 - _66_0F_28 */ 0x238c, +/* 70a - */ 0, +/* 70b - */ 0, +/* 70c - _V_0F_28 */ 0x4026, +/* 70d - _V_66_0F_28 */ 0x4027, +/* 70e - */ 0, +/* 70f - */ 0, +/* 710 - */ 0, +/* 711 - */ 0, +/* 712 - */ 0, +/* 713 - */ 0, +/* 714 - _0F_29 */ 0x238d, +/* 715 - _66_0F_29 */ 0x238e, +/* 716 - */ 0, +/* 717 - */ 0, +/* 718 - _V_0F_29 */ 0x4028, +/* 719 - _V_66_0F_29 */ 0x4029, +/* 71a - */ 0, +/* 71b - */ 0, +/* 71c - */ 0, +/* 71d - */ 0, +/* 71e - */ 0, +/* 71f - */ 0, +/* 720 - _0F_2A */ 0x238f, +/* 721 - _66_0F_2A */ 0x2390, +/* 722 - _F3_0F_2A */ 0x2391, +/* 723 - _F2_0F_2A */ 0x2392, +/* 724 - */ 0, +/* 725 - */ 0, +/* 726 - _V_F3_0F_2A */ 0x402a, +/* 727 - _V_F2_0F_2A */ 0x402b, +/* 728 - */ 0, +/* 729 - */ 0, +/* 72a - */ 0, +/* 72b - */ 0, +/* 72c - _0F_2B */ 0x2393, +/* 72d - _66_0F_2B */ 0x2394, +/* 72e - _F3_0F_2B */ 0x2395, +/* 72f - _F2_0F_2B */ 0x2396, +/* 730 - _V_0F_2B */ 0x402c, +/* 731 - _V_66_0F_2B */ 0x402d, +/* 732 - */ 0, +/* 733 - */ 0, +/* 734 - */ 0, +/* 735 - */ 0, +/* 736 - */ 0, +/* 737 - */ 0, +/* 738 - _0F_2C */ 0x2397, +/* 739 - _66_0F_2C */ 0x2398, +/* 73a - _F3_0F_2C */ 0x2399, +/* 73b - _F2_0F_2C */ 0x239a, +/* 73c - */ 0, +/* 73d - */ 0, +/* 73e - _V_F3_0F_2C */ 0x402e, +/* 73f - _V_F2_0F_2C */ 0x402f, +/* 740 - */ 0, +/* 741 - */ 0, +/* 742 - */ 0, +/* 743 - */ 0, +/* 744 - _0F_2D */ 0x239b, +/* 745 - _66_0F_2D */ 0x239c, +/* 746 - _F3_0F_2D */ 0x239d, +/* 747 - _F2_0F_2D */ 0x239e, +/* 748 - */ 0, +/* 749 - */ 0, +/* 74a - _V_F3_0F_2D */ 0x4030, +/* 74b - _V_F2_0F_2D */ 0x4031, +/* 74c - */ 0, +/* 74d - */ 0, +/* 74e - */ 0, +/* 74f - */ 0, +/* 750 - _0F_2E */ 0x239f, +/* 751 - _66_0F_2E */ 0x23a0, +/* 752 - */ 0, +/* 753 - */ 0, +/* 754 - _V_0F_2E */ 0x4032, +/* 755 - _V_66_0F_2E */ 0x4033, +/* 756 - */ 0, +/* 757 - */ 0, +/* 758 - */ 0, +/* 759 - */ 0, +/* 75a - */ 0, +/* 75b - */ 0, +/* 75c - _0F_2F */ 0x23a1, +/* 75d - _66_0F_2F */ 0x23a2, +/* 75e - */ 0, +/* 75f - */ 0, +/* 760 - _V_0F_2F */ 0x4034, +/* 761 - _V_66_0F_2F */ 0x4035, +/* 762 - */ 0, +/* 763 - */ 0, +/* 764 - */ 0, +/* 765 - */ 0, +/* 766 - */ 0, +/* 767 - */ 0, +/* 768 - _0F_38_00 */ 0xcf78, +/* 769 - _0F_38_01 */ 0xcf84, +/* 76a - _0F_38_02 */ 0xcf90, +/* 76b - _0F_38_03 */ 0xcf9c, +/* 76c - _0F_38_04 */ 0xcfa8, +/* 76d - _0F_38_05 */ 0xcfb4, +/* 76e - _0F_38_06 */ 0xcfc0, +/* 76f - _0F_38_07 */ 0xcfcc, +/* 770 - _0F_38_08 */ 0xcfd8, +/* 771 - _0F_38_09 */ 0xcfe4, +/* 772 - _0F_38_0A */ 0xcff0, +/* 773 - _0F_38_0B */ 0xcffc, +/* 774 - _0F_38_0C */ 0xd008, +/* 775 - _0F_38_0D */ 0xd014, +/* 776 - _0F_38_0E */ 0xd020, +/* 777 - _0F_38_0F */ 0xd02c, +/* 778 - _0F_38_10 */ 0xd038, +/* 779 - */ 0, +/* 77a - */ 0, +/* 77b - */ 0, +/* 77c - _0F_38_14 */ 0xd044, +/* 77d - _0F_38_15 */ 0xd050, +/* 77e - */ 0, +/* 77f - _0F_38_17 */ 0xd05c, +/* 780 - _0F_38_18 */ 0xd068, +/* 781 - _0F_38_19 */ 0xd074, +/* 782 - _0F_38_1A */ 0xd080, +/* 783 - */ 0, +/* 784 - _0F_38_1C */ 0xd08c, +/* 785 - _0F_38_1D */ 0xd098, +/* 786 - _0F_38_1E */ 0xd0a4, +/* 787 - */ 0, +/* 788 - _0F_38_20 */ 0xd0b0, +/* 789 - _0F_38_21 */ 0xd0bc, +/* 78a - _0F_38_22 */ 0xd0c8, +/* 78b - _0F_38_23 */ 0xd0d4, +/* 78c - _0F_38_24 */ 0xd0e0, +/* 78d - _0F_38_25 */ 0xd0ec, +/* 78e - */ 0, +/* 78f - */ 0, +/* 790 - _0F_38_28 */ 0xd0f8, +/* 791 - _0F_38_29 */ 0xd104, +/* 792 - _0F_38_2A */ 0xd110, +/* 793 - _0F_38_2B */ 0xd11c, +/* 794 - _0F_38_2C */ 0xd128, +/* 795 - _0F_38_2D */ 0xd134, +/* 796 - _0F_38_2E */ 0xd140, +/* 797 - _0F_38_2F */ 0xd14c, +/* 798 - _0F_38_30 */ 0xd158, +/* 799 - _0F_38_31 */ 0xd164, +/* 79a - _0F_38_32 */ 0xd170, +/* 79b - _0F_38_33 */ 0xd17c, +/* 79c - _0F_38_34 */ 0xd188, +/* 79d - _0F_38_35 */ 0xd194, +/* 79e - */ 0, +/* 79f - _0F_38_37 */ 0xd1a0, +/* 7a0 - _0F_38_38 */ 0xd1ac, +/* 7a1 - _0F_38_39 */ 0xd1b8, +/* 7a2 - _0F_38_3A */ 0xd1c4, +/* 7a3 - _0F_38_3B */ 0xd1d0, +/* 7a4 - _0F_38_3C */ 0xd1dc, +/* 7a5 - _0F_38_3D */ 0xd1e8, +/* 7a6 - _0F_38_3E */ 0xd1f4, +/* 7a7 - _0F_38_3F */ 0xd200, +/* 7a8 - _0F_38_40 */ 0xd20c, +/* 7a9 - _0F_38_41 */ 0xd218, +/* 7aa - */ 0, +/* 7ab - */ 0, +/* 7ac - */ 0, +/* 7ad - */ 0, +/* 7ae - */ 0, +/* 7af - */ 0, +/* 7b0 - */ 0, +/* 7b1 - */ 0, +/* 7b2 - */ 0, +/* 7b3 - */ 0, +/* 7b4 - */ 0, +/* 7b5 - */ 0, +/* 7b6 - */ 0, +/* 7b7 - */ 0, +/* 7b8 - */ 0, +/* 7b9 - */ 0, +/* 7ba - */ 0, +/* 7bb - */ 0, +/* 7bc - */ 0, +/* 7bd - */ 0, +/* 7be - */ 0, +/* 7bf - */ 0, +/* 7c0 - */ 0, +/* 7c1 - */ 0, +/* 7c2 - */ 0, +/* 7c3 - */ 0, +/* 7c4 - */ 0, +/* 7c5 - */ 0, +/* 7c6 - */ 0, +/* 7c7 - */ 0, +/* 7c8 - */ 0, +/* 7c9 - */ 0, +/* 7ca - */ 0, +/* 7cb - */ 0, +/* 7cc - */ 0, +/* 7cd - */ 0, +/* 7ce - */ 0, +/* 7cf - */ 0, +/* 7d0 - */ 0, +/* 7d1 - */ 0, +/* 7d2 - */ 0, +/* 7d3 - */ 0, +/* 7d4 - */ 0, +/* 7d5 - */ 0, +/* 7d6 - */ 0, +/* 7d7 - */ 0, +/* 7d8 - */ 0, +/* 7d9 - */ 0, +/* 7da - */ 0, +/* 7db - */ 0, +/* 7dc - */ 0, +/* 7dd - */ 0, +/* 7de - */ 0, +/* 7df - */ 0, +/* 7e0 - */ 0, +/* 7e1 - */ 0, +/* 7e2 - */ 0, +/* 7e3 - */ 0, +/* 7e4 - */ 0, +/* 7e5 - */ 0, +/* 7e6 - */ 0, +/* 7e7 - */ 0, +/* 7e8 - _0F_38_80 */ 0xd224, +/* 7e9 - _0F_38_81 */ 0xd230, +/* 7ea - _0F_38_82 */ 0xd23c, +/* 7eb - */ 0, +/* 7ec - */ 0, +/* 7ed - */ 0, +/* 7ee - */ 0, +/* 7ef - */ 0, +/* 7f0 - */ 0, +/* 7f1 - */ 0, +/* 7f2 - */ 0, +/* 7f3 - */ 0, +/* 7f4 - */ 0, +/* 7f5 - */ 0, +/* 7f6 - */ 0, +/* 7f7 - */ 0, +/* 7f8 - */ 0, +/* 7f9 - */ 0, +/* 7fa - */ 0, +/* 7fb - */ 0, +/* 7fc - */ 0, +/* 7fd - */ 0, +/* 7fe - _0F_38_96 */ 0xd248, +/* 7ff - _0F_38_97 */ 0xd254, +/* 800 - _0F_38_98 */ 0xd260, +/* 801 - _0F_38_99 */ 0xd26c, +/* 802 - _0F_38_9A */ 0xd278, +/* 803 - _0F_38_9B */ 0xd284, +/* 804 - _0F_38_9C */ 0xd290, +/* 805 - _0F_38_9D */ 0xd29c, +/* 806 - _0F_38_9E */ 0xd2a8, +/* 807 - _0F_38_9F */ 0xd2b4, +/* 808 - */ 0, +/* 809 - */ 0, +/* 80a - */ 0, +/* 80b - */ 0, +/* 80c - */ 0, +/* 80d - */ 0, +/* 80e - _0F_38_A6 */ 0xd2c0, +/* 80f - _0F_38_A7 */ 0xd2cc, +/* 810 - _0F_38_A8 */ 0xd2d8, +/* 811 - _0F_38_A9 */ 0xd2e4, +/* 812 - _0F_38_AA */ 0xd2f0, +/* 813 - _0F_38_AB */ 0xd2fc, +/* 814 - _0F_38_AC */ 0xd308, +/* 815 - _0F_38_AD */ 0xd314, +/* 816 - _0F_38_AE */ 0xd320, +/* 817 - _0F_38_AF */ 0xd32c, +/* 818 - */ 0, +/* 819 - */ 0, +/* 81a - */ 0, +/* 81b - */ 0, +/* 81c - */ 0, +/* 81d - */ 0, +/* 81e - _0F_38_B6 */ 0xd338, +/* 81f - _0F_38_B7 */ 0xd344, +/* 820 - _0F_38_B8 */ 0xd350, +/* 821 - _0F_38_B9 */ 0xd35c, +/* 822 - _0F_38_BA */ 0xd368, +/* 823 - _0F_38_BB */ 0xd374, +/* 824 - _0F_38_BC */ 0xd380, +/* 825 - _0F_38_BD */ 0xd38c, +/* 826 - _0F_38_BE */ 0xd398, +/* 827 - _0F_38_BF */ 0xd3a4, +/* 828 - */ 0, +/* 829 - */ 0, +/* 82a - */ 0, +/* 82b - */ 0, +/* 82c - */ 0, +/* 82d - */ 0, +/* 82e - */ 0, +/* 82f - */ 0, +/* 830 - */ 0, +/* 831 - */ 0, +/* 832 - */ 0, +/* 833 - */ 0, +/* 834 - */ 0, +/* 835 - */ 0, +/* 836 - */ 0, +/* 837 - */ 0, +/* 838 - */ 0, +/* 839 - */ 0, +/* 83a - */ 0, +/* 83b - */ 0, +/* 83c - */ 0, +/* 83d - */ 0, +/* 83e - */ 0, +/* 83f - */ 0, +/* 840 - */ 0, +/* 841 - */ 0, +/* 842 - */ 0, +/* 843 - _0F_38_DB */ 0xd3b0, +/* 844 - _0F_38_DC */ 0xd3bc, +/* 845 - _0F_38_DD */ 0xd3c8, +/* 846 - _0F_38_DE */ 0xd3d4, +/* 847 - _0F_38_DF */ 0xd3e0, +/* 848 - */ 0, +/* 849 - */ 0, +/* 84a - */ 0, +/* 84b - */ 0, +/* 84c - */ 0, +/* 84d - */ 0, +/* 84e - */ 0, +/* 84f - */ 0, +/* 850 - */ 0, +/* 851 - */ 0, +/* 852 - */ 0, +/* 853 - */ 0, +/* 854 - */ 0, +/* 855 - */ 0, +/* 856 - */ 0, +/* 857 - */ 0, +/* 858 - _0F_38_F0 */ 0xd3ec, +/* 859 - _0F_38_F1 */ 0xd3f8, +/* 85a - */ 0, +/* 85b - */ 0, +/* 85c - */ 0, +/* 85d - */ 0, +/* 85e - */ 0, +/* 85f - */ 0, +/* 860 - */ 0, +/* 861 - */ 0, +/* 862 - */ 0, +/* 863 - */ 0, +/* 864 - */ 0, +/* 865 - */ 0, +/* 866 - */ 0, +/* 867 - */ 0, +/* 868 - */ 0, +/* 869 - */ 0, +/* 86a - */ 0, +/* 86b - */ 0, +/* 86c - _0F_3A_04 */ 0xd404, +/* 86d - _0F_3A_05 */ 0xd410, +/* 86e - _0F_3A_06 */ 0xd41c, +/* 86f - */ 0, +/* 870 - _0F_3A_08 */ 0xd428, +/* 871 - _0F_3A_09 */ 0xd434, +/* 872 - _0F_3A_0A */ 0xd440, +/* 873 - _0F_3A_0B */ 0xd44c, +/* 874 - _0F_3A_0C */ 0xd458, +/* 875 - _0F_3A_0D */ 0xd464, +/* 876 - _0F_3A_0E */ 0xd470, +/* 877 - _0F_3A_0F */ 0xd47c, +/* 878 - */ 0, +/* 879 - */ 0, +/* 87a - */ 0, +/* 87b - */ 0, +/* 87c - _0F_3A_14 */ 0xd488, +/* 87d - _0F_3A_15 */ 0xd494, +/* 87e - _0F_3A_16 */ 0xd4a0, +/* 87f - _0F_3A_17 */ 0xd4ac, +/* 880 - _0F_3A_18 */ 0xd4b8, +/* 881 - _0F_3A_19 */ 0xd4c4, +/* 882 - */ 0, +/* 883 - */ 0, +/* 884 - */ 0, +/* 885 - */ 0, +/* 886 - */ 0, +/* 887 - */ 0, +/* 888 - _0F_3A_20 */ 0xd4d0, +/* 889 - _0F_3A_21 */ 0xd4dc, +/* 88a - _0F_3A_22 */ 0xd4e8, +/* 88b - */ 0, +/* 88c - */ 0, +/* 88d - */ 0, +/* 88e - */ 0, +/* 88f - */ 0, +/* 890 - */ 0, +/* 891 - */ 0, +/* 892 - */ 0, +/* 893 - */ 0, +/* 894 - */ 0, +/* 895 - */ 0, +/* 896 - */ 0, +/* 897 - */ 0, +/* 898 - */ 0, +/* 899 - */ 0, +/* 89a - */ 0, +/* 89b - */ 0, +/* 89c - */ 0, +/* 89d - */ 0, +/* 89e - */ 0, +/* 89f - */ 0, +/* 8a0 - */ 0, +/* 8a1 - */ 0, +/* 8a2 - */ 0, +/* 8a3 - */ 0, +/* 8a4 - */ 0, +/* 8a5 - */ 0, +/* 8a6 - */ 0, +/* 8a7 - */ 0, +/* 8a8 - _0F_3A_40 */ 0xd4f4, +/* 8a9 - _0F_3A_41 */ 0xd500, +/* 8aa - _0F_3A_42 */ 0xd50c, +/* 8ab - */ 0, +/* 8ac - _0F_3A_44 */ 0xd518, +/* 8ad - */ 0, +/* 8ae - */ 0, +/* 8af - */ 0, +/* 8b0 - */ 0, +/* 8b1 - */ 0, +/* 8b2 - _0F_3A_4A */ 0xd524, +/* 8b3 - _0F_3A_4B */ 0xd530, +/* 8b4 - _0F_3A_4C */ 0xd53c, +/* 8b5 - */ 0, +/* 8b6 - */ 0, +/* 8b7 - */ 0, +/* 8b8 - */ 0, +/* 8b9 - */ 0, +/* 8ba - */ 0, +/* 8bb - */ 0, +/* 8bc - */ 0, +/* 8bd - */ 0, +/* 8be - */ 0, +/* 8bf - */ 0, +/* 8c0 - */ 0, +/* 8c1 - */ 0, +/* 8c2 - */ 0, +/* 8c3 - */ 0, +/* 8c4 - */ 0, +/* 8c5 - */ 0, +/* 8c6 - */ 0, +/* 8c7 - */ 0, +/* 8c8 - _0F_3A_60 */ 0xd548, +/* 8c9 - _0F_3A_61 */ 0xd554, +/* 8ca - _0F_3A_62 */ 0xd560, +/* 8cb - _0F_3A_63 */ 0xd56c, +/* 8cc - */ 0, +/* 8cd - */ 0, +/* 8ce - */ 0, +/* 8cf - */ 0, +/* 8d0 - */ 0, +/* 8d1 - */ 0, +/* 8d2 - */ 0, +/* 8d3 - */ 0, +/* 8d4 - */ 0, +/* 8d5 - */ 0, +/* 8d6 - */ 0, +/* 8d7 - */ 0, +/* 8d8 - */ 0, +/* 8d9 - */ 0, +/* 8da - */ 0, +/* 8db - */ 0, +/* 8dc - */ 0, +/* 8dd - */ 0, +/* 8de - */ 0, +/* 8df - */ 0, +/* 8e0 - */ 0, +/* 8e1 - */ 0, +/* 8e2 - */ 0, +/* 8e3 - */ 0, +/* 8e4 - */ 0, +/* 8e5 - */ 0, +/* 8e6 - */ 0, +/* 8e7 - */ 0, +/* 8e8 - */ 0, +/* 8e9 - */ 0, +/* 8ea - */ 0, +/* 8eb - */ 0, +/* 8ec - */ 0, +/* 8ed - */ 0, +/* 8ee - */ 0, +/* 8ef - */ 0, +/* 8f0 - */ 0, +/* 8f1 - */ 0, +/* 8f2 - */ 0, +/* 8f3 - */ 0, +/* 8f4 - */ 0, +/* 8f5 - */ 0, +/* 8f6 - */ 0, +/* 8f7 - */ 0, +/* 8f8 - */ 0, +/* 8f9 - */ 0, +/* 8fa - */ 0, +/* 8fb - */ 0, +/* 8fc - */ 0, +/* 8fd - */ 0, +/* 8fe - */ 0, +/* 8ff - */ 0, +/* 900 - */ 0, +/* 901 - */ 0, +/* 902 - */ 0, +/* 903 - */ 0, +/* 904 - */ 0, +/* 905 - */ 0, +/* 906 - */ 0, +/* 907 - */ 0, +/* 908 - */ 0, +/* 909 - */ 0, +/* 90a - */ 0, +/* 90b - */ 0, +/* 90c - */ 0, +/* 90d - */ 0, +/* 90e - */ 0, +/* 90f - */ 0, +/* 910 - */ 0, +/* 911 - */ 0, +/* 912 - */ 0, +/* 913 - */ 0, +/* 914 - */ 0, +/* 915 - */ 0, +/* 916 - */ 0, +/* 917 - */ 0, +/* 918 - */ 0, +/* 919 - */ 0, +/* 91a - */ 0, +/* 91b - */ 0, +/* 91c - */ 0, +/* 91d - */ 0, +/* 91e - */ 0, +/* 91f - */ 0, +/* 920 - */ 0, +/* 921 - */ 0, +/* 922 - */ 0, +/* 923 - */ 0, +/* 924 - */ 0, +/* 925 - */ 0, +/* 926 - */ 0, +/* 927 - */ 0, +/* 928 - */ 0, +/* 929 - */ 0, +/* 92a - */ 0, +/* 92b - */ 0, +/* 92c - */ 0, +/* 92d - */ 0, +/* 92e - */ 0, +/* 92f - */ 0, +/* 930 - */ 0, +/* 931 - */ 0, +/* 932 - */ 0, +/* 933 - */ 0, +/* 934 - */ 0, +/* 935 - */ 0, +/* 936 - */ 0, +/* 937 - */ 0, +/* 938 - */ 0, +/* 939 - */ 0, +/* 93a - */ 0, +/* 93b - */ 0, +/* 93c - */ 0, +/* 93d - */ 0, +/* 93e - */ 0, +/* 93f - */ 0, +/* 940 - */ 0, +/* 941 - */ 0, +/* 942 - */ 0, +/* 943 - */ 0, +/* 944 - */ 0, +/* 945 - */ 0, +/* 946 - */ 0, +/* 947 - _0F_3A_DF */ 0xd578, +/* 948 - */ 0, +/* 949 - */ 0, +/* 94a - */ 0, +/* 94b - */ 0, +/* 94c - */ 0, +/* 94d - */ 0, +/* 94e - */ 0, +/* 94f - */ 0, +/* 950 - */ 0, +/* 951 - */ 0, +/* 952 - */ 0, +/* 953 - */ 0, +/* 954 - */ 0, +/* 955 - */ 0, +/* 956 - */ 0, +/* 957 - */ 0, +/* 958 - */ 0, +/* 959 - */ 0, +/* 95a - */ 0, +/* 95b - */ 0, +/* 95c - */ 0, +/* 95d - */ 0, +/* 95e - */ 0, +/* 95f - */ 0, +/* 960 - */ 0, +/* 961 - */ 0, +/* 962 - */ 0, +/* 963 - */ 0, +/* 964 - */ 0, +/* 965 - */ 0, +/* 966 - */ 0, +/* 967 - */ 0, +/* 968 - _0F_50 */ 0x23a3, +/* 969 - _66_0F_50 */ 0x23a4, +/* 96a - */ 0, +/* 96b - */ 0, +/* 96c - _V_0F_50 */ 0x4036, +/* 96d - _V_66_0F_50 */ 0x4037, +/* 96e - */ 0, +/* 96f - */ 0, +/* 970 - */ 0, +/* 971 - */ 0, +/* 972 - */ 0, +/* 973 - */ 0, +/* 974 - _0F_51 */ 0x23a5, +/* 975 - _66_0F_51 */ 0x23a6, +/* 976 - _F3_0F_51 */ 0x23a7, +/* 977 - _F2_0F_51 */ 0x23a8, +/* 978 - _V_0F_51 */ 0x4038, +/* 979 - _V_66_0F_51 */ 0x4039, +/* 97a - _V_F3_0F_51 */ 0x403a, +/* 97b - _V_F2_0F_51 */ 0x403b, +/* 97c - */ 0, +/* 97d - */ 0, +/* 97e - */ 0, +/* 97f - */ 0, +/* 980 - _0F_52 */ 0x23a9, +/* 981 - */ 0, +/* 982 - _F3_0F_52 */ 0x23aa, +/* 983 - */ 0, +/* 984 - _V_0F_52 */ 0x403c, +/* 985 - */ 0, +/* 986 - _V_F3_0F_52 */ 0x403d, +/* 987 - */ 0, +/* 988 - */ 0, +/* 989 - */ 0, +/* 98a - */ 0, +/* 98b - */ 0, +/* 98c - _0F_53 */ 0x23ab, +/* 98d - */ 0, +/* 98e - _F3_0F_53 */ 0x23ac, +/* 98f - */ 0, +/* 990 - _V_0F_53 */ 0x403e, +/* 991 - */ 0, +/* 992 - _V_F3_0F_53 */ 0x403f, +/* 993 - */ 0, +/* 994 - */ 0, +/* 995 - */ 0, +/* 996 - */ 0, +/* 997 - */ 0, +/* 998 - _0F_54 */ 0x23ad, +/* 999 - _66_0F_54 */ 0x23ae, +/* 99a - */ 0, +/* 99b - */ 0, +/* 99c - _V_0F_54 */ 0x4040, +/* 99d - _V_66_0F_54 */ 0x4041, +/* 99e - */ 0, +/* 99f - */ 0, +/* 9a0 - */ 0, +/* 9a1 - */ 0, +/* 9a2 - */ 0, +/* 9a3 - */ 0, +/* 9a4 - _0F_55 */ 0x23af, +/* 9a5 - _66_0F_55 */ 0x23b0, +/* 9a6 - */ 0, +/* 9a7 - */ 0, +/* 9a8 - _V_0F_55 */ 0x4042, +/* 9a9 - _V_66_0F_55 */ 0x4043, +/* 9aa - */ 0, +/* 9ab - */ 0, +/* 9ac - */ 0, +/* 9ad - */ 0, +/* 9ae - */ 0, +/* 9af - */ 0, +/* 9b0 - _0F_56 */ 0x23b1, +/* 9b1 - _66_0F_56 */ 0x23b2, +/* 9b2 - */ 0, +/* 9b3 - */ 0, +/* 9b4 - _V_0F_56 */ 0x4044, +/* 9b5 - _V_66_0F_56 */ 0x4045, +/* 9b6 - */ 0, +/* 9b7 - */ 0, +/* 9b8 - */ 0, +/* 9b9 - */ 0, +/* 9ba - */ 0, +/* 9bb - */ 0, +/* 9bc - _0F_57 */ 0x23b3, +/* 9bd - _66_0F_57 */ 0x23b4, +/* 9be - */ 0, +/* 9bf - */ 0, +/* 9c0 - _V_0F_57 */ 0x4046, +/* 9c1 - _V_66_0F_57 */ 0x4047, +/* 9c2 - */ 0, +/* 9c3 - */ 0, +/* 9c4 - */ 0, +/* 9c5 - */ 0, +/* 9c6 - */ 0, +/* 9c7 - */ 0, +/* 9c8 - _0F_58 */ 0x23b5, +/* 9c9 - _66_0F_58 */ 0x23b6, +/* 9ca - _F3_0F_58 */ 0x23b7, +/* 9cb - _F2_0F_58 */ 0x23b8, +/* 9cc - _V_0F_58 */ 0x4048, +/* 9cd - _V_66_0F_58 */ 0x4049, +/* 9ce - _V_F3_0F_58 */ 0x404a, +/* 9cf - _V_F2_0F_58 */ 0x404b, +/* 9d0 - */ 0, +/* 9d1 - */ 0, +/* 9d2 - */ 0, +/* 9d3 - */ 0, +/* 9d4 - _0F_59 */ 0x23b9, +/* 9d5 - _66_0F_59 */ 0x23ba, +/* 9d6 - _F3_0F_59 */ 0x23bb, +/* 9d7 - _F2_0F_59 */ 0x23bc, +/* 9d8 - _V_0F_59 */ 0x404c, +/* 9d9 - _V_66_0F_59 */ 0x404d, +/* 9da - _V_F3_0F_59 */ 0x404e, +/* 9db - _V_F2_0F_59 */ 0x404f, +/* 9dc - */ 0, +/* 9dd - */ 0, +/* 9de - */ 0, +/* 9df - */ 0, +/* 9e0 - _0F_5A */ 0x23bd, +/* 9e1 - _66_0F_5A */ 0x23be, +/* 9e2 - _F3_0F_5A */ 0x23bf, +/* 9e3 - _F2_0F_5A */ 0x23c0, +/* 9e4 - _V_0F_5A */ 0x4050, +/* 9e5 - _V_66_0F_5A */ 0x4051, +/* 9e6 - _V_F3_0F_5A */ 0x4052, +/* 9e7 - _V_F2_0F_5A */ 0x4053, +/* 9e8 - */ 0, +/* 9e9 - */ 0, +/* 9ea - */ 0, +/* 9eb - */ 0, +/* 9ec - _0F_5B */ 0x23c1, +/* 9ed - _66_0F_5B */ 0x23c2, +/* 9ee - _F3_0F_5B */ 0x23c3, +/* 9ef - */ 0, +/* 9f0 - _V_0F_5B */ 0x4054, +/* 9f1 - _V_66_0F_5B */ 0x4055, +/* 9f2 - _V_F3_0F_5B */ 0x4056, +/* 9f3 - */ 0, +/* 9f4 - */ 0, +/* 9f5 - */ 0, +/* 9f6 - */ 0, +/* 9f7 - */ 0, +/* 9f8 - _0F_5C */ 0x23c4, +/* 9f9 - _66_0F_5C */ 0x23c5, +/* 9fa - _F3_0F_5C */ 0x23c6, +/* 9fb - _F2_0F_5C */ 0x23c7, +/* 9fc - _V_0F_5C */ 0x4057, +/* 9fd - _V_66_0F_5C */ 0x4058, +/* 9fe - _V_F3_0F_5C */ 0x4059, +/* 9ff - _V_F2_0F_5C */ 0x405a, +/* a00 - */ 0, +/* a01 - */ 0, +/* a02 - */ 0, +/* a03 - */ 0, +/* a04 - _0F_5D */ 0x23c8, +/* a05 - _66_0F_5D */ 0x23c9, +/* a06 - _F3_0F_5D */ 0x23ca, +/* a07 - _F2_0F_5D */ 0x23cb, +/* a08 - _V_0F_5D */ 0x405b, +/* a09 - _V_66_0F_5D */ 0x405c, +/* a0a - _V_F3_0F_5D */ 0x405d, +/* a0b - _V_F2_0F_5D */ 0x405e, +/* a0c - */ 0, +/* a0d - */ 0, +/* a0e - */ 0, +/* a0f - */ 0, +/* a10 - _0F_5E */ 0x23cc, +/* a11 - _66_0F_5E */ 0x23cd, +/* a12 - _F3_0F_5E */ 0x23ce, +/* a13 - _F2_0F_5E */ 0x23cf, +/* a14 - _V_0F_5E */ 0x405f, +/* a15 - _V_66_0F_5E */ 0x4060, +/* a16 - _V_F3_0F_5E */ 0x4061, +/* a17 - _V_F2_0F_5E */ 0x4062, +/* a18 - */ 0, +/* a19 - */ 0, +/* a1a - */ 0, +/* a1b - */ 0, +/* a1c - _0F_5F */ 0x23d0, +/* a1d - _66_0F_5F */ 0x23d1, +/* a1e - _F3_0F_5F */ 0x23d2, +/* a1f - _F2_0F_5F */ 0x23d3, +/* a20 - _V_0F_5F */ 0x4063, +/* a21 - _V_66_0F_5F */ 0x4064, +/* a22 - _V_F3_0F_5F */ 0x4065, +/* a23 - _V_F2_0F_5F */ 0x4066, +/* a24 - */ 0, +/* a25 - */ 0, +/* a26 - */ 0, +/* a27 - */ 0, +/* a28 - _0F_60 */ 0x23d4, +/* a29 - _66_0F_60 */ 0x23d5, +/* a2a - */ 0, +/* a2b - */ 0, +/* a2c - */ 0, +/* a2d - _V_66_0F_60 */ 0x4067, +/* a2e - */ 0, +/* a2f - */ 0, +/* a30 - */ 0, +/* a31 - */ 0, +/* a32 - */ 0, +/* a33 - */ 0, +/* a34 - _0F_61 */ 0x23d6, +/* a35 - _66_0F_61 */ 0x23d7, +/* a36 - */ 0, +/* a37 - */ 0, +/* a38 - */ 0, +/* a39 - _V_66_0F_61 */ 0x4068, +/* a3a - */ 0, +/* a3b - */ 0, +/* a3c - */ 0, +/* a3d - */ 0, +/* a3e - */ 0, +/* a3f - */ 0, +/* a40 - _0F_62 */ 0x23d8, +/* a41 - _66_0F_62 */ 0x23d9, +/* a42 - */ 0, +/* a43 - */ 0, +/* a44 - */ 0, +/* a45 - _V_66_0F_62 */ 0x4069, +/* a46 - */ 0, +/* a47 - */ 0, +/* a48 - */ 0, +/* a49 - */ 0, +/* a4a - */ 0, +/* a4b - */ 0, +/* a4c - _0F_63 */ 0x23da, +/* a4d - _66_0F_63 */ 0x23db, +/* a4e - */ 0, +/* a4f - */ 0, +/* a50 - */ 0, +/* a51 - _V_66_0F_63 */ 0x406a, +/* a52 - */ 0, +/* a53 - */ 0, +/* a54 - */ 0, +/* a55 - */ 0, +/* a56 - */ 0, +/* a57 - */ 0, +/* a58 - _0F_64 */ 0x23dc, +/* a59 - _66_0F_64 */ 0x23dd, +/* a5a - */ 0, +/* a5b - */ 0, +/* a5c - */ 0, +/* a5d - _V_66_0F_64 */ 0x406b, +/* a5e - */ 0, +/* a5f - */ 0, +/* a60 - */ 0, +/* a61 - */ 0, +/* a62 - */ 0, +/* a63 - */ 0, +/* a64 - _0F_65 */ 0x23de, +/* a65 - _66_0F_65 */ 0x23df, +/* a66 - */ 0, +/* a67 - */ 0, +/* a68 - */ 0, +/* a69 - _V_66_0F_65 */ 0x406c, +/* a6a - */ 0, +/* a6b - */ 0, +/* a6c - */ 0, +/* a6d - */ 0, +/* a6e - */ 0, +/* a6f - */ 0, +/* a70 - _0F_66 */ 0x23e0, +/* a71 - _66_0F_66 */ 0x23e1, +/* a72 - */ 0, +/* a73 - */ 0, +/* a74 - */ 0, +/* a75 - _V_66_0F_66 */ 0x406d, +/* a76 - */ 0, +/* a77 - */ 0, +/* a78 - */ 0, +/* a79 - */ 0, +/* a7a - */ 0, +/* a7b - */ 0, +/* a7c - _0F_67 */ 0x23e2, +/* a7d - _66_0F_67 */ 0x23e3, +/* a7e - */ 0, +/* a7f - */ 0, +/* a80 - */ 0, +/* a81 - _V_66_0F_67 */ 0x406e, +/* a82 - */ 0, +/* a83 - */ 0, +/* a84 - */ 0, +/* a85 - */ 0, +/* a86 - */ 0, +/* a87 - */ 0, +/* a88 - _0F_68 */ 0x23e4, +/* a89 - _66_0F_68 */ 0x23e5, +/* a8a - */ 0, +/* a8b - */ 0, +/* a8c - */ 0, +/* a8d - _V_66_0F_68 */ 0x406f, +/* a8e - */ 0, +/* a8f - */ 0, +/* a90 - */ 0, +/* a91 - */ 0, +/* a92 - */ 0, +/* a93 - */ 0, +/* a94 - _0F_69 */ 0x23e6, +/* a95 - _66_0F_69 */ 0x23e7, +/* a96 - */ 0, +/* a97 - */ 0, +/* a98 - */ 0, +/* a99 - _V_66_0F_69 */ 0x4070, +/* a9a - */ 0, +/* a9b - */ 0, +/* a9c - */ 0, +/* a9d - */ 0, +/* a9e - */ 0, +/* a9f - */ 0, +/* aa0 - _0F_6A */ 0x23e8, +/* aa1 - _66_0F_6A */ 0x23e9, +/* aa2 - */ 0, +/* aa3 - */ 0, +/* aa4 - */ 0, +/* aa5 - _V_66_0F_6A */ 0x4071, +/* aa6 - */ 0, +/* aa7 - */ 0, +/* aa8 - */ 0, +/* aa9 - */ 0, +/* aaa - */ 0, +/* aab - */ 0, +/* aac - _0F_6B */ 0x23ea, +/* aad - _66_0F_6B */ 0x23eb, +/* aae - */ 0, +/* aaf - */ 0, +/* ab0 - */ 0, +/* ab1 - _V_66_0F_6B */ 0x4072, +/* ab2 - */ 0, +/* ab3 - */ 0, +/* ab4 - */ 0, +/* ab5 - */ 0, +/* ab6 - */ 0, +/* ab7 - */ 0, +/* ab8 - */ 0, +/* ab9 - _66_0F_6C */ 0x23ec, +/* aba - */ 0, +/* abb - */ 0, +/* abc - */ 0, +/* abd - _V_66_0F_6C */ 0x4073, +/* abe - */ 0, +/* abf - */ 0, +/* ac0 - */ 0, +/* ac1 - */ 0, +/* ac2 - */ 0, +/* ac3 - */ 0, +/* ac4 - */ 0, +/* ac5 - _66_0F_6D */ 0x23ed, +/* ac6 - */ 0, +/* ac7 - */ 0, +/* ac8 - */ 0, +/* ac9 - _V_66_0F_6D */ 0x4074, +/* aca - */ 0, +/* acb - */ 0, +/* acc - */ 0, +/* acd - */ 0, +/* ace - */ 0, +/* acf - */ 0, +/* ad0 - _0F_6E */ 0x4075, +/* ad1 - _66_0F_6E */ 0x4076, +/* ad2 - */ 0, +/* ad3 - */ 0, +/* ad4 - */ 0, +/* ad5 - _V_66_0F_6E */ 0x4077, +/* ad6 - */ 0, +/* ad7 - */ 0, +/* ad8 - */ 0, +/* ad9 - */ 0, +/* ada - */ 0, +/* adb - */ 0, +/* adc - _0F_6F */ 0x23ee, +/* add - _66_0F_6F */ 0x23ef, +/* ade - _F3_0F_6F */ 0x23f0, +/* adf - */ 0, +/* ae0 - */ 0, +/* ae1 - _V_66_0F_6F */ 0x4078, +/* ae2 - _V_F3_0F_6F */ 0x4079, +/* ae3 - */ 0, +/* ae4 - */ 0, +/* ae5 - */ 0, +/* ae6 - */ 0, +/* ae7 - */ 0, +/* ae8 - _0F_70 */ 0x407a, +/* ae9 - _66_0F_70 */ 0x407b, +/* aea - _F3_0F_70 */ 0x407c, +/* aeb - _F2_0F_70 */ 0x407d, +/* aec - */ 0, +/* aed - _V_66_0F_70 */ 0x407e, +/* aee - _V_F3_0F_70 */ 0x407f, +/* aef - _V_F2_0F_70 */ 0x4080, +/* af0 - */ 0, +/* af1 - */ 0, +/* af2 - */ 0, +/* af3 - */ 0, +/* af4 - */ 0, +/* af5 - */ 0, +/* af6 - _0F_71_02 */ 0xd584, +/* af7 - */ 0, +/* af8 - _0F_71_04 */ 0xd590, +/* af9 - */ 0, +/* afa - _0F_71_06 */ 0xd59c, +/* afb - */ 0, +/* afc - */ 0, +/* afd - */ 0, +/* afe - _0F_72_02 */ 0xd5a8, +/* aff - */ 0, +/* b00 - _0F_72_04 */ 0xd5b4, +/* b01 - */ 0, +/* b02 - _0F_72_06 */ 0xd5c0, +/* b03 - */ 0, +/* b04 - */ 0, +/* b05 - */ 0, +/* b06 - _0F_73_02 */ 0xd5cc, +/* b07 - _0F_73_03 */ 0xd5d8, +/* b08 - */ 0, +/* b09 - */ 0, +/* b0a - _0F_73_06 */ 0xd5e4, +/* b0b - _0F_73_07 */ 0xd5f0, +/* b0c - _0F_74 */ 0x23f1, +/* b0d - _66_0F_74 */ 0x23f2, +/* b0e - */ 0, +/* b0f - */ 0, +/* b10 - */ 0, +/* b11 - _V_66_0F_74 */ 0x4081, +/* b12 - */ 0, +/* b13 - */ 0, +/* b14 - */ 0, +/* b15 - */ 0, +/* b16 - */ 0, +/* b17 - */ 0, +/* b18 - _0F_75 */ 0x23f3, +/* b19 - _66_0F_75 */ 0x23f4, +/* b1a - */ 0, +/* b1b - */ 0, +/* b1c - */ 0, +/* b1d - _V_66_0F_75 */ 0x4082, +/* b1e - */ 0, +/* b1f - */ 0, +/* b20 - */ 0, +/* b21 - */ 0, +/* b22 - */ 0, +/* b23 - */ 0, +/* b24 - _0F_76 */ 0x23f5, +/* b25 - _66_0F_76 */ 0x23f6, +/* b26 - */ 0, +/* b27 - */ 0, +/* b28 - */ 0, +/* b29 - _V_66_0F_76 */ 0x4083, +/* b2a - */ 0, +/* b2b - */ 0, +/* b2c - */ 0, +/* b2d - */ 0, +/* b2e - */ 0, +/* b2f - */ 0, +/* b30 - _0F_77 */ 0x23f7, +/* b31 - */ 0, +/* b32 - */ 0, +/* b33 - */ 0, +/* b34 - _V_0F_77 */ 0x4084, +/* b35 - */ 0, +/* b36 - */ 0, +/* b37 - */ 0, +/* b38 - */ 0, +/* b39 - */ 0, +/* b3a - */ 0, +/* b3b - */ 0, +/* b3c - _0F_78 */ 0x23f8, +/* b3d - _66_0F_78 */ 0x4085, +/* b3e - */ 0, +/* b3f - _F2_0F_78 */ 0x4086, +/* b40 - */ 0, +/* b41 - */ 0, +/* b42 - */ 0, +/* b43 - */ 0, +/* b44 - */ 0, +/* b45 - */ 0, +/* b46 - */ 0, +/* b47 - */ 0, +/* b48 - _0F_79 */ 0x23f9, +/* b49 - _66_0F_79 */ 0x23fa, +/* b4a - */ 0, +/* b4b - _F2_0F_79 */ 0x23fb, +/* b4c - */ 0, +/* b4d - */ 0, +/* b4e - */ 0, +/* b4f - */ 0, +/* b50 - */ 0, +/* b51 - */ 0, +/* b52 - */ 0, +/* b53 - */ 0, +/* b54 - */ 0, +/* b55 - */ 0, +/* b56 - */ 0, +/* b57 - */ 0, +/* b58 - */ 0, +/* b59 - */ 0, +/* b5a - */ 0, +/* b5b - */ 0, +/* b5c - */ 0, +/* b5d - */ 0, +/* b5e - */ 0, +/* b5f - */ 0, +/* b60 - */ 0, +/* b61 - */ 0, +/* b62 - */ 0, +/* b63 - */ 0, +/* b64 - */ 0, +/* b65 - */ 0, +/* b66 - */ 0, +/* b67 - */ 0, +/* b68 - */ 0, +/* b69 - */ 0, +/* b6a - */ 0, +/* b6b - */ 0, +/* b6c - */ 0, +/* b6d - */ 0, +/* b6e - */ 0, +/* b6f - */ 0, +/* b70 - */ 0, +/* b71 - */ 0, +/* b72 - */ 0, +/* b73 - */ 0, +/* b74 - */ 0, +/* b75 - */ 0, +/* b76 - */ 0, +/* b77 - */ 0, +/* b78 - */ 0, +/* b79 - */ 0, +/* b7a - */ 0, +/* b7b - */ 0, +/* b7c - */ 0, +/* b7d - */ 0, +/* b7e - */ 0, +/* b7f - */ 0, +/* b80 - */ 0, +/* b81 - */ 0, +/* b82 - */ 0, +/* b83 - */ 0, +/* b84 - _0F_7A_30 */ 0x23fc, +/* b85 - _0F_7A_31 */ 0x23fd, +/* b86 - */ 0, +/* b87 - */ 0, +/* b88 - */ 0, +/* b89 - */ 0, +/* b8a - */ 0, +/* b8b - */ 0, +/* b8c - */ 0, +/* b8d - */ 0, +/* b8e - */ 0, +/* b8f - */ 0, +/* b90 - */ 0, +/* b91 - */ 0, +/* b92 - */ 0, +/* b93 - */ 0, +/* b94 - */ 0, +/* b95 - */ 0, +/* b96 - */ 0, +/* b97 - */ 0, +/* b98 - */ 0, +/* b99 - */ 0, +/* b9a - */ 0, +/* b9b - */ 0, +/* b9c - */ 0, +/* b9d - */ 0, +/* b9e - */ 0, +/* b9f - */ 0, +/* ba0 - */ 0, +/* ba1 - */ 0, +/* ba2 - */ 0, +/* ba3 - */ 0, +/* ba4 - */ 0, +/* ba5 - */ 0, +/* ba6 - */ 0, +/* ba7 - */ 0, +/* ba8 - */ 0, +/* ba9 - */ 0, +/* baa - */ 0, +/* bab - */ 0, +/* bac - */ 0, +/* bad - */ 0, +/* bae - */ 0, +/* baf - */ 0, +/* bb0 - */ 0, +/* bb1 - */ 0, +/* bb2 - */ 0, +/* bb3 - */ 0, +/* bb4 - */ 0, +/* bb5 - */ 0, +/* bb6 - */ 0, +/* bb7 - */ 0, +/* bb8 - */ 0, +/* bb9 - */ 0, +/* bba - */ 0, +/* bbb - */ 0, +/* bbc - */ 0, +/* bbd - */ 0, +/* bbe - */ 0, +/* bbf - */ 0, +/* bc0 - */ 0, +/* bc1 - */ 0, +/* bc2 - */ 0, +/* bc3 - */ 0, +/* bc4 - */ 0, +/* bc5 - */ 0, +/* bc6 - */ 0, +/* bc7 - */ 0, +/* bc8 - */ 0, +/* bc9 - */ 0, +/* bca - */ 0, +/* bcb - */ 0, +/* bcc - */ 0, +/* bcd - */ 0, +/* bce - */ 0, +/* bcf - */ 0, +/* bd0 - */ 0, +/* bd1 - */ 0, +/* bd2 - */ 0, +/* bd3 - */ 0, +/* bd4 - */ 0, +/* bd5 - */ 0, +/* bd6 - */ 0, +/* bd7 - */ 0, +/* bd8 - */ 0, +/* bd9 - */ 0, +/* bda - */ 0, +/* bdb - */ 0, +/* bdc - */ 0, +/* bdd - */ 0, +/* bde - */ 0, +/* bdf - */ 0, +/* be0 - */ 0, +/* be1 - */ 0, +/* be2 - */ 0, +/* be3 - */ 0, +/* be4 - */ 0, +/* be5 - */ 0, +/* be6 - */ 0, +/* be7 - */ 0, +/* be8 - */ 0, +/* be9 - */ 0, +/* bea - */ 0, +/* beb - */ 0, +/* bec - */ 0, +/* bed - */ 0, +/* bee - */ 0, +/* bef - */ 0, +/* bf0 - */ 0, +/* bf1 - */ 0, +/* bf2 - */ 0, +/* bf3 - */ 0, +/* bf4 - */ 0, +/* bf5 - */ 0, +/* bf6 - */ 0, +/* bf7 - */ 0, +/* bf8 - */ 0, +/* bf9 - */ 0, +/* bfa - */ 0, +/* bfb - */ 0, +/* bfc - */ 0, +/* bfd - */ 0, +/* bfe - */ 0, +/* bff - */ 0, +/* c00 - */ 0, +/* c01 - */ 0, +/* c02 - */ 0, +/* c03 - */ 0, +/* c04 - */ 0, +/* c05 - */ 0, +/* c06 - */ 0, +/* c07 - */ 0, +/* c08 - */ 0, +/* c09 - */ 0, +/* c0a - */ 0, +/* c0b - */ 0, +/* c0c - */ 0, +/* c0d - */ 0, +/* c0e - */ 0, +/* c0f - */ 0, +/* c10 - */ 0, +/* c11 - */ 0, +/* c12 - */ 0, +/* c13 - */ 0, +/* c14 - */ 0, +/* c15 - */ 0, +/* c16 - */ 0, +/* c17 - */ 0, +/* c18 - */ 0, +/* c19 - */ 0, +/* c1a - */ 0, +/* c1b - */ 0, +/* c1c - */ 0, +/* c1d - */ 0, +/* c1e - */ 0, +/* c1f - */ 0, +/* c20 - */ 0, +/* c21 - */ 0, +/* c22 - */ 0, +/* c23 - */ 0, +/* c24 - */ 0, +/* c25 - */ 0, +/* c26 - */ 0, +/* c27 - */ 0, +/* c28 - */ 0, +/* c29 - */ 0, +/* c2a - */ 0, +/* c2b - */ 0, +/* c2c - */ 0, +/* c2d - */ 0, +/* c2e - */ 0, +/* c2f - */ 0, +/* c30 - */ 0, +/* c31 - */ 0, +/* c32 - */ 0, +/* c33 - */ 0, +/* c34 - */ 0, +/* c35 - */ 0, +/* c36 - */ 0, +/* c37 - */ 0, +/* c38 - */ 0, +/* c39 - */ 0, +/* c3a - */ 0, +/* c3b - */ 0, +/* c3c - */ 0, +/* c3d - */ 0, +/* c3e - */ 0, +/* c3f - */ 0, +/* c40 - */ 0, +/* c41 - */ 0, +/* c42 - */ 0, +/* c43 - */ 0, +/* c44 - */ 0, +/* c45 - */ 0, +/* c46 - */ 0, +/* c47 - */ 0, +/* c48 - */ 0, +/* c49 - */ 0, +/* c4a - */ 0, +/* c4b - */ 0, +/* c4c - */ 0, +/* c4d - */ 0, +/* c4e - */ 0, +/* c4f - */ 0, +/* c50 - */ 0, +/* c51 - */ 0, +/* c52 - */ 0, +/* c53 - */ 0, +/* c54 - */ 0, +/* c55 - _66_0F_7C */ 0x23fe, +/* c56 - */ 0, +/* c57 - _F2_0F_7C */ 0x23ff, +/* c58 - */ 0, +/* c59 - _V_66_0F_7C */ 0x4087, +/* c5a - */ 0, +/* c5b - _V_F2_0F_7C */ 0x4088, +/* c5c - */ 0, +/* c5d - */ 0, +/* c5e - */ 0, +/* c5f - */ 0, +/* c60 - */ 0, +/* c61 - _66_0F_7D */ 0x2400, +/* c62 - */ 0, +/* c63 - _F2_0F_7D */ 0x2401, +/* c64 - */ 0, +/* c65 - _V_66_0F_7D */ 0x4089, +/* c66 - */ 0, +/* c67 - _V_F2_0F_7D */ 0x408a, +/* c68 - */ 0, +/* c69 - */ 0, +/* c6a - */ 0, +/* c6b - */ 0, +/* c6c - _0F_7E */ 0x408b, +/* c6d - _66_0F_7E */ 0x408c, +/* c6e - _F3_0F_7E */ 0x2402, +/* c6f - */ 0, +/* c70 - */ 0, +/* c71 - _V_66_0F_7E */ 0x408d, +/* c72 - _V_F3_0F_7E */ 0x408e, +/* c73 - */ 0, +/* c74 - */ 0, +/* c75 - */ 0, +/* c76 - */ 0, +/* c77 - */ 0, +/* c78 - _0F_7F */ 0x2403, +/* c79 - _66_0F_7F */ 0x2404, +/* c7a - _F3_0F_7F */ 0x2405, +/* c7b - */ 0, +/* c7c - */ 0, +/* c7d - _V_66_0F_7F */ 0x408f, +/* c7e - _V_F3_0F_7F */ 0x4090, +/* c7f - */ 0, +/* c80 - */ 0, +/* c81 - */ 0, +/* c82 - */ 0, +/* c83 - */ 0, +/* c84 - _0F_AE_00 */ 0xd5fc, +/* c85 - _0F_AE_01 */ 0xd608, +/* c86 - _0F_AE_02 */ 0xd614, +/* c87 - _0F_AE_03 */ 0xd620, +/* c88 - _0F_AE_04 */ 0x4091, +/* c89 - _0F_AE_05 */ 0x4092, +/* c8a - _0F_AE_06 */ 0x4093, +/* c8b - _0F_AE_07 */ 0x4094, +/* c8c - */ 0, +/* c8d - */ 0, +/* c8e - _F3_0F_B8 */ 0x2406, +/* c8f - */ 0, +/* c90 - */ 0, +/* c91 - */ 0, +/* c92 - */ 0, +/* c93 - */ 0, +/* c94 - */ 0, +/* c95 - */ 0, +/* c96 - */ 0, +/* c97 - */ 0, +/* c98 - */ 0, +/* c99 - */ 0, +/* c9a - */ 0, +/* c9b - */ 0, +/* c9c - _0F_BA_04 */ 0x2407, +/* c9d - _0F_BA_05 */ 0x2408, +/* c9e - _0F_BA_06 */ 0x2409, +/* c9f - _0F_BA_07 */ 0x240a, +/* ca0 - _0F_BC */ 0x240b, +/* ca1 - */ 0, +/* ca2 - _F3_0F_BC */ 0x240c, +/* ca3 - */ 0, +/* ca4 - */ 0, +/* ca5 - */ 0, +/* ca6 - */ 0, +/* ca7 - */ 0, +/* ca8 - */ 0, +/* ca9 - */ 0, +/* caa - */ 0, +/* cab - */ 0, +/* cac - _0F_BD */ 0x240d, +/* cad - */ 0, +/* cae - _F3_0F_BD */ 0x240e, +/* caf - */ 0, +/* cb0 - */ 0, +/* cb1 - */ 0, +/* cb2 - */ 0, +/* cb3 - */ 0, +/* cb4 - */ 0, +/* cb5 - */ 0, +/* cb6 - */ 0, +/* cb7 - */ 0, +/* cb8 - _0F_C2 */ 0x4095, +/* cb9 - _66_0F_C2 */ 0x4096, +/* cba - _F3_0F_C2 */ 0x4097, +/* cbb - _F2_0F_C2 */ 0x4098, +/* cbc - _V_0F_C2 */ 0x4099, +/* cbd - _V_66_0F_C2 */ 0x409a, +/* cbe - _V_F3_0F_C2 */ 0x409b, +/* cbf - _V_F2_0F_C2 */ 0x409c, +/* cc0 - */ 0, +/* cc1 - */ 0, +/* cc2 - */ 0, +/* cc3 - */ 0, +/* cc4 - _0F_C4 */ 0x409d, +/* cc5 - _66_0F_C4 */ 0x409e, +/* cc6 - */ 0, +/* cc7 - */ 0, +/* cc8 - */ 0, +/* cc9 - _V_66_0F_C4 */ 0x409f, +/* cca - */ 0, +/* ccb - */ 0, +/* ccc - */ 0, +/* ccd - */ 0, +/* cce - */ 0, +/* ccf - */ 0, +/* cd0 - _0F_C5 */ 0x40a0, +/* cd1 - _66_0F_C5 */ 0x40a1, +/* cd2 - */ 0, +/* cd3 - */ 0, +/* cd4 - */ 0, +/* cd5 - _V_66_0F_C5 */ 0x40a2, +/* cd6 - */ 0, +/* cd7 - */ 0, +/* cd8 - */ 0, +/* cd9 - */ 0, +/* cda - */ 0, +/* cdb - */ 0, +/* cdc - _0F_C6 */ 0x40a3, +/* cdd - _66_0F_C6 */ 0x40a4, +/* cde - */ 0, +/* cdf - */ 0, +/* ce0 - _V_0F_C6 */ 0x40a5, +/* ce1 - _V_66_0F_C6 */ 0x40a6, +/* ce2 - */ 0, +/* ce3 - */ 0, +/* ce4 - */ 0, +/* ce5 - */ 0, +/* ce6 - */ 0, +/* ce7 - */ 0, +/* ce8 - */ 0, +/* ce9 - _0F_C7_01 */ 0x40a7, +/* cea - */ 0, +/* ceb - */ 0, +/* cec - */ 0, +/* ced - */ 0, +/* cee - _0F_C7_06 */ 0xd62c, +/* cef - _0F_C7_07 */ 0x240f, +/* cf0 - */ 0, +/* cf1 - _66_0F_D0 */ 0x2410, +/* cf2 - */ 0, +/* cf3 - _F2_0F_D0 */ 0x2411, +/* cf4 - */ 0, +/* cf5 - _V_66_0F_D0 */ 0x40a8, +/* cf6 - */ 0, +/* cf7 - _V_F2_0F_D0 */ 0x40a9, +/* cf8 - */ 0, +/* cf9 - */ 0, +/* cfa - */ 0, +/* cfb - */ 0, +/* cfc - _0F_D1 */ 0x2412, +/* cfd - _66_0F_D1 */ 0x2413, +/* cfe - */ 0, +/* cff - */ 0, +/* d00 - */ 0, +/* d01 - _V_66_0F_D1 */ 0x40aa, +/* d02 - */ 0, +/* d03 - */ 0, +/* d04 - */ 0, +/* d05 - */ 0, +/* d06 - */ 0, +/* d07 - */ 0, +/* d08 - _0F_D2 */ 0x2414, +/* d09 - _66_0F_D2 */ 0x2415, +/* d0a - */ 0, +/* d0b - */ 0, +/* d0c - */ 0, +/* d0d - _V_66_0F_D2 */ 0x40ab, +/* d0e - */ 0, +/* d0f - */ 0, +/* d10 - */ 0, +/* d11 - */ 0, +/* d12 - */ 0, +/* d13 - */ 0, +/* d14 - _0F_D3 */ 0x2416, +/* d15 - _66_0F_D3 */ 0x2417, +/* d16 - */ 0, +/* d17 - */ 0, +/* d18 - */ 0, +/* d19 - _V_66_0F_D3 */ 0x40ac, +/* d1a - */ 0, +/* d1b - */ 0, +/* d1c - */ 0, +/* d1d - */ 0, +/* d1e - */ 0, +/* d1f - */ 0, +/* d20 - _0F_D4 */ 0x2418, +/* d21 - _66_0F_D4 */ 0x2419, +/* d22 - */ 0, +/* d23 - */ 0, +/* d24 - */ 0, +/* d25 - _V_66_0F_D4 */ 0x40ad, +/* d26 - */ 0, +/* d27 - */ 0, +/* d28 - */ 0, +/* d29 - */ 0, +/* d2a - */ 0, +/* d2b - */ 0, +/* d2c - _0F_D5 */ 0x241a, +/* d2d - _66_0F_D5 */ 0x241b, +/* d2e - */ 0, +/* d2f - */ 0, +/* d30 - */ 0, +/* d31 - _V_66_0F_D5 */ 0x40ae, +/* d32 - */ 0, +/* d33 - */ 0, +/* d34 - */ 0, +/* d35 - */ 0, +/* d36 - */ 0, +/* d37 - */ 0, +/* d38 - */ 0, +/* d39 - _66_0F_D6 */ 0x241c, +/* d3a - _F3_0F_D6 */ 0x241d, +/* d3b - _F2_0F_D6 */ 0x241e, +/* d3c - */ 0, +/* d3d - _V_66_0F_D6 */ 0x40af, +/* d3e - */ 0, +/* d3f - */ 0, +/* d40 - */ 0, +/* d41 - */ 0, +/* d42 - */ 0, +/* d43 - */ 0, +/* d44 - _0F_D7 */ 0x241f, +/* d45 - _66_0F_D7 */ 0x2420, +/* d46 - */ 0, +/* d47 - */ 0, +/* d48 - */ 0, +/* d49 - _V_66_0F_D7 */ 0x40b0, +/* d4a - */ 0, +/* d4b - */ 0, +/* d4c - */ 0, +/* d4d - */ 0, +/* d4e - */ 0, +/* d4f - */ 0, +/* d50 - _0F_D8 */ 0x2421, +/* d51 - _66_0F_D8 */ 0x2422, +/* d52 - */ 0, +/* d53 - */ 0, +/* d54 - */ 0, +/* d55 - _V_66_0F_D8 */ 0x40b1, +/* d56 - */ 0, +/* d57 - */ 0, +/* d58 - */ 0, +/* d59 - */ 0, +/* d5a - */ 0, +/* d5b - */ 0, +/* d5c - _0F_D9 */ 0x2423, +/* d5d - _66_0F_D9 */ 0x2424, +/* d5e - */ 0, +/* d5f - */ 0, +/* d60 - */ 0, +/* d61 - _V_66_0F_D9 */ 0x40b2, +/* d62 - */ 0, +/* d63 - */ 0, +/* d64 - */ 0, +/* d65 - */ 0, +/* d66 - */ 0, +/* d67 - */ 0, +/* d68 - _0F_DA */ 0x2425, +/* d69 - _66_0F_DA */ 0x2426, +/* d6a - */ 0, +/* d6b - */ 0, +/* d6c - */ 0, +/* d6d - _V_66_0F_DA */ 0x40b3, +/* d6e - */ 0, +/* d6f - */ 0, +/* d70 - */ 0, +/* d71 - */ 0, +/* d72 - */ 0, +/* d73 - */ 0, +/* d74 - _0F_DB */ 0x2427, +/* d75 - _66_0F_DB */ 0x2428, +/* d76 - */ 0, +/* d77 - */ 0, +/* d78 - */ 0, +/* d79 - _V_66_0F_DB */ 0x40b4, +/* d7a - */ 0, +/* d7b - */ 0, +/* d7c - */ 0, +/* d7d - */ 0, +/* d7e - */ 0, +/* d7f - */ 0, +/* d80 - _0F_DC */ 0x2429, +/* d81 - _66_0F_DC */ 0x242a, +/* d82 - */ 0, +/* d83 - */ 0, +/* d84 - */ 0, +/* d85 - _V_66_0F_DC */ 0x40b5, +/* d86 - */ 0, +/* d87 - */ 0, +/* d88 - */ 0, +/* d89 - */ 0, +/* d8a - */ 0, +/* d8b - */ 0, +/* d8c - _0F_DD */ 0x242b, +/* d8d - _66_0F_DD */ 0x242c, +/* d8e - */ 0, +/* d8f - */ 0, +/* d90 - */ 0, +/* d91 - _V_66_0F_DD */ 0x40b6, +/* d92 - */ 0, +/* d93 - */ 0, +/* d94 - */ 0, +/* d95 - */ 0, +/* d96 - */ 0, +/* d97 - */ 0, +/* d98 - _0F_DE */ 0x242d, +/* d99 - _66_0F_DE */ 0x242e, +/* d9a - */ 0, +/* d9b - */ 0, +/* d9c - */ 0, +/* d9d - _V_66_0F_DE */ 0x40b7, +/* d9e - */ 0, +/* d9f - */ 0, +/* da0 - */ 0, +/* da1 - */ 0, +/* da2 - */ 0, +/* da3 - */ 0, +/* da4 - _0F_DF */ 0x242f, +/* da5 - _66_0F_DF */ 0x2430, +/* da6 - */ 0, +/* da7 - */ 0, +/* da8 - */ 0, +/* da9 - _V_66_0F_DF */ 0x40b8, +/* daa - */ 0, +/* dab - */ 0, +/* dac - */ 0, +/* dad - */ 0, +/* dae - */ 0, +/* daf - */ 0, +/* db0 - _0F_E0 */ 0x2431, +/* db1 - _66_0F_E0 */ 0x2432, +/* db2 - */ 0, +/* db3 - */ 0, +/* db4 - */ 0, +/* db5 - _V_66_0F_E0 */ 0x40b9, +/* db6 - */ 0, +/* db7 - */ 0, +/* db8 - */ 0, +/* db9 - */ 0, +/* dba - */ 0, +/* dbb - */ 0, +/* dbc - _0F_E1 */ 0x2433, +/* dbd - _66_0F_E1 */ 0x2434, +/* dbe - */ 0, +/* dbf - */ 0, +/* dc0 - */ 0, +/* dc1 - _V_66_0F_E1 */ 0x40ba, +/* dc2 - */ 0, +/* dc3 - */ 0, +/* dc4 - */ 0, +/* dc5 - */ 0, +/* dc6 - */ 0, +/* dc7 - */ 0, +/* dc8 - _0F_E2 */ 0x2435, +/* dc9 - _66_0F_E2 */ 0x2436, +/* dca - */ 0, +/* dcb - */ 0, +/* dcc - */ 0, +/* dcd - _V_66_0F_E2 */ 0x40bb, +/* dce - */ 0, +/* dcf - */ 0, +/* dd0 - */ 0, +/* dd1 - */ 0, +/* dd2 - */ 0, +/* dd3 - */ 0, +/* dd4 - _0F_E3 */ 0x2437, +/* dd5 - _66_0F_E3 */ 0x2438, +/* dd6 - */ 0, +/* dd7 - */ 0, +/* dd8 - */ 0, +/* dd9 - _V_66_0F_E3 */ 0x40bc, +/* dda - */ 0, +/* ddb - */ 0, +/* ddc - */ 0, +/* ddd - */ 0, +/* dde - */ 0, +/* ddf - */ 0, +/* de0 - _0F_E4 */ 0x2439, +/* de1 - _66_0F_E4 */ 0x243a, +/* de2 - */ 0, +/* de3 - */ 0, +/* de4 - */ 0, +/* de5 - _V_66_0F_E4 */ 0x40bd, +/* de6 - */ 0, +/* de7 - */ 0, +/* de8 - */ 0, +/* de9 - */ 0, +/* dea - */ 0, +/* deb - */ 0, +/* dec - _0F_E5 */ 0x243b, +/* ded - _66_0F_E5 */ 0x243c, +/* dee - */ 0, +/* def - */ 0, +/* df0 - */ 0, +/* df1 - _V_66_0F_E5 */ 0x40be, +/* df2 - */ 0, +/* df3 - */ 0, +/* df4 - */ 0, +/* df5 - */ 0, +/* df6 - */ 0, +/* df7 - */ 0, +/* df8 - */ 0, +/* df9 - _66_0F_E6 */ 0x243d, +/* dfa - _F3_0F_E6 */ 0x243e, +/* dfb - _F2_0F_E6 */ 0x243f, +/* dfc - */ 0, +/* dfd - _V_66_0F_E6 */ 0x40bf, +/* dfe - _V_F3_0F_E6 */ 0x40c0, +/* dff - _V_F2_0F_E6 */ 0x40c1, +/* e00 - */ 0, +/* e01 - */ 0, +/* e02 - */ 0, +/* e03 - */ 0, +/* e04 - _0F_E7 */ 0x2440, +/* e05 - _66_0F_E7 */ 0x2441, +/* e06 - */ 0, +/* e07 - */ 0, +/* e08 - */ 0, +/* e09 - _V_66_0F_E7 */ 0x40c2, +/* e0a - */ 0, +/* e0b - */ 0, +/* e0c - */ 0, +/* e0d - */ 0, +/* e0e - */ 0, +/* e0f - */ 0, +/* e10 - _0F_E8 */ 0x2442, +/* e11 - _66_0F_E8 */ 0x2443, +/* e12 - */ 0, +/* e13 - */ 0, +/* e14 - */ 0, +/* e15 - _V_66_0F_E8 */ 0x40c3, +/* e16 - */ 0, +/* e17 - */ 0, +/* e18 - */ 0, +/* e19 - */ 0, +/* e1a - */ 0, +/* e1b - */ 0, +/* e1c - _0F_E9 */ 0x2444, +/* e1d - _66_0F_E9 */ 0x2445, +/* e1e - */ 0, +/* e1f - */ 0, +/* e20 - */ 0, +/* e21 - _V_66_0F_E9 */ 0x40c4, +/* e22 - */ 0, +/* e23 - */ 0, +/* e24 - */ 0, +/* e25 - */ 0, +/* e26 - */ 0, +/* e27 - */ 0, +/* e28 - _0F_EA */ 0x2446, +/* e29 - _66_0F_EA */ 0x2447, +/* e2a - */ 0, +/* e2b - */ 0, +/* e2c - */ 0, +/* e2d - _V_66_0F_EA */ 0x40c5, +/* e2e - */ 0, +/* e2f - */ 0, +/* e30 - */ 0, +/* e31 - */ 0, +/* e32 - */ 0, +/* e33 - */ 0, +/* e34 - _0F_EB */ 0x2448, +/* e35 - _66_0F_EB */ 0x2449, +/* e36 - */ 0, +/* e37 - */ 0, +/* e38 - */ 0, +/* e39 - _V_66_0F_EB */ 0x40c6, +/* e3a - */ 0, +/* e3b - */ 0, +/* e3c - */ 0, +/* e3d - */ 0, +/* e3e - */ 0, +/* e3f - */ 0, +/* e40 - _0F_EC */ 0x244a, +/* e41 - _66_0F_EC */ 0x244b, +/* e42 - */ 0, +/* e43 - */ 0, +/* e44 - */ 0, +/* e45 - _V_66_0F_EC */ 0x40c7, +/* e46 - */ 0, +/* e47 - */ 0, +/* e48 - */ 0, +/* e49 - */ 0, +/* e4a - */ 0, +/* e4b - */ 0, +/* e4c - _0F_ED */ 0x244c, +/* e4d - _66_0F_ED */ 0x244d, +/* e4e - */ 0, +/* e4f - */ 0, +/* e50 - */ 0, +/* e51 - _V_66_0F_ED */ 0x40c8, +/* e52 - */ 0, +/* e53 - */ 0, +/* e54 - */ 0, +/* e55 - */ 0, +/* e56 - */ 0, +/* e57 - */ 0, +/* e58 - _0F_EE */ 0x244e, +/* e59 - _66_0F_EE */ 0x244f, +/* e5a - */ 0, +/* e5b - */ 0, +/* e5c - */ 0, +/* e5d - _V_66_0F_EE */ 0x40c9, +/* e5e - */ 0, +/* e5f - */ 0, +/* e60 - */ 0, +/* e61 - */ 0, +/* e62 - */ 0, +/* e63 - */ 0, +/* e64 - _0F_EF */ 0x2450, +/* e65 - _66_0F_EF */ 0x2451, +/* e66 - */ 0, +/* e67 - */ 0, +/* e68 - */ 0, +/* e69 - _V_66_0F_EF */ 0x40ca, +/* e6a - */ 0, +/* e6b - */ 0, +/* e6c - */ 0, +/* e6d - */ 0, +/* e6e - */ 0, +/* e6f - */ 0, +/* e70 - */ 0, +/* e71 - */ 0, +/* e72 - */ 0, +/* e73 - _F2_0F_F0 */ 0x2452, +/* e74 - */ 0, +/* e75 - */ 0, +/* e76 - */ 0, +/* e77 - _V_F2_0F_F0 */ 0x40cb, +/* e78 - */ 0, +/* e79 - */ 0, +/* e7a - */ 0, +/* e7b - */ 0, +/* e7c - _0F_F1 */ 0x2453, +/* e7d - _66_0F_F1 */ 0x2454, +/* e7e - */ 0, +/* e7f - */ 0, +/* e80 - */ 0, +/* e81 - _V_66_0F_F1 */ 0x40cc, +/* e82 - */ 0, +/* e83 - */ 0, +/* e84 - */ 0, +/* e85 - */ 0, +/* e86 - */ 0, +/* e87 - */ 0, +/* e88 - _0F_F2 */ 0x2455, +/* e89 - _66_0F_F2 */ 0x2456, +/* e8a - */ 0, +/* e8b - */ 0, +/* e8c - */ 0, +/* e8d - _V_66_0F_F2 */ 0x40cd, +/* e8e - */ 0, +/* e8f - */ 0, +/* e90 - */ 0, +/* e91 - */ 0, +/* e92 - */ 0, +/* e93 - */ 0, +/* e94 - _0F_F3 */ 0x2457, +/* e95 - _66_0F_F3 */ 0x2458, +/* e96 - */ 0, +/* e97 - */ 0, +/* e98 - */ 0, +/* e99 - _V_66_0F_F3 */ 0x40ce, +/* e9a - */ 0, +/* e9b - */ 0, +/* e9c - */ 0, +/* e9d - */ 0, +/* e9e - */ 0, +/* e9f - */ 0, +/* ea0 - _0F_F4 */ 0x2459, +/* ea1 - _66_0F_F4 */ 0x245a, +/* ea2 - */ 0, +/* ea3 - */ 0, +/* ea4 - */ 0, +/* ea5 - _V_66_0F_F4 */ 0x40cf, +/* ea6 - */ 0, +/* ea7 - */ 0, +/* ea8 - */ 0, +/* ea9 - */ 0, +/* eaa - */ 0, +/* eab - */ 0, +/* eac - _0F_F5 */ 0x245b, +/* ead - _66_0F_F5 */ 0x245c, +/* eae - */ 0, +/* eaf - */ 0, +/* eb0 - */ 0, +/* eb1 - _V_66_0F_F5 */ 0x40d0, +/* eb2 - */ 0, +/* eb3 - */ 0, +/* eb4 - */ 0, +/* eb5 - */ 0, +/* eb6 - */ 0, +/* eb7 - */ 0, +/* eb8 - _0F_F6 */ 0x245d, +/* eb9 - _66_0F_F6 */ 0x245e, +/* eba - */ 0, +/* ebb - */ 0, +/* ebc - */ 0, +/* ebd - _V_66_0F_F6 */ 0x40d1, +/* ebe - */ 0, +/* ebf - */ 0, +/* ec0 - */ 0, +/* ec1 - */ 0, +/* ec2 - */ 0, +/* ec3 - */ 0, +/* ec4 - _0F_F7 */ 0x245f, +/* ec5 - _66_0F_F7 */ 0x2460, +/* ec6 - */ 0, +/* ec7 - */ 0, +/* ec8 - */ 0, +/* ec9 - _V_66_0F_F7 */ 0x40d2, +/* eca - */ 0, +/* ecb - */ 0, +/* ecc - */ 0, +/* ecd - */ 0, +/* ece - */ 0, +/* ecf - */ 0, +/* ed0 - _0F_F8 */ 0x2461, +/* ed1 - _66_0F_F8 */ 0x2462, +/* ed2 - */ 0, +/* ed3 - */ 0, +/* ed4 - */ 0, +/* ed5 - _V_66_0F_F8 */ 0x40d3, +/* ed6 - */ 0, +/* ed7 - */ 0, +/* ed8 - */ 0, +/* ed9 - */ 0, +/* eda - */ 0, +/* edb - */ 0, +/* edc - _0F_F9 */ 0x2463, +/* edd - _66_0F_F9 */ 0x2464, +/* ede - */ 0, +/* edf - */ 0, +/* ee0 - */ 0, +/* ee1 - _V_66_0F_F9 */ 0x40d4, +/* ee2 - */ 0, +/* ee3 - */ 0, +/* ee4 - */ 0, +/* ee5 - */ 0, +/* ee6 - */ 0, +/* ee7 - */ 0, +/* ee8 - _0F_FA */ 0x2465, +/* ee9 - _66_0F_FA */ 0x2466, +/* eea - */ 0, +/* eeb - */ 0, +/* eec - */ 0, +/* eed - _V_66_0F_FA */ 0x40d5, +/* eee - */ 0, +/* eef - */ 0, +/* ef0 - */ 0, +/* ef1 - */ 0, +/* ef2 - */ 0, +/* ef3 - */ 0, +/* ef4 - _0F_FB */ 0x2467, +/* ef5 - _66_0F_FB */ 0x2468, +/* ef6 - */ 0, +/* ef7 - */ 0, +/* ef8 - */ 0, +/* ef9 - _V_66_0F_FB */ 0x40d6, +/* efa - */ 0, +/* efb - */ 0, +/* efc - */ 0, +/* efd - */ 0, +/* efe - */ 0, +/* eff - */ 0, +/* f00 - _0F_FC */ 0x2469, +/* f01 - _66_0F_FC */ 0x246a, +/* f02 - */ 0, +/* f03 - */ 0, +/* f04 - */ 0, +/* f05 - _V_66_0F_FC */ 0x40d7, +/* f06 - */ 0, +/* f07 - */ 0, +/* f08 - */ 0, +/* f09 - */ 0, +/* f0a - */ 0, +/* f0b - */ 0, +/* f0c - _0F_FD */ 0x246b, +/* f0d - _66_0F_FD */ 0x246c, +/* f0e - */ 0, +/* f0f - */ 0, +/* f10 - */ 0, +/* f11 - _V_66_0F_FD */ 0x40d8, +/* f12 - */ 0, +/* f13 - */ 0, +/* f14 - */ 0, +/* f15 - */ 0, +/* f16 - */ 0, +/* f17 - */ 0, +/* f18 - _0F_FE */ 0x246d, +/* f19 - _66_0F_FE */ 0x246e, +/* f1a - */ 0, +/* f1b - */ 0, +/* f1c - */ 0, +/* f1d - _V_66_0F_FE */ 0x40d9, +/* f1e - */ 0, +/* f1f - */ 0, +/* f20 - */ 0, +/* f21 - */ 0, +/* f22 - */ 0, +/* f23 - */ 0, +/* f24 - _D9_06 */ 0x246f, +/* f25 - _9B_D9_06 */ 0x2470, +/* f26 - */ 0, +/* f27 - */ 0, +/* f28 - */ 0, +/* f29 - */ 0, +/* f2a - */ 0, +/* f2b - */ 0, +/* f2c - */ 0, +/* f2d - */ 0, +/* f2e - */ 0, +/* f2f - */ 0, +/* f30 - _D9_07 */ 0x2471, +/* f31 - _9B_D9_07 */ 0x2472, +/* f32 - */ 0, +/* f33 - */ 0, +/* f34 - */ 0, +/* f35 - */ 0, +/* f36 - */ 0, +/* f37 - */ 0, +/* f38 - */ 0, +/* f39 - */ 0, +/* f3a - */ 0, +/* f3b - */ 0, +/* f3c - _DB_E2 */ 0x2473, +/* f3d - _9B_DB_E2 */ 0x2474, +/* f3e - */ 0, +/* f3f - */ 0, +/* f40 - */ 0, +/* f41 - */ 0, +/* f42 - */ 0, +/* f43 - */ 0, +/* f44 - */ 0, +/* f45 - */ 0, +/* f46 - */ 0, +/* f47 - */ 0, +/* f48 - _DB_E3 */ 0x2475, +/* f49 - _9B_DB_E3 */ 0x2476, +/* f4a - */ 0, +/* f4b - */ 0, +/* f4c - */ 0, +/* f4d - */ 0, +/* f4e - */ 0, +/* f4f - */ 0, +/* f50 - */ 0, +/* f51 - */ 0, +/* f52 - */ 0, +/* f53 - */ 0, +/* f54 - _DD_06 */ 0x2477, +/* f55 - _9B_DD_06 */ 0x2478, +/* f56 - */ 0, +/* f57 - */ 0, +/* f58 - */ 0, +/* f59 - */ 0, +/* f5a - */ 0, +/* f5b - */ 0, +/* f5c - */ 0, +/* f5d - */ 0, +/* f5e - */ 0, +/* f5f - */ 0, +/* f60 - _DD_07 */ 0x2479, +/* f61 - _9B_DD_07 */ 0x247a, +/* f62 - */ 0, +/* f63 - */ 0, +/* f64 - */ 0, +/* f65 - */ 0, +/* f66 - */ 0, +/* f67 - */ 0, +/* f68 - */ 0, +/* f69 - */ 0, +/* f6a - */ 0, +/* f6b - */ 0, +/* f6c - _DF_E0 */ 0x247b, +/* f6d - _9B_DF_E0 */ 0x247c, +/* f6e - */ 0, +/* f6f - */ 0, +/* f70 - */ 0, +/* f71 - */ 0, +/* f72 - */ 0, +/* f73 - */ 0, +/* f74 - */ 0, +/* f75 - */ 0, +/* f76 - */ 0, +/* f77 - */ 0, +/* f78 - _0F_38_00 */ 0x247d, +/* f79 - _66_0F_38_00 */ 0x247e, +/* f7a - */ 0, +/* f7b - */ 0, +/* f7c - */ 0, +/* f7d - _V_66_0F_38_00 */ 0x40da, +/* f7e - */ 0, +/* f7f - */ 0, +/* f80 - */ 0, +/* f81 - */ 0, +/* f82 - */ 0, +/* f83 - */ 0, +/* f84 - _0F_38_01 */ 0x247f, +/* f85 - _66_0F_38_01 */ 0x2480, +/* f86 - */ 0, +/* f87 - */ 0, +/* f88 - */ 0, +/* f89 - _V_66_0F_38_01 */ 0x40db, +/* f8a - */ 0, +/* f8b - */ 0, +/* f8c - */ 0, +/* f8d - */ 0, +/* f8e - */ 0, +/* f8f - */ 0, +/* f90 - _0F_38_02 */ 0x2481, +/* f91 - _66_0F_38_02 */ 0x2482, +/* f92 - */ 0, +/* f93 - */ 0, +/* f94 - */ 0, +/* f95 - _V_66_0F_38_02 */ 0x40dc, +/* f96 - */ 0, +/* f97 - */ 0, +/* f98 - */ 0, +/* f99 - */ 0, +/* f9a - */ 0, +/* f9b - */ 0, +/* f9c - _0F_38_03 */ 0x2483, +/* f9d - _66_0F_38_03 */ 0x2484, +/* f9e - */ 0, +/* f9f - */ 0, +/* fa0 - */ 0, +/* fa1 - _V_66_0F_38_03 */ 0x40dd, +/* fa2 - */ 0, +/* fa3 - */ 0, +/* fa4 - */ 0, +/* fa5 - */ 0, +/* fa6 - */ 0, +/* fa7 - */ 0, +/* fa8 - _0F_38_04 */ 0x2485, +/* fa9 - _66_0F_38_04 */ 0x2486, +/* faa - */ 0, +/* fab - */ 0, +/* fac - */ 0, +/* fad - _V_66_0F_38_04 */ 0x40de, +/* fae - */ 0, +/* faf - */ 0, +/* fb0 - */ 0, +/* fb1 - */ 0, +/* fb2 - */ 0, +/* fb3 - */ 0, +/* fb4 - _0F_38_05 */ 0x2487, +/* fb5 - _66_0F_38_05 */ 0x2488, +/* fb6 - */ 0, +/* fb7 - */ 0, +/* fb8 - */ 0, +/* fb9 - _V_66_0F_38_05 */ 0x40df, +/* fba - */ 0, +/* fbb - */ 0, +/* fbc - */ 0, +/* fbd - */ 0, +/* fbe - */ 0, +/* fbf - */ 0, +/* fc0 - _0F_38_06 */ 0x2489, +/* fc1 - _66_0F_38_06 */ 0x248a, +/* fc2 - */ 0, +/* fc3 - */ 0, +/* fc4 - */ 0, +/* fc5 - _V_66_0F_38_06 */ 0x40e0, +/* fc6 - */ 0, +/* fc7 - */ 0, +/* fc8 - */ 0, +/* fc9 - */ 0, +/* fca - */ 0, +/* fcb - */ 0, +/* fcc - _0F_38_07 */ 0x248b, +/* fcd - _66_0F_38_07 */ 0x248c, +/* fce - */ 0, +/* fcf - */ 0, +/* fd0 - */ 0, +/* fd1 - _V_66_0F_38_07 */ 0x40e1, +/* fd2 - */ 0, +/* fd3 - */ 0, +/* fd4 - */ 0, +/* fd5 - */ 0, +/* fd6 - */ 0, +/* fd7 - */ 0, +/* fd8 - _0F_38_08 */ 0x248d, +/* fd9 - _66_0F_38_08 */ 0x248e, +/* fda - */ 0, +/* fdb - */ 0, +/* fdc - */ 0, +/* fdd - _V_66_0F_38_08 */ 0x40e2, +/* fde - */ 0, +/* fdf - */ 0, +/* fe0 - */ 0, +/* fe1 - */ 0, +/* fe2 - */ 0, +/* fe3 - */ 0, +/* fe4 - _0F_38_09 */ 0x248f, +/* fe5 - _66_0F_38_09 */ 0x2490, +/* fe6 - */ 0, +/* fe7 - */ 0, +/* fe8 - */ 0, +/* fe9 - _V_66_0F_38_09 */ 0x40e3, +/* fea - */ 0, +/* feb - */ 0, +/* fec - */ 0, +/* fed - */ 0, +/* fee - */ 0, +/* fef - */ 0, +/* ff0 - _0F_38_0A */ 0x2491, +/* ff1 - _66_0F_38_0A */ 0x2492, +/* ff2 - */ 0, +/* ff3 - */ 0, +/* ff4 - */ 0, +/* ff5 - _V_66_0F_38_0A */ 0x40e4, +/* ff6 - */ 0, +/* ff7 - */ 0, +/* ff8 - */ 0, +/* ff9 - */ 0, +/* ffa - */ 0, +/* ffb - */ 0, +/* ffc - _0F_38_0B */ 0x2493, +/* ffd - _66_0F_38_0B */ 0x2494, +/* ffe - */ 0, +/* fff - */ 0, +/* 1000 - */ 0, +/* 1001 - _V_66_0F_38_0B */ 0x40e5, +/* 1002 - */ 0, +/* 1003 - */ 0, +/* 1004 - */ 0, +/* 1005 - */ 0, +/* 1006 - */ 0, +/* 1007 - */ 0, +/* 1008 - */ 0, +/* 1009 - */ 0, +/* 100a - */ 0, +/* 100b - */ 0, +/* 100c - */ 0, +/* 100d - _V_66_0F_38_0C */ 0x40e6, +/* 100e - */ 0, +/* 100f - */ 0, +/* 1010 - */ 0, +/* 1011 - */ 0, +/* 1012 - */ 0, +/* 1013 - */ 0, +/* 1014 - */ 0, +/* 1015 - */ 0, +/* 1016 - */ 0, +/* 1017 - */ 0, +/* 1018 - */ 0, +/* 1019 - _V_66_0F_38_0D */ 0x40e7, +/* 101a - */ 0, +/* 101b - */ 0, +/* 101c - */ 0, +/* 101d - */ 0, +/* 101e - */ 0, +/* 101f - */ 0, +/* 1020 - */ 0, +/* 1021 - */ 0, +/* 1022 - */ 0, +/* 1023 - */ 0, +/* 1024 - */ 0, +/* 1025 - _V_66_0F_38_0E */ 0x40e8, +/* 1026 - */ 0, +/* 1027 - */ 0, +/* 1028 - */ 0, +/* 1029 - */ 0, +/* 102a - */ 0, +/* 102b - */ 0, +/* 102c - */ 0, +/* 102d - */ 0, +/* 102e - */ 0, +/* 102f - */ 0, +/* 1030 - */ 0, +/* 1031 - _V_66_0F_38_0F */ 0x40e9, +/* 1032 - */ 0, +/* 1033 - */ 0, +/* 1034 - */ 0, +/* 1035 - */ 0, +/* 1036 - */ 0, +/* 1037 - */ 0, +/* 1038 - */ 0, +/* 1039 - _66_0F_38_10 */ 0x40ea, +/* 103a - */ 0, +/* 103b - */ 0, +/* 103c - */ 0, +/* 103d - */ 0, +/* 103e - */ 0, +/* 103f - */ 0, +/* 1040 - */ 0, +/* 1041 - */ 0, +/* 1042 - */ 0, +/* 1043 - */ 0, +/* 1044 - */ 0, +/* 1045 - _66_0F_38_14 */ 0x40eb, +/* 1046 - */ 0, +/* 1047 - */ 0, +/* 1048 - */ 0, +/* 1049 - */ 0, +/* 104a - */ 0, +/* 104b - */ 0, +/* 104c - */ 0, +/* 104d - */ 0, +/* 104e - */ 0, +/* 104f - */ 0, +/* 1050 - */ 0, +/* 1051 - _66_0F_38_15 */ 0x40ec, +/* 1052 - */ 0, +/* 1053 - */ 0, +/* 1054 - */ 0, +/* 1055 - */ 0, +/* 1056 - */ 0, +/* 1057 - */ 0, +/* 1058 - */ 0, +/* 1059 - */ 0, +/* 105a - */ 0, +/* 105b - */ 0, +/* 105c - */ 0, +/* 105d - _66_0F_38_17 */ 0x2495, +/* 105e - */ 0, +/* 105f - */ 0, +/* 1060 - */ 0, +/* 1061 - _V_66_0F_38_17 */ 0x40ed, +/* 1062 - */ 0, +/* 1063 - */ 0, +/* 1064 - */ 0, +/* 1065 - */ 0, +/* 1066 - */ 0, +/* 1067 - */ 0, +/* 1068 - */ 0, +/* 1069 - */ 0, +/* 106a - */ 0, +/* 106b - */ 0, +/* 106c - */ 0, +/* 106d - _V_66_0F_38_18 */ 0x40ee, +/* 106e - */ 0, +/* 106f - */ 0, +/* 1070 - */ 0, +/* 1071 - */ 0, +/* 1072 - */ 0, +/* 1073 - */ 0, +/* 1074 - */ 0, +/* 1075 - */ 0, +/* 1076 - */ 0, +/* 1077 - */ 0, +/* 1078 - */ 0, +/* 1079 - _V_66_0F_38_19 */ 0x40ef, +/* 107a - */ 0, +/* 107b - */ 0, +/* 107c - */ 0, +/* 107d - */ 0, +/* 107e - */ 0, +/* 107f - */ 0, +/* 1080 - */ 0, +/* 1081 - */ 0, +/* 1082 - */ 0, +/* 1083 - */ 0, +/* 1084 - */ 0, +/* 1085 - _V_66_0F_38_1A */ 0x40f0, +/* 1086 - */ 0, +/* 1087 - */ 0, +/* 1088 - */ 0, +/* 1089 - */ 0, +/* 108a - */ 0, +/* 108b - */ 0, +/* 108c - _0F_38_1C */ 0x2496, +/* 108d - _66_0F_38_1C */ 0x2497, +/* 108e - */ 0, +/* 108f - */ 0, +/* 1090 - */ 0, +/* 1091 - _V_66_0F_38_1C */ 0x40f1, +/* 1092 - */ 0, +/* 1093 - */ 0, +/* 1094 - */ 0, +/* 1095 - */ 0, +/* 1096 - */ 0, +/* 1097 - */ 0, +/* 1098 - _0F_38_1D */ 0x2498, +/* 1099 - _66_0F_38_1D */ 0x2499, +/* 109a - */ 0, +/* 109b - */ 0, +/* 109c - */ 0, +/* 109d - _V_66_0F_38_1D */ 0x40f2, +/* 109e - */ 0, +/* 109f - */ 0, +/* 10a0 - */ 0, +/* 10a1 - */ 0, +/* 10a2 - */ 0, +/* 10a3 - */ 0, +/* 10a4 - _0F_38_1E */ 0x249a, +/* 10a5 - _66_0F_38_1E */ 0x249b, +/* 10a6 - */ 0, +/* 10a7 - */ 0, +/* 10a8 - */ 0, +/* 10a9 - _V_66_0F_38_1E */ 0x40f3, +/* 10aa - */ 0, +/* 10ab - */ 0, +/* 10ac - */ 0, +/* 10ad - */ 0, +/* 10ae - */ 0, +/* 10af - */ 0, +/* 10b0 - */ 0, +/* 10b1 - _66_0F_38_20 */ 0x249c, +/* 10b2 - */ 0, +/* 10b3 - */ 0, +/* 10b4 - */ 0, +/* 10b5 - _V_66_0F_38_20 */ 0x40f4, +/* 10b6 - */ 0, +/* 10b7 - */ 0, +/* 10b8 - */ 0, +/* 10b9 - */ 0, +/* 10ba - */ 0, +/* 10bb - */ 0, +/* 10bc - */ 0, +/* 10bd - _66_0F_38_21 */ 0x249d, +/* 10be - */ 0, +/* 10bf - */ 0, +/* 10c0 - */ 0, +/* 10c1 - _V_66_0F_38_21 */ 0x40f5, +/* 10c2 - */ 0, +/* 10c3 - */ 0, +/* 10c4 - */ 0, +/* 10c5 - */ 0, +/* 10c6 - */ 0, +/* 10c7 - */ 0, +/* 10c8 - */ 0, +/* 10c9 - _66_0F_38_22 */ 0x249e, +/* 10ca - */ 0, +/* 10cb - */ 0, +/* 10cc - */ 0, +/* 10cd - _V_66_0F_38_22 */ 0x40f6, +/* 10ce - */ 0, +/* 10cf - */ 0, +/* 10d0 - */ 0, +/* 10d1 - */ 0, +/* 10d2 - */ 0, +/* 10d3 - */ 0, +/* 10d4 - */ 0, +/* 10d5 - _66_0F_38_23 */ 0x249f, +/* 10d6 - */ 0, +/* 10d7 - */ 0, +/* 10d8 - */ 0, +/* 10d9 - _V_66_0F_38_23 */ 0x40f7, +/* 10da - */ 0, +/* 10db - */ 0, +/* 10dc - */ 0, +/* 10dd - */ 0, +/* 10de - */ 0, +/* 10df - */ 0, +/* 10e0 - */ 0, +/* 10e1 - _66_0F_38_24 */ 0x24a0, +/* 10e2 - */ 0, +/* 10e3 - */ 0, +/* 10e4 - */ 0, +/* 10e5 - _V_66_0F_38_24 */ 0x40f8, +/* 10e6 - */ 0, +/* 10e7 - */ 0, +/* 10e8 - */ 0, +/* 10e9 - */ 0, +/* 10ea - */ 0, +/* 10eb - */ 0, +/* 10ec - */ 0, +/* 10ed - _66_0F_38_25 */ 0x24a1, +/* 10ee - */ 0, +/* 10ef - */ 0, +/* 10f0 - */ 0, +/* 10f1 - _V_66_0F_38_25 */ 0x40f9, +/* 10f2 - */ 0, +/* 10f3 - */ 0, +/* 10f4 - */ 0, +/* 10f5 - */ 0, +/* 10f6 - */ 0, +/* 10f7 - */ 0, +/* 10f8 - */ 0, +/* 10f9 - _66_0F_38_28 */ 0x24a2, +/* 10fa - */ 0, +/* 10fb - */ 0, +/* 10fc - */ 0, +/* 10fd - _V_66_0F_38_28 */ 0x40fa, +/* 10fe - */ 0, +/* 10ff - */ 0, +/* 1100 - */ 0, +/* 1101 - */ 0, +/* 1102 - */ 0, +/* 1103 - */ 0, +/* 1104 - */ 0, +/* 1105 - _66_0F_38_29 */ 0x24a3, +/* 1106 - */ 0, +/* 1107 - */ 0, +/* 1108 - */ 0, +/* 1109 - _V_66_0F_38_29 */ 0x40fb, +/* 110a - */ 0, +/* 110b - */ 0, +/* 110c - */ 0, +/* 110d - */ 0, +/* 110e - */ 0, +/* 110f - */ 0, +/* 1110 - */ 0, +/* 1111 - _66_0F_38_2A */ 0x24a4, +/* 1112 - */ 0, +/* 1113 - */ 0, +/* 1114 - */ 0, +/* 1115 - _V_66_0F_38_2A */ 0x40fc, +/* 1116 - */ 0, +/* 1117 - */ 0, +/* 1118 - */ 0, +/* 1119 - */ 0, +/* 111a - */ 0, +/* 111b - */ 0, +/* 111c - */ 0, +/* 111d - _66_0F_38_2B */ 0x24a5, +/* 111e - */ 0, +/* 111f - */ 0, +/* 1120 - */ 0, +/* 1121 - _V_66_0F_38_2B */ 0x40fd, +/* 1122 - */ 0, +/* 1123 - */ 0, +/* 1124 - */ 0, +/* 1125 - */ 0, +/* 1126 - */ 0, +/* 1127 - */ 0, +/* 1128 - */ 0, +/* 1129 - */ 0, +/* 112a - */ 0, +/* 112b - */ 0, +/* 112c - */ 0, +/* 112d - _V_66_0F_38_2C */ 0x40fe, +/* 112e - */ 0, +/* 112f - */ 0, +/* 1130 - */ 0, +/* 1131 - */ 0, +/* 1132 - */ 0, +/* 1133 - */ 0, +/* 1134 - */ 0, +/* 1135 - */ 0, +/* 1136 - */ 0, +/* 1137 - */ 0, +/* 1138 - */ 0, +/* 1139 - _V_66_0F_38_2D */ 0x40ff, +/* 113a - */ 0, +/* 113b - */ 0, +/* 113c - */ 0, +/* 113d - */ 0, +/* 113e - */ 0, +/* 113f - */ 0, +/* 1140 - */ 0, +/* 1141 - */ 0, +/* 1142 - */ 0, +/* 1143 - */ 0, +/* 1144 - */ 0, +/* 1145 - _V_66_0F_38_2E */ 0x4100, +/* 1146 - */ 0, +/* 1147 - */ 0, +/* 1148 - */ 0, +/* 1149 - */ 0, +/* 114a - */ 0, +/* 114b - */ 0, +/* 114c - */ 0, +/* 114d - */ 0, +/* 114e - */ 0, +/* 114f - */ 0, +/* 1150 - */ 0, +/* 1151 - _V_66_0F_38_2F */ 0x4101, +/* 1152 - */ 0, +/* 1153 - */ 0, +/* 1154 - */ 0, +/* 1155 - */ 0, +/* 1156 - */ 0, +/* 1157 - */ 0, +/* 1158 - */ 0, +/* 1159 - _66_0F_38_30 */ 0x24a6, +/* 115a - */ 0, +/* 115b - */ 0, +/* 115c - */ 0, +/* 115d - _V_66_0F_38_30 */ 0x4102, +/* 115e - */ 0, +/* 115f - */ 0, +/* 1160 - */ 0, +/* 1161 - */ 0, +/* 1162 - */ 0, +/* 1163 - */ 0, +/* 1164 - */ 0, +/* 1165 - _66_0F_38_31 */ 0x24a7, +/* 1166 - */ 0, +/* 1167 - */ 0, +/* 1168 - */ 0, +/* 1169 - _V_66_0F_38_31 */ 0x4103, +/* 116a - */ 0, +/* 116b - */ 0, +/* 116c - */ 0, +/* 116d - */ 0, +/* 116e - */ 0, +/* 116f - */ 0, +/* 1170 - */ 0, +/* 1171 - _66_0F_38_32 */ 0x24a8, +/* 1172 - */ 0, +/* 1173 - */ 0, +/* 1174 - */ 0, +/* 1175 - _V_66_0F_38_32 */ 0x4104, +/* 1176 - */ 0, +/* 1177 - */ 0, +/* 1178 - */ 0, +/* 1179 - */ 0, +/* 117a - */ 0, +/* 117b - */ 0, +/* 117c - */ 0, +/* 117d - _66_0F_38_33 */ 0x24a9, +/* 117e - */ 0, +/* 117f - */ 0, +/* 1180 - */ 0, +/* 1181 - _V_66_0F_38_33 */ 0x4105, +/* 1182 - */ 0, +/* 1183 - */ 0, +/* 1184 - */ 0, +/* 1185 - */ 0, +/* 1186 - */ 0, +/* 1187 - */ 0, +/* 1188 - */ 0, +/* 1189 - _66_0F_38_34 */ 0x24aa, +/* 118a - */ 0, +/* 118b - */ 0, +/* 118c - */ 0, +/* 118d - _V_66_0F_38_34 */ 0x4106, +/* 118e - */ 0, +/* 118f - */ 0, +/* 1190 - */ 0, +/* 1191 - */ 0, +/* 1192 - */ 0, +/* 1193 - */ 0, +/* 1194 - */ 0, +/* 1195 - _66_0F_38_35 */ 0x24ab, +/* 1196 - */ 0, +/* 1197 - */ 0, +/* 1198 - */ 0, +/* 1199 - _V_66_0F_38_35 */ 0x4107, +/* 119a - */ 0, +/* 119b - */ 0, +/* 119c - */ 0, +/* 119d - */ 0, +/* 119e - */ 0, +/* 119f - */ 0, +/* 11a0 - */ 0, +/* 11a1 - _66_0F_38_37 */ 0x24ac, +/* 11a2 - */ 0, +/* 11a3 - */ 0, +/* 11a4 - */ 0, +/* 11a5 - _V_66_0F_38_37 */ 0x4108, +/* 11a6 - */ 0, +/* 11a7 - */ 0, +/* 11a8 - */ 0, +/* 11a9 - */ 0, +/* 11aa - */ 0, +/* 11ab - */ 0, +/* 11ac - */ 0, +/* 11ad - _66_0F_38_38 */ 0x24ad, +/* 11ae - */ 0, +/* 11af - */ 0, +/* 11b0 - */ 0, +/* 11b1 - _V_66_0F_38_38 */ 0x4109, +/* 11b2 - */ 0, +/* 11b3 - */ 0, +/* 11b4 - */ 0, +/* 11b5 - */ 0, +/* 11b6 - */ 0, +/* 11b7 - */ 0, +/* 11b8 - */ 0, +/* 11b9 - _66_0F_38_39 */ 0x24ae, +/* 11ba - */ 0, +/* 11bb - */ 0, +/* 11bc - */ 0, +/* 11bd - _V_66_0F_38_39 */ 0x410a, +/* 11be - */ 0, +/* 11bf - */ 0, +/* 11c0 - */ 0, +/* 11c1 - */ 0, +/* 11c2 - */ 0, +/* 11c3 - */ 0, +/* 11c4 - */ 0, +/* 11c5 - _66_0F_38_3A */ 0x24af, +/* 11c6 - */ 0, +/* 11c7 - */ 0, +/* 11c8 - */ 0, +/* 11c9 - _V_66_0F_38_3A */ 0x410b, +/* 11ca - */ 0, +/* 11cb - */ 0, +/* 11cc - */ 0, +/* 11cd - */ 0, +/* 11ce - */ 0, +/* 11cf - */ 0, +/* 11d0 - */ 0, +/* 11d1 - _66_0F_38_3B */ 0x24b0, +/* 11d2 - */ 0, +/* 11d3 - */ 0, +/* 11d4 - */ 0, +/* 11d5 - _V_66_0F_38_3B */ 0x410c, +/* 11d6 - */ 0, +/* 11d7 - */ 0, +/* 11d8 - */ 0, +/* 11d9 - */ 0, +/* 11da - */ 0, +/* 11db - */ 0, +/* 11dc - */ 0, +/* 11dd - _66_0F_38_3C */ 0x24b1, +/* 11de - */ 0, +/* 11df - */ 0, +/* 11e0 - */ 0, +/* 11e1 - _V_66_0F_38_3C */ 0x410d, +/* 11e2 - */ 0, +/* 11e3 - */ 0, +/* 11e4 - */ 0, +/* 11e5 - */ 0, +/* 11e6 - */ 0, +/* 11e7 - */ 0, +/* 11e8 - */ 0, +/* 11e9 - _66_0F_38_3D */ 0x24b2, +/* 11ea - */ 0, +/* 11eb - */ 0, +/* 11ec - */ 0, +/* 11ed - _V_66_0F_38_3D */ 0x410e, +/* 11ee - */ 0, +/* 11ef - */ 0, +/* 11f0 - */ 0, +/* 11f1 - */ 0, +/* 11f2 - */ 0, +/* 11f3 - */ 0, +/* 11f4 - */ 0, +/* 11f5 - _66_0F_38_3E */ 0x24b3, +/* 11f6 - */ 0, +/* 11f7 - */ 0, +/* 11f8 - */ 0, +/* 11f9 - _V_66_0F_38_3E */ 0x410f, +/* 11fa - */ 0, +/* 11fb - */ 0, +/* 11fc - */ 0, +/* 11fd - */ 0, +/* 11fe - */ 0, +/* 11ff - */ 0, +/* 1200 - */ 0, +/* 1201 - _66_0F_38_3F */ 0x24b4, +/* 1202 - */ 0, +/* 1203 - */ 0, +/* 1204 - */ 0, +/* 1205 - _V_66_0F_38_3F */ 0x4110, +/* 1206 - */ 0, +/* 1207 - */ 0, +/* 1208 - */ 0, +/* 1209 - */ 0, +/* 120a - */ 0, +/* 120b - */ 0, +/* 120c - */ 0, +/* 120d - _66_0F_38_40 */ 0x24b5, +/* 120e - */ 0, +/* 120f - */ 0, +/* 1210 - */ 0, +/* 1211 - _V_66_0F_38_40 */ 0x4111, +/* 1212 - */ 0, +/* 1213 - */ 0, +/* 1214 - */ 0, +/* 1215 - */ 0, +/* 1216 - */ 0, +/* 1217 - */ 0, +/* 1218 - */ 0, +/* 1219 - _66_0F_38_41 */ 0x24b6, +/* 121a - */ 0, +/* 121b - */ 0, +/* 121c - */ 0, +/* 121d - _V_66_0F_38_41 */ 0x4112, +/* 121e - */ 0, +/* 121f - */ 0, +/* 1220 - */ 0, +/* 1221 - */ 0, +/* 1222 - */ 0, +/* 1223 - */ 0, +/* 1224 - */ 0, +/* 1225 - _66_0F_38_80 */ 0x24b7, +/* 1226 - */ 0, +/* 1227 - */ 0, +/* 1228 - */ 0, +/* 1229 - */ 0, +/* 122a - */ 0, +/* 122b - */ 0, +/* 122c - */ 0, +/* 122d - */ 0, +/* 122e - */ 0, +/* 122f - */ 0, +/* 1230 - */ 0, +/* 1231 - _66_0F_38_81 */ 0x24b8, +/* 1232 - */ 0, +/* 1233 - */ 0, +/* 1234 - */ 0, +/* 1235 - */ 0, +/* 1236 - */ 0, +/* 1237 - */ 0, +/* 1238 - */ 0, +/* 1239 - */ 0, +/* 123a - */ 0, +/* 123b - */ 0, +/* 123c - */ 0, +/* 123d - _66_0F_38_82 */ 0x24b9, +/* 123e - */ 0, +/* 123f - */ 0, +/* 1240 - */ 0, +/* 1241 - */ 0, +/* 1242 - */ 0, +/* 1243 - */ 0, +/* 1244 - */ 0, +/* 1245 - */ 0, +/* 1246 - */ 0, +/* 1247 - */ 0, +/* 1248 - */ 0, +/* 1249 - */ 0, +/* 124a - */ 0, +/* 124b - */ 0, +/* 124c - */ 0, +/* 124d - _V_66_0F_38_96 */ 0x4113, +/* 124e - */ 0, +/* 124f - */ 0, +/* 1250 - */ 0, +/* 1251 - */ 0, +/* 1252 - */ 0, +/* 1253 - */ 0, +/* 1254 - */ 0, +/* 1255 - */ 0, +/* 1256 - */ 0, +/* 1257 - */ 0, +/* 1258 - */ 0, +/* 1259 - _V_66_0F_38_97 */ 0x4114, +/* 125a - */ 0, +/* 125b - */ 0, +/* 125c - */ 0, +/* 125d - */ 0, +/* 125e - */ 0, +/* 125f - */ 0, +/* 1260 - */ 0, +/* 1261 - */ 0, +/* 1262 - */ 0, +/* 1263 - */ 0, +/* 1264 - */ 0, +/* 1265 - _V_66_0F_38_98 */ 0x4115, +/* 1266 - */ 0, +/* 1267 - */ 0, +/* 1268 - */ 0, +/* 1269 - */ 0, +/* 126a - */ 0, +/* 126b - */ 0, +/* 126c - */ 0, +/* 126d - */ 0, +/* 126e - */ 0, +/* 126f - */ 0, +/* 1270 - */ 0, +/* 1271 - _V_66_0F_38_99 */ 0x4116, +/* 1272 - */ 0, +/* 1273 - */ 0, +/* 1274 - */ 0, +/* 1275 - */ 0, +/* 1276 - */ 0, +/* 1277 - */ 0, +/* 1278 - */ 0, +/* 1279 - */ 0, +/* 127a - */ 0, +/* 127b - */ 0, +/* 127c - */ 0, +/* 127d - _V_66_0F_38_9A */ 0x4117, +/* 127e - */ 0, +/* 127f - */ 0, +/* 1280 - */ 0, +/* 1281 - */ 0, +/* 1282 - */ 0, +/* 1283 - */ 0, +/* 1284 - */ 0, +/* 1285 - */ 0, +/* 1286 - */ 0, +/* 1287 - */ 0, +/* 1288 - */ 0, +/* 1289 - _V_66_0F_38_9B */ 0x4118, +/* 128a - */ 0, +/* 128b - */ 0, +/* 128c - */ 0, +/* 128d - */ 0, +/* 128e - */ 0, +/* 128f - */ 0, +/* 1290 - */ 0, +/* 1291 - */ 0, +/* 1292 - */ 0, +/* 1293 - */ 0, +/* 1294 - */ 0, +/* 1295 - _V_66_0F_38_9C */ 0x4119, +/* 1296 - */ 0, +/* 1297 - */ 0, +/* 1298 - */ 0, +/* 1299 - */ 0, +/* 129a - */ 0, +/* 129b - */ 0, +/* 129c - */ 0, +/* 129d - */ 0, +/* 129e - */ 0, +/* 129f - */ 0, +/* 12a0 - */ 0, +/* 12a1 - _V_66_0F_38_9D */ 0x411a, +/* 12a2 - */ 0, +/* 12a3 - */ 0, +/* 12a4 - */ 0, +/* 12a5 - */ 0, +/* 12a6 - */ 0, +/* 12a7 - */ 0, +/* 12a8 - */ 0, +/* 12a9 - */ 0, +/* 12aa - */ 0, +/* 12ab - */ 0, +/* 12ac - */ 0, +/* 12ad - _V_66_0F_38_9E */ 0x411b, +/* 12ae - */ 0, +/* 12af - */ 0, +/* 12b0 - */ 0, +/* 12b1 - */ 0, +/* 12b2 - */ 0, +/* 12b3 - */ 0, +/* 12b4 - */ 0, +/* 12b5 - */ 0, +/* 12b6 - */ 0, +/* 12b7 - */ 0, +/* 12b8 - */ 0, +/* 12b9 - _V_66_0F_38_9F */ 0x411c, +/* 12ba - */ 0, +/* 12bb - */ 0, +/* 12bc - */ 0, +/* 12bd - */ 0, +/* 12be - */ 0, +/* 12bf - */ 0, +/* 12c0 - */ 0, +/* 12c1 - */ 0, +/* 12c2 - */ 0, +/* 12c3 - */ 0, +/* 12c4 - */ 0, +/* 12c5 - _V_66_0F_38_A6 */ 0x411d, +/* 12c6 - */ 0, +/* 12c7 - */ 0, +/* 12c8 - */ 0, +/* 12c9 - */ 0, +/* 12ca - */ 0, +/* 12cb - */ 0, +/* 12cc - */ 0, +/* 12cd - */ 0, +/* 12ce - */ 0, +/* 12cf - */ 0, +/* 12d0 - */ 0, +/* 12d1 - _V_66_0F_38_A7 */ 0x411e, +/* 12d2 - */ 0, +/* 12d3 - */ 0, +/* 12d4 - */ 0, +/* 12d5 - */ 0, +/* 12d6 - */ 0, +/* 12d7 - */ 0, +/* 12d8 - */ 0, +/* 12d9 - */ 0, +/* 12da - */ 0, +/* 12db - */ 0, +/* 12dc - */ 0, +/* 12dd - _V_66_0F_38_A8 */ 0x411f, +/* 12de - */ 0, +/* 12df - */ 0, +/* 12e0 - */ 0, +/* 12e1 - */ 0, +/* 12e2 - */ 0, +/* 12e3 - */ 0, +/* 12e4 - */ 0, +/* 12e5 - */ 0, +/* 12e6 - */ 0, +/* 12e7 - */ 0, +/* 12e8 - */ 0, +/* 12e9 - _V_66_0F_38_A9 */ 0x4120, +/* 12ea - */ 0, +/* 12eb - */ 0, +/* 12ec - */ 0, +/* 12ed - */ 0, +/* 12ee - */ 0, +/* 12ef - */ 0, +/* 12f0 - */ 0, +/* 12f1 - */ 0, +/* 12f2 - */ 0, +/* 12f3 - */ 0, +/* 12f4 - */ 0, +/* 12f5 - _V_66_0F_38_AA */ 0x4121, +/* 12f6 - */ 0, +/* 12f7 - */ 0, +/* 12f8 - */ 0, +/* 12f9 - */ 0, +/* 12fa - */ 0, +/* 12fb - */ 0, +/* 12fc - */ 0, +/* 12fd - */ 0, +/* 12fe - */ 0, +/* 12ff - */ 0, +/* 1300 - */ 0, +/* 1301 - _V_66_0F_38_AB */ 0x4122, +/* 1302 - */ 0, +/* 1303 - */ 0, +/* 1304 - */ 0, +/* 1305 - */ 0, +/* 1306 - */ 0, +/* 1307 - */ 0, +/* 1308 - */ 0, +/* 1309 - */ 0, +/* 130a - */ 0, +/* 130b - */ 0, +/* 130c - */ 0, +/* 130d - _V_66_0F_38_AC */ 0x4123, +/* 130e - */ 0, +/* 130f - */ 0, +/* 1310 - */ 0, +/* 1311 - */ 0, +/* 1312 - */ 0, +/* 1313 - */ 0, +/* 1314 - */ 0, +/* 1315 - */ 0, +/* 1316 - */ 0, +/* 1317 - */ 0, +/* 1318 - */ 0, +/* 1319 - _V_66_0F_38_AD */ 0x4124, +/* 131a - */ 0, +/* 131b - */ 0, +/* 131c - */ 0, +/* 131d - */ 0, +/* 131e - */ 0, +/* 131f - */ 0, +/* 1320 - */ 0, +/* 1321 - */ 0, +/* 1322 - */ 0, +/* 1323 - */ 0, +/* 1324 - */ 0, +/* 1325 - _V_66_0F_38_AE */ 0x4125, +/* 1326 - */ 0, +/* 1327 - */ 0, +/* 1328 - */ 0, +/* 1329 - */ 0, +/* 132a - */ 0, +/* 132b - */ 0, +/* 132c - */ 0, +/* 132d - */ 0, +/* 132e - */ 0, +/* 132f - */ 0, +/* 1330 - */ 0, +/* 1331 - _V_66_0F_38_AF */ 0x4126, +/* 1332 - */ 0, +/* 1333 - */ 0, +/* 1334 - */ 0, +/* 1335 - */ 0, +/* 1336 - */ 0, +/* 1337 - */ 0, +/* 1338 - */ 0, +/* 1339 - */ 0, +/* 133a - */ 0, +/* 133b - */ 0, +/* 133c - */ 0, +/* 133d - _V_66_0F_38_B6 */ 0x4127, +/* 133e - */ 0, +/* 133f - */ 0, +/* 1340 - */ 0, +/* 1341 - */ 0, +/* 1342 - */ 0, +/* 1343 - */ 0, +/* 1344 - */ 0, +/* 1345 - */ 0, +/* 1346 - */ 0, +/* 1347 - */ 0, +/* 1348 - */ 0, +/* 1349 - _V_66_0F_38_B7 */ 0x4128, +/* 134a - */ 0, +/* 134b - */ 0, +/* 134c - */ 0, +/* 134d - */ 0, +/* 134e - */ 0, +/* 134f - */ 0, +/* 1350 - */ 0, +/* 1351 - */ 0, +/* 1352 - */ 0, +/* 1353 - */ 0, +/* 1354 - */ 0, +/* 1355 - _V_66_0F_38_B8 */ 0x4129, +/* 1356 - */ 0, +/* 1357 - */ 0, +/* 1358 - */ 0, +/* 1359 - */ 0, +/* 135a - */ 0, +/* 135b - */ 0, +/* 135c - */ 0, +/* 135d - */ 0, +/* 135e - */ 0, +/* 135f - */ 0, +/* 1360 - */ 0, +/* 1361 - _V_66_0F_38_B9 */ 0x412a, +/* 1362 - */ 0, +/* 1363 - */ 0, +/* 1364 - */ 0, +/* 1365 - */ 0, +/* 1366 - */ 0, +/* 1367 - */ 0, +/* 1368 - */ 0, +/* 1369 - */ 0, +/* 136a - */ 0, +/* 136b - */ 0, +/* 136c - */ 0, +/* 136d - _V_66_0F_38_BA */ 0x412b, +/* 136e - */ 0, +/* 136f - */ 0, +/* 1370 - */ 0, +/* 1371 - */ 0, +/* 1372 - */ 0, +/* 1373 - */ 0, +/* 1374 - */ 0, +/* 1375 - */ 0, +/* 1376 - */ 0, +/* 1377 - */ 0, +/* 1378 - */ 0, +/* 1379 - _V_66_0F_38_BB */ 0x412c, +/* 137a - */ 0, +/* 137b - */ 0, +/* 137c - */ 0, +/* 137d - */ 0, +/* 137e - */ 0, +/* 137f - */ 0, +/* 1380 - */ 0, +/* 1381 - */ 0, +/* 1382 - */ 0, +/* 1383 - */ 0, +/* 1384 - */ 0, +/* 1385 - _V_66_0F_38_BC */ 0x412d, +/* 1386 - */ 0, +/* 1387 - */ 0, +/* 1388 - */ 0, +/* 1389 - */ 0, +/* 138a - */ 0, +/* 138b - */ 0, +/* 138c - */ 0, +/* 138d - */ 0, +/* 138e - */ 0, +/* 138f - */ 0, +/* 1390 - */ 0, +/* 1391 - _V_66_0F_38_BD */ 0x412e, +/* 1392 - */ 0, +/* 1393 - */ 0, +/* 1394 - */ 0, +/* 1395 - */ 0, +/* 1396 - */ 0, +/* 1397 - */ 0, +/* 1398 - */ 0, +/* 1399 - */ 0, +/* 139a - */ 0, +/* 139b - */ 0, +/* 139c - */ 0, +/* 139d - _V_66_0F_38_BE */ 0x412f, +/* 139e - */ 0, +/* 139f - */ 0, +/* 13a0 - */ 0, +/* 13a1 - */ 0, +/* 13a2 - */ 0, +/* 13a3 - */ 0, +/* 13a4 - */ 0, +/* 13a5 - */ 0, +/* 13a6 - */ 0, +/* 13a7 - */ 0, +/* 13a8 - */ 0, +/* 13a9 - _V_66_0F_38_BF */ 0x4130, +/* 13aa - */ 0, +/* 13ab - */ 0, +/* 13ac - */ 0, +/* 13ad - */ 0, +/* 13ae - */ 0, +/* 13af - */ 0, +/* 13b0 - */ 0, +/* 13b1 - _66_0F_38_DB */ 0x24ba, +/* 13b2 - */ 0, +/* 13b3 - */ 0, +/* 13b4 - */ 0, +/* 13b5 - _V_66_0F_38_DB */ 0x4131, +/* 13b6 - */ 0, +/* 13b7 - */ 0, +/* 13b8 - */ 0, +/* 13b9 - */ 0, +/* 13ba - */ 0, +/* 13bb - */ 0, +/* 13bc - */ 0, +/* 13bd - _66_0F_38_DC */ 0x24bb, +/* 13be - */ 0, +/* 13bf - */ 0, +/* 13c0 - */ 0, +/* 13c1 - _V_66_0F_38_DC */ 0x4132, +/* 13c2 - */ 0, +/* 13c3 - */ 0, +/* 13c4 - */ 0, +/* 13c5 - */ 0, +/* 13c6 - */ 0, +/* 13c7 - */ 0, +/* 13c8 - */ 0, +/* 13c9 - _66_0F_38_DD */ 0x24bc, +/* 13ca - */ 0, +/* 13cb - */ 0, +/* 13cc - */ 0, +/* 13cd - _V_66_0F_38_DD */ 0x4133, +/* 13ce - */ 0, +/* 13cf - */ 0, +/* 13d0 - */ 0, +/* 13d1 - */ 0, +/* 13d2 - */ 0, +/* 13d3 - */ 0, +/* 13d4 - */ 0, +/* 13d5 - _66_0F_38_DE */ 0x24bd, +/* 13d6 - */ 0, +/* 13d7 - */ 0, +/* 13d8 - */ 0, +/* 13d9 - _V_66_0F_38_DE */ 0x4134, +/* 13da - */ 0, +/* 13db - */ 0, +/* 13dc - */ 0, +/* 13dd - */ 0, +/* 13de - */ 0, +/* 13df - */ 0, +/* 13e0 - */ 0, +/* 13e1 - _66_0F_38_DF */ 0x24be, +/* 13e2 - */ 0, +/* 13e3 - */ 0, +/* 13e4 - */ 0, +/* 13e5 - _V_66_0F_38_DF */ 0x4135, +/* 13e6 - */ 0, +/* 13e7 - */ 0, +/* 13e8 - */ 0, +/* 13e9 - */ 0, +/* 13ea - */ 0, +/* 13eb - */ 0, +/* 13ec - _0F_38_F0 */ 0x24bf, +/* 13ed - */ 0, +/* 13ee - */ 0, +/* 13ef - _F2_0F_38_F0 */ 0x24c0, +/* 13f0 - */ 0, +/* 13f1 - */ 0, +/* 13f2 - */ 0, +/* 13f3 - */ 0, +/* 13f4 - */ 0, +/* 13f5 - */ 0, +/* 13f6 - */ 0, +/* 13f7 - */ 0, +/* 13f8 - _0F_38_F1 */ 0x24c1, +/* 13f9 - */ 0, +/* 13fa - */ 0, +/* 13fb - _F2_0F_38_F1 */ 0x24c2, +/* 13fc - */ 0, +/* 13fd - */ 0, +/* 13fe - */ 0, +/* 13ff - */ 0, +/* 1400 - */ 0, +/* 1401 - */ 0, +/* 1402 - */ 0, +/* 1403 - */ 0, +/* 1404 - */ 0, +/* 1405 - */ 0, +/* 1406 - */ 0, +/* 1407 - */ 0, +/* 1408 - */ 0, +/* 1409 - _V_66_0F_3A_04 */ 0x4136, +/* 140a - */ 0, +/* 140b - */ 0, +/* 140c - */ 0, +/* 140d - */ 0, +/* 140e - */ 0, +/* 140f - */ 0, +/* 1410 - */ 0, +/* 1411 - */ 0, +/* 1412 - */ 0, +/* 1413 - */ 0, +/* 1414 - */ 0, +/* 1415 - _V_66_0F_3A_05 */ 0x4137, +/* 1416 - */ 0, +/* 1417 - */ 0, +/* 1418 - */ 0, +/* 1419 - */ 0, +/* 141a - */ 0, +/* 141b - */ 0, +/* 141c - */ 0, +/* 141d - */ 0, +/* 141e - */ 0, +/* 141f - */ 0, +/* 1420 - */ 0, +/* 1421 - _V_66_0F_3A_06 */ 0x4138, +/* 1422 - */ 0, +/* 1423 - */ 0, +/* 1424 - */ 0, +/* 1425 - */ 0, +/* 1426 - */ 0, +/* 1427 - */ 0, +/* 1428 - */ 0, +/* 1429 - _66_0F_3A_08 */ 0x4139, +/* 142a - */ 0, +/* 142b - */ 0, +/* 142c - */ 0, +/* 142d - _V_66_0F_3A_08 */ 0x413a, +/* 142e - */ 0, +/* 142f - */ 0, +/* 1430 - */ 0, +/* 1431 - */ 0, +/* 1432 - */ 0, +/* 1433 - */ 0, +/* 1434 - */ 0, +/* 1435 - _66_0F_3A_09 */ 0x413b, +/* 1436 - */ 0, +/* 1437 - */ 0, +/* 1438 - */ 0, +/* 1439 - _V_66_0F_3A_09 */ 0x413c, +/* 143a - */ 0, +/* 143b - */ 0, +/* 143c - */ 0, +/* 143d - */ 0, +/* 143e - */ 0, +/* 143f - */ 0, +/* 1440 - */ 0, +/* 1441 - _66_0F_3A_0A */ 0x413d, +/* 1442 - */ 0, +/* 1443 - */ 0, +/* 1444 - */ 0, +/* 1445 - _V_66_0F_3A_0A */ 0x413e, +/* 1446 - */ 0, +/* 1447 - */ 0, +/* 1448 - */ 0, +/* 1449 - */ 0, +/* 144a - */ 0, +/* 144b - */ 0, +/* 144c - */ 0, +/* 144d - _66_0F_3A_0B */ 0x413f, +/* 144e - */ 0, +/* 144f - */ 0, +/* 1450 - */ 0, +/* 1451 - _V_66_0F_3A_0B */ 0x4140, +/* 1452 - */ 0, +/* 1453 - */ 0, +/* 1454 - */ 0, +/* 1455 - */ 0, +/* 1456 - */ 0, +/* 1457 - */ 0, +/* 1458 - */ 0, +/* 1459 - _66_0F_3A_0C */ 0x4141, +/* 145a - */ 0, +/* 145b - */ 0, +/* 145c - */ 0, +/* 145d - _V_66_0F_3A_0C */ 0x4142, +/* 145e - */ 0, +/* 145f - */ 0, +/* 1460 - */ 0, +/* 1461 - */ 0, +/* 1462 - */ 0, +/* 1463 - */ 0, +/* 1464 - */ 0, +/* 1465 - _66_0F_3A_0D */ 0x4143, +/* 1466 - */ 0, +/* 1467 - */ 0, +/* 1468 - */ 0, +/* 1469 - _V_66_0F_3A_0D */ 0x4144, +/* 146a - */ 0, +/* 146b - */ 0, +/* 146c - */ 0, +/* 146d - */ 0, +/* 146e - */ 0, +/* 146f - */ 0, +/* 1470 - */ 0, +/* 1471 - _66_0F_3A_0E */ 0x4145, +/* 1472 - */ 0, +/* 1473 - */ 0, +/* 1474 - */ 0, +/* 1475 - _V_66_0F_3A_0E */ 0x4146, +/* 1476 - */ 0, +/* 1477 - */ 0, +/* 1478 - */ 0, +/* 1479 - */ 0, +/* 147a - */ 0, +/* 147b - */ 0, +/* 147c - _0F_3A_0F */ 0x4147, +/* 147d - _66_0F_3A_0F */ 0x4148, +/* 147e - */ 0, +/* 147f - */ 0, +/* 1480 - */ 0, +/* 1481 - _V_66_0F_3A_0F */ 0x4149, +/* 1482 - */ 0, +/* 1483 - */ 0, +/* 1484 - */ 0, +/* 1485 - */ 0, +/* 1486 - */ 0, +/* 1487 - */ 0, +/* 1488 - */ 0, +/* 1489 - _66_0F_3A_14 */ 0x414a, +/* 148a - */ 0, +/* 148b - */ 0, +/* 148c - */ 0, +/* 148d - _V_66_0F_3A_14 */ 0x414b, +/* 148e - */ 0, +/* 148f - */ 0, +/* 1490 - */ 0, +/* 1491 - */ 0, +/* 1492 - */ 0, +/* 1493 - */ 0, +/* 1494 - */ 0, +/* 1495 - _66_0F_3A_15 */ 0x414c, +/* 1496 - */ 0, +/* 1497 - */ 0, +/* 1498 - */ 0, +/* 1499 - _V_66_0F_3A_15 */ 0x414d, +/* 149a - */ 0, +/* 149b - */ 0, +/* 149c - */ 0, +/* 149d - */ 0, +/* 149e - */ 0, +/* 149f - */ 0, +/* 14a0 - */ 0, +/* 14a1 - _66_0F_3A_16 */ 0x414e, +/* 14a2 - */ 0, +/* 14a3 - */ 0, +/* 14a4 - */ 0, +/* 14a5 - _V_66_0F_3A_16 */ 0x414f, +/* 14a6 - */ 0, +/* 14a7 - */ 0, +/* 14a8 - */ 0, +/* 14a9 - */ 0, +/* 14aa - */ 0, +/* 14ab - */ 0, +/* 14ac - */ 0, +/* 14ad - _66_0F_3A_17 */ 0x4150, +/* 14ae - */ 0, +/* 14af - */ 0, +/* 14b0 - */ 0, +/* 14b1 - _V_66_0F_3A_17 */ 0x4151, +/* 14b2 - */ 0, +/* 14b3 - */ 0, +/* 14b4 - */ 0, +/* 14b5 - */ 0, +/* 14b6 - */ 0, +/* 14b7 - */ 0, +/* 14b8 - */ 0, +/* 14b9 - */ 0, +/* 14ba - */ 0, +/* 14bb - */ 0, +/* 14bc - */ 0, +/* 14bd - _V_66_0F_3A_18 */ 0x4152, +/* 14be - */ 0, +/* 14bf - */ 0, +/* 14c0 - */ 0, +/* 14c1 - */ 0, +/* 14c2 - */ 0, +/* 14c3 - */ 0, +/* 14c4 - */ 0, +/* 14c5 - */ 0, +/* 14c6 - */ 0, +/* 14c7 - */ 0, +/* 14c8 - */ 0, +/* 14c9 - _V_66_0F_3A_19 */ 0x4153, +/* 14ca - */ 0, +/* 14cb - */ 0, +/* 14cc - */ 0, +/* 14cd - */ 0, +/* 14ce - */ 0, +/* 14cf - */ 0, +/* 14d0 - */ 0, +/* 14d1 - _66_0F_3A_20 */ 0x4154, +/* 14d2 - */ 0, +/* 14d3 - */ 0, +/* 14d4 - */ 0, +/* 14d5 - _V_66_0F_3A_20 */ 0x4155, +/* 14d6 - */ 0, +/* 14d7 - */ 0, +/* 14d8 - */ 0, +/* 14d9 - */ 0, +/* 14da - */ 0, +/* 14db - */ 0, +/* 14dc - */ 0, +/* 14dd - _66_0F_3A_21 */ 0x4156, +/* 14de - */ 0, +/* 14df - */ 0, +/* 14e0 - */ 0, +/* 14e1 - _V_66_0F_3A_21 */ 0x4157, +/* 14e2 - */ 0, +/* 14e3 - */ 0, +/* 14e4 - */ 0, +/* 14e5 - */ 0, +/* 14e6 - */ 0, +/* 14e7 - */ 0, +/* 14e8 - */ 0, +/* 14e9 - _66_0F_3A_22 */ 0x4158, +/* 14ea - */ 0, +/* 14eb - */ 0, +/* 14ec - */ 0, +/* 14ed - _V_66_0F_3A_22 */ 0x4159, +/* 14ee - */ 0, +/* 14ef - */ 0, +/* 14f0 - */ 0, +/* 14f1 - */ 0, +/* 14f2 - */ 0, +/* 14f3 - */ 0, +/* 14f4 - */ 0, +/* 14f5 - _66_0F_3A_40 */ 0x415a, +/* 14f6 - */ 0, +/* 14f7 - */ 0, +/* 14f8 - */ 0, +/* 14f9 - _V_66_0F_3A_40 */ 0x415b, +/* 14fa - */ 0, +/* 14fb - */ 0, +/* 14fc - */ 0, +/* 14fd - */ 0, +/* 14fe - */ 0, +/* 14ff - */ 0, +/* 1500 - */ 0, +/* 1501 - _66_0F_3A_41 */ 0x415c, +/* 1502 - */ 0, +/* 1503 - */ 0, +/* 1504 - */ 0, +/* 1505 - _V_66_0F_3A_41 */ 0x415d, +/* 1506 - */ 0, +/* 1507 - */ 0, +/* 1508 - */ 0, +/* 1509 - */ 0, +/* 150a - */ 0, +/* 150b - */ 0, +/* 150c - */ 0, +/* 150d - _66_0F_3A_42 */ 0x415e, +/* 150e - */ 0, +/* 150f - */ 0, +/* 1510 - */ 0, +/* 1511 - _V_66_0F_3A_42 */ 0x415f, +/* 1512 - */ 0, +/* 1513 - */ 0, +/* 1514 - */ 0, +/* 1515 - */ 0, +/* 1516 - */ 0, +/* 1517 - */ 0, +/* 1518 - */ 0, +/* 1519 - _66_0F_3A_44 */ 0x4160, +/* 151a - */ 0, +/* 151b - */ 0, +/* 151c - */ 0, +/* 151d - _V_66_0F_3A_44 */ 0x4161, +/* 151e - */ 0, +/* 151f - */ 0, +/* 1520 - */ 0, +/* 1521 - */ 0, +/* 1522 - */ 0, +/* 1523 - */ 0, +/* 1524 - */ 0, +/* 1525 - */ 0, +/* 1526 - */ 0, +/* 1527 - */ 0, +/* 1528 - */ 0, +/* 1529 - _V_66_0F_3A_4A */ 0x4162, +/* 152a - */ 0, +/* 152b - */ 0, +/* 152c - */ 0, +/* 152d - */ 0, +/* 152e - */ 0, +/* 152f - */ 0, +/* 1530 - */ 0, +/* 1531 - */ 0, +/* 1532 - */ 0, +/* 1533 - */ 0, +/* 1534 - */ 0, +/* 1535 - _V_66_0F_3A_4B */ 0x4163, +/* 1536 - */ 0, +/* 1537 - */ 0, +/* 1538 - */ 0, +/* 1539 - */ 0, +/* 153a - */ 0, +/* 153b - */ 0, +/* 153c - */ 0, +/* 153d - */ 0, +/* 153e - */ 0, +/* 153f - */ 0, +/* 1540 - */ 0, +/* 1541 - _V_66_0F_3A_4C */ 0x4164, +/* 1542 - */ 0, +/* 1543 - */ 0, +/* 1544 - */ 0, +/* 1545 - */ 0, +/* 1546 - */ 0, +/* 1547 - */ 0, +/* 1548 - */ 0, +/* 1549 - _66_0F_3A_60 */ 0x4165, +/* 154a - */ 0, +/* 154b - */ 0, +/* 154c - */ 0, +/* 154d - _V_66_0F_3A_60 */ 0x4166, +/* 154e - */ 0, +/* 154f - */ 0, +/* 1550 - */ 0, +/* 1551 - */ 0, +/* 1552 - */ 0, +/* 1553 - */ 0, +/* 1554 - */ 0, +/* 1555 - _66_0F_3A_61 */ 0x4167, +/* 1556 - */ 0, +/* 1557 - */ 0, +/* 1558 - */ 0, +/* 1559 - _V_66_0F_3A_61 */ 0x4168, +/* 155a - */ 0, +/* 155b - */ 0, +/* 155c - */ 0, +/* 155d - */ 0, +/* 155e - */ 0, +/* 155f - */ 0, +/* 1560 - */ 0, +/* 1561 - _66_0F_3A_62 */ 0x4169, +/* 1562 - */ 0, +/* 1563 - */ 0, +/* 1564 - */ 0, +/* 1565 - _V_66_0F_3A_62 */ 0x416a, +/* 1566 - */ 0, +/* 1567 - */ 0, +/* 1568 - */ 0, +/* 1569 - */ 0, +/* 156a - */ 0, +/* 156b - */ 0, +/* 156c - */ 0, +/* 156d - _66_0F_3A_63 */ 0x416b, +/* 156e - */ 0, +/* 156f - */ 0, +/* 1570 - */ 0, +/* 1571 - _V_66_0F_3A_63 */ 0x416c, +/* 1572 - */ 0, +/* 1573 - */ 0, +/* 1574 - */ 0, +/* 1575 - */ 0, +/* 1576 - */ 0, +/* 1577 - */ 0, +/* 1578 - */ 0, +/* 1579 - _66_0F_3A_DF */ 0x416d, +/* 157a - */ 0, +/* 157b - */ 0, +/* 157c - */ 0, +/* 157d - _V_66_0F_3A_DF */ 0x416e, +/* 157e - */ 0, +/* 157f - */ 0, +/* 1580 - */ 0, +/* 1581 - */ 0, +/* 1582 - */ 0, +/* 1583 - */ 0, +/* 1584 - _0F_71_02 */ 0x24c3, +/* 1585 - _66_0F_71_02 */ 0x24c4, +/* 1586 - */ 0, +/* 1587 - */ 0, +/* 1588 - */ 0, +/* 1589 - _V_66_0F_71_02 */ 0x416f, +/* 158a - */ 0, +/* 158b - */ 0, +/* 158c - */ 0, +/* 158d - */ 0, +/* 158e - */ 0, +/* 158f - */ 0, +/* 1590 - _0F_71_04 */ 0x24c5, +/* 1591 - _66_0F_71_04 */ 0x24c6, +/* 1592 - */ 0, +/* 1593 - */ 0, +/* 1594 - */ 0, +/* 1595 - _V_66_0F_71_04 */ 0x4170, +/* 1596 - */ 0, +/* 1597 - */ 0, +/* 1598 - */ 0, +/* 1599 - */ 0, +/* 159a - */ 0, +/* 159b - */ 0, +/* 159c - _0F_71_06 */ 0x24c7, +/* 159d - _66_0F_71_06 */ 0x24c8, +/* 159e - */ 0, +/* 159f - */ 0, +/* 15a0 - */ 0, +/* 15a1 - _V_66_0F_71_06 */ 0x4171, +/* 15a2 - */ 0, +/* 15a3 - */ 0, +/* 15a4 - */ 0, +/* 15a5 - */ 0, +/* 15a6 - */ 0, +/* 15a7 - */ 0, +/* 15a8 - _0F_72_02 */ 0x24c9, +/* 15a9 - _66_0F_72_02 */ 0x24ca, +/* 15aa - */ 0, +/* 15ab - */ 0, +/* 15ac - */ 0, +/* 15ad - _V_66_0F_72_02 */ 0x4172, +/* 15ae - */ 0, +/* 15af - */ 0, +/* 15b0 - */ 0, +/* 15b1 - */ 0, +/* 15b2 - */ 0, +/* 15b3 - */ 0, +/* 15b4 - _0F_72_04 */ 0x24cb, +/* 15b5 - _66_0F_72_04 */ 0x24cc, +/* 15b6 - */ 0, +/* 15b7 - */ 0, +/* 15b8 - */ 0, +/* 15b9 - _V_66_0F_72_04 */ 0x4173, +/* 15ba - */ 0, +/* 15bb - */ 0, +/* 15bc - */ 0, +/* 15bd - */ 0, +/* 15be - */ 0, +/* 15bf - */ 0, +/* 15c0 - _0F_72_06 */ 0x24cd, +/* 15c1 - _66_0F_72_06 */ 0x24ce, +/* 15c2 - */ 0, +/* 15c3 - */ 0, +/* 15c4 - */ 0, +/* 15c5 - _V_66_0F_72_06 */ 0x4174, +/* 15c6 - */ 0, +/* 15c7 - */ 0, +/* 15c8 - */ 0, +/* 15c9 - */ 0, +/* 15ca - */ 0, +/* 15cb - */ 0, +/* 15cc - _0F_73_02 */ 0x24cf, +/* 15cd - _66_0F_73_02 */ 0x24d0, +/* 15ce - */ 0, +/* 15cf - */ 0, +/* 15d0 - */ 0, +/* 15d1 - _V_66_0F_73_02 */ 0x4175, +/* 15d2 - */ 0, +/* 15d3 - */ 0, +/* 15d4 - */ 0, +/* 15d5 - */ 0, +/* 15d6 - */ 0, +/* 15d7 - */ 0, +/* 15d8 - */ 0, +/* 15d9 - _66_0F_73_03 */ 0x24d1, +/* 15da - */ 0, +/* 15db - */ 0, +/* 15dc - */ 0, +/* 15dd - _V_66_0F_73_03 */ 0x4176, +/* 15de - */ 0, +/* 15df - */ 0, +/* 15e0 - */ 0, +/* 15e1 - */ 0, +/* 15e2 - */ 0, +/* 15e3 - */ 0, +/* 15e4 - _0F_73_06 */ 0x24d2, +/* 15e5 - _66_0F_73_06 */ 0x24d3, +/* 15e6 - */ 0, +/* 15e7 - */ 0, +/* 15e8 - */ 0, +/* 15e9 - _V_66_0F_73_06 */ 0x4177, +/* 15ea - */ 0, +/* 15eb - */ 0, +/* 15ec - */ 0, +/* 15ed - */ 0, +/* 15ee - */ 0, +/* 15ef - */ 0, +/* 15f0 - */ 0, +/* 15f1 - _66_0F_73_07 */ 0x24d4, +/* 15f2 - */ 0, +/* 15f3 - */ 0, +/* 15f4 - */ 0, +/* 15f5 - _V_66_0F_73_07 */ 0x4178, +/* 15f6 - */ 0, +/* 15f7 - */ 0, +/* 15f8 - */ 0, +/* 15f9 - */ 0, +/* 15fa - */ 0, +/* 15fb - */ 0, +/* 15fc - _0F_AE_00 */ 0x4179, +/* 15fd - */ 0, +/* 15fe - _F3_0F_AE_00 */ 0x24d5, +/* 15ff - */ 0, +/* 1600 - */ 0, +/* 1601 - */ 0, +/* 1602 - */ 0, +/* 1603 - */ 0, +/* 1604 - */ 0, +/* 1605 - */ 0, +/* 1606 - */ 0, +/* 1607 - */ 0, +/* 1608 - _0F_AE_01 */ 0x417a, +/* 1609 - */ 0, +/* 160a - _F3_0F_AE_01 */ 0x24d6, +/* 160b - */ 0, +/* 160c - */ 0, +/* 160d - */ 0, +/* 160e - */ 0, +/* 160f - */ 0, +/* 1610 - */ 0, +/* 1611 - */ 0, +/* 1612 - */ 0, +/* 1613 - */ 0, +/* 1614 - _0F_AE_02 */ 0x24d7, +/* 1615 - */ 0, +/* 1616 - _F3_0F_AE_02 */ 0x24d8, +/* 1617 - */ 0, +/* 1618 - _V_0F_AE_02 */ 0x417b, +/* 1619 - */ 0, +/* 161a - */ 0, +/* 161b - */ 0, +/* 161c - */ 0, +/* 161d - */ 0, +/* 161e - */ 0, +/* 161f - */ 0, +/* 1620 - _0F_AE_03 */ 0x24d9, +/* 1621 - */ 0, +/* 1622 - _F3_0F_AE_03 */ 0x24da, +/* 1623 - */ 0, +/* 1624 - _V_0F_AE_03 */ 0x417c, +/* 1625 - */ 0, +/* 1626 - */ 0, +/* 1627 - */ 0, +/* 1628 - */ 0, +/* 1629 - */ 0, +/* 162a - */ 0, +/* 162b - */ 0, +/* 162c - _0F_C7_06 */ 0x24db, +/* 162d - _66_0F_C7_06 */ 0x24dc, +/* 162e - _F3_0F_C7_06 */ 0x24dd, +/* 162f - */ 0, +/* 1630 - */ 0, +/* 1631 - */ 0, +/* 1632 - */ 0, +/* 1633 - */ 0, +/* 1634 - */ 0, +/* 1635 - */ 0, +/* 1636 - */ 0, +/* 1637 - */ 0 }; -_InstSharedInfo InstSharedInfoTable[470] = { - { 0, 9, 15, 8, 245, 0, 0 }, - { 0, 11, 17, 8, 245, 0, 0 }, - { 0, 15, 9, 8, 245, 0, 0 }, - { 0, 17, 11, 8, 245, 0, 0 }, - { 1, 1, 33, 8, 245, 0, 0 }, - { 1, 3, 35, 8, 245, 0, 0 }, - { 2, 0, 32, 8, 0, 0, 0 }, - { 3, 0, 32, 8, 0, 0, 0 }, - { 0, 9, 15, 8, 196, 16, 0 }, - { 0, 11, 17, 8, 196, 16, 0 }, - { 0, 15, 9, 8, 196, 16, 0 }, - { 0, 17, 11, 8, 196, 16, 0 }, - { 1, 1, 33, 8, 196, 16, 0 }, - { 1, 3, 35, 8, 196, 16, 0 }, - { 4, 0, 32, 8, 0, 0, 0 }, - { 0, 9, 15, 8, 245, 1, 0 }, - { 0, 11, 17, 8, 245, 1, 0 }, - { 0, 15, 9, 8, 245, 1, 0 }, - { 0, 17, 11, 8, 245, 1, 0 }, - { 1, 1, 33, 8, 245, 1, 0 }, - { 1, 3, 35, 8, 245, 1, 0 }, - { 5, 0, 32, 8, 0, 0, 0 }, - { 6, 0, 32, 8, 0, 0, 0 }, - { 7, 0, 32, 8, 0, 0, 0 }, - { 8, 0, 32, 8, 0, 0, 0 }, - { 0, 9, 15, 8, 229, 0, 16 }, - { 0, 11, 17, 8, 229, 0, 16 }, - { 0, 15, 9, 8, 229, 0, 16 }, - { 0, 17, 11, 8, 229, 0, 16 }, - { 1, 1, 33, 8, 229, 0, 16 }, - { 1, 3, 35, 8, 229, 0, 16 }, - { 9, 0, 0, 8, 213, 17, 32 }, - { 0, 9, 15, 8, 196, 0, 16 }, - { 0, 11, 17, 8, 196, 0, 16 }, - { 0, 15, 9, 8, 196, 0, 16 }, - { 0, 17, 11, 8, 196, 0, 16 }, - { 1, 1, 33, 8, 196, 0, 16 }, - { 1, 3, 35, 8, 196, 0, 16 }, - { 9, 0, 0, 8, 17, 16, 228 }, - { 10, 9, 15, 8, 245, 0, 0 }, - { 10, 11, 17, 8, 245, 0, 0 }, - { 10, 15, 9, 8, 245, 0, 0 }, - { 10, 17, 11, 8, 245, 0, 0 }, - { 11, 1, 33, 8, 245, 0, 0 }, - { 11, 3, 35, 8, 245, 0, 0 }, - { 12, 0, 54, 8, 244, 0, 0 }, - { 13, 0, 54, 8, 0, 0, 0 }, - { 14, 0, 54, 8, 0, 0, 0 }, - { 15, 0, 0, 8, 0, 0, 0 }, - { 16, 42, 11, 8, 0, 0, 0 }, - { 10, 10, 16, 8, 64, 0, 0 }, - { 13, 0, 3, 8, 0, 0, 0 }, - { 17, 17, 11, 8, 33, 0, 212 }, - { 18, 0, 5, 8, 0, 0, 0 }, - { 19, 59, 56, 8, 0, 8, 0 }, - { 20, 59, 56, 8, 0, 8, 0 }, - { 19, 55, 59, 8, 0, 8, 0 }, - { 20, 55, 59, 8, 0, 8, 0 }, - { 13, 0, 40, 13, 0, 32, 0 }, - { 13, 0, 40, 13, 0, 1, 0 }, - { 13, 0, 40, 13, 0, 64, 0 }, - { 13, 0, 40, 13, 0, 65, 0 }, - { 13, 0, 40, 13, 0, 128, 0 }, - { 13, 0, 40, 13, 0, 4, 0 }, - { 13, 0, 40, 13, 0, 160, 0 }, - { 13, 0, 40, 13, 0, 224, 0 }, - { 10, 9, 15, 8, 196, 0, 16 }, - { 10, 11, 17, 8, 196, 0, 16 }, - { 0, 9, 15, 8, 0, 0, 0 }, - { 0, 11, 17, 8, 0, 0, 0 }, - { 21, 9, 15, 8, 0, 0, 0 }, - { 21, 11, 17, 8, 0, 0, 0 }, - { 21, 15, 9, 8, 0, 0, 0 }, - { 21, 17, 11, 8, 0, 0, 0 }, - { 21, 31, 28, 8, 0, 0, 0 }, - { 21, 42, 11, 8, 0, 0, 0 }, - { 21, 28, 31, 8, 0, 0, 0 }, - { 1, 35, 54, 8, 0, 0, 0 }, - { 22, 0, 0, 8, 0, 0, 0 }, - { 9, 0, 38, 9, 0, 0, 0 }, - { 23, 0, 0, 8, 0, 0, 0 }, - { 23, 0, 0, 8, 255, 0, 0 }, - { 11, 0, 0, 8, 213, 0, 0 }, - { 11, 0, 0, 8, 0, 0, 0 }, - { 1, 49, 33, 8, 0, 0, 0 }, - { 1, 50, 35, 8, 0, 0, 0 }, - { 1, 33, 49, 8, 0, 0, 0 }, - { 1, 35, 50, 8, 0, 0, 0 }, - { 24, 55, 56, 8, 0, 8, 0 }, - { 25, 55, 56, 8, 0, 8, 0 }, - { 19, 56, 55, 8, 245, 8, 0 }, - { 26, 56, 55, 8, 245, 8, 0 }, - { 11, 1, 33, 8, 196, 0, 16 }, - { 11, 3, 35, 8, 196, 0, 16 }, - { 19, 33, 56, 8, 0, 8, 0 }, - { 26, 35, 56, 8, 0, 8, 0 }, - { 19, 55, 33, 8, 0, 8, 0 }, - { 26, 55, 35, 8, 0, 8, 0 }, - { 19, 33, 56, 8, 245, 8, 0 }, - { 26, 35, 56, 8, 245, 8, 0 }, - { 1, 1, 53, 8, 0, 0, 0 }, - { 27, 3, 54, 8, 0, 0, 0 }, - { 13, 0, 2, 10, 0, 0, 0 }, - { 13, 0, 0, 10, 0, 0, 0 }, - { 16, 37, 11, 8, 0, 0, 0 }, - { 13, 8, 6, 8, 0, 0, 0 }, - { 13, 0, 0, 8, 0, 0, 0 }, - { 28, 0, 2, 10, 0, 0, 0 }, - { 28, 0, 0, 10, 0, 0, 0 }, - { 11, 0, 0, 14, 0, 0, 0 }, - { 11, 0, 1, 14, 0, 0, 0 }, - { 9, 0, 0, 14, 0, 0, 0 }, - { 28, 0, 0, 10, 255, 0, 0 }, - { 9, 0, 1, 8, 196, 0, 49 }, - { 9, 0, 0, 8, 0, 0, 0 }, - { 29, 0, 57, 8, 0, 0, 0 }, - { 30, 0, 40, 13, 0, 64, 0 }, - { 30, 0, 40, 13, 0, 0, 0 }, - { 31, 0, 40, 13, 0, 0, 0 }, - { 1, 1, 33, 8, 0, 0, 0 }, - { 1, 1, 36, 8, 0, 0, 0 }, - { 11, 33, 1, 8, 0, 0, 0 }, - { 11, 36, 1, 8, 0, 0, 0 }, - { 13, 0, 41, 9, 0, 0, 0 }, - { 13, 0, 41, 12, 0, 0, 0 }, - { 9, 0, 38, 12, 0, 0, 0 }, - { 13, 0, 40, 12, 0, 0, 0 }, - { 1, 59, 33, 8, 0, 0, 0 }, - { 1, 59, 36, 8, 0, 0, 0 }, - { 11, 33, 59, 8, 0, 0, 0 }, - { 11, 36, 59, 8, 0, 0, 0 }, - { 11, 0, 0, 8, 1, 0, 0 }, - { 11, 0, 0, 8, 2, 0, 0 }, - { 11, 0, 0, 8, 8, 0, 0 }, - { 10, 16, 11, 8, 64, 0, 0 }, - { 32, 0, 0, 27, 0, 0, 0 }, - { 32, 0, 0, 8, 0, 0, 0 }, - { 32, 0, 0, 14, 0, 0, 0 }, - { 11, 0, 0, 96, 0, 0, 0 }, - { 10, 0, 17, 8, 0, 0, 0 }, - { 33, 29, 14, 8, 0, 0, 0 }, - { 33, 30, 14, 8, 0, 0, 0 }, - { 33, 14, 29, 8, 0, 0, 0 }, - { 33, 14, 30, 8, 0, 0, 0 }, - { 34, 0, 0, 8, 0, 0, 0 }, - { 35, 17, 11, 31, 0, 32, 0 }, - { 35, 17, 11, 31, 0, 1, 0 }, - { 35, 17, 11, 31, 0, 64, 0 }, - { 35, 17, 11, 31, 0, 65, 0 }, - { 35, 17, 11, 31, 0, 128, 0 }, - { 35, 17, 11, 31, 0, 4, 0 }, - { 35, 17, 11, 31, 0, 160, 0 }, - { 35, 17, 11, 31, 0, 224, 0 }, - { 32, 0, 41, 13, 0, 32, 0 }, - { 32, 0, 41, 13, 0, 1, 0 }, - { 32, 0, 41, 13, 0, 64, 0 }, - { 32, 0, 41, 13, 0, 65, 0 }, - { 32, 0, 41, 13, 0, 128, 0 }, - { 32, 0, 41, 13, 0, 4, 0 }, - { 32, 0, 41, 13, 0, 160, 0 }, - { 32, 0, 41, 13, 0, 224, 0 }, - { 35, 0, 15, 8, 0, 32, 0 }, - { 35, 0, 15, 8, 0, 1, 0 }, - { 35, 0, 15, 8, 0, 64, 0 }, - { 35, 0, 15, 8, 0, 65, 0 }, - { 35, 0, 15, 8, 0, 128, 0 }, - { 35, 0, 15, 8, 0, 4, 0 }, - { 35, 0, 15, 8, 0, 160, 0 }, - { 35, 0, 15, 8, 0, 224, 0 }, - { 36, 0, 32, 8, 0, 0, 0 }, - { 37, 0, 32, 8, 0, 0, 0 }, - { 35, 11, 17, 8, 1, 0, 244 }, - { 38, 11, 17, 8, 197, 0, 48 }, - { 39, 0, 32, 8, 0, 0, 0 }, - { 40, 0, 32, 8, 0, 0, 0 }, - { 32, 0, 0, 8, 255, 0, 0 }, - { 41, 11, 17, 8, 1, 0, 244 }, - { 35, 17, 11, 8, 33, 0, 212 }, - { 41, 9, 15, 8, 245, 0, 0 }, - { 41, 11, 17, 8, 245, 0, 0 }, - { 42, 37, 11, 8, 0, 0, 0 }, - { 35, 15, 11, 8, 0, 0, 0 }, - { 43, 16, 11, 8, 0, 0, 0 }, - { 43, 13, 45, 48, 0, 0, 0 }, - { 44, 0, 54, 8, 0, 0, 0 }, - { 45, 1, 15, 8, 245, 0, 0 }, - { 45, 1, 15, 8, 196, 16, 0 }, - { 45, 1, 15, 8, 245, 1, 0 }, - { 45, 1, 15, 8, 229, 0, 16 }, - { 45, 1, 15, 8, 196, 0, 16 }, - { 46, 1, 15, 8, 245, 0, 0 }, - { 45, 3, 17, 8, 245, 0, 0 }, - { 45, 3, 17, 8, 196, 16, 0 }, - { 45, 3, 17, 8, 245, 1, 0 }, - { 45, 3, 17, 8, 229, 0, 16 }, - { 45, 3, 17, 8, 196, 0, 16 }, - { 46, 3, 17, 8, 245, 0, 0 }, - { 47, 1, 15, 8, 245, 0, 0 }, - { 47, 1, 15, 8, 196, 16, 0 }, - { 47, 1, 15, 8, 245, 1, 0 }, - { 47, 1, 15, 8, 229, 0, 16 }, - { 47, 1, 15, 8, 196, 0, 16 }, - { 48, 1, 15, 8, 245, 0, 0 }, - { 45, 5, 17, 8, 245, 0, 0 }, - { 49, 5, 17, 8, 196, 16, 0 }, - { 45, 5, 17, 8, 245, 1, 0 }, - { 49, 5, 17, 8, 229, 0, 16 }, - { 49, 5, 17, 8, 196, 0, 16 }, - { 46, 5, 17, 8, 245, 0, 0 }, - { 50, 0, 17, 8, 0, 0, 0 }, - { 51, 1, 15, 8, 1, 0, 32 }, - { 51, 1, 15, 8, 1, 1, 32 }, - { 51, 1, 15, 8, 197, 0, 48 }, - { 51, 1, 17, 8, 1, 0, 32 }, - { 51, 1, 17, 8, 1, 1, 32 }, - { 51, 1, 17, 8, 197, 0, 48 }, - { 52, 1, 15, 8, 0, 0, 0 }, - { 53, 0, 1, 24, 0, 0, 0 }, - { 52, 3, 17, 8, 0, 0, 0 }, - { 53, 0, 41, 24, 0, 0, 0 }, - { 51, 51, 15, 8, 33, 0, 0 }, - { 51, 51, 15, 8, 33, 1, 0 }, - { 51, 51, 15, 8, 229, 0, 16 }, - { 51, 51, 17, 8, 33, 0, 0 }, - { 51, 51, 17, 8, 33, 1, 0 }, - { 51, 51, 17, 8, 229, 0, 16 }, - { 51, 52, 15, 8, 1, 0, 32 }, - { 51, 52, 15, 8, 1, 1, 32 }, - { 51, 52, 15, 8, 197, 0, 48 }, - { 51, 52, 17, 8, 1, 0, 32 }, - { 51, 52, 17, 8, 1, 1, 32 }, - { 51, 52, 17, 8, 197, 0, 48 }, - { 46, 0, 21, 16, 0, 0, 0 }, - { 54, 0, 62, 16, 0, 0, 0 }, - { 54, 0, 61, 16, 0, 0, 0 }, - { 54, 0, 0, 16, 0, 0, 0 }, - { 51, 0, 21, 16, 0, 0, 0 }, - { 46, 0, 42, 16, 0, 0, 0 }, - { 46, 0, 20, 16, 0, 0, 0 }, - { 55, 0, 62, 24, 0, 1, 0 }, - { 55, 0, 62, 24, 0, 64, 0 }, - { 55, 0, 62, 24, 0, 65, 0 }, - { 55, 0, 62, 24, 0, 4, 0 }, - { 56, 0, 21, 56, 0, 0, 0 }, - { 46, 0, 23, 16, 0, 0, 0 }, - { 51, 0, 23, 16, 0, 0, 0 }, - { 55, 0, 62, 16, 69, 0, 0 }, - { 55, 0, 62, 24, 69, 0, 0 }, - { 46, 0, 22, 16, 0, 0, 0 }, - { 54, 0, 63, 16, 0, 0, 0 }, - { 56, 0, 22, 56, 0, 0, 0 }, - { 51, 0, 22, 16, 0, 0, 0 }, - { 56, 0, 20, 56, 0, 0, 0 }, - { 51, 0, 20, 16, 0, 0, 0 }, - { 46, 1, 15, 8, 196, 0, 16 }, - { 45, 0, 15, 8, 0, 0, 0 }, - { 45, 0, 15, 8, 245, 0, 0 }, - { 51, 0, 15, 8, 33, 0, 212 }, - { 51, 0, 15, 8, 0, 0, 245 }, - { 46, 3, 17, 8, 196, 0, 16 }, - { 45, 0, 17, 8, 0, 0, 0 }, - { 45, 0, 17, 8, 245, 0, 0 }, - { 51, 0, 17, 8, 33, 0, 212 }, - { 51, 0, 17, 8, 0, 0, 245 }, - { 45, 0, 15, 8, 244, 0, 0 }, - { 45, 0, 17, 8, 244, 0, 0 }, - { 57, 0, 17, 9, 0, 0, 0 }, - { 58, 0, 37, 9, 0, 0, 0 }, - { 57, 0, 17, 12, 0, 0, 0 }, - { 58, 0, 37, 12, 0, 0, 0 }, - { 57, 0, 17, 8, 0, 0, 0 }, - { 46, 0, 17, 8, 0, 0, 0 }, - { 46, 0, 16, 8, 0, 0, 0 }, - { 56, 0, 16, 8, 0, 0, 0 }, - { 46, 0, 16, 8, 64, 0, 0 }, - { 57, 0, 39, 8, 0, 0, 0 }, - { 52, 0, 28, 8, 0, 0, 0 }, - { 59, 0, 16, 8, 0, 0, 0 }, - { 56, 0, 42, 8, 0, 0, 0 }, - { 55, 0, 0, 112, 0, 0, 0 }, - { 55, 0, 0, 8, 0, 0, 0 }, - { 13, 0, 0, 24, 0, 0, 0 }, - { 56, 0, 58, 120, 0, 0, 0 }, - { 55, 0, 0, 120, 0, 0, 0 }, - { 55, 0, 58, 120, 0, 0, 0 }, - { 55, 60, 58, 120, 0, 0, 0 }, - { 60, 0, 0, 8, 0, 0, 0 }, - { 56, 0, 42, 96, 0, 0, 0 }, - { 61, 67, 64, 104, 0, 0, 0 }, - { 61, 67, 64, 96, 0, 0, 0 }, - { 35, 73, 68, 40, 0, 0, 0 }, - { 35, 73, 68, 48, 0, 0, 0 }, - { 35, 71, 68, 40, 0, 0, 0 }, - { 35, 72, 68, 48, 0, 0, 0 }, - { 62, 90, 83, 128, 0, 0, 0 }, - { 63, 81, 68, 128, 0, 0, 0 }, - { 64, 44, 68, 128, 0, 0, 0 }, - { 64, 46, 68, 128, 0, 0, 0 }, - { 35, 68, 73, 40, 0, 0, 0 }, - { 35, 68, 73, 48, 0, 0, 0 }, - { 35, 68, 71, 40, 0, 0, 0 }, - { 35, 68, 72, 48, 0, 0, 0 }, - { 62, 83, 90, 128, 0, 0, 0 }, - { 64, 68, 44, 128, 0, 0, 0 }, - { 64, 68, 46, 128, 0, 0, 0 }, - { 65, 72, 68, 40, 0, 0, 0 }, - { 35, 46, 68, 48, 0, 0, 0 }, - { 35, 72, 68, 56, 0, 0, 0 }, - { 66, 81, 68, 128, 0, 0, 0 }, - { 67, 81, 68, 128, 0, 0, 0 }, - { 62, 89, 83, 128, 0, 0, 0 }, - { 35, 68, 46, 40, 0, 0, 0 }, - { 35, 68, 46, 48, 0, 0, 0 }, - { 62, 68, 46, 128, 0, 0, 0 }, - { 34, 73, 68, 40, 0, 0, 0 }, - { 34, 73, 68, 48, 0, 0, 0 }, - { 67, 88, 83, 128, 0, 0, 0 }, - { 35, 73, 68, 56, 0, 0, 0 }, - { 56, 0, 42, 40, 0, 0, 0 }, - { 34, 67, 68, 40, 0, 0, 0 }, - { 34, 67, 68, 48, 0, 0, 0 }, - { 42, 18, 68, 40, 0, 0, 0 }, - { 42, 18, 68, 48, 0, 0, 0 }, - { 35, 68, 47, 40, 0, 0, 0 }, - { 35, 68, 47, 48, 0, 0, 0 }, - { 35, 68, 44, 88, 0, 0, 0 }, - { 35, 68, 46, 88, 0, 0, 0 }, - { 62, 83, 92, 128, 0, 0, 0 }, - { 34, 72, 64, 40, 0, 0, 0 }, - { 34, 73, 64, 48, 0, 0, 0 }, - { 42, 71, 13, 40, 0, 0, 0 }, - { 42, 72, 13, 48, 0, 0, 0 }, - { 62, 80, 78, 128, 0, 0, 0 }, - { 34, 71, 68, 40, 69, 0, 0 }, - { 34, 72, 68, 48, 0, 0, 0 }, - { 62, 71, 68, 128, 0, 0, 0 }, - { 62, 72, 68, 128, 0, 0, 0 }, - { 68, 69, 12, 40, 0, 0, 0 }, - { 68, 69, 12, 48, 0, 0, 0 }, - { 69, 83, 13, 128, 0, 0, 0 }, - { 34, 71, 68, 40, 0, 0, 0 }, - { 34, 71, 68, 48, 0, 0, 0 }, - { 62, 91, 83, 128, 0, 0, 0 }, - { 62, 90, 68, 128, 0, 0, 0 }, - { 34, 66, 64, 32, 0, 0, 0 }, - { 34, 67, 64, 32, 0, 0, 0 }, - { 70, 18, 64, 32, 0, 0, 0 }, - { 70, 18, 68, 48, 0, 0, 0 }, - { 62, 79, 68, 128, 0, 0, 0 }, - { 35, 67, 64, 32, 0, 0, 0 }, - { 71, 67, 64, 40, 0, 0, 0 }, - { 71, 73, 68, 48, 0, 0, 0 }, - { 67, 73, 68, 128, 0, 0, 0 }, - { 32, 0, 0, 32, 0, 0, 0 }, - { 72, 0, 0, 128, 0, 0, 0 }, - { 73, 13, 18, 112, 0, 0, 0 }, - { 74, 7, 69, 88, 0, 0, 0 }, - { 75, 69, 68, 88, 0, 0, 0 }, - { 73, 18, 13, 112, 0, 0, 0 }, - { 34, 69, 68, 88, 0, 0, 0 }, - { 76, 69, 68, 88, 0, 0, 0 }, - { 32, 72, 68, 112, 0, 0, 0 }, - { 32, 68, 72, 112, 0, 0, 0 }, - { 34, 73, 68, 56, 0, 0, 0 }, - { 70, 64, 18, 32, 0, 0, 0 }, - { 70, 68, 18, 48, 0, 0, 0 }, - { 62, 68, 79, 128, 0, 0, 0 }, - { 35, 64, 67, 32, 0, 0, 0 }, - { 77, 0, 42, 8, 0, 0, 0 }, - { 78, 0, 43, 8, 0, 0, 0 }, - { 79, 0, 43, 8, 0, 0, 0 }, - { 80, 17, 11, 80, 64, 0, 0 }, - { 81, 1, 17, 8, 1, 0, 244 }, - { 49, 1, 17, 8, 1, 0, 244 }, - { 34, 17, 11, 8, 64, 0, 245 }, - { 82, 17, 11, 112, 0, 0, 0 }, - { 83, 17, 11, 8, 65, 0, 180 }, - { 84, 73, 68, 40, 0, 0, 0 }, - { 84, 73, 68, 48, 0, 0, 0 }, - { 84, 71, 68, 40, 0, 0, 0 }, - { 84, 72, 68, 48, 0, 0, 0 }, - { 85, 88, 83, 128, 0, 0, 0 }, - { 85, 81, 68, 128, 0, 0, 0 }, - { 71, 25, 64, 40, 0, 0, 0 }, - { 71, 25, 68, 48, 0, 0, 0 }, - { 86, 81, 68, 128, 0, 0, 0 }, - { 87, 65, 12, 40, 0, 0, 0 }, - { 71, 69, 12, 48, 0, 0, 0 }, - { 88, 68, 13, 128, 0, 0, 0 }, - { 71, 73, 68, 40, 0, 0, 0 }, - { 86, 88, 83, 128, 0, 0, 0 }, - { 89, 0, 48, 8, 64, 0, 0 }, - { 56, 0, 46, 112, 0, 0, 0 }, - { 68, 65, 68, 48, 0, 0, 0 }, - { 68, 69, 64, 48, 0, 0, 0 }, - { 62, 68, 72, 128, 0, 0, 0 }, - { 76, 65, 12, 40, 0, 0, 0 }, - { 76, 69, 12, 48, 0, 0, 0 }, - { 69, 68, 13, 128, 0, 0, 0 }, - { 34, 67, 64, 40, 0, 0, 0 }, - { 35, 64, 46, 40, 0, 0, 0 }, - { 34, 42, 68, 56, 0, 0, 0 }, - { 62, 92, 83, 128, 0, 0, 0 }, - { 34, 67, 64, 48, 0, 0, 0 }, - { 76, 65, 64, 40, 0, 0, 0 }, - { 76, 69, 68, 48, 0, 0, 0 }, - { 90, 69, 68, 128, 0, 0, 0 }, - { 51, 0, 42, 16, 0, 0, 0 }, - { 91, 0, 42, 16, 0, 0, 0 }, - { 91, 0, 20, 16, 0, 0, 0 }, - { 92, 0, 0, 16, 0, 0, 0 }, - { 93, 0, 34, 16, 0, 0, 0 }, - { 94, 0, 34, 16, 0, 0, 0 }, - { 34, 67, 64, 64, 0, 0, 0 }, - { 34, 73, 68, 64, 0, 0, 0 }, - { 71, 73, 68, 72, 0, 0, 0 }, - { 34, 73, 68, 80, 0, 0, 0 }, - { 62, 44, 83, 128, 0, 0, 0 }, - { 62, 46, 85, 128, 0, 0, 0 }, - { 62, 47, 85, 128, 0, 0, 0 }, - { 62, 73, 68, 128, 0, 0, 0 }, - { 34, 72, 68, 72, 0, 0, 0 }, - { 34, 71, 68, 72, 0, 0, 0 }, - { 34, 70, 68, 72, 0, 0, 0 }, - { 62, 70, 68, 128, 0, 0, 0 }, - { 34, 73, 68, 72, 0, 0, 0 }, - { 35, 47, 68, 72, 0, 0, 0 }, - { 62, 47, 68, 128, 0, 0, 0 }, - { 67, 88, 92, 128, 0, 0, 0 }, - { 73, 47, 13, 112, 0, 0, 0 }, - { 67, 88, 83, 136, 0, 0, 0 }, - { 67, 81, 68, 136, 0, 0, 0 }, - { 34, 73, 68, 152, 0, 0, 0 }, - { 62, 73, 68, 152, 0, 0, 0 }, - { 67, 81, 68, 152, 0, 0, 0 }, - { 35, 17, 11, 8, 0, 0, 0 }, - { 35, 15, 13, 80, 0, 0, 0 }, - { 35, 11, 17, 8, 0, 0, 0 }, - { 35, 17, 13, 80, 0, 0, 0 }, - { 67, 90, 83, 128, 0, 0, 0 }, - { 86, 87, 85, 128, 0, 0, 0 }, - { 71, 71, 68, 72, 0, 0, 0 }, - { 71, 72, 68, 72, 0, 0, 0 }, - { 71, 67, 64, 64, 0, 0, 0 }, - { 71, 73, 68, 64, 0, 0, 0 }, - { 71, 68, 26, 72, 0, 0, 0 }, - { 88, 68, 76, 128, 0, 0, 0 }, - { 71, 68, 27, 72, 0, 0, 0 }, - { 88, 68, 77, 128, 0, 0, 0 }, - { 95, 68, 18, 72, 0, 0, 0 }, - { 67, 68, 79, 128, 0, 0, 0 }, - { 71, 68, 18, 72, 0, 0, 0 }, - { 67, 68, 75, 128, 0, 0, 0 }, - { 67, 85, 73, 128, 0, 0, 0 }, - { 71, 24, 68, 72, 0, 0, 0 }, - { 95, 18, 68, 72, 0, 0, 0 }, - { 71, 73, 68, 144, 0, 0, 0 }, - { 86, 81, 68, 144, 0, 0, 0 }, - { 71, 73, 68, 80, 0, 0, 0 }, - { 71, 73, 68, 152, 0, 0, 0 }, - { 67, 73, 68, 152, 0, 0, 0 }, - { 96, 1, 65, 32, 0, 0, 0 }, - { 56, 1, 69, 48, 0, 0, 0 }, - { 97, 69, 81, 128, 0, 0, 0 }, - { 98, 0, 13, 112, 0, 0, 0 }, - { 64, 0, 44, 128, 0, 0, 0 }, - { 56, 0, 42, 112, 0, 0, 0 }, - { 99, 75, 13, 8, 0, 0, 0 }, - { 98, 0, 17, 8, 0, 0, 0 }, - { 100, 67, 64, 96, 0, 0, 0 } +_InstSharedInfo InstSharedInfoTable[471] = { +{0, 9, 15, 8, 245, 0, 0}, +{0, 11, 17, 8, 245, 0, 0}, +{0, 15, 9, 8, 245, 0, 0}, +{0, 17, 11, 8, 245, 0, 0}, +{1, 1, 33, 8, 245, 0, 0}, +{1, 3, 35, 8, 245, 0, 0}, +{2, 0, 32, 8, 0, 0, 0}, +{3, 0, 32, 8, 0, 0, 0}, +{0, 9, 15, 8, 196, 16, 0}, +{0, 11, 17, 8, 196, 16, 0}, +{0, 15, 9, 8, 196, 16, 0}, +{0, 17, 11, 8, 196, 16, 0}, +{1, 1, 33, 8, 196, 16, 0}, +{1, 3, 35, 8, 196, 16, 0}, +{4, 0, 32, 8, 0, 0, 0}, +{0, 9, 15, 8, 245, 1, 0}, +{0, 11, 17, 8, 245, 1, 0}, +{0, 15, 9, 8, 245, 1, 0}, +{0, 17, 11, 8, 245, 1, 0}, +{1, 1, 33, 8, 245, 1, 0}, +{1, 3, 35, 8, 245, 1, 0}, +{5, 0, 32, 8, 0, 0, 0}, +{6, 0, 32, 8, 0, 0, 0}, +{7, 0, 32, 8, 0, 0, 0}, +{8, 0, 32, 8, 0, 0, 0}, +{0, 9, 15, 8, 229, 0, 16}, +{0, 11, 17, 8, 229, 0, 16}, +{0, 15, 9, 8, 229, 0, 16}, +{0, 17, 11, 8, 229, 0, 16}, +{1, 1, 33, 8, 229, 0, 16}, +{1, 3, 35, 8, 229, 0, 16}, +{9, 0, 0, 8, 213, 17, 32}, +{0, 9, 15, 8, 196, 0, 16}, +{0, 11, 17, 8, 196, 0, 16}, +{0, 15, 9, 8, 196, 0, 16}, +{0, 17, 11, 8, 196, 0, 16}, +{1, 1, 33, 8, 196, 0, 16}, +{1, 3, 35, 8, 196, 0, 16}, +{9, 0, 0, 8, 17, 16, 228}, +{10, 9, 15, 8, 245, 0, 0}, +{10, 11, 17, 8, 245, 0, 0}, +{10, 15, 9, 8, 245, 0, 0}, +{10, 17, 11, 8, 245, 0, 0}, +{11, 1, 33, 8, 245, 0, 0}, +{11, 3, 35, 8, 245, 0, 0}, +{12, 0, 54, 8, 244, 0, 0}, +{13, 0, 54, 8, 0, 0, 0}, +{14, 0, 54, 8, 0, 0, 0}, +{15, 0, 0, 8, 0, 0, 0}, +{16, 42, 11, 8, 0, 0, 0}, +{10, 10, 16, 8, 64, 0, 0}, +{13, 0, 3, 8, 0, 0, 0}, +{17, 17, 11, 8, 33, 0, 212}, +{18, 0, 5, 8, 0, 0, 0}, +{19, 59, 56, 8, 0, 8, 0}, +{20, 59, 56, 8, 0, 8, 0}, +{19, 55, 59, 8, 0, 8, 0}, +{20, 55, 59, 8, 0, 8, 0}, +{13, 0, 40, 13, 0, 32, 0}, +{13, 0, 40, 13, 0, 1, 0}, +{13, 0, 40, 13, 0, 64, 0}, +{13, 0, 40, 13, 0, 65, 0}, +{13, 0, 40, 13, 0, 128, 0}, +{13, 0, 40, 13, 0, 4, 0}, +{13, 0, 40, 13, 0, 160, 0}, +{13, 0, 40, 13, 0, 224, 0}, +{10, 9, 15, 8, 196, 0, 16}, +{10, 11, 17, 8, 196, 0, 16}, +{0, 9, 15, 8, 0, 0, 0}, +{0, 11, 17, 8, 0, 0, 0}, +{21, 9, 15, 8, 0, 0, 0}, +{21, 11, 17, 8, 0, 0, 0}, +{21, 15, 9, 8, 0, 0, 0}, +{21, 17, 11, 8, 0, 0, 0}, +{21, 31, 28, 8, 0, 0, 0}, +{21, 42, 11, 8, 0, 0, 0}, +{21, 28, 31, 8, 0, 0, 0}, +{1, 35, 54, 8, 0, 0, 0}, +{22, 0, 0, 8, 0, 0, 0}, +{9, 0, 38, 9, 0, 0, 0}, +{23, 0, 0, 8, 0, 0, 0}, +{23, 0, 0, 8, 255, 0, 0}, +{11, 0, 0, 8, 213, 0, 0}, +{11, 0, 0, 8, 0, 0, 0}, +{1, 49, 33, 8, 0, 0, 0}, +{1, 50, 35, 8, 0, 0, 0}, +{1, 33, 49, 8, 0, 0, 0}, +{1, 35, 50, 8, 0, 0, 0}, +{24, 55, 56, 8, 0, 8, 0}, +{25, 55, 56, 8, 0, 8, 0}, +{19, 56, 55, 8, 245, 8, 0}, +{26, 56, 55, 8, 245, 8, 0}, +{11, 1, 33, 8, 196, 0, 16}, +{11, 3, 35, 8, 196, 0, 16}, +{19, 33, 56, 8, 0, 8, 0}, +{26, 35, 56, 8, 0, 8, 0}, +{19, 55, 33, 8, 0, 8, 0}, +{26, 55, 35, 8, 0, 8, 0}, +{19, 33, 56, 8, 245, 8, 0}, +{26, 35, 56, 8, 245, 8, 0}, +{1, 1, 53, 8, 0, 0, 0}, +{27, 3, 54, 8, 0, 0, 0}, +{13, 0, 2, 10, 0, 0, 0}, +{13, 0, 0, 10, 0, 0, 0}, +{16, 37, 11, 8, 0, 0, 0}, +{13, 8, 6, 8, 0, 0, 0}, +{13, 0, 0, 8, 0, 0, 0}, +{28, 0, 2, 10, 0, 0, 0}, +{28, 0, 0, 10, 0, 0, 0}, +{11, 0, 0, 14, 0, 0, 0}, +{11, 0, 1, 14, 0, 0, 0}, +{9, 0, 0, 14, 0, 0, 0}, +{28, 0, 0, 10, 255, 0, 0}, +{9, 0, 1, 8, 196, 0, 49}, +{9, 0, 0, 8, 0, 0, 0}, +{29, 0, 57, 8, 0, 0, 0}, +{30, 0, 40, 13, 0, 64, 0}, +{30, 0, 40, 13, 0, 0, 0}, +{31, 0, 40, 13, 0, 0, 0}, +{1, 1, 33, 8, 0, 0, 0}, +{1, 1, 36, 8, 0, 0, 0}, +{11, 33, 1, 8, 0, 0, 0}, +{11, 36, 1, 8, 0, 0, 0}, +{13, 0, 41, 9, 0, 0, 0}, +{13, 0, 41, 12, 0, 0, 0}, +{9, 0, 38, 12, 0, 0, 0}, +{13, 0, 40, 12, 0, 0, 0}, +{1, 59, 33, 8, 0, 0, 0}, +{1, 59, 36, 8, 0, 0, 0}, +{11, 33, 59, 8, 0, 0, 0}, +{11, 36, 59, 8, 0, 0, 0}, +{11, 0, 0, 8, 1, 0, 0}, +{11, 0, 0, 8, 2, 0, 0}, +{11, 0, 0, 8, 8, 0, 0}, +{10, 16, 11, 8, 64, 0, 0}, +{32, 0, 0, 27, 0, 0, 0}, +{32, 0, 0, 8, 0, 0, 0}, +{32, 0, 0, 14, 0, 0, 0}, +{11, 0, 0, 96, 0, 0, 0}, +{10, 0, 17, 8, 0, 0, 0}, +{33, 29, 14, 8, 0, 0, 0}, +{33, 30, 14, 8, 0, 0, 0}, +{33, 14, 29, 8, 0, 0, 0}, +{33, 14, 30, 8, 0, 0, 0}, +{34, 0, 0, 8, 0, 0, 0}, +{35, 17, 11, 31, 0, 32, 0}, +{35, 17, 11, 31, 0, 1, 0}, +{35, 17, 11, 31, 0, 64, 0}, +{35, 17, 11, 31, 0, 65, 0}, +{35, 17, 11, 31, 0, 128, 0}, +{35, 17, 11, 31, 0, 4, 0}, +{35, 17, 11, 31, 0, 160, 0}, +{35, 17, 11, 31, 0, 224, 0}, +{32, 0, 41, 13, 0, 32, 0}, +{32, 0, 41, 13, 0, 1, 0}, +{32, 0, 41, 13, 0, 64, 0}, +{32, 0, 41, 13, 0, 65, 0}, +{32, 0, 41, 13, 0, 128, 0}, +{32, 0, 41, 13, 0, 4, 0}, +{32, 0, 41, 13, 0, 160, 0}, +{32, 0, 41, 13, 0, 224, 0}, +{35, 0, 15, 8, 0, 32, 0}, +{35, 0, 15, 8, 0, 1, 0}, +{35, 0, 15, 8, 0, 64, 0}, +{35, 0, 15, 8, 0, 65, 0}, +{35, 0, 15, 8, 0, 128, 0}, +{35, 0, 15, 8, 0, 4, 0}, +{35, 0, 15, 8, 0, 160, 0}, +{35, 0, 15, 8, 0, 224, 0}, +{36, 0, 32, 8, 0, 0, 0}, +{37, 0, 32, 8, 0, 0, 0}, +{35, 11, 17, 8, 1, 0, 244}, +{38, 11, 17, 8, 197, 0, 48}, +{39, 0, 32, 8, 0, 0, 0}, +{40, 0, 32, 8, 0, 0, 0}, +{32, 0, 0, 8, 255, 0, 0}, +{41, 11, 17, 8, 1, 0, 244}, +{35, 17, 11, 8, 33, 0, 212}, +{41, 9, 15, 8, 245, 0, 0}, +{41, 11, 17, 8, 245, 0, 0}, +{42, 37, 11, 8, 0, 0, 0}, +{35, 15, 11, 8, 0, 0, 0}, +{43, 16, 11, 8, 0, 0, 0}, +{43, 13, 45, 48, 0, 0, 0}, +{44, 0, 54, 8, 0, 0, 0}, +{45, 1, 15, 8, 245, 0, 0}, +{45, 1, 15, 8, 196, 16, 0}, +{45, 1, 15, 8, 245, 1, 0}, +{45, 1, 15, 8, 229, 0, 16}, +{45, 1, 15, 8, 196, 0, 16}, +{46, 1, 15, 8, 245, 0, 0}, +{45, 3, 17, 8, 245, 0, 0}, +{45, 3, 17, 8, 196, 16, 0}, +{45, 3, 17, 8, 245, 1, 0}, +{45, 3, 17, 8, 229, 0, 16}, +{45, 3, 17, 8, 196, 0, 16}, +{46, 3, 17, 8, 245, 0, 0}, +{47, 1, 15, 8, 245, 0, 0}, +{47, 1, 15, 8, 196, 16, 0}, +{47, 1, 15, 8, 245, 1, 0}, +{47, 1, 15, 8, 229, 0, 16}, +{47, 1, 15, 8, 196, 0, 16}, +{48, 1, 15, 8, 245, 0, 0}, +{45, 5, 17, 8, 245, 0, 0}, +{49, 5, 17, 8, 196, 16, 0}, +{45, 5, 17, 8, 245, 1, 0}, +{49, 5, 17, 8, 229, 0, 16}, +{49, 5, 17, 8, 196, 0, 16}, +{46, 5, 17, 8, 245, 0, 0}, +{50, 0, 17, 8, 0, 0, 0}, +{51, 1, 15, 8, 1, 0, 32}, +{51, 1, 15, 8, 1, 1, 32}, +{51, 1, 15, 8, 197, 0, 48}, +{51, 1, 17, 8, 1, 0, 32}, +{51, 1, 17, 8, 1, 1, 32}, +{51, 1, 17, 8, 197, 0, 48}, +{52, 1, 15, 8, 0, 0, 0}, +{53, 0, 1, 24, 0, 0, 0}, +{52, 3, 17, 8, 0, 0, 0}, +{53, 0, 41, 24, 0, 0, 0}, +{51, 51, 15, 8, 33, 0, 0}, +{51, 51, 15, 8, 33, 1, 0}, +{51, 51, 15, 8, 229, 0, 16}, +{51, 51, 17, 8, 33, 0, 0}, +{51, 51, 17, 8, 33, 1, 0}, +{51, 51, 17, 8, 229, 0, 16}, +{51, 52, 15, 8, 1, 0, 32}, +{51, 52, 15, 8, 1, 1, 32}, +{51, 52, 15, 8, 197, 0, 48}, +{51, 52, 17, 8, 1, 0, 32}, +{51, 52, 17, 8, 1, 1, 32}, +{51, 52, 17, 8, 197, 0, 48}, +{46, 0, 21, 16, 0, 0, 0}, +{54, 0, 62, 16, 0, 0, 0}, +{54, 0, 61, 16, 0, 0, 0}, +{54, 0, 0, 16, 0, 0, 0}, +{51, 0, 21, 16, 0, 0, 0}, +{46, 0, 42, 16, 0, 0, 0}, +{46, 0, 20, 16, 0, 0, 0}, +{55, 0, 62, 24, 0, 1, 0}, +{55, 0, 62, 24, 0, 64, 0}, +{55, 0, 62, 24, 0, 65, 0}, +{55, 0, 62, 24, 0, 4, 0}, +{56, 0, 21, 56, 0, 0, 0}, +{46, 0, 23, 16, 0, 0, 0}, +{51, 0, 23, 16, 0, 0, 0}, +{55, 0, 62, 16, 69, 0, 0}, +{55, 0, 62, 24, 69, 0, 0}, +{46, 0, 22, 16, 0, 0, 0}, +{54, 0, 63, 16, 0, 0, 0}, +{56, 0, 22, 56, 0, 0, 0}, +{51, 0, 22, 16, 0, 0, 0}, +{56, 0, 20, 56, 0, 0, 0}, +{51, 0, 20, 16, 0, 0, 0}, +{46, 1, 15, 8, 196, 0, 16}, +{45, 0, 15, 8, 0, 0, 0}, +{45, 0, 15, 8, 245, 0, 0}, +{51, 0, 15, 8, 33, 0, 212}, +{51, 0, 15, 8, 0, 0, 245}, +{46, 3, 17, 8, 196, 0, 16}, +{45, 0, 17, 8, 0, 0, 0}, +{45, 0, 17, 8, 245, 0, 0}, +{51, 0, 17, 8, 33, 0, 212}, +{51, 0, 17, 8, 0, 0, 245}, +{45, 0, 15, 8, 244, 0, 0}, +{45, 0, 17, 8, 244, 0, 0}, +{57, 0, 17, 9, 0, 0, 0}, +{58, 0, 37, 9, 0, 0, 0}, +{57, 0, 17, 12, 0, 0, 0}, +{58, 0, 37, 12, 0, 0, 0}, +{57, 0, 17, 8, 0, 0, 0}, +{46, 0, 17, 8, 0, 0, 0}, +{46, 0, 16, 8, 0, 0, 0}, +{56, 0, 16, 8, 0, 0, 0}, +{46, 0, 16, 8, 64, 0, 0}, +{57, 0, 39, 8, 0, 0, 0}, +{52, 0, 28, 8, 0, 0, 0}, +{59, 0, 16, 8, 0, 0, 0}, +{56, 0, 42, 8, 0, 0, 0}, +{55, 0, 0, 112, 0, 0, 0}, +{55, 0, 0, 8, 0, 0, 0}, +{13, 0, 0, 24, 0, 0, 0}, +{56, 0, 58, 120, 0, 0, 0}, +{55, 0, 0, 120, 0, 0, 0}, +{55, 0, 58, 120, 0, 0, 0}, +{55, 60, 58, 120, 0, 0, 0}, +{60, 0, 0, 8, 0, 0, 0}, +{56, 0, 42, 96, 0, 0, 0}, +{61, 67, 64, 104, 0, 0, 0}, +{61, 67, 64, 96, 0, 0, 0}, +{35, 73, 68, 40, 0, 0, 0}, +{35, 73, 68, 48, 0, 0, 0}, +{35, 71, 68, 40, 0, 0, 0}, +{35, 72, 68, 48, 0, 0, 0}, +{62, 90, 83, 128, 0, 0, 0}, +{63, 81, 68, 128, 0, 0, 0}, +{64, 44, 68, 128, 0, 0, 0}, +{64, 46, 68, 128, 0, 0, 0}, +{35, 68, 73, 40, 0, 0, 0}, +{35, 68, 73, 48, 0, 0, 0}, +{35, 68, 71, 40, 0, 0, 0}, +{35, 68, 72, 48, 0, 0, 0}, +{62, 83, 90, 128, 0, 0, 0}, +{64, 68, 44, 128, 0, 0, 0}, +{64, 68, 46, 128, 0, 0, 0}, +{65, 72, 68, 40, 0, 0, 0}, +{35, 46, 68, 48, 0, 0, 0}, +{35, 72, 68, 56, 0, 0, 0}, +{66, 81, 68, 128, 0, 0, 0}, +{67, 81, 68, 128, 0, 0, 0}, +{62, 89, 83, 128, 0, 0, 0}, +{35, 68, 46, 40, 0, 0, 0}, +{35, 68, 46, 48, 0, 0, 0}, +{62, 68, 46, 128, 0, 0, 0}, +{34, 73, 68, 40, 0, 0, 0}, +{34, 73, 68, 48, 0, 0, 0}, +{67, 88, 83, 128, 0, 0, 0}, +{35, 73, 68, 56, 0, 0, 0}, +{56, 0, 42, 40, 0, 0, 0}, +{34, 67, 68, 40, 0, 0, 0}, +{34, 67, 68, 48, 0, 0, 0}, +{42, 18, 68, 40, 0, 0, 0}, +{42, 18, 68, 48, 0, 0, 0}, +{35, 68, 47, 40, 0, 0, 0}, +{35, 68, 47, 48, 0, 0, 0}, +{35, 68, 44, 88, 0, 0, 0}, +{35, 68, 46, 88, 0, 0, 0}, +{62, 83, 92, 128, 0, 0, 0}, +{34, 72, 64, 40, 0, 0, 0}, +{34, 73, 64, 48, 0, 0, 0}, +{42, 71, 13, 40, 0, 0, 0}, +{42, 72, 13, 48, 0, 0, 0}, +{62, 80, 78, 128, 0, 0, 0}, +{34, 71, 68, 40, 69, 0, 0}, +{34, 72, 68, 48, 0, 0, 0}, +{62, 71, 68, 128, 0, 0, 0}, +{62, 72, 68, 128, 0, 0, 0}, +{68, 69, 12, 40, 0, 0, 0}, +{68, 69, 12, 48, 0, 0, 0}, +{69, 83, 13, 128, 0, 0, 0}, +{34, 71, 68, 40, 0, 0, 0}, +{34, 71, 68, 48, 0, 0, 0}, +{62, 91, 83, 128, 0, 0, 0}, +{62, 90, 68, 128, 0, 0, 0}, +{34, 66, 64, 32, 0, 0, 0}, +{34, 67, 64, 32, 0, 0, 0}, +{70, 18, 64, 32, 0, 0, 0}, +{70, 18, 68, 48, 0, 0, 0}, +{62, 79, 68, 128, 0, 0, 0}, +{35, 67, 64, 32, 0, 0, 0}, +{71, 67, 64, 40, 0, 0, 0}, +{71, 73, 68, 48, 0, 0, 0}, +{67, 73, 68, 128, 0, 0, 0}, +{32, 0, 0, 32, 0, 0, 0}, +{72, 0, 0, 128, 0, 0, 0}, +{73, 13, 18, 112, 0, 0, 0}, +{74, 7, 69, 88, 0, 0, 0}, +{75, 69, 68, 88, 0, 0, 0}, +{73, 18, 13, 112, 0, 0, 0}, +{34, 69, 68, 88, 0, 0, 0}, +{76, 69, 68, 88, 0, 0, 0}, +{32, 72, 68, 112, 0, 0, 0}, +{32, 68, 72, 112, 0, 0, 0}, +{34, 73, 68, 56, 0, 0, 0}, +{70, 64, 18, 32, 0, 0, 0}, +{70, 68, 18, 48, 0, 0, 0}, +{62, 68, 79, 128, 0, 0, 0}, +{35, 64, 67, 32, 0, 0, 0}, +{77, 0, 42, 8, 0, 0, 0}, +{78, 0, 43, 8, 0, 0, 0}, +{79, 0, 43, 8, 0, 0, 0}, +{80, 17, 11, 80, 64, 0, 0}, +{81, 1, 17, 8, 1, 0, 244}, +{49, 1, 17, 8, 1, 0, 244}, +{34, 17, 11, 8, 64, 0, 245}, +{82, 17, 11, 112, 0, 0, 0}, +{83, 17, 11, 8, 65, 0, 180}, +{84, 73, 68, 40, 0, 0, 0}, +{84, 73, 68, 48, 0, 0, 0}, +{84, 71, 68, 40, 0, 0, 0}, +{84, 72, 68, 48, 0, 0, 0}, +{85, 88, 83, 128, 0, 0, 0}, +{85, 81, 68, 128, 0, 0, 0}, +{71, 25, 64, 40, 0, 0, 0}, +{71, 25, 68, 48, 0, 0, 0}, +{86, 81, 68, 128, 0, 0, 0}, +{87, 65, 12, 40, 0, 0, 0}, +{71, 69, 12, 48, 0, 0, 0}, +{88, 68, 13, 128, 0, 0, 0}, +{71, 73, 68, 40, 0, 0, 0}, +{86, 88, 83, 128, 0, 0, 0}, +{89, 0, 48, 8, 64, 0, 0}, +{56, 0, 46, 112, 0, 0, 0}, +{68, 65, 68, 48, 0, 0, 0}, +{68, 69, 64, 48, 0, 0, 0}, +{62, 68, 72, 128, 0, 0, 0}, +{76, 65, 12, 40, 0, 0, 0}, +{76, 69, 12, 48, 0, 0, 0}, +{69, 68, 13, 128, 0, 0, 0}, +{34, 67, 64, 40, 0, 0, 0}, +{35, 64, 46, 40, 0, 0, 0}, +{34, 42, 68, 56, 0, 0, 0}, +{62, 92, 83, 128, 0, 0, 0}, +{34, 67, 64, 48, 0, 0, 0}, +{76, 65, 64, 40, 0, 0, 0}, +{76, 69, 68, 48, 0, 0, 0}, +{90, 69, 68, 128, 0, 0, 0}, +{51, 0, 42, 16, 0, 0, 0}, +{91, 0, 42, 16, 0, 0, 0}, +{91, 0, 20, 16, 0, 0, 0}, +{92, 0, 0, 16, 0, 0, 0}, +{93, 0, 34, 16, 0, 0, 0}, +{94, 0, 34, 16, 0, 0, 0}, +{34, 67, 64, 64, 0, 0, 0}, +{34, 73, 68, 64, 0, 0, 0}, +{71, 73, 68, 72, 0, 0, 0}, +{34, 73, 68, 80, 0, 0, 0}, +{62, 44, 83, 128, 0, 0, 0}, +{62, 46, 85, 128, 0, 0, 0}, +{62, 47, 85, 128, 0, 0, 0}, +{62, 73, 68, 128, 0, 0, 0}, +{34, 72, 68, 72, 0, 0, 0}, +{34, 71, 68, 72, 0, 0, 0}, +{34, 70, 68, 72, 0, 0, 0}, +{62, 70, 68, 128, 0, 0, 0}, +{34, 73, 68, 72, 0, 0, 0}, +{35, 47, 68, 72, 0, 0, 0}, +{62, 47, 68, 128, 0, 0, 0}, +{67, 88, 92, 128, 0, 0, 0}, +{73, 47, 13, 112, 0, 0, 0}, +{67, 88, 83, 136, 0, 0, 0}, +{67, 81, 68, 136, 0, 0, 0}, +{34, 73, 68, 152, 0, 0, 0}, +{62, 73, 68, 152, 0, 0, 0}, +{67, 81, 68, 152, 0, 0, 0}, +{35, 17, 11, 8, 0, 0, 0}, +{35, 15, 13, 80, 0, 0, 0}, +{35, 11, 17, 8, 0, 0, 0}, +{35, 17, 13, 80, 0, 0, 0}, +{67, 90, 83, 128, 0, 0, 0}, +{86, 87, 85, 128, 0, 0, 0}, +{71, 71, 68, 72, 0, 0, 0}, +{71, 72, 68, 72, 0, 0, 0}, +{71, 67, 64, 64, 0, 0, 0}, +{71, 73, 68, 64, 0, 0, 0}, +{71, 68, 26, 72, 0, 0, 0}, +{88, 68, 76, 128, 0, 0, 0}, +{71, 68, 27, 72, 0, 0, 0}, +{88, 68, 77, 128, 0, 0, 0}, +{95, 68, 18, 72, 0, 0, 0}, +{67, 68, 79, 128, 0, 0, 0}, +{71, 68, 18, 72, 0, 0, 0}, +{67, 68, 75, 128, 0, 0, 0}, +{67, 85, 73, 128, 0, 0, 0}, +{71, 24, 68, 72, 0, 0, 0}, +{95, 18, 68, 72, 0, 0, 0}, +{71, 73, 68, 144, 0, 0, 0}, +{86, 81, 68, 144, 0, 0, 0}, +{71, 73, 68, 80, 0, 0, 0}, +{71, 73, 68, 152, 0, 0, 0}, +{67, 73, 68, 152, 0, 0, 0}, +{96, 1, 65, 32, 0, 0, 0}, +{56, 1, 69, 48, 0, 0, 0}, +{97, 69, 81, 128, 0, 0, 0}, +{98, 0, 13, 112, 0, 0, 0}, +{56, 0, 44, 8, 0, 0, 0}, +{64, 0, 44, 128, 0, 0, 0}, +{56, 0, 42, 112, 0, 0, 0}, +{99, 75, 13, 8, 0, 0, 0}, +{98, 0, 17, 8, 0, 0, 0}, +{100, 67, 64, 96, 0, 0, 0} }; uint16_t CmpMnemonicOffsets[8] = { - 0, 9, 18, 27, 39, 49, 59, 69 +0, 9, 18, 27, 39, 49, 59, 69 }; uint16_t VCmpMnemonicOffsets[32] = { - 0, 10, 20, 30, 43, 54, 65, 76, 87, 100, 111, 122, 135, 149, 159, 169, 181, 194, 207, 220, 235, 249, 263, 277, 290, 303, 317, 331, 347, 361, 374, 387 -}; +0, 10, 20, 30, 43, 54, 65, 76, 87, 100, 111, 122, 135, 149, 159, 169, 181, 194, 207, 220, 235, 249, 263, 277, 290, 303, 317, 331, 347, 361, 374, 387 +}; \ No newline at end of file diff --git a/NativeCore/Dependencies/distorm/src/insts.h b/NativeCore/Dependencies/distorm/src/insts.h index 946cacde..77db087b 100644 --- a/NativeCore/Dependencies/distorm/src/insts.h +++ b/NativeCore/Dependencies/distorm/src/insts.h @@ -4,7 +4,7 @@ insts.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/mnemonics.c b/NativeCore/Dependencies/distorm/src/mnemonics.c index fa1c839e..7df13601 100644 --- a/NativeCore/Dependencies/distorm/src/mnemonics.c +++ b/NativeCore/Dependencies/distorm/src/mnemonics.c @@ -4,7 +4,7 @@ mnemonics.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -14,256 +14,284 @@ This library is licensed under the BSD license. See the file COPYING. #ifndef DISTORM_LIGHT const unsigned char _MNEMONICS[] = -"\x09" "undefined\0" "\x03" "add\0" "\x04" "push\0" "\x03" "pop\0" "\x02" "or\0" \ -"\x03" "adc\0" "\x03" "sbb\0" "\x03" "and\0" "\x03" "daa\0" "\x03" "sub\0" \ -"\x03" "das\0" "\x03" "xor\0" "\x03" "aaa\0" "\x03" "cmp\0" "\x03" "aas\0" \ -"\x03" "inc\0" "\x03" "dec\0" "\x05" "pusha\0" "\x04" "popa\0" "\x05" "bound\0" \ -"\x04" "arpl\0" "\x04" "imul\0" "\x03" "ins\0" "\x04" "outs\0" "\x02" "jo\0" \ -"\x03" "jno\0" "\x02" "jb\0" "\x03" "jae\0" "\x02" "jz\0" "\x03" "jnz\0" "\x03" "jbe\0" \ -"\x02" "ja\0" "\x02" "js\0" "\x03" "jns\0" "\x02" "jp\0" "\x03" "jnp\0" "\x02" "jl\0" \ -"\x03" "jge\0" "\x03" "jle\0" "\x02" "jg\0" "\x04" "test\0" "\x04" "xchg\0" \ -"\x03" "mov\0" "\x03" "lea\0" "\x03" "cbw\0" "\x04" "cwde\0" "\x04" "cdqe\0" \ -"\x03" "cwd\0" "\x03" "cdq\0" "\x03" "cqo\0" "\x08" "call far\0" "\x05" "pushf\0" \ -"\x04" "popf\0" "\x04" "sahf\0" "\x04" "lahf\0" "\x04" "movs\0" "\x04" "cmps\0" \ -"\x04" "stos\0" "\x04" "lods\0" "\x04" "scas\0" "\x03" "ret\0" "\x03" "les\0" \ -"\x03" "lds\0" "\x05" "enter\0" "\x05" "leave\0" "\x04" "retf\0" "\x05" "int 3\0" \ +"\x09" "undefined\0" "\x03" "add\0" "\x04" "push\0" "\x03" "pop\0" \ +"\x02" "or\0" "\x03" "adc\0" "\x03" "sbb\0" "\x03" "and\0" "\x03" "daa\0" \ +"\x03" "sub\0" "\x03" "das\0" "\x03" "xor\0" "\x03" "aaa\0" "\x03" "cmp\0" \ +"\x03" "aas\0" "\x03" "inc\0" "\x03" "dec\0" "\x05" "pusha\0" "\x04" "popa\0" \ +"\x05" "bound\0" "\x04" "arpl\0" "\x04" "imul\0" "\x03" "ins\0" "\x04" "outs\0" \ +"\x02" "jo\0" "\x03" "jno\0" "\x02" "jb\0" "\x03" "jae\0" "\x02" "jz\0" \ +"\x03" "jnz\0" "\x03" "jbe\0" "\x02" "ja\0" "\x02" "js\0" "\x03" "jns\0" \ +"\x02" "jp\0" "\x03" "jnp\0" "\x02" "jl\0" "\x03" "jge\0" "\x03" "jle\0" \ +"\x02" "jg\0" "\x04" "test\0" "\x04" "xchg\0" "\x03" "mov\0" "\x03" "lea\0" \ +"\x03" "cbw\0" "\x04" "cwde\0" "\x04" "cdqe\0" "\x03" "cwd\0" "\x03" "cdq\0" \ +"\x03" "cqo\0" "\x08" "call far\0" "\x05" "pushf\0" "\x04" "popf\0" \ +"\x04" "sahf\0" "\x04" "lahf\0" "\x04" "movs\0" "\x04" "cmps\0" "\x04" "stos\0" \ +"\x04" "lods\0" "\x04" "scas\0" "\x03" "ret\0" "\x03" "les\0" "\x03" "lds\0" \ +"\x05" "enter\0" "\x05" "leave\0" "\x04" "retf\0" "\x05" "int 3\0" \ "\x03" "int\0" "\x04" "into\0" "\x04" "iret\0" "\x03" "aam\0" "\x03" "aad\0" \ -"\x04" "salc\0" "\x04" "xlat\0" "\x06" "loopnz\0" "\x05" "loopz\0" "\x04" "loop\0" \ -"\x04" "jcxz\0" "\x05" "jecxz\0" "\x05" "jrcxz\0" "\x02" "in\0" "\x03" "out\0" \ -"\x04" "call\0" "\x03" "jmp\0" "\x07" "jmp far\0" "\x04" "int1\0" "\x03" "hlt\0" \ -"\x03" "cmc\0" "\x03" "clc\0" "\x03" "stc\0" "\x03" "cli\0" "\x03" "sti\0" \ -"\x03" "cld\0" "\x03" "std\0" "\x03" "lar\0" "\x03" "lsl\0" "\x07" "syscall\0" \ -"\x04" "clts\0" "\x06" "sysret\0" "\x04" "invd\0" "\x06" "wbinvd\0" "\x03" "ud2\0" \ -"\x05" "femms\0" "\x03" "nop\0" "\x05" "wrmsr\0" "\x05" "rdtsc\0" "\x05" "rdmsr\0" \ -"\x05" "rdpmc\0" "\x08" "sysenter\0" "\x07" "sysexit\0" "\x06" "getsec\0" "\x05" "cmovo\0" \ -"\x06" "cmovno\0" "\x05" "cmovb\0" "\x06" "cmovae\0" "\x05" "cmovz\0" "\x06" "cmovnz\0" \ -"\x06" "cmovbe\0" "\x05" "cmova\0" "\x05" "cmovs\0" "\x06" "cmovns\0" "\x05" "cmovp\0" \ -"\x06" "cmovnp\0" "\x05" "cmovl\0" "\x06" "cmovge\0" "\x06" "cmovle\0" "\x05" "cmovg\0" \ -"\x04" "seto\0" "\x05" "setno\0" "\x04" "setb\0" "\x05" "setae\0" "\x04" "setz\0" \ -"\x05" "setnz\0" "\x05" "setbe\0" "\x04" "seta\0" "\x04" "sets\0" "\x05" "setns\0" \ -"\x04" "setp\0" "\x05" "setnp\0" "\x04" "setl\0" "\x05" "setge\0" "\x05" "setle\0" \ -"\x04" "setg\0" "\x05" "cpuid\0" "\x02" "bt\0" "\x04" "shld\0" "\x03" "rsm\0" \ -"\x03" "bts\0" "\x04" "shrd\0" "\x07" "cmpxchg\0" "\x03" "lss\0" "\x03" "btr\0" \ -"\x03" "lfs\0" "\x03" "lgs\0" "\x05" "movzx\0" "\x03" "btc\0" "\x05" "movsx\0" \ -"\x04" "xadd\0" "\x06" "movnti\0" "\x05" "bswap\0" "\x03" "rol\0" "\x03" "ror\0" \ -"\x03" "rcl\0" "\x03" "rcr\0" "\x03" "shl\0" "\x03" "shr\0" "\x03" "sal\0" \ -"\x03" "sar\0" "\x06" "xabort\0" "\x06" "xbegin\0" "\x04" "fadd\0" "\x04" "fmul\0" \ -"\x04" "fcom\0" "\x05" "fcomp\0" "\x04" "fsub\0" "\x05" "fsubr\0" "\x04" "fdiv\0" \ -"\x05" "fdivr\0" "\x03" "fld\0" "\x03" "fst\0" "\x04" "fstp\0" "\x06" "fldenv\0" \ -"\x05" "fldcw\0" "\x04" "fxch\0" "\x04" "fnop\0" "\x04" "fchs\0" "\x04" "fabs\0" \ -"\x04" "ftst\0" "\x04" "fxam\0" "\x04" "fld1\0" "\x06" "fldl2t\0" "\x06" "fldl2e\0" \ -"\x05" "fldpi\0" "\x06" "fldlg2\0" "\x06" "fldln2\0" "\x04" "fldz\0" "\x05" "f2xm1\0" \ -"\x05" "fyl2x\0" "\x05" "fptan\0" "\x06" "fpatan\0" "\x07" "fxtract\0" "\x06" "fprem1\0" \ -"\x07" "fdecstp\0" "\x07" "fincstp\0" "\x05" "fprem\0" "\x07" "fyl2xp1\0" "\x05" "fsqrt\0" \ -"\x07" "fsincos\0" "\x07" "frndint\0" "\x06" "fscale\0" "\x04" "fsin\0" "\x04" "fcos\0" \ -"\x05" "fiadd\0" "\x05" "fimul\0" "\x05" "ficom\0" "\x06" "ficomp\0" "\x05" "fisub\0" \ -"\x06" "fisubr\0" "\x05" "fidiv\0" "\x06" "fidivr\0" "\x06" "fcmovb\0" "\x06" "fcmove\0" \ -"\x07" "fcmovbe\0" "\x06" "fcmovu\0" "\x07" "fucompp\0" "\x04" "fild\0" "\x06" "fisttp\0" \ -"\x04" "fist\0" "\x05" "fistp\0" "\x07" "fcmovnb\0" "\x07" "fcmovne\0" "\x08" "fcmovnbe\0" \ -"\x07" "fcmovnu\0" "\x04" "feni\0" "\x06" "fedisi\0" "\x06" "fsetpm\0" "\x06" "fucomi\0" \ -"\x05" "fcomi\0" "\x06" "frstor\0" "\x05" "ffree\0" "\x05" "fucom\0" "\x06" "fucomp\0" \ -"\x05" "faddp\0" "\x05" "fmulp\0" "\x06" "fcompp\0" "\x06" "fsubrp\0" "\x05" "fsubp\0" \ -"\x06" "fdivrp\0" "\x05" "fdivp\0" "\x04" "fbld\0" "\x05" "fbstp\0" "\x07" "fucomip\0" \ -"\x06" "fcomip\0" "\x03" "not\0" "\x03" "neg\0" "\x03" "mul\0" "\x03" "div\0" \ -"\x04" "idiv\0" "\x04" "sldt\0" "\x03" "str\0" "\x04" "lldt\0" "\x03" "ltr\0" \ -"\x04" "verr\0" "\x04" "verw\0" "\x04" "sgdt\0" "\x04" "sidt\0" "\x04" "lgdt\0" \ -"\x04" "lidt\0" "\x04" "smsw\0" "\x04" "lmsw\0" "\x06" "invlpg\0" "\x06" "vmcall\0" \ +"\x04" "salc\0" "\x04" "xlat\0" "\x06" "loopnz\0" "\x05" "loopz\0" \ +"\x04" "loop\0" "\x04" "jcxz\0" "\x05" "jecxz\0" "\x05" "jrcxz\0" "\x02" "in\0" \ +"\x03" "out\0" "\x04" "call\0" "\x03" "jmp\0" "\x07" "jmp far\0" "\x04" "int1\0" \ +"\x03" "hlt\0" "\x03" "cmc\0" "\x03" "clc\0" "\x03" "stc\0" "\x03" "cli\0" \ +"\x03" "sti\0" "\x03" "cld\0" "\x03" "std\0" "\x03" "lar\0" "\x03" "lsl\0" \ +"\x07" "syscall\0" "\x04" "clts\0" "\x06" "sysret\0" "\x04" "invd\0" \ +"\x06" "wbinvd\0" "\x03" "ud2\0" "\x05" "femms\0" "\x03" "nop\0" "\x05" "wrmsr\0" \ +"\x05" "rdtsc\0" "\x05" "rdmsr\0" "\x05" "rdpmc\0" "\x08" "sysenter\0" \ +"\x07" "sysexit\0" "\x06" "getsec\0" "\x05" "cmovo\0" "\x06" "cmovno\0" \ +"\x05" "cmovb\0" "\x06" "cmovae\0" "\x05" "cmovz\0" "\x06" "cmovnz\0" \ +"\x06" "cmovbe\0" "\x05" "cmova\0" "\x05" "cmovs\0" "\x06" "cmovns\0" \ +"\x05" "cmovp\0" "\x06" "cmovnp\0" "\x05" "cmovl\0" "\x06" "cmovge\0" \ +"\x06" "cmovle\0" "\x05" "cmovg\0" "\x04" "seto\0" "\x05" "setno\0" \ +"\x04" "setb\0" "\x05" "setae\0" "\x04" "setz\0" "\x05" "setnz\0" "\x05" "setbe\0" \ +"\x04" "seta\0" "\x04" "sets\0" "\x05" "setns\0" "\x04" "setp\0" "\x05" "setnp\0" \ +"\x04" "setl\0" "\x05" "setge\0" "\x05" "setle\0" "\x04" "setg\0" "\x05" "cpuid\0" \ +"\x02" "bt\0" "\x04" "shld\0" "\x03" "rsm\0" "\x03" "bts\0" "\x04" "shrd\0" \ +"\x07" "cmpxchg\0" "\x03" "lss\0" "\x03" "btr\0" "\x03" "lfs\0" "\x03" "lgs\0" \ +"\x05" "movzx\0" "\x03" "btc\0" "\x05" "movsx\0" "\x04" "xadd\0" "\x06" "movnti\0" \ +"\x05" "bswap\0" "\x03" "rol\0" "\x03" "ror\0" "\x03" "rcl\0" "\x03" "rcr\0" \ +"\x03" "shl\0" "\x03" "shr\0" "\x03" "sal\0" "\x03" "sar\0" "\x06" "xabort\0" \ +"\x06" "xbegin\0" "\x04" "fadd\0" "\x04" "fmul\0" "\x04" "fcom\0" "\x05" "fcomp\0" \ +"\x04" "fsub\0" "\x05" "fsubr\0" "\x04" "fdiv\0" "\x05" "fdivr\0" "\x03" "fld\0" \ +"\x03" "fst\0" "\x04" "fstp\0" "\x06" "fldenv\0" "\x05" "fldcw\0" "\x04" "fxch\0" \ +"\x04" "fnop\0" "\x04" "fchs\0" "\x04" "fabs\0" "\x04" "ftst\0" "\x04" "fxam\0" \ +"\x04" "fld1\0" "\x06" "fldl2t\0" "\x06" "fldl2e\0" "\x05" "fldpi\0" \ +"\x06" "fldlg2\0" "\x06" "fldln2\0" "\x04" "fldz\0" "\x05" "f2xm1\0" \ +"\x05" "fyl2x\0" "\x05" "fptan\0" "\x06" "fpatan\0" "\x07" "fxtract\0" \ +"\x06" "fprem1\0" "\x07" "fdecstp\0" "\x07" "fincstp\0" "\x05" "fprem\0" \ +"\x07" "fyl2xp1\0" "\x05" "fsqrt\0" "\x07" "fsincos\0" "\x07" "frndint\0" \ +"\x06" "fscale\0" "\x04" "fsin\0" "\x04" "fcos\0" "\x05" "fiadd\0" \ +"\x05" "fimul\0" "\x05" "ficom\0" "\x06" "ficomp\0" "\x05" "fisub\0" \ +"\x06" "fisubr\0" "\x05" "fidiv\0" "\x06" "fidivr\0" "\x06" "fcmovb\0" \ +"\x06" "fcmove\0" "\x07" "fcmovbe\0" "\x06" "fcmovu\0" "\x07" "fucompp\0" \ +"\x04" "fild\0" "\x06" "fisttp\0" "\x04" "fist\0" "\x05" "fistp\0" \ +"\x07" "fcmovnb\0" "\x07" "fcmovne\0" "\x08" "fcmovnbe\0" "\x07" "fcmovnu\0" \ +"\x04" "feni\0" "\x06" "fedisi\0" "\x06" "fsetpm\0" "\x06" "fucomi\0" \ +"\x05" "fcomi\0" "\x06" "frstor\0" "\x05" "ffree\0" "\x05" "fucom\0" \ +"\x06" "fucomp\0" "\x05" "faddp\0" "\x05" "fmulp\0" "\x06" "fcompp\0" \ +"\x06" "fsubrp\0" "\x05" "fsubp\0" "\x06" "fdivrp\0" "\x05" "fdivp\0" \ +"\x04" "fbld\0" "\x05" "fbstp\0" "\x07" "fucomip\0" "\x06" "fcomip\0" \ +"\x03" "not\0" "\x03" "neg\0" "\x03" "mul\0" "\x03" "div\0" "\x04" "idiv\0" \ +"\x04" "sldt\0" "\x03" "str\0" "\x04" "lldt\0" "\x03" "ltr\0" "\x04" "verr\0" \ +"\x04" "verw\0" "\x04" "sgdt\0" "\x04" "sidt\0" "\x04" "lgdt\0" "\x04" "lidt\0" \ +"\x04" "smsw\0" "\x04" "lmsw\0" "\x06" "invlpg\0" "\x06" "vmcall\0" \ "\x08" "vmlaunch\0" "\x08" "vmresume\0" "\x06" "vmxoff\0" "\x07" "monitor\0" \ -"\x05" "mwait\0" "\x06" "xgetbv\0" "\x06" "xsetbv\0" "\x06" "vmfunc\0" "\x04" "xend\0" \ -"\x05" "vmrun\0" "\x07" "vmmcall\0" "\x06" "vmload\0" "\x06" "vmsave\0" "\x04" "stgi\0" \ -"\x04" "clgi\0" "\x06" "skinit\0" "\x07" "invlpga\0" "\x06" "swapgs\0" "\x06" "rdtscp\0" \ -"\x08" "prefetch\0" "\x09" "prefetchw\0" "\x05" "pi2fw\0" "\x05" "pi2fd\0" \ -"\x05" "pf2iw\0" "\x05" "pf2id\0" "\x06" "pfnacc\0" "\x07" "pfpnacc\0" "\x07" "pfcmpge\0" \ -"\x05" "pfmin\0" "\x05" "pfrcp\0" "\x07" "pfrsqrt\0" "\x05" "pfsub\0" "\x05" "pfadd\0" \ -"\x07" "pfcmpgt\0" "\x05" "pfmax\0" "\x08" "pfrcpit1\0" "\x08" "pfrsqit1\0" \ -"\x06" "pfsubr\0" "\x05" "pfacc\0" "\x07" "pfcmpeq\0" "\x05" "pfmul\0" "\x08" "pfrcpit2\0" \ -"\x07" "pmulhrw\0" "\x06" "pswapd\0" "\x07" "pavgusb\0" "\x06" "movups\0" "\x06" "movupd\0" \ -"\x05" "movss\0" "\x05" "movsd\0" "\x07" "vmovups\0" "\x07" "vmovupd\0" "\x06" "vmovss\0" \ -"\x06" "vmovsd\0" "\x07" "movhlps\0" "\x06" "movlps\0" "\x06" "movlpd\0" "\x08" "movsldup\0" \ -"\x07" "movddup\0" "\x08" "vmovhlps\0" "\x07" "vmovlps\0" "\x07" "vmovlpd\0" \ -"\x09" "vmovsldup\0" "\x08" "vmovddup\0" "\x08" "unpcklps\0" "\x08" "unpcklpd\0" \ -"\x09" "vunpcklps\0" "\x09" "vunpcklpd\0" "\x08" "unpckhps\0" "\x08" "unpckhpd\0" \ -"\x09" "vunpckhps\0" "\x09" "vunpckhpd\0" "\x07" "movlhps\0" "\x06" "movhps\0" \ -"\x06" "movhpd\0" "\x08" "movshdup\0" "\x08" "vmovlhps\0" "\x07" "vmovhps\0" \ -"\x07" "vmovhpd\0" "\x09" "vmovshdup\0" "\x0b" "prefetchnta\0" "\x0a" "prefetcht0\0" \ -"\x0a" "prefetcht1\0" "\x0a" "prefetcht2\0" "\x06" "movaps\0" "\x06" "movapd\0" \ -"\x07" "vmovaps\0" "\x07" "vmovapd\0" "\x08" "cvtpi2ps\0" "\x08" "cvtpi2pd\0" \ -"\x08" "cvtsi2ss\0" "\x08" "cvtsi2sd\0" "\x09" "vcvtsi2ss\0" "\x09" "vcvtsi2sd\0" \ -"\x07" "movntps\0" "\x07" "movntpd\0" "\x07" "movntss\0" "\x07" "movntsd\0" \ -"\x08" "vmovntps\0" "\x08" "vmovntpd\0" "\x09" "cvttps2pi\0" "\x09" "cvttpd2pi\0" \ -"\x09" "cvttss2si\0" "\x09" "cvttsd2si\0" "\x0a" "vcvttss2si\0" "\x0a" "vcvttsd2si\0" \ -"\x08" "cvtps2pi\0" "\x08" "cvtpd2pi\0" "\x08" "cvtss2si\0" "\x08" "cvtsd2si\0" \ -"\x09" "vcvtss2si\0" "\x09" "vcvtsd2si\0" "\x07" "ucomiss\0" "\x07" "ucomisd\0" \ -"\x08" "vucomiss\0" "\x08" "vucomisd\0" "\x06" "comiss\0" "\x06" "comisd\0" \ -"\x07" "vcomiss\0" "\x07" "vcomisd\0" "\x08" "movmskps\0" "\x08" "movmskpd\0" \ -"\x09" "vmovmskps\0" "\x09" "vmovmskpd\0" "\x06" "sqrtps\0" "\x06" "sqrtpd\0" \ -"\x06" "sqrtss\0" "\x06" "sqrtsd\0" "\x07" "vsqrtps\0" "\x07" "vsqrtpd\0" "\x07" "vsqrtss\0" \ -"\x07" "vsqrtsd\0" "\x07" "rsqrtps\0" "\x07" "rsqrtss\0" "\x08" "vrsqrtps\0" \ -"\x08" "vrsqrtss\0" "\x05" "rcpps\0" "\x05" "rcpss\0" "\x06" "vrcpps\0" "\x06" "vrcpss\0" \ -"\x05" "andps\0" "\x05" "andpd\0" "\x06" "vandps\0" "\x06" "vandpd\0" "\x06" "andnps\0" \ -"\x06" "andnpd\0" "\x07" "vandnps\0" "\x07" "vandnpd\0" "\x04" "orps\0" "\x04" "orpd\0" \ -"\x05" "vorps\0" "\x05" "vorpd\0" "\x05" "xorps\0" "\x05" "xorpd\0" "\x06" "vxorps\0" \ -"\x06" "vxorpd\0" "\x05" "addps\0" "\x05" "addpd\0" "\x05" "addss\0" "\x05" "addsd\0" \ -"\x06" "vaddps\0" "\x06" "vaddpd\0" "\x06" "vaddss\0" "\x06" "vaddsd\0" "\x05" "mulps\0" \ -"\x05" "mulpd\0" "\x05" "mulss\0" "\x05" "mulsd\0" "\x06" "vmulps\0" "\x06" "vmulpd\0" \ -"\x06" "vmulss\0" "\x06" "vmulsd\0" "\x08" "cvtps2pd\0" "\x08" "cvtpd2ps\0" \ -"\x08" "cvtss2sd\0" "\x08" "cvtsd2ss\0" "\x09" "vcvtps2pd\0" "\x09" "vcvtpd2ps\0" \ -"\x09" "vcvtss2sd\0" "\x09" "vcvtsd2ss\0" "\x08" "cvtdq2ps\0" "\x08" "cvtps2dq\0" \ -"\x09" "cvttps2dq\0" "\x09" "vcvtdq2ps\0" "\x09" "vcvtps2dq\0" "\x0a" "vcvttps2dq\0" \ -"\x05" "subps\0" "\x05" "subpd\0" "\x05" "subss\0" "\x05" "subsd\0" "\x06" "vsubps\0" \ -"\x06" "vsubpd\0" "\x06" "vsubss\0" "\x06" "vsubsd\0" "\x05" "minps\0" "\x05" "minpd\0" \ -"\x05" "minss\0" "\x05" "minsd\0" "\x06" "vminps\0" "\x06" "vminpd\0" "\x06" "vminss\0" \ -"\x06" "vminsd\0" "\x05" "divps\0" "\x05" "divpd\0" "\x05" "divss\0" "\x05" "divsd\0" \ -"\x06" "vdivps\0" "\x06" "vdivpd\0" "\x06" "vdivss\0" "\x06" "vdivsd\0" "\x05" "maxps\0" \ -"\x05" "maxpd\0" "\x05" "maxss\0" "\x05" "maxsd\0" "\x06" "vmaxps\0" "\x06" "vmaxpd\0" \ -"\x06" "vmaxss\0" "\x06" "vmaxsd\0" "\x09" "punpcklbw\0" "\x0a" "vpunpcklbw\0" \ -"\x09" "punpcklwd\0" "\x0a" "vpunpcklwd\0" "\x09" "punpckldq\0" "\x0a" "vpunpckldq\0" \ -"\x08" "packsswb\0" "\x09" "vpacksswb\0" "\x07" "pcmpgtb\0" "\x08" "vpcmpgtb\0" \ -"\x07" "pcmpgtw\0" "\x08" "vpcmpgtw\0" "\x07" "pcmpgtd\0" "\x08" "vpcmpgtd\0" \ -"\x08" "packuswb\0" "\x09" "vpackuswb\0" "\x09" "punpckhbw\0" "\x0a" "vpunpckhbw\0" \ -"\x09" "punpckhwd\0" "\x0a" "vpunpckhwd\0" "\x09" "punpckhdq\0" "\x0a" "vpunpckhdq\0" \ -"\x08" "packssdw\0" "\x09" "vpackssdw\0" "\x0a" "punpcklqdq\0" "\x0b" "vpunpcklqdq\0" \ -"\x0a" "punpckhqdq\0" "\x0b" "vpunpckhqdq\0" "\x04" "movd\0" "\x04" "movq\0" \ -"\x05" "vmovd\0" "\x05" "vmovq\0" "\x06" "movdqa\0" "\x06" "movdqu\0" "\x07" "vmovdqa\0" \ -"\x07" "vmovdqu\0" "\x06" "pshufw\0" "\x06" "pshufd\0" "\x07" "pshufhw\0" "\x07" "pshuflw\0" \ -"\x07" "vpshufd\0" "\x08" "vpshufhw\0" "\x08" "vpshuflw\0" "\x07" "pcmpeqb\0" \ -"\x08" "vpcmpeqb\0" "\x07" "pcmpeqw\0" "\x08" "vpcmpeqw\0" "\x07" "pcmpeqd\0" \ -"\x08" "vpcmpeqd\0" "\x04" "emms\0" "\x0a" "vzeroupper\0" "\x08" "vzeroall\0" \ -"\x06" "vmread\0" "\x05" "extrq\0" "\x07" "insertq\0" "\x07" "vmwrite\0" "\x08" "cvtph2ps\0" \ -"\x08" "cvtps2ph\0" "\x06" "haddpd\0" "\x06" "haddps\0" "\x07" "vhaddpd\0" \ -"\x07" "vhaddps\0" "\x06" "hsubpd\0" "\x06" "hsubps\0" "\x07" "vhsubpd\0" "\x07" "vhsubps\0" \ -"\x05" "xsave\0" "\x07" "xsave64\0" "\x06" "lfence\0" "\x06" "xrstor\0" "\x08" "xrstor64\0" \ +"\x05" "mwait\0" "\x06" "xgetbv\0" "\x06" "xsetbv\0" "\x06" "vmfunc\0" \ +"\x04" "xend\0" "\x05" "vmrun\0" "\x07" "vmmcall\0" "\x06" "vmload\0" \ +"\x06" "vmsave\0" "\x04" "stgi\0" "\x04" "clgi\0" "\x06" "skinit\0" \ +"\x07" "invlpga\0" "\x06" "swapgs\0" "\x06" "rdtscp\0" "\x08" "prefetch\0" \ +"\x09" "prefetchw\0" "\x05" "pi2fw\0" "\x05" "pi2fd\0" "\x05" "pf2iw\0" \ +"\x05" "pf2id\0" "\x06" "pfnacc\0" "\x07" "pfpnacc\0" "\x07" "pfcmpge\0" \ +"\x05" "pfmin\0" "\x05" "pfrcp\0" "\x07" "pfrsqrt\0" "\x05" "pfsub\0" \ +"\x05" "pfadd\0" "\x07" "pfcmpgt\0" "\x05" "pfmax\0" "\x08" "pfrcpit1\0" \ +"\x08" "pfrsqit1\0" "\x06" "pfsubr\0" "\x05" "pfacc\0" "\x07" "pfcmpeq\0" \ +"\x05" "pfmul\0" "\x08" "pfrcpit2\0" "\x07" "pmulhrw\0" "\x06" "pswapd\0" \ +"\x07" "pavgusb\0" "\x06" "movups\0" "\x06" "movupd\0" "\x05" "movss\0" \ +"\x05" "movsd\0" "\x07" "vmovups\0" "\x07" "vmovupd\0" "\x06" "vmovss\0" \ +"\x06" "vmovsd\0" "\x07" "movhlps\0" "\x06" "movlps\0" "\x06" "movlpd\0" \ +"\x08" "movsldup\0" "\x07" "movddup\0" "\x08" "vmovhlps\0" "\x07" "vmovlps\0" \ +"\x07" "vmovlpd\0" "\x09" "vmovsldup\0" "\x08" "vmovddup\0" "\x08" "unpcklps\0" \ +"\x08" "unpcklpd\0" "\x09" "vunpcklps\0" "\x09" "vunpcklpd\0" "\x08" "unpckhps\0" \ +"\x08" "unpckhpd\0" "\x09" "vunpckhps\0" "\x09" "vunpckhpd\0" "\x07" "movlhps\0" \ +"\x06" "movhps\0" "\x06" "movhpd\0" "\x08" "movshdup\0" "\x08" "vmovlhps\0" \ +"\x07" "vmovhps\0" "\x07" "vmovhpd\0" "\x09" "vmovshdup\0" "\x0b" "prefetchnta\0" \ +"\x0a" "prefetcht0\0" "\x0a" "prefetcht1\0" "\x0a" "prefetcht2\0" "\x06" "movaps\0" \ +"\x06" "movapd\0" "\x07" "vmovaps\0" "\x07" "vmovapd\0" "\x08" "cvtpi2ps\0" \ +"\x08" "cvtpi2pd\0" "\x08" "cvtsi2ss\0" "\x08" "cvtsi2sd\0" "\x09" "vcvtsi2ss\0" \ +"\x09" "vcvtsi2sd\0" "\x07" "movntps\0" "\x07" "movntpd\0" "\x07" "movntss\0" \ +"\x07" "movntsd\0" "\x08" "vmovntps\0" "\x08" "vmovntpd\0" "\x09" "cvttps2pi\0" \ +"\x09" "cvttpd2pi\0" "\x09" "cvttss2si\0" "\x09" "cvttsd2si\0" "\x0a" "vcvttss2si\0" \ +"\x0a" "vcvttsd2si\0" "\x08" "cvtps2pi\0" "\x08" "cvtpd2pi\0" "\x08" "cvtss2si\0" \ +"\x08" "cvtsd2si\0" "\x09" "vcvtss2si\0" "\x09" "vcvtsd2si\0" "\x07" "ucomiss\0" \ +"\x07" "ucomisd\0" "\x08" "vucomiss\0" "\x08" "vucomisd\0" "\x06" "comiss\0" \ +"\x06" "comisd\0" "\x07" "vcomiss\0" "\x07" "vcomisd\0" "\x08" "movmskps\0" \ +"\x08" "movmskpd\0" "\x09" "vmovmskps\0" "\x09" "vmovmskpd\0" "\x06" "sqrtps\0" \ +"\x06" "sqrtpd\0" "\x06" "sqrtss\0" "\x06" "sqrtsd\0" "\x07" "vsqrtps\0" \ +"\x07" "vsqrtpd\0" "\x07" "vsqrtss\0" "\x07" "vsqrtsd\0" "\x07" "rsqrtps\0" \ +"\x07" "rsqrtss\0" "\x08" "vrsqrtps\0" "\x08" "vrsqrtss\0" "\x05" "rcpps\0" \ +"\x05" "rcpss\0" "\x06" "vrcpps\0" "\x06" "vrcpss\0" "\x05" "andps\0" \ +"\x05" "andpd\0" "\x06" "vandps\0" "\x06" "vandpd\0" "\x06" "andnps\0" \ +"\x06" "andnpd\0" "\x07" "vandnps\0" "\x07" "vandnpd\0" "\x04" "orps\0" \ +"\x04" "orpd\0" "\x05" "vorps\0" "\x05" "vorpd\0" "\x05" "xorps\0" \ +"\x05" "xorpd\0" "\x06" "vxorps\0" "\x06" "vxorpd\0" "\x05" "addps\0" \ +"\x05" "addpd\0" "\x05" "addss\0" "\x05" "addsd\0" "\x06" "vaddps\0" \ +"\x06" "vaddpd\0" "\x06" "vaddss\0" "\x06" "vaddsd\0" "\x05" "mulps\0" \ +"\x05" "mulpd\0" "\x05" "mulss\0" "\x05" "mulsd\0" "\x06" "vmulps\0" \ +"\x06" "vmulpd\0" "\x06" "vmulss\0" "\x06" "vmulsd\0" "\x08" "cvtps2pd\0" \ +"\x08" "cvtpd2ps\0" "\x08" "cvtss2sd\0" "\x08" "cvtsd2ss\0" "\x09" "vcvtps2pd\0" \ +"\x09" "vcvtpd2ps\0" "\x09" "vcvtss2sd\0" "\x09" "vcvtsd2ss\0" "\x08" "cvtdq2ps\0" \ +"\x08" "cvtps2dq\0" "\x09" "cvttps2dq\0" "\x09" "vcvtdq2ps\0" "\x09" "vcvtps2dq\0" \ +"\x0a" "vcvttps2dq\0" "\x05" "subps\0" "\x05" "subpd\0" "\x05" "subss\0" \ +"\x05" "subsd\0" "\x06" "vsubps\0" "\x06" "vsubpd\0" "\x06" "vsubss\0" \ +"\x06" "vsubsd\0" "\x05" "minps\0" "\x05" "minpd\0" "\x05" "minss\0" \ +"\x05" "minsd\0" "\x06" "vminps\0" "\x06" "vminpd\0" "\x06" "vminss\0" \ +"\x06" "vminsd\0" "\x05" "divps\0" "\x05" "divpd\0" "\x05" "divss\0" \ +"\x05" "divsd\0" "\x06" "vdivps\0" "\x06" "vdivpd\0" "\x06" "vdivss\0" \ +"\x06" "vdivsd\0" "\x05" "maxps\0" "\x05" "maxpd\0" "\x05" "maxss\0" \ +"\x05" "maxsd\0" "\x06" "vmaxps\0" "\x06" "vmaxpd\0" "\x06" "vmaxss\0" \ +"\x06" "vmaxsd\0" "\x09" "punpcklbw\0" "\x0a" "vpunpcklbw\0" "\x09" "punpcklwd\0" \ +"\x0a" "vpunpcklwd\0" "\x09" "punpckldq\0" "\x0a" "vpunpckldq\0" "\x08" "packsswb\0" \ +"\x09" "vpacksswb\0" "\x07" "pcmpgtb\0" "\x08" "vpcmpgtb\0" "\x07" "pcmpgtw\0" \ +"\x08" "vpcmpgtw\0" "\x07" "pcmpgtd\0" "\x08" "vpcmpgtd\0" "\x08" "packuswb\0" \ +"\x09" "vpackuswb\0" "\x09" "punpckhbw\0" "\x0a" "vpunpckhbw\0" "\x09" "punpckhwd\0" \ +"\x0a" "vpunpckhwd\0" "\x09" "punpckhdq\0" "\x0a" "vpunpckhdq\0" "\x08" "packssdw\0" \ +"\x09" "vpackssdw\0" "\x0a" "punpcklqdq\0" "\x0b" "vpunpcklqdq\0" "\x0a" "punpckhqdq\0" \ +"\x0b" "vpunpckhqdq\0" "\x04" "movd\0" "\x04" "movq\0" "\x05" "vmovd\0" \ +"\x05" "vmovq\0" "\x06" "movdqa\0" "\x06" "movdqu\0" "\x07" "vmovdqa\0" \ +"\x07" "vmovdqu\0" "\x06" "pshufw\0" "\x06" "pshufd\0" "\x07" "pshufhw\0" \ +"\x07" "pshuflw\0" "\x07" "vpshufd\0" "\x08" "vpshufhw\0" "\x08" "vpshuflw\0" \ +"\x07" "pcmpeqb\0" "\x08" "vpcmpeqb\0" "\x07" "pcmpeqw\0" "\x08" "vpcmpeqw\0" \ +"\x07" "pcmpeqd\0" "\x08" "vpcmpeqd\0" "\x04" "emms\0" "\x0a" "vzeroupper\0" \ +"\x08" "vzeroall\0" "\x06" "vmread\0" "\x05" "extrq\0" "\x07" "insertq\0" \ +"\x07" "vmwrite\0" "\x08" "cvtph2ps\0" "\x08" "cvtps2ph\0" "\x06" "haddpd\0" \ +"\x06" "haddps\0" "\x07" "vhaddpd\0" "\x07" "vhaddps\0" "\x06" "hsubpd\0" \ +"\x06" "hsubps\0" "\x07" "vhsubpd\0" "\x07" "vhsubps\0" "\x05" "xsave\0" \ +"\x07" "xsave64\0" "\x06" "lfence\0" "\x06" "xrstor\0" "\x08" "xrstor64\0" \ "\x06" "mfence\0" "\x08" "xsaveopt\0" "\x0a" "xsaveopt64\0" "\x06" "sfence\0" \ -"\x07" "clflush\0" "\x06" "popcnt\0" "\x03" "bsf\0" "\x05" "tzcnt\0" "\x03" "bsr\0" \ -"\x05" "lzcnt\0" "\x07" "cmpeqps\0" "\x07" "cmpltps\0" "\x07" "cmpleps\0" "\x0a" "cmpunordps\0" \ -"\x08" "cmpneqps\0" "\x08" "cmpnltps\0" "\x08" "cmpnleps\0" "\x08" "cmpordps\0" \ -"\x07" "cmpeqpd\0" "\x07" "cmpltpd\0" "\x07" "cmplepd\0" "\x0a" "cmpunordpd\0" \ -"\x08" "cmpneqpd\0" "\x08" "cmpnltpd\0" "\x08" "cmpnlepd\0" "\x08" "cmpordpd\0" \ -"\x07" "cmpeqss\0" "\x07" "cmpltss\0" "\x07" "cmpless\0" "\x0a" "cmpunordss\0" \ -"\x08" "cmpneqss\0" "\x08" "cmpnltss\0" "\x08" "cmpnless\0" "\x08" "cmpordss\0" \ -"\x07" "cmpeqsd\0" "\x07" "cmpltsd\0" "\x07" "cmplesd\0" "\x0a" "cmpunordsd\0" \ -"\x08" "cmpneqsd\0" "\x08" "cmpnltsd\0" "\x08" "cmpnlesd\0" "\x08" "cmpordsd\0" \ -"\x08" "vcmpeqps\0" "\x08" "vcmpltps\0" "\x08" "vcmpleps\0" "\x0b" "vcmpunordps\0" \ -"\x09" "vcmpneqps\0" "\x09" "vcmpnltps\0" "\x09" "vcmpnleps\0" "\x09" "vcmpordps\0" \ -"\x0b" "vcmpeq_uqps\0" "\x09" "vcmpngeps\0" "\x09" "vcmpngtps\0" "\x0b" "vcmpfalseps\0" \ -"\x0c" "vcmpneq_oqps\0" "\x08" "vcmpgeps\0" "\x08" "vcmpgtps\0" "\x0a" "vcmptrueps\0" \ -"\x0b" "vcmpeq_osps\0" "\x0b" "vcmplt_oqps\0" "\x0b" "vcmple_oqps\0" "\x0d" "vcmpunord_sps\0" \ -"\x0c" "vcmpneq_usps\0" "\x0c" "vcmpnlt_uqps\0" "\x0c" "vcmpnle_uqps\0" "\x0b" "vcmpord_sps\0" \ -"\x0b" "vcmpeq_usps\0" "\x0c" "vcmpnge_uqps\0" "\x0c" "vcmpngt_uqps\0" "\x0e" "vcmpfalse_osps\0" \ -"\x0c" "vcmpneq_osps\0" "\x0b" "vcmpge_oqps\0" "\x0b" "vcmpgt_oqps\0" "\x0d" "vcmptrue_usps\0" \ -"\x08" "vcmpeqpd\0" "\x08" "vcmpltpd\0" "\x08" "vcmplepd\0" "\x0b" "vcmpunordpd\0" \ -"\x09" "vcmpneqpd\0" "\x09" "vcmpnltpd\0" "\x09" "vcmpnlepd\0" "\x09" "vcmpordpd\0" \ -"\x0b" "vcmpeq_uqpd\0" "\x09" "vcmpngepd\0" "\x09" "vcmpngtpd\0" "\x0b" "vcmpfalsepd\0" \ -"\x0c" "vcmpneq_oqpd\0" "\x08" "vcmpgepd\0" "\x08" "vcmpgtpd\0" "\x0a" "vcmptruepd\0" \ -"\x0b" "vcmpeq_ospd\0" "\x0b" "vcmplt_oqpd\0" "\x0b" "vcmple_oqpd\0" "\x0d" "vcmpunord_spd\0" \ -"\x0c" "vcmpneq_uspd\0" "\x0c" "vcmpnlt_uqpd\0" "\x0c" "vcmpnle_uqpd\0" "\x0b" "vcmpord_spd\0" \ -"\x0b" "vcmpeq_uspd\0" "\x0c" "vcmpnge_uqpd\0" "\x0c" "vcmpngt_uqpd\0" "\x0e" "vcmpfalse_ospd\0" \ -"\x0c" "vcmpneq_ospd\0" "\x0b" "vcmpge_oqpd\0" "\x0b" "vcmpgt_oqpd\0" "\x0d" "vcmptrue_uspd\0" \ -"\x08" "vcmpeqss\0" "\x08" "vcmpltss\0" "\x08" "vcmpless\0" "\x0b" "vcmpunordss\0" \ -"\x09" "vcmpneqss\0" "\x09" "vcmpnltss\0" "\x09" "vcmpnless\0" "\x09" "vcmpordss\0" \ -"\x0b" "vcmpeq_uqss\0" "\x09" "vcmpngess\0" "\x09" "vcmpngtss\0" "\x0b" "vcmpfalsess\0" \ -"\x0c" "vcmpneq_oqss\0" "\x08" "vcmpgess\0" "\x08" "vcmpgtss\0" "\x0a" "vcmptruess\0" \ -"\x0b" "vcmpeq_osss\0" "\x0b" "vcmplt_oqss\0" "\x0b" "vcmple_oqss\0" "\x0d" "vcmpunord_sss\0" \ -"\x0c" "vcmpneq_usss\0" "\x0c" "vcmpnlt_uqss\0" "\x0c" "vcmpnle_uqss\0" "\x0b" "vcmpord_sss\0" \ -"\x0b" "vcmpeq_usss\0" "\x0c" "vcmpnge_uqss\0" "\x0c" "vcmpngt_uqss\0" "\x0e" "vcmpfalse_osss\0" \ -"\x0c" "vcmpneq_osss\0" "\x0b" "vcmpge_oqss\0" "\x0b" "vcmpgt_oqss\0" "\x0d" "vcmptrue_usss\0" \ -"\x08" "vcmpeqsd\0" "\x08" "vcmpltsd\0" "\x08" "vcmplesd\0" "\x0b" "vcmpunordsd\0" \ -"\x09" "vcmpneqsd\0" "\x09" "vcmpnltsd\0" "\x09" "vcmpnlesd\0" "\x09" "vcmpordsd\0" \ -"\x0b" "vcmpeq_uqsd\0" "\x09" "vcmpngesd\0" "\x09" "vcmpngtsd\0" "\x0b" "vcmpfalsesd\0" \ -"\x0c" "vcmpneq_oqsd\0" "\x08" "vcmpgesd\0" "\x08" "vcmpgtsd\0" "\x0a" "vcmptruesd\0" \ -"\x0b" "vcmpeq_ossd\0" "\x0b" "vcmplt_oqsd\0" "\x0b" "vcmple_oqsd\0" "\x0d" "vcmpunord_ssd\0" \ -"\x0c" "vcmpneq_ussd\0" "\x0c" "vcmpnlt_uqsd\0" "\x0c" "vcmpnle_uqsd\0" "\x0b" "vcmpord_ssd\0" \ -"\x0b" "vcmpeq_ussd\0" "\x0c" "vcmpnge_uqsd\0" "\x0c" "vcmpngt_uqsd\0" "\x0e" "vcmpfalse_ossd\0" \ -"\x0c" "vcmpneq_ossd\0" "\x0b" "vcmpge_oqsd\0" "\x0b" "vcmpgt_oqsd\0" "\x0d" "vcmptrue_ussd\0" \ -"\x06" "pinsrw\0" "\x07" "vpinsrw\0" "\x06" "pextrw\0" "\x07" "vpextrw\0" "\x06" "shufps\0" \ -"\x06" "shufpd\0" "\x07" "vshufps\0" "\x07" "vshufpd\0" "\x09" "cmpxchg8b\0" \ -"\x0a" "cmpxchg16b\0" "\x07" "vmptrst\0" "\x08" "addsubpd\0" "\x08" "addsubps\0" \ -"\x09" "vaddsubpd\0" "\x09" "vaddsubps\0" "\x05" "psrlw\0" "\x06" "vpsrlw\0" \ -"\x05" "psrld\0" "\x06" "vpsrld\0" "\x05" "psrlq\0" "\x06" "vpsrlq\0" "\x05" "paddq\0" \ -"\x06" "vpaddq\0" "\x06" "pmullw\0" "\x07" "vpmullw\0" "\x07" "movq2dq\0" "\x07" "movdq2q\0" \ -"\x08" "pmovmskb\0" "\x09" "vpmovmskb\0" "\x07" "psubusb\0" "\x08" "vpsubusb\0" \ -"\x07" "psubusw\0" "\x08" "vpsubusw\0" "\x06" "pminub\0" "\x07" "vpminub\0" \ -"\x04" "pand\0" "\x05" "vpand\0" "\x07" "paddusb\0" "\x08" "vpaddusw\0" "\x07" "paddusw\0" \ -"\x06" "pmaxub\0" "\x07" "vpmaxub\0" "\x05" "pandn\0" "\x06" "vpandn\0" "\x05" "pavgb\0" \ -"\x06" "vpavgb\0" "\x05" "psraw\0" "\x06" "vpsraw\0" "\x05" "psrad\0" "\x06" "vpsrad\0" \ -"\x05" "pavgw\0" "\x06" "vpavgw\0" "\x07" "pmulhuw\0" "\x08" "vpmulhuw\0" "\x06" "pmulhw\0" \ -"\x07" "vpmulhw\0" "\x09" "cvttpd2dq\0" "\x08" "cvtdq2pd\0" "\x08" "cvtpd2dq\0" \ -"\x0a" "vcvttpd2dq\0" "\x09" "vcvtdq2pd\0" "\x09" "vcvtpd2dq\0" "\x06" "movntq\0" \ -"\x07" "movntdq\0" "\x08" "vmovntdq\0" "\x06" "psubsb\0" "\x07" "vpsubsb\0" \ -"\x06" "psubsw\0" "\x07" "vpsubsw\0" "\x06" "pminsw\0" "\x07" "vpminsw\0" "\x03" "por\0" \ -"\x04" "vpor\0" "\x06" "paddsb\0" "\x07" "vpaddsb\0" "\x06" "paddsw\0" "\x07" "vpaddsw\0" \ -"\x06" "pmaxsw\0" "\x07" "vpmaxsw\0" "\x04" "pxor\0" "\x05" "vpxor\0" "\x05" "lddqu\0" \ -"\x06" "vlddqu\0" "\x05" "psllw\0" "\x06" "vpsllw\0" "\x05" "pslld\0" "\x06" "vpslld\0" \ -"\x05" "psllq\0" "\x06" "vpsllq\0" "\x07" "pmuludq\0" "\x08" "vpmuludq\0" "\x07" "pmaddwd\0" \ -"\x08" "vpmaddwd\0" "\x06" "psadbw\0" "\x07" "vpsadbw\0" "\x08" "maskmovq\0" \ -"\x0a" "maskmovdqu\0" "\x0b" "vmaskmovdqu\0" "\x05" "psubb\0" "\x06" "vpsubb\0" \ -"\x05" "psubw\0" "\x06" "vpsubw\0" "\x05" "psubd\0" "\x06" "vpsubd\0" "\x05" "psubq\0" \ -"\x06" "vpsubq\0" "\x05" "paddb\0" "\x06" "vpaddb\0" "\x05" "paddw\0" "\x06" "vpaddw\0" \ -"\x05" "paddd\0" "\x06" "vpaddd\0" "\x07" "fnstenv\0" "\x06" "fstenv\0" "\x06" "fnstcw\0" \ -"\x05" "fstcw\0" "\x06" "fnclex\0" "\x05" "fclex\0" "\x06" "fninit\0" "\x05" "finit\0" \ -"\x06" "fnsave\0" "\x05" "fsave\0" "\x06" "fnstsw\0" "\x05" "fstsw\0" "\x06" "pshufb\0" \ -"\x07" "vpshufb\0" "\x06" "phaddw\0" "\x07" "vphaddw\0" "\x06" "phaddd\0" "\x07" "vphaddd\0" \ +"\x07" "clflush\0" "\x06" "popcnt\0" "\x03" "bsf\0" "\x05" "tzcnt\0" \ +"\x03" "bsr\0" "\x05" "lzcnt\0" "\x07" "cmpeqps\0" "\x07" "cmpltps\0" \ +"\x07" "cmpleps\0" "\x0a" "cmpunordps\0" "\x08" "cmpneqps\0" "\x08" "cmpnltps\0" \ +"\x08" "cmpnleps\0" "\x08" "cmpordps\0" "\x07" "cmpeqpd\0" "\x07" "cmpltpd\0" \ +"\x07" "cmplepd\0" "\x0a" "cmpunordpd\0" "\x08" "cmpneqpd\0" "\x08" "cmpnltpd\0" \ +"\x08" "cmpnlepd\0" "\x08" "cmpordpd\0" "\x07" "cmpeqss\0" "\x07" "cmpltss\0" \ +"\x07" "cmpless\0" "\x0a" "cmpunordss\0" "\x08" "cmpneqss\0" "\x08" "cmpnltss\0" \ +"\x08" "cmpnless\0" "\x08" "cmpordss\0" "\x07" "cmpeqsd\0" "\x07" "cmpltsd\0" \ +"\x07" "cmplesd\0" "\x0a" "cmpunordsd\0" "\x08" "cmpneqsd\0" "\x08" "cmpnltsd\0" \ +"\x08" "cmpnlesd\0" "\x08" "cmpordsd\0" "\x08" "vcmpeqps\0" "\x08" "vcmpltps\0" \ +"\x08" "vcmpleps\0" "\x0b" "vcmpunordps\0" "\x09" "vcmpneqps\0" "\x09" "vcmpnltps\0" \ +"\x09" "vcmpnleps\0" "\x09" "vcmpordps\0" "\x0b" "vcmpeq_uqps\0" "\x09" "vcmpngeps\0" \ +"\x09" "vcmpngtps\0" "\x0b" "vcmpfalseps\0" "\x0c" "vcmpneq_oqps\0" "\x08" "vcmpgeps\0" \ +"\x08" "vcmpgtps\0" "\x0a" "vcmptrueps\0" "\x0b" "vcmpeq_osps\0" "\x0b" "vcmplt_oqps\0" \ +"\x0b" "vcmple_oqps\0" "\x0d" "vcmpunord_sps\0" "\x0c" "vcmpneq_usps\0" \ +"\x0c" "vcmpnlt_uqps\0" "\x0c" "vcmpnle_uqps\0" "\x0b" "vcmpord_sps\0" \ +"\x0b" "vcmpeq_usps\0" "\x0c" "vcmpnge_uqps\0" "\x0c" "vcmpngt_uqps\0" \ +"\x0e" "vcmpfalse_osps\0" "\x0c" "vcmpneq_osps\0" "\x0b" "vcmpge_oqps\0" \ +"\x0b" "vcmpgt_oqps\0" "\x0d" "vcmptrue_usps\0" "\x08" "vcmpeqpd\0" "\x08" "vcmpltpd\0" \ +"\x08" "vcmplepd\0" "\x0b" "vcmpunordpd\0" "\x09" "vcmpneqpd\0" "\x09" "vcmpnltpd\0" \ +"\x09" "vcmpnlepd\0" "\x09" "vcmpordpd\0" "\x0b" "vcmpeq_uqpd\0" "\x09" "vcmpngepd\0" \ +"\x09" "vcmpngtpd\0" "\x0b" "vcmpfalsepd\0" "\x0c" "vcmpneq_oqpd\0" "\x08" "vcmpgepd\0" \ +"\x08" "vcmpgtpd\0" "\x0a" "vcmptruepd\0" "\x0b" "vcmpeq_ospd\0" "\x0b" "vcmplt_oqpd\0" \ +"\x0b" "vcmple_oqpd\0" "\x0d" "vcmpunord_spd\0" "\x0c" "vcmpneq_uspd\0" \ +"\x0c" "vcmpnlt_uqpd\0" "\x0c" "vcmpnle_uqpd\0" "\x0b" "vcmpord_spd\0" \ +"\x0b" "vcmpeq_uspd\0" "\x0c" "vcmpnge_uqpd\0" "\x0c" "vcmpngt_uqpd\0" \ +"\x0e" "vcmpfalse_ospd\0" "\x0c" "vcmpneq_ospd\0" "\x0b" "vcmpge_oqpd\0" \ +"\x0b" "vcmpgt_oqpd\0" "\x0d" "vcmptrue_uspd\0" "\x08" "vcmpeqss\0" "\x08" "vcmpltss\0" \ +"\x08" "vcmpless\0" "\x0b" "vcmpunordss\0" "\x09" "vcmpneqss\0" "\x09" "vcmpnltss\0" \ +"\x09" "vcmpnless\0" "\x09" "vcmpordss\0" "\x0b" "vcmpeq_uqss\0" "\x09" "vcmpngess\0" \ +"\x09" "vcmpngtss\0" "\x0b" "vcmpfalsess\0" "\x0c" "vcmpneq_oqss\0" "\x08" "vcmpgess\0" \ +"\x08" "vcmpgtss\0" "\x0a" "vcmptruess\0" "\x0b" "vcmpeq_osss\0" "\x0b" "vcmplt_oqss\0" \ +"\x0b" "vcmple_oqss\0" "\x0d" "vcmpunord_sss\0" "\x0c" "vcmpneq_usss\0" \ +"\x0c" "vcmpnlt_uqss\0" "\x0c" "vcmpnle_uqss\0" "\x0b" "vcmpord_sss\0" \ +"\x0b" "vcmpeq_usss\0" "\x0c" "vcmpnge_uqss\0" "\x0c" "vcmpngt_uqss\0" \ +"\x0e" "vcmpfalse_osss\0" "\x0c" "vcmpneq_osss\0" "\x0b" "vcmpge_oqss\0" \ +"\x0b" "vcmpgt_oqss\0" "\x0d" "vcmptrue_usss\0" "\x08" "vcmpeqsd\0" "\x08" "vcmpltsd\0" \ +"\x08" "vcmplesd\0" "\x0b" "vcmpunordsd\0" "\x09" "vcmpneqsd\0" "\x09" "vcmpnltsd\0" \ +"\x09" "vcmpnlesd\0" "\x09" "vcmpordsd\0" "\x0b" "vcmpeq_uqsd\0" "\x09" "vcmpngesd\0" \ +"\x09" "vcmpngtsd\0" "\x0b" "vcmpfalsesd\0" "\x0c" "vcmpneq_oqsd\0" "\x08" "vcmpgesd\0" \ +"\x08" "vcmpgtsd\0" "\x0a" "vcmptruesd\0" "\x0b" "vcmpeq_ossd\0" "\x0b" "vcmplt_oqsd\0" \ +"\x0b" "vcmple_oqsd\0" "\x0d" "vcmpunord_ssd\0" "\x0c" "vcmpneq_ussd\0" \ +"\x0c" "vcmpnlt_uqsd\0" "\x0c" "vcmpnle_uqsd\0" "\x0b" "vcmpord_ssd\0" \ +"\x0b" "vcmpeq_ussd\0" "\x0c" "vcmpnge_uqsd\0" "\x0c" "vcmpngt_uqsd\0" \ +"\x0e" "vcmpfalse_ossd\0" "\x0c" "vcmpneq_ossd\0" "\x0b" "vcmpge_oqsd\0" \ +"\x0b" "vcmpgt_oqsd\0" "\x0d" "vcmptrue_ussd\0" "\x06" "pinsrw\0" "\x07" "vpinsrw\0" \ +"\x06" "pextrw\0" "\x07" "vpextrw\0" "\x06" "shufps\0" "\x06" "shufpd\0" \ +"\x07" "vshufps\0" "\x07" "vshufpd\0" "\x09" "cmpxchg8b\0" "\x0a" "cmpxchg16b\0" \ +"\x07" "vmptrst\0" "\x08" "addsubpd\0" "\x08" "addsubps\0" "\x09" "vaddsubpd\0" \ +"\x09" "vaddsubps\0" "\x05" "psrlw\0" "\x06" "vpsrlw\0" "\x05" "psrld\0" \ +"\x06" "vpsrld\0" "\x05" "psrlq\0" "\x06" "vpsrlq\0" "\x05" "paddq\0" \ +"\x06" "vpaddq\0" "\x06" "pmullw\0" "\x07" "vpmullw\0" "\x07" "movq2dq\0" \ +"\x07" "movdq2q\0" "\x08" "pmovmskb\0" "\x09" "vpmovmskb\0" "\x07" "psubusb\0" \ +"\x08" "vpsubusb\0" "\x07" "psubusw\0" "\x08" "vpsubusw\0" "\x06" "pminub\0" \ +"\x07" "vpminub\0" "\x04" "pand\0" "\x05" "vpand\0" "\x07" "paddusb\0" \ +"\x08" "vpaddusw\0" "\x07" "paddusw\0" "\x06" "pmaxub\0" "\x07" "vpmaxub\0" \ +"\x05" "pandn\0" "\x06" "vpandn\0" "\x05" "pavgb\0" "\x06" "vpavgb\0" \ +"\x05" "psraw\0" "\x06" "vpsraw\0" "\x05" "psrad\0" "\x06" "vpsrad\0" \ +"\x05" "pavgw\0" "\x06" "vpavgw\0" "\x07" "pmulhuw\0" "\x08" "vpmulhuw\0" \ +"\x06" "pmulhw\0" "\x07" "vpmulhw\0" "\x09" "cvttpd2dq\0" "\x08" "cvtdq2pd\0" \ +"\x08" "cvtpd2dq\0" "\x0a" "vcvttpd2dq\0" "\x09" "vcvtdq2pd\0" "\x09" "vcvtpd2dq\0" \ +"\x06" "movntq\0" "\x07" "movntdq\0" "\x08" "vmovntdq\0" "\x06" "psubsb\0" \ +"\x07" "vpsubsb\0" "\x06" "psubsw\0" "\x07" "vpsubsw\0" "\x06" "pminsw\0" \ +"\x07" "vpminsw\0" "\x03" "por\0" "\x04" "vpor\0" "\x06" "paddsb\0" \ +"\x07" "vpaddsb\0" "\x06" "paddsw\0" "\x07" "vpaddsw\0" "\x06" "pmaxsw\0" \ +"\x07" "vpmaxsw\0" "\x04" "pxor\0" "\x05" "vpxor\0" "\x05" "lddqu\0" \ +"\x06" "vlddqu\0" "\x05" "psllw\0" "\x06" "vpsllw\0" "\x05" "pslld\0" \ +"\x06" "vpslld\0" "\x05" "psllq\0" "\x06" "vpsllq\0" "\x07" "pmuludq\0" \ +"\x08" "vpmuludq\0" "\x07" "pmaddwd\0" "\x08" "vpmaddwd\0" "\x06" "psadbw\0" \ +"\x07" "vpsadbw\0" "\x08" "maskmovq\0" "\x0a" "maskmovdqu\0" "\x0b" "vmaskmovdqu\0" \ +"\x05" "psubb\0" "\x06" "vpsubb\0" "\x05" "psubw\0" "\x06" "vpsubw\0" \ +"\x05" "psubd\0" "\x06" "vpsubd\0" "\x05" "psubq\0" "\x06" "vpsubq\0" \ +"\x05" "paddb\0" "\x06" "vpaddb\0" "\x05" "paddw\0" "\x06" "vpaddw\0" \ +"\x05" "paddd\0" "\x06" "vpaddd\0" "\x07" "fnstenv\0" "\x06" "fstenv\0" \ +"\x06" "fnstcw\0" "\x05" "fstcw\0" "\x06" "fnclex\0" "\x05" "fclex\0" \ +"\x06" "fninit\0" "\x05" "finit\0" "\x06" "fnsave\0" "\x05" "fsave\0" \ +"\x06" "fnstsw\0" "\x05" "fstsw\0" "\x06" "pshufb\0" "\x07" "vpshufb\0" \ +"\x06" "phaddw\0" "\x07" "vphaddw\0" "\x06" "phaddd\0" "\x07" "vphaddd\0" \ "\x07" "phaddsw\0" "\x08" "vphaddsw\0" "\x09" "pmaddubsw\0" "\x0a" "vpmaddubsw\0" \ -"\x06" "phsubw\0" "\x07" "vphsubw\0" "\x06" "phsubd\0" "\x07" "vphsubd\0" "\x07" "phsubsw\0" \ -"\x08" "vphsubsw\0" "\x06" "psignb\0" "\x07" "vpsignb\0" "\x06" "psignw\0" \ -"\x07" "vpsignw\0" "\x06" "psignd\0" "\x07" "vpsignd\0" "\x08" "pmulhrsw\0" \ -"\x09" "vpmulhrsw\0" "\x09" "vpermilps\0" "\x09" "vpermilpd\0" "\x07" "vtestps\0" \ -"\x07" "vtestpd\0" "\x08" "pblendvb\0" "\x08" "blendvps\0" "\x08" "blendvpd\0" \ -"\x05" "ptest\0" "\x06" "vptest\0" "\x0c" "vbroadcastss\0" "\x0c" "vbroadcastsd\0" \ -"\x0e" "vbroadcastf128\0" "\x05" "pabsb\0" "\x06" "vpabsb\0" "\x05" "pabsw\0" \ -"\x06" "vpabsw\0" "\x05" "pabsd\0" "\x06" "vpabsd\0" "\x08" "pmovsxbw\0" "\x09" "vpmovsxbw\0" \ -"\x08" "pmovsxbd\0" "\x09" "vpmovsxbd\0" "\x08" "pmovsxbq\0" "\x09" "vpmovsxbq\0" \ -"\x08" "pmovsxwd\0" "\x09" "vpmovsxwd\0" "\x08" "pmovsxwq\0" "\x09" "vpmovsxwq\0" \ -"\x08" "pmovsxdq\0" "\x09" "vpmovsxdq\0" "\x06" "pmuldq\0" "\x07" "vpmuldq\0" \ -"\x07" "pcmpeqq\0" "\x08" "vpcmpeqq\0" "\x08" "movntdqa\0" "\x09" "vmovntdqa\0" \ -"\x08" "packusdw\0" "\x09" "vpackusdw\0" "\x0a" "vmaskmovps\0" "\x0a" "vmaskmovpd\0" \ -"\x08" "pmovzxbw\0" "\x09" "vpmovzxbw\0" "\x08" "pmovzxbd\0" "\x09" "vpmovzxbd\0" \ -"\x08" "pmovzxbq\0" "\x09" "vpmovzxbq\0" "\x08" "pmovzxwd\0" "\x09" "vpmovzxwd\0" \ -"\x08" "pmovzxwq\0" "\x09" "vpmovzxwq\0" "\x08" "pmovzxdq\0" "\x09" "vpmovzxdq\0" \ -"\x07" "pcmpgtq\0" "\x08" "vpcmpgtq\0" "\x06" "pminsb\0" "\x07" "vpminsb\0" \ -"\x06" "pminsd\0" "\x07" "vpminsd\0" "\x06" "pminuw\0" "\x07" "vpminuw\0" "\x06" "pminud\0" \ -"\x07" "vpminud\0" "\x06" "pmaxsb\0" "\x07" "vpmaxsb\0" "\x06" "pmaxsd\0" "\x07" "vpmaxsd\0" \ -"\x06" "pmaxuw\0" "\x07" "vpmaxuw\0" "\x06" "pmaxud\0" "\x07" "vpmaxud\0" "\x06" "pmulld\0" \ -"\x07" "vpmulld\0" "\x0a" "phminposuw\0" "\x0b" "vphminposuw\0" "\x06" "invept\0" \ -"\x07" "invvpid\0" "\x07" "invpcid\0" "\x0e" "vfmaddsub132ps\0" "\x0e" "vfmaddsub132pd\0" \ -"\x0e" "vfmsubadd132ps\0" "\x0e" "vfmsubadd132pd\0" "\x0b" "vfmadd132ps\0" \ -"\x0b" "vfmadd132pd\0" "\x0b" "vfmadd132ss\0" "\x0b" "vfmadd132sd\0" "\x0b" "vfmsub132ps\0" \ -"\x0b" "vfmsub132pd\0" "\x0b" "vfmsub132ss\0" "\x0b" "vfmsub132sd\0" "\x0c" "vfnmadd132ps\0" \ -"\x0c" "vfnmadd132pd\0" "\x0c" "vfnmadd132ss\0" "\x0c" "vfnmadd132sd\0" "\x0c" "vfnmsub132ps\0" \ -"\x0c" "vfnmsub132pd\0" "\x0c" "vfnmsub132ss\0" "\x0c" "vfnmsub132sd\0" "\x0e" "vfmaddsub213ps\0" \ -"\x0e" "vfmaddsub213pd\0" "\x0e" "vfmsubadd213ps\0" "\x0e" "vfmsubadd213pd\0" \ -"\x0b" "vfmadd213ps\0" "\x0b" "vfmadd213pd\0" "\x0b" "vfmadd213ss\0" "\x0b" "vfmadd213sd\0" \ -"\x0b" "vfmsub213ps\0" "\x0b" "vfmsub213pd\0" "\x0b" "vfmsub213ss\0" "\x0b" "vfmsub213sd\0" \ -"\x0c" "vfnmadd213ps\0" "\x0c" "vfnmadd213pd\0" "\x0c" "vfnmadd213ss\0" "\x0c" "vfnmadd213sd\0" \ -"\x0c" "vfnmsub213ps\0" "\x0c" "vfnmsub213pd\0" "\x0c" "vfnmsub213ss\0" "\x0c" "vfnmsub213sd\0" \ +"\x06" "phsubw\0" "\x07" "vphsubw\0" "\x06" "phsubd\0" "\x07" "vphsubd\0" \ +"\x07" "phsubsw\0" "\x08" "vphsubsw\0" "\x06" "psignb\0" "\x07" "vpsignb\0" \ +"\x06" "psignw\0" "\x07" "vpsignw\0" "\x06" "psignd\0" "\x07" "vpsignd\0" \ +"\x08" "pmulhrsw\0" "\x09" "vpmulhrsw\0" "\x09" "vpermilps\0" "\x09" "vpermilpd\0" \ +"\x07" "vtestps\0" "\x07" "vtestpd\0" "\x08" "pblendvb\0" "\x08" "blendvps\0" \ +"\x08" "blendvpd\0" "\x05" "ptest\0" "\x06" "vptest\0" "\x0c" "vbroadcastss\0" \ +"\x0c" "vbroadcastsd\0" "\x0e" "vbroadcastf128\0" "\x05" "pabsb\0" "\x06" "vpabsb\0" \ +"\x05" "pabsw\0" "\x06" "vpabsw\0" "\x05" "pabsd\0" "\x06" "vpabsd\0" \ +"\x08" "pmovsxbw\0" "\x09" "vpmovsxbw\0" "\x08" "pmovsxbd\0" "\x09" "vpmovsxbd\0" \ +"\x08" "pmovsxbq\0" "\x09" "vpmovsxbq\0" "\x08" "pmovsxwd\0" "\x09" "vpmovsxwd\0" \ +"\x08" "pmovsxwq\0" "\x09" "vpmovsxwq\0" "\x08" "pmovsxdq\0" "\x09" "vpmovsxdq\0" \ +"\x06" "pmuldq\0" "\x07" "vpmuldq\0" "\x07" "pcmpeqq\0" "\x08" "vpcmpeqq\0" \ +"\x08" "movntdqa\0" "\x09" "vmovntdqa\0" "\x08" "packusdw\0" "\x09" "vpackusdw\0" \ +"\x0a" "vmaskmovps\0" "\x0a" "vmaskmovpd\0" "\x08" "pmovzxbw\0" "\x09" "vpmovzxbw\0" \ +"\x08" "pmovzxbd\0" "\x09" "vpmovzxbd\0" "\x08" "pmovzxbq\0" "\x09" "vpmovzxbq\0" \ +"\x08" "pmovzxwd\0" "\x09" "vpmovzxwd\0" "\x08" "pmovzxwq\0" "\x09" "vpmovzxwq\0" \ +"\x08" "pmovzxdq\0" "\x09" "vpmovzxdq\0" "\x07" "pcmpgtq\0" "\x08" "vpcmpgtq\0" \ +"\x06" "pminsb\0" "\x07" "vpminsb\0" "\x06" "pminsd\0" "\x07" "vpminsd\0" \ +"\x06" "pminuw\0" "\x07" "vpminuw\0" "\x06" "pminud\0" "\x07" "vpminud\0" \ +"\x06" "pmaxsb\0" "\x07" "vpmaxsb\0" "\x06" "pmaxsd\0" "\x07" "vpmaxsd\0" \ +"\x06" "pmaxuw\0" "\x07" "vpmaxuw\0" "\x06" "pmaxud\0" "\x07" "vpmaxud\0" \ +"\x06" "pmulld\0" "\x07" "vpmulld\0" "\x0a" "phminposuw\0" "\x0b" "vphminposuw\0" \ +"\x06" "invept\0" "\x07" "invvpid\0" "\x07" "invpcid\0" "\x0e" "vfmaddsub132ps\0" \ +"\x0e" "vfmaddsub132pd\0" "\x0e" "vfmsubadd132ps\0" "\x0e" "vfmsubadd132pd\0" \ +"\x0b" "vfmadd132ps\0" "\x0b" "vfmadd132pd\0" "\x0b" "vfmadd132ss\0" \ +"\x0b" "vfmadd132sd\0" "\x0b" "vfmsub132ps\0" "\x0b" "vfmsub132pd\0" \ +"\x0b" "vfmsub132ss\0" "\x0b" "vfmsub132sd\0" "\x0c" "vfnmadd132ps\0" \ +"\x0c" "vfnmadd132pd\0" "\x0c" "vfnmadd132ss\0" "\x0c" "vfnmadd132sd\0" \ +"\x0c" "vfnmsub132ps\0" "\x0c" "vfnmsub132pd\0" "\x0c" "vfnmsub132ss\0" \ +"\x0c" "vfnmsub132sd\0" "\x0e" "vfmaddsub213ps\0" "\x0e" "vfmaddsub213pd\0" \ +"\x0e" "vfmsubadd213ps\0" "\x0e" "vfmsubadd213pd\0" "\x0b" "vfmadd213ps\0" \ +"\x0b" "vfmadd213pd\0" "\x0b" "vfmadd213ss\0" "\x0b" "vfmadd213sd\0" \ +"\x0b" "vfmsub213ps\0" "\x0b" "vfmsub213pd\0" "\x0b" "vfmsub213ss\0" \ +"\x0b" "vfmsub213sd\0" "\x0c" "vfnmadd213ps\0" "\x0c" "vfnmadd213pd\0" \ +"\x0c" "vfnmadd213ss\0" "\x0c" "vfnmadd213sd\0" "\x0c" "vfnmsub213ps\0" \ +"\x0c" "vfnmsub213pd\0" "\x0c" "vfnmsub213ss\0" "\x0c" "vfnmsub213sd\0" \ "\x0e" "vfmaddsub231ps\0" "\x0e" "vfmaddsub231pd\0" "\x0e" "vfmsubadd231ps\0" \ -"\x0e" "vfmsubadd231pd\0" "\x0b" "vfmadd231ps\0" "\x0b" "vfmadd231pd\0" "\x0b" "vfmadd231ss\0" \ -"\x0b" "vfmadd231sd\0" "\x0b" "vfmsub231ps\0" "\x0b" "vfmsub231pd\0" "\x0b" "vfmsub231ss\0" \ -"\x0b" "vfmsub231sd\0" "\x0c" "vfnmadd231ps\0" "\x0c" "vfnmadd231pd\0" "\x0c" "vfnmadd231ss\0" \ -"\x0c" "vfnmadd231sd\0" "\x0c" "vfnmsub231ps\0" "\x0c" "vfnmsub231pd\0" "\x0c" "vfnmsub231ss\0" \ -"\x0c" "vfnmsub231sd\0" "\x06" "aesimc\0" "\x07" "vaesimc\0" "\x06" "aesenc\0" \ -"\x07" "vaesenc\0" "\x0a" "aesenclast\0" "\x0b" "vaesenclast\0" "\x06" "aesdec\0" \ -"\x07" "vaesdec\0" "\x0a" "aesdeclast\0" "\x0b" "vaesdeclast\0" "\x05" "movbe\0" \ -"\x05" "crc32\0" "\x0a" "vperm2f128\0" "\x07" "roundps\0" "\x08" "vroundps\0" \ -"\x07" "roundpd\0" "\x08" "vroundpd\0" "\x07" "roundss\0" "\x08" "vroundss\0" \ -"\x07" "roundsd\0" "\x08" "vroundsd\0" "\x07" "blendps\0" "\x08" "vblendps\0" \ -"\x07" "blendpd\0" "\x08" "vblendpd\0" "\x07" "pblendw\0" "\x08" "vpblendw\0" \ -"\x07" "palignr\0" "\x08" "vpalignr\0" "\x06" "pextrb\0" "\x07" "vpextrb\0" \ -"\x06" "pextrd\0" "\x06" "pextrq\0" "\x07" "vpextrd\0" "\x07" "vpextrq\0" "\x09" "extractps\0" \ -"\x0a" "vextractps\0" "\x0b" "vinsertf128\0" "\x0c" "vextractf128\0" "\x06" "pinsrb\0" \ -"\x07" "vpinsrb\0" "\x08" "insertps\0" "\x09" "vinsertps\0" "\x06" "pinsrd\0" \ -"\x06" "pinsrq\0" "\x07" "vpinsrd\0" "\x07" "vpinsrq\0" "\x04" "dpps\0" "\x05" "vdpps\0" \ -"\x04" "dppd\0" "\x05" "vdppd\0" "\x07" "mpsadbw\0" "\x08" "vmpsadbw\0" "\x09" "pclmulqdq\0" \ +"\x0e" "vfmsubadd231pd\0" "\x0b" "vfmadd231ps\0" "\x0b" "vfmadd231pd\0" \ +"\x0b" "vfmadd231ss\0" "\x0b" "vfmadd231sd\0" "\x0b" "vfmsub231ps\0" \ +"\x0b" "vfmsub231pd\0" "\x0b" "vfmsub231ss\0" "\x0b" "vfmsub231sd\0" \ +"\x0c" "vfnmadd231ps\0" "\x0c" "vfnmadd231pd\0" "\x0c" "vfnmadd231ss\0" \ +"\x0c" "vfnmadd231sd\0" "\x0c" "vfnmsub231ps\0" "\x0c" "vfnmsub231pd\0" \ +"\x0c" "vfnmsub231ss\0" "\x0c" "vfnmsub231sd\0" "\x06" "aesimc\0" "\x07" "vaesimc\0" \ +"\x06" "aesenc\0" "\x07" "vaesenc\0" "\x0a" "aesenclast\0" "\x0b" "vaesenclast\0" \ +"\x06" "aesdec\0" "\x07" "vaesdec\0" "\x0a" "aesdeclast\0" "\x0b" "vaesdeclast\0" \ +"\x05" "movbe\0" "\x05" "crc32\0" "\x0a" "vperm2f128\0" "\x07" "roundps\0" \ +"\x08" "vroundps\0" "\x07" "roundpd\0" "\x08" "vroundpd\0" "\x07" "roundss\0" \ +"\x08" "vroundss\0" "\x07" "roundsd\0" "\x08" "vroundsd\0" "\x07" "blendps\0" \ +"\x08" "vblendps\0" "\x07" "blendpd\0" "\x08" "vblendpd\0" "\x07" "pblendw\0" \ +"\x08" "vpblendw\0" "\x07" "palignr\0" "\x08" "vpalignr\0" "\x06" "pextrb\0" \ +"\x07" "vpextrb\0" "\x06" "pextrd\0" "\x06" "pextrq\0" "\x07" "vpextrd\0" \ +"\x07" "vpextrq\0" "\x09" "extractps\0" "\x0a" "vextractps\0" "\x0b" "vinsertf128\0" \ +"\x0c" "vextractf128\0" "\x06" "pinsrb\0" "\x07" "vpinsrb\0" "\x08" "insertps\0" \ +"\x09" "vinsertps\0" "\x06" "pinsrd\0" "\x06" "pinsrq\0" "\x07" "vpinsrd\0" \ +"\x07" "vpinsrq\0" "\x04" "dpps\0" "\x05" "vdpps\0" "\x04" "dppd\0" \ +"\x05" "vdppd\0" "\x07" "mpsadbw\0" "\x08" "vmpsadbw\0" "\x09" "pclmulqdq\0" \ "\x0a" "vpclmulqdq\0" "\x09" "vblendvps\0" "\x09" "vblendvpd\0" "\x09" "vpblendvb\0" \ "\x09" "pcmpestrm\0" "\x0a" "vpcmpestrm\0" "\x09" "pcmpestri\0" "\x0a" "vpcmpestri\0" \ "\x09" "pcmpistrm\0" "\x0a" "vpcmpistrm\0" "\x09" "pcmpistri\0" "\x0a" "vpcmpistri\0" \ -"\x0f" "aeskeygenassist\0" "\x10" "vaeskeygenassist\0" "\x06" "psrldq\0" "\x07" "vpsrldq\0" \ -"\x06" "pslldq\0" "\x07" "vpslldq\0" "\x06" "fxsave\0" "\x08" "fxsave64\0" \ -"\x08" "rdfsbase\0" "\x07" "fxrstor\0" "\x09" "fxrstor64\0" "\x08" "rdgsbase\0" \ -"\x07" "ldmxcsr\0" "\x08" "wrfsbase\0" "\x08" "vldmxcsr\0" "\x07" "stmxcsr\0" \ -"\x08" "wrgsbase\0" "\x08" "vstmxcsr\0" "\x07" "vmptrld\0" "\x07" "vmclear\0" \ -"\x05" "vmxon\0" "\x06" "movsxd\0" "\x05" "pause\0" "\x04" "wait\0" "\x06" "rdrand\0" \ -"\x06" "_3dnow\0"; +"\x0f" "aeskeygenassist\0" "\x10" "vaeskeygenassist\0" "\x06" "psrldq\0" \ +"\x07" "vpsrldq\0" "\x06" "pslldq\0" "\x07" "vpslldq\0" "\x06" "fxsave\0" \ +"\x08" "fxsave64\0" "\x08" "rdfsbase\0" "\x07" "fxrstor\0" "\x09" "fxrstor64\0" \ +"\x08" "rdgsbase\0" "\x07" "ldmxcsr\0" "\x08" "wrfsbase\0" "\x08" "vldmxcsr\0" \ +"\x07" "stmxcsr\0" "\x08" "wrgsbase\0" "\x08" "vstmxcsr\0" "\x07" "vmptrld\0" \ +"\x07" "vmclear\0" "\x05" "vmxon\0" "\x06" "movsxd\0" "\x05" "pause\0" \ +"\x04" "wait\0" "\x06" "rdrand\0" "\x06" "_3dnow\0"; const _WRegister _REGISTERS[] = { { 3, "rax" }, { 3, "rcx" }, { 3, "rdx" }, { 3, "rbx" }, { 3, "rsp" }, { 3, "rbp" }, { 3, "rsi" }, { 3, "rdi" }, { 2, "r8" }, { 2, "r9" }, { 3, "r10" }, { 3, "r11" }, { 3, "r12" }, { 3, "r13" }, { 3, "r14" }, { 3, "r15" }, diff --git a/NativeCore/Dependencies/distorm/src/operands.c b/NativeCore/Dependencies/distorm/src/operands.c index 789a6cb8..506780c4 100644 --- a/NativeCore/Dependencies/distorm/src/operands.c +++ b/NativeCore/Dependencies/distorm/src/operands.c @@ -4,7 +4,7 @@ operands.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/operands.h b/NativeCore/Dependencies/distorm/src/operands.h index 883d59b1..2d916474 100644 --- a/NativeCore/Dependencies/distorm/src/operands.h +++ b/NativeCore/Dependencies/distorm/src/operands.h @@ -4,7 +4,7 @@ operands.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/prefix.c b/NativeCore/Dependencies/distorm/src/prefix.c index 21a67f70..b1c26954 100644 --- a/NativeCore/Dependencies/distorm/src/prefix.c +++ b/NativeCore/Dependencies/distorm/src/prefix.c @@ -4,7 +4,7 @@ prefix.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/prefix.h b/NativeCore/Dependencies/distorm/src/prefix.h index f1f53c42..f205e697 100644 --- a/NativeCore/Dependencies/distorm/src/prefix.h +++ b/NativeCore/Dependencies/distorm/src/prefix.h @@ -4,7 +4,7 @@ prefix.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.c b/NativeCore/Dependencies/distorm/src/textdefs.c index cf628951..48419d91 100644 --- a/NativeCore/Dependencies/distorm/src/textdefs.c +++ b/NativeCore/Dependencies/distorm/src/textdefs.c @@ -4,7 +4,7 @@ textdefs.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.h b/NativeCore/Dependencies/distorm/src/textdefs.h index 05cf8d77..a923626f 100644 --- a/NativeCore/Dependencies/distorm/src/textdefs.h +++ b/NativeCore/Dependencies/distorm/src/textdefs.h @@ -4,7 +4,7 @@ textdefs.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/wstring.c b/NativeCore/Dependencies/distorm/src/wstring.c index 5edce8fd..083200b4 100644 --- a/NativeCore/Dependencies/distorm/src/wstring.c +++ b/NativeCore/Dependencies/distorm/src/wstring.c @@ -4,7 +4,7 @@ wstring.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/wstring.h b/NativeCore/Dependencies/distorm/src/wstring.h index 1dbaa2f3..6b3a2a3f 100644 --- a/NativeCore/Dependencies/distorm/src/wstring.h +++ b/NativeCore/Dependencies/distorm/src/wstring.h @@ -4,7 +4,7 @@ wstring.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/x86defs.h b/NativeCore/Dependencies/distorm/src/x86defs.h index 36fea6d1..ca3a3adf 100644 --- a/NativeCore/Dependencies/distorm/src/x86defs.h +++ b/NativeCore/Dependencies/distorm/src/x86defs.h @@ -4,7 +4,7 @@ x86defs.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2016 Gil Dabah +Copyright (C) 2003-2018 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ From 728e7040454448f9957408d39dfbf790139ab0c0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 14:08:57 +0100 Subject: [PATCH 518/777] Fixed wrong default value. --- ReClass.NET/Forms/InputBytesForm.Designer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/ReClass.NET/Forms/InputBytesForm.Designer.cs b/ReClass.NET/Forms/InputBytesForm.Designer.cs index d7927afd..7036c965 100644 --- a/ReClass.NET/Forms/InputBytesForm.Designer.cs +++ b/ReClass.NET/Forms/InputBytesForm.Designer.cs @@ -122,7 +122,6 @@ private void InitializeComponent() // // bytesNumericUpDown // - this.bytesNumericUpDown.Hexadecimal = true; this.bytesNumericUpDown.Location = new System.Drawing.Point(8, 25); this.bytesNumericUpDown.Name = "bytesNumericUpDown"; this.bytesNumericUpDown.Size = new System.Drawing.Size(212, 20); From eb9d6e479b5f1ef6adba4f0f8344cd9a6cd727bb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 14:11:30 +0100 Subject: [PATCH 519/777] Changed ui. --- ReClass.NET/Forms/InputBytesForm.Designer.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Forms/InputBytesForm.Designer.cs b/ReClass.NET/Forms/InputBytesForm.Designer.cs index 7036c965..f00713ba 100644 --- a/ReClass.NET/Forms/InputBytesForm.Designer.cs +++ b/ReClass.NET/Forms/InputBytesForm.Designer.cs @@ -45,9 +45,9 @@ private void InitializeComponent() this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(5, 9); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(88, 13); + this.label1.Size = new System.Drawing.Size(121, 13); this.label1.TabIndex = 1; - this.label1.Text = "Number of Bytes:"; + this.label1.Text = "Number of Bytes to add:"; // // hexRadioButton // @@ -111,7 +111,6 @@ private void InitializeComponent() // okButton // this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; - this.okButton.Image = global::ReClassNET.Properties.Resources.B16x16_Accept; this.okButton.Location = new System.Drawing.Point(146, 121); this.okButton.Name = "okButton"; this.okButton.Size = new System.Drawing.Size(75, 23); From 37ef1177b7243a68236016cab14347561f8e8d2c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 14:23:44 +0100 Subject: [PATCH 520/777] Register window. --- ReClass.NET/Forms/EnumEditorForm.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index 8e1bdf77..e4b07bcd 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -30,6 +30,20 @@ public EnumEditorForm(EnumDescription @enum) } } + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + private void enumDataGridView_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) { long value = e.Row.Index; From 459367455120c727e653bac7638f4a3cc9b3c036 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 15:46:43 +0100 Subject: [PATCH 521/777] Fixed enum nodes don't show text. --- ReClass.NET/UI/ProjectView.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index 6f481df4..8fd4d90b 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -106,6 +106,8 @@ public EnumTreeNode(EnumDescription @enum) ImageIndex = 3; SelectedImageIndex = 3; + + Update(); } public void Update() From 1cf81b0990bf4e04294c3d00b08ebc0ff945a807 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 15:48:16 +0100 Subject: [PATCH 522/777] Splitted the Clear method. --- ReClass.NET/UI/ProjectView.cs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index 8fd4d90b..b00dd78b 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -333,10 +333,30 @@ public void CollapseAllClassNodes() } } + /// + /// Clears all displayed nodes. + /// public void Clear() { - classesRootNode.Nodes.Clear(); - enumsRootNode.Nodes.Clear(); + Clear(true, true); + } + + /// + /// Clears the selected nodes. + /// + /// Clears the classes if set. + /// Clears the enums if set. + public void Clear(bool clearClasses, bool clearEnums) + { + if (clearClasses) + { + classesRootNode.Nodes.Clear(); + } + + if (clearEnums) + { + enumsRootNode.Nodes.Clear(); + } } /// Adds the class to the view. From c5abe1f9861b9fbea0608f2ed481d3eeb75fe195 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 15:57:22 +0100 Subject: [PATCH 523/777] Added comments. --- ReClass.NET/UI/ProjectView.cs | 50 +++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index b00dd78b..5811453c 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -360,23 +360,27 @@ public void Clear(bool clearClasses, bool clearEnums) } /// Adds the class to the view. - /// The class to add. - public void AddClass(ClassNode node) + /// The class to add. + public void AddClass(ClassNode @class) { - Contract.Requires(node != null); + Contract.Requires(@class != null); - AddClasses(new[] { node }); + AddClasses(new[] { @class }); } - public void AddClasses(IEnumerable nodes) + /// + /// Adds all classes to the view. + /// + /// The classes to add. + public void AddClasses(IEnumerable classes) { - Contract.Requires(nodes != null); + Contract.Requires(classes != null); projectTreeView.BeginUpdate(); - foreach (var node in nodes) + foreach (var @class in classes) { - classesRootNode.Nodes.Add(new ClassTreeNode(node, this)); + classesRootNode.Nodes.Add(new ClassTreeNode(@class, this)); } classesRootNode.Expand(); @@ -435,13 +439,17 @@ private IEnumerable FindClassTreeNodes(ClassNode node) .Where(n => n.ClassNode == node); } - public void UpdateClassNode(ClassNode node) + /// + /// Updates the display for the given class. + /// + /// The class to update. + public void UpdateClassNode(ClassNode @class) { - Contract.Requires(node != null); + Contract.Requires(@class != null); projectTreeView.BeginUpdate(); - foreach (var tn in FindClassTreeNodes(node)) + foreach (var tn in FindClassTreeNodes(@class)) { tn.Update(); } @@ -451,6 +459,8 @@ public void UpdateClassNode(ClassNode node) projectTreeView.EndUpdate(); } + /// Adds the enum to the view. + /// The enum to add. public void AddEnum(EnumDescription @enum) { Contract.Requires(@enum != null); @@ -458,6 +468,8 @@ public void AddEnum(EnumDescription @enum) AddEnums(new[] { @enum }); } + /// Adds the enums to the view. + /// The enums to add. public void AddEnums(IEnumerable enums) { Contract.Requires(enums != null); @@ -476,21 +488,25 @@ public void AddEnums(IEnumerable enums) projectTreeView.EndUpdate(); } + /// + /// Updates the display for the given enum. + /// + /// The enum to update. public void UpdateEnumNode(EnumDescription @enum) { Contract.Requires(@enum != null); projectTreeView.BeginUpdate(); - var nodes = enumsRootNode.Nodes + var node = enumsRootNode.Nodes .Cast() - .Where(n => n.Enum == @enum); - foreach (var tn in nodes) + .FirstOrDefault(n => n.Enum == @enum); + + if (node != null) { - tn.Update(); + node.Update(); } - - if (nodes.None()) + else { AddEnum(@enum); } From 6d2b648a3d013fc0549ed0f81c9e0bfe1d65a34e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 12 Mar 2019 15:58:02 +0100 Subject: [PATCH 524/777] Updated Readme. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6fdbe556..b1d492aa 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,18 @@ This is a port of ReClass to the .NET platform with lots of additional features. - Support for x86 / x64 - File import from ReClass 2007-2016 and ReClass QT - Memory Nodes + - Arrays and Pointers to every other node types - Hex 8 / 16 / 32 / 64 - Int 8 / 16 / 32 / 64 - UInt 8 / 16 / 32 / 64 - Bool - Bits ![](https://abload.de/img/bitsnhlql.jpg) + - Enumerations - Float / Double - Vector 2 / 3 / 4 - Matrix 3x3 / 3x4 / 4x4 - - UTF8/16/32 Text and pointer to text - - Class Arrays and array of pointers to classes - - VTable + - UTF8 / UTF16 / UTF32 Text and pointer to text + - Virtual Tables - Function Pointer - Function - Automatic Node Dissection From 7536bdfb166960d90253874705f72231cb970a73 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 14 Mar 2019 13:42:27 +0100 Subject: [PATCH 525/777] Using the default ContextMenuStrip property prevents right click messages. --- ReClass.NET/Forms/MainForm.Designer.cs | 2 +- ReClass.NET/UI/MemoryViewControl.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index e0fd9b24..6f35b452 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -317,7 +317,7 @@ private void InitializeComponent() // memoryViewControl // this.memoryViewControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.memoryViewControl.ContextMenuStrip = this.selectedNodeContextMenuStrip; + this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Dock = System.Windows.Forms.DockStyle.Fill; this.memoryViewControl.Location = new System.Drawing.Point(0, 0); this.memoryViewControl.Name = "memoryViewControl"; diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 6206b847..ba214309 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -88,6 +88,8 @@ public ClassNode ClassNode [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public MemoryBuffer Memory { get; set; } + public ContextMenuStrip NodeContextMenuStrip { get; set; } + public event EventHandler SelectionChanged; public event NodeClickEventHandler ChangeClassTypeClick; public event NodeClickEventHandler ChangeWrappedTypeClick; @@ -727,7 +729,7 @@ public void SetSelectedNodes(IEnumerable nodes) /// The location where the context menu should be shown. private void ShowNodeContextMenu(Point location) { - ContextMenuStrip?.Show(this, location); + NodeContextMenuStrip?.Show(this, location); } /// From 87bf38d2f4193c8f468890d1f3f8063e101fc8f8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 15 Mar 2019 23:49:27 +0100 Subject: [PATCH 526/777] Rewrote code using the IndentedTextWriter class to be more flexible. Added comments for all methods. Changed ICustomCppCodeGenerator interface to an abstract class. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 588 +++++++++++------- ReClass.NET/Plugins/Plugin.cs | 2 +- 2 files changed, 362 insertions(+), 228 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 36ad51d3..be307cd7 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -1,7 +1,9 @@ using System; +using System.CodeDom.Compiler; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; +using System.IO; using System.Linq; using System.Text; using ReClassNET.Extensions; @@ -12,36 +14,78 @@ namespace ReClassNET.CodeGenerator { + public delegate void WriteNodeFunc(IndentedTextWriter writer, BaseNode node, ILogger logger); + public delegate string GetTypeDefinitionFunc(BaseNode node, ILogger logger); public delegate string ResolveWrappedTypeFunc(BaseNode node, bool isAnonymousExpression, ILogger logger); - public interface ICustomCppCodeGenerator + /// + /// A C++ code generator for custom nodes. + /// + public abstract class CustomCppCodeGenerator { - bool CanHandle(BaseNode node); + /// + /// Returns true if the code generator can handle the given node. + /// + /// The node to check. + /// True if the code generator can handle the given node, false otherwise. + public abstract bool CanHandle(BaseNode node); + + /// + /// Outputs the C++ code for the node to the instance. + /// + /// The writer to output to. + /// The node to output. + /// The default implementation of . + /// The logger. + /// True if the code generator has processed the node, false otherwise. If this method returns false, the default implementation is used. + public virtual bool WriteNode(IndentedTextWriter writer, BaseNode node, WriteNodeFunc defaultWriteNodeFunc, ILogger logger) + { + return false; + } - BaseNode TransformNode(BaseNode node); + /// + /// Transforms the given node if necessary. + /// + /// The node to transform. + /// The transformed node. + public virtual BaseNode TransformNode(BaseNode node) + { + return node; + } - string GetTypeDefinition(BaseNode node, GetTypeDefinitionFunc defaultGetTypeDefinitionFunc, ResolveWrappedTypeFunc defaultResolveWrappedTypeFunc, ILogger logger); + /// + /// Gets the type definition for the node. If the node is not a simple node null is returned. + /// + /// The node. + /// The default implementation of . + /// The default implementation of . + /// The logger. + /// The type definition for the node or null if no simple type is available. + public virtual string GetTypeDefinition(BaseNode node, GetTypeDefinitionFunc defaultGetTypeDefinitionFunc, ResolveWrappedTypeFunc defaultResolveWrappedTypeFunc, ILogger logger) + { + return null; + } } public class CppCodeGenerator : ICodeGenerator { #region Custom Code Generators - private static readonly ISet customGenerators = new HashSet(); + private static readonly ISet customGenerators = new HashSet(); - public static void Add(ICustomCppCodeGenerator generator) + public static void Add(CustomCppCodeGenerator generator) { customGenerators.Add(generator); } - public static void Remove(ICustomCppCodeGenerator generator) + public static void Remove(CustomCppCodeGenerator generator) { customGenerators.Remove(generator); } - private static ICustomCppCodeGenerator GetCustomCodeGeneratorForNode(BaseNode node) + private static CustomCppCodeGenerator GetCustomCodeGeneratorForNode(BaseNode node) { return customGenerators.FirstOrDefault(g => g.CanHandle(node)); } @@ -110,161 +154,215 @@ public CppCodeGenerator(CppTypeMapping typeMapping) public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { - var classNodes = classes; + using (var sw = new StringWriter()) + { + using (var iw = new IndentedTextWriter(sw, "\t")) + { + iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); + iw.WriteLine(); - var sb = new StringBuilder(); - sb.AppendLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); - sb.AppendLine(); - sb.AppendLine( - string.Join( - Environment.NewLine + Environment.NewLine, - enums.Select(e => + using (var en = enums.GetEnumerator()) { - var esb = new StringBuilder(); - esb.Append("enum class "); - esb.Append(e.Name); - esb.Append(" : "); - switch (e.Size) + if (en.MoveNext()) { - case EnumDescription.UnderlyingTypeSize.OneByte: - esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int8Node)]); - break; - case EnumDescription.UnderlyingTypeSize.TwoBytes: - esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int16Node)]); - break; - case EnumDescription.UnderlyingTypeSize.FourBytes: - esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int32Node)]); - break; - case EnumDescription.UnderlyingTypeSize.EightBytes: - esb.AppendLine(nodeTypeToTypeDefinationMap[typeof(Int64Node)]); - break; - } - esb.AppendLine("{"); - esb.AppendLine( - string.Join( - "," + Environment.NewLine, - e.Values.Select(kv => $"\t{kv.Key} = {kv.Value}") - ) - ); - esb.AppendLine("};"); - - return esb.ToString(); - }) - ) - ); - sb.AppendLine( - string.Join( - Environment.NewLine + Environment.NewLine, - // Skip class which contains FunctionNodes because these are not data classes. - OrderByInheritance(classNodes.Where(c => c.Nodes.None(n => n is FunctionNode))).Select(c => - { - var csb = new StringBuilder(); - csb.Append($"class {c.Name}"); + WriteEnum(iw, en.Current); - bool skipFirstMember = false; - if (c.Nodes.FirstOrDefault() is ClassInstanceNode inheritedFromNode) - { - skipFirstMember = true; + while (en.MoveNext()) + { + iw.WriteLine(); - csb.Append(" : public "); - csb.Append(inheritedFromNode.InnerNode.Name); - } + WriteEnum(iw, en.Current); + } - if (!string.IsNullOrEmpty(c.Comment)) - { - csb.Append($" // {c.Comment}"); + iw.WriteLine(); } - csb.AppendLine(); - - csb.AppendLine("{"); - csb.AppendLine("public:"); - csb.AppendLine( - string.Join( - Environment.NewLine, - GetTypeDeclerationsForNodes(c.Nodes.Skip(skipFirstMember ? 1 : 0).WhereNot(n => n is FunctionNode), logger) - .Select(s => "\t" + s) - ) - ); - - var vTableNodes = c.Nodes.OfType().ToList(); - if (vTableNodes.Any()) + } + + var alreadySeen = new HashSet(); + + IEnumerable GetReversedClassHierarchy(ClassNode node) + { + Contract.Requires(node != null); + Contract.Ensures(Contract.Result>() != null); + + if (!alreadySeen.Add(node)) { - csb.AppendLine(); - csb.AppendLine( - string.Join( - Environment.NewLine, - vTableNodes.SelectMany(vt => vt.Nodes).OfType().Select(m => $"\tvirtual void {m.MethodName}();") - ) - ); + return Enumerable.Empty(); } - var functionNodes = classNodes.SelectMany(c2 => c2.Nodes).OfType().Where(f => f.BelongsToClass == c).ToList(); - if (functionNodes.Any()) + var classNodes = node.Nodes + .OfType() + .Where(w => !w.IsNodePresentInChain()) // Pointers are forward declared + .Select(w => w.ResolveMostInnerNode() as ClassNode) + .Where(n => n != null); + + return classNodes + .SelectMany(GetReversedClassHierarchy) + .Append(node); + } + + var classesToWrite = classes + .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. + .SelectMany(GetReversedClassHierarchy) // Order the classes by their use hierarchy. + .Distinct(); + + using (var en = classesToWrite.GetEnumerator()) + { + if (en.MoveNext()) { - csb.AppendLine(); - csb.AppendLine( - string.Join( - Environment.NewLine, - functionNodes.Select(f => $"\t{f.Signature} {{ }}") - ) - ); - } + WriteClass(iw, en.Current, classes, logger); - csb.Append($"}}; //Size: 0x{c.MemorySize:X04}"); - return csb.ToString(); - }) - ) - ); + while (en.MoveNext()) + { + iw.WriteLine(); - return sb.ToString(); + WriteClass(iw, en.Current, classes, logger); + } + } + } + } + + return sw.ToString(); + } } - private static IEnumerable OrderByInheritance(IEnumerable classes) + /// + /// Outputs the C++ code for the given enum to the instance. + /// + /// The writer to output to. + /// The enum to output. + private void WriteEnum(IndentedTextWriter writer, EnumDescription @enum) { - Contract.Requires(classes != null); - Contract.Requires(Contract.ForAll(classes, c => c != null)); - Contract.Ensures(Contract.Result>() != null); + Contract.Requires(writer != null); + Contract.Requires(@enum != null); - var alreadySeen = new HashSet(); + writer.Write($"enum class {@enum.Name} : "); + switch (@enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int8Node)]); + break; + case EnumDescription.UnderlyingTypeSize.TwoBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int16Node)]); + break; + case EnumDescription.UnderlyingTypeSize.FourBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int32Node)]); + break; + case EnumDescription.UnderlyingTypeSize.EightBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int64Node)]); + break; + } + writer.WriteLine("{"); + writer.Indent++; + for (var j = 0; j < @enum.Values.Count; ++j) + { + var kv = @enum.Values[j]; - return classes - .SelectMany(c => YieldReversedHierarchy(c, alreadySeen)) - .Distinct(); + writer.Write(kv.Key); + writer.Write(" = "); + writer.Write(kv.Value); + if (j < @enum.Values.Count - 1) + { + writer.Write(","); + } + writer.WriteLine(); + } + writer.Indent--; + writer.WriteLine("};"); } - private static IEnumerable YieldReversedHierarchy(ClassNode node, ISet alreadySeen) + /// + /// Outputs the C++ code for the given class to the instance. + /// + /// The writer to output to. + /// The class to output. + /// The list of all available classes. + /// The logger. + private void WriteClass(IndentedTextWriter writer, ClassNode @class, IEnumerable classes, ILogger logger) { - Contract.Requires(node != null); - Contract.Requires(alreadySeen != null); - Contract.Requires(Contract.ForAll(alreadySeen, c => c != null)); - Contract.Ensures(Contract.Result>() != null); + Contract.Requires(writer != null); + Contract.Requires(@class != null); + Contract.Requires(classes != null); + + writer.Write("class "); + writer.Write(@class.Name); + + var skipFirstMember = false; + if (@class.Nodes.FirstOrDefault() is ClassInstanceNode inheritedFromNode) + { + skipFirstMember = true; + + writer.Write(" : public "); + writer.Write(inheritedFromNode.InnerNode.Name); + } + + if (!string.IsNullOrEmpty(@class.Comment)) + { + writer.Write(" // "); + writer.Write(@class.Comment); + } - if (!alreadySeen.Add(node)) + writer.WriteLine(); + + writer.WriteLine("{"); + writer.WriteLine("public:"); + writer.Indent++; + + var nodes = @class.Nodes + .Skip(skipFirstMember ? 1 : 0) + .WhereNot(n => n is FunctionNode); + WriteNodes(writer, nodes, logger); + + var vTableNodes = @class.Nodes.OfType().ToList(); + if (vTableNodes.Any()) { - return Enumerable.Empty(); + writer.WriteLine(); + + var virtualMethodNodes = vTableNodes + .SelectMany(vt => vt.Nodes) + .OfType(); + foreach (var node in virtualMethodNodes) + { + writer.Write("virtual void "); + writer.Write(node.MethodName); + writer.WriteLine("();"); + } } - var classNodes = node.Nodes - .OfType() - .Where(w => !w.IsNodePresentInChain()) // Pointers are forward declared - .Select(w => w.ResolveMostInnerNode() as ClassNode) - .Where(n => n != null); + var functionNodes = classes + .SelectMany(c2 => c2.Nodes) + .OfType() + .Where(f => f.BelongsToClass == @class) + .ToList(); + if (functionNodes.Any()) + { + writer.WriteLine(); + + foreach (var node in functionNodes) + { + writer.Write(node.Signature); + writer.WriteLine("{ }"); + } + } - return classNodes - .SelectMany(c => YieldReversedHierarchy(c, alreadySeen)) - .Append(node); + writer.Indent--; + writer.Write("}; //Size: 0x"); + writer.WriteLine($"{@class.MemorySize:X04}"); } - private IEnumerable GetTypeDeclerationsForNodes(IEnumerable members, ILogger logger) + /// + /// Outputs the C++ code for the given nodes to the instance. + /// + /// The writer to output to. + /// The nodes to output. + /// The logger. + private void WriteNodes(IndentedTextWriter writer, IEnumerable nodes, ILogger logger) { - Contract.Requires(members != null); - Contract.Requires(Contract.ForAll(members, m => m != null)); - Contract.Requires(logger != null); - Contract.Ensures(Contract.Result>() != null); - Contract.Ensures(Contract.ForAll(Contract.Result>(), d => d != null)); + Contract.Requires(writer != null); + Contract.Requires(nodes != null); - int fill = 0; - int fillStart = 0; + var fill = 0; + var fillStart = 0; BaseNode CreatePaddingMember(int offset, int count) { @@ -280,7 +378,7 @@ BaseNode CreatePaddingMember(int offset, int count) return node; } - foreach (var member in members.WhereNot(m => m is VirtualMethodTableNode)) + foreach (var member in nodes.WhereNot(m => m is VirtualMethodTableNode)) { if (member is BaseHexNode) { @@ -295,77 +393,176 @@ BaseNode CreatePaddingMember(int offset, int count) if (fill != 0) { - yield return GetTypeDeclerationForNode(CreatePaddingMember(fillStart, fill), logger); + WriteNode(writer, CreatePaddingMember(fillStart, fill), logger); fill = 0; } - var definition = GetTypeDeclerationForNode(member, logger); - if (definition != null) + WriteNode(writer, member, logger); + } + + if (fill != 0) + { + WriteNode(writer, CreatePaddingMember(fillStart, fill), logger); + } + } + + /// + /// Outputs the C++ code for the given node to the instance. + /// + /// The writer to output to. + /// The node to output. + /// The logger. + private void WriteNode(IndentedTextWriter writer, BaseNode node, ILogger logger) + { + Contract.Requires(writer != null); + Contract.Requires(node != null); + + var custom = GetCustomCodeGeneratorForNode(node); + if (custom != null) + { + if (custom.WriteNode(writer, node, WriteNode, logger)) { - yield return definition; + return; } - else + } + + node = TransformNode(node); + + var simpleType = GetTypeDefinition(node, logger); + if (simpleType != null) + { + //$"{type} {node.Name}; //0x{node.Offset.ToInt32():X04} {node.Comment}".Trim(); + writer.Write(simpleType); + writer.Write(" "); + writer.Write(node.Name); + writer.Write("; //0x"); + writer.Write($"{node.Offset.ToInt32():X04}"); + if (!string.IsNullOrEmpty(node.Comment)) { - logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}"); + writer.Write(" "); + writer.Write(node.Comment); } + writer.WriteLine(); } - - if (fill != 0) + else if (node is BaseWrapperNode) + { + writer.Write(ResolveWrappedType(node, false, logger)); + writer.Write("; //0x"); + writer.Write($"{node.Offset.ToInt32():X04}"); + if (!string.IsNullOrEmpty(node.Comment)) + { + writer.Write(" "); + writer.Write(node.Comment); + } + writer.WriteLine(); + } + else { - yield return GetTypeDeclerationForNode(CreatePaddingMember(fillStart, fill), logger); + logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {node.GetType()}"); } } - private string GetTypeDefinition(BaseNode node, ILogger logger) + /// + /// Transforms the given node into some other node if necessary. + /// + /// The node to transform. + /// The transformed node. + private static BaseNode TransformNode(BaseNode node) { var custom = GetCustomCodeGeneratorForNode(node); if (custom != null) { - return custom.GetTypeDefinition(node, GetTypeDefinition, ResolveWrappedType, logger); + return custom.TransformNode(node); } - if (nodeTypeToTypeDefinationMap.TryGetValue(node.GetType(), out var type)) + BaseNode GetCharacterNodeForEncoding(Encoding encoding) { - return type; + if (encoding.Equals(Encoding.Unicode)) + { + return new Utf16CharacterNode(); + } + if (encoding.Equals(Encoding.UTF32)) + { + return new Utf32CharacterNode(); + } + return new Utf8CharacterNode(); } - if (node is ClassInstanceNode classInstanceNode) + if (node is BaseTextNode textNode) { - return $"class {classInstanceNode.InnerNode.Name}"; + var arrayNode = new ArrayNode { Count = textNode.Length }; + arrayNode.CopyFromNode(node); + arrayNode.ChangeInnerNode(GetCharacterNodeForEncoding(textNode.Encoding)); + return arrayNode; } - if (node is EnumNode enumNode) + + if (node is BaseTextPtrNode textPtrNode) { - return enumNode.Enum.Name; + var pointerNode = new PointerNode(); + pointerNode.CopyFromNode(node); + pointerNode.ChangeInnerNode(GetCharacterNodeForEncoding(textPtrNode.Encoding)); + return pointerNode; } - return null; + if (node is BitFieldNode bitFieldNode) + { + var underlayingNode = bitFieldNode.GetUnderlayingNode(); + underlayingNode.CopyFromNode(node); + return underlayingNode; + } + + if (node is BaseHexNode hexNode) + { + var arrayNode = new ArrayNode { Count = hexNode.MemorySize }; + arrayNode.CopyFromNode(node); + arrayNode.ChangeInnerNode(new Utf8CharacterNode()); + return arrayNode; + } + + return node; } - private string GetTypeDeclerationForNode(BaseNode node, ILogger logger) + /// + /// Gets the type definition for the given node. If the node is not a simple node null is returned. + /// + /// The target node. + /// The logger. + /// The type definition for the node or null if no simple type is available. + private string GetTypeDefinition(BaseNode node, ILogger logger) { - var transformedNode = TransformNode(node); + Contract.Requires(node != null); - var simpleType = GetTypeDefinition(transformedNode, logger); - if (simpleType != null) + var custom = GetCustomCodeGeneratorForNode(node); + if (custom != null) { - return NodeToString(node, simpleType); + return custom.GetTypeDefinition(node, GetTypeDefinition, ResolveWrappedType, logger); } - if (transformedNode is BaseWrapperNode wrapperNode) + if (nodeTypeToTypeDefinationMap.TryGetValue(node.GetType(), out var type)) { - var sb = new StringBuilder(); - - sb.Append(ResolveWrappedType(node, false, logger)); - - sb.Append($"; //0x{node.Offset.ToInt32():X04} {node.Comment}".Trim()); + return type; + } - return sb.ToString(); + if (node is ClassInstanceNode classInstanceNode) + { + return $"class {classInstanceNode.InnerNode.Name}"; + } + if (node is EnumNode enumNode) + { + return enumNode.Enum.Name; } return null; } + /// + /// Resolves the type of a node ( and ). + /// + /// The node to resolve. + /// Specify if the expression should be anonymous. + /// The logger. + /// The resolved type of the node. private string ResolveWrappedType(BaseNode node, bool isAnonymousExpression, ILogger logger) { Contract.Requires(node != null); @@ -429,68 +626,5 @@ private string ResolveWrappedType(BaseNode node, bool isAnonymousExpression, ILo return sb.ToString().Trim(); } - - private static BaseNode TransformNode(BaseNode node) - { - var custom = GetCustomCodeGeneratorForNode(node); - if (custom != null) - { - return custom.TransformNode(node); - } - - BaseNode GetCharacterNodeForEncoding(Encoding encoding) - { - if (encoding.Equals(Encoding.Unicode)) - { - return new Utf16CharacterNode(); - } - if (encoding.Equals(Encoding.UTF32)) - { - return new Utf32CharacterNode(); - } - return new Utf8CharacterNode(); - } - - if (node is BaseTextNode textNode) - { - var arrayNode = new ArrayNode { Count = textNode.Length }; - arrayNode.CopyFromNode(node); - arrayNode.ChangeInnerNode(GetCharacterNodeForEncoding(textNode.Encoding)); - return arrayNode; - } - - if (node is BaseTextPtrNode textPtrNode) - { - var pointerNode = new PointerNode(); - pointerNode.CopyFromNode(node); - pointerNode.ChangeInnerNode(GetCharacterNodeForEncoding(textPtrNode.Encoding)); - return pointerNode; - } - - if (node is BitFieldNode bitFieldNode) - { - var underlayingNode = bitFieldNode.GetUnderlayingNode(); - underlayingNode.CopyFromNode(node); - return underlayingNode; - } - - if (node is BaseHexNode hexNode) - { - var arrayNode = new ArrayNode { Count = hexNode.MemorySize }; - arrayNode.CopyFromNode(node); - arrayNode.ChangeInnerNode(new Utf8CharacterNode()); - return arrayNode; - } - - return node; - } - - private static string NodeToString(BaseNode node, string type) - { - Contract.Requires(node != null); - Contract.Requires(type != null); - - return $"{type} {node.Name}; //0x{node.Offset.ToInt32():X04} {node.Comment}".Trim(); - } } } diff --git a/ReClass.NET/Plugins/Plugin.cs b/ReClass.NET/Plugins/Plugin.cs index e5fedb2b..2004be7e 100644 --- a/ReClass.NET/Plugins/Plugin.cs +++ b/ReClass.NET/Plugins/Plugin.cs @@ -25,7 +25,7 @@ public class CustomNodeTypes /// /// An instance of a code generator which can process the custom node types. /// - public ICustomCppCodeGenerator CodeGenerator { get; set; } + public CustomCppCodeGenerator CodeGenerator { get; set; } } /// From 7f7106d9e13c50987d09e77d9e86426ced45641c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 16 Mar 2019 00:09:08 +0100 Subject: [PATCH 527/777] Rewrote C# code generation with the IndentedTextWriter class. --- .../CodeGenerator/CSharpCodeGenerator.cs | 206 +++++++++++++----- 1 file changed, 154 insertions(+), 52 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 3ea62ec4..48d6ffb1 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -1,8 +1,9 @@ using System; +using System.CodeDom.Compiler; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.IO; using System.Linq; -using System.Text; using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; @@ -12,7 +13,7 @@ namespace ReClassNET.CodeGenerator { public class CSharpCodeGenerator : ICodeGenerator { - private static readonly Dictionary typeToTypedefMap = new Dictionary + private static readonly Dictionary nodeTypeToTypeDefinationMap = new Dictionary { [typeof(DoubleNode)] = "double", [typeof(FloatNode)] = "float", @@ -38,76 +39,172 @@ public class CSharpCodeGenerator : ICodeGenerator public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { - var sb = new StringBuilder(); - sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}"); - sb.AppendLine(); - sb.AppendLine("// Warning: The code generator doesn't support all node types!"); - sb.AppendLine(); - sb.AppendLine("using System.Runtime.InteropServices;"); - sb.AppendLine(); - - sb.Append( - string.Join( - Environment.NewLine + Environment.NewLine, - classes.Select(c => + using (var sw = new StringWriter()) + { + using (var iw = new IndentedTextWriter(sw, "\t")) + { + iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); + iw.WriteLine(); + iw.WriteLine("// Warning: The C# code generator doesn't support all node types!"); + iw.WriteLine(); + iw.WriteLine("using System.Runtime.InteropServices;"); + iw.WriteLine(); + + using (var en = enums.GetEnumerator()) { - var csb = new StringBuilder(); + if (en.MoveNext()) + { + WriteEnum(iw, en.Current); + + while (en.MoveNext()) + { + iw.WriteLine(); - csb.AppendLine("[StructLayout(LayoutKind.Explicit)]"); - csb.Append($"struct {c.Name}"); - if (!string.IsNullOrEmpty(c.Comment)) + WriteEnum(iw, en.Current); + } + + iw.WriteLine(); + } + } + + var classesToWrite = classes + .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. + .Distinct(); + + using (var en = classesToWrite.GetEnumerator()) + { + if (en.MoveNext()) { - csb.Append($" // {c.Comment}"); + WriteClass(iw, en.Current, logger); + + while (en.MoveNext()) + { + iw.WriteLine(); + + WriteClass(iw, en.Current, logger); + } } - csb.AppendLine(); - - csb.AppendLine("{"); - - csb.AppendLine( - string.Join( - Environment.NewLine + Environment.NewLine, - GetTypeDeclerationsForNodes(c.Nodes, logger) - .Select(t => $"\t{t.Item1}{Environment.NewLine}\t{t.Item2}") - ) - ); - csb.Append("}"); - return csb.ToString(); - }) - ) - ); - - return sb.ToString(); + } + } + + return sw.ToString(); + } } - private static IEnumerable> GetTypeDeclerationsForNodes(IEnumerable members, ILogger logger) + /// + /// Outputs the C# code for the given enum to the instance. + /// + /// The writer to output to. + /// The enum to output. + private static void WriteEnum(IndentedTextWriter writer, EnumDescription @enum) { - Contract.Requires(members != null); - Contract.Requires(Contract.ForAll(members, m => m != null)); + Contract.Requires(writer != null); + Contract.Requires(@enum != null); + + writer.Write($"enum {@enum.Name} : "); + switch (@enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int8Node)]); + break; + case EnumDescription.UnderlyingTypeSize.TwoBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int16Node)]); + break; + case EnumDescription.UnderlyingTypeSize.FourBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int32Node)]); + break; + case EnumDescription.UnderlyingTypeSize.EightBytes: + writer.WriteLine(nodeTypeToTypeDefinationMap[typeof(Int64Node)]); + break; + } + writer.WriteLine("{"); + writer.Indent++; + for (var j = 0; j < @enum.Values.Count; ++j) + { + var kv = @enum.Values[j]; + + writer.Write(kv.Key); + writer.Write(" = "); + writer.Write(kv.Value); + if (j < @enum.Values.Count - 1) + { + writer.Write(","); + } + writer.WriteLine(); + } + writer.Indent--; + writer.WriteLine("};"); + } + + /// + /// Outputs the C# code for the given class to the instance. + /// + /// The writer to output to. + /// The class to output. + /// The logger. + private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILogger logger) + { + Contract.Requires(writer != null); + Contract.Requires(@class != null); Contract.Requires(logger != null); - Contract.Ensures(Contract.Result>>() != null); - Contract.Ensures(Contract.ForAll(Contract.Result>>(), t => t != null)); - foreach (var member in members.WhereNot(n => n is BaseHexNode)) + writer.WriteLine("[StructLayout(LayoutKind.Explicit)]"); + writer.Write("class "); + writer.Write(@class.Name); + + if (!string.IsNullOrEmpty(@class.Comment)) { - var type = GetTypeForNode(member, logger); + writer.Write(" // "); + writer.Write(@class.Comment); + } + + writer.WriteLine(); + + writer.WriteLine("{"); + writer.Indent++; + + var nodes = @class.Nodes + .WhereNot(n => n is FunctionNode || n is BaseHexNode); + foreach (var node in nodes) + { + var type = GetTypeDefinition(node); if (type != null) { - yield return Tuple.Create( - $"[FieldOffset({member.Offset.ToInt32()})]", - $"public {type} {member.Name}; //0x{member.Offset.ToInt32():X04} {member.Comment}".Trim() - ); + writer.Write("[FieldOffset("); + writer.Write(node.Offset.ToInt32()); + writer.WriteLine(")]"); + + writer.Write("public "); + writer.Write(type); + writer.Write(" "); + writer.Write(node.Name); + writer.Write("; //0x"); + writer.Write($"{node.Offset.ToInt32():X04}"); + if (!string.IsNullOrEmpty(node.Comment)) + { + writer.Write(" "); + writer.Write(node.Comment); + } + writer.WriteLine(); } else { - logger.Log(LogLevel.Warning, $"Skipping node with unhandled type: {member.GetType()}"); + logger.Log(LogLevel.Warning, $"Skipping node with unhandled type: {node.GetType()}"); } } + + writer.Indent--; + writer.WriteLine("}"); } - private static string GetTypeForNode(BaseNode node, ILogger logger) + /// + /// Gets the type definition for the given node. If the node is not a simple node null is returned. + /// + /// The target node. + /// The type definition for the node or null if no simple type is available. + private static string GetTypeDefinition(BaseNode node) { Contract.Requires(node != null); - Contract.Requires(logger != null); if (node is BitFieldNode bitFieldNode) { @@ -116,11 +213,16 @@ private static string GetTypeForNode(BaseNode node, ILogger logger) node = underlayingNode; } - if (typeToTypedefMap.TryGetValue(node.GetType(), out var type)) + if (nodeTypeToTypeDefinationMap.TryGetValue(node.GetType(), out var type)) { return type; } + if (node is EnumNode enumNode) + { + return enumNode.Enum.Name; + } + return null; } } From 3493e013a64f5f92df12b5e21cbd12a9e3f8d241 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 22 Mar 2019 21:41:43 +0100 Subject: [PATCH 528/777] Removed unused import. --- ReClass.NET/Nodes/EnumNode.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index db5c064b..f0236285 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; using System.Text; From d3777343a77f1125b665a242c44dc90e6f0014a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 23 Mar 2019 23:07:39 +0100 Subject: [PATCH 529/777] Use int instead of IntPtr. Added IntPtr address for ClassNode. --- ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 4 ++-- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 8 ++++---- ReClass.NET/Forms/MainForm.Functions.cs | 4 ++-- ReClass.NET/Memory/NodeDissector.cs | 2 +- ReClass.NET/Nodes/ArrayNode.cs | 4 ++-- ReClass.NET/Nodes/BaseContainerNode.cs | 2 +- ReClass.NET/Nodes/BaseHexCommentNode.cs | 2 +- ReClass.NET/Nodes/BaseHexNode.cs | 2 +- ReClass.NET/Nodes/BaseNode.cs | 10 +++++----- ReClass.NET/Nodes/ClassInstanceNode.cs | 4 ++-- ReClass.NET/Nodes/ClassNode.cs | 11 +++++++---- ReClass.NET/Nodes/FunctionNode.cs | 2 +- ReClass.NET/Nodes/VirtualMethodNode.cs | 4 ++-- ReClass.NET/UI/MemoryPreviewPopUp.cs | 8 ++++++-- ReClass.NET/UI/MemoryViewControl.cs | 12 ++++++------ 15 files changed, 43 insertions(+), 36 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 48d6ffb1..b4d36d17 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -171,7 +171,7 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog if (type != null) { writer.Write("[FieldOffset("); - writer.Write(node.Offset.ToInt32()); + writer.Write(node.Offset); writer.WriteLine(")]"); writer.Write("public "); @@ -179,7 +179,7 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog writer.Write(" "); writer.Write(node.Name); writer.Write("; //0x"); - writer.Write($"{node.Offset.ToInt32():X04}"); + writer.Write($"{node.Offset:X04}"); if (!string.IsNullOrEmpty(node.Comment)) { writer.Write(" "); diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index be307cd7..b006c41d 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -368,7 +368,7 @@ BaseNode CreatePaddingMember(int offset, int count) { var node = new ArrayNode { - Offset = (IntPtr)offset, + Offset = offset, Count = count, Name = $"pad_{offset:X04}" }; @@ -384,7 +384,7 @@ BaseNode CreatePaddingMember(int offset, int count) { if (fill == 0) { - fillStart = member.Offset.ToInt32(); + fillStart = member.Offset; } fill += member.MemorySize; @@ -437,7 +437,7 @@ private void WriteNode(IndentedTextWriter writer, BaseNode node, ILogger logger) writer.Write(" "); writer.Write(node.Name); writer.Write("; //0x"); - writer.Write($"{node.Offset.ToInt32():X04}"); + writer.Write($"{node.Offset:X04}"); if (!string.IsNullOrEmpty(node.Comment)) { writer.Write(" "); @@ -449,7 +449,7 @@ private void WriteNode(IndentedTextWriter writer, BaseNode node, ILogger logger) { writer.Write(ResolveWrappedType(node, false, logger)); writer.Write("; //0x"); - writer.Write($"{node.Offset.ToInt32():X04}"); + writer.Write($"{node.Offset:X04}"); if (!string.IsNullOrEmpty(node.Comment)) { writer.Write(" "); diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index c1e262f2..5bf0d1c0 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -296,7 +296,7 @@ public void ReplaceSelectedNodesWithType(Type type) .WhereNot(s => s.Node is ClassNode) .GroupBy(s => s.Node.GetParentContainer()) .SelectMany(g => g - .OrderBy(s => s.Node.Offset, IntPtrComparer.Instance) + .OrderBy(s => s.Node.Offset) .GroupWhile((h1, h2) => h1.Node.Offset + h1.Node.MemorySize == h2.Node.Offset) ); @@ -323,7 +323,7 @@ public void ReplaceSelectedNodesWithType(Type type) { foreach (var createdNode in createdNodes) { - hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Memory, selected.Address.Add(createdNode.Offset.Sub(node.Offset)), selected.Level)); + hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level)); } } } diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index e067011b..8046efe1 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -30,7 +30,7 @@ public static BaseNode GuessExplicitNode(BaseHexNode node, MemoryBuffer memory) Contract.Requires(node != null); Contract.Requires(memory != null); - var offset = node.Offset.ToInt32(); + var offset = node.Offset; var is4ByteAligned = offset % 4 == 0; var is8ByteAligned = offset % 8 == 0; diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs index 9bfed4d2..85643e5d 100644 --- a/ReClass.NET/Nodes/ArrayNode.cs +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -31,9 +31,9 @@ public override Size Draw(ViewInfo view, int x, int y) protected override Size DrawChild(ViewInfo view, int x, int y) { var v = view.Clone(); - v.Address = view.Address.Add(Offset) + InnerNode.MemorySize * CurrentIndex; + v.Address = view.Address + Offset + InnerNode.MemorySize * CurrentIndex; v.Memory = view.Memory.Clone(); - v.Memory.Offset += Offset.ToInt32() + InnerNode.MemorySize * CurrentIndex; + v.Memory.Offset += Offset + InnerNode.MemorySize * CurrentIndex; return InnerNode.Draw(v, x, y); } diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index cdda08bc..3ea80604 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -44,7 +44,7 @@ public override void ClearSelection() /// Calculates the offset of every child node. public void UpdateOffsets() { - var offset = IntPtr.Zero; + var offset = 0; foreach (var node in Nodes) { node.Offset = offset; diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index e03dbada..f59fca44 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -81,7 +81,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentPluginInfo) { - var nodeAddress = view.Address.Add(Offset); + var nodeAddress = view.Address + Offset; foreach (var reader in NodeInfoReader) { diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index 055aa689..023bcd6e 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -57,7 +57,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) var color = view.Settings.HexColor; if (view.Settings.HighlightChangedValues) { - var address = view.Address.Add(Offset); + var address = view.Address + Offset; highlightTimer.RemoveWhere(kv => kv.Value.Value < view.CurrentTime); diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 4f782c45..a0cfed16 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -29,7 +29,7 @@ public abstract class BaseNode private string comment = string.Empty; /// Gets or sets the offset of the node. - public IntPtr Offset { get; set; } + public int Offset { get; set; } /// Gets or sets the name of the node. If a new name was set the property changed event gets fired. public virtual string Name { get => name; set { if (value != null && name != value) { name = value; NameChanged?.Invoke(this); } } } @@ -62,7 +62,7 @@ private void ObjectInvariants() { Contract.Invariant(name != null); Contract.Invariant(comment != null); - Contract.Invariant(Offset.ToInt32() >= 0); + Contract.Invariant(Offset >= 0); Contract.Invariant(LevelsOpen != null); } @@ -292,7 +292,7 @@ protected void AddHotSpot(ViewInfo view, Rectangle spot, string text, int id, Ho { Rect = spot, Text = text, - Address = view.Address.Add(Offset), + Address = view.Address + Offset, Id = id, Type = type, Node = this, @@ -349,12 +349,12 @@ protected int AddAddressOffset(ViewInfo view, int x, int y) if (view.Settings.ShowNodeOffset) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, $"{Offset.ToInt32():X04}") + view.Font.Width; + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, $"{Offset:X04}") + view.Font.Width; } if (view.Settings.ShowNodeAddress) { - x = AddText(view, x, y, view.Settings.AddressColor, HotSpot.AddressId, view.Address.Add(Offset).ToString(Constants.AddressHexFormat)) + view.Font.Width; + x = AddText(view, x, y, view.Settings.AddressColor, HotSpot.AddressId, (view.Address + Offset).ToString(Constants.AddressHexFormat)) + view.Font.Width; } return x; diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index 49dd1ef2..a8682dac 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -56,9 +56,9 @@ public override Size Draw(ViewInfo view, int x, int y) if (LevelsOpen[view.Level]) { var v = view.Clone(); - v.Address = view.Address.Add(Offset); + v.Address = view.Address + Offset; v.Memory = view.Memory.Clone(); - v.Memory.Offset += Offset.ToInt32(); + v.Memory.Offset += Offset; var innerSize = InnerNode.Draw(v, tx, y); size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index bd9f9ec3..de288a1b 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -39,12 +39,15 @@ public NodeUuid Uuid } } + private IntPtr address; + public IntPtr Address { + get => address; set { Contract.Ensures(AddressFormula != null); - + address = value; AddressFormula = value.ToString("X"); } } @@ -191,7 +194,7 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - Offset = spot.Memory.Process.ParseAddress(spot.Text); + Address = spot.Memory.Process.ParseAddress(spot.Text); AddressFormula = spot.Text; } @@ -203,11 +206,11 @@ public void UpdateAddress(RemoteProcess process) try { - Offset = process.ParseAddress(AddressFormula); + Address = process.ParseAddress(AddressFormula); } catch (ParseException) { - Offset = IntPtr.Zero; + Address = IntPtr.Zero; } } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index fb2dfe44..1c0608f3 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -67,7 +67,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, view.Font.Height); - var ptr = view.Address.Add(Offset); + var ptr = view.Address + Offset; DisassembleRemoteCode(view.Memory, ptr); if (LevelsOpen[view.Level]) diff --git a/ReClass.NET/Nodes/VirtualMethodNode.cs b/ReClass.NET/Nodes/VirtualMethodNode.cs index 06a88f34..88b80a61 100644 --- a/ReClass.NET/Nodes/VirtualMethodNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodNode.cs @@ -7,7 +7,7 @@ namespace ReClassNET.Nodes { public class VirtualMethodNode : BaseFunctionPtrNode { - public string MethodName => string.IsNullOrEmpty(Name) ? $"Function{Offset.ToInt32() / IntPtr.Size}" : Name; + public string MethodName => string.IsNullOrEmpty(Name) ? $"Function{Offset / IntPtr.Size}" : Name; public override void GetUserInterfaceInfo(out string name, out Image icon) { @@ -23,7 +23,7 @@ public VirtualMethodNode() public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, $"({Offset.ToInt32() / IntPtr.Size})", MethodName); + return Draw(view, x, y, $"({Offset / IntPtr.Size})", MethodName); } } } diff --git a/ReClass.NET/UI/MemoryPreviewPopUp.cs b/ReClass.NET/UI/MemoryPreviewPopUp.cs index af8b3d29..1d04834a 100644 --- a/ReClass.NET/UI/MemoryPreviewPopUp.cs +++ b/ReClass.NET/UI/MemoryPreviewPopUp.cs @@ -54,11 +54,15 @@ private void SetNodeCount(int count) { BaseHexNode CreateNode(int index) { + return new #if RECLASSNET64 - return new Hex64Node { Offset = (IntPtr)(index * 8) }; + Hex64Node #else - return new Hex32Node { Offset = (IntPtr)(index * 4) }; + Hex32Node #endif + { + Offset = index * IntPtr.Size + }; } if (nodes.Count < count) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index ba214309..ead9e1f1 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -159,7 +159,7 @@ protected override void OnPaint(PaintEventArgs e) } Memory.Size = ClassNode.MemorySize; - Memory.Update(ClassNode.Offset); + Memory.Update(ClassNode.Address); var view = new ViewInfo { @@ -170,7 +170,7 @@ protected override void OnPaint(PaintEventArgs e) CurrentTime = DateTime.UtcNow, ClientArea = ClientRectangle, HotSpots = hotSpots, - Address = ClassNode.Offset, + Address = classNode.Address, Level = 0, MultipleNodesSelected = selectedNodes.Count > 1 }; @@ -306,7 +306,7 @@ protected override void OnMouseClick(MouseEventArgs e) continue; } - var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset.ToInt32()); + var first = Utils.Min(selectedNodes[0], hotSpot, h => h.Node.Offset); var last = first == hotSpot ? selectedNodes[0] : hotSpot; ClearSelection(); @@ -317,7 +317,7 @@ protected override void OnMouseClick(MouseEventArgs e) .TakeUntil(n => n == last.Node) .Select(n => new HotSpot { - Address = containerNode.Offset.Add(n.Offset), + Address = (IntPtr)(containerNode.Offset + n.Offset), Node = n, Memory = first.Memory, Level = first.Level @@ -584,7 +584,7 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) selectionCaret = toSelect; } - var first = Utils.Min(selectionAnchor, selectionCaret, h => h.Node.Offset.ToInt32()); + var first = Utils.Min(selectionAnchor, selectionCaret, h => h.Node.Offset); var last = first == selectionAnchor ? selectionCaret : selectionAnchor; selectedNodes.ForEach(h => h.Node.ClearSelection()); @@ -596,7 +596,7 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) .TakeUntil(n => n == last.Node) .Select(n => new HotSpot { - Address = containerNode.Offset.Add(n.Offset), + Address = (IntPtr)(containerNode.Offset + n.Offset), Node = n, Memory = toSelect.Memory, Level = toSelect.Level From ff6e7b1ee94e7899f8a48707d9f15077c2e9a3d8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 23 Mar 2019 23:10:53 +0100 Subject: [PATCH 530/777] Removed now unneeded wrapper methods. --- ReClass.NET/Memory/MemoryBuffer.cs | 154 ----------------------------- 1 file changed, 154 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index b2dfa895..d367c1f4 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -3,7 +3,6 @@ using System.Runtime.InteropServices; using System.Text; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.Memory { @@ -119,11 +118,6 @@ public void Update(IntPtr address, bool setHistory) } } - public byte[] ReadBytes(IntPtr offset, int length) - { - return ReadBytes(offset.ToInt32(), length); - } - public byte[] ReadBytes(int offset, int length) { Contract.Requires(offset >= 0); @@ -136,13 +130,6 @@ public byte[] ReadBytes(int offset, int length) return buffer; } - public void ReadBytes(IntPtr offset, byte[] buffer) - { - Contract.Requires(buffer != null); - - ReadBytes(offset.ToInt32(), buffer); - } - public void ReadBytes(int offset, byte[] buffer) { Contract.Requires(offset >= 0); @@ -157,13 +144,6 @@ public void ReadBytes(int offset, byte[] buffer) Array.Copy(data, offset, buffer, 0, buffer.Length); } - public T ReadObject(IntPtr offset) where T : unmanaged - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadObject(offset.ToInt32()); - } - public T ReadObject(int offset) where T : unmanaged { Contract.Requires(offset >= 0); @@ -183,16 +163,6 @@ public T ReadObject(int offset) where T : unmanaged #region Read Primitive Types - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public sbyte ReadInt8(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadInt8(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -209,16 +179,6 @@ public sbyte ReadInt8(int offset) return (sbyte)data[offset]; } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public byte ReadUInt8(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadUInt8(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -235,16 +195,6 @@ public byte ReadUInt8(int offset) return data[offset]; } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public short ReadInt16(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadInt16(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -261,16 +211,6 @@ public short ReadInt16(int offset) return BitConverter.ToInt16(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public ushort ReadUInt16(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadUInt16(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -287,16 +227,6 @@ public ushort ReadUInt16(int offset) return BitConverter.ToUInt16(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public int ReadInt32(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadInt32(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -313,16 +243,6 @@ public int ReadInt32(int offset) return BitConverter.ToInt32(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public uint ReadUInt32(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadUInt32(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -339,16 +259,6 @@ public uint ReadUInt32(int offset) return BitConverter.ToUInt32(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public long ReadInt64(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadInt64(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -365,16 +275,6 @@ public long ReadInt64(int offset) return BitConverter.ToInt64(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public ulong ReadUInt64(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadUInt64(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -391,16 +291,6 @@ public ulong ReadUInt64(int offset) return BitConverter.ToUInt64(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public float ReadFloat(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadFloat(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -417,16 +307,6 @@ public float ReadFloat(int offset) return BitConverter.ToSingle(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public double ReadDouble(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadDouble(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -443,16 +323,6 @@ public double ReadDouble(int offset) return BitConverter.ToDouble(data, offset); } - /// Reads a from the specific offset. - /// The offset into the data. - /// The data read as or 0 if the offset is outside the data. - public IntPtr ReadIntPtr(IntPtr offset) - { - Contract.Requires(offset.ToInt32() >= 0); - - return ReadIntPtr(offset.ToInt32()); - } - /// Reads a from the specific offset. /// The offset into the data. /// The data read as or 0 if the offset is outside the data. @@ -469,15 +339,6 @@ public IntPtr ReadIntPtr(int offset) #endregion - public string ReadPrintableAsciiString(IntPtr offset, int length) - { - Contract.Requires(offset.ToInt32() >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - return ReadPrintableAsciiString(offset.ToInt32(), length); - } - public string ReadPrintableAsciiString(int offset, int length) { Contract.Requires(offset >= 0); @@ -503,16 +364,6 @@ public string ReadPrintableAsciiString(int offset, int length) return sb.ToString(); } - public string ReadString(Encoding encoding, IntPtr offset, int length) - { - Contract.Requires(encoding != null); - Contract.Requires(offset.ToInt32() >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - return ReadString(encoding, offset.ToInt32(), length); - } - public string ReadString(Encoding encoding, int offset, int length) { Contract.Requires(encoding != null); @@ -536,11 +387,6 @@ public string ReadString(Encoding encoding, int offset, int length) return sb.ToString(); } - public bool HasChanged(IntPtr offset, int length) - { - return HasChanged(offset.ToInt32(), length); - } - public bool HasChanged(int offset, int length) { if (!hasHistory) From ef9e601cd788c6b6a2890357de079c6b5233fbed Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 23 Mar 2019 23:25:05 +0100 Subject: [PATCH 531/777] Decouple form from Program class. --- ReClass.NET/Forms/MainForm.cs | 2 +- ReClass.NET/Forms/ProcessInfoForm.cs | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 8cc7f6fc..bac4d839 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -318,7 +318,7 @@ private void quitToolStripMenuItem_Click(object sender, EventArgs e) private void memoryViewerToolStripMenuItem_Click(object sender, EventArgs e) { - new ProcessInfoForm().Show(); + new ProcessInfoForm(Program.RemoteProcess).Show(); } private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index 88bb25f7..5c1e5fe0 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Diagnostics.Contracts; using System.Drawing; using System.IO; using System.Linq; @@ -13,11 +14,17 @@ namespace ReClassNET.Forms { public partial class ProcessInfoForm : IconForm { + private readonly RemoteProcess process; + /// The context menu of the sections grid view. public ContextMenuStrip GridContextMenu => contextMenuStrip; - public ProcessInfoForm() + public ProcessInfoForm(RemoteProcess process) { + Contract.Requires(process != null); + + this.process = process; + InitializeComponent(); tabControl.ImageList = new ImageList(); @@ -54,7 +61,7 @@ protected override void OnFormClosed(FormClosedEventArgs e) private async void ProcessInfoForm_Load(object sender, EventArgs e) { - if (!Program.RemoteProcess.IsValid) + if (!process.IsValid) { return; } @@ -78,7 +85,7 @@ private async void ProcessInfoForm_Load(object sender, EventArgs e) await Task.Run(() => { - Program.RemoteProcess.EnumerateRemoteSectionsAndModules( + process.EnumerateRemoteSectionsAndModules( delegate (Section section) { var row = sections.NewRow(); @@ -180,7 +187,7 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) if (sfd.ShowDialog() == DialogResult.OK) { - var dumper = new Dumper(Program.RemoteProcess); + var dumper = new Dumper(process); try { From 0dce01e6f3c737b823265e5992ba3296f9329efa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 23 Mar 2019 23:31:41 +0100 Subject: [PATCH 532/777] More decoupling. --- ReClass.NET/Forms/InputCorrelatorForm.cs | 13 +++++--- ReClass.NET/Forms/MainForm.cs | 2 +- ReClass.NET/Forms/ScannerForm.cs | 40 ++++++++++++++---------- ReClass.NET/UI/LinkedWindowFeatures.cs | 2 +- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/ReClass.NET/Forms/InputCorrelatorForm.cs b/ReClass.NET/Forms/InputCorrelatorForm.cs index 0220ca81..79508029 100644 --- a/ReClass.NET/Forms/InputCorrelatorForm.cs +++ b/ReClass.NET/Forms/InputCorrelatorForm.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.Input; +using ReClassNET.Memory; using ReClassNET.MemoryScanner; using ReClassNET.UI; @@ -15,17 +16,21 @@ public partial class InputCorrelatorForm : IconForm private static readonly TimeSpan refineInterval = TimeSpan.FromMilliseconds(400); private readonly ScannerForm scannerForm; + private readonly RemoteProcess process; + private readonly KeyboardInput input; private InputCorrelatedScanner scanner; private bool isScanning = false; private DateTime lastRefineTime; - public InputCorrelatorForm(ScannerForm sf) + public InputCorrelatorForm(ScannerForm scannerForm, RemoteProcess process) { - Contract.Requires(sf != null); + Contract.Requires(scannerForm != null); + Contract.Requires(process != null); - scannerForm = sf; + this.scannerForm = scannerForm; + this.process = process; InitializeComponent(); @@ -122,7 +127,7 @@ private async void startStopButton_Click(object sender, EventArgs e) } scanner = new InputCorrelatedScanner( - Program.RemoteProcess, + process, input, hotkeyListBox.Items.Cast(), valueTypeComboBox.SelectedValue diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index bac4d839..4bc42543 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -323,7 +323,7 @@ private void memoryViewerToolStripMenuItem_Click(object sender, EventArgs e) private void memorySearcherToolStripMenuItem_Click(object sender, EventArgs e) { - new ScannerForm().Show(); + new ScannerForm(Program.RemoteProcess).Show(); } private void namedAddressesToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 81eebc89..cfbefa55 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -27,6 +27,8 @@ internal class ScanValueTypeComboBox : EnumComboBox { } private const int MaxVisibleResults = 10000; + private readonly RemoteProcess process; + private bool isFirstScan; private Scanner scanner; @@ -34,8 +36,12 @@ internal class ScanValueTypeComboBox : EnumComboBox { } private string addressFilePath; - public ScannerForm() + public ScannerForm(RemoteProcess process) { + Contract.Requires(process != null); + + this.process = process; + InitializeComponent(); toolStripPanel.Renderer = new CustomToolStripProfessionalRenderer(true, false); @@ -47,10 +53,10 @@ public ScannerForm() Reset(); - firstScanButton.Enabled = flowLayoutPanel.Enabled = Program.RemoteProcess.IsValid; + firstScanButton.Enabled = flowLayoutPanel.Enabled = process.IsValid; - Program.RemoteProcess.ProcessAttached += RemoteProcessOnProcessAttached; - Program.RemoteProcess.ProcessClosing += RemoteProcessOnProcessClosing; + process.ProcessAttached += RemoteProcessOnProcessAttached; + process.ProcessClosing += RemoteProcessOnProcessClosing; } protected override void OnLoad(EventArgs e) @@ -85,8 +91,8 @@ private void RemoteProcessOnProcessAttached(RemoteProcess remoteProcess) { foreach (var record in addressListMemoryRecordList.Records) { - record.ResolveAddress(Program.RemoteProcess); - record.RefreshValue(Program.RemoteProcess); + record.ResolveAddress(process); + record.RefreshValue(process); } } } @@ -103,14 +109,14 @@ private void MemorySearchForm_FormClosing(object sender, FormClosingEventArgs e) { scanner?.Dispose(); - Program.RemoteProcess.ProcessAttached -= RemoteProcessOnProcessAttached; - Program.RemoteProcess.ProcessClosing -= RemoteProcessOnProcessClosing; + process.ProcessAttached -= RemoteProcessOnProcessAttached; + process.ProcessClosing -= RemoteProcessOnProcessClosing; } private void updateValuesTimer_Tick(object sender, EventArgs e) { - resultMemoryRecordList.RefreshValues(Program.RemoteProcess); - addressListMemoryRecordList.RefreshValues(Program.RemoteProcess); + resultMemoryRecordList.RefreshValues(process); + addressListMemoryRecordList.RefreshValues(process); } private void scanTypeComboBox_SelectionChangeCommitted(object sender, EventArgs e) @@ -147,7 +153,7 @@ private async void firstScanButton_Click(object sender, EventArgs e) private async void nextScanButton_Click(object sender, EventArgs e) { - if (!Program.RemoteProcess.IsValid) + if (!process.IsValid) { return; } @@ -245,8 +251,8 @@ private void openAddressFileToolStripButton_Click(object sender, EventArgs e) import.Load(ofd.FileName, Program.Logger) .Select(r => { - r.ResolveAddress(Program.RemoteProcess); - r.RefreshValue(Program.RemoteProcess); + r.ResolveAddress(process); + r.RefreshValue(process); return r; }) ); @@ -301,7 +307,7 @@ private void clearAddressListToolStripButton_Click(object sender, EventArgs e) private void showInputCorrelatorIconButton_Click(object sender, EventArgs e) { - new InputCorrelatorForm(this).Show(); + new InputCorrelatorForm(this, process).Show(); } private void resultListContextMenuStrip_Opening(object sender, CancelEventArgs e) @@ -415,7 +421,7 @@ public void ShowScannerResults(Scanner scanner) .Select(r => { var record = new MemoryRecord(r); - record.ResolveAddress(Program.RemoteProcess); + record.ResolveAddress(process); return record; }) ); @@ -586,7 +592,7 @@ public void ExcuteScan(ScanSettings settings, IScanComparer comparer) /// The comparer. private async Task StartFirstScanEx(ScanSettings settings, IScanComparer comparer) { - if (!Program.RemoteProcess.IsValid) + if (!process.IsValid) { return; } @@ -596,7 +602,7 @@ private async Task StartFirstScanEx(ScanSettings settings, IScanComparer compare try { - scanner = new Scanner(Program.RemoteProcess, settings); + scanner = new Scanner(process, settings); var report = new Progress(i => { diff --git a/ReClass.NET/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs index d2d4950d..02f3f3e9 100644 --- a/ReClass.NET/UI/LinkedWindowFeatures.cs +++ b/ReClass.NET/UI/LinkedWindowFeatures.cs @@ -92,7 +92,7 @@ public static void StartMemoryScan(IScanComparer comparer) } if (sf == null) { - sf = new ScannerForm(); + sf = new ScannerForm(Program.RemoteProcess); sf.Show(); } From e9689c59c54c6c5c5301000aba88b58baf544f61 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 23 Mar 2019 23:37:11 +0100 Subject: [PATCH 533/777] Changed IList to IReadOnlyList. --- ReClass.NET/Memory/Disassembler.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index 16b65177..f62ea7ea 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -27,7 +27,7 @@ public Disassembler(CoreFunctionsManager coreFunctions) /// The address of the code. /// The length of the code in bytes. /// A list of . - public IList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length) + public IReadOnlyList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -41,7 +41,7 @@ public IList RemoteDisassembleCode(RemoteProcess proces /// The length of the code in bytes. /// The maximum number of instructions to disassemble. If is -1, all available instructions get returned. /// A list of . - public IList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length, int maxInstructions) + public IReadOnlyList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length, int maxInstructions) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -56,7 +56,7 @@ public IList RemoteDisassembleCode(RemoteProcess proces /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. /// The maximum number of instructions to disassemble. If is -1, all available instructions get returned. /// A list of . - public IList DisassembleCode(byte[] data, IntPtr virtualAddress, int maxInstructions) + public IReadOnlyList DisassembleCode(byte[] data, IntPtr virtualAddress, int maxInstructions) { Contract.Requires(data != null); Contract.Ensures(Contract.Result>() != null); @@ -89,7 +89,7 @@ public IList DisassembleCode(byte[] data, IntPtr virtua /// The address of the code. /// The maximum maxLength of the code. /// A list of which belong to the function. - public IList RemoteDisassembleFunction(RemoteProcess process, IntPtr address, int maxLength) + public IReadOnlyList RemoteDisassembleFunction(RemoteProcess process, IntPtr address, int maxLength) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -103,7 +103,7 @@ public IList RemoteDisassembleFunction(RemoteProcess pr /// The data to disassemble. /// The virtual address of the code. This allows to decode instructions located anywhere in memory even if they are not at their original place. /// A list of which belong to the function. - public IList DisassembleFunction(byte[] data, IntPtr virtualAddress) + public IReadOnlyList DisassembleFunction(byte[] data, IntPtr virtualAddress) { Contract.Requires(data != null); Contract.Ensures(Contract.Result>() != null); From 7ec2af06a8580a83bc169b512bad630850765378 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 24 Mar 2019 00:44:49 +0100 Subject: [PATCH 534/777] Added interface. --- ReClass.NET/Core/CoreFunctionsManager.cs | 1 - ReClass.NET/Core/IInternalCoreFunctions.cs | 16 ++++++++++++++++ ReClass.NET/Core/InternalCoreFunctions.cs | 2 +- ReClass.NET/Core/NativeCoreWrapper.cs | 1 - ReClass.NET/ReClass.NET.csproj | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 ReClass.NET/Core/IInternalCoreFunctions.cs diff --git a/ReClass.NET/Core/CoreFunctionsManager.cs b/ReClass.NET/Core/CoreFunctionsManager.cs index a8fa0c68..92af4d6e 100644 --- a/ReClass.NET/Core/CoreFunctionsManager.cs +++ b/ReClass.NET/Core/CoreFunctionsManager.cs @@ -7,7 +7,6 @@ using ReClassNET.Debugger; using ReClassNET.Extensions; using ReClassNET.Memory; -using ReClassNET.Util; namespace ReClassNET.Core { diff --git a/ReClass.NET/Core/IInternalCoreFunctions.cs b/ReClass.NET/Core/IInternalCoreFunctions.cs new file mode 100644 index 00000000..e1418f14 --- /dev/null +++ b/ReClass.NET/Core/IInternalCoreFunctions.cs @@ -0,0 +1,16 @@ +using System; +using System.Windows.Forms; + +namespace ReClassNET.Core +{ + public interface IInternalCoreFunctions + { + bool DisassembleCode(IntPtr address, int length, IntPtr virtualAddress, bool determineStaticInstructionBytes, EnumerateInstructionCallback callback); + + IntPtr InitializeInput(); + + Keys[] GetPressedKeys(IntPtr handle); + + void ReleaseInput(IntPtr handle); + } +} diff --git a/ReClass.NET/Core/InternalCoreFunctions.cs b/ReClass.NET/Core/InternalCoreFunctions.cs index 74467316..0e1494b3 100644 --- a/ReClass.NET/Core/InternalCoreFunctions.cs +++ b/ReClass.NET/Core/InternalCoreFunctions.cs @@ -10,7 +10,7 @@ namespace ReClassNET.Core { public delegate bool EnumerateInstructionCallback(ref InstructionData data); - internal class InternalCoreFunctions : NativeCoreWrapper, IDisposable + internal class InternalCoreFunctions : NativeCoreWrapper, IInternalCoreFunctions, IDisposable { private const string CoreFunctionsModuleWindows = "NativeCore.dll"; private const string CoreFunctionsModuleUnix = "NativeCore.so"; diff --git a/ReClass.NET/Core/NativeCoreWrapper.cs b/ReClass.NET/Core/NativeCoreWrapper.cs index 9ec1e24b..bdca5954 100644 --- a/ReClass.NET/Core/NativeCoreWrapper.cs +++ b/ReClass.NET/Core/NativeCoreWrapper.cs @@ -3,7 +3,6 @@ using ReClassNET.Debugger; using ReClassNET.Extensions; using ReClassNET.Native; -using ReClassNET.Util; namespace ReClassNET.Core { diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index faa05642..7faf53d3 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -148,6 +148,7 @@ + From d9675f7e32e6c595db4ab4d3164a52b693a792aa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 31 Mar 2019 21:43:19 +0200 Subject: [PATCH 535/777] Revert efdf372 because of #100. --- ReClass.NET/Memory/MemoryBuffer.cs | 2 +- ReClass.NET/Memory/RemoteProcess.cs | 4 ++-- ReClass.NET/ReClass.NET.csproj | 1 - ReClass.NET/UI/EnumComboBox.cs | 8 ++++---- ReClass.NET/UI/EnumDescriptionDisplay.cs | 3 ++- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index d367c1f4..df4f0176 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -144,7 +144,7 @@ public void ReadBytes(int offset, byte[] buffer) Array.Copy(data, offset, buffer, 0, buffer.Length); } - public T ReadObject(int offset) where T : unmanaged + public T ReadObject(int offset) where T : struct { Contract.Requires(offset >= 0); diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 9c24322d..05125400 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -206,7 +206,7 @@ public byte[] ReadRemoteMemory(IntPtr address, int size) /// Type of the value to read. /// The address to read from. /// The remote object. - public T ReadRemoteObject(IntPtr address) where T : unmanaged + public T ReadRemoteObject(IntPtr address) where T : struct { var data = ReadRemoteMemory(address, Marshal.SizeOf()); @@ -569,7 +569,7 @@ public bool WriteRemoteMemory(IntPtr address, byte[] data) /// The address to write to. /// The value to write. /// True if it succeeds, false if it fails. - public bool WriteRemoteMemory(IntPtr address, T value) where T : unmanaged + public bool WriteRemoteMemory(IntPtr address, T value) where T : struct { var data = new byte[Marshal.SizeOf()]; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 7faf53d3..4adb6b35 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -70,7 +70,6 @@ Full %28none%29 3 - latest x86 diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/UI/EnumComboBox.cs index 75bc3dd1..c266a9fa 100644 --- a/ReClass.NET/UI/EnumComboBox.cs +++ b/ReClass.NET/UI/EnumComboBox.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; using ReClassNET.Extensions; +using ReClassNET.Util; namespace ReClassNET.UI { - public class EnumComboBox : ComboBox where TEnum : Enum + public class EnumComboBox : ComboBox where TEnum : struct { #region Properties @@ -52,7 +52,7 @@ public class EnumComboBox : ComboBox where TEnum : Enum [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new TEnum SelectedValue { - get => ((EnumDescriptionDisplay)base.SelectedItem).Value; + get => ((EnumDescriptionDisplay)base.SelectedItem)?.Value ?? default(TEnum); set => base.SelectedItem = base.Items.Cast>().PredicateOrFirst(e => e.Value.Equals(value)); } diff --git a/ReClass.NET/UI/EnumDescriptionDisplay.cs b/ReClass.NET/UI/EnumDescriptionDisplay.cs index 3c495fb6..692b22ce 100644 --- a/ReClass.NET/UI/EnumDescriptionDisplay.cs +++ b/ReClass.NET/UI/EnumDescriptionDisplay.cs @@ -5,10 +5,11 @@ using System.Linq; using System.Reflection; using ReClassNET.Extensions; +using ReClassNET.Util; namespace ReClassNET.UI { - public class EnumDescriptionDisplay where TEnum : Enum + public class EnumDescriptionDisplay where TEnum : struct { public TEnum Value { get; internal set; } public string Description { get; internal set; } From 7fafaebcf606a8c9b35648d8315dbfc58f1d3d01 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 31 Mar 2019 21:56:49 +0200 Subject: [PATCH 536/777] Fix for older C# version. (#100) --- ReClass.NET/Extensions/XAttributeExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Extensions/XAttributeExtensions.cs b/ReClass.NET/Extensions/XAttributeExtensions.cs index ed5d4039..9a5f8c5d 100644 --- a/ReClass.NET/Extensions/XAttributeExtensions.cs +++ b/ReClass.NET/Extensions/XAttributeExtensions.cs @@ -5,9 +5,9 @@ namespace ReClassNET.Extensions { public static class XAttributeExtensions { - public static TEnum GetEnumValue(this XAttribute attribute) where TEnum : struct, Enum + public static TEnum GetEnumValue(this XAttribute attribute) where TEnum : struct { - TEnum @enum = default; + TEnum @enum = default(TEnum); if (attribute != null) { Enum.TryParse(attribute.Value, out @enum); From 93f086a1a555d7069f731ee1bc2ae777a7861460 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 31 Mar 2019 23:01:36 +0200 Subject: [PATCH 537/777] Added UnionNode. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 18 +++ .../ReClass/ReClassNetFile.Read.cs | 14 ++- .../ReClass/ReClassNetFile.Write.cs | 5 + .../DataExchange/ReClass/ReClassNetFile.cs | 3 +- ReClass.NET/Nodes/BaseContainerNode.cs | 2 +- ReClass.NET/Nodes/UnionNode.cs | 116 ++++++++++++++++++ ReClass.NET/Properties/Resources.Designer.cs | 12 +- ReClass.NET/Properties/Resources.resx | 3 + ReClass.NET/ReClass.NET.csproj | 4 + .../Resources/Images/B16x16_Button_Union.png | Bin 0 -> 183 bytes ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 11 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 ReClass.NET/Nodes/UnionNode.cs create mode 100644 ReClass.NET/Resources/Images/B16x16_Button_Union.png diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index b006c41d..80971e61 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -457,6 +457,24 @@ private void WriteNode(IndentedTextWriter writer, BaseNode node, ILogger logger) } writer.WriteLine(); } + else if (node is UnionNode unionNode) + { + writer.Write("union //0x"); + writer.Write($"{node.Offset:X04}"); + if (!string.IsNullOrEmpty(node.Comment)) + { + writer.Write(" "); + writer.Write(node.Comment); + } + writer.WriteLine(); + writer.WriteLine("{"); + writer.Indent++; + + WriteNodes(writer, unionNode.Nodes, logger); + + writer.Indent--; + writer.WriteLine("};"); + } else { logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {node.GetType()}"); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index fd32f013..fa86084b 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -264,10 +264,16 @@ ClassNode GetClassNodeFromElementReference() IsHidden = (bool?)e.Attribute(XmlHiddenAttribute) ?? false }); - foreach (var vmethodNode in nodes) - { - vtableNode.AddNode(vmethodNode); - } + vtableNode.AddNodes(nodes); + break; + } + case UnionNode unionNode: + { + var nodes = element + .Elements() + .Select(e => CreateNodeFromElement(e, unionNode, logger)); + + unionNode.AddNodes(nodes); break; } case BaseWrapperArrayNode arrayNode: diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 3ed5f5a3..1e0cc696 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -141,6 +141,11 @@ XElement CreateElement() ))); break; } + case UnionNode unionNode: + { + element.Add(unionNode.Nodes.Select(n => CreateElementFromNode(n, logger))); + break; + } case BaseWrapperArrayNode arrayNode: { element.SetAttributeValue(XmlCountAttribute, arrayNode.Count); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index 1815fa70..d648ec4e 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -72,7 +72,8 @@ static ReClassNetFile() typeof(Vector4Node), typeof(VirtualMethodTableNode), typeof(ArrayNode), - typeof(PointerNode) + typeof(PointerNode), + typeof(UnionNode) }.ToDictionary(t => t.Name, t => t); private static readonly Dictionary buildInTypeToStringMap = buildInStringToTypeMap.ToDictionary(kv => kv.Value, kv => kv.Key); diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index 3ea80604..f9201720 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -42,7 +42,7 @@ public override void ClearSelection() } /// Calculates the offset of every child node. - public void UpdateOffsets() + public virtual void UpdateOffsets() { var offset = 0; foreach (var node in Nodes) diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs new file mode 100644 index 00000000..acd63aa5 --- /dev/null +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -0,0 +1,116 @@ +using System; +using System.Drawing; +using System.Linq; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class UnionNode : BaseContainerNode + { + public override int MemorySize => Nodes.Max(n => n.MemorySize); + + protected override bool ShouldCompensateSizeChanges => false; + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Union"; + icon = Properties.Resources.B16x16_Button_Union; + } + + public override bool CanHandleChildNode(BaseNode node) + { + switch (node) + { + case null: + case ClassNode _: + case VirtualMethodNode _: + return false; + } + + return true; + } + + public override void Initialize() + { + AddNode(CreateDefaultNodeForSize(IntPtr.Size)); + } + + public override void UpdateOffsets() + { + foreach (var node in Nodes) + { + node.Offset = 0; + } + } + + public override Size Draw(ViewInfo view, int x, int y) + { + if (IsHidden && !IsWrapped) + { + return DrawHidden(view, x, y); + } + + var origX = x; + var origY = y; + + AddSelection(view, x, y, view.Font.Height); + + x = AddOpenCloseIcon(view, x, y); + x = AddIcon(view, x, y, Icons.VTable, -1, HotSpotType.None); + + var tx = x; + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Union") + view.Font.Width; + + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"[Nodes: {Nodes.Count}, Size: {MemorySize}]") + view.Font.Width; + + x = AddComment(view, x, y); + + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); + + y += view.Font.Height; + + var size = new Size(x - origX, y - origY); + + if (LevelsOpen[view.Level]) + { + var v = view.Clone(); + v.Settings = Program.Settings.Clone(); + v.Settings.ShowNodeAddress = false; + v.Address = view.Address + Offset; + v.Memory = view.Memory.Clone(); + v.Memory.Offset += Offset; + + foreach (var node in Nodes) + { + var innerSize = node.Draw(v, tx, y); + + size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); + size.Height += innerSize.Height; + + y += innerSize.Height; + } + } + + return size; + } + + public override int CalculateDrawnHeight(ViewInfo view) + { + if (IsHidden && !IsWrapped) + { + return HiddenHeight; + } + + var height = view.Font.Height; + if (LevelsOpen[view.Level]) + { + height += Nodes.Sum(n => n.CalculateDrawnHeight(view)); + } + return height; + } + } +} diff --git a/ReClass.NET/Properties/Resources.Designer.cs b/ReClass.NET/Properties/Resources.Designer.cs index 5a79745d..538bd01c 100644 --- a/ReClass.NET/Properties/Resources.Designer.cs +++ b/ReClass.NET/Properties/Resources.Designer.cs @@ -600,6 +600,16 @@ internal static System.Drawing.Bitmap B16x16_Button_UInt_8 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_Union { + get { + object obj = ResourceManager.GetObject("B16x16_Button_Union", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1341,7 +1351,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Looks up a localized string similar to 2019/02/27 14:40:47 + /// Looks up a localized string similar to 2019/03/31 20:34:22 ///. /// internal static string BuildDate { diff --git a/ReClass.NET/Properties/Resources.resx b/ReClass.NET/Properties/Resources.resx index 515ab352..7c64e77f 100644 --- a/ReClass.NET/Properties/Resources.resx +++ b/ReClass.NET/Properties/Resources.resx @@ -508,4 +508,7 @@ ..\Resources\Images\B16x16_Button_Enum.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Button_Union.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 4adb6b35..f4e7b22e 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -272,6 +272,7 @@ + @@ -993,6 +994,9 @@ + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" diff --git a/ReClass.NET/Resources/Images/B16x16_Button_Union.png b/ReClass.NET/Resources/Images/B16x16_Button_Union.png new file mode 100644 index 0000000000000000000000000000000000000000..6d842042af50d0c49ef0848fcca2101a34271519 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK_5>S#}Etux89C?3ax!A+pK44$rjF6*2Ung9abJPH5+ literal 0 HcmV?d00001 diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index eea03499..33828756 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -24,7 +24,7 @@ static NodeTypesBuilder() defaultNodeTypeGroupList.Add(new[] { typeof(FloatNode), typeof(DoubleNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), typeof(Utf16TextPtrNode) }); - defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ArrayNode) }); + defaultNodeTypeGroupList.Add(new[] { typeof(PointerNode), typeof(ArrayNode), typeof(UnionNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(ClassInstanceNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(VirtualMethodTableNode), typeof(FunctionNode), typeof(FunctionPtrNode) }); } From 012cfc7bac1082ac4d81ffad9e24c8c4d285d651 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 4 Apr 2019 23:04:54 +0100 Subject: [PATCH 538/777] Possible bug fix for memory region enumeration Not familiar with the code base at all, but I was reading through this file and it seems as though there is a possible typo? I'm not sure if the original behaviour was intended or not but I thought it was worth pointing this out in case it was an accident! --- NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 789d6363..f21f2539 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -29,7 +29,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate if ((memInfo.Protect & PAGE_EXECUTE) == PAGE_EXECUTE) section.Protection |= SectionProtection::Execute; if ((memInfo.Protect & PAGE_EXECUTE_READ) == PAGE_EXECUTE_READ) section.Protection |= SectionProtection::Execute | SectionProtection::Read; if ((memInfo.Protect & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::Write; - if ((memInfo.Protect & PAGE_EXECUTE_WRITECOPY) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::CopyOnWrite; + if ((memInfo.Protect & PAGE_EXECUTE_WRITECOPY) == PAGE_EXECUTE_WRITECOPY) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::CopyOnWrite; if ((memInfo.Protect & PAGE_READONLY) == PAGE_READONLY) section.Protection |= SectionProtection::Read; if ((memInfo.Protect & PAGE_READWRITE) == PAGE_READWRITE) section.Protection |= SectionProtection::Read | SectionProtection::Write; if ((memInfo.Protect & PAGE_WRITECOPY) == PAGE_WRITECOPY) section.Protection |= SectionProtection::Read | SectionProtection::CopyOnWrite; From 9d31584c9a377e2c9f4f5c213dd84044c54f641c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 6 Apr 2019 22:34:29 +0200 Subject: [PATCH 539/777] Use simpler parser logic. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 139 ++++---- ReClass.NET/AddressParser/ExpressionParser.cs | 195 ++++++++++++ ReClass.NET/AddressParser/Expressions.cs | 99 ++++++ ReClass.NET/AddressParser/IExecuter.cs | 2 +- ReClass.NET/AddressParser/Interpreter.cs | 85 +++-- ReClass.NET/AddressParser/Token.cs | 46 +-- ReClass.NET/AddressParser/TokenReader.cs | 300 ++++++++++++------ ReClass.NET/Memory/RemoteProcess.cs | 14 +- ReClass.NET/ReClass.NET.csproj | 4 +- 9 files changed, 637 insertions(+), 247 deletions(-) create mode 100644 ReClass.NET/AddressParser/ExpressionParser.cs create mode 100644 ReClass.NET/AddressParser/Expressions.cs diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index cc323e24..8f328e66 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -9,7 +9,7 @@ namespace ReClassNET.AddressParser { public class DynamicCompiler : IExecuter { - public IntPtr Execute(IOperation operation, RemoteProcess process) + public IntPtr Execute(IExpression operation, RemoteProcess process) { Contract.Requires(operation != null); Contract.Requires(process != null); @@ -17,83 +17,96 @@ public IntPtr Execute(IOperation operation, RemoteProcess process) return CompileAddressFormula(operation)(process); } - public Func CompileAddressFormula(IOperation operation) + public static Func CompileAddressFormula(IExpression expression) { - Contract.Requires(operation != null); + Contract.Requires(expression != null); var processParameter = Expression.Parameter(typeof(RemoteProcess)); return Expression.Lambda>( - GenerateMethodBody(operation, processParameter), + GenerateMethodBody(expression, processParameter), processParameter ).Compile(); } - private Expression GenerateMethodBody(IOperation operation, ParameterExpression processParameter) + private static Expression GenerateMethodBody(IExpression operation, ParameterExpression processParameter) { Contract.Requires(operation != null); Contract.Requires(processParameter != null); switch (operation) { - case AdditionOperation additionOperation: - { - var argument1 = GenerateMethodBody(additionOperation.Argument1, processParameter); - var argument2 = GenerateMethodBody(additionOperation.Argument2, processParameter); - - return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Add)), argument1, argument2); - } - case SubtractionOperation subtractionOperation: - { - var argument1 = GenerateMethodBody(subtractionOperation.Argument1, processParameter); - var argument2 = GenerateMethodBody(subtractionOperation.Argument2, processParameter); - - return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Sub)), argument1, argument2); - } - case MultiplicationOperation multiplicationOperation: - { - var argument1 = GenerateMethodBody(multiplicationOperation.Argument1, processParameter); - var argument2 = GenerateMethodBody(multiplicationOperation.Argument2, processParameter); - - return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Mul)), argument1, argument2); - } - case DivisionOperation divisionOperation: - { - var argument1 = GenerateMethodBody(divisionOperation.Dividend, processParameter); - var argument2 = GenerateMethodBody(divisionOperation.Divisor, processParameter); - - return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Div)), argument1, argument2); - } - case ModuleOffsetOperation moduleOffsetOperation: - { - var getModuleByNameFunc = typeof(RemoteProcess).GetRuntimeMethod(nameof(RemoteProcess.GetModuleByName), new[] { typeof(string) }); - var moduleNameConstant = Expression.Constant(moduleOffsetOperation.Name); - - var moduleVariable = Expression.Variable(typeof(Memory.Module)); - var assignExpression = Expression.Assign(moduleVariable, Expression.Call(processParameter, getModuleByNameFunc, moduleNameConstant)); - - return Expression.Block( - new[] { moduleVariable }, - assignExpression, - Expression.Condition( - Expression.Equal(moduleVariable, Expression.Constant(null)), - Expression.Constant(IntPtr.Zero), - Expression.MakeMemberAccess(moduleVariable, typeof(Memory.Module).GetProperty(nameof(Memory.Module.Start))) - ) - ); - } - case OffsetOperation offsetOperation: - { - return Expression.Constant(offsetOperation.Value); - } - case ReadPointerOperation readPointerOperation: - { - var argument = GenerateMethodBody(readPointerOperation.Argument, processParameter); - - var readRemoteIntPtrFunc = typeof(RemoteProcess).GetRuntimeMethod(nameof(RemoteProcess.ReadRemoteIntPtr), new[] { typeof(IntPtr) }); - - return Expression.Call(processParameter, readRemoteIntPtrFunc, argument); - } + case AddExpression addExpression: + { + var argument1 = GenerateMethodBody(addExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(addExpression.Rhs, processParameter); + + return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Add)), argument1, argument2); + } + case SubtractExpression subtractExpression: + { + var argument1 = GenerateMethodBody(subtractExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(subtractExpression.Rhs, processParameter); + + return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Sub)), argument1, argument2); + } + case MultiplyExpression multiplyExpression: + { + var argument1 = GenerateMethodBody(multiplyExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(multiplyExpression.Rhs, processParameter); + + return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Mul)), argument1, argument2); + } + case DivideExpression divideExpression: + { + var argument1 = GenerateMethodBody(divideExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(divideExpression.Rhs, processParameter); + + return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Div)), argument1, argument2); + } + case ModuleExpression moduleExpression: + { + var getModuleByNameFunc = typeof(RemoteProcess).GetRuntimeMethod(nameof(RemoteProcess.GetModuleByName), new[] { typeof(string) }); + var moduleNameConstant = Expression.Constant(moduleExpression.Name); + + var moduleVariable = Expression.Variable(typeof(Memory.Module)); + var assignExpression = Expression.Assign(moduleVariable, Expression.Call(processParameter, getModuleByNameFunc, moduleNameConstant)); + + return Expression.Block( + new[] { moduleVariable }, + assignExpression, + Expression.Condition( + Expression.Equal(moduleVariable, Expression.Constant(null)), + Expression.Constant(IntPtr.Zero), + Expression.MakeMemberAccess(moduleVariable, typeof(Memory.Module).GetProperty(nameof(Memory.Module.Start))) + ) + ); + } + case ConstantExpression constantExpression: + { +#if RECLASSNET64 + // long -> IntPtr + return Expression.Convert(Expression.Constant(nodeNumber.Value), typeof(IntPtr)); +#else + // long -> int -> IntPtr + return Expression.Convert(Expression.Convert(Expression.Constant(constantExpression.Value), typeof(int)), typeof(IntPtr)); +#endif + } + case ReadMemoryExpression readMemoryExpression: + { + var argument = GenerateMethodBody(readMemoryExpression.Expression, processParameter); + + var functionName = readMemoryExpression.ByteCount == 4 ? nameof(RemoteProcess.ReadRemoteInt32) : nameof(RemoteProcess.ReadRemoteInt64); + var readRemoteIntFn = typeof(RemoteProcess).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); + + var callExpression = Expression.Call(processParameter, readRemoteIntFn, argument); + +#if RECLASSNET64 + return Expression.Convert(callExpression, typeof(IntPtr)); +#else + return Expression.Convert(Expression.Convert(callExpression, typeof(int)), typeof(IntPtr)); +#endif + } } throw new ArgumentException($"Unsupported operation '{operation.GetType().FullName}'."); diff --git a/ReClass.NET/AddressParser/ExpressionParser.cs b/ReClass.NET/AddressParser/ExpressionParser.cs new file mode 100644 index 00000000..decc354c --- /dev/null +++ b/ReClass.NET/AddressParser/ExpressionParser.cs @@ -0,0 +1,195 @@ +using System; +using System.IO; + +namespace ReClassNET.AddressParser +{ + public class ExpressionParser + { + private readonly Tokenizer tokenizer; + + public ExpressionParser(Tokenizer tokenizer) + { + this.tokenizer = tokenizer; + } + + public IExpression ParseExpression() + { + var expr = ParseAddSubtract(); + + if (tokenizer.Token != Token.None) + { + throw new ParseException("Unexpected characters at end of expression"); + } + + return expr; + } + + private IExpression ParseAddSubtract() + { + var lhs = ParseMultiplyDivide(); + + while (true) + { + if (tokenizer.Token == Token.Add || tokenizer.Token == Token.Subtract) + { + tokenizer.ReadNextToken(); + + var rhs = ParseMultiplyDivide(); + + if (tokenizer.Token == Token.Add) + { + lhs = new AddExpression(lhs, rhs); + } + else + { + lhs = new SubtractExpression(lhs, rhs); + } + } + else + { + return lhs; + } + } + } + + private IExpression ParseMultiplyDivide() + { + var lhs = ParseUnary(); + + while (true) + { + if (tokenizer.Token == Token.Multiply || tokenizer.Token == Token.Divide) + { + tokenizer.ReadNextToken(); + + var rhs = ParseUnary(); + + if (tokenizer.Token == Token.Multiply) + { + lhs = new MultiplyExpression(lhs, rhs); + } + else + { + lhs = new DivideExpression(lhs, rhs); + } + } + else + { + return lhs; + } + } + } + + private IExpression ParseUnary() + { + while (true) + { + if (tokenizer.Token == Token.Add) + { + tokenizer.ReadNextToken(); + + continue; + } + + if (tokenizer.Token == Token.Subtract) + { + tokenizer.ReadNextToken(); + + var rhs = ParseUnary(); + + return new NegateExpression(rhs); + } + + return ParseLeaf(); + } + } + + private IExpression ParseLeaf() + { + switch (tokenizer.Token) + { + case Token.Number: + { + var node = new ConstantExpression(tokenizer.Number); + + tokenizer.ReadNextToken(); + + return node; + } + case Token.OpenParenthesis: + { + tokenizer.ReadNextToken(); + + var node = ParseAddSubtract(); + + if (tokenizer.Token != Token.CloseParenthesis) + { + throw new ParseException("Missing close parenthesis"); + } + + tokenizer.ReadNextToken(); + + return node; + } + case Token.OpenBrackets: + { + tokenizer.ReadNextToken(); + + var node = ParseAddSubtract(); + + var byteCount = IntPtr.Size; + if (tokenizer.Token == Token.Comma) + { + tokenizer.ReadNextToken(); + + if (tokenizer.Token != Token.Number) + { + throw new ParseException("Missing read byte count"); + } + + byteCount = (int)tokenizer.Number; + + tokenizer.ReadNextToken(); + } + + if (tokenizer.Token != Token.CloseBrackets) + { + throw new ParseException("Missing close bracket"); + } + + tokenizer.ReadNextToken(); + + return new ReadMemoryExpression(node, byteCount); + } + case Token.Identifier: + { + var node = new ModuleExpression(tokenizer.Identifier); + + tokenizer.ReadNextToken(); + + return node; + } + default: + throw new ParseException($"Unexpect token: {tokenizer.Token}"); + } + } + + #region Convenience Helpers + + public static IExpression Parse(string str) + { + using (var sr = new StringReader(str)) + { + return Parse(new Tokenizer(sr)); + } + } + + public static IExpression Parse(Tokenizer tokenizer) + { + var parser = new ExpressionParser(tokenizer); + return parser.ParseExpression(); + } + + #endregion + } +} diff --git a/ReClass.NET/AddressParser/Expressions.cs b/ReClass.NET/AddressParser/Expressions.cs new file mode 100644 index 00000000..52388aed --- /dev/null +++ b/ReClass.NET/AddressParser/Expressions.cs @@ -0,0 +1,99 @@ +namespace ReClassNET.AddressParser +{ + public interface IExpression + { + } + + public abstract class BinaryExpression : IExpression + { + public IExpression Lhs { get; } + public IExpression Rhs { get; } + + protected BinaryExpression(IExpression lhs, IExpression rhs) + { + Lhs = lhs; + Rhs = rhs; + } + } + + public class AddExpression : BinaryExpression + { + public AddExpression(IExpression lhs, IExpression rhs) + : base(lhs, rhs) + { + } + } + + public class SubtractExpression : BinaryExpression + { + public SubtractExpression(IExpression lhs, IExpression rhs) + : base(lhs, rhs) + { + } + } + + public class MultiplyExpression : BinaryExpression + { + public MultiplyExpression(IExpression lhs, IExpression rhs) + : base(lhs, rhs) + { + } + } + + public class DivideExpression : BinaryExpression + { + public DivideExpression(IExpression lhs, IExpression rhs) + : base(lhs, rhs) + { + } + } + + public class ConstantExpression : IExpression + { + public long Value { get; } + + public ConstantExpression(long value) + { + Value = value; + } + } + + public abstract class UnaryExpression : IExpression + { + public IExpression Expression { get; } + + protected UnaryExpression(IExpression expression) + { + Expression = expression; + } + } + + public class NegateExpression : UnaryExpression + { + public NegateExpression(IExpression expression) + : base(expression) + { + } + } + + public class ReadMemoryExpression : UnaryExpression + { + public int ByteCount { get; } + + public ReadMemoryExpression(IExpression expression, int byteCount) + : base(expression) + { + ByteCount = byteCount; + } + } + + public class ModuleExpression : IExpression + { + public string Name { get; } + + public ModuleExpression(string name) + { + Name = name; + } + } +} diff --git a/ReClass.NET/AddressParser/IExecuter.cs b/ReClass.NET/AddressParser/IExecuter.cs index 2747b6e4..07e036ad 100644 --- a/ReClass.NET/AddressParser/IExecuter.cs +++ b/ReClass.NET/AddressParser/IExecuter.cs @@ -5,6 +5,6 @@ namespace ReClassNET.AddressParser { public interface IExecuter { - IntPtr Execute(IOperation operation, RemoteProcess process); + IntPtr Execute(IExpression expression, RemoteProcess process); } } diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index 1b31044f..f3f5ac8b 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -7,57 +7,54 @@ namespace ReClassNET.AddressParser { public class Interpreter : IExecuter { - public IntPtr Execute(IOperation operation, RemoteProcess process) + public IntPtr Execute(IExpression expression, RemoteProcess process) { - Contract.Requires(operation != null); + Contract.Requires(expression != null); Contract.Requires(process != null); - if (operation is OffsetOperation offsetOperation) + switch (expression) { - return offsetOperation.Value; - } - - if (operation is ModuleOffsetOperation moduleOffsetOperation) - { - var module = process.GetModuleByName(moduleOffsetOperation.Name); - if (module != null) + case ConstantExpression constantExpression: +#if RECLASSNET64 + return (IntPtr)nodeNumber.Value; +#else + return (IntPtr)unchecked((int)constantExpression.Value); +#endif + case ModuleExpression moduleExpression: { - return module.Start; - } - - return IntPtr.Zero; - } + var module = process.GetModuleByName(moduleExpression.Name); + if (module != null) + { + return module.Start; + } - if (operation is AdditionOperation additionOperation) - { - var addition = additionOperation; - return Execute(addition.Argument1, process).Add(Execute(addition.Argument2, process)); - } - - if (operation is SubtractionOperation subtractionOperation) - { - var addition = subtractionOperation; - return Execute(addition.Argument1, process).Sub(Execute(addition.Argument2, process)); - } - - if (operation is MultiplicationOperation multiplicationOperation) - { - var multiplication = multiplicationOperation; - return Execute(multiplication.Argument1, process).Mul(Execute(multiplication.Argument2, process)); - } - - if (operation is DivisionOperation divisionOperation) - { - var division = divisionOperation; - return Execute(division.Dividend, process).Div(Execute(division.Divisor, process)); - } - - if (operation is ReadPointerOperation pointerOperation) - { - return process.ReadRemoteIntPtr(Execute(pointerOperation.Argument, process)); + return IntPtr.Zero; + } + case AddExpression addExpression: + return Execute(addExpression.Lhs, process).Add(Execute(addExpression.Rhs, process)); + case SubtractExpression subtractExpression: + return Execute(subtractExpression.Lhs, process).Sub(Execute(subtractExpression.Rhs, process)); + case MultiplyExpression multiplyExpression: + return Execute(multiplyExpression.Lhs, process).Mul(Execute(multiplyExpression.Rhs, process)); + case DivideExpression divideExpression: + return Execute(divideExpression.Lhs, process).Div(Execute(divideExpression.Rhs, process)); + case ReadMemoryExpression readMemoryExpression: + var readFromAddress = Execute(readMemoryExpression.Expression, process); + if (readMemoryExpression.ByteCount == 4) + { + return (IntPtr)process.ReadRemoteInt32(readFromAddress); + } + else + { +#if RECLASSNET64 + return (IntPtr)process.ReadRemoteInt64(readFromAddress); +#else + return (IntPtr)unchecked((int)process.ReadRemoteUInt64(readFromAddress)); +#endif + } + default: + throw new ArgumentException($"Unsupported operation '{expression.GetType().FullName}'."); } - - throw new ArgumentException($"Unsupported operation '{operation.GetType().FullName}'."); } } } diff --git a/ReClass.NET/AddressParser/Token.cs b/ReClass.NET/AddressParser/Token.cs index 5c807d87..b8036b83 100644 --- a/ReClass.NET/AddressParser/Token.cs +++ b/ReClass.NET/AddressParser/Token.cs @@ -1,36 +1,18 @@ -using System.Diagnostics.Contracts; - -namespace ReClassNET.AddressParser +namespace ReClassNET.AddressParser { - public enum TokenType + public enum Token { - Offset, - ModuleOffset, - Operation, - LeftBracket, - RightBracket, - ReadPointer - } - - public class Token - { - /// The type of the token. - public TokenType TokenType { get; } - - /// The value of the token. - public object Value { get; } - - public Token(TokenType type, object value) - { - Contract.Requires(value != null); - - TokenType = type; - Value = value; - } - - public override string ToString() - { - return $"{TokenType} {Value}"; - } + None, + Add, + Subtract, + Multiply, + Divide, + OpenParenthesis, + CloseParenthesis, + OpenBrackets, + CloseBrackets, + Comma, + Number, + Identifier } } diff --git a/ReClass.NET/AddressParser/TokenReader.cs b/ReClass.NET/AddressParser/TokenReader.cs index 701f457d..d3abb4bc 100644 --- a/ReClass.NET/AddressParser/TokenReader.cs +++ b/ReClass.NET/AddressParser/TokenReader.cs @@ -1,128 +1,242 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; using System.Globalization; using System.IO; -using System.Linq; +using System.Text; namespace ReClassNET.AddressParser { - public class TokenReader + /// + /// Parses the given text and reads individual tokens from it. + /// + public class Tokenizer { + private readonly TextReader reader; + + private char currentCharacter; + + /// + /// The current token. It is set to if no more tokens are avaiable. + /// + public Token Token { get; private set; } + + /// + /// The current identifier. + /// + public string Identifier { get; private set; } + + /// + /// The current number. + /// + public long Number { get; private set; } + + public Tokenizer(TextReader reader) + { + Contract.Requires(reader != null); + + this.reader = reader; + + ReadNextCharacter(); + ReadNextToken(); + } + /// - /// Read in the provided formula and convert it into a list of takens that can be processed by the - /// Abstract Syntax Tree Builder. + /// Reads the next token from the input. /// - /// The formula that must be converted into a list of tokens. - /// The list of tokens for the provided formula. - public List Read(string formula) + public void ReadNextToken() + { + SkipWhitespaces(); + + if (currentCharacter == '\0') + { + Token = Token.None; + Identifier = null; + Number = 0; + + return; + } + + if (TryReadSimpleToken()) + { + ReadNextCharacter(); + + return; + } + + if (TryReadNumberToken()) + { + return; + } + + if (TryReadIdentifierToken()) + { + return; + } + } + + private void ReadNextCharacter() + { + var c = reader.Read(); + currentCharacter = c < 0 ? '\0' : (char)c; + } + + private void SkipWhitespaces() { - Contract.Requires(formula != null); + while (char.IsWhiteSpace(currentCharacter)) + { + ReadNextCharacter(); + } + } + + private bool TryReadSimpleToken() + { + switch (currentCharacter) + { + case '+': + Token = Token.Add; + return true; + case '-': + Token = Token.Subtract; + return true; + case '*': + Token = Token.Multiply; + return true; + case '/': + Token = Token.Divide; + return true; + case '(': + Token = Token.OpenParenthesis; + return true; + case ')': + Token = Token.CloseParenthesis; + return true; + case '[': + Token = Token.OpenBrackets; + return true; + case ']': + Token = Token.CloseBrackets; + return true; + case ',': + Token = Token.Comma; + return true; + } - var tokens = new List(); + return false; + } - var isFormulaSubPart = true; + private bool TryReadNumberToken() + { + bool IsHexadecimalDigit(char c) => char.IsDigit(c) || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F'; + bool IsHexadecimalIdentifier(char c) => c == 'x' || c == 'X'; - var characters = formula.ToCharArray(); - for (var i = 0; i < characters.Length; ++i) + if (IsHexadecimalDigit(currentCharacter)) { - if (characters[i] == '<') + var sb = new StringBuilder(); + var hasHexadecimalIdentifier = false; + + while (IsHexadecimalDigit(currentCharacter) + || IsHexadecimalIdentifier(currentCharacter) && !hasHexadecimalIdentifier && sb.Length == 1 && sb[0] == '0') { - var buffer = string.Empty; - while (++i < characters.Length && IsPartOfModuleName(characters[i])) - { - buffer += characters[i]; - } + sb.Append(currentCharacter); - if (i >= characters.Length) - { - throw new ParseException("Unexpected end of input detected."); - } - if (characters[i] != '>') - { - throw new ParseException($"Invalid token '{characters[i]}' detected at position {i}."); - } - ++i; + hasHexadecimalIdentifier = !hasHexadecimalIdentifier && IsHexadecimalIdentifier(currentCharacter); - tokens.Add(new Token(TokenType.ModuleOffset, buffer)); - isFormulaSubPart = false; + ReadNextCharacter(); + } - if (i == characters.Length) - { - continue; - } + if (hasHexadecimalIdentifier) + { + sb.Remove(0, 2); } - if (IsPartOfNumeric(characters[i], true, isFormulaSubPart)) + Number = long.Parse(sb.ToString(), NumberStyles.HexNumber); + + Token = Token.Number; + + return true; + } + + return false; + } + + /*private bool TryReadNumberToken() + { + bool IsDigit(char c) => char.IsDigit(c); + bool IsDecimalPoint(char c) => c == '.'; + bool IsHexadecimalIdentifier(char c) => c == 'x' || c == 'X'; + bool IsHexadecimalDigit(char c) => 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F'; + + if (char.IsDigit(currentCharacter) || currentCharacter == '.') + { + var sb = new StringBuilder(); + var hasDecimalPoint = false; + var hasHexadecimalIdentifier = false; + var hasHexadecimalDigit = false; + + while (IsDigit(currentCharacter) + || IsDecimalPoint(currentCharacter) && !hasDecimalPoint && !hasHexadecimalIdentifier && !hasHexadecimalDigit + || IsHexadecimalIdentifier(currentCharacter) && !hasDecimalPoint && !hasHexadecimalIdentifier && sb.Length == 1 && sb[0] == '0' + || IsHexadecimalDigit(currentCharacter) && !hasDecimalPoint) { - var buffer = characters[i].ToString(); - while (++i < characters.Length && IsPartOfNumeric(characters[i], false, isFormulaSubPart)) - { - buffer += characters[i]; - } + sb.Append(currentCharacter); - if (buffer.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) - { - buffer = buffer.Substring(2); - } + hasDecimalPoint = !hasDecimalPoint && IsDecimalPoint(currentCharacter); + hasHexadecimalIdentifier = !hasHexadecimalIdentifier && IsHexadecimalIdentifier(currentCharacter); + hasHexadecimalDigit = !hasHexadecimalDigit && IsHexadecimalDigit(currentCharacter); - if (long.TryParse(buffer, NumberStyles.HexNumber, null, out var offsetValue)) - { -#if RECLASSNET64 - var address = (IntPtr)offsetValue; -#else - var address = (IntPtr)unchecked((int)offsetValue); -#endif - - tokens.Add(new Token(TokenType.Offset, address)); - isFormulaSubPart = false; - } - else - { - throw new ParseException($"'{buffer}' is not a valid number."); - } + ReadNextCharacter(); + } - if (i == characters.Length) + if (hasHexadecimalIdentifier || hasHexadecimalDigit) + { + if (hasHexadecimalIdentifier) { - continue; + sb.Remove(0, 2); } - } - switch (characters[i]) + Number = long.Parse(sb.ToString(), NumberStyles.HexNumber); + } + else { - case ' ': - continue; - case '+': - case '-': - case '*': - case '/': - tokens.Add(new Token(TokenType.Operation, characters[i])); - isFormulaSubPart = true; - break; - case '[': - tokens.Add(new Token(TokenType.LeftBracket, characters[i])); - isFormulaSubPart = true; - break; - case ']': - tokens.Add(new Token(TokenType.RightBracket, characters[i])); - isFormulaSubPart = false; - break; - default: - throw new ParseException($"Invalid token '{characters[i]}' detected at position {i}."); + Number = double.Parse(sb.ToString(), CultureInfo.InvariantCulture); } + + Token = Token.Number; + + return true; } - return tokens; - } + return false; + }*/ - private bool IsPartOfNumeric(char character, bool isFirstCharacter, bool isFormulaSubPart) + private bool TryReadIdentifierToken() { - return (character >= '0' && character <= '9') || (character >= 'a' && character <= 'f') || (character >= 'A' && character <= 'F') || (isFormulaSubPart && !isFirstCharacter && (character == 'x' || character == 'X')); - } + if (currentCharacter == '<') + { + ReadNextCharacter(); - private bool IsPartOfModuleName(char character) - { - return !Path.GetInvalidFileNameChars().Contains(character); + var sb = new StringBuilder(); + + while (currentCharacter != '\0' && currentCharacter != '>') + { + sb.Append(currentCharacter); + + ReadNextCharacter(); + } + + if (currentCharacter != '>') + { + return false; + } + + ReadNextCharacter(); + + Identifier = sb.ToString(); + Token = Token.Identifier; + + return true; + } + + return false; } } -} +} \ No newline at end of file diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 05125400..a154632f 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -720,19 +720,9 @@ public IntPtr ParseAddress(string addressFormula) if (!formulaCache.TryGetValue(addressFormula, out var func)) { - var reader = new TokenReader(); - var tokens = reader.Read(addressFormula); + var expression = ExpressionParser.Parse(addressFormula); - var astBuilder = new AstBuilder(); - var operation = astBuilder.Build(tokens); - - if (operation == null) - { - return IntPtr.Zero; - } - - var compiler = new DynamicCompiler(); - func = compiler.CompileAddressFormula(operation); + func = DynamicCompiler.CompileAddressFormula(expression); formulaCache.Add(addressFormula, func); } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index f4e7b22e..88a59941 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -135,12 +135,12 @@ - - + + From 3bd0cb3f45fbd9cf67cb37ec5a2770c10156cdeb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 10 Apr 2019 11:34:22 +0200 Subject: [PATCH 540/777] Changed context menu names. Added context menus for enums. --- ReClass.NET/Forms/MainForm.Designer.cs | 40 +++++++++--------- ReClass.NET/Forms/MainForm.resx | 4 +- ReClass.NET/UI/ProjectView.Designer.cs | 8 ++-- ReClass.NET/UI/ProjectView.cs | 58 ++++++++++++++++---------- 4 files changed, 62 insertions(+), 48 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 6f35b452..7470769c 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -33,13 +33,13 @@ private void InitializeComponent() this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); this.splitContainer = new System.Windows.Forms.SplitContainer(); this.projectView = new ReClassNET.UI.ProjectView(); - this.projectClassTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.projectClassContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.deleteClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); this.removeUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); this.showCodeOfClassToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.projectClassesTreeNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.projectClassesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.enableHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.autoExpandHierarchyViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); @@ -162,8 +162,8 @@ private void InitializeComponent() this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); - this.projectClassTreeNodeContextMenuStrip.SuspendLayout(); - this.projectClassesTreeNodeContextMenuStrip.SuspendLayout(); + this.projectClassContextMenuStrip.SuspendLayout(); + this.projectClassesContextMenuStrip.SuspendLayout(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.toolStrip.SuspendLayout(); this.statusStrip.SuspendLayout(); @@ -197,25 +197,27 @@ private void InitializeComponent() // // projectView // - this.projectView.ClassTreeNodeContextMenuStrip = this.projectClassTreeNodeContextMenuStrip; + this.projectView.ClassContextMenuStrip = this.projectClassContextMenuStrip; + this.projectView.ClassesContextMenuStrip = this.projectClassesContextMenuStrip; this.projectView.Dock = System.Windows.Forms.DockStyle.Fill; + this.projectView.EnumContextMenuStrip = null; + this.projectView.EnumsContextMenuStrip = null; this.projectView.Location = new System.Drawing.Point(0, 0); this.projectView.Name = "projectView"; - this.projectView.ProjectTreeNodeContextMenuStrip = this.projectClassesTreeNodeContextMenuStrip; this.projectView.Size = new System.Drawing.Size(201, 524); this.projectView.TabIndex = 0; this.projectView.SelectionChanged += new ReClassNET.UI.ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); // - // projectClassTreeNodeContextMenuStrip + // projectClassContextMenuStrip // - this.projectClassTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.projectClassContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.deleteClassToolStripMenuItem, this.toolStripSeparator19, this.removeUnusedClassesToolStripMenuItem, this.toolStripSeparator20, this.showCodeOfClassToolStripMenuItem2}); - this.projectClassTreeNodeContextMenuStrip.Name = "contextMenuStrip"; - this.projectClassTreeNodeContextMenuStrip.Size = new System.Drawing.Size(206, 104); + this.projectClassContextMenuStrip.Name = "contextMenuStrip"; + this.projectClassContextMenuStrip.Size = new System.Drawing.Size(206, 82); // // deleteClassToolStripMenuItem // @@ -251,9 +253,9 @@ private void InitializeComponent() this.showCodeOfClassToolStripMenuItem2.Text = "Show C++ Code of Class"; this.showCodeOfClassToolStripMenuItem2.Click += new System.EventHandler(this.showCodeOfClassToolStripMenuItem2_Click); // - // projectClassesTreeNodeContextMenuStrip + // projectClassesContextMenuStrip // - this.projectClassesTreeNodeContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.projectClassesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.enableHierarchyViewToolStripMenuItem, this.autoExpandHierarchyViewToolStripMenuItem, this.toolStripSeparator21, @@ -261,8 +263,8 @@ private void InitializeComponent() this.collapseAllClassesToolStripMenuItem, this.toolStripSeparator22, this.addNewClassToolStripMenuItem}); - this.projectClassesTreeNodeContextMenuStrip.Name = "rootContextMenuStrip"; - this.projectClassesTreeNodeContextMenuStrip.Size = new System.Drawing.Size(221, 126); + this.projectClassesContextMenuStrip.Name = "rootContextMenuStrip"; + this.projectClassesContextMenuStrip.Size = new System.Drawing.Size(221, 148); // // enableHierarchyViewToolStripMenuItem // @@ -317,10 +319,10 @@ private void InitializeComponent() // memoryViewControl // this.memoryViewControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Dock = System.Windows.Forms.DockStyle.Fill; this.memoryViewControl.Location = new System.Drawing.Point(0, 0); this.memoryViewControl.Name = "memoryViewControl"; + this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Size = new System.Drawing.Size(936, 524); this.memoryViewControl.TabIndex = 0; this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); @@ -1319,8 +1321,8 @@ private void InitializeComponent() this.splitContainer.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); this.splitContainer.ResumeLayout(false); - this.projectClassTreeNodeContextMenuStrip.ResumeLayout(false); - this.projectClassesTreeNodeContextMenuStrip.ResumeLayout(false); + this.projectClassContextMenuStrip.ResumeLayout(false); + this.projectClassesContextMenuStrip.ResumeLayout(false); this.selectedNodeContextMenuStrip.ResumeLayout(false); this.toolStrip.ResumeLayout(false); this.toolStrip.PerformLayout(); @@ -1450,13 +1452,13 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; private System.Windows.Forms.ToolStripMenuItem goToClassToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip projectClassTreeNodeContextMenuStrip; + private System.Windows.Forms.ContextMenuStrip projectClassContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem deleteClassToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator19; private System.Windows.Forms.ToolStripMenuItem removeUnusedClassesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator20; private System.Windows.Forms.ToolStripMenuItem showCodeOfClassToolStripMenuItem2; - private System.Windows.Forms.ContextMenuStrip projectClassesTreeNodeContextMenuStrip; + private System.Windows.Forms.ContextMenuStrip projectClassesContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem enableHierarchyViewToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem autoExpandHierarchyViewToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator21; diff --git a/ReClass.NET/Forms/MainForm.resx b/ReClass.NET/Forms/MainForm.resx index 69f3a7b7..14674457 100644 --- a/ReClass.NET/Forms/MainForm.resx +++ b/ReClass.NET/Forms/MainForm.resx @@ -120,10 +120,10 @@ 366, 17 - + 756, 17 - + 986, 17 diff --git a/ReClass.NET/UI/ProjectView.Designer.cs b/ReClass.NET/UI/ProjectView.Designer.cs index 53e5144d..1658a477 100644 --- a/ReClass.NET/UI/ProjectView.Designer.cs +++ b/ReClass.NET/UI/ProjectView.Designer.cs @@ -42,10 +42,10 @@ private void InitializeComponent() this.projectTreeView.ShowRootLines = false; this.projectTreeView.Size = new System.Drawing.Size(150, 150); this.projectTreeView.TabIndex = 0; - this.projectTreeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_BeforeLabelEdit); - this.projectTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.classesTreeView_AfterLabelEdit); - this.projectTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.classesTreeView_AfterSelect); - this.projectTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.classesTreeView_MouseUp); + this.projectTreeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.projectTreeView_BeforeLabelEdit); + this.projectTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.projectTreeView_AfterLabelEdit); + this.projectTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.projectTreeView_AfterSelect); + this.projectTreeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.projectTreeView_MouseUp); // // ClassNodeView // diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index 5811453c..b8cda1e9 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; +using System.Runtime.Remoting.Contexts; using System.Windows.Forms; using ReClassNET.Extensions; using ReClassNET.Nodes; @@ -207,13 +208,18 @@ public bool EnableClassHierarchyView } } - public ContextMenuStrip ProjectTreeNodeContextMenuStrip { get; set; } + public ContextMenuStrip ClassesContextMenuStrip { get; set; } - public ContextMenuStrip ClassTreeNodeContextMenuStrip { get; set; } + public ContextMenuStrip ClassContextMenuStrip { get; set; } + + public ContextMenuStrip EnumsContextMenuStrip { get; set; } + + public ContextMenuStrip EnumContextMenuStrip { get; set; } public ProjectView() { Contract.Ensures(classesRootNode != null); + Contract.Ensures(enumsRootNode != null); InitializeComponent(); @@ -249,7 +255,7 @@ public ProjectView() #region Event Handler - private void classesTreeView_AfterSelect(object sender, TreeViewEventArgs e) + private void projectTreeView_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node.Level == 0) { @@ -267,7 +273,7 @@ private void classesTreeView_AfterSelect(object sender, TreeViewEventArgs e) } } - private void classesTreeView_MouseUp(object sender, MouseEventArgs e) + private void projectTreeView_MouseUp(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Right) { @@ -280,40 +286,46 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e) return; } - if (node is ClassTreeNode) + ContextMenuStrip cms = null; + if (node == classesRootNode) { - projectTreeView.SelectedNode = node; + cms = ClassesContextMenuStrip; + } + else if (node is ClassTreeNode) + { + cms = ClassContextMenuStrip; - var cms = ClassTreeNodeContextMenuStrip; - cms?.Show(projectTreeView, e.Location); + projectTreeView.SelectedNode = node; } - else if (node == classesRootNode) + else if (node == enumsRootNode) { - var cms = ProjectTreeNodeContextMenuStrip; - cms?.Show(projectTreeView, e.Location); + cms = EnumsContextMenuStrip; } + else if (node is EnumTreeNode) + { + cms = EnumContextMenuStrip; + } + cms?.Show(projectTreeView, e.Location); } - private void classesTreeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + private void projectTreeView_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) { var isClassTreeNode = e.Node is ClassTreeNode; - e.CancelEdit = !isClassTreeNode; + var isEnumTreeNode = e.Node is EnumTreeNode; + e.CancelEdit = !isClassTreeNode && !isEnumTreeNode; } - private void classesTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + private void projectTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { if (!string.IsNullOrEmpty(e.Label)) { - if (e.Node is ClassTreeNode node) + if (e.Node is ClassTreeNode classTreeNode) { - node.ClassNode.Name = e.Label; - - // Cancel the edit if the class refused the name. - // This prevents the tree node from using the wrong name. - if (node.ClassNode.Name != e.Label) - { - e.CancelEdit = true; - } + classTreeNode.ClassNode.Name = e.Label; + } + else if (e.Node is EnumTreeNode enumTreeNode) + { + enumTreeNode.Enum.Name = e.Label; } } } From 2482609cb823599d588bd3862e5ab85cc377613f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 11 Apr 2019 11:38:57 +0200 Subject: [PATCH 541/777] Added getter for selected enum. --- ReClass.NET/UI/ProjectView.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index b8cda1e9..33395838 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -171,6 +171,10 @@ public ClassNode SelectedClass } } + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public EnumDescription SelectedEnum { get; private set; } + [DefaultValue(false)] public bool AutoExpandClassNodes { @@ -262,14 +266,16 @@ private void projectTreeView_AfterSelect(object sender, TreeViewEventArgs e) return; } - if (!(e.Node is ClassTreeNode node)) + if (e.Node is ClassTreeNode classTreeNode) { - return; + if (selectedClass != classTreeNode.ClassNode) + { + SelectedClass = classTreeNode.ClassNode; + } } - - if (selectedClass != node.ClassNode) + else if (e.Node is EnumTreeNode enumTreeNode) { - SelectedClass = node.ClassNode; + SelectedEnum = enumTreeNode.Enum; } } From 2f609dc1983174cf3954f17165c402a5880457ef Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 11 Apr 2019 11:40:20 +0200 Subject: [PATCH 542/777] Fixed form text. --- ReClass.NET/Forms/EnumSelectionForm.Designer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs index 52916429..3e96b886 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs @@ -152,7 +152,7 @@ private void InitializeComponent() this.Controls.Add(this.bannerBox); this.Name = "EnumSelectionForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ReClass.NET - Class Selection"; + this.Text = "ReClass.NET - Enum Selection"; ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); From 03b7f19d1a1c344aa27c14894c7c7b726db078b4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 11 Apr 2019 14:22:08 +0200 Subject: [PATCH 543/777] Added EnumListForm. --- ReClass.NET/Forms/EnumListForm.Designer.cs | 140 +++++++++++++++++++++ ReClass.NET/Forms/EnumListForm.cs | 109 ++++++++++++++++ ReClass.NET/Forms/EnumListForm.resx | 120 ++++++++++++++++++ ReClass.NET/Forms/MainForm.Designer.cs | 59 ++++++++- ReClass.NET/Forms/MainForm.cs | 28 +++++ ReClass.NET/Forms/MainForm.resx | 6 + ReClass.NET/ReClass.NET.csproj | 9 ++ ReClass.NET/UI/ProjectView.cs | 2 + 8 files changed, 470 insertions(+), 3 deletions(-) create mode 100644 ReClass.NET/Forms/EnumListForm.Designer.cs create mode 100644 ReClass.NET/Forms/EnumListForm.cs create mode 100644 ReClass.NET/Forms/EnumListForm.resx diff --git a/ReClass.NET/Forms/EnumListForm.Designer.cs b/ReClass.NET/Forms/EnumListForm.Designer.cs new file mode 100644 index 00000000..b03c4e31 --- /dev/null +++ b/ReClass.NET/Forms/EnumListForm.Designer.cs @@ -0,0 +1,140 @@ +namespace ReClassNET.Forms +{ + partial class EnumListForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.itemListBox = new System.Windows.Forms.ListBox(); + this.bannerBox = new ReClassNET.UI.BannerBox(); + this.addEnumIconButton = new ReClassNET.UI.IconButton(); + this.removeEnumIconButton = new ReClassNET.UI.IconButton(); + this.editEnumIconButton = new ReClassNET.UI.IconButton(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.SuspendLayout(); + // + // filterNameTextBox + // + this.filterNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filterNameTextBox.Location = new System.Drawing.Point(12, 60); + this.filterNameTextBox.Name = "filterNameTextBox"; + this.filterNameTextBox.PlaceholderText = "Filter by Enum Name..."; + this.filterNameTextBox.Size = new System.Drawing.Size(411, 20); + this.filterNameTextBox.TabIndex = 10; + this.filterNameTextBox.TextChanged += new System.EventHandler(this.filterNameTextBox_TextChanged); + // + // itemListBox + // + this.itemListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.itemListBox.DisplayMember = "Name"; + this.itemListBox.FormattingEnabled = true; + this.itemListBox.Location = new System.Drawing.Point(12, 86); + this.itemListBox.Name = "itemListBox"; + this.itemListBox.Size = new System.Drawing.Size(492, 212); + this.itemListBox.TabIndex = 11; + this.itemListBox.SelectedIndexChanged += new System.EventHandler(this.itemListBox_SelectedIndexChanged); + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B16x16_Class_Type; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(516, 48); + this.bannerBox.TabIndex = 14; + this.bannerBox.Text = "Edit the enums of the project."; + this.bannerBox.Title = "Enums"; + // + // addEnumIconButton + // + this.addEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.addEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Add; + this.addEnumIconButton.Location = new System.Drawing.Point(456, 59); + this.addEnumIconButton.Name = "addEnumIconButton"; + this.addEnumIconButton.Pressed = false; + this.addEnumIconButton.Selected = false; + this.addEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.addEnumIconButton.TabIndex = 15; + this.addEnumIconButton.Click += new System.EventHandler(this.addEnumIconButton_Click); + // + // removeEnumIconButton + // + this.removeEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.removeEnumIconButton.Enabled = false; + this.removeEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Remove; + this.removeEnumIconButton.Location = new System.Drawing.Point(481, 59); + this.removeEnumIconButton.Name = "removeEnumIconButton"; + this.removeEnumIconButton.Pressed = false; + this.removeEnumIconButton.Selected = false; + this.removeEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.removeEnumIconButton.TabIndex = 16; + this.removeEnumIconButton.Click += new System.EventHandler(this.removeEnumIconButton_Click); + // + // editEnumIconButton + // + this.editEnumIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.editEnumIconButton.Enabled = false; + this.editEnumIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Custom_Type; + this.editEnumIconButton.Location = new System.Drawing.Point(431, 59); + this.editEnumIconButton.Name = "editEnumIconButton"; + this.editEnumIconButton.Pressed = false; + this.editEnumIconButton.Selected = false; + this.editEnumIconButton.Size = new System.Drawing.Size(23, 22); + this.editEnumIconButton.TabIndex = 16; + this.editEnumIconButton.Click += new System.EventHandler(this.editEnumIconButton_Click); + // + // EnumListForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(516, 308); + this.Controls.Add(this.editEnumIconButton); + this.Controls.Add(this.addEnumIconButton); + this.Controls.Add(this.removeEnumIconButton); + this.Controls.Add(this.filterNameTextBox); + this.Controls.Add(this.itemListBox); + this.Controls.Add(this.bannerBox); + this.Name = "EnumListForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ReClass.NET - Enums"; + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private UI.PlaceholderTextBox filterNameTextBox; + private System.Windows.Forms.ListBox itemListBox; + private UI.BannerBox bannerBox; + private UI.IconButton addEnumIconButton; + private UI.IconButton removeEnumIconButton; + private UI.IconButton editEnumIconButton; + } +} \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumListForm.cs b/ReClass.NET/Forms/EnumListForm.cs new file mode 100644 index 00000000..a2e109c6 --- /dev/null +++ b/ReClass.NET/Forms/EnumListForm.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Linq; +using System.Windows.Forms; +using ReClassNET.Project; +using ReClassNET.UI; + +namespace ReClassNET.Forms +{ + public partial class EnumListForm : IconForm + { + private readonly ReClassNetProject project; + + public EnumDescription SelectedItem => itemListBox.SelectedItem as EnumDescription; + + public EnumListForm(ReClassNetProject project) + { + Contract.Requires(project != null); + + this.project = project; + + InitializeComponent(); + + ShowFilteredEnums(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GlobalWindowManager.AddWindow(this); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + + GlobalWindowManager.RemoveWindow(this); + } + + private void filterNameTextBox_TextChanged(object sender, EventArgs e) + { + ShowFilteredEnums(); + } + + private void itemListBox_SelectedIndexChanged(object sender, EventArgs e) + { + editEnumIconButton.Enabled = removeEnumIconButton.Enabled = SelectedItem != null; + } + + private void editEnumIconButton_Click(object sender, EventArgs e) + { + var @enum = SelectedItem; + if (@enum == null) + { + return; + } + + using (var eef = new EnumEditorForm(@enum)) + { + eef.ShowDialog(); + } + } + + private void addEnumIconButton_Click(object sender, EventArgs e) + { + var @enum = new EnumDescription + { + Name = "Enum" + }; + + using (var eef = new EnumEditorForm(@enum)) + { + if (eef.ShowDialog() == DialogResult.OK) + { + project.AddEnum(@enum); + + ShowFilteredEnums(); + } + } + } + + private void removeEnumIconButton_Click(object sender, EventArgs e) + { + var @enum = SelectedItem; + if (@enum == null) + { + return; + } + + project.RemoveEnum(@enum); + + ShowFilteredEnums(); + } + + private void ShowFilteredEnums() + { + IEnumerable enums = project.Enums; + + if (!string.IsNullOrEmpty(filterNameTextBox.Text)) + { + enums = enums.Where(c => c.Name.IndexOf(filterNameTextBox.Text, StringComparison.OrdinalIgnoreCase) >= 0); + } + + itemListBox.DataSource = enums.ToList(); + } + } +} diff --git a/ReClass.NET/Forms/EnumListForm.resx b/ReClass.NET/Forms/EnumListForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/ReClass.NET/Forms/EnumListForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 7470769c..3d5cd7c2 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -47,6 +47,10 @@ private void InitializeComponent() this.collapseAllClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); this.addNewClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.projectEnumContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.editEnumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.projectEnumsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.editEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.memoryViewControl = new ReClassNET.UI.MemoryViewControl(); this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -158,12 +162,15 @@ private void InitializeComponent() this.generateCSharpCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); this.projectClassContextMenuStrip.SuspendLayout(); this.projectClassesContextMenuStrip.SuspendLayout(); + this.projectEnumContextMenuStrip.SuspendLayout(); + this.projectEnumsContextMenuStrip.SuspendLayout(); this.selectedNodeContextMenuStrip.SuspendLayout(); this.toolStrip.SuspendLayout(); this.statusStrip.SuspendLayout(); @@ -200,8 +207,8 @@ private void InitializeComponent() this.projectView.ClassContextMenuStrip = this.projectClassContextMenuStrip; this.projectView.ClassesContextMenuStrip = this.projectClassesContextMenuStrip; this.projectView.Dock = System.Windows.Forms.DockStyle.Fill; - this.projectView.EnumContextMenuStrip = null; - this.projectView.EnumsContextMenuStrip = null; + this.projectView.EnumContextMenuStrip = this.projectEnumContextMenuStrip; + this.projectView.EnumsContextMenuStrip = this.projectEnumsContextMenuStrip; this.projectView.Location = new System.Drawing.Point(0, 0); this.projectView.Name = "projectView"; this.projectView.Size = new System.Drawing.Size(201, 524); @@ -264,7 +271,7 @@ private void InitializeComponent() this.toolStripSeparator22, this.addNewClassToolStripMenuItem}); this.projectClassesContextMenuStrip.Name = "rootContextMenuStrip"; - this.projectClassesContextMenuStrip.Size = new System.Drawing.Size(221, 148); + this.projectClassesContextMenuStrip.Size = new System.Drawing.Size(221, 126); // // enableHierarchyViewToolStripMenuItem // @@ -316,6 +323,36 @@ private void InitializeComponent() this.addNewClassToolStripMenuItem.Text = "Add new class"; this.addNewClassToolStripMenuItem.Click += new System.EventHandler(this.newClassToolStripButton_Click); // + // projectEnumContextMenuStrip + // + this.projectEnumContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.editEnumToolStripMenuItem}); + this.projectEnumContextMenuStrip.Name = "projectEnumContextMenuStrip"; + this.projectEnumContextMenuStrip.Size = new System.Drawing.Size(138, 26); + // + // editEnumToolStripMenuItem + // + this.editEnumToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Enum_Type; + this.editEnumToolStripMenuItem.Name = "editEnumToolStripMenuItem"; + this.editEnumToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.editEnumToolStripMenuItem.Text = "Edit Enum..."; + this.editEnumToolStripMenuItem.Click += new System.EventHandler(this.editEnumToolStripMenuItem_Click); + // + // projectEnumsContextMenuStrip + // + this.projectEnumsContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.editEnumsToolStripMenuItem}); + this.projectEnumsContextMenuStrip.Name = "projectEnumsContextMenuStrip"; + this.projectEnumsContextMenuStrip.Size = new System.Drawing.Size(143, 26); + // + // editEnumsToolStripMenuItem + // + this.editEnumsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; + this.editEnumsToolStripMenuItem.Name = "editEnumsToolStripMenuItem"; + this.editEnumsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.editEnumsToolStripMenuItem.Text = "Edit enums..."; + this.editEnumsToolStripMenuItem.Click += new System.EventHandler(this.editEnumsToolStripMenuItem_Click); + // // memoryViewControl // this.memoryViewControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -1240,6 +1277,7 @@ private void InitializeComponent() this.projectToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.goToClassToolStripMenuItem, this.cleanUnusedClassesToolStripMenuItem, + this.showEnumsToolStripMenuItem, this.toolStripSeparator16, this.generateCppCodeToolStripMenuItem, this.generateCSharpCodeToolStripMenuItem}); @@ -1300,6 +1338,14 @@ private void InitializeComponent() this.aboutToolStripMenuItem.Text = "About..."; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // + // showEnumsToolStripMenuItem + // + this.showEnumsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; + this.showEnumsToolStripMenuItem.Name = "showEnumsToolStripMenuItem"; + this.showEnumsToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.showEnumsToolStripMenuItem.Text = "Show Enums..."; + this.showEnumsToolStripMenuItem.Click += new System.EventHandler(this.showEnumsToolStripMenuItem_Click); + // // MainForm // this.AllowDrop = true; @@ -1323,6 +1369,8 @@ private void InitializeComponent() this.splitContainer.ResumeLayout(false); this.projectClassContextMenuStrip.ResumeLayout(false); this.projectClassesContextMenuStrip.ResumeLayout(false); + this.projectEnumContextMenuStrip.ResumeLayout(false); + this.projectEnumsContextMenuStrip.ResumeLayout(false); this.selectedNodeContextMenuStrip.ResumeLayout(false); this.toolStrip.ResumeLayout(false); this.toolStrip.PerformLayout(); @@ -1466,6 +1514,11 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem collapseAllClassesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator22; private System.Windows.Forms.ToolStripMenuItem addNewClassToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip projectEnumContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem editEnumToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip projectEnumsContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem editEnumsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showEnumsToolStripMenuItem; } } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 4bc42543..e69875b2 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -950,5 +950,33 @@ private void deleteClassToolStripMenuItem_Click(object sender, EventArgs e) Program.Logger.Log(ex); } } + + private void editEnumsToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var elf = new EnumListForm(currentProject)) + { + elf.ShowDialog(); + } + } + + private void editEnumToolStripMenuItem_Click(object sender, EventArgs e) + { + var @enum = projectView.SelectedEnum; + if (@enum != null) + { + using (var eef = new EnumEditorForm(@enum)) + { + eef.ShowDialog(); + } + } + } + + private void showEnumsToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var elf = new EnumListForm(currentProject)) + { + elf.ShowDialog(); + } + } } } diff --git a/ReClass.NET/Forms/MainForm.resx b/ReClass.NET/Forms/MainForm.resx index 14674457..c430dab3 100644 --- a/ReClass.NET/Forms/MainForm.resx +++ b/ReClass.NET/Forms/MainForm.resx @@ -126,6 +126,12 @@ 986, 17 + + 1214, 17 + + + 1434, 17 + 530, 17 diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 88a59941..6c1157b2 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -179,6 +179,12 @@ EnumEditorForm.cs + + Form + + + EnumListForm.cs + Form @@ -514,6 +520,9 @@ EnumEditorForm.cs + + EnumListForm.cs + EnumSelectionForm.cs diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index 33395838..b860c66f 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -310,6 +310,8 @@ private void projectTreeView_MouseUp(object sender, MouseEventArgs e) else if (node is EnumTreeNode) { cms = EnumContextMenuStrip; + + projectTreeView.SelectedNode = node; } cms?.Show(projectTreeView, e.Location); } From 211f39d920b2ce852722e4d381423729960682b0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 11 Apr 2019 14:26:49 +0200 Subject: [PATCH 544/777] Changed icons. --- ReClass.NET/Nodes/EnumNode.cs | 5 +++-- ReClass.NET/Nodes/UnionNode.cs | 2 +- ReClass.NET/UI/Icons.cs | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index f0236285..9a4dd947 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -147,8 +147,9 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.Class, HotSpot.NoneId, HotSpotType.None); + x += TextPadding; + + x = AddIcon(view, x, y, Icons.Enum, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs index acd63aa5..80d43c85 100644 --- a/ReClass.NET/Nodes/UnionNode.cs +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -56,7 +56,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.VTable, -1, HotSpotType.None); + x = AddIcon(view, x, y, Icons.Union, -1, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/UI/Icons.cs b/ReClass.NET/UI/Icons.cs index 0dea2223..0ae65d0e 100644 --- a/ReClass.NET/UI/Icons.cs +++ b/ReClass.NET/UI/Icons.cs @@ -11,7 +11,9 @@ public class Icons public static Image Delete { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Delete); public static Image DropArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Drop_Down); public static Image Class { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Class_Type); + public static Image Enum { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Enum_Type); public static Image Array { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Array_Type); + public static Image Union => Array; public static Image LeftArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Left_Button); public static Image RightArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Right_Button); public static Image Change { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Exchange_Button); From b636a849c9f0bed8a1d0255a66786f414a3955a7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 12 Apr 2019 13:04:50 +0200 Subject: [PATCH 545/777] Use a smaller font. --- ReClass.NET/UI/MemoryRecordList.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/UI/MemoryRecordList.cs b/ReClass.NET/UI/MemoryRecordList.cs index a86bbbf8..f3d63b92 100644 --- a/ReClass.NET/UI/MemoryRecordList.cs +++ b/ReClass.NET/UI/MemoryRecordList.cs @@ -84,7 +84,11 @@ public MemoryRecordList() }; resultDataGridView.AutoGenerateColumns = false; - resultDataGridView.DefaultCellStyle.Font = Program.MonoSpaceFont.Font; + resultDataGridView.DefaultCellStyle.Font = new Font( + Program.MonoSpaceFont.Font.FontFamily, + DpiUtil.ScaleIntX(11), + GraphicsUnit.Pixel + ); resultDataGridView.DataSource = bindings; } From 3162e042bd7e9e4e1eca1774e04dbdc018efd0c3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 13 Apr 2019 23:33:15 +0200 Subject: [PATCH 546/777] Fixed wrong variable name. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 2 +- ReClass.NET/AddressParser/Interpreter.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 8f328e66..143fdd48 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -86,7 +86,7 @@ private static Expression GenerateMethodBody(IExpression operation, ParameterExp { #if RECLASSNET64 // long -> IntPtr - return Expression.Convert(Expression.Constant(nodeNumber.Value), typeof(IntPtr)); + return Expression.Convert(Expression.Constant(constantExpression.Value), typeof(IntPtr)); #else // long -> int -> IntPtr return Expression.Convert(Expression.Convert(Expression.Constant(constantExpression.Value), typeof(int)), typeof(IntPtr)); diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index f3f5ac8b..f25a3d93 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -16,7 +16,7 @@ public IntPtr Execute(IExpression expression, RemoteProcess process) { case ConstantExpression constantExpression: #if RECLASSNET64 - return (IntPtr)nodeNumber.Value; + return (IntPtr)constantExpression.Value; #else return (IntPtr)unchecked((int)constantExpression.Value); #endif From 8f6f6b32002b518618a39a4e47f5a9e41a616d38 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Apr 2019 00:14:18 +0200 Subject: [PATCH 547/777] Fixed logic error. --- ReClass.NET/AddressParser/ExpressionParser.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/AddressParser/ExpressionParser.cs b/ReClass.NET/AddressParser/ExpressionParser.cs index decc354c..5d20aa09 100644 --- a/ReClass.NET/AddressParser/ExpressionParser.cs +++ b/ReClass.NET/AddressParser/ExpressionParser.cs @@ -32,11 +32,13 @@ private IExpression ParseAddSubtract() { if (tokenizer.Token == Token.Add || tokenizer.Token == Token.Subtract) { + var token = tokenizer.Token; + tokenizer.ReadNextToken(); var rhs = ParseMultiplyDivide(); - if (tokenizer.Token == Token.Add) + if (token == Token.Add) { lhs = new AddExpression(lhs, rhs); } @@ -60,11 +62,13 @@ private IExpression ParseMultiplyDivide() { if (tokenizer.Token == Token.Multiply || tokenizer.Token == Token.Divide) { + var token = tokenizer.Token; + tokenizer.ReadNextToken(); var rhs = ParseUnary(); - if (tokenizer.Token == Token.Multiply) + if (token == Token.Multiply) { lhs = new MultiplyExpression(lhs, rhs); } From 5c68b118942da680ede25ef718761133a940bf44 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Apr 2019 00:15:03 +0200 Subject: [PATCH 548/777] Unified bitness check. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 19 +++++++------------ ReClass.NET/AddressParser/Interpreter.cs | 14 +++----------- ReClass.NET/Extensions/IntPtrExtensions.cs | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 143fdd48..15ee1795 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -84,13 +84,9 @@ private static Expression GenerateMethodBody(IExpression operation, ParameterExp } case ConstantExpression constantExpression: { -#if RECLASSNET64 - // long -> IntPtr - return Expression.Convert(Expression.Constant(constantExpression.Value), typeof(IntPtr)); -#else - // long -> int -> IntPtr - return Expression.Convert(Expression.Convert(Expression.Constant(constantExpression.Value), typeof(int)), typeof(IntPtr)); -#endif + var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { typeof(long) }); + + return Expression.Call(null, convertFn, Expression.Constant(constantExpression.Value)); } case ReadMemoryExpression readMemoryExpression: { @@ -101,11 +97,10 @@ private static Expression GenerateMethodBody(IExpression operation, ParameterExp var callExpression = Expression.Call(processParameter, readRemoteIntFn, argument); -#if RECLASSNET64 - return Expression.Convert(callExpression, typeof(IntPtr)); -#else - return Expression.Convert(Expression.Convert(callExpression, typeof(int)), typeof(IntPtr)); -#endif + var paramType = readMemoryExpression.ByteCount == 4 ? typeof(int) : typeof(long); + var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { paramType }); + + return Expression.Call(null, convertFn, callExpression); } } diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index f25a3d93..b113f57d 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -15,11 +15,7 @@ public IntPtr Execute(IExpression expression, RemoteProcess process) switch (expression) { case ConstantExpression constantExpression: -#if RECLASSNET64 - return (IntPtr)constantExpression.Value; -#else - return (IntPtr)unchecked((int)constantExpression.Value); -#endif + return IntPtrExtension.From(constantExpression.Value); case ModuleExpression moduleExpression: { var module = process.GetModuleByName(moduleExpression.Name); @@ -42,15 +38,11 @@ public IntPtr Execute(IExpression expression, RemoteProcess process) var readFromAddress = Execute(readMemoryExpression.Expression, process); if (readMemoryExpression.ByteCount == 4) { - return (IntPtr)process.ReadRemoteInt32(readFromAddress); + return IntPtrExtension.From(process.ReadRemoteInt32(readFromAddress)); } else { -#if RECLASSNET64 - return (IntPtr)process.ReadRemoteInt64(readFromAddress); -#else - return (IntPtr)unchecked((int)process.ReadRemoteUInt64(readFromAddress)); -#endif + return IntPtrExtension.From(process.ReadRemoteInt64(readFromAddress)); } default: throw new ArgumentException($"Unsupported operation '{expression.GetType().FullName}'."); diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index 42ee257b..504f4927 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -142,6 +142,20 @@ public static long ToInt64Bits(this IntPtr ptr) } return value; +#endif + } + + public static IntPtr From(int value) + { + return (IntPtr)value; + } + + public static IntPtr From(long value) + { +#if RECLASSNET64 + return (IntPtr)value; +#else + return (IntPtr)unchecked((int)value); #endif } } From 862f058f6e9c6c91ca3289eebeff503b75e8b731 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Apr 2019 00:21:37 +0200 Subject: [PATCH 549/777] Workaround for address formula not showing bug introduced with d377734. --- ReClass.NET/Nodes/ClassNode.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index de288a1b..137c47ab 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -206,7 +206,11 @@ public void UpdateAddress(RemoteProcess process) try { + var formula = AddressFormula; + Address = process.ParseAddress(AddressFormula); + + AddressFormula = formula; } catch (ParseException) { From 2f9c24f5b00fad7bce68b622cc829be3474e47e5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Apr 2019 10:55:39 +0200 Subject: [PATCH 550/777] Revert workaround 862f058f. --- ReClass.NET/Nodes/ClassNode.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 137c47ab..8882a10c 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -206,11 +206,7 @@ public void UpdateAddress(RemoteProcess process) try { - var formula = AddressFormula; - - Address = process.ParseAddress(AddressFormula); - - AddressFormula = formula; + address = process.ParseAddress(AddressFormula); } catch (ParseException) { From 6d882da2663b1eeeb749a85a0d213c7809e78730 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Apr 2019 12:05:07 +0200 Subject: [PATCH 551/777] Just set the formula. --- ReClass.NET/Nodes/ClassNode.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 8882a10c..3fd6543b 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -194,8 +194,6 @@ public override void Update(HotSpot spot) if (spot.Id == 0) { - Address = spot.Memory.Process.ParseAddress(spot.Text); - AddressFormula = spot.Text; } } From 638c37afe7bb67857e0355227f7c2d45ca5a83a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 22:07:50 +0200 Subject: [PATCH 552/777] Added header files to the project. --- NativeCore/Unix/NativeCore.Unix.vcxproj | 13 +++++++ .../Unix/NativeCore.Unix.vcxproj.filters | 39 +++++++++++++++++++ NativeCore/Windows/NativeCore.vcxproj | 13 +++++++ NativeCore/Windows/NativeCore.vcxproj.filters | 39 +++++++++++++++++++ 4 files changed, 104 insertions(+) diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index 6d13567a..539434ad 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -99,7 +99,20 @@ + + + + + + + + + + + + + diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters index 1d75cfb2..bbefa0a1 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters @@ -82,5 +82,44 @@ + + Dependencies\distorm + + + Dependencies\distorm + + + Shared + + + Shared + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + \ No newline at end of file diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index bec0c645..6af17c1f 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -192,7 +192,20 @@ + + + + + + + + + + + + + diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index a7d8862a..a8eb2be9 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -85,5 +85,44 @@ + + Shared + + + Shared + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + + + Dependencies\distorm + \ No newline at end of file From 3d5bcc5f58931a482c1f7f89394547b0902820b7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 22:39:27 +0200 Subject: [PATCH 553/777] Updated version number. Updated urls. --- ReClass.NET/Constants.cs | 8 ++++---- ReClass.NET/Properties/AssemblyInfo.cs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/Constants.cs b/ReClass.NET/Constants.cs index e1abd568..4e54782a 100644 --- a/ReClass.NET/Constants.cs +++ b/ReClass.NET/Constants.cs @@ -6,17 +6,17 @@ public class Constants public const string ApplicationExecutableName = ApplicationName + ".exe"; - public const string ApplicationVersion = "1.1"; + public const string ApplicationVersion = "1.2"; public const string LauncherExecutableName = ApplicationName + "_Launcher.exe"; public const string Author = "KN4CK3R"; - public const string HomepageUrl = "https://github.com/KN4CK3R/ReClass.NET"; + public const string HomepageUrl = "https://github.com/ReClassNET/ReClass.NET"; - public const string HelpUrl = "https://github.com/KN4CK3R/ReClass.NET/issues"; + public const string HelpUrl = "https://github.com/ReClassNET/ReClass.NET/issues"; - public const string PluginUrl = "https://github.com/KN4CK3R/ReClass.NET#plugins"; + public const string PluginUrl = "https://github.com/ReClassNET/ReClass.NET#plugins"; #if RECLASSNET64 public const string Platform = "x64"; diff --git a/ReClass.NET/Properties/AssemblyInfo.cs b/ReClass.NET/Properties/AssemblyInfo.cs index 8d5ac55d..77d83991 100644 --- a/ReClass.NET/Properties/AssemblyInfo.cs +++ b/ReClass.NET/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] From e6a5c29930def61373d1fcbda7358bf4d9ba996a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 22:40:29 +0200 Subject: [PATCH 554/777] Updated readme. --- README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b1d492aa..0040f004 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,9 @@ This is a port of ReClass to the .NET platform with lots of additional features. - Matrix 3x3 / 3x4 / 4x4 - UTF8 / UTF16 / UTF32 Text and pointer to text - Virtual Tables - - Function Pointer - Function + - Function Pointer + - Unions - Automatic Node Dissection - Highlight changed memory - Pointer Preview @@ -36,7 +37,7 @@ This is a port of ReClass to the .NET platform with lots of additional features. - Class address calculator - Code Generator (C++ / C#) - Module / Section Dumper -- Linux Support (tested on Ubuntu) +- Linux Support (tested on Ubuntu 18.04) - Debugger with "Find out what writes/accesses this address" support - Plugin Support - Plugins can be written in different languages (example: C++, C++/CLI, C#) @@ -46,18 +47,18 @@ This is a port of ReClass to the .NET platform with lots of additional features. - Plugins can implement custom nodes with load/save and code generation support ## Plugins -- [Sample Plugins](https://github.com/KN4CK3R/ReClass.NET-SamplePlugin) -- [Frostbite Plugin](https://github.com/KN4CK3R/ReClass.NET-FrostbitePlugin) -- [MemoryPipe Plugin](https://github.com/KN4CK3R/ReClass.NET-MemoryPipePlugin) -- [LoadBinary Plugin](https://github.com/KN4CK3R/ReClass.NET-LoadBinaryPlugin) -- [Handle Abuser Plugin](https://github.com/KN4CK3R/ReClass.NET-HandleAbuser) +- [Sample Plugins](https://github.com/ReClassNET/ReClass.NET-SamplePlugin) +- [Frostbite Plugin](https://github.com/ReClassNET/ReClass.NET-FrostbitePlugin) +- [MemoryPipe Plugin](https://github.com/ReClassNET/ReClass.NET-MemoryPipePlugin) +- [LoadBinary Plugin](https://github.com/ReClassNET/ReClass.NET-LoadBinaryPlugin) +- [Handle Abuser Plugin](https://github.com/ReClassNET/ReClass.NET-HandleAbuser) - [Unreal Plugin](https://github.com/DrP3pp3r/ReClass.NET-UnrealPlugin) (by [DrP3pp3r](https://github.com/DrP3pp3r)) To install a plugin just copy it in the "Plugins" folder. -If you want to develop your own plugin just learn from the code of the [Sample Plugins](https://github.com/KN4CK3R/ReClass.NET-SamplePlugin) and [Frostbite Plugin](https://github.com/KN4CK3R/ReClass.NET-FrostbitePlugin) repositories. If you have developed a nice plugin, leave me a message and I will add it to the list above. +If you want to develop your own plugin just learn from the code of the [Sample Plugins](https://github.com/ReClassNET/ReClass.NET-SamplePlugin) and [Frostbite Plugin](https://github.com/ReClassNET/ReClass.NET-FrostbitePlugin) repositories. If you have developed a nice plugin, leave me a message and I will add it to the list above. ## Installation -Just download the [latest version](https://github.com/KN4CK3R/ReClass.NET/releases) and start the x86 / x64 version or let the launcher decide. +Just download the [latest version](https://github.com/ReClassNET/ReClass.NET/releases) and start the x86 / x64 version or let the launcher decide. ## Tips - Lots of elements have a context menu. Just right-click it and see what you can do there. From 073fb1d0414ff86fa4fbd80b58aac0b75701d718 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 6 Apr 2019 23:50:23 +0200 Subject: [PATCH 555/777] Fixed logic error. --- ReClass.NET/AddressParser/TokenReader.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/AddressParser/TokenReader.cs b/ReClass.NET/AddressParser/TokenReader.cs index d3abb4bc..d6e5d020 100644 --- a/ReClass.NET/AddressParser/TokenReader.cs +++ b/ReClass.NET/AddressParser/TokenReader.cs @@ -138,7 +138,10 @@ private bool TryReadNumberToken() { sb.Append(currentCharacter); - hasHexadecimalIdentifier = !hasHexadecimalIdentifier && IsHexadecimalIdentifier(currentCharacter); + if (!hasHexadecimalIdentifier) + { + hasHexadecimalIdentifier = IsHexadecimalIdentifier(currentCharacter); + } ReadNextCharacter(); } From c6f771baa5dda7d684c5478f0e8a617583808c53 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 6 Apr 2019 23:51:36 +0200 Subject: [PATCH 556/777] Added test project. --- ReClass.NET.sln | 26 +++++++ .../AddressParser/TokenReaderTest.cs | 35 ++++++++++ ReClass.NET_Tests/Properties/AssemblyInfo.cs | 20 ++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 70 +++++++++++++++++++ 4 files changed, 151 insertions(+) create mode 100644 ReClass.NET_Tests/AddressParser/TokenReaderTest.cs create mode 100644 ReClass.NET_Tests/Properties/AssemblyInfo.cs create mode 100644 ReClass.NET_Tests/ReClass.NET_Tests.csproj diff --git a/ReClass.NET.sln b/ReClass.NET.sln index fed7d3e0..9b52dc5d 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -20,46 +20,72 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET_Tests", "ReClass.NET_Tests\ReClass.NET_Tests.csproj", "{E2D0424D-738F-41C3-9935-1B282624600F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|Any CPU.ActiveCfg = Debug|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x64.ActiveCfg = Debug|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x64.Build.0 = Debug|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x86.ActiveCfg = Debug|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Debug|x86.Build.0 = Debug|x86 + {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|Any CPU.ActiveCfg = Release|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x64.ActiveCfg = Release|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x64.Build.0 = Release|x64 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x86.ActiveCfg = Release|x86 {BFB8917D-E9B4-463F-A6E8-612C35728C78}.Release|x86.Build.0 = Release|x86 + {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|Any CPU.ActiveCfg = Debug|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x64.ActiveCfg = Debug|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x64.Build.0 = Debug|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x86.ActiveCfg = Debug|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Debug|x86.Build.0 = Debug|Win32 + {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|Any CPU.ActiveCfg = Release|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x64.ActiveCfg = Release|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x64.Build.0 = Release|x64 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x86.ActiveCfg = Release|Win32 {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F}.Release|x86.Build.0 = Release|Win32 + {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|Any CPU.ActiveCfg = Debug|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x64.ActiveCfg = Debug|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x64.Build.0 = Debug|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x86.ActiveCfg = Debug|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Debug|x86.Build.0 = Debug|x86 + {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|Any CPU.ActiveCfg = Release|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x64.ActiveCfg = Release|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x64.Build.0 = Release|x64 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x86.ActiveCfg = Release|x86 {48C5258A-FA49-4173-AEE5-0FCA5190DFF2}.Release|x86.Build.0 = Release|x86 + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|Any CPU.Build.0 = Debug|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x64.ActiveCfg = Debug|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x64.Build.0 = Debug|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x86.ActiveCfg = Debug|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Debug|x86.Build.0 = Debug|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16591D29-2370-428A-BA11-87E38D0F3551}.Release|Any CPU.Build.0 = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x64.ActiveCfg = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x64.Build.0 = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.ActiveCfg = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.Build.0 = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.ActiveCfg = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.Build.0 = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.Build.0 = Debug|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|Any CPU.Build.0 = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.ActiveCfg = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.Build.0 = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.ActiveCfg = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs new file mode 100644 index 00000000..426dc44a --- /dev/null +++ b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs @@ -0,0 +1,35 @@ +using System.IO; +using NFluent; +using ReClassNET.AddressParser; +using Xunit; + +namespace ReClass.NET_Tests.AddressParser +{ + public class TokenReaderTest + { + [Theory] + [InlineData("", Token.None)] + [InlineData("0", Token.Number)] + [InlineData("1", Token.Number)] + [InlineData("0x0", Token.Number)] + [InlineData("0x1", Token.Number)] + [InlineData("00000000", Token.Number)] + [InlineData("0x00000000", Token.Number)] + [InlineData("+", Token.Add)] + [InlineData("-", Token.Subtract)] + [InlineData("*", Token.Multiply)] + [InlineData("/", Token.Divide)] + [InlineData("(", Token.OpenParenthesis)] + [InlineData(")", Token.CloseParenthesis)] + [InlineData("[", Token.OpenBrackets)] + [InlineData("]", Token.CloseBrackets)] + [InlineData(",", Token.Comma)] + [InlineData("", Token.Identifier)] + public void ReadBasicToken(string formula, Token type) + { + var tokenizer = new Tokenizer(new StringReader(formula)); + + Check.That(tokenizer.Token).IsEqualTo(type); + } + } +} diff --git a/ReClass.NET_Tests/Properties/AssemblyInfo.cs b/ReClass.NET_Tests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..dfba9306 --- /dev/null +++ b/ReClass.NET_Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("ReClass.NET_Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ReClass.NET_Tests")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("e2d0424d-738f-41c3-9935-1b282624600f")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj new file mode 100644 index 00000000..5ef53ac6 --- /dev/null +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -0,0 +1,70 @@ + + + + + Debug + AnyCPU + {E2D0424D-738F-41C3-9935-1B282624600F} + Library + Properties + ReClass.NET_Tests + ReClass.NET_Tests + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + {bfb8917d-e9b4-463f-a6e8-612c35728c78} + ReClass.NET + + + + + 2.5.0 + + + 2.4.1 + + + 2.4.1 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + \ No newline at end of file From ae719b3ffde12a187aafb9785466dd590e0327df Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Apr 2019 00:41:28 +0200 Subject: [PATCH 557/777] Throw exceptions on invalid tokens. --- ReClass.NET/AddressParser/TokenReader.cs | 56 +++--------------------- 1 file changed, 5 insertions(+), 51 deletions(-) diff --git a/ReClass.NET/AddressParser/TokenReader.cs b/ReClass.NET/AddressParser/TokenReader.cs index d6e5d020..02a43919 100644 --- a/ReClass.NET/AddressParser/TokenReader.cs +++ b/ReClass.NET/AddressParser/TokenReader.cs @@ -151,57 +151,11 @@ private bool TryReadNumberToken() sb.Remove(0, 2); } - Number = long.Parse(sb.ToString(), NumberStyles.HexNumber); - - Token = Token.Number; - - return true; - } - - return false; - } - - /*private bool TryReadNumberToken() - { - bool IsDigit(char c) => char.IsDigit(c); - bool IsDecimalPoint(char c) => c == '.'; - bool IsHexadecimalIdentifier(char c) => c == 'x' || c == 'X'; - bool IsHexadecimalDigit(char c) => 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F'; - - if (char.IsDigit(currentCharacter) || currentCharacter == '.') - { - var sb = new StringBuilder(); - var hasDecimalPoint = false; - var hasHexadecimalIdentifier = false; - var hasHexadecimalDigit = false; - - while (IsDigit(currentCharacter) - || IsDecimalPoint(currentCharacter) && !hasDecimalPoint && !hasHexadecimalIdentifier && !hasHexadecimalDigit - || IsHexadecimalIdentifier(currentCharacter) && !hasDecimalPoint && !hasHexadecimalIdentifier && sb.Length == 1 && sb[0] == '0' - || IsHexadecimalDigit(currentCharacter) && !hasDecimalPoint) - { - sb.Append(currentCharacter); - - hasDecimalPoint = !hasDecimalPoint && IsDecimalPoint(currentCharacter); - hasHexadecimalIdentifier = !hasHexadecimalIdentifier && IsHexadecimalIdentifier(currentCharacter); - hasHexadecimalDigit = !hasHexadecimalDigit && IsHexadecimalDigit(currentCharacter); - - ReadNextCharacter(); - } - - if (hasHexadecimalIdentifier || hasHexadecimalDigit) + if (!long.TryParse(sb.ToString(), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var number)) { - if (hasHexadecimalIdentifier) - { - sb.Remove(0, 2); - } - - Number = long.Parse(sb.ToString(), NumberStyles.HexNumber); - } - else - { - Number = double.Parse(sb.ToString(), CultureInfo.InvariantCulture); + throw new ParseException($"Could not parse '{sb}' as number."); } + Number = number; Token = Token.Number; @@ -209,7 +163,7 @@ private bool TryReadNumberToken() } return false; - }*/ + } private bool TryReadIdentifierToken() { @@ -228,7 +182,7 @@ private bool TryReadIdentifierToken() if (currentCharacter != '>') { - return false; + throw new ParseException("Invalid identifier, missing '>'."); } ReadNextCharacter(); From 2905799a6c6d1b28ea52ada1ee87c156b91c03e9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Apr 2019 00:42:59 +0200 Subject: [PATCH 558/777] Added more tests. --- .../AddressParser/TokenReaderTest.cs | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs index 426dc44a..08ade1f6 100644 --- a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs +++ b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs @@ -9,6 +9,10 @@ public class TokenReaderTest { [Theory] [InlineData("", Token.None)] + [InlineData(" ", Token.None)] + [InlineData("\t", Token.None)] + [InlineData("\n", Token.None)] + [InlineData(" \t\n", Token.None)] [InlineData("0", Token.Number)] [InlineData("1", Token.Number)] [InlineData("0x0", Token.Number)] @@ -25,11 +29,44 @@ public class TokenReaderTest [InlineData("]", Token.CloseBrackets)] [InlineData(",", Token.Comma)] [InlineData("", Token.Identifier)] - public void ReadBasicToken(string formula, Token type) + public void TestTokenType(string expression, Token type) { - var tokenizer = new Tokenizer(new StringReader(formula)); + var tokenizer = new Tokenizer(new StringReader(expression)); Check.That(tokenizer.Token).IsEqualTo(type); } + + [Theory] + [InlineData("0", 0)] + [InlineData("1", 1)] + [InlineData("0x0", 0)] + [InlineData("0x1", 1)] + [InlineData("00000000", 0)] + [InlineData("0x00000000", 0)] + [InlineData("12345678", 0x12345678)] + [InlineData("0x12345678", 0x12345678)] + public void TestNumberValue(string expression, long value) + { + var tokenizer = new Tokenizer(new StringReader(expression)); + + Check.That(tokenizer.Number).IsEqualTo(value); + } + + [Theory] + [InlineData("<>", "")] + [InlineData("", "test")] + [InlineData("", "module.test")] + public void TestIdentifierValue(string expression, string value) + { + var tokenizer = new Tokenizer(new StringReader(expression)); + + Check.That(tokenizer.Identifier).IsEqualTo(value); + } + + [Fact] + public void TestInvalidIdentifier() + { + Assert.Throws(() => new Tokenizer(new StringReader("<"))); + } } } From d2ccf63f68325d09d6e4b41af898b1f857a78730 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 9 Apr 2019 13:15:26 +0200 Subject: [PATCH 559/777] Changed filename. Changed class name. --- .../AddressParser/{ExpressionParser.cs => Parser.cs} | 6 +++--- ReClass.NET/AddressParser/{TokenReader.cs => Tokenizer.cs} | 2 ++ ReClass.NET/Memory/RemoteProcess.cs | 2 +- ReClass.NET/ReClass.NET.csproj | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) rename ReClass.NET/AddressParser/{ExpressionParser.cs => Parser.cs} (96%) rename ReClass.NET/AddressParser/{TokenReader.cs => Tokenizer.cs} (98%) diff --git a/ReClass.NET/AddressParser/ExpressionParser.cs b/ReClass.NET/AddressParser/Parser.cs similarity index 96% rename from ReClass.NET/AddressParser/ExpressionParser.cs rename to ReClass.NET/AddressParser/Parser.cs index 5d20aa09..67c26ae3 100644 --- a/ReClass.NET/AddressParser/ExpressionParser.cs +++ b/ReClass.NET/AddressParser/Parser.cs @@ -3,11 +3,11 @@ namespace ReClassNET.AddressParser { - public class ExpressionParser + public class Parser { private readonly Tokenizer tokenizer; - public ExpressionParser(Tokenizer tokenizer) + public Parser(Tokenizer tokenizer) { this.tokenizer = tokenizer; } @@ -190,7 +190,7 @@ public static IExpression Parse(string str) public static IExpression Parse(Tokenizer tokenizer) { - var parser = new ExpressionParser(tokenizer); + var parser = new Parser(tokenizer); return parser.ParseExpression(); } diff --git a/ReClass.NET/AddressParser/TokenReader.cs b/ReClass.NET/AddressParser/Tokenizer.cs similarity index 98% rename from ReClass.NET/AddressParser/TokenReader.cs rename to ReClass.NET/AddressParser/Tokenizer.cs index 02a43919..7726fabb 100644 --- a/ReClass.NET/AddressParser/TokenReader.cs +++ b/ReClass.NET/AddressParser/Tokenizer.cs @@ -71,6 +71,8 @@ public void ReadNextToken() { return; } + + throw new ParseException($"Invalid character '{currentCharacter}'."); } private void ReadNextCharacter() diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index a154632f..aee60957 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -720,7 +720,7 @@ public IntPtr ParseAddress(string addressFormula) if (!formulaCache.TryGetValue(addressFormula, out var func)) { - var expression = ExpressionParser.Parse(addressFormula); + var expression = Parser.Parse(addressFormula); func = DynamicCompiler.CompileAddressFormula(expression); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 6c1157b2..6e5f1be0 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -140,9 +140,9 @@ - + - + From 387034599f13ef2d43ec6e3ac0dbef1115d8aaed Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 9 Apr 2019 13:15:42 +0200 Subject: [PATCH 560/777] Added more tests. --- ReClass.NET_Tests/AddressParser/TokenReaderTest.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs index 08ade1f6..3cc9571f 100644 --- a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs +++ b/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs @@ -63,10 +63,15 @@ public void TestIdentifierValue(string expression, string value) Check.That(tokenizer.Identifier).IsEqualTo(value); } - [Fact] - public void TestInvalidIdentifier() + [Theory] + [InlineData("<")] + [InlineData(">")] + [InlineData("10000000000000000")] + [InlineData("0x")] + [InlineData("x")] + public void TestInvalidExpression(string expression) { - Assert.Throws(() => new Tokenizer(new StringReader("<"))); + Check.ThatCode(() => new Tokenizer(new StringReader(expression))).Throws(); } } } From 4ed2b477490a679e13207f2d3dbcc63e05e14c2c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 14:42:56 +0200 Subject: [PATCH 561/777] Renamed class. Added expression tests. --- .../{TokenReaderTest.cs => TokenizerTest.cs} | 27 ++++++++++++++++++- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 4 +-- 2 files changed, 28 insertions(+), 3 deletions(-) rename ReClass.NET_Tests/AddressParser/{TokenReaderTest.cs => TokenizerTest.cs} (63%) diff --git a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs b/ReClass.NET_Tests/AddressParser/TokenizerTest.cs similarity index 63% rename from ReClass.NET_Tests/AddressParser/TokenReaderTest.cs rename to ReClass.NET_Tests/AddressParser/TokenizerTest.cs index 3cc9571f..a3cd9a6e 100644 --- a/ReClass.NET_Tests/AddressParser/TokenReaderTest.cs +++ b/ReClass.NET_Tests/AddressParser/TokenizerTest.cs @@ -5,7 +5,7 @@ namespace ReClass.NET_Tests.AddressParser { - public class TokenReaderTest + public class TokenizerTest { [Theory] [InlineData("", Token.None)] @@ -73,5 +73,30 @@ public void TestInvalidExpression(string expression) { Check.ThatCode(() => new Tokenizer(new StringReader(expression))).Throws(); } + + [Theory] + [InlineData("1 + 2", Token.Number, Token.Add, Token.Number)] + [InlineData("1+2", Token.Number, Token.Add, Token.Number)] + [InlineData("+1", Token.Add, Token.Number)] + [InlineData("1 + ( 2 )", Token.Number, Token.Add, Token.OpenParenthesis, Token.Number, Token.CloseParenthesis)] + [InlineData("1 + )( 2", Token.Number, Token.Add, Token.CloseParenthesis, Token.OpenParenthesis, Token.Number)] + [InlineData("1+", Token.Number, Token.Add, Token.Identifier)] + [InlineData("0x1+", Token.Number, Token.Add, Token.Identifier)] + [InlineData("(0x1+)", Token.OpenParenthesis, Token.Number, Token.Add, Token.Identifier, Token.CloseParenthesis)] + [InlineData("[ 1 ] + 2", Token.OpenBrackets, Token.Number, Token.CloseBrackets, Token.Add, Token.Number)] + [InlineData("[1 + 2]", Token.OpenBrackets, Token.Number, Token.Add, Token.Number, Token.CloseBrackets)] + public void TestExpressions(string expression, params Token[] tokens) + { + var tokenizer = new Tokenizer(new StringReader(expression)); + + foreach (var token in tokens) + { + Check.That(tokenizer.Token).IsEqualTo(token); + + tokenizer.ReadNextToken(); + } + + Check.That(tokenizer.Token).IsEqualTo(Token.None); + } } } diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 5ef53ac6..e4000a1e 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -1,4 +1,4 @@ - + @@ -43,7 +43,7 @@ - + From a9e941e0237700f6cb85c2fef8595df44dcc308e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 14:43:59 +0200 Subject: [PATCH 562/777] Added interface for Tokenizer. --- ReClass.NET/AddressParser/ITokenizer.cs | 25 +++++++++++++++++++++++++ ReClass.NET/AddressParser/Parser.cs | 4 ++-- ReClass.NET/AddressParser/Tokenizer.cs | 14 +------------- ReClass.NET/ReClass.NET.csproj | 1 + 4 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 ReClass.NET/AddressParser/ITokenizer.cs diff --git a/ReClass.NET/AddressParser/ITokenizer.cs b/ReClass.NET/AddressParser/ITokenizer.cs new file mode 100644 index 00000000..625e1a0f --- /dev/null +++ b/ReClass.NET/AddressParser/ITokenizer.cs @@ -0,0 +1,25 @@ +namespace ReClassNET.AddressParser +{ + public interface ITokenizer + { + /// + /// The current token. It is set to if no more tokens are avaiable. + /// + Token Token { get; } + + /// + /// The current identifier. + /// + string Identifier { get; } + + /// + /// The current number. + /// + long Number { get; } + + /// + /// Reads the next token. + /// + void ReadNextToken(); + } +} diff --git a/ReClass.NET/AddressParser/Parser.cs b/ReClass.NET/AddressParser/Parser.cs index 67c26ae3..7a70a91b 100644 --- a/ReClass.NET/AddressParser/Parser.cs +++ b/ReClass.NET/AddressParser/Parser.cs @@ -5,9 +5,9 @@ namespace ReClassNET.AddressParser { public class Parser { - private readonly Tokenizer tokenizer; + private readonly ITokenizer tokenizer; - public Parser(Tokenizer tokenizer) + public Parser(ITokenizer tokenizer) { this.tokenizer = tokenizer; } diff --git a/ReClass.NET/AddressParser/Tokenizer.cs b/ReClass.NET/AddressParser/Tokenizer.cs index 7726fabb..a43907ec 100644 --- a/ReClass.NET/AddressParser/Tokenizer.cs +++ b/ReClass.NET/AddressParser/Tokenizer.cs @@ -8,25 +8,16 @@ namespace ReClassNET.AddressParser /// /// Parses the given text and reads individual tokens from it. /// - public class Tokenizer + public class Tokenizer : ITokenizer { private readonly TextReader reader; private char currentCharacter; - /// - /// The current token. It is set to if no more tokens are avaiable. - /// public Token Token { get; private set; } - /// - /// The current identifier. - /// public string Identifier { get; private set; } - /// - /// The current number. - /// public long Number { get; private set; } public Tokenizer(TextReader reader) @@ -39,9 +30,6 @@ public Tokenizer(TextReader reader) ReadNextToken(); } - /// - /// Reads the next token from the input. - /// public void ReadNextToken() { SkipWhitespaces(); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 6e5f1be0..45c36c5d 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -139,6 +139,7 @@ + From 504a2296ea2f4de70e8bb2eb585f83fe7b611f0f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Apr 2019 15:59:59 +0200 Subject: [PATCH 563/777] Added tests for the parser class. --- ReClass.NET_Tests/AddressParser/ParserTest.cs | 103 ++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 12 +- 2 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 ReClass.NET_Tests/AddressParser/ParserTest.cs diff --git a/ReClass.NET_Tests/AddressParser/ParserTest.cs b/ReClass.NET_Tests/AddressParser/ParserTest.cs new file mode 100644 index 00000000..cf2f0fcd --- /dev/null +++ b/ReClass.NET_Tests/AddressParser/ParserTest.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.AddressParser; +using Xunit; + +namespace ReClass.NET_Tests.AddressParser +{ + public class ParserTest + { + private class TokenizerStub : ITokenizer + { + private readonly Tuple[] values; + + private int index = 0; + + public Token Token => values[index].Item1; + public string Identifier => values[index].Item2; + public long Number => values[index].Item3; + + public TokenizerStub(params Tuple[] values) + { + this.values = values + .Append(Tuple.Create(Token.None, null, 0)) + .ToArray(); + } + + public void ReadNextToken() + { + if (index < values.Length - 1) + { + ++index; + } + } + } + + public static IEnumerable InvalidExpressionData() + { + return new List + { + new object[] { new TokenizerStub() }, + new object[] { new TokenizerStub(Tuple.Create(Token.Add, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.Subtract, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.Multiply, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.Divide, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.Comma, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.OpenParenthesis, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.CloseParenthesis, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.OpenBrackets, "", 0L)) }, + new object[] { new TokenizerStub(Tuple.Create(Token.CloseBrackets, "", 0L)) }, + + new object[] { new TokenizerStub( + Tuple.Create(Token.Number, "", 0L), + Tuple.Create(Token.Subtract, "", 0L) + ) }, + new object[] { new TokenizerStub( + Tuple.Create(Token.Number, "", 0L), + Tuple.Create(Token.OpenParenthesis, "", 0L) + ) }, + new object[] { new TokenizerStub( + Tuple.Create(Token.Number, "", 0L), + Tuple.Create(Token.CloseParenthesis, "", 0L) + ) }, + new object[] { new TokenizerStub( + Tuple.Create(Token.OpenParenthesis, "", 0L), + Tuple.Create(Token.CloseParenthesis, "", 0L) + ) }, + new object[] { new TokenizerStub( + Tuple.Create(Token.OpenParenthesis, "", 0L), + Tuple.Create(Token.Number, "", 0L) + ) }, + }; + } + + [Theory] + [MemberData(nameof(InvalidExpressionData))] + public void InvalidExpressionTests(ITokenizer tokenizer) + { + var parser = new Parser(tokenizer); + + Check.ThatCode(() => parser.ParseExpression()).Throws(); + } + + [Theory] + [InlineData("1", typeof(ConstantExpression))] + [InlineData("1 + 2", typeof(AddExpression))] + [InlineData("1 + 2 * 3", typeof(MultiplyExpression))] + [InlineData("(1 + 2) * 3", typeof(MultiplyExpression))] + [InlineData("1 + (2 * 3)", typeof(AddExpression))] + [InlineData("(1 + (2 * 3))", typeof(AddExpression))] + public void ValidExpressionTests(string expression, Type type) + { + var tokenizer = new Tokenizer(new StringReader(expression)); + var parser = new Parser(tokenizer); + + Check.That(parser.ParseExpression()).IsInstanceOfType(type); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index e4000a1e..78cff692 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -1,5 +1,5 @@ - - + + Debug @@ -12,10 +12,6 @@ v4.7.2 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False UnitTest @@ -43,6 +39,7 @@ + @@ -61,10 +58,9 @@ 2.4.1 - runtime; build; native; contentfiles; analyzers; buildtransitive + runtime; build; native; contentfiles; analyzers all - \ No newline at end of file From c10ea5748fb177835535775dd40da8302861f7fc Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 09:53:31 +0200 Subject: [PATCH 564/777] Fixed expected result. --- ReClass.NET_Tests/AddressParser/ParserTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET_Tests/AddressParser/ParserTest.cs b/ReClass.NET_Tests/AddressParser/ParserTest.cs index cf2f0fcd..d18b144d 100644 --- a/ReClass.NET_Tests/AddressParser/ParserTest.cs +++ b/ReClass.NET_Tests/AddressParser/ParserTest.cs @@ -88,7 +88,7 @@ public void InvalidExpressionTests(ITokenizer tokenizer) [Theory] [InlineData("1", typeof(ConstantExpression))] [InlineData("1 + 2", typeof(AddExpression))] - [InlineData("1 + 2 * 3", typeof(MultiplyExpression))] + [InlineData("1 + 2 * 3", typeof(AddExpression))] [InlineData("(1 + 2) * 3", typeof(MultiplyExpression))] [InlineData("1 + (2 * 3)", typeof(AddExpression))] [InlineData("(1 + (2 * 3))", typeof(AddExpression))] From 013880c3b8646b60c080480f635aabc6f9ad1600 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 10:07:17 +0200 Subject: [PATCH 565/777] Use InlineData instead of a stub. --- ReClass.NET/AddressParser/Parser.cs | 6 +- ReClass.NET_Tests/AddressParser/ParserTest.cs | 110 +++++------------- 2 files changed, 33 insertions(+), 83 deletions(-) diff --git a/ReClass.NET/AddressParser/Parser.cs b/ReClass.NET/AddressParser/Parser.cs index 7a70a91b..6090c443 100644 --- a/ReClass.NET/AddressParser/Parser.cs +++ b/ReClass.NET/AddressParser/Parser.cs @@ -178,8 +178,6 @@ private IExpression ParseLeaf() } } - #region Convenience Helpers - public static IExpression Parse(string str) { using (var sr = new StringReader(str)) @@ -188,12 +186,10 @@ public static IExpression Parse(string str) } } - public static IExpression Parse(Tokenizer tokenizer) + private static IExpression Parse(ITokenizer tokenizer) { var parser = new Parser(tokenizer); return parser.ParseExpression(); } - - #endregion } } diff --git a/ReClass.NET_Tests/AddressParser/ParserTest.cs b/ReClass.NET_Tests/AddressParser/ParserTest.cs index d18b144d..57fb0a7f 100644 --- a/ReClass.NET_Tests/AddressParser/ParserTest.cs +++ b/ReClass.NET_Tests/AddressParser/ParserTest.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.AddressParser; using Xunit; @@ -12,77 +7,39 @@ namespace ReClass.NET_Tests.AddressParser { public class ParserTest { - private class TokenizerStub : ITokenizer - { - private readonly Tuple[] values; - - private int index = 0; - - public Token Token => values[index].Item1; - public string Identifier => values[index].Item2; - public long Number => values[index].Item3; - - public TokenizerStub(params Tuple[] values) - { - this.values = values - .Append(Tuple.Create(Token.None, null, 0)) - .ToArray(); - } - - public void ReadNextToken() - { - if (index < values.Length - 1) - { - ++index; - } - } - } - - public static IEnumerable InvalidExpressionData() - { - return new List - { - new object[] { new TokenizerStub() }, - new object[] { new TokenizerStub(Tuple.Create(Token.Add, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.Subtract, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.Multiply, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.Divide, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.Comma, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.OpenParenthesis, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.CloseParenthesis, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.OpenBrackets, "", 0L)) }, - new object[] { new TokenizerStub(Tuple.Create(Token.CloseBrackets, "", 0L)) }, - - new object[] { new TokenizerStub( - Tuple.Create(Token.Number, "", 0L), - Tuple.Create(Token.Subtract, "", 0L) - ) }, - new object[] { new TokenizerStub( - Tuple.Create(Token.Number, "", 0L), - Tuple.Create(Token.OpenParenthesis, "", 0L) - ) }, - new object[] { new TokenizerStub( - Tuple.Create(Token.Number, "", 0L), - Tuple.Create(Token.CloseParenthesis, "", 0L) - ) }, - new object[] { new TokenizerStub( - Tuple.Create(Token.OpenParenthesis, "", 0L), - Tuple.Create(Token.CloseParenthesis, "", 0L) - ) }, - new object[] { new TokenizerStub( - Tuple.Create(Token.OpenParenthesis, "", 0L), - Tuple.Create(Token.Number, "", 0L) - ) }, - }; - } - [Theory] - [MemberData(nameof(InvalidExpressionData))] - public void InvalidExpressionTests(ITokenizer tokenizer) + [InlineData("-")] + [InlineData("+")] + [InlineData("*")] + [InlineData("/")] + [InlineData(",")] + [InlineData("(")] + [InlineData(")")] + [InlineData("[")] + [InlineData("]")] + [InlineData("1-")] + [InlineData("1(")] + [InlineData("1)")] + [InlineData("1[")] + [InlineData("1]")] + [InlineData("(1")] + [InlineData(")1")] + [InlineData("[1")] + [InlineData("]1")] + [InlineData("1+(")] + [InlineData("1+)")] + [InlineData("1 + ()")] + [InlineData("(1 + 2")] + [InlineData("1 + 2)")] + [InlineData("[1 + 2)")] + [InlineData("(1 + 2]")] + [InlineData("[1,]")] + [InlineData("[1,")] + [InlineData("1,")] + [InlineData("1,2")] + public void InvalidExpressionTests(string expression) { - var parser = new Parser(tokenizer); - - Check.ThatCode(() => parser.ParseExpression()).Throws(); + Check.ThatCode(() => Parser.Parse(expression)).Throws(); } [Theory] @@ -94,10 +51,7 @@ public void InvalidExpressionTests(ITokenizer tokenizer) [InlineData("(1 + (2 * 3))", typeof(AddExpression))] public void ValidExpressionTests(string expression, Type type) { - var tokenizer = new Tokenizer(new StringReader(expression)); - var parser = new Parser(tokenizer); - - Check.That(parser.ParseExpression()).IsInstanceOfType(type); + Check.That(Parser.Parse(expression)).IsInstanceOfType(type); } } } From ffcabb590405da4e30b340de6e6adc893427e72d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 13:28:14 +0200 Subject: [PATCH 566/777] Added more tests. --- ReClass.NET/AddressParser/Parser.cs | 5 +++++ ReClass.NET_Tests/AddressParser/ParserTest.cs | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/AddressParser/Parser.cs b/ReClass.NET/AddressParser/Parser.cs index 6090c443..d07cdf28 100644 --- a/ReClass.NET/AddressParser/Parser.cs +++ b/ReClass.NET/AddressParser/Parser.cs @@ -151,6 +151,11 @@ private IExpression ParseLeaf() throw new ParseException("Missing read byte count"); } + if (tokenizer.Number != 4 && tokenizer.Number != 8) + { + throw new ParseException("The byte count must be 4 or 8."); + } + byteCount = (int)tokenizer.Number; tokenizer.ReadNextToken(); diff --git a/ReClass.NET_Tests/AddressParser/ParserTest.cs b/ReClass.NET_Tests/AddressParser/ParserTest.cs index 57fb0a7f..40a2bfd3 100644 --- a/ReClass.NET_Tests/AddressParser/ParserTest.cs +++ b/ReClass.NET_Tests/AddressParser/ParserTest.cs @@ -33,8 +33,9 @@ public class ParserTest [InlineData("1 + 2)")] [InlineData("[1 + 2)")] [InlineData("(1 + 2]")] - [InlineData("[1,]")] [InlineData("[1,")] + [InlineData("[1,]")] + [InlineData("[1,2]")] [InlineData("1,")] [InlineData("1,2")] public void InvalidExpressionTests(string expression) @@ -45,13 +46,29 @@ public void InvalidExpressionTests(string expression) [Theory] [InlineData("1", typeof(ConstantExpression))] [InlineData("1 + 2", typeof(AddExpression))] + [InlineData("1 - 2", typeof(SubtractExpression))] + [InlineData("1 * 2", typeof(MultiplyExpression))] + [InlineData("1 / 2", typeof(DivideExpression))] [InlineData("1 + 2 * 3", typeof(AddExpression))] [InlineData("(1 + 2) * 3", typeof(MultiplyExpression))] [InlineData("1 + (2 * 3)", typeof(AddExpression))] [InlineData("(1 + (2 * 3))", typeof(AddExpression))] + [InlineData("[1]", typeof(ReadMemoryExpression))] + [InlineData("[1,4]", typeof(ReadMemoryExpression))] + [InlineData("[1,8]", typeof(ReadMemoryExpression))] + [InlineData("", typeof(ModuleExpression))] + [InlineData("[]", typeof(ReadMemoryExpression))] public void ValidExpressionTests(string expression, Type type) { Check.That(Parser.Parse(expression)).IsInstanceOfType(type); } + + [Fact] + public void ReadMemoryDefaultByteCountCheck() + { + var expression = (ReadMemoryExpression)Parser.Parse("[1]"); + + Check.That(expression.ByteCount).IsEqualTo(IntPtr.Size); + } } } From fb32699472a892353f52e4b53bf1be03489bdee6 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 13:31:33 +0200 Subject: [PATCH 567/777] Dropped support for ReClass 2007 files to get rid of the SQLite dependency. --- .../DataExchange/ReClass/ReClass2007File.cs | 212 ------------------ ReClass.NET/Forms/MainForm.Functions.cs | 8 +- ReClass.NET/Forms/MainForm.cs | 1 - ReClass.NET/ReClass.NET.csproj | 6 - 4 files changed, 2 insertions(+), 225 deletions(-) delete mode 100644 ReClass.NET/DataExchange/ReClass/ReClass2007File.cs diff --git a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs b/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs deleted file mode 100644 index c969b9a9..00000000 --- a/ReClass.NET/DataExchange/ReClass/ReClass2007File.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.SQLite; -using System.Diagnostics.Contracts; -using System.Linq; -using ReClassNET.DataExchange.ReClass.Legacy; -using ReClassNET.Extensions; -using ReClassNET.Logger; -using ReClassNET.Nodes; -using ReClassNET.Project; - -namespace ReClassNET.DataExchange.ReClass -{ - public class ReClass2007File : IReClassImport - { - public const string FormatName = "ReClass 2007 File"; - public const string FileExtension = ".rdc"; - - private static readonly Type[] typeMap = - { - null, - typeof(ClassInstanceNode), - typeof(ClassNode), - null, - typeof(Hex32Node), - typeof(Hex16Node), - typeof(Hex8Node), - typeof(ClassPointerNode), - typeof(Int32Node), - typeof(Int16Node), - typeof(Int8Node), - typeof(FloatNode), - typeof(UInt32Node), - typeof(UInt16Node), - typeof(UInt8Node), - typeof(Utf8TextNode), - typeof(FunctionPtrNode) - }; - - private readonly ReClassNetProject project; - - public ReClass2007File(ReClassNetProject project) - { - Contract.Requires(project != null); - - this.project = project; - } - - public void Load(string filePath, ILogger logger) - { - using (var connection = new SQLiteConnection($"Data Source={filePath}")) - { - connection.Open(); - - var classes = new Dictionary(); - var vtables = new Dictionary(); - - foreach (var row in Query(connection, "SELECT tbl_name FROM sqlite_master WHERE tbl_name LIKE 'class%'")) - { - var id = Convert.ToInt32(row["tbl_name"].ToString().Substring(5)); - - var classRow = Query(connection, $"SELECT variable, comment FROM class{id} WHERE type = 2 LIMIT 1").FirstOrDefault(); - if (classRow == null) - { - continue; - } - - // Skip the vtable classes. - if (classRow["variable"].ToString() == "VTABLE") - { - var vtableNode = new VirtualMethodTableNode(); - - Query(connection, $"SELECT variable, comment FROM class{id} WHERE type = 16") - .Select(e => new VirtualMethodNode - { - Name = Convert.ToString(e["variable"]), - Comment = Convert.ToString(e["comment"]) - }) - .ForEach(vtableNode.AddNode); - - foreach (var method in vtableNode.Nodes.Where(m => m.Name == "void function()")) - { - method.Name = string.Empty; - } - - vtables.Add(id, vtableNode); - - continue; - } - - var node = new ClassNode(false) - { - Name = classRow["variable"].ToString(), - Comment = classRow["comment"].ToString() - }; - - project.AddClass(node); - - classes.Add(id, node); - } - - foreach (var kv in classes) - { - ReadNodeRows( - Query(connection, $"SELECT variable, comment, type, length, ref FROM class{kv.Key} WHERE type != 2"), - kv.Value, - classes, - vtables, - logger - ).ForEach(kv.Value.AddNode); - } - } - } - - private static IEnumerable ReadNodeRows(IEnumerable rows, ClassNode parent, IReadOnlyDictionary classes, IReadOnlyDictionary vtables, ILogger logger) - { - Contract.Requires(rows != null); - Contract.Requires(parent != null); - Contract.Requires(logger != null); - - foreach (var row in rows) - { - Type nodeType = null; - - var typeVal = Convert.ToInt32(row["type"]); - if (typeVal >= 0 && typeVal < typeMap.Length) - { - nodeType = typeMap[typeVal]; - } - - if (nodeType == null) - { - logger.Log(LogLevel.Error, $"Skipping node with unknown type: {row["type"]}"); - logger.Log(LogLevel.Warning, string.Join(",", row.ItemArray)); - - continue; - } - - var node = BaseNode.CreateInstanceFromType(nodeType, false); - if (node == null) - { - logger.Log(LogLevel.Error, $"Could not create node of type: {nodeType}"); - - continue; - } - - node.Name = Convert.ToString(row["variable"]); - node.Comment = Convert.ToString(row["comment"]); - - // ClassInstanceNode, ClassPointerNode - if (node is BaseWrapperNode wrapperNode) - { - var reference = Convert.ToInt32(row["ref"]); - if (!classes.ContainsKey(reference)) - { - if (!vtables.TryGetValue(reference, out var vtableNode)) - { - logger.Log(LogLevel.Error, $"Skipping node with unknown reference: {row["ref"]}"); - logger.Log(LogLevel.Warning, string.Join(",", row.ItemArray)); - - continue; - } - - yield return vtableNode; - - continue; - } - - var innerClassNode = classes[reference]; - if (wrapperNode.ShouldPerformCycleCheckForInnerNode() && !ClassUtil.IsCyclicIfClassIsAccessibleFromParent(parent, innerClassNode, classes.Values)) - { - logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {parent.Name}->{node.Name}"); - - continue; - } - - if (node is ClassPointerNode classPointerNode) - { - node = classPointerNode.GetEquivalentNode(innerClassNode); - } - else - { - wrapperNode.ChangeInnerNode(innerClassNode); - } - } - if (node is BaseTextNode textNode) - { - textNode.Length = Math.Max(IntPtr.Size, Convert.ToInt32(row["length"])); - } - - yield return node; - } - } - - private static IEnumerable Query(SQLiteConnection connection, string query) - { - Contract.Requires(connection != null); - Contract.Requires(query != null); - Contract.Ensures(Contract.Result>() != null); - - using (var adapter = new SQLiteDataAdapter(query, connection)) - { - var ds = new DataSet(); - - adapter.Fill(ds); - - return ds.Tables[0].AsEnumerable(); - } - } - } -} diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 5bf0d1c0..72270773 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -192,11 +192,10 @@ public static string ShowOpenProjectFileDialog() using (var ofd = new OpenFileDialog()) { ofd.CheckFileExists = true; - ofd.Filter = $"All ReClass Types |*{ReClassNetFile.FileExtension};*{ReClassFile.FileExtension};*{ReClassQtFile.FileExtension};*{ReClass2007File.FileExtension}" + ofd.Filter = $"All ReClass Types |*{ReClassNetFile.FileExtension};*{ReClassFile.FileExtension};*{ReClassQtFile.FileExtension}" + $"|{ReClassNetFile.FormatName} (*{ReClassNetFile.FileExtension})|*{ReClassNetFile.FileExtension}" + $"|{ReClassFile.FormatName} (*{ReClassFile.FileExtension})|*{ReClassFile.FileExtension}" - + $"|{ReClassQtFile.FormatName} (*{ReClassQtFile.FileExtension})|*{ReClassQtFile.FileExtension}" - + $"|{ReClass2007File.FormatName} (*{ReClass2007File.FileExtension})|*{ReClass2007File.FileExtension}"; + + $"|{ReClassQtFile.FormatName} (*{ReClassQtFile.FileExtension})|*{ReClassQtFile.FileExtension}"; if (ofd.ShowDialog() == DialogResult.OK) { @@ -247,9 +246,6 @@ private static void LoadProjectFromPath(string path, ref ReClassNetProject proje case ReClassFile.FileExtension: import = new ReClassFile(project); break; - case ReClass2007File.FileExtension: - import = new ReClass2007File(project); - break; default: Program.Logger.Log(LogLevel.Error, $"The file '{path}' has an unknown type."); return; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index e69875b2..21c5df8d 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -710,7 +710,6 @@ private void MainForm_DragEnter(object sender, DragEventArgs e) case ReClassNetFile.FileExtension: case ReClassQtFile.FileExtension: case ReClassFile.FileExtension: - case ReClass2007File.FileExtension: e.Effect = DragDropEffects.Copy; break; } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 45c36c5d..bb36a2e0 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -298,7 +298,6 @@ - Form @@ -993,11 +992,6 @@ - - - 1.0.109.2 - - From 9f663a67478642a6a074febf074aff664dc4ad19 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 13:32:21 +0200 Subject: [PATCH 568/777] Removed unused references. --- ReClass.NET/ReClass.NET.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index bb36a2e0..cc375e78 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -128,9 +128,7 @@ - - From b7ebbae95c75c32a4676909267abb8389521634f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 14:16:09 +0200 Subject: [PATCH 569/777] Use the given Encoding instance. --- ReClass.NET/Memory/RemoteProcess.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index aee60957..ff2c0cdd 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -372,7 +372,7 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) /// Reads a string from the address in the remote process with the given length and encoding. The string gets truncated at the first zero character. /// The encoding used by the string. /// The address of the string. - /// The length of the string. + /// The maximum length of the string. /// The string. public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length) { @@ -391,7 +391,7 @@ public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr try { - return Encoding.UTF8.GetString(data, 0, Math.Min(index, data.Length)); + return encoding.GetString(data, 0, Math.Min(index, data.Length)); } catch { From ee55fdb92ae9150d7b8bc3147e29f3cfaa404177 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 15:03:42 +0200 Subject: [PATCH 570/777] Added interfaces to break down RemoteProcess functionality. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 44 ++++---- ReClass.NET/AddressParser/IExecuter.cs | 2 +- ReClass.NET/AddressParser/Interpreter.cs | 20 ++-- ReClass.NET/Memory/IProcessReader.cs | 16 +++ ReClass.NET/Memory/IRemoteMemoryReader.cs | 106 +++++++++++++++++++ ReClass.NET/Memory/IRemoteMemoryWriter.cs | 20 ++++ ReClass.NET/Memory/RemoteProcess.cs | 74 +------------ ReClass.NET/ReClass.NET.csproj | 3 + 8 files changed, 179 insertions(+), 106 deletions(-) create mode 100644 ReClass.NET/Memory/IProcessReader.cs create mode 100644 ReClass.NET/Memory/IRemoteMemoryReader.cs create mode 100644 ReClass.NET/Memory/IRemoteMemoryWriter.cs diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 15ee1795..4458e210 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -9,68 +9,68 @@ namespace ReClassNET.AddressParser { public class DynamicCompiler : IExecuter { - public IntPtr Execute(IExpression operation, RemoteProcess process) + public IntPtr Execute(IExpression operation, IProcessReader processReader) { Contract.Requires(operation != null); - Contract.Requires(process != null); + Contract.Requires(processReader != null); - return CompileAddressFormula(operation)(process); + return CompileAddressFormula(operation)(processReader); } - public static Func CompileAddressFormula(IExpression expression) + public static Func CompileAddressFormula(IExpression expression) { Contract.Requires(expression != null); - var processParameter = Expression.Parameter(typeof(RemoteProcess)); + var processParameter = Expression.Parameter(typeof(IProcessReader)); - return Expression.Lambda>( + return Expression.Lambda>( GenerateMethodBody(expression, processParameter), processParameter ).Compile(); } - private static Expression GenerateMethodBody(IExpression operation, ParameterExpression processParameter) + private static Expression GenerateMethodBody(IExpression operation, Expression parameter) { Contract.Requires(operation != null); - Contract.Requires(processParameter != null); + Contract.Requires(parameter != null); switch (operation) { case AddExpression addExpression: { - var argument1 = GenerateMethodBody(addExpression.Lhs, processParameter); - var argument2 = GenerateMethodBody(addExpression.Rhs, processParameter); + var argument1 = GenerateMethodBody(addExpression.Lhs, parameter); + var argument2 = GenerateMethodBody(addExpression.Rhs, parameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Add)), argument1, argument2); } case SubtractExpression subtractExpression: { - var argument1 = GenerateMethodBody(subtractExpression.Lhs, processParameter); - var argument2 = GenerateMethodBody(subtractExpression.Rhs, processParameter); + var argument1 = GenerateMethodBody(subtractExpression.Lhs, parameter); + var argument2 = GenerateMethodBody(subtractExpression.Rhs, parameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Sub)), argument1, argument2); } case MultiplyExpression multiplyExpression: { - var argument1 = GenerateMethodBody(multiplyExpression.Lhs, processParameter); - var argument2 = GenerateMethodBody(multiplyExpression.Rhs, processParameter); + var argument1 = GenerateMethodBody(multiplyExpression.Lhs, parameter); + var argument2 = GenerateMethodBody(multiplyExpression.Rhs, parameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Mul)), argument1, argument2); } case DivideExpression divideExpression: { - var argument1 = GenerateMethodBody(divideExpression.Lhs, processParameter); - var argument2 = GenerateMethodBody(divideExpression.Rhs, processParameter); + var argument1 = GenerateMethodBody(divideExpression.Lhs, parameter); + var argument2 = GenerateMethodBody(divideExpression.Rhs, parameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Div)), argument1, argument2); } case ModuleExpression moduleExpression: { - var getModuleByNameFunc = typeof(RemoteProcess).GetRuntimeMethod(nameof(RemoteProcess.GetModuleByName), new[] { typeof(string) }); + var getModuleByNameFunc = typeof(IProcessReader).GetRuntimeMethod(nameof(IProcessReader.GetModuleByName), new[] { typeof(string) }); var moduleNameConstant = Expression.Constant(moduleExpression.Name); var moduleVariable = Expression.Variable(typeof(Memory.Module)); - var assignExpression = Expression.Assign(moduleVariable, Expression.Call(processParameter, getModuleByNameFunc, moduleNameConstant)); + var assignExpression = Expression.Assign(moduleVariable, Expression.Call(parameter, getModuleByNameFunc, moduleNameConstant)); return Expression.Block( new[] { moduleVariable }, @@ -90,12 +90,12 @@ private static Expression GenerateMethodBody(IExpression operation, ParameterExp } case ReadMemoryExpression readMemoryExpression: { - var argument = GenerateMethodBody(readMemoryExpression.Expression, processParameter); + var argument = GenerateMethodBody(readMemoryExpression.Expression, parameter); - var functionName = readMemoryExpression.ByteCount == 4 ? nameof(RemoteProcess.ReadRemoteInt32) : nameof(RemoteProcess.ReadRemoteInt64); - var readRemoteIntFn = typeof(RemoteProcess).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); + var functionName = readMemoryExpression.ByteCount == 4 ? nameof(IProcessReader.ReadRemoteInt32) : nameof(IProcessReader.ReadRemoteInt64); + var readRemoteIntFn = typeof(IProcessReader).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); - var callExpression = Expression.Call(processParameter, readRemoteIntFn, argument); + var callExpression = Expression.Call(parameter, readRemoteIntFn, argument); var paramType = readMemoryExpression.ByteCount == 4 ? typeof(int) : typeof(long); var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { paramType }); diff --git a/ReClass.NET/AddressParser/IExecuter.cs b/ReClass.NET/AddressParser/IExecuter.cs index 07e036ad..930813a7 100644 --- a/ReClass.NET/AddressParser/IExecuter.cs +++ b/ReClass.NET/AddressParser/IExecuter.cs @@ -5,6 +5,6 @@ namespace ReClassNET.AddressParser { public interface IExecuter { - IntPtr Execute(IExpression expression, RemoteProcess process); + IntPtr Execute(IExpression expression, IProcessReader processReader); } } diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index b113f57d..4e743516 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -7,10 +7,10 @@ namespace ReClassNET.AddressParser { public class Interpreter : IExecuter { - public IntPtr Execute(IExpression expression, RemoteProcess process) + public IntPtr Execute(IExpression expression, IProcessReader processReader) { Contract.Requires(expression != null); - Contract.Requires(process != null); + Contract.Requires(processReader != null); switch (expression) { @@ -18,7 +18,7 @@ public IntPtr Execute(IExpression expression, RemoteProcess process) return IntPtrExtension.From(constantExpression.Value); case ModuleExpression moduleExpression: { - var module = process.GetModuleByName(moduleExpression.Name); + var module = processReader.GetModuleByName(moduleExpression.Name); if (module != null) { return module.Start; @@ -27,22 +27,22 @@ public IntPtr Execute(IExpression expression, RemoteProcess process) return IntPtr.Zero; } case AddExpression addExpression: - return Execute(addExpression.Lhs, process).Add(Execute(addExpression.Rhs, process)); + return Execute(addExpression.Lhs, processReader).Add(Execute(addExpression.Rhs, processReader)); case SubtractExpression subtractExpression: - return Execute(subtractExpression.Lhs, process).Sub(Execute(subtractExpression.Rhs, process)); + return Execute(subtractExpression.Lhs, processReader).Sub(Execute(subtractExpression.Rhs, processReader)); case MultiplyExpression multiplyExpression: - return Execute(multiplyExpression.Lhs, process).Mul(Execute(multiplyExpression.Rhs, process)); + return Execute(multiplyExpression.Lhs, processReader).Mul(Execute(multiplyExpression.Rhs, processReader)); case DivideExpression divideExpression: - return Execute(divideExpression.Lhs, process).Div(Execute(divideExpression.Rhs, process)); + return Execute(divideExpression.Lhs, processReader).Div(Execute(divideExpression.Rhs, processReader)); case ReadMemoryExpression readMemoryExpression: - var readFromAddress = Execute(readMemoryExpression.Expression, process); + var readFromAddress = Execute(readMemoryExpression.Expression, processReader); if (readMemoryExpression.ByteCount == 4) { - return IntPtrExtension.From(process.ReadRemoteInt32(readFromAddress)); + return IntPtrExtension.From(processReader.ReadRemoteInt32(readFromAddress)); } else { - return IntPtrExtension.From(process.ReadRemoteInt64(readFromAddress)); + return IntPtrExtension.From(processReader.ReadRemoteInt64(readFromAddress)); } default: throw new ArgumentException($"Unsupported operation '{expression.GetType().FullName}'."); diff --git a/ReClass.NET/Memory/IProcessReader.cs b/ReClass.NET/Memory/IProcessReader.cs new file mode 100644 index 00000000..048bbea7 --- /dev/null +++ b/ReClass.NET/Memory/IProcessReader.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace ReClassNET.Memory +{ + public interface IProcessReader : IRemoteMemoryReader + { + Section GetSectionToPointer(IntPtr address); + + Module GetModuleToPointer(IntPtr address); + + Module GetModuleByName(string name); + + bool EnumerateRemoteSectionsAndModules(out List
sections, out List modules); + } +} diff --git a/ReClass.NET/Memory/IRemoteMemoryReader.cs b/ReClass.NET/Memory/IRemoteMemoryReader.cs new file mode 100644 index 00000000..b4f75544 --- /dev/null +++ b/ReClass.NET/Memory/IRemoteMemoryReader.cs @@ -0,0 +1,106 @@ +using System; +using System.Text; + +namespace ReClassNET.Memory +{ + public interface IRemoteMemoryReader + { + /// Reads remote memory from the address into the buffer. + /// The address to read from. + /// [out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros. + bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer); + + /// Reads remote memory from the address into the buffer. + /// The address to read from. + /// [out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros. + /// The offset in the data. + /// The number of bytes to read. + bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer, int offset, int length); + + /// Reads bytes from the address in the remote process. + /// The address to read from. + /// The size in bytes to read. + /// An array of bytes. + byte[] ReadRemoteMemory(IntPtr address, int size); + + /// Reads the object from the address in the remote process. + /// Type of the value to read. + /// The address to read from. + /// The remote object. + T ReadRemoteObject(IntPtr address) where T : struct; + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + sbyte ReadRemoteInt8(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + byte ReadRemoteUInt8(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + short ReadRemoteInt16(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + ushort ReadRemoteUInt16(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + int ReadRemoteInt32(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + uint ReadRemoteUInt32(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + long ReadRemoteInt64(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + ulong ReadRemoteUInt64(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + float ReadRemoteFloat(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + double ReadRemoteDouble(IntPtr address); + + /// Reads a from the address in the remote process. + /// The address to read from. + /// The data read as or 0 if the read fails. + IntPtr ReadRemoteIntPtr(IntPtr address); + + /// Reads a string from the address in the remote process with the given length using the provided encoding. + /// The encoding used by the string. + /// The address of the string. + /// The length of the string. + /// The string. + string ReadRemoteString(Encoding encoding, IntPtr address, int length); + + /// Reads a string from the address in the remote process with the given length and encoding. The string gets truncated at the first zero character. + /// The encoding used by the string. + /// The address of the string. + /// The maximum length of the string. + /// The string. + string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length); + + /// Reads remote runtime type information for the given address from the remote process. + /// The address. + /// A string containing the runtime type information or null if no information could get found. + string ReadRemoteRuntimeTypeInformation(IntPtr address); + } +} diff --git a/ReClass.NET/Memory/IRemoteMemoryWriter.cs b/ReClass.NET/Memory/IRemoteMemoryWriter.cs new file mode 100644 index 00000000..bc466d42 --- /dev/null +++ b/ReClass.NET/Memory/IRemoteMemoryWriter.cs @@ -0,0 +1,20 @@ +using System; + +namespace ReClassNET.Memory +{ + public interface IRemoteMemoryWriter + { + /// Writes the given to the in the remote process. + /// The address to write to. + /// The data to write. + /// True if it succeeds, false if it fails. + bool WriteRemoteMemory(IntPtr address, byte[] data); + + /// Writes the given to the in the remote process. + /// Type of the value to write. + /// The address to write to. + /// The value to write. + /// True if it succeeds, false if it fails. + bool WriteRemoteMemory(IntPtr address, T value) where T : struct; + } +} diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index ff2c0cdd..9378b262 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -13,13 +13,12 @@ using ReClassNET.MemoryScanner; using ReClassNET.Native; using ReClassNET.Symbols; -using ReClassNET.Util; namespace ReClassNET.Memory { public delegate void RemoteProcessEvent(RemoteProcess sender); - public class RemoteProcess : IDisposable + public class RemoteProcess : IDisposable, IRemoteMemoryReader, IRemoteMemoryWriter, IProcessReader { private readonly object processSync = new object(); @@ -151,9 +150,6 @@ public void Close() #region ReadMemory - /// Reads remote memory from the address into the buffer. - /// The address to read from. - /// [out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros. public bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer) { Contract.Requires(buffer != null); @@ -162,11 +158,6 @@ public bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer) return ReadRemoteMemoryIntoBuffer(address, ref buffer, 0, buffer.Length); } - /// Reads remote memory from the address into the buffer. - /// The address to read from. - /// [out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros. - /// The offset in the data. - /// The number of bytes to read. public bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer, int offset, int length) { Contract.Requires(buffer != null); @@ -188,10 +179,6 @@ public bool ReadRemoteMemoryIntoBuffer(IntPtr address, ref byte[] buffer, int of return coreFunctions.ReadRemoteMemory(handle, address, ref buffer, offset, length); } - /// Reads bytes from the address in the remote process. - /// The address to read from. - /// The size in bytes to read. - /// An array of bytes. public byte[] ReadRemoteMemory(IntPtr address, int size) { Contract.Requires(size >= 0); @@ -202,10 +189,6 @@ public byte[] ReadRemoteMemory(IntPtr address, int size) return data; } - /// Reads the object from the address in the remote process. - /// Type of the value to read. - /// The address to read from. - /// The remote object. public T ReadRemoteObject(IntPtr address) where T : struct { var data = ReadRemoteMemory(address, Marshal.SizeOf()); @@ -219,9 +202,6 @@ public T ReadRemoteObject(IntPtr address) where T : struct #region Read Remote Primitive Types - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public sbyte ReadRemoteInt8(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(sbyte)); @@ -229,9 +209,6 @@ public sbyte ReadRemoteInt8(IntPtr address) return (sbyte)data[0]; } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public byte ReadRemoteUInt8(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(byte)); @@ -239,9 +216,6 @@ public byte ReadRemoteUInt8(IntPtr address) return data[0]; } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public short ReadRemoteInt16(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(short)); @@ -249,9 +223,6 @@ public short ReadRemoteInt16(IntPtr address) return BitConverter.ToInt16(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public ushort ReadRemoteUInt16(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(ushort)); @@ -259,9 +230,6 @@ public ushort ReadRemoteUInt16(IntPtr address) return BitConverter.ToUInt16(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public int ReadRemoteInt32(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(int)); @@ -269,9 +237,6 @@ public int ReadRemoteInt32(IntPtr address) return BitConverter.ToInt32(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public uint ReadRemoteUInt32(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(uint)); @@ -279,9 +244,6 @@ public uint ReadRemoteUInt32(IntPtr address) return BitConverter.ToUInt32(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public long ReadRemoteInt64(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(long)); @@ -289,9 +251,6 @@ public long ReadRemoteInt64(IntPtr address) return BitConverter.ToInt64(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public ulong ReadRemoteUInt64(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(ulong)); @@ -299,9 +258,6 @@ public ulong ReadRemoteUInt64(IntPtr address) return BitConverter.ToUInt64(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public float ReadRemoteFloat(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(float)); @@ -309,9 +265,6 @@ public float ReadRemoteFloat(IntPtr address) return BitConverter.ToSingle(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public double ReadRemoteDouble(IntPtr address) { var data = ReadRemoteMemory(address, sizeof(double)); @@ -319,9 +272,6 @@ public double ReadRemoteDouble(IntPtr address) return BitConverter.ToDouble(data, 0); } - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. public IntPtr ReadRemoteIntPtr(IntPtr address) { #if RECLASSNET64 @@ -333,11 +283,6 @@ public IntPtr ReadRemoteIntPtr(IntPtr address) #endregion - /// Reads a string from the address in the remote process with the given length using the provided encoding. - /// The encoding used by the string. - /// The address of the string. - /// The length of the string. - /// The string. public string ReadRemoteString(Encoding encoding, IntPtr address, int length) { Contract.Requires(encoding != null); @@ -369,11 +314,6 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) } } - /// Reads a string from the address in the remote process with the given length and encoding. The string gets truncated at the first zero character. - /// The encoding used by the string. - /// The address of the string. - /// The maximum length of the string. - /// The string. public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length) { Contract.Requires(encoding != null); @@ -399,9 +339,6 @@ public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr } } - /// Reads remote runtime type information for the given address from the remote process. - /// The address. - /// A string containing the runtime type information or null if no information could get found. public string ReadRemoteRuntimeTypeInformation(IntPtr address) { if (address.MayBeValid()) @@ -548,10 +485,6 @@ private string ReadRemoteRuntimeTypeInformation64(IntPtr address) #region WriteMemory - /// Writes the given to the in the remote process. - /// The address to write to. - /// The data to write. - /// True if it succeeds, false if it fails. public bool WriteRemoteMemory(IntPtr address, byte[] data) { Contract.Requires(data != null); @@ -564,11 +497,6 @@ public bool WriteRemoteMemory(IntPtr address, byte[] data) return coreFunctions.WriteRemoteMemory(handle, address, ref data, 0, data.Length); } - /// Writes the given to the in the remote process. - /// Type of the value to write. - /// The address to write to. - /// The value to write. - /// True if it succeeds, false if it fails. public bool WriteRemoteMemory(IntPtr address, T value) where T : struct { var data = new byte[Marshal.SizeOf()]; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index cc375e78..cb9f189e 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -258,6 +258,9 @@ + + + From e0b94625cf9589a2c23cffb73a312823413f180f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 15:36:34 +0200 Subject: [PATCH 571/777] Added tests for Interpreter and DynamicCompiler. Implemented missing NegateExpression. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 28 +++++--- ReClass.NET/AddressParser/Interpreter.cs | 2 + ReClass.NET/Extensions/IntPtrExtensions.cs | 11 ++++ .../AddressParser/DynamicCompilerTest.cs | 17 +++++ .../AddressParser/ExecutorTest.cs | 65 +++++++++++++++++++ .../AddressParser/InterpreterTest.cs | 17 +++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 6 ++ 7 files changed, 136 insertions(+), 10 deletions(-) create mode 100644 ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs create mode 100644 ReClass.NET_Tests/AddressParser/ExecutorTest.cs create mode 100644 ReClass.NET_Tests/AddressParser/InterpreterTest.cs diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 4458e210..d1228398 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -29,13 +29,27 @@ public static Func CompileAddressFormula(IExpression exp ).Compile(); } - private static Expression GenerateMethodBody(IExpression operation, Expression parameter) + private static Expression GenerateMethodBody(IExpression expression, Expression parameter) { - Contract.Requires(operation != null); + Contract.Requires(expression != null); Contract.Requires(parameter != null); - switch (operation) + switch (expression) { + case ConstantExpression constantExpression: + { + var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { typeof(long) }); + + return Expression.Call(null, convertFn, Expression.Constant(constantExpression.Value)); + } + case NegateExpression negateExpression: + { + var argument = GenerateMethodBody(negateExpression.Expression, parameter); + + var negateFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.Negate), new[] { typeof(IntPtr) }); + + return Expression.Call(null, negateFn, argument); + } case AddExpression addExpression: { var argument1 = GenerateMethodBody(addExpression.Lhs, parameter); @@ -82,12 +96,6 @@ private static Expression GenerateMethodBody(IExpression operation, Expression p ) ); } - case ConstantExpression constantExpression: - { - var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { typeof(long) }); - - return Expression.Call(null, convertFn, Expression.Constant(constantExpression.Value)); - } case ReadMemoryExpression readMemoryExpression: { var argument = GenerateMethodBody(readMemoryExpression.Expression, parameter); @@ -104,7 +112,7 @@ private static Expression GenerateMethodBody(IExpression operation, Expression p } } - throw new ArgumentException($"Unsupported operation '{operation.GetType().FullName}'."); + throw new ArgumentException($"Unsupported operation '{expression.GetType().FullName}'."); } private static MethodInfo GetIntPtrExtension(string name) diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index 4e743516..c585764a 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -16,6 +16,8 @@ public IntPtr Execute(IExpression expression, IProcessReader processReader) { case ConstantExpression constantExpression: return IntPtrExtension.From(constantExpression.Value); + case NegateExpression negateExpression: + return Execute(negateExpression.Expression, processReader).Negate(); case ModuleExpression moduleExpression: { var module = processReader.GetModuleByName(moduleExpression.Name); diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index 504f4927..e98eee15 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -81,6 +81,17 @@ public static int Mod(this IntPtr lhs, int mod) #endif } + [Pure] + [DebuggerStepThrough] + public static IntPtr Negate(this IntPtr ptr) + { +#if RECLASSNET64 + return new IntPtr(-ptr.ToInt64()); +#else + return new IntPtr(-ptr.ToInt32()); +#endif + } + [Pure] [DebuggerStepThrough] public static bool InRange(this IntPtr address, IntPtr start, IntPtr end) diff --git a/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs new file mode 100644 index 00000000..df5a490e --- /dev/null +++ b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ReClassNET.AddressParser; + +namespace ReClass.NET_Tests.AddressParser +{ + public class DynamicCompilerTest : ExecutorTest + { + protected override IExecuter CreateExecutor() + { + return new DynamicCompiler(); + } + } +} diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs new file mode 100644 index 00000000..e4c44662 --- /dev/null +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Moq; +using NFluent; +using ReClassNET.AddressParser; +using ReClassNET.Memory; +using Xunit; + +namespace ReClass.NET_Tests.AddressParser +{ + public abstract class ExecutorTest + { + protected abstract IExecuter CreateExecutor(); + + public static IEnumerable GetSimpleExpressionTestData() => new List + { + new object[] { "0", (IntPtr)0x0 }, + new object[] { "0 + 0", (IntPtr)0x0 }, + new object[] { "+0", (IntPtr)0x0 }, + new object[] { "-0", (IntPtr)0x0 }, + new object[] { "-1", (IntPtr)(-1) }, + new object[] { "+0 + 0", (IntPtr)0x0 }, + new object[] { "-0 - 0", (IntPtr)0x0 }, + new object[] { "0 + 1", (IntPtr)0x1 }, + new object[] { "0 - 1", (IntPtr)(-1) }, + new object[] { "1 + 2 * 3", (IntPtr)0x7 }, + new object[] { "0x123 + 0x234 * 0x345", (IntPtr)0x73527 } + }; + + [Theory] + [MemberData(nameof(GetSimpleExpressionTestData))] + public void SimpleExpressionTest(string expression, IntPtr expected) + { + var mock = new Mock(); + + var executor = CreateExecutor(); + + Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); + } + + public static IEnumerable GetModuleExpressionTestData() => new List + { + new object[] { "", (IntPtr)0x100 }, + new object[] { " + 0", (IntPtr)0x100 }, + new object[] { " + 10", (IntPtr)0x110 }, + new object[] { " * 2", (IntPtr)0x200 } + }; + + [Theory] + [MemberData(nameof(GetModuleExpressionTestData))] + public void ModuleExpressionTest(string expression, IntPtr expected) + { + var mock = new Mock(); + mock.Setup(p => p.GetModuleByName("test.module")) + .Returns(new Module { Start = (IntPtr)0x100 }); + + var executor = CreateExecutor(); + + Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/AddressParser/InterpreterTest.cs b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs new file mode 100644 index 00000000..5f201ec0 --- /dev/null +++ b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ReClassNET.AddressParser; + +namespace ReClass.NET_Tests.AddressParser +{ + public class InterpreterTest : ExecutorTest + { + protected override IExecuter CreateExecutor() + { + return new Interpreter(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 78cff692..57e837c9 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -39,6 +39,9 @@ + + + @@ -50,6 +53,9 @@ + + 4.10.1 + 2.5.0 From 4ff826c341e0e85c819eb95c4286e7c9a90a11ff Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 15:39:41 +0200 Subject: [PATCH 572/777] Fixed typo. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 10 +++++----- .../AddressParser/{IExecuter.cs => IExecutor.cs} | 2 +- ReClass.NET/AddressParser/Interpreter.cs | 2 +- ReClass.NET/Memory/RemoteProcess.cs | 2 +- ReClass.NET/ReClass.NET.csproj | 2 +- ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs | 2 +- ReClass.NET_Tests/AddressParser/ExecutorTest.cs | 2 +- ReClass.NET_Tests/AddressParser/InterpreterTest.cs | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) rename ReClass.NET/AddressParser/{IExecuter.cs => IExecutor.cs} (85%) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index d1228398..0e80a4af 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -7,17 +7,17 @@ namespace ReClassNET.AddressParser { - public class DynamicCompiler : IExecuter + public class DynamicCompiler : IExecutor { - public IntPtr Execute(IExpression operation, IProcessReader processReader) + public IntPtr Execute(IExpression expression, IProcessReader processReader) { - Contract.Requires(operation != null); + Contract.Requires(expression != null); Contract.Requires(processReader != null); - return CompileAddressFormula(operation)(processReader); + return CompileExpression(expression)(processReader); } - public static Func CompileAddressFormula(IExpression expression) + public static Func CompileExpression(IExpression expression) { Contract.Requires(expression != null); diff --git a/ReClass.NET/AddressParser/IExecuter.cs b/ReClass.NET/AddressParser/IExecutor.cs similarity index 85% rename from ReClass.NET/AddressParser/IExecuter.cs rename to ReClass.NET/AddressParser/IExecutor.cs index 930813a7..0620d0e4 100644 --- a/ReClass.NET/AddressParser/IExecuter.cs +++ b/ReClass.NET/AddressParser/IExecutor.cs @@ -3,7 +3,7 @@ namespace ReClassNET.AddressParser { - public interface IExecuter + public interface IExecutor { IntPtr Execute(IExpression expression, IProcessReader processReader); } diff --git a/ReClass.NET/AddressParser/Interpreter.cs b/ReClass.NET/AddressParser/Interpreter.cs index c585764a..ad7ee372 100644 --- a/ReClass.NET/AddressParser/Interpreter.cs +++ b/ReClass.NET/AddressParser/Interpreter.cs @@ -5,7 +5,7 @@ namespace ReClassNET.AddressParser { - public class Interpreter : IExecuter + public class Interpreter : IExecutor { public IntPtr Execute(IExpression expression, IProcessReader processReader) { diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 9378b262..436c3e05 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -650,7 +650,7 @@ public IntPtr ParseAddress(string addressFormula) { var expression = Parser.Parse(addressFormula); - func = DynamicCompiler.CompileAddressFormula(expression); + func = DynamicCompiler.CompileExpression(expression); formulaCache.Add(addressFormula, func); } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index cb9f189e..cb62f939 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -134,7 +134,7 @@ - + diff --git a/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs index df5a490e..1ba20a85 100644 --- a/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs +++ b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs @@ -9,7 +9,7 @@ namespace ReClass.NET_Tests.AddressParser { public class DynamicCompilerTest : ExecutorTest { - protected override IExecuter CreateExecutor() + protected override IExecutor CreateExecutor() { return new DynamicCompiler(); } diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index e4c44662..8fd28c98 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -13,7 +13,7 @@ namespace ReClass.NET_Tests.AddressParser { public abstract class ExecutorTest { - protected abstract IExecuter CreateExecutor(); + protected abstract IExecutor CreateExecutor(); public static IEnumerable GetSimpleExpressionTestData() => new List { diff --git a/ReClass.NET_Tests/AddressParser/InterpreterTest.cs b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs index 5f201ec0..92348e8a 100644 --- a/ReClass.NET_Tests/AddressParser/InterpreterTest.cs +++ b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs @@ -9,7 +9,7 @@ namespace ReClass.NET_Tests.AddressParser { public class InterpreterTest : ExecutorTest { - protected override IExecuter CreateExecutor() + protected override IExecutor CreateExecutor() { return new Interpreter(); } From a4b9dee823add41eb4cd0f76f10d2549fba62f63 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 16:19:56 +0200 Subject: [PATCH 573/777] Added ReadMemoryExpression tests. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 4 +-- .../AddressParser/ExecutorTest.cs | 32 ++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 0e80a4af..47eccb5e 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -100,8 +100,8 @@ private static Expression GenerateMethodBody(IExpression expression, Expression { var argument = GenerateMethodBody(readMemoryExpression.Expression, parameter); - var functionName = readMemoryExpression.ByteCount == 4 ? nameof(IProcessReader.ReadRemoteInt32) : nameof(IProcessReader.ReadRemoteInt64); - var readRemoteIntFn = typeof(IProcessReader).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); + var functionName = readMemoryExpression.ByteCount == 4 ? nameof(IRemoteMemoryReader.ReadRemoteInt32) : nameof(IRemoteMemoryReader.ReadRemoteInt64); + var readRemoteIntFn = typeof(IRemoteMemoryReader).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); var callExpression = Expression.Call(parameter, readRemoteIntFn, argument); diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index 8fd28c98..01a4597c 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -27,7 +27,8 @@ public abstract class ExecutorTest new object[] { "0 + 1", (IntPtr)0x1 }, new object[] { "0 - 1", (IntPtr)(-1) }, new object[] { "1 + 2 * 3", (IntPtr)0x7 }, - new object[] { "0x123 + 0x234 * 0x345", (IntPtr)0x73527 } + new object[] { "0x123 + 0x234 * 0x345", (IntPtr)0x73527 }, + new object[] { "4 / 0x2", (IntPtr)0x2 } }; [Theory] @@ -61,5 +62,34 @@ public void ModuleExpressionTest(string expression, IntPtr expected) Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); } + + public static IEnumerable GetReadMemoryExpressionTestData() => new List + { + new object[] { "[0]", (IntPtr)0x0 }, + new object[] { "[0] + 10", (IntPtr)0x10 }, + new object[] { "[10]", (IntPtr)0x10 }, + new object[] { "[10 + 10]", (IntPtr)0x20 }, + new object[] { "[[10] + 10]", (IntPtr)0x20 }, + new object[] { "[[10] + [10]] + [10]", (IntPtr)0x30 } + }; + + [Theory] + [MemberData(nameof(GetReadMemoryExpressionTestData))] + public void ReadMemoryExpressionTest(string expression, IntPtr expected) + { + var mock = new Mock(); + mock.Setup(p => p.ReadRemoteInt32((IntPtr)0)) + .Returns(0); + mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x10)) + .Returns(0x10); + mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x20)) + .Returns(0x20); + mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x30)) + .Returns(0x30); + + var executor = CreateExecutor(); + + Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); + } } } From 164a582ed8f163f3d7278ef40e2191d5d1a9cff2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 19:33:29 +0200 Subject: [PATCH 574/777] Added more tests. Fixed project plattform configuration. --- ReClass.NET.sln | 26 +++++---- .../AddressParser/ExecutorTest.cs | 54 ++++++++++++++----- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 26 +++++++-- 3 files changed, 77 insertions(+), 29 deletions(-) diff --git a/ReClass.NET.sln b/ReClass.NET.sln index 9b52dc5d..ec68abfc 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.10 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.156 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET", "ReClass.NET\ReClass.NET.csproj", "{BFB8917D-E9B4-463F-A6E8-612C35728C78}" ProjectSection(ProjectDependencies) = postProject @@ -74,18 +74,16 @@ Global {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x64.Build.0 = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.ActiveCfg = Release|Any CPU {16591D29-2370-428A-BA11-87E38D0F3551}.Release|x86.Build.0 = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.ActiveCfg = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.Build.0 = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.ActiveCfg = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.Build.0 = Debug|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|Any CPU.Build.0 = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.ActiveCfg = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.Build.0 = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.ActiveCfg = Release|Any CPU - {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.Build.0 = Release|Any CPU + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|Any CPU.ActiveCfg = Debug|x86 + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.ActiveCfg = Debug|x64 + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x64.Build.0 = Debug|x64 + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.ActiveCfg = Debug|x86 + {E2D0424D-738F-41C3-9935-1B282624600F}.Debug|x86.Build.0 = Debug|x86 + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|Any CPU.ActiveCfg = Release|x86 + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.ActiveCfg = Release|x64 + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x64.Build.0 = Release|x64 + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.ActiveCfg = Release|x86 + {E2D0424D-738F-41C3-9935-1B282624600F}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index 01a4597c..c85284d2 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Moq; using NFluent; using ReClassNET.AddressParser; @@ -63,19 +60,19 @@ public void ModuleExpressionTest(string expression, IntPtr expected) Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); } - public static IEnumerable GetReadMemoryExpressionTestData() => new List + public static IEnumerable GetReadMemoryExpressionTestData(int bytesToRead) => new List { - new object[] { "[0]", (IntPtr)0x0 }, - new object[] { "[0] + 10", (IntPtr)0x10 }, - new object[] { "[10]", (IntPtr)0x10 }, - new object[] { "[10 + 10]", (IntPtr)0x20 }, - new object[] { "[[10] + 10]", (IntPtr)0x20 }, - new object[] { "[[10] + [10]] + [10]", (IntPtr)0x30 } + new object[] { $"[0,{bytesToRead}]", (IntPtr)0x0 }, + new object[] { $"[0,{bytesToRead}] + 10", (IntPtr)0x10 }, + new object[] { $"[10,{bytesToRead}]", (IntPtr)0x10 }, + new object[] { $"[10 + 10,{bytesToRead}]", (IntPtr)0x20 }, + new object[] { $"[[10,{bytesToRead}] + 10,{bytesToRead}]", (IntPtr)0x20 }, + new object[] { $"[[10,{bytesToRead}] + [10,{bytesToRead}],{bytesToRead}] + [10,{bytesToRead}]", (IntPtr)0x30 } }; [Theory] - [MemberData(nameof(GetReadMemoryExpressionTestData))] - public void ReadMemoryExpressionTest(string expression, IntPtr expected) + [MemberData(nameof(GetReadMemoryExpressionTestData), 4)] + public void ReadMemoryExpression32Test(string expression, IntPtr expected) { var mock = new Mock(); mock.Setup(p => p.ReadRemoteInt32((IntPtr)0)) @@ -91,5 +88,38 @@ public void ReadMemoryExpressionTest(string expression, IntPtr expected) Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); } + + [Theory] + [MemberData(nameof(GetReadMemoryExpressionTestData), 8)] + public void ReadMemoryExpression64Test(string expression, IntPtr expected) + { + var mock = new Mock(); + mock.Setup(p => p.ReadRemoteInt64((IntPtr)0)) + .Returns(0); + mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x10)) + .Returns(0x10); + mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x20)) + .Returns(0x20); + mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x30)) + .Returns(0x30); + + var executor = CreateExecutor(); + + Check.That(executor.Execute(Parser.Parse(expression), mock.Object)).IsEqualTo(expected); + } + + [Fact] + public void ReadMemoryExpressionInvariantTest() + { + var mock = new Mock(); + mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x10)) + .Returns(0x10); + mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x10)) + .Returns(0x10); + + var executor = CreateExecutor(); + + Check.That(executor.Execute(Parser.Parse("[10]"), mock.Object)).IsEqualTo((IntPtr)0x10); + } } } diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 57e837c9..ebc1d829 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -3,7 +3,7 @@ Debug - AnyCPU + x86 {E2D0424D-738F-41C3-9935-1B282624600F} Library Properties @@ -16,7 +16,7 @@ - + true full false @@ -26,13 +26,33 @@ 4 x86 - + pdbonly true bin\Release\ TRACE prompt 4 + x86 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x64 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + x64 From de54c063dcd6fdcad341ec783bc83a362b96e8d8 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 20:58:55 +0200 Subject: [PATCH 575/777] Removed method overload. --- ReClass.NET/Forms/ProcessInfoForm.cs | 55 ++++++++++++++-------------- ReClass.NET/Memory/RemoteProcess.cs | 15 ++------ 2 files changed, 32 insertions(+), 38 deletions(-) diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index 5c1e5fe0..18990d3f 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -66,29 +66,30 @@ private async void ProcessInfoForm_Load(object sender, EventArgs e) return; } - var sections = new DataTable(); - sections.Columns.Add("address", typeof(string)); - sections.Columns.Add("size", typeof(string)); - sections.Columns.Add("name", typeof(string)); - sections.Columns.Add("protection", typeof(string)); - sections.Columns.Add("type", typeof(string)); - sections.Columns.Add("module", typeof(string)); - sections.Columns.Add("section", typeof(Section)); - - var modules = new DataTable(); - modules.Columns.Add("icon", typeof(Icon)); - modules.Columns.Add("name", typeof(string)); - modules.Columns.Add("address", typeof(string)); - modules.Columns.Add("size", typeof(string)); - modules.Columns.Add("path", typeof(string)); - modules.Columns.Add("module", typeof(Module)); + var sectionsTable = new DataTable(); + sectionsTable.Columns.Add("address", typeof(string)); + sectionsTable.Columns.Add("size", typeof(string)); + sectionsTable.Columns.Add("name", typeof(string)); + sectionsTable.Columns.Add("protection", typeof(string)); + sectionsTable.Columns.Add("type", typeof(string)); + sectionsTable.Columns.Add("module", typeof(string)); + sectionsTable.Columns.Add("section", typeof(Section)); + + var modulesTable = new DataTable(); + modulesTable.Columns.Add("icon", typeof(Icon)); + modulesTable.Columns.Add("name", typeof(string)); + modulesTable.Columns.Add("address", typeof(string)); + modulesTable.Columns.Add("size", typeof(string)); + modulesTable.Columns.Add("path", typeof(string)); + modulesTable.Columns.Add("module", typeof(Module)); await Task.Run(() => { - process.EnumerateRemoteSectionsAndModules( - delegate (Section section) + if (process.EnumerateRemoteSectionsAndModules(out var sections, out var modules)) + { + foreach (var section in sections) { - var row = sections.NewRow(); + var row = sectionsTable.NewRow(); row["address"] = section.Start.ToString(Constants.AddressHexFormat); row["size"] = section.Size.ToString(Constants.AddressHexFormat); row["name"] = section.Name; @@ -96,24 +97,24 @@ await Task.Run(() => row["type"] = section.Type.ToString(); row["module"] = section.ModuleName; row["section"] = section; - sections.Rows.Add(row); - }, - delegate (Module module) + sectionsTable.Rows.Add(row); + } + foreach (var module in modules) { - var row = modules.NewRow(); + var row = modulesTable.NewRow(); row["icon"] = NativeMethods.GetIconForFile(module.Path); row["name"] = module.Name; row["address"] = module.Start.ToString(Constants.AddressHexFormat); row["size"] = module.Size.ToString(Constants.AddressHexFormat); row["path"] = module.Path; row["module"] = module; - modules.Rows.Add(row); + modulesTable.Rows.Add(row); } - ); + } }); - sectionsDataGridView.DataSource = sections; - modulesDataGridView.DataSource = modules; + sectionsDataGridView.DataSource = sectionsTable; + modulesDataGridView.DataSource = modulesTable; } private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 436c3e05..6b09b159 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -566,16 +566,6 @@ public string GetNamedAddress(IntPtr address) return null; } - public void EnumerateRemoteSectionsAndModules(Action
callbackSection, Action callbackModule) - { - if (!IsValid) - { - return; - } - - coreFunctions.EnumerateRemoteSectionsAndModules(handle, callbackSection, callbackModule); - } - public bool EnumerateRemoteSectionsAndModules(out List
sections, out List modules) { if (!IsValid) @@ -586,7 +576,10 @@ public bool EnumerateRemoteSectionsAndModules(out List
sections, out Li return false; } - coreFunctions.EnumerateRemoteSectionsAndModules(handle, out sections, out modules); + sections = new List
(); + modules = new List(); + + coreFunctions.EnumerateRemoteSectionsAndModules(handle, sections.Add, modules.Add); return true; } From f4e6ff5a7660580a4a0031c13faa20021bddbbfa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 16 Apr 2019 23:24:43 +0200 Subject: [PATCH 576/777] Refactored code. --- ReClass.NET/Forms/ProcessInfoForm.cs | 87 ++++++++++++++-------------- ReClass.NET/Memory/Dumper.cs | 64 +++++++------------- ReClass.NET/Memory/SimplePeHeader.cs | 54 +++++++++++++++++ ReClass.NET/ReClass.NET.csproj | 1 + 4 files changed, 117 insertions(+), 89 deletions(-) create mode 100644 ReClass.NET/Memory/SimplePeHeader.cs diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index 18990d3f..4a126fe4 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -14,12 +14,12 @@ namespace ReClassNET.Forms { public partial class ProcessInfoForm : IconForm { - private readonly RemoteProcess process; + private readonly IProcessReader process; /// The context menu of the sections grid view. public ContextMenuStrip GridContextMenu => contextMenuStrip; - public ProcessInfoForm(RemoteProcess process) + public ProcessInfoForm(IProcessReader process) { Contract.Requires(process != null); @@ -61,11 +61,6 @@ protected override void OnFormClosed(FormClosedEventArgs e) private async void ProcessInfoForm_Load(object sender, EventArgs e) { - if (!process.IsValid) - { - return; - } - var sectionsTable = new DataTable(); sectionsTable.Columns.Add("address", typeof(string)); sectionsTable.Columns.Add("size", typeof(string)); @@ -146,11 +141,8 @@ private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArg private void dumpToolStripMenuItem_Click(object sender, EventArgs e) { - bool isModule; - string fileName; - var initialDirectory = string.Empty; - IntPtr address; - int size; + Func createDialogFn; + Action dumpFn; if (GetToolStripSourceControl(sender) == modulesDataGridView) { @@ -160,11 +152,18 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) return; } - isModule = true; - fileName = $"{Path.GetFileNameWithoutExtension(module.Name)}_Dumped{Path.GetExtension(module.Name)}"; - initialDirectory = Path.GetDirectoryName(module.Path); - address = module.Start; - size = module.Size.ToInt32(); + createDialogFn = () => new SaveFileDialog + { + FileName = $"{Path.GetFileNameWithoutExtension(module.Name)}_Dumped{Path.GetExtension(module.Name)}", + InitialDirectory = Path.GetDirectoryName(module.Path) + }; + + dumpFn = (d, s) => + { + d.DumpModule(module, s); + + MessageBox.Show("Module successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); + }; } else { @@ -174,43 +173,41 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) return; } - isModule = false; - fileName = $"Section_{section.Start.ToString("X")}_{section.End.ToString("X")}.dat"; - address = section.Start; - size = section.Size.ToInt32(); + createDialogFn = () => new SaveFileDialog + { + FileName = $"Section_{section.Start.ToString("X")}_{section.End.ToString("X")}.dat" + }; + + dumpFn = (d, s) => + { + d.DumpSection(section, s); + + MessageBox.Show("Section successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); + }; } - using (var sfd = new SaveFileDialog()) + using (var sfd = createDialogFn()) { - sfd.FileName = fileName; sfd.Filter = "All|*.*"; - sfd.InitialDirectory = initialDirectory; - if (sfd.ShowDialog() == DialogResult.OK) + if (sfd.ShowDialog() != DialogResult.OK) { - var dumper = new Dumper(process); + return; + } - try - { - using (var stream = sfd.OpenFile()) - { - if (isModule) - { - dumper.DumpModule(address, size, stream); - } - else - { - dumper.DumpSection(address, size, stream); - } - - MessageBox.Show("Module successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - catch (Exception ex) + var dumper = new Dumper(process); + + try + { + using (var stream = sfd.OpenFile()) { - Program.ShowException(ex); + dumpFn(dumper, stream); } } + catch (Exception ex) + { + Program.ShowException(ex); + } } } @@ -235,7 +232,7 @@ private IntPtr GetSelectedAddress(object sender) } } - private Control GetToolStripSourceControl(object sender) + private static Control GetToolStripSourceControl(object sender) { return ((sender as ToolStripMenuItem)?.GetCurrentParent() as ContextMenuStrip)?.SourceControl; } diff --git a/ReClass.NET/Memory/Dumper.cs b/ReClass.NET/Memory/Dumper.cs index a5cc926a..12d76eb7 100644 --- a/ReClass.NET/Memory/Dumper.cs +++ b/ReClass.NET/Memory/Dumper.cs @@ -6,9 +6,9 @@ namespace ReClassNET.Memory { public class Dumper { - private readonly RemoteProcess process; + private readonly IRemoteMemoryReader process; - public Dumper(RemoteProcess process) + public Dumper(IRemoteMemoryReader process) { Contract.Requires(process != null); Contract.Ensures(this.process != null); @@ -16,11 +16,11 @@ public Dumper(RemoteProcess process) this.process = process; } - /// Dumps a section to the given stream. - /// The begin of the section. - /// The size of the section. + /// Dumps a chunk of memory to the given stream. + /// The begin of the chunk. + /// The size of the chunk. /// The stream to dump to. - public void DumpSection(IntPtr address, int size, Stream stream) + public void DumpRaw(IntPtr address, int size, Stream stream) { Contract.Requires(size >= 0); Contract.Requires(stream != null); @@ -30,54 +30,30 @@ public void DumpSection(IntPtr address, int size, Stream stream) stream.Write(data, 0, data.Length); } - /// Dumps a module to the given stream. The section headers of the pe header get fixed to make a valid pe file. - /// The begin of the module. - /// The size of the module. + /// Dumps a section to the given stream. + /// The section to dump. /// The stream to dump to. - public void DumpModule(IntPtr address, int size, Stream stream) + public void DumpSection(Section section, Stream stream) { - Contract.Requires(size >= 0); + Contract.Requires(section != null); Contract.Requires(stream != null); - var data = process.ReadRemoteMemory(address, size); - - var pe = new SimplePeHeader(data); - - // Fix the section headers. - using (var bw = new BinaryWriter(new MemoryStream(data))) - { - for (var i = 0; i < pe.NumberOfSections; ++i) - { - var offset = pe.SectionOffset(i); - bw.Seek(offset + 16, SeekOrigin.Begin); - bw.Write(BitConverter.ToUInt32(data, offset + 8)); // SizeOfRawData = VirtualSize - bw.Write(BitConverter.ToUInt32(data, offset + 12)); // PointerToRawData = VirtualAddress - } - } - - stream.Write(data, 0, data.Length); + DumpRaw(section.Start, section.Size.ToInt32(), stream); } - private class SimplePeHeader + /// Dumps a module to the given stream. The section headers of the pe header get fixed to build a valid pe file. + /// The module to dump. + /// The stream to dump to. + public void DumpModule(Module module, Stream stream) { - private readonly byte[] data; - - private int e_lfanew => BitConverter.ToInt32(data, 60); - - private int FileHeader => e_lfanew + 4; - - public int NumberOfSections => BitConverter.ToInt16(data, FileHeader + 2); - - private int SizeOfOptionalHeader => BitConverter.ToInt16(data, FileHeader + 16); + Contract.Requires(module != null); + Contract.Requires(stream != null); - private int FirstSectionOffset => e_lfanew + 24 + SizeOfOptionalHeader; + var data = process.ReadRemoteMemory(module.Start, module.Size.ToInt32()); - public int SectionOffset(int index) => FirstSectionOffset + index * 40; + SimplePeHeader.FixSectionHeaders(data); - public SimplePeHeader(byte[] data) - { - this.data = data; - } + stream.Write(data, 0, data.Length); } } } diff --git a/ReClass.NET/Memory/SimplePeHeader.cs b/ReClass.NET/Memory/SimplePeHeader.cs new file mode 100644 index 00000000..e3ffa4b2 --- /dev/null +++ b/ReClass.NET/Memory/SimplePeHeader.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReClassNET.Memory +{ + public class SimplePeHeader + { + private readonly byte[] data; + + private int e_lfanew => BitConverter.ToInt32(data, 60); + + private int FileHeader => e_lfanew + 4; + + public int NumberOfSections => BitConverter.ToInt16(data, FileHeader + 2); + + private int SizeOfOptionalHeader => BitConverter.ToInt16(data, FileHeader + 16); + + private int FirstSectionOffset => e_lfanew + 24 + SizeOfOptionalHeader; + + public int SectionOffset(int index) => FirstSectionOffset + index * 40; + + private SimplePeHeader(byte[] data) + { + this.data = data; + } + + /// + /// Rewrites the section headers to build a valid pe file. + /// + /// The memory of a dumped module. + public static void FixSectionHeaders(byte[] data) + { + var pe = new SimplePeHeader(data); + + using (var ms = new MemoryStream(data)) + { + using (var bw = new BinaryWriter(ms)) + { + for (var i = 0; i < pe.NumberOfSections; ++i) + { + var offset = pe.SectionOffset(i); + bw.Seek(offset + 16, SeekOrigin.Begin); + bw.Write(BitConverter.ToUInt32(data, offset + 8)); // SizeOfRawData = VirtualSize + bw.Write(BitConverter.ToUInt32(data, offset + 12)); // PointerToRawData = VirtualAddress + } + } + } + } + } +} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index cb62f939..093f428d 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -265,6 +265,7 @@ + From 64bd7030087d74fa468ba3069ec6c53273e59725 Mon Sep 17 00:00:00 2001 From: c0dycode Date: Sun, 21 Apr 2019 02:13:11 +0200 Subject: [PATCH 577/777] Switched Enum value and name around when reading saved ones so they match the coloumn text --- ReClass.NET/Forms/EnumEditorForm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index e4b07bcd..573ea1b9 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -26,7 +26,7 @@ public EnumEditorForm(EnumDescription @enum) foreach (var kv in @enum.Values) { - enumDataGridView.Rows.Add(kv.Key, kv.Value); + enumDataGridView.Rows.Add(kv.Value, kv.Key); } } From 90ae192991e7e3ca1a8dd230e65364fc637b5970 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 23 Apr 2019 11:22:24 +0200 Subject: [PATCH 578/777] Added tests for CircularBuffer and GrowingList. --- ReClass.NET/Util/GrowingList.cs | 4 + ReClass.NET_Tests/ReClass.NET_Tests.csproj | 3 + ReClass.NET_Tests/Util/CircularBufferTest.cs | 86 ++++++++++++++++++ ReClass.NET_Tests/Util/GrowingListTest.cs | 91 ++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 ReClass.NET_Tests/Util/CircularBufferTest.cs create mode 100644 ReClass.NET_Tests/Util/GrowingListTest.cs diff --git a/ReClass.NET/Util/GrowingList.cs b/ReClass.NET/Util/GrowingList.cs index 49bd66b5..2c08e9f4 100644 --- a/ReClass.NET/Util/GrowingList.cs +++ b/ReClass.NET/Util/GrowingList.cs @@ -9,6 +9,8 @@ public class GrowingList public T DefaultValue { get; set; } + public int Count => list.Count; + public GrowingList() { Contract.Ensures(list != null); @@ -24,6 +26,8 @@ public GrowingList(T defaultValue) private void GrowToSize(int size) { + list.Capacity = size; + for (var i = list.Count; i <= size; ++i) { list.Add(DefaultValue); diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index ebc1d829..b5256a8f 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -15,6 +15,7 @@ UnitTest + latest true @@ -65,6 +66,8 @@ + + diff --git a/ReClass.NET_Tests/Util/CircularBufferTest.cs b/ReClass.NET_Tests/Util/CircularBufferTest.cs new file mode 100644 index 00000000..c82f4334 --- /dev/null +++ b/ReClass.NET_Tests/Util/CircularBufferTest.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class CircularBufferTest + { + [Fact] + public void CheckInitialCapacityCount() + { + const int Capacity = 5; + + var cb = new CircularBuffer(Capacity); + + Check.That(cb.Capacity).IsEqualTo(Capacity); + Check.That(cb.Count).IsEqualTo(0); + } + + [Fact] + public void DequeueFromEmptyBufferThrows() + { + var cb = new CircularBuffer(1); + + Check.ThatCode(() => cb.Dequeue()).Throws(); + } + + [Theory] + [InlineData(1)] + [InlineData(2)] + [InlineData(10)] + [InlineData(100)] + public void CheckEnqueueAndDeque(int value) + { + var cb = new CircularBuffer(1); + + var overwrittenValue = cb.Enqueue(value); + + Check.That(overwrittenValue).IsEqualTo(default); + + Check.That(cb.Dequeue()).IsEqualTo(value); + } + + [Theory] + [InlineData(1)] + [InlineData(1, 2)] + [InlineData(1, 2, 3)] + [InlineData(1, 2, 3, 4)] + [InlineData(1, 2, 3, 4, 5)] + public void CheckMultipleEnqueueAndDeque(params int[] values) + { + var cb = new CircularBuffer(values.Length); + + foreach (var value in values) + { + cb.Enqueue(value); + } + + foreach (var value in values.Reverse()) + { + Check.That(cb.Dequeue()).IsEqualTo(value); + } + } + + [Theory] + [InlineData(1, 2)] + [InlineData(1, 2, 3)] + [InlineData(1, 2, 3, 4)] + [InlineData(1, 2, 3, 4, 5)] + public void CheckOverflow(params int[] values) + { + var cb = new CircularBuffer(1); + + cb.Enqueue(values[0]); + + for (var i = 1; i < values.Length; ++i) + { + Check.That(cb.Enqueue(values[i])).IsEqualTo(values[i - 1]); + } + + Check.That(cb.Dequeue()).IsEqualTo(values[values.Length - 1]); + } + } +} diff --git a/ReClass.NET_Tests/Util/GrowingListTest.cs b/ReClass.NET_Tests/Util/GrowingListTest.cs new file mode 100644 index 00000000..66af03bf --- /dev/null +++ b/ReClass.NET_Tests/Util/GrowingListTest.cs @@ -0,0 +1,91 @@ +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class GrowingListTest + { + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(10)] + [InlineData(100)] + public void CheckSetCount(int index) + { + var gl = new GrowingList + { + [index] = default + }; + + Check.That(gl.Count).IsEqualTo(index + 1); + } + + [Theory] + [InlineData(0, 1, 2)] + [InlineData(1, 2, 3)] + [InlineData(2, 10, 11)] + [InlineData(10, 8, 11)] + [InlineData(100, 200, 201)] + [InlineData(0, 0, 1)] + [InlineData(10, 1, 11)] + [InlineData(2, 1, 3)] + public void CheckMultipleSetCount(int index1, int index2, int expected) + { + var gl = new GrowingList + { + [index1] = default, + [index2] = default + }; + + Check.That(gl.Count).IsEqualTo(expected); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(10)] + [InlineData(100)] + public void CheckGetCount(int index) + { + var gl = new GrowingList(); + + var _ = gl[index]; + + Check.That(gl.Count).IsEqualTo(index + 1); + } + + [Theory] + [InlineData(0, 1, 2)] + [InlineData(1, 2, 3)] + [InlineData(2, 10, 11)] + [InlineData(10, 8, 11)] + [InlineData(100, 200, 201)] + [InlineData(0, 0, 1)] + [InlineData(10, 1, 11)] + [InlineData(2, 1, 3)] + public void CheckMultipleGetCount(int index1, int index2, int expected) + { + var gl = new GrowingList(); + + var _ = gl[index1]; + _ = gl[index2]; + + Check.That(gl.Count).IsEqualTo(expected); + } + + [Theory] + [InlineData(1, 0)] + [InlineData(1, 10)] + [InlineData(-1, 0)] + [InlineData(-1, 20)] + public void CheckDefaultValue(int value, int index) + { + var gl = new GrowingList(value); + + Check.That(gl[index]).IsEqualTo(value); + } + } +} From 5bfdc2e80d5ee4e0b41514500f4966e65b121462 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 23 Apr 2019 14:23:25 +0200 Subject: [PATCH 579/777] Added tests for CommandLineArgs and DirectedGraph. --- ReClass.NET/Util/CommandLineArgs.cs | 5 - ReClass.NET/Util/DirectedGraph.cs | 8 +- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 2 + ReClass.NET_Tests/Util/CommandLineArgsTest.cs | 112 ++++++++++ ReClass.NET_Tests/Util/DirectedGraphTest.cs | 195 ++++++++++++++++++ 5 files changed, 313 insertions(+), 9 deletions(-) create mode 100644 ReClass.NET_Tests/Util/CommandLineArgsTest.cs create mode 100644 ReClass.NET_Tests/Util/DirectedGraphTest.cs diff --git a/ReClass.NET/Util/CommandLineArgs.cs b/ReClass.NET/Util/CommandLineArgs.cs index 2a22fc5a..ed504a92 100644 --- a/ReClass.NET/Util/CommandLineArgs.cs +++ b/ReClass.NET/Util/CommandLineArgs.cs @@ -60,11 +60,6 @@ public string this[string strKey] { get { - if (string.IsNullOrEmpty(strKey)) - { - return FileName; - } - if (parms.TryGetValue(strKey.ToLower(), out var strValue)) { return strValue; diff --git a/ReClass.NET/Util/DirectedGraph.cs b/ReClass.NET/Util/DirectedGraph.cs index 9e07ab9a..51968b92 100644 --- a/ReClass.NET/Util/DirectedGraph.cs +++ b/ReClass.NET/Util/DirectedGraph.cs @@ -47,7 +47,7 @@ public void AddVertices(IEnumerable vertices) ///
/// /// - public bool HasVertex(T vertex) + public bool ContainsVertex(T vertex) { return adjacencyList.ContainsKey(vertex); } @@ -60,7 +60,7 @@ public bool HasVertex(T vertex) /// True if a new edge was added, false otherwise. public bool AddEdge(T from, T to) { - if (!HasVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) + if (!ContainsVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) { throw new ArgumentException("Vertex does not exist in graph."); } @@ -74,9 +74,9 @@ public bool AddEdge(T from, T to) /// /// /// - public bool HasEdge(T from, T to) + public bool ContainsEdge(T from, T to) { - if (!HasVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) + if (!ContainsVertex(to) || !adjacencyList.TryGetValue(from, out var edges)) { throw new ArgumentException("Vertex does not exist in graph."); } diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index b5256a8f..2db93137 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -67,6 +67,8 @@ + + diff --git a/ReClass.NET_Tests/Util/CommandLineArgsTest.cs b/ReClass.NET_Tests/Util/CommandLineArgsTest.cs new file mode 100644 index 00000000..7ef2ff60 --- /dev/null +++ b/ReClass.NET_Tests/Util/CommandLineArgsTest.cs @@ -0,0 +1,112 @@ +using System.Collections.Generic; +using System.Linq; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class CommandLineArgsTest + { + [Fact] + public void TestNullArgs() + { + var sut = new CommandLineArgs(null); + + Check.That(sut.FileNames).IsEmpty(); + Check.That(sut.Parameters).IsEmpty(); + } + + [Fact] + public void TestEmptyArgs() + { + var sut = new CommandLineArgs(new string[0]); + + Check.That(sut.FileNames).IsEmpty(); + Check.That(sut.Parameters).IsEmpty(); + } + + [Fact] + public void TestEmptyStringArgs() + { + var sut = new CommandLineArgs(new[] { string.Empty, string.Empty }); + + Check.That(sut.FileNames).IsEmpty(); + Check.That(sut.Parameters).IsEmpty(); + } + + [Theory] + [InlineData("test.test")] + [InlineData("test.test", "test2.test")] + [InlineData("C:/test.test", "test2.test")] + [InlineData("test.test", "C:/test2.test")] + [InlineData("C:/test.test", "C:/test2.test")] + [InlineData(@"C:\test.test", "test2.test")] + [InlineData(@"test.test", @"C:\test2.test")] + [InlineData(@"C:\test.test", @"C:\test2.test")] + public void TestFilenames(params string[] args) + { + var sut = new CommandLineArgs(args); + + Check.That(sut.FileName).IsEqualTo(args[0]); + Check.That(sut.FileNames).HasSize(args.Length); + Check.That(sut.FileNames).IsEquivalentTo(args); + + Check.That(sut.Parameters).IsEmpty(); + } + + [Theory] + [InlineData("-p")] + [InlineData("-p=")] + [InlineData("-p:")] + [InlineData("-p=123")] + [InlineData("-p:123")] + [InlineData("--p")] + [InlineData("--p=")] + [InlineData("--p:")] + [InlineData("--p=123")] + [InlineData("--p:123")] + public void TestParameterFormats(string arg) + { + var sut = new CommandLineArgs(new [] { arg }); + + Check.That(sut.Parameters).HasSize(1); + Check.That(sut.Parameters.First().Key).IsEqualTo("p"); + + Check.That(sut.FileNames).IsEmpty(); + } + + [Theory] + [InlineData("-p", "")] + [InlineData("-p=", "")] + [InlineData("-p:", "")] + [InlineData("-p=123", "123")] + [InlineData("-p:123", "123")] + public void TestParameterValues(string arg, string expectedValue) + { + var sut = new CommandLineArgs(new[] { arg }); + + Check.That(sut.Parameters.First().Value).IsEqualTo(expectedValue); + } + + public static IEnumerable GetTestFilenamesAndParametersData() => new List + { + new object[] { new[] { "test.test" }, 1, 0 }, + new object[] { new[] { "-p" }, 0, 1 }, + new object[] { new[] { "test.test", "-p" }, 1, 1 }, + new object[] { new[] { "test.test", "-p", "test2.test" }, 2, 1 }, + new object[] { new[] { "test.test", "-p", "-p2=123", "test2.test" }, 2, 2 }, + new object[] { new[] { "-p3:4", "test.test", "-p", "-p2=123", "test2.test" }, 2, 3 } + }; + + [Theory] + [MemberData(nameof(GetTestFilenamesAndParametersData))] + public void TestFilenamesAndParameters(string[] args, int expectedFilenames, int expectedParameters) + { + var sut = new CommandLineArgs(args); + + Check.That(sut.FileNames).HasSize(expectedFilenames); + Check.That(sut.Parameters).HasSize(expectedParameters); + } + } +} diff --git a/ReClass.NET_Tests/Util/DirectedGraphTest.cs b/ReClass.NET_Tests/Util/DirectedGraphTest.cs new file mode 100644 index 00000000..624ae7e4 --- /dev/null +++ b/ReClass.NET_Tests/Util/DirectedGraphTest.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class DirectedGraphTest + { + [Fact] + public void TestAddContainsVertex() + { + const int Vertex = 0; + + var sut = new DirectedGraph(); + + Check.That(sut.AddVertex(Vertex)).IsTrue(); + + Check.That(sut.ContainsVertex(Vertex)).IsTrue(); + } + + [Fact] + public void TestAddExistingVertex() + { + const int Vertex = 0; + + var sut = new DirectedGraph(); + + sut.AddVertex(Vertex); + + Check.That(sut.AddVertex(Vertex)).IsFalse(); + } + + [Fact] + public void TestContainsWithEmptyGraph() + { + const int Vertex = 0; + + var sut = new DirectedGraph(); + + Check.That(sut.ContainsVertex(Vertex)).IsFalse(); + } + + [Fact] + public void TestAddContainsMultipleVertices() + { + var vertices = new[] { 0, 1, 2, 3 }; + + var sut = new DirectedGraph(); + + sut.AddVertices(vertices); + + foreach (var vertex in vertices) + { + Check.That(sut.ContainsVertex(vertex)).IsTrue(); + } + + Check.That(sut.Vertices).IsEquivalentTo(vertices); + } + + [Fact] + public void TestAddEdgeToNonExistingVertex() + { + const int Vertex1 = 0; + const int Vertex2 = 1; + + var sut = new DirectedGraph(); + + Check.ThatCode(() => sut.AddEdge(Vertex1, Vertex2)).Throws(); + + sut.AddVertex(Vertex1); + + Check.ThatCode(() => sut.AddEdge(Vertex1, Vertex2)).Throws(); + Check.ThatCode(() => sut.AddEdge(Vertex2, Vertex1)).Throws(); + } + + [Fact] + public void TestContainsEdgeToNonExistingVertex() + { + const int Vertex1 = 0; + const int Vertex2 = 1; + + var sut = new DirectedGraph(); + + Check.ThatCode(() => sut.ContainsEdge(Vertex1, Vertex2)).Throws(); + + sut.AddVertex(Vertex1); + + Check.ThatCode(() => sut.ContainsEdge(Vertex1, Vertex2)).Throws(); + Check.ThatCode(() => sut.ContainsEdge(Vertex2, Vertex1)).Throws(); + } + + [Fact] + public void TestAddContainsEdge() + { + const int Vertex1 = 0; + const int Vertex2 = 1; + + var sut = new DirectedGraph(); + + sut.AddVertex(Vertex1); + sut.AddVertex(Vertex2); + + Check.That(sut.ContainsEdge(Vertex1, Vertex2)).IsFalse(); + + Check.That(sut.AddEdge(Vertex1, Vertex2)).IsTrue(); + + Check.That(sut.ContainsEdge(Vertex1, Vertex2)).IsTrue(); + } + + [Fact] + public void TestAddExistingEdge() + { + const int Vertex1 = 0; + const int Vertex2 = 1; + + var sut = new DirectedGraph(); + + sut.AddVertex(Vertex1); + sut.AddVertex(Vertex2); + sut.AddEdge(Vertex1, Vertex2); + + Check.That(sut.AddEdge(Vertex1, Vertex2)).IsFalse(); + } + + [Fact] + public void TestGetNeighboursOfNonExistingVertex() + { + const int Vertex = 0; + + var sut = new DirectedGraph(); + + Check.ThatCode(() => sut.GetNeighbours(Vertex)).Throws(); + } + + public static IEnumerable GetTestGetNeighboursData() => new List + { + new object[] { new[] { 1 }, new[] { new[] { 1, 1 } }, new[] { 1 } }, + new object[] { new[] { 1, 2 }, new[] { new[] { 2, 1 } }, new int[0] }, + new object[] { new[] { 1, 2 }, new[] { new[] { 1, 2 } }, new[] { 2 } }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 2, 1 }, new[] { 2, 3 } }, new int[0] }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 2, 3 } }, new[] { 2 } }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 1, 3 } }, new[] { 2, 3 } }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 1 }, new[] { 1, 2 }, new[] { 1, 3 } }, new[] { 1, 2, 3 } } + }; + + [Theory] + [MemberData(nameof(GetTestGetNeighboursData))] + public void TestGetNeighbours(int[] vertices, int[][] edges, int[] neighbours) + { + var sut = new DirectedGraph(); + + sut.AddVertices(vertices); + + foreach (var edge in edges) + { + sut.AddEdge(edge[0], edge[1]); + } + + Check.That(sut.GetNeighbours(vertices[0])).IsEquivalentTo(neighbours); + } + + public static IEnumerable GetTestContainsCycleData() => new List + { + new object[] { new[] { 1 }, new[] { new[] { 1, 1 } }, true }, + new object[] { new[] { 1, 2 }, new[] { new[] { 1, 2 } }, false }, + new object[] { new[] { 1, 2 }, new[] { new[] { 1, 2 }, new[] { 2, 1 } }, true }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 2, 3 } }, false }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 1, 3 }, new[] { 2, 3 } }, false }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 2, 3 }, new[] { 3, 1 } }, true }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 2, 3 }, new[] { 3, 2 } }, true }, + new object[] { new[] { 1, 2, 3 }, new[] { new[] { 1, 2 }, new[] { 2, 1 }, new[] { 2, 3 }, new[] { 3, 2 } }, true } + }; + + [Theory] + [MemberData(nameof(GetTestContainsCycleData))] + public void TestContainsCycle(int[] vertices, int[][] edges, bool containsCycle) + { + var sut = new DirectedGraph(); + + sut.AddVertices(vertices); + + foreach (var edge in edges) + { + sut.AddEdge(edge[0], edge[1]); + } + + Check.That(sut.ContainsCycle()).IsEqualTo(containsCycle); + } + } +} From f024d1a498db6b6d1e565a2af0a7993183c077a4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 09:36:37 +0200 Subject: [PATCH 580/777] Extracted methods to individual classes. --- ReClass.NET/Forms/ScannerForm.cs | 4 +- ReClass.NET/MemoryScanner/MemoryRecord.cs | 4 +- ReClass.NET/Nodes/ClassNode.cs | 11 ++-- ReClass.NET/ReClass.NET.csproj | 2 + ReClass.NET/Util/HexadecimalFormatter.cs | 46 ++++++++++++++++ ReClass.NET/Util/NumberFormat.cs | 28 ++++++++++ ReClass.NET/Util/Util.cs | 66 ----------------------- 7 files changed, 88 insertions(+), 73 deletions(-) create mode 100644 ReClass.NET/Util/HexadecimalFormatter.cs create mode 100644 ReClass.NET/Util/NumberFormat.cs diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index cfbefa55..47f602a5 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -764,9 +764,9 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) return digits; } - var nf1 = Utils.GuessNumberFormat(dualValueBox.Value1); + var nf1 = NumberFormat.GuessNumberFormat(dualValueBox.Value1); if (!double.TryParse(dualValueBox.Value1, NumberStyles.Float, nf1, out var value1)) throw new InvalidInputException(dualValueBox.Value1); - var nf2 = Utils.GuessNumberFormat(dualValueBox.Value2); + var nf2 = NumberFormat.GuessNumberFormat(dualValueBox.Value2); if (!double.TryParse(dualValueBox.Value2, NumberStyles.Float, nf2, out var value2) && checkBothInputFields) throw new InvalidInputException(dualValueBox.Value2); var significantDigits = Math.Max( diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index aefc35c7..a9b3968f 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -253,7 +253,7 @@ public void SetValue(RemoteProcess process, string input, bool isHex) } else if (ValueType == ScanValueType.Float || ValueType == ScanValueType.Double) { - var nf = Utils.GuessNumberFormat(input); + var nf = NumberFormat.GuessNumberFormat(input); double.TryParse(input, NumberStyles.Float, nf, out var value); switch (ValueType) @@ -281,7 +281,7 @@ public void SetValue(RemoteProcess process, string input, bool isHex) private static string FormatValue(long value, bool showAsHex) => showAsHex ? value.ToString("X") : value.ToString(); private static string FormatValue(float value) => value.ToString("0.0000"); private static string FormatValue(double value) => value.ToString("0.0000"); - private static string FormatValue(byte[] value) => Utils.ByteArrayToHexString(value); + private static string FormatValue(byte[] value) => HexadecimalFormatter.ToString(value); private static string FormatValue(string value) => value; } } diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 3fd6543b..5e6b0cbe 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -133,12 +133,17 @@ public override Size Draw(ViewInfo view, int x, int y) nv.Level++; foreach (var node in Nodes) { + Size AggregateNodeSizes(Size baseSize, Size newSize) + { + return new Size(Math.Max(baseSize.Width, newSize.Width), baseSize.Height + newSize.Height); + } + // Draw the node if it is in the visible area. if (view.ClientArea.Contains(tx, y)) { var innerSize = node.Draw(nv, tx, y); - size = Utils.AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); + size = AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); y += innerSize.Height; } @@ -153,14 +158,14 @@ public override Size Draw(ViewInfo view, int x, int y) // then draw the node... var innerSize = node.Draw(nv, tx, y); - size = Utils.AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); + size = AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); y += innerSize.Height; } else { // or skip drawing and just use the calculated height. - size = Utils.AggregateNodeSizes(size, new Size(0, calculatedHeight)); + size = AggregateNodeSizes(size, new Size(0, calculatedHeight)); y += calculatedHeight; } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 093f428d..ae45a20f 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -505,7 +505,9 @@ + + diff --git a/ReClass.NET/Util/HexadecimalFormatter.cs b/ReClass.NET/Util/HexadecimalFormatter.cs new file mode 100644 index 00000000..6e4fa50c --- /dev/null +++ b/ReClass.NET/Util/HexadecimalFormatter.cs @@ -0,0 +1,46 @@ +using System.Diagnostics.Contracts; + +namespace ReClassNET.Util +{ + public static class HexadecimalFormatter + { + private static readonly uint[] lookup = CreateHexLookup(); + + private static uint[] CreateHexLookup() + { + var result = new uint[256]; + for (var i = 0; i < 256; i++) + { + var s = i.ToString("X2"); + result[i] = (uint)s[0] + ((uint)s[1] << 16); + } + return result; + } + + public static string ToString(byte[] data) + { + Contract.Requires(data != null); + + if (data.Length == 0) + { + return string.Empty; + } + + var result = new char[data.Length * 2 + data.Length - 1]; + + var val = lookup[data[0]]; + result[0] = (char)val; + result[1] = (char)(val >> 16); + + for (var i = 1; i < data.Length; i++) + { + val = lookup[data[i]]; + result[3 * i - 1] = ' '; + result[3 * i] = (char)val; + result[3 * i + 1] = (char)(val >> 16); + } + + return new string(result); + } + } +} diff --git a/ReClass.NET/Util/NumberFormat.cs b/ReClass.NET/Util/NumberFormat.cs new file mode 100644 index 00000000..df374619 --- /dev/null +++ b/ReClass.NET/Util/NumberFormat.cs @@ -0,0 +1,28 @@ +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace ReClassNET.Util +{ + public class NumberFormat + { + public static NumberFormatInfo GuessNumberFormat(string input) + { + Contract.Requires(input != null); + Contract.Ensures(Contract.Result() != null); + + if (input.Contains(",") && !input.Contains(".")) + { + return new NumberFormatInfo + { + NumberDecimalSeparator = ",", + NumberGroupSeparator = "." + }; + } + return new NumberFormatInfo + { + NumberDecimalSeparator = ".", + NumberGroupSeparator = "," + }; + } + } +} diff --git a/ReClass.NET/Util/Util.cs b/ReClass.NET/Util/Util.cs index b756199f..850f23ad 100644 --- a/ReClass.NET/Util/Util.cs +++ b/ReClass.NET/Util/Util.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; -using System.Drawing; -using System.Globalization; namespace ReClassNET.Util { @@ -52,69 +50,5 @@ public static void Swap(ref T lhs, ref T rhs) lhs = rhs; rhs = temp; } - - public static Size AggregateNodeSizes(Size baseSize, Size newSize) - { - return new Size(Math.Max(baseSize.Width, newSize.Width), baseSize.Height + newSize.Height); - } - - public static NumberFormatInfo GuessNumberFormat(string input) - { - Contract.Requires(input != null); - Contract.Ensures(Contract.Result() != null); - - if (input.Contains(",") && !input.Contains(".")) - { - return new NumberFormatInfo - { - NumberDecimalSeparator = ",", - NumberGroupSeparator = "." - }; - } - return new NumberFormatInfo - { - NumberDecimalSeparator = ".", - NumberGroupSeparator = "," - }; - } - - private static readonly uint[] hexLookup = CreateHexLookup(); - - private static uint[] CreateHexLookup() - { - var result = new uint[256]; - for (var i = 0; i < 256; i++) - { - var s = i.ToString("X2"); - result[i] = (uint)s[0] + ((uint)s[1] << 16); - } - return result; - } - - public static string ByteArrayToHexString(byte[] data) - { - Contract.Requires(data != null); - - if (data.Length == 0) - { - return string.Empty; - } - - var lookup = hexLookup; - var result = new char[data.Length * 2 + data.Length - 1]; - - var val = lookup[data[0]]; - result[0] = (char)val; - result[1] = (char)(val >> 16); - - for (var i = 1; i < data.Length; i++) - { - val = lookup[data[i]]; - result[3 * i - 1] = ' '; - result[3 * i] = (char)val; - result[3 * i + 1] = (char)(val >> 16); - } - return new string(result); - } } } From ec18bd675b7a7603bcb5c6af86f30146e1ece11e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 14:02:16 +0200 Subject: [PATCH 581/777] Added tests for CustomDataMap, HexadecimalFormatter, PathUtil and XElementSerializer. --- ReClass.NET/Util/CustomDataMap.cs | 82 ++++----- ReClass.NET/Util/NumberFormat.cs | 8 +- ReClass.NET/Util/PathUtil.cs | 2 +- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 7 + ReClass.NET_Tests/Util/CustomDataMapTest.cs | 158 ++++++++++++++++++ .../Util/HexadecimalFormatterTest.cs | 24 +++ ReClass.NET_Tests/Util/NumberFormatTest.cs | 22 +++ ReClass.NET_Tests/Util/PathUtilTest.cs | 31 ++++ .../Util/XElementSerializerTest.cs | 101 +++++++++++ 9 files changed, 393 insertions(+), 42 deletions(-) create mode 100644 ReClass.NET_Tests/Util/CustomDataMapTest.cs create mode 100644 ReClass.NET_Tests/Util/HexadecimalFormatterTest.cs create mode 100644 ReClass.NET_Tests/Util/NumberFormatTest.cs create mode 100644 ReClass.NET_Tests/Util/PathUtilTest.cs create mode 100644 ReClass.NET_Tests/Util/XElementSerializerTest.cs diff --git a/ReClass.NET/Util/CustomDataMap.cs b/ReClass.NET/Util/CustomDataMap.cs index 224fa39d..6a077486 100644 --- a/ReClass.NET/Util/CustomDataMap.cs +++ b/ReClass.NET/Util/CustomDataMap.cs @@ -47,36 +47,30 @@ public string this[string key] } /// - /// Sets a configuration item. + /// Removes an item. /// /// The key of the item. - /// - /// The value of the item. - /// If the value is null the item gets removed. - /// + public void RemoveValue(string key) + { + ValidateKey(key); + + data.Remove(key); + } + + /// + /// Sets the string value of an item. + /// + /// The key of the item. + /// The value of the item. public void SetString(string key, string value) { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - if (key.Length == 0) - { - throw new ArgumentException(); - } + ValidateKey(key); - if (value == null) - { - data.Remove(key); - } - else - { - data[key] = value; - } + data[key] = value; } /// - /// Sets a configuration item. + /// Sets the boolean value of an item. /// /// The key of the item. /// The value of the item. @@ -86,7 +80,7 @@ public void SetBool(string key, bool value) } /// - /// Sets a configuration item. + /// Sets the long value of an item. /// /// The key of the item. /// The value of the item. @@ -96,7 +90,7 @@ public void SetLong(string key, long value) } /// - /// Sets a configuration item. + /// Sets the ulong value of an item. /// /// The key of the item. /// The value of the item. @@ -105,13 +99,18 @@ public void SetULong(string key, ulong value) SetString(key, value.ToString(NumberFormatInfo.InvariantInfo)); } + /// + /// Sets the XElement value of an item. + /// + /// The key of the item. + /// The value of the item. public void SetXElement(string key, XElement value) { - SetString(key, value.ToString()); + SetString(key, value?.ToString()); } /// - /// Gets the value of the config item. + /// Gets the string value of the item. /// /// The key of the item. /// The value of the config item or null if the key does not exists. @@ -121,21 +120,14 @@ public string GetString(string key) } /// - /// Gets the value of the config item. + /// Gets the string value of the item. /// /// The key of the item. /// The default value if the key does not exists. /// The value of the config item or if the key does not exists. public string GetString(string key, string def) { - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - if (key.Length == 0) - { - throw new ArgumentException(); - } + ValidateKey(key); if (data.TryGetValue(key, out var value)) { @@ -146,7 +138,7 @@ public string GetString(string key, string def) } /// - /// Gets the value of the config item. + /// Gets the boolean value of the item. /// /// The key of the item. /// The default value if the key does not exists. @@ -163,7 +155,7 @@ public bool GetBool(string key, bool def) } /// - /// Gets the value of the config item. + /// Gets the long value of the item. /// /// The key of the item. /// The default value if the key does not exists. @@ -185,7 +177,7 @@ public long GetLong(string key, long def) } /// - /// Gets the value of the config item. + /// Gets the ulong value of the item. /// /// The key of the item. /// The default value if the key does not exists. @@ -207,7 +199,7 @@ public ulong GetULong(string key, ulong def) } /// - /// Gets the value of the config item. + /// Gets the XElement value of the item. /// /// The key of the item. /// The default value if the key does not exists. @@ -222,5 +214,17 @@ public XElement GetXElement(string key, XElement def) return XElement.Parse(str); } + + /// + /// Validates the given key. + /// + /// The key of an item. + private static void ValidateKey(string key) + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + } } } diff --git a/ReClass.NET/Util/NumberFormat.cs b/ReClass.NET/Util/NumberFormat.cs index df374619..6c4e91be 100644 --- a/ReClass.NET/Util/NumberFormat.cs +++ b/ReClass.NET/Util/NumberFormat.cs @@ -3,14 +3,17 @@ namespace ReClassNET.Util { - public class NumberFormat + public static class NumberFormat { public static NumberFormatInfo GuessNumberFormat(string input) { Contract.Requires(input != null); Contract.Ensures(Contract.Result() != null); - if (input.Contains(",") && !input.Contains(".")) + var commaIndex = input.IndexOf(','); + var dotIndex = input.IndexOf('.'); + + if (commaIndex > dotIndex) { return new NumberFormatInfo { @@ -18,6 +21,7 @@ public static NumberFormatInfo GuessNumberFormat(string input) NumberGroupSeparator = "." }; } + return new NumberFormatInfo { NumberDecimalSeparator = ".", diff --git a/ReClass.NET/Util/PathUtil.cs b/ReClass.NET/Util/PathUtil.cs index 977da60d..f4170bf5 100644 --- a/ReClass.NET/Util/PathUtil.cs +++ b/ReClass.NET/Util/PathUtil.cs @@ -89,7 +89,7 @@ public static string FileUrlToPath(string url) if (url.StartsWith("file:///", StringComparison.OrdinalIgnoreCase)) { - url = url.Substring(8, url.Length - 8); + url = url.Substring(8); } url = url.Replace('/', Path.DirectorySeparatorChar); diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 2db93137..89129de9 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -58,6 +58,8 @@ + + @@ -68,8 +70,13 @@ + + + + + diff --git a/ReClass.NET_Tests/Util/CustomDataMapTest.cs b/ReClass.NET_Tests/Util/CustomDataMapTest.cs new file mode 100644 index 00000000..74315728 --- /dev/null +++ b/ReClass.NET_Tests/Util/CustomDataMapTest.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class CustomDataMapTest + { + [Fact] + public void TestNullKeyNotAllowed() + { + var sut = new CustomDataMap(); + + Check.ThatCode(() => sut.SetString(null, default)).Throws(); + Check.ThatCode(() => sut.SetBool(null, default)).Throws(); + Check.ThatCode(() => sut.SetLong(null, default)).Throws(); + Check.ThatCode(() => sut.SetULong(null, default)).Throws(); + Check.ThatCode(() => sut.SetXElement(null, default)).Throws(); + Check.ThatCode(() => sut.GetString(null)).Throws(); + Check.ThatCode(() => sut.GetBool(null, default)).Throws(); + Check.ThatCode(() => sut.GetLong(null, default)).Throws(); + Check.ThatCode(() => sut.GetULong(null, default)).Throws(); + Check.ThatCode(() => sut.GetXElement(null, default)).Throws(); + } + + [Theory] + [InlineData("key", "")] + [InlineData("key", "value")] + public void TestSetGetString(string key, string value) + { + var sut = new CustomDataMap(); + + sut.SetString(key, value); + + Check.That(sut.GetString(key)).IsEqualTo(value); + } + + [Theory] + [InlineData("key", "")] + [InlineData("key", "value")] + public void TestIndexString(string key, string value) + { + var sut = new CustomDataMap(); + + sut.SetString(key, value); + + Check.That(sut[key]).IsEqualTo(value); + } + + [Fact] + public void TestItemEnumeration() + { + var data = new Dictionary + { + { "key1", "value1" }, + { "key2", "value2" }, + { "key3", "value3" } + }; + + var sut = new CustomDataMap(); + + foreach (var kv in data) + { + sut.SetString(kv.Key, kv.Value); + } + + Check.That(sut).IsEquivalentTo(data); + } + + [Fact] + public void TestRemoveItem() + { + const string KeyToRemove = "key2"; + + var data = new Dictionary + { + { "key1", "value1" }, + { KeyToRemove, "value2" }, + { "key3", "value3" } + }; + + var sut = new CustomDataMap(); + + foreach (var kv in data) + { + sut.SetString(kv.Key, kv.Value); + } + + sut.RemoveValue(KeyToRemove); + + Check.That(sut).IsEquivalentTo(data.Where(kv => kv.Key != KeyToRemove)); + } + + [Theory] + [InlineData("key", true)] + [InlineData("key", false)] + public void TestSetGetBool(string key, bool value) + { + var sut = new CustomDataMap(); + + sut.SetBool(key, value); + + Check.That(sut.GetBool(key, !value)).IsEqualTo(value); + } + + [Theory] + [InlineData("key", -1)] + [InlineData("key", 0)] + [InlineData("key", 1)] + [InlineData("key", long.MaxValue)] + [InlineData("key", long.MinValue)] + public void TestSetGetLong(string key, long value) + { + var sut = new CustomDataMap(); + + sut.SetLong(key, value); + + Check.That(sut.GetLong(key, 0)).IsEqualTo(value); + } + + [Theory] + [InlineData("key", 0)] + [InlineData("key", 1)] + [InlineData("key", ulong.MaxValue)] + [InlineData("key", ulong.MinValue)] + public void TestSetGetULong(string key, ulong value) + { + var sut = new CustomDataMap(); + + sut.SetULong(key, value); + + Check.That(sut.GetULong(key, 0)).IsEqualTo(value); + } + + public static IEnumerable GetTestSetGetXElementData() => new List + { + new object[] { "key", null }, + new object[] { "key", new XElement("name") }, + new object[] { "key", new XElement("name", new XAttribute("attr", "test")) }, + new object[] { "key", new XElement("name", new XElement("value", "test")) } + }; + + [Theory] + [MemberData(nameof(GetTestSetGetXElementData))] + public void TestSetGetXElement(string key, XElement value) + { + var sut = new CustomDataMap(); + + sut.SetXElement(key, value); + + Check.That(XNode.DeepEquals(sut.GetXElement(key, null), value)).IsTrue(); + } + } +} diff --git a/ReClass.NET_Tests/Util/HexadecimalFormatterTest.cs b/ReClass.NET_Tests/Util/HexadecimalFormatterTest.cs new file mode 100644 index 00000000..abc2da21 --- /dev/null +++ b/ReClass.NET_Tests/Util/HexadecimalFormatterTest.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class HexadecimalFormatterTest + { + public static IEnumerable GetTestData() => new List + { + new object[] { new byte[0], string.Empty }, + new object[] { new byte[] { 0x12 }, "12" }, + new object[] { new byte[] { 0x12, 0x23, 0x34, 0x45 }, "12 23 34 45" } + }; + + [Theory] + [MemberData(nameof(GetTestData))] + public void Test(byte[] data, string expected) + { + Check.That(HexadecimalFormatter.ToString(data)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/Util/NumberFormatTest.cs b/ReClass.NET_Tests/Util/NumberFormatTest.cs new file mode 100644 index 00000000..9660f8a8 --- /dev/null +++ b/ReClass.NET_Tests/Util/NumberFormatTest.cs @@ -0,0 +1,22 @@ +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class NumberFormatTest + { + [Theory] + [InlineData("123,34", ",", ".")] + [InlineData("123.34", ".", ",")] + [InlineData("1.123,34", ",", ".")] + [InlineData("1,123.34", ".", ",")] + public void TestGuess(string input, string expectedDecimalSeparator, string expectedGroupSeparator) + { + var nf = NumberFormat.GuessNumberFormat(input); + + Check.That(nf.NumberDecimalSeparator).IsEqualTo(expectedDecimalSeparator); + Check.That(nf.NumberGroupSeparator).IsEqualTo(expectedGroupSeparator); + } + } +} diff --git a/ReClass.NET_Tests/Util/PathUtilTest.cs b/ReClass.NET_Tests/Util/PathUtilTest.cs new file mode 100644 index 00000000..5209171d --- /dev/null +++ b/ReClass.NET_Tests/Util/PathUtilTest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class PathUtilTest + { + public static IEnumerable GetTestConversionData() => new List + { + new object[] { string.Empty, string.Empty }, + new object[] { "C:/", "C:" + Path.DirectorySeparatorChar }, + new object[] { @"C:\", "C:" + Path.DirectorySeparatorChar }, + new object[] { "C:/test.test", Path.Combine("C:" + Path.DirectorySeparatorChar, "test.test") }, + new object[] { "file:///C:/test.test", Path.Combine("C:" + Path.DirectorySeparatorChar, "test.test") }, + }; + + [Theory] + [MemberData(nameof(GetTestConversionData))] + public void TestConversion(string input, string expected) + { + Check.That(PathUtil.FileUrlToPath(input)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/Util/XElementSerializerTest.cs b/ReClass.NET_Tests/Util/XElementSerializerTest.cs new file mode 100644 index 00000000..c372b41f --- /dev/null +++ b/ReClass.NET_Tests/Util/XElementSerializerTest.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Extensions; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class XElementSerializerTest + { + [Theory] + [InlineData(true)] + [InlineData(false)] + public void TestBoolSerialization(bool value) + { + const string Name = "BoolValue"; + + var element = XElementSerializer.ToXml(Name, value); + + Check.That(element.Name.LocalName).IsEqualTo(Name); + + Check.That(XElementSerializer.ToBool(element)).IsEqualTo(value); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(-1)] + [InlineData(int.MaxValue)] + [InlineData(int.MinValue)] + public void TestIntSerialization(int value) + { + const string Name = "IntValue"; + + var element = XElementSerializer.ToXml(Name, value); + + Check.That(element.Name.LocalName).IsEqualTo(Name); + + Check.That(XElementSerializer.ToInt(element)).IsEqualTo(value); + } + + [Theory] + [InlineData("")] + [InlineData("test")] + public void TestStringSerialization(string value) + { + const string Name = "StringValue"; + + var element = XElementSerializer.ToXml(Name, value); + + Check.That(element.Name.LocalName).IsEqualTo(Name); + + Check.That(XElementSerializer.ToString(element)).IsEqualTo(value); + } + + public static IEnumerable GetTestColorSerializationData() => new List + { + new object[] { Color.Empty }, + new object[] { Color.Red }, + new object[] { Color.Blue }, + new object[] { Color.FromArgb(123, 123, 123) } + }; + + [Theory] + [MemberData(nameof(GetTestColorSerializationData))] + public void TestColorSerialization(Color value) + { + const string Name = "ColorValue"; + + var element = XElementSerializer.ToXml(Name, value); + + Check.That(element.Name.LocalName).IsEqualTo(Name); + + Check.That(XElementSerializer.ToColor(element).ToRgb()).IsEqualTo(value.ToRgb()); + } + + public static IEnumerable GetTestDictionarySerializationData() => new List + { + new object[] { new Dictionary() }, + new object[] { new Dictionary { { "test", "test" }, { "test2", "test2" } } } + }; + + [Theory] + [MemberData(nameof(GetTestDictionarySerializationData))] + public void TestDictionarySerialization(Dictionary value) + { + const string Name = "DictionaryValue"; + + var element = XElementSerializer.ToXml(Name, value); + + Check.That(element.Name.LocalName).IsEqualTo(Name); + + Check.That(XElementSerializer.ToDictionary(element)).IsEquivalentTo(value); + } + } +} From 1b75514fc54e5fbe07cc01f6deaf26ea0f64416b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 14:09:53 +0200 Subject: [PATCH 582/777] Upgraded target framework version. --- ReClass.NET/App.config | 6 +++--- ReClass.NET/Properties/Settings.Designer.cs | 10 +++++----- ReClass.NET/ReClass.NET.csproj | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/App.config b/ReClass.NET/App.config index 731f6de6..ecdcf8a5 100644 --- a/ReClass.NET/App.config +++ b/ReClass.NET/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/ReClass.NET/Properties/Settings.Designer.cs b/ReClass.NET/Properties/Settings.Designer.cs index 8d3e4a41..cfa4e29c 100644 --- a/ReClass.NET/Properties/Settings.Designer.cs +++ b/ReClass.NET/Properties/Settings.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -12,7 +12,7 @@ namespace ReClassNET.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index ae45a20f..383dc35d 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -9,12 +9,13 @@ Properties ReClassNET ReClass.NET - v4.6.1 + v4.7.2 512 true 0 + x86 From ba12e96c00cfc60e9080cf164cbb41f1df759a51 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 14:35:26 +0200 Subject: [PATCH 583/777] .NET Framework 4.7 contains an Append method. --- ReClass.NET/Extensions/LinqExtensions.cs | 9 --------- ReClass.NET_Launcher/App.config | 6 +++--- ReClass.NET_Launcher/ReClass.NET_Launcher.csproj | 3 ++- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 7d169528..5df0cb13 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -131,15 +131,6 @@ public static IEnumerable Yield(this TSource item) yield return item; } - [DebuggerStepThrough] - public static IEnumerable Append(this IEnumerable source, TSource item) - { - Contract.Ensures(Contract.Result>() != null); - Contract.Requires(source != null); - - return source.Concat(Yield(item)); - } - [DebuggerStepThrough] public static IEnumerable Traverse(this IEnumerable source, Func> childSelector) { diff --git a/ReClass.NET_Launcher/App.config b/ReClass.NET_Launcher/App.config index 731f6de6..ecdcf8a5 100644 --- a/ReClass.NET_Launcher/App.config +++ b/ReClass.NET_Launcher/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj index 5da1c43a..72eba584 100644 --- a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj +++ b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj @@ -8,9 +8,10 @@ WinExe ReClassNET_Launcher ReClass.NET_Launcher - v4.6.1 + v4.7.2 512 true + AnyCPU From 873b31b1ba21b38ea41937f5c222c586c7025b0d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 15:52:33 +0200 Subject: [PATCH 584/777] Added tests for IntPtrComparer. --- ReClass.NET/Util/IntPtrComparer.cs | 3 +- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + ReClass.NET_Tests/Util/IntPtrComparerTest.cs | 33 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET_Tests/Util/IntPtrComparerTest.cs diff --git a/ReClass.NET/Util/IntPtrComparer.cs b/ReClass.NET/Util/IntPtrComparer.cs index 3400e39d..857c9782 100644 --- a/ReClass.NET/Util/IntPtrComparer.cs +++ b/ReClass.NET/Util/IntPtrComparer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using ReClassNET.Extensions; namespace ReClassNET.Util { @@ -9,7 +10,7 @@ public class IntPtrComparer : IComparer public int Compare(IntPtr x, IntPtr y) { - return x.ToInt64().CompareTo(y.ToInt64()); + return x.CompareTo(y); } } } diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 89129de9..fe6dc77d 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -74,6 +74,7 @@ + diff --git a/ReClass.NET_Tests/Util/IntPtrComparerTest.cs b/ReClass.NET_Tests/Util/IntPtrComparerTest.cs new file mode 100644 index 00000000..1b07ecb9 --- /dev/null +++ b/ReClass.NET_Tests/Util/IntPtrComparerTest.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class IntPtrComparerTest + { + public static TheoryData GetTestCompareData() => new TheoryData + { + { IntPtr.Zero, IntPtr.Zero, false }, + { (IntPtr)0x1, IntPtr.Zero, false }, + { (IntPtr)0x1, (IntPtr)0x10, true }, + { (IntPtr)0x1, unchecked((IntPtr)(int)0xFFFFFFFF), true }, + { unchecked((IntPtr)(int)0xFFFFFFFF), unchecked((IntPtr)(int)0xFFFFFFFF), false }, + { unchecked((IntPtr)(int)0xFFFFFFFF), IntPtr.Zero, false } + }; + + [Theory] + [MemberData(nameof(GetTestCompareData))] + public void TestCompare(IntPtr lhs, IntPtr rhs, bool lhsIsSmaller) + { + var comparer = IntPtrComparer.Instance; + + Check.That(comparer.Compare(lhs, rhs) < 0).IsEqualTo(lhsIsSmaller); + } + } +} From c0e472dd9fc490587aad52a90aa119a6ebc955d4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 24 Apr 2019 15:53:28 +0200 Subject: [PATCH 585/777] Refactored code. --- ReClass.NET/ReClass.NET.csproj | 1 - .../Util/Rtf/RtfBuilder.RtfFormatLock.cs | 32 ------- .../Util/Rtf/RtfBuilder.RtfFormatWrapper.cs | 10 -- ReClass.NET/Util/Rtf/RtfBuilder.cs | 95 +++++-------------- 4 files changed, 25 insertions(+), 113 deletions(-) delete mode 100644 ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 383dc35d..4f324a92 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -511,7 +511,6 @@ - diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs deleted file mode 100644 index 52e52ac2..00000000 --- a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatLock.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Diagnostics.Contracts; - -namespace ReClassNET.Util.Rtf -{ - partial class RtfBuilder - { - private class RtfFormatLock : IDisposable - { - private readonly RtfBuilder builder; - private readonly RtfFormatWrapper wrapped; - - public RtfFormatLock(RtfBuilder builder) - { - Contract.Requires(builder != null); - - this.builder = builder; - - wrapped = new RtfFormatWrapper(builder); - - builder.isLocked = true; - } - - public void Dispose() - { - wrapped.Dispose(); - - builder.isLocked = false; - } - } - } -} \ No newline at end of file diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs index 55b55bcb..08078ebb 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.RtfFormatWrapper.cs @@ -16,11 +16,6 @@ public RtfFormatWrapper(RtfBuilder builder) this.builder = builder; - if (builder.isLocked) - { - return; - } - var buffer = builder.buffer; int oldLength = buffer.Length; @@ -67,11 +62,6 @@ public RtfFormatWrapper(RtfBuilder builder) public void Dispose() { - if (builder.isLocked) - { - return; - } - var buffer = builder.buffer; var oldLength = buffer.Length; diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index a8732ce0..ff92a1d8 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; @@ -28,8 +27,6 @@ public partial class RtfBuilder private float fontSize; private FontStyle fontStyle; - protected bool isLocked; - public RtfBuilder() : this(RtfFont.Calibri, 22.0f) { @@ -60,30 +57,46 @@ public RtfBuilder Append(char value) public RtfBuilder Append(string value) { - AppendInternal(value); + if (!string.IsNullOrEmpty(value)) + { + using (new RtfFormatWrapper(this)) + { + value = EscapeString(value); + if (value.IndexOf(Environment.NewLine, StringComparison.Ordinal) >= 0) + { + var lines = value.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + + buffer.Append(string.Join(@"\line ", lines)); + } + else + { + buffer.Append(value); + } + } + } return this; } public RtfBuilder AppendLevel(int level) { - AppendLevelInternal(level); + buffer.AppendFormat(@"\level{0} ", level); return this; } public RtfBuilder AppendLine() { - AppendLineInternal(); + buffer.AppendLine(@"\line"); return this; } public RtfBuilder AppendLine(string value) { - AppendLineInternal(value); + Append(value); - return this; + return AppendLine(); } public RtfBuilder AppendParagraph() @@ -95,12 +108,11 @@ public RtfBuilder AppendParagraph() public RtfBuilder AppendPage() { - AppendPageInternal(); + buffer.AppendLine(@"\page"); return this; } - [DebuggerStepThrough] public RtfBuilder SetForeColor(Color color) { foreColor = color; @@ -108,7 +120,6 @@ public RtfBuilder SetForeColor(Color color) return this; } - [DebuggerStepThrough] public RtfBuilder SetBackColor(Color color) { backColor = color; @@ -116,7 +127,6 @@ public RtfBuilder SetBackColor(Color color) return this; } - [DebuggerStepThrough] public RtfBuilder SetFont(RtfFont font) { fontIndex = IndexOfFont(font); @@ -124,7 +134,6 @@ public RtfBuilder SetFont(RtfFont font) return this; } - [DebuggerStepThrough] public RtfBuilder SetFontSize(float size) { fontSize = size; @@ -132,10 +141,9 @@ public RtfBuilder SetFontSize(float size) return this; } - [DebuggerStepThrough] - public RtfBuilder SetFontStyle(FontStyle fontStyle) + public RtfBuilder SetFontStyle(FontStyle style) { - this.fontStyle = fontStyle; + fontStyle = style; return this; } @@ -198,64 +206,11 @@ private static string GetKnownFontString(RtfFont font) public RtfBuilder Reset() { - ResetInternal(); + buffer.AppendLine(@"\pard"); return this; } - protected void AppendInternal(string value) - { - if (!string.IsNullOrEmpty(value)) - { - using (new RtfFormatWrapper(this)) - { - value = EscapeString(value); - if (value.IndexOf(Environment.NewLine, StringComparison.Ordinal) >= 0) - { - var lines = value.Split(new[] { Environment.NewLine }, StringSplitOptions.None); - - buffer.Append(string.Join(@"\line ", lines)); - } - else - { - buffer.Append(value); - } - } - } - } - - protected void AppendLevelInternal(int level) - { - buffer.AppendFormat(@"\level{0} ", level); - } - - protected void AppendLineInternal(string value) - { - Append(value); - - buffer.AppendLine(@"\line"); - } - - protected void AppendLineInternal() - { - buffer.AppendLine(@"\line"); - } - - protected void AppendPageInternal() - { - buffer.AppendLine(@"\page"); - } - - public IDisposable FormatLock() - { - return new RtfFormatLock(this); - } - - protected void ResetInternal() - { - buffer.AppendLine(@"\pard"); - } - public override string ToString() { var sb = new StringBuilder(); From 5ae0961c2f6e6317cb607216437498742b7808fa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 25 Apr 2019 11:11:56 +0200 Subject: [PATCH 586/777] Refactored NodeDissector. --- ReClass.NET/Memory/NodeDissector.cs | 109 ++++++++++++++++------------ 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 8046efe1..22cc99d8 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -17,19 +17,20 @@ public static void DissectNodes(IEnumerable nodes, MemoryBuffer mem foreach (var node in nodes) { - var type = GuessExplicitNode(node, memory); - if (type != null) + if (GuessNode(node, memory, out var guessedNode)) { - node.GetParentContainer()?.ReplaceChildNode(node, type); + node.GetParentContainer()?.ReplaceChildNode(node, guessedNode); } } } - public static BaseNode GuessExplicitNode(BaseHexNode node, MemoryBuffer memory) + public static bool GuessNode(BaseHexNode node, MemoryBuffer memory, out BaseNode guessedNode) { Contract.Requires(node != null); Contract.Requires(memory != null); + guessedNode = null; + var offset = node.Offset; var is4ByteAligned = offset % 4 == 0; var is8ByteAligned = offset % 8 == 0; @@ -37,7 +38,7 @@ public static BaseNode GuessExplicitNode(BaseHexNode node, MemoryBuffer memory) // The node is not aligned, skip it. if (!is4ByteAligned) { - return null; + return false; } var data64 = memory.ReadObject(offset); @@ -46,46 +47,48 @@ public static BaseNode GuessExplicitNode(BaseHexNode node, MemoryBuffer memory) var raw = memory.ReadBytes(offset, node.MemorySize); if (raw.InterpretAsUtf8().IsLikelyPrintableData() >= 0.75f) { - return new Utf8TextNode(); + guessedNode = new Utf8TextNode(); + + return true; } if (raw.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) { - return new Utf16TextNode(); + guessedNode = new Utf16TextNode(); + + return true; } +#if RECLASSNET64 if (is8ByteAligned) { -#if RECLASSNET64 - var pointerType = GuessPointerNode(data64.IntPtr, memory); - if (pointerType != null) + if (GuessPointerNode(data64.IntPtr, memory.Process, out guessedNode)) { - return pointerType; + return true; } -#endif } +#else + if (GuessPointerNode(data32.IntPtr, memory.Process, out guessedNode)) + { + return true; + } +#endif + // 0 could be anything. + if (data32.IntValue != 0) { -#if RECLASSNET32 - var pointerNode = GuessPointerNode(data32.IntPtr, memory); - if (pointerNode != null) + // If the data represents a reasonable range, it could be a float. + if (-999999.0f <= data32.FloatValue && data32.FloatValue <= 999999.0f && !data32.FloatValue.IsNearlyEqual(0.0f, 0.001f)) { - return pointerNode; + guessedNode = new FloatNode(); + + return true; } -#endif - // 0 could be anything. - if (data32.IntValue != 0) + if (-999999 <= data32.IntValue && data32.IntValue <= 999999) { - // If the data represents a reasonable range, it could be a float. - if (-999999.0f <= data32.FloatValue && data32.FloatValue <= 999999.0f && !data32.FloatValue.IsNearlyEqual(0.0f, 0.001f)) - { - return new FloatNode(); - } + guessedNode = new Int32Node(); - if (-999999 <= data32.IntValue && data32.IntValue <= 999999) - { - return new Int32Node(); - } + return true; } } @@ -96,60 +99,74 @@ public static BaseNode GuessExplicitNode(BaseHexNode node, MemoryBuffer memory) // If the data represents a reasonable range, it could be a double. if (-999999.0 <= data64.DoubleValue && data64.DoubleValue <= 999999.0 && !data64.DoubleValue.IsNearlyEqual(0.0, 0.001)) { - return new DoubleNode(); + guessedNode = new DoubleNode(); + + return true; } } } - return null; + return false; } - private static BaseNode GuessPointerNode(IntPtr address, MemoryBuffer memory) + private static bool GuessPointerNode(IntPtr address, IProcessReader process, out BaseNode node) { - Contract.Requires(memory != null); + Contract.Requires(process != null); + + node = null; if (address.IsNull()) { - return null; + return false; } - var section = memory.Process.GetSectionToPointer(address); + var section = process.GetSectionToPointer(address); if (section == null) { - return null; + return false; } if (section.Category == SectionCategory.CODE) // If the section contains code, it should be a function pointer. { - return new FunctionPtrNode(); + node = new FunctionPtrNode(); + + return true; } if (section.Category == SectionCategory.DATA || section.Category == SectionCategory.HEAP) // If the section contains data, it is at least a pointer to a class or something. { // Check if it is a vtable. Check if the first 3 values are pointers to a code section. - var possibleVmt = memory.Process.ReadRemoteObject(address); - if (memory.Process.GetSectionToPointer(possibleVmt.Pointer1)?.Category == SectionCategory.CODE - && memory.Process.GetSectionToPointer(possibleVmt.Pointer2)?.Category == SectionCategory.CODE - && memory.Process.GetSectionToPointer(possibleVmt.Pointer3)?.Category == SectionCategory.CODE) + var possibleVmt = process.ReadRemoteObject(address); + if (process.GetSectionToPointer(possibleVmt.Pointer1)?.Category == SectionCategory.CODE + && process.GetSectionToPointer(possibleVmt.Pointer2)?.Category == SectionCategory.CODE + && process.GetSectionToPointer(possibleVmt.Pointer3)?.Category == SectionCategory.CODE) { - return new VirtualMethodTableNode(); + node = new VirtualMethodTableNode(); + + return true; } // Check if it is a string. - var data = memory.Process.ReadRemoteMemory(address, IntPtr.Size * 2); + var data = process.ReadRemoteMemory(address, IntPtr.Size * 2); if (data.Take(IntPtr.Size).InterpretAsUtf8().IsLikelyPrintableData() >= 07.5f) { - return new Utf8TextPtrNode(); + node = new Utf8TextPtrNode(); + + return true; } if (data.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) { - return new Utf16TextPtrNode(); + node = new Utf16TextPtrNode(); + + return true; } // Now it could be a pointer to something else but we can't tell. :( - return new PointerNode(); + node = new PointerNode(); + + return true; } - return null; + return false; } } } From f377de95a9c57c76b952fd3a9e1714074a249c15 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 25 Apr 2019 15:41:01 +0200 Subject: [PATCH 587/777] Refactored IsLikelyPrintableData. --- ReClass.NET/Extensions/StringExtensions.cs | 16 +++++++++++----- ReClass.NET/Memory/NodeDissector.cs | 8 ++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index b0c8c50e..6f2711c2 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -40,17 +40,23 @@ public static bool IsPrintableData(this IEnumerable source) { Contract.Requires(source != null); - return IsLikelyPrintableData(source) >= 1.0f; + return CalculatePrintableDataThreshold(source) >= 1.0f; } [DebuggerStepThrough] - public static float IsLikelyPrintableData(this IEnumerable source) + public static bool IsLikelyPrintableData(this IEnumerable source) { Contract.Requires(source != null); - bool doCountValid = true; - int countValid = 0; - int countAll = 0; + return CalculatePrintableDataThreshold(source) >= 0.75f; + } + + [DebuggerStepThrough] + public static float CalculatePrintableDataThreshold(this IEnumerable source) + { + var doCountValid = true; + var countValid = 0; + var countAll = 0; foreach (var c in source) { diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 22cc99d8..7b82f782 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -45,13 +45,13 @@ public static bool GuessNode(BaseHexNode node, MemoryBuffer memory, out BaseNode var data32 = memory.ReadObject(offset); var raw = memory.ReadBytes(offset, node.MemorySize); - if (raw.InterpretAsUtf8().IsLikelyPrintableData() >= 0.75f) + if (raw.InterpretAsUtf8().IsLikelyPrintableData()) { guessedNode = new Utf8TextNode(); return true; } - if (raw.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) + if (raw.InterpretAsUtf16().IsLikelyPrintableData()) { guessedNode = new Utf16TextNode(); @@ -147,13 +147,13 @@ private static bool GuessPointerNode(IntPtr address, IProcessReader process, out // Check if it is a string. var data = process.ReadRemoteMemory(address, IntPtr.Size * 2); - if (data.Take(IntPtr.Size).InterpretAsUtf8().IsLikelyPrintableData() >= 07.5f) + if (data.Take(IntPtr.Size).InterpretAsUtf8().IsLikelyPrintableData()) { node = new Utf8TextPtrNode(); return true; } - if (data.InterpretAsUtf16().IsLikelyPrintableData() >= 0.75f) + if (data.InterpretAsUtf16().IsLikelyPrintableData()) { node = new Utf16TextPtrNode(); From 227ea071a745b56790dc8b304186be69a24b5fd3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 26 Apr 2019 10:12:54 +0200 Subject: [PATCH 588/777] Added tests for class EncodingExtension. Changed method name. --- ReClass.NET/Extensions/EncodingExtensions.cs | 4 +- ReClass.NET/Memory/RemoteProcess.cs | 6 +-- .../Comparer/StringMemoryComparer.cs | 2 +- ReClass.NET/MemoryScanner/MemoryRecord.cs | 2 +- ReClass.NET/Nodes/BaseTextNode.cs | 2 +- .../Extensions/EncodingExtensionTest.cs | 41 +++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + 7 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index 696295f4..94ed21b2 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -8,10 +8,10 @@ public static class EncodingExtension /// Gets the (perhaps wrong) byte count per character. Special characters may need more bytes. /// The encoding. /// The byte count per character. - public static int GetSimpleByteCountPerChar(this Encoding encoding) + public static int GuessByteCountPerChar(this Encoding encoding) { if (encoding.Equals(Encoding.UTF8) || encoding.Equals(Encoding.ASCII)) return 1; - if (encoding.Equals(Encoding.Unicode)) return 2; + if (encoding.Equals(Encoding.Unicode) || encoding.Equals(Encoding.BigEndianUnicode)) return 2; if (encoding.Equals(Encoding.UTF32)) return 4; throw new NotImplementedException(); diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 6b09b159..1bbbd283 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -289,7 +289,7 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) Contract.Requires(length >= 0); Contract.Ensures(Contract.Result() != null); - var data = ReadRemoteMemory(address, length * encoding.GetSimpleByteCountPerChar()); + var data = ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); try { @@ -320,10 +320,10 @@ public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr Contract.Requires(length >= 0); Contract.Ensures(Contract.Result() != null); - var data = ReadRemoteMemory(address, length * encoding.GetSimpleByteCountPerChar()); + var data = ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); // TODO We should cache the pattern per encoding. - var index = PatternScanner.FindPattern(BytePattern.From(new byte[encoding.GetSimpleByteCountPerChar()]), data); + var index = PatternScanner.FindPattern(BytePattern.From(new byte[encoding.GuessByteCountPerChar()]), data); if (index == -1) { index = data.Length; diff --git a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs index 44b958ed..91b7b840 100644 --- a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -19,7 +19,7 @@ public StringMemoryComparer(string value, Encoding encoding, bool caseSensitive) Value = value; Encoding = encoding; CaseSensitive = caseSensitive; - ValueSize = Value.Length * Encoding.GetSimpleByteCountPerChar(); + ValueSize = Value.Length * Encoding.GuessByteCountPerChar(); } public bool Compare(byte[] data, int index, out ScanResult result) diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index a9b3968f..ea17019d 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -177,7 +177,7 @@ public void RefreshValue(RemoteProcess process) buffer = new byte[ValueLength]; break; case ScanValueType.String: - buffer = new byte[ValueLength * Encoding.GetSimpleByteCountPerChar()]; + buffer = new byte[ValueLength * Encoding.GuessByteCountPerChar()]; break; default: throw new InvalidOperationException(); diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index e5ab03ce..60984853 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -17,7 +17,7 @@ public abstract class BaseTextNode : BaseNode public abstract Encoding Encoding { get; } /// Size of one character in bytes. - private int CharacterSize => Encoding.GetSimpleByteCountPerChar(); + private int CharacterSize => Encoding.GuessByteCountPerChar(); public override void CopyFromNode(BaseNode node) { diff --git a/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs new file mode 100644 index 00000000..12521302 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class EncodingExtensionTest + { + public static TheoryData GetTestSimpleByteCountData() => new TheoryData + { + { Encoding.ASCII, 1 }, + { Encoding.UTF8, 1 }, + { Encoding.Unicode, 2 }, + { Encoding.BigEndianUnicode, 2 }, + { Encoding.UTF32, 4 } + }; + + [Theory] + [MemberData(nameof(GetTestSimpleByteCountData))] + public void TestSimpleByteCount(Encoding encoding, int expectedByteCount) + { + Check.That(encoding.GuessByteCountPerChar()).IsEqualTo(expectedByteCount); + } + + public static IEnumerable GetTestSimpleByteCountNotImplementedData() => Encoding.GetEncodings() + .Select(e => e.GetEncoding()) + .WhereNot(e => e.Equals(Encoding.ASCII) || e.Equals(Encoding.UTF8) || e.Equals(Encoding.Unicode) || e.Equals(Encoding.BigEndianUnicode) || e.Equals(Encoding.UTF32)) + .Select(e => new object[] { e }); + + [Theory] + [MemberData(nameof(GetTestSimpleByteCountNotImplementedData))] + public void TestSimpleByteCountNotImplemented(Encoding encoding) + { + Check.ThatCode(encoding.GuessByteCountPerChar).Throws(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index fe6dc77d..6ecc3ea1 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -67,6 +67,7 @@ + From 4a231ab5ed294e0c6f25f1b1dba9eea00c1a77af Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 26 Apr 2019 20:40:16 +0200 Subject: [PATCH 589/777] Added tests for ColorExtension, DictionaryExtension and FloatingPointExtension. --- .../Extensions/FloatingPointExtensions.cs | 30 +--------- .../Comparer/DoubleMemoryComparer.cs | 2 +- .../Comparer/FloatMemoryComparer.cs | 2 +- .../Extensions/ColorExtensionTest.cs | 52 +++++++++++++++++ .../Extensions/DictionaryExtensionTest.cs | 30 ++++++++++ .../Extensions/FloatingPointExtensionTest.cs | 57 +++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 3 + 7 files changed, 146 insertions(+), 30 deletions(-) create mode 100644 ReClass.NET_Tests/Extensions/ColorExtensionTest.cs create mode 100644 ReClass.NET_Tests/Extensions/DictionaryExtensionTest.cs create mode 100644 ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs diff --git a/ReClass.NET/Extensions/FloatingPointExtensions.cs b/ReClass.NET/Extensions/FloatingPointExtensions.cs index b905165c..410c56e8 100644 --- a/ReClass.NET/Extensions/FloatingPointExtensions.cs +++ b/ReClass.NET/Extensions/FloatingPointExtensions.cs @@ -6,13 +6,6 @@ namespace ReClassNET.Extensions { public static class FloatingPointExtension { - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this float val, float other) - { - return IsNearlyEqual(val, other, float.Epsilon); - } - [Pure] [DebuggerStepThrough] public static bool IsNearlyEqual(this float val, float other, float epsilon) @@ -22,20 +15,7 @@ public static bool IsNearlyEqual(this float val, float other, float epsilon) return true; } - var diff = Math.Abs(val - other); - if (val == 0.0f || other == 0.0f || diff < float.Epsilon) - { - return diff < epsilon; - } - - return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; - } - - [Pure] - [DebuggerStepThrough] - public static bool IsNearlyEqual(this double val, double other) - { - return IsNearlyEqual(val, other, double.Epsilon); + return Math.Abs(val - other) <= epsilon; } [Pure] @@ -47,13 +27,7 @@ public static bool IsNearlyEqual(this double val, double other, double epsilon) return true; } - var diff = Math.Abs(val - other); - if (val == 0.0 || other == 0.0 || diff < double.Epsilon) - { - return diff < epsilon; - } - - return diff / (Math.Abs(val) + Math.Abs(other)) < epsilon; + return Math.Abs(val - other) <= epsilon; } } } diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index 56c50164..eabd011a 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -45,7 +45,7 @@ private bool CheckRoundedEquality(double value) switch (RoundType) { case ScanRoundMode.Strict: - return Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); + return Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001); case ScanRoundMode.Normal: return minValue < value && value < maxValue; case ScanRoundMode.Truncate: diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index 52e96974..bdcddad8 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -45,7 +45,7 @@ private bool CheckRoundedEquality(float value) switch (RoundType) { case ScanRoundMode.Strict: - return Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero)); + return Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001f); case ScanRoundMode.Normal: return minValue < value && value < maxValue; case ScanRoundMode.Truncate: diff --git a/ReClass.NET_Tests/Extensions/ColorExtensionTest.cs b/ReClass.NET_Tests/Extensions/ColorExtensionTest.cs new file mode 100644 index 00000000..fdc1a65c --- /dev/null +++ b/ReClass.NET_Tests/Extensions/ColorExtensionTest.cs @@ -0,0 +1,52 @@ +using System.Drawing; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class ColorExtensionTest + { + public static TheoryData GetTestInvertedColorData() => new TheoryData + { + { Color.White, Color.Black }, + { Color.Black, Color.White }, + { Color.Red, Color.Cyan }, + { Color.Cyan, Color.Red }, + { Color.Blue, Color.Yellow }, + { Color.Yellow, Color.Blue }, + { Color.Lime, Color.Fuchsia }, + { Color.Fuchsia, Color.Lime }, + { Color.FromArgb(100, 100, 100), Color.FromArgb(155, 155, 155) }, + { Color.FromArgb(50, 100, 150), Color.FromArgb(205, 155, 105) } + }; + + [Theory] + [MemberData(nameof(GetTestInvertedColorData))] + public void TestInvertedColor(Color sut, Color expected) + { + Check.That(sut.Invert().ToArgb()).IsEqualTo(expected.ToArgb()); + } + + public static TheoryData GetTestToRgbData() => new TheoryData + { + { Color.White, 0xFF_FF_FF }, + { Color.Black, 0x00_00_00 }, + { Color.Red, 0xFF_00_00 }, + { Color.Cyan, 0x00_FF_FF }, + { Color.Blue, 0x00_00_FF }, + { Color.Yellow, 0xFF_FF_00 }, + { Color.Lime, 0x00_FF_00 }, + { Color.Fuchsia, 0xFF_00_FF }, + { Color.FromArgb(100, 100, 100), 100 << 16 | 100 << 8 | 100 }, + { Color.FromArgb(50, 100, 150), 50 << 16 | 100 << 8 | 150 } + }; + + [Theory] + [MemberData(nameof(GetTestToRgbData))] + public void TestToRgb(Color sut, int expected) + { + Check.That(sut.ToRgb()).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/DictionaryExtensionTest.cs b/ReClass.NET_Tests/Extensions/DictionaryExtensionTest.cs new file mode 100644 index 00000000..0b0d2a70 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/DictionaryExtensionTest.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class DictionaryExtensionTest + { + [Fact] + public void TestRemoveWhere() + { + var sut = new Dictionary + { + { 0, "val0" }, + { 1, "val1" }, + { 2, "val2" }, + { 3, "val3" } + }; + + sut.RemoveWhere(kv => kv.Key % 2 == 1); + + Check.That(sut.Keys).IsEquivalentTo(0, 2); + + sut.RemoveWhere(kv => kv.Key == 2); + + Check.That(sut.Keys).IsEquivalentTo(0); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs b/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs new file mode 100644 index 00000000..a295fd7a --- /dev/null +++ b/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using NFluent.Extensions; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class FloatingPointExtensionTest + { + [Theory] + [InlineData(0.0f, 0.0f, 0.0f, true)] + [InlineData(0.0f, 1.0f, 0.0f, false)] + [InlineData(0.0f, 1.0f, 1.0f, true)] + [InlineData(1.0f, 0.0f, 1.0f, true)] + [InlineData(-1.0f, 0.0f, 1.0f, true)] + [InlineData(-1.0f, 1.0f, 1.0f, false)] + [InlineData(-0.5f, 0.5f, 1.0f, true)] + [InlineData(-0.25f, 0.75f, 1.0f, true)] + [InlineData(-0.25f, 0.25f, 0.5f, true)] + [InlineData(0.9999f, 1.0f, 0.0f, false)] + [InlineData(0.9999f, 1.0f, 0.1f, true)] + [InlineData(0.9999f, 1.0f, 0.01f, true)] + [InlineData(0.9999f, 1.0f, 0.001f, true)] + [InlineData(0.9999f, 1.0f, 0.0001f, true, Skip = "Should work but float can't hold these values")] + [InlineData(0.9999f, 1.0f, 0.00001f, false, Skip = "Should work but float can't hold these values")] + public void TestNearlyEqualFloat(float value1, float value2, float epsilon, bool expected) + { + Check.That(value1.IsNearlyEqual(value2, epsilon)).IsEqualTo(expected); + } + + [Theory] + [InlineData(0.0, 0.0, 0.0, true)] + [InlineData(0.0, 1.0, 0.0, false)] + [InlineData(0.0, 1.0, 1.0, true)] + [InlineData(1.0, 0.0, 1.0, true)] + [InlineData(-1.0, 0.0, 1.0, true)] + [InlineData(-1.0, 1.0, 1.0, false)] + [InlineData(-0.5, 0.5, 1.0, true)] + [InlineData(-0.25, 0.75, 1.0, true)] + [InlineData(-0.25, 0.25, 0.5, true)] + [InlineData(0.9999, 1.0, 0.0, false)] + [InlineData(0.9999, 1.0, 0.1, true)] + [InlineData(0.9999, 1.0, 0.01, true)] + [InlineData(0.9999, 1.0, 0.001, true)] + [InlineData(0.9999, 1.0, 0.0001, true)] + [InlineData(0.9999, 1.0, 0.00001, false)] + public void TestNearlyEqualDouble(double value1, double value2, double epsilon, bool expected) + { + Check.That(value1.IsNearlyEqual(value2, epsilon)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 6ecc3ea1..bb7d9fa0 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -67,7 +67,10 @@ + + + From 181ddf939d670b1065c37ef8d65b0bfe90a2d5c3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 Apr 2019 19:54:54 +0200 Subject: [PATCH 590/777] Removed Join method. --- ReClass.NET/Extensions/LinqExtensions.cs | 12 +----------- ReClass.NET/Util/Rtf/RtfBuilder.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 5df0cb13..117562ce 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -8,16 +8,6 @@ namespace ReClassNET.Extensions { public static class LinqExtension { - public static string Join(this IEnumerable source) - { - return Join(source, string.Empty); - } - - public static string Join(this IEnumerable source, string separator) - { - return string.Join(separator, source); - } - public static TResult Max(this IEnumerable source, Func selector, IComparer comparer) { comparer = comparer ?? Comparer.Default; diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index ff92a1d8..20334875 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -218,11 +218,17 @@ public override string ToString() sb.Append(@"{\rtf1\ansi\ansicpg1252\deff0\deflang3081"); sb.Append(@"{\fonttbl"); - sb.Append(usedFonts.Select((f, i) => string.Format(f, i)).Join()); + for (var i = 0; i < usedFonts.Count; ++i) + { + sb.AppendFormat(usedFonts[i], i); + } sb.AppendLine("}"); sb.Append(@"{\colortbl ;"); - sb.Append(usedColors.Select(c => $@"\red{c.R}\green{c.G}\blue{c.B};").Join()); + foreach (var color in usedColors) + { + sb.Append($@"\red{color.R}\green{color.G}\blue{color.B};"); + } sb.AppendLine("}"); sb.Append(@"\viewkind4\uc1\pard\plain\f0"); From f69f9c0a9a4b8e80940dadfe049c73495c04f28c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 Apr 2019 19:55:37 +0200 Subject: [PATCH 591/777] Changed method name. --- ReClass.NET/Extensions/LinqExtensions.cs | 44 +++++------------------- ReClass.NET/UI/ProjectView.cs | 2 +- 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 117562ce..d0cf32e7 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -201,45 +201,19 @@ public static IEnumerable DistinctBy(this IEnumerable(this IEnumerable first, IEnumerable second) + public static bool IsEquivalentTo(this IEnumerable source, IEnumerable other) { - Contract.Requires(first != null); - Contract.Requires(second != null); - - return SequenceEqualsEx(first, second, EqualityComparer.Default); - } + Contract.Requires(source != null); + Contract.Requires(other != null); - [DebuggerStepThrough] - public static bool SequenceEqualsEx(this IEnumerable first, IEnumerable second, IEqualityComparer comparer) - { - Contract.Requires(first != null); - Contract.Requires(second != null); - Contract.Requires(comparer != null); + var expected = new List(source); - var counter = new Dictionary(comparer); - foreach (var element in first) - { - if (counter.ContainsKey(element)) - { - counter[element]++; - } - else - { - counter.Add(element, 1); - } - } - foreach (var element in second) + if (other.Any(item => !expected.Remove(item))) { - if (counter.ContainsKey(element)) - { - counter[element]--; - } - else - { - return false; - } + return false; } - return counter.Values.All(c => c == 0); + + return expected.Count == 0; } /// diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index b860c66f..9be2363d 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -72,7 +72,7 @@ private void RebuildClassHierarchy(HashSet seen) .Distinct() .ToList(); - if (distinctClasses.SequenceEqualsEx(Nodes.Cast().Select(t => t.ClassNode))) + if (distinctClasses.IsEquivalentTo(Nodes.Cast().Select(t => t.ClassNode))) { return; } From 7c917fb1e1e0c4702d990a7aa685e6a9a16821c3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 Apr 2019 22:06:00 +0200 Subject: [PATCH 592/777] Replaced Yield method with Prepend. --- ReClass.NET/Extensions/LinqExtensions.cs | 8 -------- ReClass.NET/Forms/MainForm.cs | 2 +- ReClass.NET/UI/EnumComboBox.cs | 4 ++-- ReClass.NET/UI/EnumDescriptionDisplay.cs | 16 ---------------- ReClass.NET/UI/NodeTypesBuilder.cs | 2 +- 5 files changed, 4 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index d0cf32e7..99aade64 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -113,14 +113,6 @@ public static void ForEach(this IEnumerable source, Action Yield(this TSource item) - { - Contract.Ensures(Contract.Result>() != null); - - yield return item; - } - [DebuggerStepThrough] public static IEnumerable Traverse(this IEnumerable source, Func> childSelector) { diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 21c5df8d..33f951dd 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -800,7 +800,7 @@ private void memoryViewControl_ChangeClassTypeClick(object sender, NodeClickEven Name = "None" }; - using (var csf = new ClassSelectionForm(noneClass.Yield().Concat(classes))) + using (var csf = new ClassSelectionForm(classes.Prepend(noneClass))) { if (csf.ShowDialog() == DialogResult.OK) { diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/UI/EnumComboBox.cs index c266a9fa..c22fb6e7 100644 --- a/ReClass.NET/UI/EnumComboBox.cs +++ b/ReClass.NET/UI/EnumComboBox.cs @@ -93,7 +93,7 @@ public EnumComboBox() public void SetAvailableValues(TEnum item1, params TEnum[] items) { - SetAvailableValues(item1.Yield().Concat(items)); + SetAvailableValues(items.Prepend(item1)); } public void SetAvailableValues(IEnumerable values) @@ -105,7 +105,7 @@ public void SetAvailableValues(IEnumerable values) public void SetAvailableValuesExclude(TEnum item1, params TEnum[] items) { - SetAvailableValuesExclude(item1.Yield().Concat(items)); + SetAvailableValuesExclude(items.Prepend(item1)); } public void SetAvailableValuesExclude(IEnumerable values) diff --git a/ReClass.NET/UI/EnumDescriptionDisplay.cs b/ReClass.NET/UI/EnumDescriptionDisplay.cs index 692b22ce..5f638238 100644 --- a/ReClass.NET/UI/EnumDescriptionDisplay.cs +++ b/ReClass.NET/UI/EnumDescriptionDisplay.cs @@ -4,8 +4,6 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Reflection; -using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.UI { @@ -21,13 +19,6 @@ public static List> Create() return CreateExact(Enum.GetValues(typeof(TEnum)).Cast()); } - public static List> CreateExact(TEnum item1, params TEnum[] include) - { - Contract.Ensures(Contract.Result>>() != null); - - return CreateExact(item1.Yield().Concat(include)); - } - public static List> CreateExact(IEnumerable include) { Contract.Requires(include != null); @@ -43,13 +34,6 @@ public static List> CreateExact(IEnumerable .ToList(); } - public static List> CreateExclude(TEnum item1, params TEnum[] exclude) - { - Contract.Ensures(Contract.Result>>() != null); - - return CreateExclude(item1.Yield().Concat(exclude)); - } - public static List> CreateExclude(IEnumerable exclude) { Contract.Requires(exclude != null); diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 33828756..b896e785 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -119,7 +119,7 @@ public static IEnumerable CreateToolStripMenuItems(Action h Text = "None" }; - items = noneItem.Yield().Append(new ToolStripSeparator()).Concat(items); + items = items.Prepend(new ToolStripSeparator()).Prepend(noneItem); } return items; From b77f29e50da1cc5192442813d1e35f214999f274 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 2 May 2019 21:30:42 +0200 Subject: [PATCH 593/777] Use build in methods to check if a character is printable. --- ReClass.NET/Extensions/StringExtensions.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index 6f2711c2..83114a8c 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -13,7 +13,7 @@ public static class StringExtension [DebuggerStepThrough] public static bool IsPrintable(this char c) { - return ' ' <= c && c <= '~'; + return !char.IsControl(c) || char.IsWhiteSpace(c); } [DebuggerStepThrough] @@ -75,6 +75,11 @@ public static float CalculatePrintableDataThreshold(this IEnumerable sourc } } + if (countAll == 0) + { + return 0.0f; + } + return countValid / (float)countAll; } From 955e46eff177e0230a977f6417dfcfe97c489737 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 2 May 2019 21:31:41 +0200 Subject: [PATCH 594/777] Added LinqExtensions tests. Added StringExtensions tests. --- .../Extensions/LinqExtensionTests.cs | 131 +++++++++++++++ .../Extensions/StringExtensionTest.cs | 151 ++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 2 + 3 files changed, 284 insertions(+) create mode 100644 ReClass.NET_Tests/Extensions/LinqExtensionTests.cs create mode 100644 ReClass.NET_Tests/Extensions/StringExtensionTest.cs diff --git a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs new file mode 100644 index 00000000..7fb1919f --- /dev/null +++ b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class LinqExtensionTests + { + public static TheoryData, bool> GetTestNoneData => new TheoryData, bool> + { + { new int[0], true }, + { new int[1], false }, + { Enumerable.Empty(), true } + }; + + [Theory] + [MemberData(nameof(GetTestNoneData))] + public void TestNone(IEnumerable sut, bool expected) + { + Check.That(sut.None()).IsEqualTo(expected); + } + + public static TheoryData, Func, bool> GetTestNoneWithSelectorData => new TheoryData, Func, bool> + { + { new int[0], i => false, true }, + { new int[0], i => true, true }, + { new [] { 1 }, i => i == 1, false }, + { new [] { 1 }, i => i != 1, true }, + { new [] { 1, 3, 5 }, i => i % 2 == 0, true } + }; + + [Theory] + [MemberData(nameof(GetTestNoneWithSelectorData))] + public void TestNoneWithSelector(IEnumerable sut, Func selector, bool expected) + { + Check.That(sut.None(selector)).IsEqualTo(expected); + } + + public static TheoryData, Func> GetTestWhereNotData => new TheoryData, Func> + { + { new int[0], i => false }, + { new int[0], i => true }, + { new [] { 1 }, i => i == 1 }, + { new [] { 1, 3, 5 }, i => i % 2 == 1 } + }; + + [Theory] + [MemberData(nameof(GetTestWhereNotData))] + public void TestWhereNot(IEnumerable sut, Func selector) + { + Check.That(sut.WhereNot(selector)).IsEmpty(); + } + + public static TheoryData, int, int> GetTestFindIndexData => new TheoryData, int, int> + { + { new int[0], 1, -1 }, + { new [] { 1 }, 1, 0 }, + { new [] { 1 }, 2, -1 }, + { new [] { 1, 3, 5 }, 1, 0 }, + { new [] { 1, 3, 5 }, 2, -1 }, + { new [] { 1, 3, 5 }, 3, 1 }, + { new [] { 1, 3, 5 }, 4, -1 }, + { new [] { 1, 3, 5 }, 5, 2 } + }; + + [Theory] + [MemberData(nameof(GetTestFindIndexData))] + public void TestFindIndex(IEnumerable sut, int item, int expected) + { + Check.That(sut.FindIndex(i => i == item)).IsEqualTo(expected); + } + + public static TheoryData> GetTestForEachData => new TheoryData> + { + { Enumerable.Empty() }, + { Enumerable.Repeat(0, 1) }, + { Enumerable.Repeat(0, 2) }, + { Enumerable.Repeat(0, 10) } + }; + + [Theory] + [MemberData(nameof(GetTestForEachData))] + public void TestForEach(IEnumerable sut) + { + var sutCpy = sut.ToList(); + + var counter = 0; + sutCpy.ForEach(_ => counter++); + + Check.That(counter).IsEqualTo(sutCpy.Count); + } + + public static TheoryData, Func, IEnumerable> GetTestDistinctByData => new TheoryData, Func, IEnumerable> + { + { Enumerable.Empty(), i => i, Enumerable.Empty() }, + { new [] { 1 }, i => i, new [] { 1 } }, + { new [] { 1, 1, 1, 1 }, i => i, new [] { 1 } }, + { new [] { 1, 2, 3, 4 }, i => i, new [] { 1, 2, 3, 4 } }, + { new [] { 1, 1, 2, 2, 3, 3 }, i => i, new [] { 1, 2, 3 } }, + { new [] { 1, 1, 2, 2, 3, 4 }, i => i, new [] { 1, 2, 3, 4 } }, + { new [] { 1, 1, 2, 2, 3, 4 }, i => 0, new [] { 1 } } + }; + + [Theory] + [MemberData(nameof(GetTestDistinctByData))] + public void TestDistinctBy(IEnumerable sut, Func selector, IEnumerable expected) + { + Check.That(sut.DistinctBy(selector)).IsEquivalentTo(expected); + } + + public static TheoryData, IEnumerable, bool> GetTestIsEquivalentToData => new TheoryData, IEnumerable, bool> + { + { Enumerable.Empty(), Enumerable.Empty(), true }, + { Enumerable.Empty(), new int[0], true }, + { new [] { 1 }, new int[0], false }, + { new [] { 1 }, new [] { 2 }, false }, + { new [] { 1, 2, 3 }, new [] { 1, 2, 3 }, true }, + { new [] { 1, 2, 3 }, new [] { 3, 1, 2 }, true } + }; + + [Theory] + [MemberData(nameof(GetTestIsEquivalentToData))] + public void TestIsEquivalentTo(IEnumerable sut, IEnumerable other, bool expected) + { + Check.That(sut.IsEquivalentTo(other)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs new file mode 100644 index 00000000..5b41a8ba --- /dev/null +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class StringExtensionTest + { + public static TheoryData GetTestIsPrintableData() => new TheoryData + { + '0', '9', ' ', '\t', '\n', 'a', 'A', 'z', 'Z', '-', '_', '°', '^', '"', '\\', '\"', '&', '@', '€', '$', '|', '<', '>', ';', ',', '.', ':', '#', '*', '+', '~', '`', '´', 'ß', '?', '=', '(', ')', '[', ']', '{', '}' + }; + + [Theory] + [MemberData(nameof(GetTestIsPrintableData))] + public void TestIsPrintable(char c) + { + Check.That(c.IsPrintable()).IsTrue(); + } + + public static TheoryData GetTestIsNotPrintableData() => new TheoryData + { + '\u0000','\u0001', '\u0002', '\u009A','\u009B', '\u009C', '\u009D','\u009E', '\u009F' + }; + + [Theory] + [MemberData(nameof(GetTestIsNotPrintableData))] + public void TestIsNotPrintable(char c) + { + Check.That(c.IsPrintable()).IsFalse(); + } + + public static TheoryData GetTestLimitLengthData() => new TheoryData + { + { string.Empty, 0, string.Empty }, + { string.Empty, 1, string.Empty }, + { "01234", 0, string.Empty }, + { "01234", 1, "0" }, + { "01234", 5, "01234" }, + { "01234", 10, "01234" } + }; + + [Theory] + [MemberData(nameof(GetTestLimitLengthData))] + public void TestLimitLength(string sut, int length, string expected) + { + Check.That(sut.LimitLength(length)).IsEqualTo(expected); + } + + [Fact] + public void TestLimitLengthThrows() + { + Check.ThatCode(() => "".LimitLength(-1)).Throws(); + } + + public static TheoryData, IEnumerable> GetTestInterpretAsUtf8Data() => new TheoryData, IEnumerable> + { + { new byte[0], string.Empty }, + { new [] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }, "test".ToArray() /* https://github.com/tpierrain/NFluent/issues/299 */ } + }; + + [Theory] + [MemberData(nameof(GetTestInterpretAsUtf8Data))] + public void TestInterpretAsUtf8(IEnumerable sut, IEnumerable expected) + { + Check.That(sut.InterpretAsUtf8()).ContainsExactly(expected); + } + + public static TheoryData, IEnumerable> GetTestInterpretAsUtf16Data() => new TheoryData, IEnumerable> + { + { new byte[0], string.Empty }, + { new [] { (byte)'t', (byte)0, (byte)'e', (byte)0, (byte)'s', (byte)0, (byte)'t', (byte)0 }, "test".ToArray() /* https://github.com/tpierrain/NFluent/issues/299 */ } + }; + + [Theory] + [MemberData(nameof(GetTestInterpretAsUtf16Data))] + public void TestInterpretAsUtf16(IEnumerable sut, IEnumerable expected) + { + Check.That(sut.InterpretAsUtf16()).ContainsExactly(expected); + } + + public static TheoryData, float> GetTestCalculatePrintableDataThresholdData() => new TheoryData, float> + { + { new char[0], 0.0f }, + { new [] { '\0' }, 0.0f }, + { new [] { 'a' }, 1.0f }, + { new [] { '\0', 'a' }, 0.0f }, + { new [] { 'a', '\0' }, 0.5f }, + { new [] { '\0', 'a', 'a' }, 0.0f }, + { new [] { 'a', 'a', '\0' }, 2 / 3.0f }, + { new [] { 'a', 'a', '\0', '\0' }, 0.5f }, + { new [] { 'a', 'a', '\0', '\0', '\0' }, 2 / 5.0f } + }; + + [Theory] + [MemberData(nameof(GetTestCalculatePrintableDataThresholdData))] + public void TestCalculatePrintableDataThreshold(IEnumerable sut, float expected) + { + Check.That(sut.CalculatePrintableDataThreshold()).IsCloseTo(expected, 0.001); + } + + [Theory] + [InlineData('a')] + [InlineData('a', 'a')] + [InlineData('a', 'a', 'f')] + [InlineData('#', '+', 'r', '?', 'ß', '%', '&', '§', '_', '0', '/', '(', 'ö')] + public void TestIsPrintableData(params char[] sut) + { + Check.That(sut.IsPrintableData()).IsTrue(); + } + + [Theory] + [InlineData] + [InlineData('a', '\0')] + [InlineData('\0', 'a')] + [InlineData('a', 'a', '\0')] + [InlineData('a', 'a', 'f', '\0')] + [InlineData('a', 'a', '\0', 'f')] + [InlineData('a', '\0', 'a', 'f')] + [InlineData('\0', 'a', 'a', 'f')] + public void TestIsNotPrintableData(params char[] sut) + { + Check.That(sut.IsPrintableData()).IsFalse(); + } + + [Theory] + [InlineData('a', 'a', 'f', '\0')] + [InlineData('1', '2', '3', '4', '5', '6', '7', '8', '\0', '\0')] + [InlineData('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', '\0', '\0', '\0', '\0')] + public void TestIsLikelyPrintableData(params char[] sut) + { + Check.That(sut.IsLikelyPrintableData()).IsTrue(); + } + + [Theory] + [InlineData] + [InlineData('a', '\0')] + [InlineData('\0', 'a')] + [InlineData('a', 'a', '\0')] + [InlineData('a', 'a', '\0', 'f')] + [InlineData('a', 'a', '\0', '\0')] + [InlineData('a', '\0', 'a', 'f')] + public void TestIsNotLikelyPrintableData(params char[] sut) + { + Check.That(sut.IsPrintableData()).IsFalse(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index bb7d9fa0..45bcbb3f 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -71,6 +71,8 @@ + + From da2f39a8862fc0cec1316fc187cd0003288743b2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 13:04:25 +0200 Subject: [PATCH 595/777] The bug is fixed in NFluent 2.6.0. --- ReClass.NET_Tests/Extensions/StringExtensionTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs index 5b41a8ba..74779eb9 100644 --- a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -59,7 +59,7 @@ public void TestLimitLengthThrows() public static TheoryData, IEnumerable> GetTestInterpretAsUtf8Data() => new TheoryData, IEnumerable> { { new byte[0], string.Empty }, - { new [] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }, "test".ToArray() /* https://github.com/tpierrain/NFluent/issues/299 */ } + { new [] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }, "test" } }; [Theory] @@ -72,7 +72,7 @@ public void TestInterpretAsUtf8(IEnumerable sut, IEnumerable expecte public static TheoryData, IEnumerable> GetTestInterpretAsUtf16Data() => new TheoryData, IEnumerable> { { new byte[0], string.Empty }, - { new [] { (byte)'t', (byte)0, (byte)'e', (byte)0, (byte)'s', (byte)0, (byte)'t', (byte)0 }, "test".ToArray() /* https://github.com/tpierrain/NFluent/issues/299 */ } + { new [] { (byte)'t', (byte)0, (byte)'e', (byte)0, (byte)'s', (byte)0, (byte)'t', (byte)0 }, "test" } }; [Theory] From 7cdcd7b3d6ca4585bd6f0b137cd71a9b14f131ea Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 13:46:36 +0200 Subject: [PATCH 596/777] Removed unused methods. --- ReClass.NET/Extensions/LinqExtensions.cs | 48 ------------------------ 1 file changed, 48 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 99aade64..c623d8ae 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -8,54 +8,6 @@ namespace ReClassNET.Extensions { public static class LinqExtension { - public static TResult Max(this IEnumerable source, Func selector, IComparer comparer) - { - comparer = comparer ?? Comparer.Default; - - using (var it = source.GetEnumerator()) - { - if (!it.MoveNext()) - { - throw new InvalidOperationException(); - } - - var max = selector(it.Current); - while (it.MoveNext()) - { - var current = selector(it.Current); - if (comparer.Compare(current, max) > 0) - { - max = current; - } - } - return max; - } - } - - public static TResult Min(this IEnumerable source, Func selector, IComparer comparer) - { - comparer = comparer ?? Comparer.Default; - - using (var it = source.GetEnumerator()) - { - if (!it.MoveNext()) - { - throw new InvalidOperationException(); - } - - var min = selector(it.Current); - while (it.MoveNext()) - { - var current = selector(it.Current); - if (comparer.Compare(current, min) < 0) - { - min = current; - } - } - return min; - } - } - [DebuggerStepThrough] public static bool None(this IEnumerable source) { From 2ef1863ce6d7cf54a3cd61cf689f13abbd4fe2b0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 13:48:08 +0200 Subject: [PATCH 597/777] Removed SkipUntil method. Use better fitting name for TakeUntil method. --- ReClass.NET/Extensions/LinqExtensions.cs | 27 ++---------------------- ReClass.NET/UI/MemoryViewControl.cs | 7 +++--- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index c623d8ae..57b64a47 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -87,30 +87,7 @@ public static IEnumerable Traverse(this IEnumerable s } [DebuggerStepThrough] - public static IEnumerable SkipUntil(this IEnumerable source, Func predicate) - { - Contract.Requires(source != null); - Contract.Requires(predicate != null); - Contract.Ensures(Contract.Result>() != null); - - using (var iterator = source.GetEnumerator()) - { - while (iterator.MoveNext()) - { - if (predicate(iterator.Current)) - { - break; - } - } - while (iterator.MoveNext()) - { - yield return iterator.Current; - } - } - } - - [DebuggerStepThrough] - public static IEnumerable TakeUntil(this IEnumerable source, Func predicate) + public static IEnumerable TakeWhileInclusive(this IEnumerable source, Func predicate) { Contract.Requires(source != null); Contract.Requires(predicate != null); @@ -120,7 +97,7 @@ public static IEnumerable TakeUntil(this IEnumerable { yield return item; - if (predicate(item)) + if (!predicate(item)) { yield break; } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index ead9e1f1..56fd3944 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -314,7 +314,7 @@ protected override void OnMouseClick(MouseEventArgs e) var containerNode = selectedNode.GetParentContainer(); foreach (var spot in containerNode.Nodes .SkipWhile(n => n != first.Node) - .TakeUntil(n => n == last.Node) + .TakeWhileInclusive(n => n != last.Node) .Select(n => new HotSpot { Address = (IntPtr)(containerNode.Offset + n.Offset), @@ -557,7 +557,8 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) if (key == Keys.Down) { var temp = query - .SkipUntil(h => h.Node == selectionCaret.Node) + .SkipWhile(h => h.Node != selectionCaret.Node) + .Skip(1) .ToList(); toSelect = temp.FirstOrDefault(); @@ -593,7 +594,7 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) var containerNode = toSelect.Node.GetParentContainer(); foreach (var spot in containerNode.Nodes .SkipWhile(n => n != first.Node) - .TakeUntil(n => n == last.Node) + .TakeWhileInclusive(n => n != last.Node) .Select(n => new HotSpot { Address = (IntPtr)(containerNode.Offset + n.Offset), From 8c1e60db99b24d13875a0ee27bf85cfe7f44c957 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 15:41:11 +0200 Subject: [PATCH 598/777] Throw if sequence is empty. --- ReClass.NET/Extensions/LinqExtensions.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index 57b64a47..a36149ff 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -163,6 +163,12 @@ public static TSource PredicateOrFirst(this IEnumerable source first = false; } } + + if (first) + { + throw new InvalidOperationException("Sequence contains no elements"); + } + return result; } From 8bd76320683b329de6a3808b6fd8665685fd0f1c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 15:41:42 +0200 Subject: [PATCH 599/777] Added more tests. --- .../Extensions/LinqExtensionTests.cs | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs index 7fb1919f..386e07ed 100644 --- a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs +++ b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs @@ -75,10 +75,10 @@ public void TestFindIndex(IEnumerable sut, int item, int expected) public static TheoryData> GetTestForEachData => new TheoryData> { - { Enumerable.Empty() }, - { Enumerable.Repeat(0, 1) }, - { Enumerable.Repeat(0, 2) }, - { Enumerable.Repeat(0, 10) } + Enumerable.Empty(), + Enumerable.Repeat(0, 1), + Enumerable.Repeat(0, 2), + Enumerable.Repeat(0, 10) }; [Theory] @@ -127,5 +127,74 @@ public void TestIsEquivalentTo(IEnumerable sut, IEnumerable other, boo { Check.That(sut.IsEquivalentTo(other)).IsEqualTo(expected); } + + public static TheoryData, Func, IEnumerable> GetTestTakeWhileInclusiveData => new TheoryData, Func, IEnumerable> + { + { Enumerable.Empty(), i => false, Enumerable.Empty() }, + { new [] { 1 }, i => false, new [] { 1 } }, + { new [] { 1 }, i => true, new [] { 1 } }, + { new [] { 1, 1 }, i => false, new [] { 1 } }, + { new [] { 1, 1 }, i => true, new [] { 1, 1 } }, + { new [] { 1, 2, 3, 4 }, i => i != 2, new [] { 1, 2 } }, + { new [] { 1, 2, 3, 4 }, i => i != 3, new [] { 1, 2, 3 } }, + { new [] { 4, 3, 2, 1 }, i => false, new [] { 4 } } + }; + + [Theory] + [MemberData(nameof(GetTestTakeWhileInclusiveData))] + public void TestTakeWhileInclusive(IEnumerable sut, Func predicate, IEnumerable expected) + { + Check.That(sut.TakeWhileInclusive(predicate)).IsEquivalentTo(expected); + } + + public static TheoryData, Func, IEnumerable>> GetTestGroupWhileData => new TheoryData, Func, IEnumerable>> + { + { Enumerable.Empty(), (x, y) => false, Enumerable.Empty>() }, + { new [] { 1, 2, 3 }, (x, y) => x == y, new [] { new[] { 1 }, new[] { 2 }, new[] { 3 } } }, + { new [] { 1, 1, 2, 3, 3, 4 }, (x, y) => x == y, new [] { new[] { 1, 1 }, new[] { 2 }, new[] { 3, 3 }, new[] { 4 } } }, + { new [] { 1, 1, 2, 3, 3, 4 }, (x, y) => x != y, new [] { new[] { 1 }, new[] { 1, 2, 3 }, new[] { 3, 4 } } } + }; + + [Theory] + [MemberData(nameof(GetTestGroupWhileData))] + public void TestGroupWhile(IEnumerable sut, Func predicate, IEnumerable> expected) + { + using (var expectedIt = expected.GetEnumerator()) + { + using (var groupIt = sut.GroupWhile(predicate).GetEnumerator()) + { + while (groupIt.MoveNext()) + { + Check.That(expectedIt.MoveNext()).IsTrue(); + + Check.That(groupIt.Current).IsEquivalentTo(expectedIt.Current); + } + } + + Check.That(expectedIt.MoveNext()).IsFalse(); + } + } + + public static TheoryData, Func, int> GetTestPredicateOrFirstData => new TheoryData, Func, int> + { + { new [] { 1 }, i => false, 1 }, + { new [] { 1 }, i => true, 1 }, + { new [] { 1, 2, 3, 4 }, i => i == 2, 2 }, + { new [] { 1, 2, 3, 4 }, i => i == 4, 4 }, + { new [] { 1, 2, 3, 4 }, i => i == 5, 1 } + }; + + [Theory] + [MemberData(nameof(GetTestPredicateOrFirstData))] + public void TestPredicateOrFirst(IEnumerable sut, Func predicate, int expected) + { + Check.That(sut.PredicateOrFirst(predicate)).IsEqualTo(expected); + } + + [Fact] + public void TestPredicateOrFirstThrows() + { + Check.ThatCode(() => Enumerable.Empty().PredicateOrFirst(i => true)).Throws(); + } } } From abfdeb2c53a5e635ba1eedb3e9bd2de0bc018c00 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 18:49:23 +0200 Subject: [PATCH 600/777] Use simpler test. --- .../Extensions/LinqExtensionTests.cs | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs index 386e07ed..97448aef 100644 --- a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs +++ b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs @@ -73,24 +73,16 @@ public void TestFindIndex(IEnumerable sut, int item, int expected) Check.That(sut.FindIndex(i => i == item)).IsEqualTo(expected); } - public static TheoryData> GetTestForEachData => new TheoryData> - { - Enumerable.Empty(), - Enumerable.Repeat(0, 1), - Enumerable.Repeat(0, 2), - Enumerable.Repeat(0, 10) - }; - [Theory] - [MemberData(nameof(GetTestForEachData))] - public void TestForEach(IEnumerable sut) + [InlineData(0)] + [InlineData(1)] + [InlineData(10)] + public void TestForEach(int expected) { - var sutCpy = sut.ToList(); - var counter = 0; - sutCpy.ForEach(_ => counter++); + Enumerable.Repeat(0, expected).ForEach(_ => ++counter); - Check.That(counter).IsEqualTo(sutCpy.Count); + Check.That(counter).IsEqualTo(expected); } public static TheoryData, Func, IEnumerable> GetTestDistinctByData => new TheoryData, Func, IEnumerable> From 65b3fe80bb1c489698c41cab3abcd58c01210abb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 3 May 2019 19:51:00 +0200 Subject: [PATCH 601/777] Added test. --- ReClass.NET/Extensions/LinqExtensions.cs | 8 ++--- .../Extensions/LinqExtensionTests.cs | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/LinqExtensions.cs index a36149ff..22966d63 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/LinqExtensions.cs @@ -72,16 +72,16 @@ public static IEnumerable Traverse(this IEnumerable s Contract.Requires(childSelector != null); Contract.Ensures(Contract.Result>() != null); - var stack = new Stack(source); - while (stack.Any()) + var queue = new Queue(source); + while (queue.Count > 0) { - var next = stack.Pop(); + var next = queue.Dequeue(); yield return next; foreach (var child in childSelector(next)) { - stack.Push(child); + queue.Enqueue(child); } } } diff --git a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs index 97448aef..cb420f5d 100644 --- a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs +++ b/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs @@ -188,5 +188,38 @@ public void TestPredicateOrFirstThrows() { Check.ThatCode(() => Enumerable.Empty().PredicateOrFirst(i => true)).Throws(); } + + public class Traversable + { + public IList Children { get; } = new List(); + } + + [Fact] + public void TestTraverse() + { + var traversable = new Traversable(); + var child1 = new Traversable(); + child1.Children.Add(new Traversable()); + var child2 = new Traversable(); + child2.Children.Add(new Traversable()); + child2.Children.Add(new Traversable()); + var child3 = new Traversable(); + child3.Children.Add(new Traversable()); + child3.Children.Add(new Traversable()); + child3.Children.Add(new Traversable()); + traversable.Children.Add(child1); + traversable.Children.Add(child2); + traversable.Children.Add(child3); + + var expected = new[] { traversable } + .Append(child1) + .Append(child2) + .Append(child3) + .Concat(child1.Children) + .Concat(child2.Children) + .Concat(child3.Children); + + Check.That(new[] { traversable }.Traverse(t => t.Children)).ContainsExactly(expected); + } } } From 3cfbf185d714e24df55f6f9f8a4c36dd5d881a33 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 May 2019 16:06:15 +0200 Subject: [PATCH 602/777] Changed method name. --- ReClass.NET/Extensions/RichTextBoxExtensions.cs | 4 ++-- ReClass.NET/Forms/CodeForm.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Extensions/RichTextBoxExtensions.cs b/ReClass.NET/Extensions/RichTextBoxExtensions.cs index 19f8fe20..634c4909 100644 --- a/ReClass.NET/Extensions/RichTextBoxExtensions.cs +++ b/ReClass.NET/Extensions/RichTextBoxExtensions.cs @@ -7,7 +7,7 @@ namespace ReClassNET.Extensions { public static class RichTextBoxExtension { - public static void SetInnerPadding(this TextBoxBase textBox, int left, int top, int right, int bottom) + public static void SetInnerMargin(this TextBoxBase textBox, int left, int top, int right, int bottom) { var rect = textBox.GetFormattingRect(); @@ -37,7 +37,7 @@ public RECT(Rectangle r) } } - [DllImport("User32.dll", CharSet = CharSet.Auto)] + [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, ref RECT rect); [DllImport("user32.dll", CharSet = CharSet.Auto)] diff --git a/ReClass.NET/Forms/CodeForm.cs b/ReClass.NET/Forms/CodeForm.cs index 8e94a4e3..f84d3f0e 100644 --- a/ReClass.NET/Forms/CodeForm.cs +++ b/ReClass.NET/Forms/CodeForm.cs @@ -27,7 +27,7 @@ public CodeForm(ICodeGenerator generator, IReadOnlyList classes, IRea InitializeComponent(); - codeRichTextBox.SetInnerPadding(5, 5, 5, 5); + codeRichTextBox.SetInnerMargin(5, 5, 5, 5); var code = generator.GenerateCode(classes, enums, logger); From 94da570cabbfcfa2c70a6a419ca123246f85f605 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 May 2019 16:06:55 +0200 Subject: [PATCH 603/777] Removed extension. --- ReClass.NET/Extensions/SizeExtensions.cs | 12 ------------ ReClass.NET/Nodes/ClassNode.cs | 9 +++++++-- ReClass.NET/ReClass.NET.csproj | 1 - 3 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 ReClass.NET/Extensions/SizeExtensions.cs diff --git a/ReClass.NET/Extensions/SizeExtensions.cs b/ReClass.NET/Extensions/SizeExtensions.cs deleted file mode 100644 index cc62726e..00000000 --- a/ReClass.NET/Extensions/SizeExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Drawing; - -namespace ReClassNET.Extensions -{ - public static class SizeExtension - { - public static Size Extend(this Size size, int width, int height) - { - return new Size(size.Width + width, size.Height + height); - } - } -} diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 5e6b0cbe..a0642a49 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -138,12 +138,17 @@ Size AggregateNodeSizes(Size baseSize, Size newSize) return new Size(Math.Max(baseSize.Width, newSize.Width), baseSize.Height + newSize.Height); } + Size ExtendWidth(Size baseSize, int width) + { + return new Size(baseSize.Width + width, baseSize.Height); + } + // Draw the node if it is in the visible area. if (view.ClientArea.Contains(tx, y)) { var innerSize = node.Draw(nv, tx, y); - size = AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); + size = AggregateNodeSizes(size, ExtendWidth(innerSize, childOffset)); y += innerSize.Height; } @@ -158,7 +163,7 @@ Size AggregateNodeSizes(Size baseSize, Size newSize) // then draw the node... var innerSize = node.Draw(nv, tx, y); - size = AggregateNodeSizes(size, innerSize.Extend(childOffset, 0)); + size = AggregateNodeSizes(size, ExtendWidth(innerSize, childOffset)); y += innerSize.Height; } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 4f324a92..fc40bc7e 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -391,7 +391,6 @@ - From 8637de556a3beb0a13c49fa9514cd1ab7a3fb2f1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 May 2019 16:34:53 +0200 Subject: [PATCH 604/777] Added tests for StringBuilderExtension and StringReaderExtension. --- .../Extensions/StringBuilderExtensionTest.cs | 31 +++++++++++++++++++ .../Extensions/StringReaderExtensionTest.cs | 31 +++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 2 ++ 3 files changed, 64 insertions(+) create mode 100644 ReClass.NET_Tests/Extensions/StringBuilderExtensionTest.cs create mode 100644 ReClass.NET_Tests/Extensions/StringReaderExtensionTest.cs diff --git a/ReClass.NET_Tests/Extensions/StringBuilderExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringBuilderExtensionTest.cs new file mode 100644 index 00000000..538f680a --- /dev/null +++ b/ReClass.NET_Tests/Extensions/StringBuilderExtensionTest.cs @@ -0,0 +1,31 @@ +using System.Text; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class StringBuilderExtensionTest + { + [Fact] + public void TestPrependChar() + { + var sut = new StringBuilder("test"); + sut.Prepend('x'); + + Check.That(sut.ToString()).IsEqualTo("xtest"); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("test")] + public void TestPrependString(string value) + { + var sut = new StringBuilder("test"); + sut.Prepend(value); + + Check.That(sut.ToString()).IsEqualTo(value + "test"); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/StringReaderExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringReaderExtensionTest.cs new file mode 100644 index 00000000..6933f951 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/StringReaderExtensionTest.cs @@ -0,0 +1,31 @@ +using System.IO; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class StringReaderExtensionTest + { + [Theory] + [InlineData("", -1)] + [InlineData(" ", -1)] + [InlineData("\t", -1)] + [InlineData("\r", -1)] + [InlineData("\n", -1)] + [InlineData("x", (int)'x')] + [InlineData("x ", (int)'x')] + [InlineData(" x", (int)'x')] + [InlineData(" x", (int)'x')] + [InlineData("\tx ", (int)'x')] + [InlineData("\rx ", (int)'x')] + [InlineData("\nx ", (int)'x')] + public void TestReadSkipWhitespaces(string input, int expected) + { + using (var sut = new StringReader(input)) + { + Check.That(sut.ReadSkipWhitespaces()).IsEqualTo(expected); + } + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 45bcbb3f..2555f076 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -72,7 +72,9 @@ + + From 3de551c197972c1bb61c51b576df1bc073a4e010 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 May 2019 17:44:04 +0200 Subject: [PATCH 605/777] Refactored extensions. Added tests. --- ReClass.NET/Extensions/ByteExtension.cs | 21 ++++ ReClass.NET/Extensions/ColorExtensions.cs | 13 ++- ReClass.NET/Extensions/Extensions.cs | 95 ------------------- ReClass.NET/Extensions/ListExtension.cs | 49 ++++++++++ ReClass.NET/Extensions/PointExtension.cs | 23 +++++ ReClass.NET/Memory/RemoteProcess.cs | 6 +- ReClass.NET/ReClass.NET.csproj | 4 +- ReClass.NET/UI/MemoryViewControl.cs | 6 +- .../Extensions/ByteExtensionTest.cs | 28 ++++++ .../Extensions/ListExtensionTest.cs | 24 +++++ .../Extensions/PointExtensionTest.cs | 25 +++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 3 + 12 files changed, 195 insertions(+), 102 deletions(-) create mode 100644 ReClass.NET/Extensions/ByteExtension.cs delete mode 100644 ReClass.NET/Extensions/Extensions.cs create mode 100644 ReClass.NET/Extensions/ListExtension.cs create mode 100644 ReClass.NET/Extensions/PointExtension.cs create mode 100644 ReClass.NET_Tests/Extensions/ByteExtensionTest.cs create mode 100644 ReClass.NET_Tests/Extensions/ListExtensionTest.cs create mode 100644 ReClass.NET_Tests/Extensions/PointExtensionTest.cs diff --git a/ReClass.NET/Extensions/ByteExtension.cs b/ReClass.NET/Extensions/ByteExtension.cs new file mode 100644 index 00000000..1ed5035d --- /dev/null +++ b/ReClass.NET/Extensions/ByteExtension.cs @@ -0,0 +1,21 @@ +using System; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace ReClassNET.Extensions +{ + public static class ByteExtension + { + /// + /// Sets every element in the array to zero. + /// + /// + [DebuggerStepThrough] + public static void FillWithZero(this byte[] array) + { + Contract.Requires(array != null); + + Array.Clear(array, 0, array.Length); + } + } +} diff --git a/ReClass.NET/Extensions/ColorExtensions.cs b/ReClass.NET/Extensions/ColorExtensions.cs index c8d8edd1..c28c0937 100644 --- a/ReClass.NET/Extensions/ColorExtensions.cs +++ b/ReClass.NET/Extensions/ColorExtensions.cs @@ -1,9 +1,20 @@ -using System.Drawing; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Drawing; namespace ReClassNET.Extensions { public static class ExtensionColor { + [Pure] + [DebuggerStepThrough] + public static int ToRgb(this Color color) + { + return 0xFFFFFF & color.ToArgb(); + } + + [Pure] + [DebuggerStepThrough] public static Color Invert(this Color color) { return Color.FromArgb(color.A, 255 - color.R, 255 - color.G, 255 - color.B); diff --git a/ReClass.NET/Extensions/Extensions.cs b/ReClass.NET/Extensions/Extensions.cs deleted file mode 100644 index ef0ded0b..00000000 --- a/ReClass.NET/Extensions/Extensions.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.Contracts; -using System.Drawing; -using System.Linq; -using ReClassNET.Nodes; - -namespace ReClassNET.Extensions -{ - public static class Extensions - { - [Pure] - [DebuggerStepThrough] - public static int ToRgb(this Color color) - { - return 0xFFFFFF & color.ToArgb(); - } - - [DebuggerStepThrough] - public static void FillWithZero(this byte[] b) - { - Contract.Requires(b != null); - - for (var i = 0; i < b.Length; ++i) - { - b[i] = 0; - } - } - - [Pure] - [DebuggerStepThrough] - public static Point OffsetEx(this Point p, int x, int y) - { - var temp = p; - temp.Offset(x, y); - return temp; - } - - public static IEnumerable Descendants(this BaseNode root) - { - Contract.Requires(root != null); - - var nodes = new Stack(); - nodes.Push(root); - while (nodes.Any()) - { - var node = nodes.Pop(); - yield return node; - - if (node is ClassNode classNode) - { - foreach (var child in classNode.Nodes) - { - nodes.Push(child); - } - } - } - } - - #region List - - [DebuggerStepThrough] - public static T BinaryFind(this IList source, Func comparer) - { - Contract.Requires(source != null); - Contract.Requires(comparer != null); - - var lo = 0; - var hi = source.Count - 1; - - while (lo <= hi) - { - var median = lo + (hi - lo >> 1); - var num = comparer(source[median]); - if (num == 0) - { - return source[median]; - } - if (num > 0) - { - lo = median + 1; - } - else - { - hi = median - 1; - } - } - - return default(T); - } - - #endregion - } -} diff --git a/ReClass.NET/Extensions/ListExtension.cs b/ReClass.NET/Extensions/ListExtension.cs new file mode 100644 index 00000000..cad4b572 --- /dev/null +++ b/ReClass.NET/Extensions/ListExtension.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace ReClassNET.Extensions +{ + public static class ListExtension + { + /// + /// Searches a range of elements in the sorted list for an element using the specified comparer and returns the zero-based index of the element. + /// + /// + /// + /// The comparer to use + /// The zero-based index in the sorted list, if an item is found; otherwise, a negative number that is the bitwise complement of the index of the next element that is larger or, if there is no larger element, the bitwise complement of . + [Pure] + [DebuggerStepThrough] + public static int BinarySearch(this IList source, Func comparer) + { + Contract.Requires(source != null); + Contract.Requires(comparer != null); + + var lo = 0; + var hi = source.Count - 1; + + while (lo <= hi) + { + var i = lo + (hi - lo >> 1); + + var order = comparer(source[i]); + if (order == 0) + { + return i; + } + if (order > 0) + { + lo = i + 1; + } + else + { + hi = i - 1; + } + } + + return ~lo; + } + } +} diff --git a/ReClass.NET/Extensions/PointExtension.cs b/ReClass.NET/Extensions/PointExtension.cs new file mode 100644 index 00000000..a43fa48f --- /dev/null +++ b/ReClass.NET/Extensions/PointExtension.cs @@ -0,0 +1,23 @@ +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Drawing; + +namespace ReClassNET.Extensions +{ + public static class PointExtension + { + /// + /// Creates a new point which is relocated with the given offsets. + /// + /// + /// The offset in x direction. + /// The offset in y direction. + /// The relocated point. + [Pure] + [DebuggerStepThrough] + public static Point Relocate(this Point point, int offsetX, int offsetY) + { + return new Point(point.X + offsetX, point.Y + offsetY); + } + } +} diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 1bbbd283..3c04c8fa 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -514,7 +514,8 @@ public Section GetSectionToPointer(IntPtr address) { lock (sections) { - return sections.BinaryFind(s => address.CompareToRange(s.Start, s.End)); + var index = sections.BinarySearch(s => address.CompareToRange(s.Start, s.End)); + return index < 0 ? null : sections[index]; } } @@ -522,7 +523,8 @@ public Module GetModuleToPointer(IntPtr address) { lock (modules) { - return modules.BinaryFind(m => address.CompareToRange(m.Start, m.End)); + var index = modules.BinarySearch(m => address.CompareToRange(m.Start, m.End)); + return index < 0 ? null : modules[index]; } } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index fc40bc7e..d7a2ba42 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -171,6 +171,9 @@ + + + @@ -408,7 +411,6 @@ SettingsForm.cs - Component diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 56fd3944..c870ea4a 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -457,7 +457,7 @@ protected override void OnMouseHover(EventArgs e) if (selectedNodes.Count > 1) { var memorySize = selectedNodes.Sum(h => h.Node.MemorySize); - nodeInfoToolTip.Show($"{selectedNodes.Count} Nodes selected, {memorySize} bytes", this, toolTipPosition.OffsetEx(16, 16)); + nodeInfoToolTip.Show($"{selectedNodes.Count} Nodes selected, {memorySize} bytes", this, toolTipPosition.Relocate(16, 16)); } else { @@ -469,14 +469,14 @@ protected override void OnMouseHover(EventArgs e) { memoryPreviewPopUp.InitializeMemory(spot.Memory.Process, previewAddress); - memoryPreviewPopUp.Show(this, toolTipPosition.OffsetEx(16, 16)); + memoryPreviewPopUp.Show(this, toolTipPosition.Relocate(16, 16)); } else { var text = spot.Node.GetToolTipText(spot, spot.Memory); if (!string.IsNullOrEmpty(text)) { - nodeInfoToolTip.Show(text, this, toolTipPosition.OffsetEx(16, 16)); + nodeInfoToolTip.Show(text, this, toolTipPosition.Relocate(16, 16)); } } diff --git a/ReClass.NET_Tests/Extensions/ByteExtensionTest.cs b/ReClass.NET_Tests/Extensions/ByteExtensionTest.cs new file mode 100644 index 00000000..e3633864 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/ByteExtensionTest.cs @@ -0,0 +1,28 @@ +using System.Linq; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class ByteExtensionTest + { + public static TheoryData GetTestFillWithZeroData() => new TheoryData + { + new byte[0], + Enumerable.Repeat(1, 1).Select(i => (byte)i).ToArray(), + Enumerable.Repeat(1, 10).Select(i => (byte)i).ToArray(), + Enumerable.Repeat(1, 100).Select(i => (byte)i).ToArray(), + Enumerable.Repeat(1, 1000).Select(i => (byte)i).ToArray() + }; + + [Theory] + [MemberData(nameof(GetTestFillWithZeroData))] + public void TestFillWithZero(byte[] sut) + { + sut.FillWithZero(); + + Check.That(sut.All(b => b == 0)).IsTrue(); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/ListExtensionTest.cs b/ReClass.NET_Tests/Extensions/ListExtensionTest.cs new file mode 100644 index 00000000..377bd2b3 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/ListExtensionTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class ListExtensionTest + { + public static TheoryData, Func, int> GetTestBinarySearchData() => new TheoryData, Func, int> + { + + }; + + public void TestBinarySearch(IList sut, Func comparer, int expected) + { + Check.That(sut.BinarySearch(comparer)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/Extensions/PointExtensionTest.cs b/ReClass.NET_Tests/Extensions/PointExtensionTest.cs new file mode 100644 index 00000000..dc6264d6 --- /dev/null +++ b/ReClass.NET_Tests/Extensions/PointExtensionTest.cs @@ -0,0 +1,25 @@ +using System.Drawing; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class PointExtensionTest + { + public static TheoryData GetTestRelocateData() => new TheoryData + { + { Point.Empty, 0, 0, Point.Empty }, + { Point.Empty, 1, 1, new Point(1, 1) }, + { Point.Empty, -1, -1, new Point(-1, -1) }, + { new Point(-1, -1), 1, 1, Point.Empty }, + }; + + [Theory] + [MemberData(nameof(GetTestRelocateData))] + public void TestRelocate(Point sut, int offsetX, int offsetY, Point expected) + { + Check.That(sut.Relocate(offsetX, offsetY)).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 2555f076..415c5127 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -67,11 +67,14 @@ + + + From 6ff0b3b96cc2cb370239e7d0c7aa7b9d6b8d5205 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 4 May 2019 22:53:46 +0200 Subject: [PATCH 606/777] Fixed pattern parser. Added tests. --- ReClass.NET/MemoryScanner/BytePattern.cs | 57 ++++---- .../MemoryScanner/BytePatternTest.cs | 125 ++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + 3 files changed, 158 insertions(+), 25 deletions(-) create mode 100644 ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index 6f4779a7..64ff463c 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -8,7 +8,7 @@ namespace ReClassNET.MemoryScanner { - public enum PatternFormat + public enum PatternMaskFormat { /// /// Example: AA BB ?? D? ?E FF @@ -17,7 +17,7 @@ public enum PatternFormat /// /// Example: \xAA\xBB\x00\x00\x00\xFF xx???x /// - PatternAndMask + Separated } public class BytePattern @@ -42,7 +42,7 @@ private interface IPatternByte /// /// /// - Tuple ToString(PatternFormat format); + Tuple ToString(PatternMaskFormat format); } private class PatternByte : IPatternByte @@ -128,13 +128,13 @@ public bool Equals(byte b) return false; } - public Tuple ToString(PatternFormat format) + public Tuple ToString(PatternMaskFormat format) { switch (format) { - case PatternFormat.PatternAndMask: + case PatternMaskFormat.Separated: return HasWildcard ? Tuple.Create("\\x00", "?") : Tuple.Create($"\\x{ToByte():X02}", "x"); - case PatternFormat.Combined: + case PatternMaskFormat.Combined: var sb = new StringBuilder(); if (nibble1.IsWildcard) sb.Append('?'); else sb.AppendFormat("{0:X}", nibble1.Value); @@ -146,7 +146,7 @@ public Tuple ToString(PatternFormat format) } } - public override string ToString() => ToString(PatternFormat.Combined).Item1; + public override string ToString() => ToString(PatternMaskFormat.Combined).Item1; } private class SimplePatternByte : IPatternByte @@ -162,13 +162,13 @@ public SimplePatternByte(byte value) public bool Equals(byte b) => value == b; - public Tuple ToString(PatternFormat format) + public Tuple ToString(PatternMaskFormat format) { switch (format) { - case PatternFormat.PatternAndMask: + case PatternMaskFormat.Separated: return Tuple.Create($"\\x{ToByte():X02}", "x"); - case PatternFormat.Combined: + case PatternMaskFormat.Combined: return Tuple.Create($"{ToByte():X02}", (string)null); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); @@ -215,16 +215,23 @@ public static BytePattern Parse(string value) using (var sr = new StringReader(value)) { - var pb = new PatternByte(); - while (pb.TryRead(sr)) + while (true) { - if (!pb.HasWildcard) + var pb = new PatternByte(); + if (pb.TryRead(sr)) { - pattern.pattern.Add(new SimplePatternByte(pb.ToByte())); + if (!pb.HasWildcard) + { + pattern.pattern.Add(new SimplePatternByte(pb.ToByte())); + } + else + { + pattern.pattern.Add(pb); + } } else { - pattern.pattern.Add(pb); + break; } } @@ -259,9 +266,9 @@ public static BytePattern From(IEnumerable> data) { var pattern = new BytePattern(); - foreach (var i in data) + foreach (var (value, isWildcard) in data) { - var pb = i.Item2 ? (IPatternByte)PatternByte.NewWildcardByte() : new SimplePatternByte(i.Item1); + var pb = isWildcard ? (IPatternByte)PatternByte.NewWildcardByte() : new SimplePatternByte(value); pattern.pattern.Add(pb); } @@ -309,32 +316,32 @@ public byte[] ToByteArray() } /// - /// Formats the in the specified . + /// Formats the in the specified . /// /// The format of the pattern. - /// A tuple containing the format. If is not the second item is null. - public Tuple ToString(PatternFormat format) + /// A tuple containing the format. If is not the second item is null. + public Tuple ToString(PatternMaskFormat format) { switch (format) { - case PatternFormat.PatternAndMask: + case PatternMaskFormat.Separated: var sb1 = new StringBuilder(); var sb2 = new StringBuilder(); pattern - .Select(p => p.ToString(PatternFormat.PatternAndMask)) + .Select(p => p.ToString(PatternMaskFormat.Separated)) .ForEach(t => { sb1.Append(t.Item1); sb2.Append(t.Item2); }); return Tuple.Create(sb1.ToString(), sb2.ToString()); - case PatternFormat.Combined: - return Tuple.Create(string.Join(" ", pattern.Select(p => p.ToString(PatternFormat.Combined).Item1)), null); + case PatternMaskFormat.Combined: + return Tuple.Create(string.Join(" ", pattern.Select(p => p.ToString(PatternMaskFormat.Combined).Item1)), null); default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } } - public override string ToString() => ToString(PatternFormat.Combined).Item1; + public override string ToString() => ToString(PatternMaskFormat.Combined).Item1; } } diff --git a/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs b/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs new file mode 100644 index 00000000..bf230f2b --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.MemoryScanner; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner +{ + public class BytePatternTest + { + [Theory] + [InlineData("", 0, false)] + [InlineData("0", 1, true)] + [InlineData("a", 1, true)] + [InlineData("A", 1, true)] + [InlineData("00", 1, false)] + [InlineData("aa", 1, false)] + [InlineData("AA", 1, false)] + [InlineData("0000", 2, false)] + [InlineData("00aa", 2, false)] + [InlineData("00 aa", 2, false)] + [InlineData("00\taa", 2, false)] + [InlineData("?", 1, true)] + [InlineData("??", 1, true)] + [InlineData("????", 2, true)] + [InlineData("?? ??", 2, true)] + [InlineData("a?", 1, true)] + [InlineData("?a", 1, true)] + [InlineData("aa ?a", 2, true)] + [InlineData("aa ?? 00", 3, true)] + public void TestParse(string input, int expectedLength, bool expectedHasWildcards) + { + var sut = BytePattern.Parse(input); + + Check.That(sut.Length).IsEqualTo(expectedLength); + Check.That(sut.HasWildcards).IsEqualTo(expectedHasWildcards); + } + + [Fact] + public void TestParseThrows() + { + Check.ThatCode(() => BytePattern.Parse("aa bb zz")).Throws(); + } + + public static TheoryData, int> GetTestFromByteEnumerationData() => new TheoryData, int> + { + { new byte[0], 0 }, + { new byte[] { 0x00, 0x11, 0xaa }, 3 } + }; + + [Theory] + [MemberData(nameof(GetTestFromByteEnumerationData))] + public void TestFromByteEnumeration(IEnumerable input, int expectedLength) + { + var sut = BytePattern.From(input); + + Check.That(sut.Length).IsEqualTo(expectedLength); + Check.That(sut.HasWildcards).IsFalse(); + } + + public static TheoryData>, int, bool> GetTestFromByteEnumerationWithWildcardsData() => new TheoryData>, int, bool> + { + { new Tuple[0], 0, false }, + { new [] { Tuple.Create((byte)0, false) }, 1, false }, + { new [] { Tuple.Create((byte)0, true) }, 1, true }, + { new [] { Tuple.Create((byte)0xaa, false), Tuple.Create((byte)0, true) }, 2, true } + }; + + [Theory] + [MemberData(nameof(GetTestFromByteEnumerationWithWildcardsData))] + public void TestFromByteEnumerationWithWildcards(IEnumerable> input, int expectedLength, bool expectedHasWildcards) + { + var sut = BytePattern.From(input); + + Check.That(sut.Length).IsEqualTo(expectedLength); + Check.That(sut.HasWildcards).IsEqualTo(expectedHasWildcards); + } + + [Fact] + public void TestToArrayWithWildcardsThrows() + { + var sut = BytePattern.Parse("0?"); + + Check.ThatCode(() => sut.ToByteArray()).Throws(); + } + + [Theory] + [InlineData("")] + [InlineData("00AA", (byte)0x00, (byte)0xAA)] + [InlineData("00 aa bb 99", (byte)0x00, (byte)0xAA, (byte)0xBB, (byte)0x99)] + public void TestToArray(string input, params byte[] expected) + { + var sut = BytePattern.Parse(input); + + Check.That(sut.ToByteArray()).ContainsExactly(expected); + } + + public static TheoryData GetTestToStringData() => new TheoryData + { + { string.Empty, PatternMaskFormat.Separated, string.Empty, string.Empty }, + { string.Empty, PatternMaskFormat.Combined, string.Empty, null }, + { "aa bb 00", PatternMaskFormat.Separated, @"\xAA\xBB\x00", "xxx" }, + { "aa bb 00", PatternMaskFormat.Combined, "AA BB 00", null }, + { "aa ?? 00", PatternMaskFormat.Separated, @"\xAA\x00\x00", "x?x" }, + { "aa ?? 00", PatternMaskFormat.Combined, "AA ?? 00", null }, + { "a? ?? ?0", PatternMaskFormat.Separated, @"\x00\x00\x00", "???" }, + { "a? ?? ?0", PatternMaskFormat.Combined, "A? ?? ?0", null }, + }; + + [Theory] + [MemberData(nameof(GetTestToStringData))] + public void TestToString(string input, PatternMaskFormat format, string expectedPattern, string expectedMask) + { + var sut = BytePattern.Parse(input); + + var (pattern, mask) = sut.ToString(format); + + Check.That(pattern).IsEqualTo(expectedPattern); + Check.That(mask).IsEqualTo(expectedMask); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 415c5127..6189993d 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -78,6 +78,7 @@ + From c4851e48c7761352d273816c2e5f188500cb52a2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 May 2019 12:05:11 +0200 Subject: [PATCH 607/777] Made methods static. --- ReClass.NET/Forms/ProcessInfoForm.cs | 14 ++++++-------- ReClass.NET/Memory/Dumper.cs | 27 ++++++++++----------------- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index 4a126fe4..e3b7cd0f 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -142,7 +142,7 @@ private void createClassAtAddressToolStripMenuItem_Click(object sender, EventArg private void dumpToolStripMenuItem_Click(object sender, EventArgs e) { Func createDialogFn; - Action dumpFn; + Action dumpFn; if (GetToolStripSourceControl(sender) == modulesDataGridView) { @@ -158,9 +158,9 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) InitialDirectory = Path.GetDirectoryName(module.Path) }; - dumpFn = (d, s) => + dumpFn = (reader, stream) => { - d.DumpModule(module, s); + Dumper.DumpModule(reader, module, stream); MessageBox.Show("Module successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); }; @@ -178,9 +178,9 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) FileName = $"Section_{section.Start.ToString("X")}_{section.End.ToString("X")}.dat" }; - dumpFn = (d, s) => + dumpFn = (reader, stream) => { - d.DumpSection(section, s); + Dumper.DumpSection(reader, section, stream); MessageBox.Show("Section successfully dumped.", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information); }; @@ -195,13 +195,11 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) return; } - var dumper = new Dumper(process); - try { using (var stream = sfd.OpenFile()) { - dumpFn(dumper, stream); + dumpFn(process, stream); } } catch (Exception ex) diff --git a/ReClass.NET/Memory/Dumper.cs b/ReClass.NET/Memory/Dumper.cs index 12d76eb7..ba434ae0 100644 --- a/ReClass.NET/Memory/Dumper.cs +++ b/ReClass.NET/Memory/Dumper.cs @@ -4,52 +4,45 @@ namespace ReClassNET.Memory { - public class Dumper + public static class Dumper { - private readonly IRemoteMemoryReader process; - - public Dumper(IRemoteMemoryReader process) - { - Contract.Requires(process != null); - Contract.Ensures(this.process != null); - - this.process = process; - } - /// Dumps a chunk of memory to the given stream. + /// The memory reader to use. /// The begin of the chunk. /// The size of the chunk. /// The stream to dump to. - public void DumpRaw(IntPtr address, int size, Stream stream) + public static void DumpRaw(IRemoteMemoryReader reader, IntPtr address, int size, Stream stream) { Contract.Requires(size >= 0); Contract.Requires(stream != null); - var data = process.ReadRemoteMemory(address, size); + var data = reader.ReadRemoteMemory(address, size); stream.Write(data, 0, data.Length); } /// Dumps a section to the given stream. + /// The memory reader to use. /// The section to dump. /// The stream to dump to. - public void DumpSection(Section section, Stream stream) + public static void DumpSection(IRemoteMemoryReader reader, Section section, Stream stream) { Contract.Requires(section != null); Contract.Requires(stream != null); - DumpRaw(section.Start, section.Size.ToInt32(), stream); + DumpRaw(reader, section.Start, section.Size.ToInt32(), stream); } /// Dumps a module to the given stream. The section headers of the pe header get fixed to build a valid pe file. + /// The memory reader to use. /// The module to dump. /// The stream to dump to. - public void DumpModule(Module module, Stream stream) + public static void DumpModule(IRemoteMemoryReader reader, Module module, Stream stream) { Contract.Requires(module != null); Contract.Requires(stream != null); - var data = process.ReadRemoteMemory(module.Start, module.Size.ToInt32()); + var data = reader.ReadRemoteMemory(module.Start, module.Size.ToInt32()); SimplePeHeader.FixSectionHeaders(data); From 6caaded747ba7da0cfcd5f81d3d5cf23950e8b82 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 May 2019 12:05:46 +0200 Subject: [PATCH 608/777] Use only the interface. --- ReClass.NET/Memory/Disassembler.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Memory/Disassembler.cs b/ReClass.NET/Memory/Disassembler.cs index f62ea7ea..d83dfc97 100644 --- a/ReClass.NET/Memory/Disassembler.cs +++ b/ReClass.NET/Memory/Disassembler.cs @@ -27,7 +27,7 @@ public Disassembler(CoreFunctionsManager coreFunctions) /// The address of the code. /// The length of the code in bytes. /// A list of . - public IReadOnlyList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length) + public IReadOnlyList RemoteDisassembleCode(IRemoteMemoryReader process, IntPtr address, int length) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -41,7 +41,7 @@ public IReadOnlyList RemoteDisassembleCode(RemoteProces /// The length of the code in bytes. /// The maximum number of instructions to disassemble. If is -1, all available instructions get returned. /// A list of . - public IReadOnlyList RemoteDisassembleCode(RemoteProcess process, IntPtr address, int length, int maxInstructions) + public IReadOnlyList RemoteDisassembleCode(IRemoteMemoryReader process, IntPtr address, int length, int maxInstructions) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -89,7 +89,7 @@ public IReadOnlyList DisassembleCode(byte[] data, IntPt /// The address of the code. /// The maximum maxLength of the code. /// A list of which belong to the function. - public IReadOnlyList RemoteDisassembleFunction(RemoteProcess process, IntPtr address, int maxLength) + public IReadOnlyList RemoteDisassembleFunction(IRemoteMemoryReader process, IntPtr address, int maxLength) { Contract.Requires(process != null); Contract.Ensures(Contract.Result>() != null); @@ -141,7 +141,7 @@ public IReadOnlyList DisassembleFunction(byte[] data, I /// The process to read from. /// The address of the code. /// The prior instruction. - public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess process, IntPtr address) + public DisassembledInstruction RemoteGetPreviousInstruction(IRemoteMemoryReader process, IntPtr address) { const int TotalBufferSize = 7 * MaximumInstructionLength; const int BufferShiftSize = 6 * MaximumInstructionLength; @@ -203,7 +203,7 @@ public DisassembledInstruction RemoteGetPreviousInstruction(RemoteProcess proces /// The process to read from. /// The address inside the function. /// The start address of the function (maybe) or if no start address could be found. - public IntPtr RemoteGetFunctionStartAddress(RemoteProcess process, IntPtr address) + public IntPtr RemoteGetFunctionStartAddress(IRemoteMemoryReader process, IntPtr address) { const int BufferLength = 512; From e5c9b913a353f2ce370748160c5e10e31cffd278 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 May 2019 23:06:32 +0200 Subject: [PATCH 609/777] Fixed length calculation. --- ReClass.NET/Memory/MemoryBuffer.cs | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index df4f0176..cfb0b67f 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -151,7 +151,7 @@ public T ReadObject(int offset) where T : struct offset = Offset + offset; if (offset + Marshal.SizeOf(typeof(T)) > data.Length) { - return default(T); + return default; } var handle = GCHandle.Alloc(data, GCHandleType.Pinned); @@ -173,7 +173,7 @@ public sbyte ReadInt8(int offset) offset = Offset + offset; if (offset + sizeof(sbyte) > data.Length) { - return default(sbyte); + return default; } return (sbyte)data[offset]; @@ -189,7 +189,7 @@ public byte ReadUInt8(int offset) offset = Offset + offset; if (offset + sizeof(byte) > data.Length) { - return default(byte); + return default; } return data[offset]; @@ -205,7 +205,7 @@ public short ReadInt16(int offset) offset = Offset + offset; if (offset + sizeof(short) > data.Length) { - return default(short); + return default; } return BitConverter.ToInt16(data, offset); @@ -221,7 +221,7 @@ public ushort ReadUInt16(int offset) offset = Offset + offset; if (offset + sizeof(ushort) > data.Length) { - return default(ushort); + return default; } return BitConverter.ToUInt16(data, offset); @@ -237,7 +237,7 @@ public int ReadInt32(int offset) offset = Offset + offset; if (offset + sizeof(int) > data.Length) { - return default(int); + return default; } return BitConverter.ToInt32(data, offset); @@ -253,7 +253,7 @@ public uint ReadUInt32(int offset) offset = Offset + offset; if (offset + sizeof(uint) > data.Length) { - return default(uint); + return default; } return BitConverter.ToUInt32(data, offset); @@ -269,7 +269,7 @@ public long ReadInt64(int offset) offset = Offset + offset; if (offset + sizeof(long) > data.Length) { - return default(long); + return default; } return BitConverter.ToInt64(data, offset); @@ -285,7 +285,7 @@ public ulong ReadUInt64(int offset) offset = Offset + offset; if (offset + sizeof(ulong) > data.Length) { - return default(ulong); + return default; } return BitConverter.ToUInt64(data, offset); @@ -301,7 +301,7 @@ public float ReadFloat(int offset) offset = Offset + offset; if (offset + sizeof(float) > data.Length) { - return default(float); + return default; } return BitConverter.ToSingle(data, offset); @@ -317,7 +317,7 @@ public double ReadDouble(int offset) offset = Offset + offset; if (offset + sizeof(double) > data.Length) { - return default(double); + return default; } return BitConverter.ToDouble(data, offset); @@ -373,7 +373,12 @@ public string ReadString(Encoding encoding, int offset, int length) if (Offset + offset + length > data.Length) { - length = data.Length - Offset - offset; + length = Math.Max(data.Length - Offset - offset, 0); + } + + if (length <= 0) + { + return string.Empty; } var sb = new StringBuilder(encoding.GetString(data, Offset + offset, length)); From fffb672a6388b0521e5c5091c491c7416586609b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 May 2019 23:07:35 +0200 Subject: [PATCH 610/777] Added some tests. --- ReClass.NET_Tests/Memory/MemoryBufferTest.cs | 144 +++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + 2 files changed, 145 insertions(+) create mode 100644 ReClass.NET_Tests/Memory/MemoryBufferTest.cs diff --git a/ReClass.NET_Tests/Memory/MemoryBufferTest.cs b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs new file mode 100644 index 00000000..25dc9255 --- /dev/null +++ b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs @@ -0,0 +1,144 @@ +using System; +using NFluent; +using ReClassNET.Memory; +using Xunit; + +namespace ReClass.NET_Tests.Memory +{ + public class MemoryBufferTest + { + private static MemoryBuffer CreateFromBytes(params byte[] data) + { + var buffer = new MemoryBuffer(data.Length); + Array.Copy(data, buffer.RawData, data.Length); + return buffer; + } + + public static TheoryData GetTestReadBytesData() => new TheoryData + { + { CreateFromBytes(), 0, 0, new byte[0] }, + { CreateFromBytes(), 0, 4, new byte[] { 0, 0, 0, 0 } }, + { CreateFromBytes(), 10, 4, new byte[] { 0, 0, 0, 0 } }, + { CreateFromBytes(1, 2, 3, 4), 0, 0, new byte[0] }, + { CreateFromBytes(1, 2, 3, 4), 0, 4, new byte[] { 1, 2, 3, 4 } }, + { CreateFromBytes(1, 2, 3, 4), 2, 4, new byte[] { 0, 0, 0, 0 } }, + { CreateFromBytes(1, 2, 3, 4), 10, 4, new byte[] { 0, 0, 0, 0 } }, + { CreateFromBytes(1, 2, 3, 4, 5, 6), 2, 4, new byte[] { 3, 4, 5, 6 } } + }; + + [Theory] + [MemberData(nameof(GetTestReadBytesData))] + public void TestReadBytesReturn(MemoryBuffer sut, int offset, int length, byte[] expected) + { + Check.That(sut.ReadBytes(offset, length)).ContainsExactly(expected); + } + + [Theory] + [MemberData(nameof(GetTestReadBytesData))] + public void TestReadBytesFill(MemoryBuffer sut, int offset, int length, byte[] expected) + { + var data = new byte[length]; + + sut.ReadBytes(offset, data); + + Check.That(data).ContainsExactly(expected); + } + + public static TheoryData GetTestReadUInt8Data() => new TheoryData + { + { CreateFromBytes(), 0, 0, 0 }, + { CreateFromBytes(), 4, 0, 0 }, + { CreateFromBytes(1, 2, 3, 4), 0, 1, 1 }, + { CreateFromBytes(1, 2, 3, 4), 2, 3, 3 }, + { CreateFromBytes(1, 2, 3, 0xFF), 3, -1, 255 } + }; + + [Theory] + [MemberData(nameof(GetTestReadUInt8Data))] + public void TestReadInt8(MemoryBuffer sut, int offset, sbyte expectedSigned, byte expectedUnsigned) + { + Check.That(sut.ReadInt8(offset)).IsEqualTo(expectedSigned); + Check.That(sut.ReadUInt8(offset)).IsEqualTo(expectedUnsigned); + } + + public static TheoryData GetTestReadUInt16Data() => new TheoryData + { + { CreateFromBytes(), 0, 0, 0 }, + { CreateFromBytes(), 4, 0, 0 }, + { CreateFromBytes(1, 2, 3, 4), 0, 0x0201, 0x0201 }, + { CreateFromBytes(1, 2, 3, 4), 2, 0x0403, 0x0403 }, + { CreateFromBytes(1, 2, 3, 0xBF, 0xFF), 3, unchecked((short)0xFFBF), 0xFFBF } + }; + + [Theory] + [MemberData(nameof(GetTestReadUInt16Data))] + public void TestReadInt16(MemoryBuffer sut, int offset, short expectedSigned, ushort expectedUnsigned) + { + Check.That(sut.ReadInt16(offset)).IsEqualTo(expectedSigned); + Check.That(sut.ReadUInt16(offset)).IsEqualTo(expectedUnsigned); + } + + public static TheoryData GetTestReadUInt32Data() => new TheoryData + { + { CreateFromBytes(), 0, 0, 0 }, + { CreateFromBytes(), 4, 0, 0 }, + { CreateFromBytes(1, 2, 3, 4), 0, 0x04030201, 0x04030201 }, + { CreateFromBytes(1, 2, 3, 4, 0xBF, 0xFF), 2, unchecked((int)0xFFBF0403), 0xFFBF0403 } + }; + + [Theory] + [MemberData(nameof(GetTestReadUInt32Data))] + public void TestReadInt32(MemoryBuffer sut, int offset, int expectedSigned, uint expectedUnsigned) + { + Check.That(sut.ReadInt32(offset)).IsEqualTo(expectedSigned); + Check.That(sut.ReadUInt32(offset)).IsEqualTo(expectedUnsigned); + } + + public static TheoryData GetTestReadUInt64Data() => new TheoryData + { + { CreateFromBytes(), 0, 0, 0 }, + { CreateFromBytes(), 4, 0, 0 }, + { CreateFromBytes(1, 2, 3, 4, 5, 6, 7, 8), 0, 0x0807060504030201, 0x0807060504030201 }, + { CreateFromBytes(1, 2, 3, 4, 5, 6, 0xBF, 0xFF, 0xBF, 0xFF), 2, unchecked((long)0xFFBFFFBF06050403), 0xFFBFFFBF06050403 } + }; + + [Theory] + [MemberData(nameof(GetTestReadUInt64Data))] + public void TestReadInt64(MemoryBuffer sut, int offset, long expectedSigned, ulong expectedUnsigned) + { + Check.That(sut.ReadInt64(offset)).IsEqualTo(expectedSigned); + Check.That(sut.ReadUInt64(offset)).IsEqualTo(expectedUnsigned); + } + + public static TheoryData GetTestReadFloatData() => new TheoryData + { + { CreateFromBytes(), 0, 0.0f }, + { CreateFromBytes(), 4, 0.0f }, + { CreateFromBytes(0, 0x40, 0x9A, 0x44), 0, 1234.0f }, + { CreateFromBytes(1, 2, 0, 8, 0x87, 0x45), 2, 4321.0f } + }; + + [Theory] + [MemberData(nameof(GetTestReadFloatData))] + public void TestReadFloat(MemoryBuffer sut, int offset, float expected) + { + Check.That(sut.ReadFloat(offset)).IsCloseTo(expected, 0.0001); + } + + public static TheoryData GetTestReadDoubleData() => new TheoryData + { + { CreateFromBytes(), 0, 0.0 }, + { CreateFromBytes(), 4, 0.0 }, + //409349ba786c2268 + { CreateFromBytes(0x54, 0x74, 0x24, 0x97, 0x1F, 0xE1, 0xB0, 0x40), 0, 4321.1234 }, + { CreateFromBytes(1, 2, 0x68, 0x22, 0x6C, 0x78, 0xBA, 0x49, 0x93, 0x40), 2, 1234.4321 } + }; + + [Theory] + [MemberData(nameof(GetTestReadDoubleData))] + public void TestReadDouble(MemoryBuffer sut, int offset, double expected) + { + Check.That(sut.ReadDouble(offset)).IsCloseTo(expected, 0.0001); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 6189993d..f2314d5b 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -79,6 +79,7 @@ + From bfcfd58d8f3719ca3b8aa6ddc82e2fd747fb5073 Mon Sep 17 00:00:00 2001 From: Robert Blody Date: Mon, 6 May 2019 16:58:05 -0400 Subject: [PATCH 611/777] Addressed Issue #107 Bitfield now starts by LSN 0. --- ReClass.NET/Nodes/BitFieldNode.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 174e811a..df797766 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -161,11 +161,14 @@ public override Size Draw(ViewInfo view, int x, int y) using (var brush = new SolidBrush(view.Settings.ValueColor)) { - view.Context.DrawString("1", view.Font.Font, brush, tx + (bits - 1) * view.Font.Width + 1, y, format); + view.Context.DrawString("0", view.Font.Font, brush, tx + (bits - 1) * view.Font.Width + 1, y, format); for (var i = 8; i <= bits; i += 8) { - view.Context.DrawString(i.ToString(), view.Font.Font, brush, tx + (bits - i) * view.Font.Width, y, format); + if(i < bits) + view.Context.DrawString(i.ToString(), view.Font.Font, brush, tx + (bits - i - 1) * view.Font.Width, y, format); + else + view.Context.DrawString((i-1).ToString(), view.Font.Font, brush, tx + (bits - i) * view.Font.Width, y, format); } } From f202cae93f47e9d58bce23a21ab119cc90eaae16 Mon Sep 17 00:00:00 2001 From: Robert Blody Date: Mon, 6 May 2019 17:45:12 -0400 Subject: [PATCH 612/777] Redesigned Bitfield display. Bitfield display now follows the Windows Calculator bitfield format. --- ReClass.NET/Nodes/BitFieldNode.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index df797766..686f5f16 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -163,12 +163,9 @@ public override Size Draw(ViewInfo view, int x, int y) { view.Context.DrawString("0", view.Font.Font, brush, tx + (bits - 1) * view.Font.Width + 1, y, format); - for (var i = 8; i <= bits; i += 8) + for (var i = 4; i < bits; i += 4) { - if(i < bits) - view.Context.DrawString(i.ToString(), view.Font.Font, brush, tx + (bits - i - 1) * view.Font.Width, y, format); - else - view.Context.DrawString((i-1).ToString(), view.Font.Font, brush, tx + (bits - i) * view.Font.Width, y, format); + view.Context.DrawString(i.ToString(), view.Font.Font, brush, tx + (bits - i - 1) * view.Font.Width, y, format); } } From 3a7404f5e037ae1b53a9fe00923ea8b8d860b106 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 7 May 2019 11:12:38 +0200 Subject: [PATCH 613/777] Added proper equals check for encodings. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 4 ++-- .../DataExchange/Scanner/ReClassScanFile.cs | 3 ++- ReClass.NET/Extensions/EncodingExtensions.cs | 17 ++++++++++++--- ReClass.NET/MemoryScanner/ScanResultStore.cs | 2 +- ReClass.NET/ReClass.NET.csproj | 1 + .../Extensions/EncodingExtensionTest.cs | 21 +++++++++++++++++++ 6 files changed, 41 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 80971e61..ead4bc0d 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -496,11 +496,11 @@ private static BaseNode TransformNode(BaseNode node) BaseNode GetCharacterNodeForEncoding(Encoding encoding) { - if (encoding.Equals(Encoding.Unicode)) + if (encoding.IsSameCodePage(Encoding.Unicode)) { return new Utf16CharacterNode(); } - if (encoding.Equals(Encoding.UTF32)) + if (encoding.IsSameCodePage(Encoding.UTF32)) { return new Utf32CharacterNode(); } diff --git a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs index b86fa626..623c80fb 100644 --- a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs +++ b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Xml.Linq; +using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.MemoryScanner; @@ -152,7 +153,7 @@ public void Save(IEnumerable records, string filePath, ILogger log temp.SetAttributeValue(XmlValueLengthAttribute, r.ValueLength); if (r.ValueType == ScanValueType.String) { - temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding == Encoding.UTF8 ? "UTF8" : r.Encoding == Encoding.Unicode ? "UTF16" : "UTF32"); + temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding.IsSameCodePage(Encoding.UTF8) ? "UTF8" : r.Encoding.IsSameCodePage(Encoding.Unicode) ? "UTF16" : "UTF32"); } } return temp; diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index 94ed21b2..9f522dfa 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -10,11 +10,22 @@ public static class EncodingExtension /// The byte count per character. public static int GuessByteCountPerChar(this Encoding encoding) { - if (encoding.Equals(Encoding.UTF8) || encoding.Equals(Encoding.ASCII)) return 1; - if (encoding.Equals(Encoding.Unicode) || encoding.Equals(Encoding.BigEndianUnicode)) return 2; - if (encoding.Equals(Encoding.UTF32)) return 4; + if (encoding.IsSameCodePage(Encoding.UTF8) || encoding.IsSameCodePage(Encoding.ASCII)) return 1; + if (encoding.IsSameCodePage(Encoding.Unicode) || encoding.IsSameCodePage(Encoding.BigEndianUnicode)) return 2; + if (encoding.IsSameCodePage(Encoding.UTF32)) return 4; throw new NotImplementedException(); } + + /// + /// Checks if the code page of both encodings is equal. + /// + /// + /// + /// + public static bool IsSameCodePage(this Encoding encoding, Encoding other) + { + return encoding.CodePage == other.CodePage; + } } } diff --git a/ReClass.NET/MemoryScanner/ScanResultStore.cs b/ReClass.NET/MemoryScanner/ScanResultStore.cs index 70a03d04..5ddb1a45 100644 --- a/ReClass.NET/MemoryScanner/ScanResultStore.cs +++ b/ReClass.NET/MemoryScanner/ScanResultStore.cs @@ -261,7 +261,7 @@ private static void WriteSearchResult(BinaryWriter bw, ScanResult result) bw.Write(arrayOfBytesSearchResult.Value); break; case StringScanResult stringSearchResult: - bw.Write(stringSearchResult.Encoding == Encoding.UTF8 ? 0 : stringSearchResult.Encoding == Encoding.Unicode ? 1 : 2); + bw.Write(stringSearchResult.Encoding.IsSameCodePage(Encoding.UTF8) ? 0 : stringSearchResult.Encoding.IsSameCodePage(Encoding.Unicode) ? 1 : 2); bw.Write(stringSearchResult.Value); break; } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index d7a2ba42..d19a26a8 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -16,6 +16,7 @@ 0 + latest x86 diff --git a/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs index 12521302..f1c1a1a5 100644 --- a/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs @@ -37,5 +37,26 @@ public void TestSimpleByteCountNotImplemented(Encoding encoding) { Check.ThatCode(encoding.GuessByteCountPerChar).Throws(); } + + public static TheoryData GetTestIsSameCodePageData() => new TheoryData + { + { Encoding.ASCII, Encoding.ASCII, true }, + { Encoding.UTF8, Encoding.UTF8, true }, + { Encoding.Unicode, Encoding.Unicode, true }, + { Encoding.UTF32, Encoding.UTF32, true }, + { Encoding.ASCII, Encoding.UTF8, false }, + { Encoding.ASCII, Encoding.Unicode, false }, + { Encoding.ASCII, Encoding.UTF32, false }, + { Encoding.UTF8, Encoding.UTF32, false }, + { Encoding.Unicode, Encoding.UTF32, false }, + { Encoding.UTF8, Encoding.Unicode, false } + }; + + [Theory] + [MemberData(nameof(GetTestIsSameCodePageData))] + public void TestIsSameCodePage(Encoding sut, Encoding other, bool expected) + { + Check.That(sut.IsSameCodePage(other)).IsEqualTo(expected); + } } } From d7af6033d67a42a55afdfb1938f0c92dcda4c013 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 7 May 2019 11:49:58 +0200 Subject: [PATCH 614/777] Replaced ReadPrintableAsciiString with ReadString and the correct encoding. --- ReClass.NET/Extensions/EncodingExtensions.cs | 2 +- ReClass.NET/Memory/MemoryBuffer.cs | 25 -------------------- ReClass.NET/Nodes/Hex16Node.cs | 2 +- ReClass.NET/Nodes/Hex32Node.cs | 2 +- ReClass.NET/Nodes/Hex64Node.cs | 2 +- ReClass.NET/Nodes/Hex8Node.cs | 2 +- ReClass.NET/Settings.cs | 3 +++ 7 files changed, 8 insertions(+), 30 deletions(-) diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index 9f522dfa..4f9f3bba 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -10,7 +10,7 @@ public static class EncodingExtension /// The byte count per character. public static int GuessByteCountPerChar(this Encoding encoding) { - if (encoding.IsSameCodePage(Encoding.UTF8) || encoding.IsSameCodePage(Encoding.ASCII)) return 1; + if (encoding.IsSameCodePage(Encoding.UTF8) || encoding.CodePage == 1252 /* Windows-1252 */ || encoding.IsSameCodePage(Encoding.ASCII)) return 1; if (encoding.IsSameCodePage(Encoding.Unicode) || encoding.IsSameCodePage(Encoding.BigEndianUnicode)) return 2; if (encoding.IsSameCodePage(Encoding.UTF32)) return 4; diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index cfb0b67f..6da1ce7d 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -339,31 +339,6 @@ public IntPtr ReadIntPtr(int offset) #endregion - public string ReadPrintableAsciiString(int offset, int length) - { - Contract.Requires(offset >= 0); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - if (Offset + offset + length > data.Length) - { - length = Math.Max(data.Length - Offset - offset, 0); - } - - if (length <= 0) - { - return string.Empty; - } - - var sb = new StringBuilder(length); - for (var i = 0; i < length; ++i) - { - var c = (char)data[Offset + offset + i]; - sb.Append(c.IsPrintable() ? c : '.'); - } - return sb.ToString(); - } - public string ReadString(Encoding encoding, int offset, int length) { Contract.Requires(encoding != null); diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index b63fbddc..bd72c878 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -23,7 +23,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 2) + " " : null, 2); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 2) + " " : null, 2); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 0ccfb4d3..50591423 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -33,7 +33,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 4) + " " : null, 4); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 4) + " " : null, 4); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index 82a54782..ef9c909b 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -33,7 +33,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 8) + " " : null, 8); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 8) + " " : null, 8); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index 9319f65d..fdb435e5 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -23,7 +23,7 @@ public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadPrintableAsciiString(Offset, 1) + " " : null, 1); + return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 1) + " " : null, 1); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Settings.cs b/ReClass.NET/Settings.cs index 16421515..49372adf 100644 --- a/ReClass.NET/Settings.cs +++ b/ReClass.NET/Settings.cs @@ -1,4 +1,5 @@ using System.Drawing; +using System.Text; using ReClassNET.Util; namespace ReClassNET @@ -21,6 +22,8 @@ public class Settings public bool HighlightChangedValues { get; set; } = true; + public Encoding RawDataEncoding { get; set; } = Encoding.GetEncoding(1252); /* Windows-1252 */ + // Comment Drawing Settings public bool ShowCommentFloat { get; set; } = true; From b1a45f9f143c54d1c06f91423c6070f3186eb25d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 10:44:34 +0200 Subject: [PATCH 615/777] Split bitfield display in groups. --- ReClass.NET/Nodes/BitFieldNode.cs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 686f5f16..14e25d43 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.Contracts; using System.Drawing; +using System.Text; using ReClassNET.Memory; using ReClassNET.UI; @@ -88,7 +89,7 @@ public BaseNumericNode GetUnderlayingNode() /// Converts the memory value to a bit string. /// The process memory. /// The value converted to a bit string. - private string ConvertValueToBitString(MemoryBuffer memory) + private string ConvertValueToGroupedBitString(MemoryBuffer memory) { Contract.Requires(memory != null); Contract.Ensures(Contract.Result() != null); @@ -109,7 +110,17 @@ private string ConvertValueToBitString(MemoryBuffer memory) str = Convert.ToString(memory.ReadUInt8(Offset), 2); break; } - return str.PadLeft(bits, '0'); + + str = str.PadLeft(bits, '0'); + + var sb = new StringBuilder(str); + + for (var i = bits - 4; i > 0; i -= 4) + { + sb.Insert(i, ' '); + } + + return sb.ToString(); } public override Size Draw(ViewInfo view, int x, int y) @@ -143,7 +154,10 @@ public override Size Draw(ViewInfo view, int x, int y) var rect = new Rectangle(x + i * view.Font.Width, y, view.Font.Width, view.Font.Height); AddHotSpot(view, rect, string.Empty, i, HotSpotType.Edit); } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, ConvertValueToBitString(view.Memory)) + view.Font.Width; + + var value = ConvertValueToGroupedBitString(view.Memory); + + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, value) + view.Font.Width; x += view.Font.Width; @@ -161,11 +175,11 @@ public override Size Draw(ViewInfo view, int x, int y) using (var brush = new SolidBrush(view.Settings.ValueColor)) { - view.Context.DrawString("0", view.Font.Font, brush, tx + (bits - 1) * view.Font.Width + 1, y, format); + var maxCharCount = bits + (bits / 4 - 1) - 1; - for (var i = 4; i < bits; i += 4) + for (int bitCount = 0, padding = 0; bitCount < bits; bitCount += 4, padding += 5) { - view.Context.DrawString(i.ToString(), view.Font.Font, brush, tx + (bits - i - 1) * view.Font.Width, y, format); + view.Context.DrawString(bitCount.ToString(), view.Font.Font, brush, tx + (maxCharCount - padding) * view.Font.Width, y, format); } } From 1608c07761ca2d9f4956cc4fbcb95675bd5a492e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 14:47:11 +0200 Subject: [PATCH 616/777] Use more efficient number to bit string conversion. --- ReClass.NET/Nodes/BitFieldNode.cs | 26 ++---- ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/Util/BitString.cs | 96 ++++++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + ReClass.NET_Tests/Util/BitStringTest.cs | 74 +++++++++++++++++ 5 files changed, 177 insertions(+), 21 deletions(-) create mode 100644 ReClass.NET/Util/BitString.cs create mode 100644 ReClass.NET_Tests/Util/BitStringTest.cs diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 14e25d43..cd97c68c 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics.Contracts; using System.Drawing; -using System.Text; using ReClassNET.Memory; using ReClassNET.UI; +using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -94,33 +94,17 @@ private string ConvertValueToGroupedBitString(MemoryBuffer memory) Contract.Requires(memory != null); Contract.Ensures(Contract.Result() != null); - string str; switch(bits) { case 64: - str = Convert.ToString(memory.ReadInt64(Offset), 2); - break; + return BitString.ToString(memory.ReadInt64(Offset)); case 32: - str = Convert.ToString(memory.ReadInt32(Offset), 2); - break; + return BitString.ToString(memory.ReadInt32(Offset)); case 16: - str = Convert.ToString(memory.ReadInt16(Offset), 2); - break; + return BitString.ToString(memory.ReadInt16(Offset)); default: - str = Convert.ToString(memory.ReadUInt8(Offset), 2); - break; + return BitString.ToString(memory.ReadUInt8(Offset)); } - - str = str.PadLeft(bits, '0'); - - var sb = new StringBuilder(str); - - for (var i = bits - 4; i > 0; i -= 4) - { - sb.Insert(i, ' '); - } - - return sb.ToString(); } public override Size Draw(ViewInfo view, int x, int y) diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index d19a26a8..ceaf1ffd 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -383,6 +383,7 @@ Component + diff --git a/ReClass.NET/Util/BitString.cs b/ReClass.NET/Util/BitString.cs new file mode 100644 index 00000000..3343ed43 --- /dev/null +++ b/ReClass.NET/Util/BitString.cs @@ -0,0 +1,96 @@ +using System; +using System.Text; + +namespace ReClassNET.Util +{ + public static class BitString + { + /// + /// Converts the value to the corresponding bit string. + /// Format: 0000 0000 + /// + /// The value to convert. + /// The corresponding bit string. + public static string ToString(byte value) + { + return AddPaddingAndBuildBlocks(8, Convert.ToString(value, 2)); + } + + /// + /// Converts the value to the corresponding bit string. + /// Format: 0000 0000 0000 0000 + /// + /// The value to convert. + /// The corresponding bit string. + public static string ToString(short value) + { + return AddPaddingAndBuildBlocks(16, Convert.ToString(value, 2)); + } + + /// + /// Converts the value to the corresponding bit string. + /// Format: 0000 0000 0000 0000 0000 0000 0000 0000 + /// + /// The value to convert. + /// The corresponding bit string. + public static string ToString(int value) + { + return AddPaddingAndBuildBlocks(32, Convert.ToString(value, 2)); + } + + /// + /// Converts the value to the corresponding bit string. + /// Format: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + /// + /// The value to convert. + /// The corresponding bit string. + public static string ToString(long value) + { + return AddPaddingAndBuildBlocks(64, Convert.ToString(value, 2)); + } + + private static string AddPaddingAndBuildBlocks(int bits, string value) + { + var sb = new StringBuilder(bits); + + var padding = bits - value.Length; + + // Add full padding blocks. + while (padding > 4) + { + sb.Append("0000 "); + padding -= 4; + } + + // Add only a part of a block. + if (padding > 0) + { + // {padding} 0 bits + for (var i = 0; i < padding; ++i) + { + sb.Append('0'); + } + + // and {4 - padding} bits of the value. + sb.Append(value, 0, 4 - padding); + + if (value.Length > padding) + { + sb.Append(' '); + } + } + + // Add all remaining blocks. + for (var i = padding == 0 ? 0 : 4 - padding; i < value.Length; i += 4) + { + sb.Append(value, i, 4); + if (i < value.Length - 4) + { + sb.Append(' '); + } + } + + return sb.ToString(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index f2314d5b..d1b1c359 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -81,6 +81,7 @@ + diff --git a/ReClass.NET_Tests/Util/BitStringTest.cs b/ReClass.NET_Tests/Util/BitStringTest.cs new file mode 100644 index 00000000..e078106e --- /dev/null +++ b/ReClass.NET_Tests/Util/BitStringTest.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NFluent; +using ReClassNET.Util; +using Xunit; + +namespace ReClass.NET_Tests.Util +{ + public class BitStringTest + { + [Theory] + [InlineData(0, "0000 0000")] + [InlineData(1, "0000 0001")] + [InlineData(127, "0111 1111")] + [InlineData(128, "1000 0000")] + [InlineData(255, "1111 1111")] + [InlineData(0b1010_1010, "1010 1010")] + public void TestToStringByte(byte value, string expected) + { + Check.That(BitString.ToString(value)).IsEqualTo(expected); + } + + [Theory] + [InlineData(0, "0000 0000 0000 0000")] + [InlineData(1, "0000 0000 0000 0001")] + [InlineData(127, "0000 0000 0111 1111")] + [InlineData(128, "0000 0000 1000 0000")] + [InlineData(255, "0000 0000 1111 1111")] + [InlineData(short.MaxValue, "0111 1111 1111 1111")] + [InlineData(short.MinValue, "1000 0000 0000 0000")] + [InlineData(unchecked((short)0b1010_1010_1010_1010), "1010 1010 1010 1010")] + public void TestToStringShort(short value, string expected) + { + Check.That(BitString.ToString(value)).IsEqualTo(expected); + } + + [Theory] + [InlineData(0, "0000 0000 0000 0000 0000 0000 0000 0000")] + [InlineData(1, "0000 0000 0000 0000 0000 0000 0000 0001")] + [InlineData(127, "0000 0000 0000 0000 0000 0000 0111 1111")] + [InlineData(128, "0000 0000 0000 0000 0000 0000 1000 0000")] + [InlineData(255, "0000 0000 0000 0000 0000 0000 1111 1111")] + [InlineData(short.MaxValue, "0000 0000 0000 0000 0111 1111 1111 1111")] + [InlineData(short.MinValue, "1111 1111 1111 1111 1000 0000 0000 0000")] + [InlineData(int.MaxValue, "0111 1111 1111 1111 1111 1111 1111 1111")] + [InlineData(int.MinValue, "1000 0000 0000 0000 0000 0000 0000 0000")] + [InlineData(unchecked((int)0b1010_1010_1010_1010_1010_1010_1010_1010), "1010 1010 1010 1010 1010 1010 1010 1010")] + public void TestToStringInt(int value, string expected) + { + Check.That(BitString.ToString(value)).IsEqualTo(expected); + } + + [Theory] + [InlineData(0, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000")] + [InlineData(1, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001")] + [InlineData(127, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 1111")] + [InlineData(128, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 0000")] + [InlineData(255, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111")] + [InlineData(short.MaxValue, "0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 1111 1111 1111")] + [InlineData(short.MinValue, "1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000 0000 0000 0000")] + [InlineData(int.MaxValue, "0000 0000 0000 0000 0000 0000 0000 0000 0111 1111 1111 1111 1111 1111 1111 1111")] + [InlineData(int.MinValue, "1111 1111 1111 1111 1111 1111 1111 1111 1000 0000 0000 0000 0000 0000 0000 0000")] + [InlineData(long.MaxValue, "0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111")] + [InlineData(long.MinValue, "1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000")] + [InlineData(unchecked((long)0b1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010_1010), "1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010")] + public void TestToStringLong(long value, string expected) + { + Check.That(BitString.ToString(value)).IsEqualTo(expected); + } + } +} From 8f5b4cbe531538440e041ce469d0b920e8136341 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 15:29:34 +0200 Subject: [PATCH 617/777] =?UTF-8?q?Check=20if=20character=20is=20=EF=BF=BD?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReClass.NET/Extensions/StringExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index 83114a8c..89c5caf6 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -13,7 +13,7 @@ public static class StringExtension [DebuggerStepThrough] public static bool IsPrintable(this char c) { - return !char.IsControl(c) || char.IsWhiteSpace(c); + return (!char.IsControl(c) || char.IsWhiteSpace(c)) && c != '\xFFFD' /* Unicode REPLACEMENT CHARACTER � */; } [DebuggerStepThrough] From 04662b4b93de8100f2b2533586e01b3e0e814f75 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 15:58:10 +0200 Subject: [PATCH 618/777] Added encoding 1252. --- ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs index f1c1a1a5..fa563b9c 100644 --- a/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/EncodingExtensionTest.cs @@ -13,6 +13,7 @@ public class EncodingExtensionTest public static TheoryData GetTestSimpleByteCountData() => new TheoryData { { Encoding.ASCII, 1 }, + { Encoding.GetEncoding(1252), 1 }, { Encoding.UTF8, 1 }, { Encoding.Unicode, 2 }, { Encoding.BigEndianUnicode, 2 }, @@ -28,7 +29,7 @@ public void TestSimpleByteCount(Encoding encoding, int expectedByteCount) public static IEnumerable GetTestSimpleByteCountNotImplementedData() => Encoding.GetEncodings() .Select(e => e.GetEncoding()) - .WhereNot(e => e.Equals(Encoding.ASCII) || e.Equals(Encoding.UTF8) || e.Equals(Encoding.Unicode) || e.Equals(Encoding.BigEndianUnicode) || e.Equals(Encoding.UTF32)) + .WhereNot(e => e.IsSameCodePage(Encoding.ASCII) || e.IsSameCodePage(Encoding.UTF8) || e.IsSameCodePage(Encoding.Unicode) || e.IsSameCodePage(Encoding.BigEndianUnicode) || e.IsSameCodePage(Encoding.UTF32) || e.CodePage == 1252) .Select(e => new object[] { e }); [Theory] From 25a7559d86c650e34c79bb770569b4d393a104a7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 15:58:34 +0200 Subject: [PATCH 619/777] Added ReadString test. --- ReClass.NET_Tests/Memory/MemoryBufferTest.cs | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/ReClass.NET_Tests/Memory/MemoryBufferTest.cs b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs index 25dc9255..7e545f56 100644 --- a/ReClass.NET_Tests/Memory/MemoryBufferTest.cs +++ b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs @@ -1,4 +1,5 @@ using System; +using System.Text; using NFluent; using ReClassNET.Memory; using Xunit; @@ -129,7 +130,6 @@ public void TestReadFloat(MemoryBuffer sut, int offset, float expected) { { CreateFromBytes(), 0, 0.0 }, { CreateFromBytes(), 4, 0.0 }, - //409349ba786c2268 { CreateFromBytes(0x54, 0x74, 0x24, 0x97, 0x1F, 0xE1, 0xB0, 0x40), 0, 4321.1234 }, { CreateFromBytes(1, 2, 0x68, 0x22, 0x6C, 0x78, 0xBA, 0x49, 0x93, 0x40), 2, 1234.4321 } }; @@ -140,5 +140,29 @@ public void TestReadDouble(MemoryBuffer sut, int offset, double expected) { Check.That(sut.ReadDouble(offset)).IsCloseTo(expected, 0.0001); } + + public static TheoryData GetTestReadStringData() => new TheoryData + { + { CreateFromBytes(), Encoding.ASCII, 0, 0, string.Empty }, + { CreateFromBytes(), Encoding.ASCII, 4, 0, string.Empty }, + { CreateFromBytes(), Encoding.ASCII, 0, 4, string.Empty }, + { CreateFromBytes(0x31, 0x32, 0x33, 0x61, 0x62, 0x63), Encoding.ASCII, 0, 6, "123abc" }, + { CreateFromBytes(0x31, 0x32, 0x33, 0x61, 0x62, 0x63), Encoding.ASCII, 2, 3, "3ab" }, + { CreateFromBytes(0, 0, 0, 0, 0, 0), Encoding.GetEncoding(1252), 0, 6, "......" }, + { CreateFromBytes(0, 0, 0, 0, 0, 0), Encoding.UTF8, 0, 6, "......" }, + { CreateFromBytes(0, 1, 2, 3, 4, 5), Encoding.UTF8, 0, 6, "......" }, + { CreateFromBytes(0x31, 0x32, 0x33, 0x61, 0x62, 0x63, 0xC4, 0xD6, 0xDC), Encoding.GetEncoding(1252), 0, 9, "123abcÄÖÜ" }, + { CreateFromBytes(0x31, 0x32, 0x33, 0x61, 0x62, 0x63, 0xC3, 0x84, 0xC3, 0x96, 0xC3, 0x9C), Encoding.UTF8, 0, 12, "123abcÄÖÜ" }, + { CreateFromBytes(0x61, 0xC3), Encoding.UTF8, 0, 2, "a." }, + { CreateFromBytes(0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0xC4, 0x00, 0xD6, 0x00, 0xDC, 0x00), Encoding.Unicode, 0, 18, "123abcÄÖÜ" }, + { CreateFromBytes(0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0xD6, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00), Encoding.UTF32, 0, 36, "123abcÄÖÜ" } + }; + + [Theory] + [MemberData(nameof(GetTestReadStringData))] + public void TestReadString(MemoryBuffer sut, Encoding encoding, int offset, int length, string expected) + { + Check.That(sut.ReadString(encoding, offset, length)).IsEqualTo(expected); + } } } From 0aa2848828df31095966adaeb04d819776d1d116 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 9 May 2019 17:10:26 +0200 Subject: [PATCH 620/777] Changed method name. --- ReClass.NET/Nodes/BitFieldNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index cd97c68c..ac7bc770 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -89,7 +89,7 @@ public BaseNumericNode GetUnderlayingNode() /// Converts the memory value to a bit string. /// The process memory. /// The value converted to a bit string. - private string ConvertValueToGroupedBitString(MemoryBuffer memory) + private string ConvertValueToBitString(MemoryBuffer memory) { Contract.Requires(memory != null); Contract.Ensures(Contract.Result() != null); @@ -139,7 +139,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddHotSpot(view, rect, string.Empty, i, HotSpotType.Edit); } - var value = ConvertValueToGroupedBitString(view.Memory); + var value = ConvertValueToBitString(view.Memory); x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, value) + view.Font.Width; From 569a5906ad0f8354ba58b385e2edddbf325ab700 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 10 May 2019 10:54:05 +0200 Subject: [PATCH 621/777] Simplified code. --- ReClass.NET/Native/NativeMethods.Windows.cs | 71 +++------------------ 1 file changed, 9 insertions(+), 62 deletions(-) diff --git a/ReClass.NET/Native/NativeMethods.Windows.cs b/ReClass.NET/Native/NativeMethods.Windows.cs index d74bf135..36e25d13 100644 --- a/ReClass.NET/Native/NativeMethods.Windows.cs +++ b/ReClass.NET/Native/NativeMethods.Windows.cs @@ -177,85 +177,32 @@ public bool RegisterExtension(string fileExtension, string extensionId, string a { var classesRoot = Registry.ClassesRoot; - try - { - classesRoot.CreateSubKey(fileExtension); - } - catch (Exception) - { - - } - using (var fileExtensionKey = classesRoot.OpenSubKey(fileExtension, true)) + using (var fileExtensionKey = classesRoot.CreateSubKey(fileExtension)) { fileExtensionKey?.SetValue(string.Empty, extensionId, RegistryValueKind.String); } - try - { - classesRoot.CreateSubKey(extensionId); - } - catch (Exception) - { - - } - using (var extensionInfoKey = classesRoot.OpenSubKey(extensionId, true)) + using (var extensionInfoKey = classesRoot.CreateSubKey(extensionId)) { extensionInfoKey?.SetValue(string.Empty, applicationName, RegistryValueKind.String); - try - { - extensionInfoKey?.CreateSubKey("DefaultIcon"); - } - catch (Exception) - { - - } - - using (var icon = extensionInfoKey?.OpenSubKey("DefaultIcon", true)) + using (var icon = extensionInfoKey?.CreateSubKey("DefaultIcon")) { if (applicationPath.IndexOfAny(new[] { ' ', '\t' }) < 0) { - icon?.SetValue(string.Empty, applicationPath + ",0", RegistryValueKind.String); - } - else - { - icon?.SetValue(string.Empty, "\"" + applicationPath + "\",0", RegistryValueKind.String); + applicationPath = "\"" + applicationPath + "\""; } - } - try - { - extensionInfoKey?.CreateSubKey("shell"); - } - catch (Exception) - { + icon?.SetValue(string.Empty, "\"" + applicationPath + "\",0", RegistryValueKind.String); } - using (var shellKey = extensionInfoKey?.OpenSubKey("shell", true)) - { - try - { - shellKey?.CreateSubKey("open"); - } - catch (Exception) - { - - } - using (var openKey = shellKey?.OpenSubKey("open", true)) + using (var shellKey = extensionInfoKey?.CreateSubKey("shell")) + { + using (var openKey = shellKey?.CreateSubKey("open")) { - openKey?.SetValue(string.Empty, $"&Open with {applicationName}", RegistryValueKind.String); - try - { - openKey?.CreateSubKey("command"); - } - catch (Exception) - { - - } - - using (var commandKey = openKey?.OpenSubKey("command", true)) + using (var commandKey = openKey?.CreateSubKey("command")) { commandKey?.SetValue(string.Empty, $"\"{applicationPath}\" \"%1\"", RegistryValueKind.String); } From 326a77c77e6934726ce119c7b328720db736c579 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 10 May 2019 10:58:06 +0200 Subject: [PATCH 622/777] Removed unneeded usings. --- ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs | 7 +------ ReClass.NET_Tests/AddressParser/InterpreterTest.cs | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs index 1ba20a85..cada902a 100644 --- a/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs +++ b/ReClass.NET_Tests/AddressParser/DynamicCompilerTest.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ReClassNET.AddressParser; +using ReClassNET.AddressParser; namespace ReClass.NET_Tests.AddressParser { diff --git a/ReClass.NET_Tests/AddressParser/InterpreterTest.cs b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs index 92348e8a..b7ee2295 100644 --- a/ReClass.NET_Tests/AddressParser/InterpreterTest.cs +++ b/ReClass.NET_Tests/AddressParser/InterpreterTest.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ReClassNET.AddressParser; +using ReClassNET.AddressParser; namespace ReClass.NET_Tests.AddressParser { From ebce22ced12258e8ec6460c5404218e6be42243f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 10 May 2019 11:29:56 +0200 Subject: [PATCH 623/777] Implemented test. --- ReClass.NET_Tests/Extensions/ListExtensionTest.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ReClass.NET_Tests/Extensions/ListExtensionTest.cs b/ReClass.NET_Tests/Extensions/ListExtensionTest.cs index 377bd2b3..6cf535db 100644 --- a/ReClass.NET_Tests/Extensions/ListExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/ListExtensionTest.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.Extensions; using Xunit; @@ -13,9 +10,15 @@ public class ListExtensionTest { public static TheoryData, Func, int> GetTestBinarySearchData() => new TheoryData, Func, int> { - + { new List { 0, 2, 4, 6, 8, 10, 12 }, i => 2.CompareTo(i), 1 }, + { new List { 0, 2, 4, 6, 8, 10, 12 }, i => 8.CompareTo(i), 4 }, + { new List { 1, 3, 5, 7, 9, 11, 13 }, i => 1.CompareTo(i), 0 }, + { new List { 1, 3, 5, 7, 9, 11, 13 }, i => 2.CompareTo(i), ~1 }, + { new List { 1, 3, 5, 7, 9, 11, 13 }, i => 14.CompareTo(i), ~7 }, }; + [Theory] + [MemberData(nameof(GetTestBinarySearchData))] public void TestBinarySearch(IList sut, Func comparer, int expected) { Check.That(sut.BinarySearch(comparer)).IsEqualTo(expected); From 3becbe1a11e2a4e377a61688ff0a60e2eee6f8ba Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 10 May 2019 11:32:25 +0200 Subject: [PATCH 624/777] Changed class name. --- .../Extensions/{LinqExtensions.cs => EnumerableExtension.cs} | 2 +- ReClass.NET/ReClass.NET.csproj | 2 +- .../{LinqExtensionTests.cs => EnumerableExtensionTests.cs} | 2 +- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename ReClass.NET/Extensions/{LinqExtensions.cs => EnumerableExtension.cs} (99%) rename ReClass.NET_Tests/Extensions/{LinqExtensionTests.cs => EnumerableExtensionTests.cs} (99%) diff --git a/ReClass.NET/Extensions/LinqExtensions.cs b/ReClass.NET/Extensions/EnumerableExtension.cs similarity index 99% rename from ReClass.NET/Extensions/LinqExtensions.cs rename to ReClass.NET/Extensions/EnumerableExtension.cs index 22966d63..f027df42 100644 --- a/ReClass.NET/Extensions/LinqExtensions.cs +++ b/ReClass.NET/Extensions/EnumerableExtension.cs @@ -6,7 +6,7 @@ namespace ReClassNET.Extensions { - public static class LinqExtension + public static class EnumerableExtension { [DebuggerStepThrough] public static bool None(this IEnumerable source) diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index ceaf1ffd..8025a590 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -508,7 +508,7 @@ - + diff --git a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs b/ReClass.NET_Tests/Extensions/EnumerableExtensionTests.cs similarity index 99% rename from ReClass.NET_Tests/Extensions/LinqExtensionTests.cs rename to ReClass.NET_Tests/Extensions/EnumerableExtensionTests.cs index cb420f5d..90bb3573 100644 --- a/ReClass.NET_Tests/Extensions/LinqExtensionTests.cs +++ b/ReClass.NET_Tests/Extensions/EnumerableExtensionTests.cs @@ -7,7 +7,7 @@ namespace ReClass.NET_Tests.Extensions { - public class LinqExtensionTests + public class EnumerableExtensionTest { public static TheoryData, bool> GetTestNoneData => new TheoryData, bool> { diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index d1b1c359..f205bfcc 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -72,7 +72,7 @@ - + From 30ef791efe26134f0d5572ecc1f7eb84cd1e9218 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 10 May 2019 11:34:25 +0200 Subject: [PATCH 625/777] Removed unneeded usings. --- .../Extensions/FloatingPointExtensionTest.cs | 8 +------- ReClass.NET_Tests/Extensions/StringExtensionTest.cs | 1 - ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs | 3 --- ReClass.NET_Tests/Util/BitStringTest.cs | 7 +------ ReClass.NET_Tests/Util/DirectedGraphTest.cs | 3 --- ReClass.NET_Tests/Util/IntPtrComparerTest.cs | 4 ---- ReClass.NET_Tests/Util/PathUtilTest.cs | 6 +----- ReClass.NET_Tests/Util/XElementSerializerTest.cs | 6 +----- 8 files changed, 4 insertions(+), 34 deletions(-) diff --git a/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs b/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs index a295fd7a..844f8229 100644 --- a/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/FloatingPointExtensionTest.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NFluent; -using NFluent.Extensions; +using NFluent; using ReClassNET.Extensions; using Xunit; diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs index 74779eb9..5977bf07 100644 --- a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using NFluent; using ReClassNET.Extensions; using Xunit; diff --git a/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs b/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs index bf230f2b..957863a4 100644 --- a/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/BytePatternTest.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.MemoryScanner; using Xunit; diff --git a/ReClass.NET_Tests/Util/BitStringTest.cs b/ReClass.NET_Tests/Util/BitStringTest.cs index e078106e..7a6a0b79 100644 --- a/ReClass.NET_Tests/Util/BitStringTest.cs +++ b/ReClass.NET_Tests/Util/BitStringTest.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NFluent; +using NFluent; using ReClassNET.Util; using Xunit; diff --git a/ReClass.NET_Tests/Util/DirectedGraphTest.cs b/ReClass.NET_Tests/Util/DirectedGraphTest.cs index 624ae7e4..feea18af 100644 --- a/ReClass.NET_Tests/Util/DirectedGraphTest.cs +++ b/ReClass.NET_Tests/Util/DirectedGraphTest.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.Util; using Xunit; diff --git a/ReClass.NET_Tests/Util/IntPtrComparerTest.cs b/ReClass.NET_Tests/Util/IntPtrComparerTest.cs index 1b07ecb9..ec47827b 100644 --- a/ReClass.NET_Tests/Util/IntPtrComparerTest.cs +++ b/ReClass.NET_Tests/Util/IntPtrComparerTest.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.Util; using Xunit; diff --git a/ReClass.NET_Tests/Util/PathUtilTest.cs b/ReClass.NET_Tests/Util/PathUtilTest.cs index 5209171d..5e28a654 100644 --- a/ReClass.NET_Tests/Util/PathUtilTest.cs +++ b/ReClass.NET_Tests/Util/PathUtilTest.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.Util; using Xunit; diff --git a/ReClass.NET_Tests/Util/XElementSerializerTest.cs b/ReClass.NET_Tests/Util/XElementSerializerTest.cs index c372b41f..d81a7a4f 100644 --- a/ReClass.NET_Tests/Util/XElementSerializerTest.cs +++ b/ReClass.NET_Tests/Util/XElementSerializerTest.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NFluent; using ReClassNET.Extensions; using ReClassNET.Util; From 3a771dd703a677bf1e58fba431aa414654ec23a5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 12 May 2019 22:32:36 +0200 Subject: [PATCH 626/777] Use correct method names. --- ReClass.NET/Extensions/StringExtensions.cs | 6 +++--- ReClass.NET/Memory/NodeDissector.cs | 8 ++++---- ReClass.NET/Nodes/BaseHexCommentNode.cs | 4 ++-- .../Extensions/StringExtensionTest.cs | 16 ++++++++-------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index 89c5caf6..b3bc0533 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -17,7 +17,7 @@ public static bool IsPrintable(this char c) } [DebuggerStepThrough] - public static IEnumerable InterpretAsUtf8(this IEnumerable source) + public static IEnumerable InterpretAsSingleByteCharacter(this IEnumerable source) { Contract.Requires(source != null); @@ -25,7 +25,7 @@ public static IEnumerable InterpretAsUtf8(this IEnumerable source) } [DebuggerStepThrough] - public static IEnumerable InterpretAsUtf16(this IEnumerable source) + public static IEnumerable InterpretAsDoubleByteCharacter(this IEnumerable source) { Contract.Requires(source != null); diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 7b82f782..c29aa884 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -45,13 +45,13 @@ public static bool GuessNode(BaseHexNode node, MemoryBuffer memory, out BaseNode var data32 = memory.ReadObject(offset); var raw = memory.ReadBytes(offset, node.MemorySize); - if (raw.InterpretAsUtf8().IsLikelyPrintableData()) + if (raw.InterpretAsSingleByteCharacter().IsLikelyPrintableData()) { guessedNode = new Utf8TextNode(); return true; } - if (raw.InterpretAsUtf16().IsLikelyPrintableData()) + if (raw.InterpretAsDoubleByteCharacter().IsLikelyPrintableData()) { guessedNode = new Utf16TextNode(); @@ -147,13 +147,13 @@ private static bool GuessPointerNode(IntPtr address, IProcessReader process, out // Check if it is a string. var data = process.ReadRemoteMemory(address, IntPtr.Size * 2); - if (data.Take(IntPtr.Size).InterpretAsUtf8().IsLikelyPrintableData()) + if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsLikelyPrintableData()) { node = new Utf8TextPtrNode(); return true; } - if (data.InterpretAsUtf16().IsLikelyPrintableData()) + if (data.InterpretAsDoubleByteCharacter().IsLikelyPrintableData()) { node = new Utf16TextPtrNode(); diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index f59fca44..6c72f480 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -67,12 +67,12 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu var data = view.Memory.Process.ReadRemoteMemory(ivalue, 64); // First check if it could be an UTF8 string and if not try UTF16. - if (data.Take(IntPtr.Size).InterpretAsUtf8().IsPrintableData()) + if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsPrintableData()) { var text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"'{text}'") + view.Font.Width; } - else if(data.Take(IntPtr.Size * 2).InterpretAsUtf16().IsPrintableData()) + else if(data.Take(IntPtr.Size * 2).InterpretAsDoubleByteCharacter().IsPrintableData()) { var text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"L'{text}'") + view.Font.Width; diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs index 5977bf07..9a66e19f 100644 --- a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -55,30 +55,30 @@ public void TestLimitLengthThrows() Check.ThatCode(() => "".LimitLength(-1)).Throws(); } - public static TheoryData, IEnumerable> GetTestInterpretAsUtf8Data() => new TheoryData, IEnumerable> + public static TheoryData, IEnumerable> GetTestInterpretAsSingleByteCharacterData() => new TheoryData, IEnumerable> { { new byte[0], string.Empty }, { new [] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }, "test" } }; [Theory] - [MemberData(nameof(GetTestInterpretAsUtf8Data))] - public void TestInterpretAsUtf8(IEnumerable sut, IEnumerable expected) + [MemberData(nameof(GetTestInterpretAsSingleByteCharacterData))] + public void TestInterpretAsSingleByteCharacter(IEnumerable sut, IEnumerable expected) { - Check.That(sut.InterpretAsUtf8()).ContainsExactly(expected); + Check.That(sut.InterpretAsSingleByteCharacter()).ContainsExactly(expected); } - public static TheoryData, IEnumerable> GetTestInterpretAsUtf16Data() => new TheoryData, IEnumerable> + public static TheoryData, IEnumerable> GetTestInterpretAsDoubleByteCharacterData() => new TheoryData, IEnumerable> { { new byte[0], string.Empty }, { new [] { (byte)'t', (byte)0, (byte)'e', (byte)0, (byte)'s', (byte)0, (byte)'t', (byte)0 }, "test" } }; [Theory] - [MemberData(nameof(GetTestInterpretAsUtf16Data))] - public void TestInterpretAsUtf16(IEnumerable sut, IEnumerable expected) + [MemberData(nameof(GetTestInterpretAsDoubleByteCharacterData))] + public void TestInterpretAsDoubleByteCharacter(IEnumerable sut, IEnumerable expected) { - Check.That(sut.InterpretAsUtf16()).ContainsExactly(expected); + Check.That(sut.InterpretAsDoubleByteCharacter()).ContainsExactly(expected); } public static TheoryData, float> GetTestCalculatePrintableDataThresholdData() => new TheoryData, float> From f68c16a871375e2e6d7b37538135366bb12ed8ed Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 12 May 2019 22:35:31 +0200 Subject: [PATCH 627/777] Use more restricted IsPrintable implementation. --- ReClass.NET/Extensions/StringExtensions.cs | 4 ++-- ReClass.NET_Tests/Extensions/StringExtensionTest.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index b3bc0533..31baa487 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -13,7 +13,7 @@ public static class StringExtension [DebuggerStepThrough] public static bool IsPrintable(this char c) { - return (!char.IsControl(c) || char.IsWhiteSpace(c)) && c != '\xFFFD' /* Unicode REPLACEMENT CHARACTER � */; + return (' ' <= c && c <= '~' || '\xA1' <= c && c <= '\xFF') && c != '\xFFFD' /* Unicode REPLACEMENT CHARACTER � */; } [DebuggerStepThrough] diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs index 9a66e19f..0166d90a 100644 --- a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -10,7 +10,7 @@ public class StringExtensionTest { public static TheoryData GetTestIsPrintableData() => new TheoryData { - '0', '9', ' ', '\t', '\n', 'a', 'A', 'z', 'Z', '-', '_', '°', '^', '"', '\\', '\"', '&', '@', '€', '$', '|', '<', '>', ';', ',', '.', ':', '#', '*', '+', '~', '`', '´', 'ß', '?', '=', '(', ')', '[', ']', '{', '}' + '0', '9', ' ', 'a', 'A', 'z', 'Z', '-', '_', '°', '^', '"', '\\', '\"', '&', '@', '$', '|', '<', '>', ';', ',', '.', ':', '#', '*', '+', '~', '`', '´', 'ß', '?', '=', '(', ')', '[', ']', '{', '}' }; [Theory] From dbe005c0efa71fdbd721c8719c49d49ce262ae79 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 13 May 2019 11:19:27 +0200 Subject: [PATCH 628/777] Fixed #111. --- ReClass.NET/Nodes/ArrayNode.cs | 3 +-- ReClass.NET/Nodes/BaseClassWrapperNode.cs | 6 ++++-- ReClass.NET/Nodes/BaseWrapperNode.cs | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs index 85643e5d..d21d4c0c 100644 --- a/ReClass.NET/Nodes/ArrayNode.cs +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -1,6 +1,5 @@ using System; using System.Drawing; -using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -20,7 +19,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override void Initialize() { - InnerNode = IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node(); + ChangeInnerNode(IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node()); } public override Size Draw(ViewInfo view, int x, int y) diff --git a/ReClass.NET/Nodes/BaseClassWrapperNode.cs b/ReClass.NET/Nodes/BaseClassWrapperNode.cs index 6cc94aee..aa50aaba 100644 --- a/ReClass.NET/Nodes/BaseClassWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseClassWrapperNode.cs @@ -4,8 +4,10 @@ public abstract class BaseClassWrapperNode : BaseWrapperNode { public override void Initialize() { - InnerNode = ClassNode.Create(); - InnerNode.Initialize(); + var node = ClassNode.Create(); + node.Initialize(); + + ChangeInnerNode(node); } public override bool CanChangeInnerNodeTo(BaseNode node) diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index 687e03cc..b9316722 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -6,7 +6,7 @@ namespace ReClassNET.Nodes public abstract class BaseWrapperNode : BaseNode { /// Gets or sets the inner node. - public BaseNode InnerNode { get; protected set; } + public BaseNode InnerNode { get; private set; } /// Gets signaled if the inner node was changed. public event NodeEventHandler InnerNodeChanged; From f14b7d0540eb54f33a5101647c248e60d483e538 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 13 May 2019 14:53:10 +0200 Subject: [PATCH 629/777] Removed MemoryBuffer.Process to reduce coupling. --- ReClass.NET/Forms/MainForm.Functions.cs | 4 +-- ReClass.NET/Forms/MainForm.cs | 8 ++--- ReClass.NET/Memory/MemoryBuffer.cs | 23 ++++---------- ReClass.NET/Memory/NodeDissector.cs | 10 +++--- ReClass.NET/Nodes/BaseFunctionNode.cs | 8 ++--- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 20 ++++++------ ReClass.NET/Nodes/BaseHexCommentNode.cs | 10 +++--- ReClass.NET/Nodes/BaseHexNode.cs | 2 +- ReClass.NET/Nodes/BaseMatrixNode.cs | 2 +- ReClass.NET/Nodes/BaseNode.cs | 8 ++--- ReClass.NET/Nodes/BaseTextNode.cs | 2 +- ReClass.NET/Nodes/BaseTextPtrNode.cs | 2 +- ReClass.NET/Nodes/BaseWrapperNode.cs | 1 - ReClass.NET/Nodes/BitFieldNode.cs | 2 +- ReClass.NET/Nodes/BoolNode.cs | 2 +- ReClass.NET/Nodes/DoubleNode.cs | 2 +- ReClass.NET/Nodes/FloatNode.cs | 2 +- ReClass.NET/Nodes/FunctionNode.cs | 14 ++++----- ReClass.NET/Nodes/Hex16Node.cs | 4 +-- ReClass.NET/Nodes/Hex32Node.cs | 10 +++--- ReClass.NET/Nodes/Hex64Node.cs | 10 +++--- ReClass.NET/Nodes/Hex8Node.cs | 4 +-- ReClass.NET/Nodes/Int16Node.cs | 2 +- ReClass.NET/Nodes/Int32Node.cs | 2 +- ReClass.NET/Nodes/Int64Node.cs | 2 +- ReClass.NET/Nodes/Int8Node.cs | 2 +- ReClass.NET/Nodes/PointerNode.cs | 9 +++--- ReClass.NET/Nodes/UInt16Node.cs | 2 +- ReClass.NET/Nodes/UInt32Node.cs | 2 +- ReClass.NET/Nodes/UInt64Node.cs | 2 +- ReClass.NET/Nodes/UInt8Node.cs | 2 +- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 3 +- ReClass.NET/UI/HotSpot.cs | 2 ++ ReClass.NET/UI/MemoryPreviewPopUp.cs | 8 ++--- ReClass.NET/UI/MemoryViewControl.cs | 35 ++++++++++++++------- ReClass.NET/UI/ViewInfo.cs | 2 ++ 36 files changed, 111 insertions(+), 114 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 72270773..11d66d37 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -310,7 +310,7 @@ public void ReplaceSelectedNodesWithType(Type type) node.IsSelected = true; - var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Memory, selected.Address, selected.Level); + var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Process, selected.Memory, selected.Address, selected.Level); newSelected.Add(info); @@ -319,7 +319,7 @@ public void ReplaceSelectedNodesWithType(Type type) { foreach (var createdNode in createdNodes) { - hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level)); + hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Process, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level)); } } } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 33f951dd..3fe93267 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -62,10 +62,8 @@ public MainForm() processInfoToolStripStatusLabel.Text = "No process selected"; }; - memoryViewControl.Memory = new MemoryBuffer - { - Process = Program.RemoteProcess - }; + memoryViewControl.Process = Program.RemoteProcess; + memoryViewControl.Memory = new MemoryBuffer(); pluginManager = new PluginManager(new DefaultPluginHost(this, Program.RemoteProcess, Program.Logger)); } @@ -555,7 +553,7 @@ private void dissectNodesToolStripMenuItem_Click(object sender, EventArgs e) foreach (var g in hexNodes.GroupBy(n => n.Node.GetParentContainer())) { - NodeDissector.DissectNodes(g.Select(h => (BaseHexNode)h.Node), g.First().Memory); + NodeDissector.DissectNodes(g.Select(h => (BaseHexNode)h.Node), Program.RemoteProcess, g.First().Memory); } ClearSelection(); diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index 6da1ce7d..ddaed91b 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -13,8 +13,6 @@ public class MemoryBuffer private bool hasHistory; - public RemoteProcess Process { get; set; } - public byte[] RawData => data; public int Size @@ -81,19 +79,13 @@ public MemoryBuffer Clone() return new MemoryBuffer(this) { - Offset = Offset, - Process = Process + Offset = Offset }; } - public void Update(IntPtr address) - { - Update(address, true); - } - - public void Update(IntPtr address, bool setHistory) + public void UpdateFrom(IRemoteMemoryReader reader, IntPtr address) { - if (Process == null) + if (reader == null) { data.FillWithZero(); @@ -102,14 +94,11 @@ public void Update(IntPtr address, bool setHistory) return; } - if (setHistory) - { - Array.Copy(data, historyData, data.Length); + Array.Copy(data, historyData, data.Length); - hasHistory = ContainsValidData; - } + hasHistory = ContainsValidData; - ContainsValidData = Process.ReadRemoteMemoryIntoBuffer(address, ref data); + ContainsValidData = reader.ReadRemoteMemoryIntoBuffer(address, ref data); if (!ContainsValidData) { data.FillWithZero(); diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index c29aa884..3e103b16 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -9,7 +9,7 @@ namespace ReClassNET.Memory { public class NodeDissector { - public static void DissectNodes(IEnumerable nodes, MemoryBuffer memory) + public static void DissectNodes(IEnumerable nodes, IProcessReader reader, MemoryBuffer memory) { Contract.Requires(nodes != null); Contract.Requires(Contract.ForAll(nodes, n => n != null)); @@ -17,14 +17,14 @@ public static void DissectNodes(IEnumerable nodes, MemoryBuffer mem foreach (var node in nodes) { - if (GuessNode(node, memory, out var guessedNode)) + if (GuessNode(node, reader, memory, out var guessedNode)) { node.GetParentContainer()?.ReplaceChildNode(node, guessedNode); } } } - public static bool GuessNode(BaseHexNode node, MemoryBuffer memory, out BaseNode guessedNode) + public static bool GuessNode(BaseHexNode node, IProcessReader reader, MemoryBuffer memory, out BaseNode guessedNode) { Contract.Requires(node != null); Contract.Requires(memory != null); @@ -61,13 +61,13 @@ public static bool GuessNode(BaseHexNode node, MemoryBuffer memory, out BaseNode #if RECLASSNET64 if (is8ByteAligned) { - if (GuessPointerNode(data64.IntPtr, memory.Process, out guessedNode)) + if (GuessPointerNode(data64.IntPtr, reader, out guessedNode)) { return true; } } #else - if (GuessPointerNode(data32.IntPtr, memory.Process, out guessedNode)) + if (GuessPointerNode(data32.IntPtr, reader, out guessedNode)) { return true; } diff --git a/ReClass.NET/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs index 14ca74a4..8bb7bbf1 100644 --- a/ReClass.NET/Nodes/BaseFunctionNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionNode.cs @@ -54,14 +54,14 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) return new Size(maxWidth, y - origY); } - protected void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address, out int memorySize) + protected void DisassembleRemoteCode(RemoteProcess process, IntPtr address, out int memorySize) { - Contract.Requires(memory != null); + Contract.Requires(process != null); memorySize = 0; - var disassembler = new Disassembler(memory.Process.CoreFunctions); - foreach (var instruction in disassembler.RemoteDisassembleFunction(memory.Process, address, 8192)) + var disassembler = new Disassembler(process.CoreFunctions); + foreach (var instruction in disassembler.RemoteDisassembleFunction(process, address, 8192)) { memorySize += instruction.Length; diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index c151c674..a94e5e2a 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -13,11 +13,11 @@ public abstract class BaseFunctionPtrNode : BaseFunctionNode { public override int MemorySize => IntPtr.Size; - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - var ptr = memory.ReadIntPtr(Offset); + var ptr = spot.Memory.ReadIntPtr(Offset); - DisassembleRemoteCode(memory, ptr); + DisassembleRemoteCode(spot.Process, ptr); return string.Join("\n", instructions.Select(i => i.Instruction)); } @@ -59,10 +59,10 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) { var value = view.Memory.ReadIntPtr(Offset); - var module = view.Memory.Process.GetModuleToPointer(value); + var module = view.Process.GetModuleToPointer(value); if (module != null) { - var symbols = view.Memory.Process.Symbols.GetSymbolsForModule(module); + var symbols = view.Process.Symbols.GetSymbolsForModule(module); var symbol = symbols?.GetSymbolString(value, module); if (!string.IsNullOrEmpty(symbol)) { @@ -81,7 +81,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) { var ptr = view.Memory.ReadIntPtr(Offset); - DisassembleRemoteCode(view.Memory, ptr); + DisassembleRemoteCode(view.Process, ptr); var instructionSize = DrawInstructions(view, tx, y); @@ -107,9 +107,9 @@ public override int CalculateDrawnHeight(ViewInfo view) return height; } - private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) + private void DisassembleRemoteCode(RemoteProcess process, IntPtr address) { - Contract.Requires(memory != null); + Contract.Requires(process != null); if (this.address != address) { @@ -117,9 +117,9 @@ private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) this.address = address; - if (!address.IsNull() && memory.Process.IsValid) + if (!address.IsNull() && process.IsValid) { - DisassembleRemoteCode(memory, address, out _); + DisassembleRemoteCode(process, address, out _); } } } diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 6c72f480..063dd8c5 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -30,7 +30,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu } } - var namedAddress = view.Memory.Process.GetNamedAddress(ivalue); + var namedAddress = view.Process.GetNamedAddress(ivalue); if (!string.IsNullOrEmpty(namedAddress)) { if (view.Settings.ShowCommentPointer) @@ -41,7 +41,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentRtti) { - var rtti = view.Memory.Process.ReadRemoteRuntimeTypeInformation(ivalue); + var rtti = view.Process.ReadRemoteRuntimeTypeInformation(ivalue); if (!string.IsNullOrEmpty(rtti)) { x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, rtti) + view.Font.Width; @@ -50,10 +50,10 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentSymbol) { - var module = view.Memory.Process.GetModuleToPointer(ivalue); + var module = view.Process.GetModuleToPointer(ivalue); if (module != null) { - var symbols = view.Memory.Process.Symbols.GetSymbolsForModule(module); + var symbols = view.Process.Symbols.GetSymbolsForModule(module); var symbol = symbols?.GetSymbolString(ivalue, module); if (!string.IsNullOrEmpty(symbol)) { @@ -64,7 +64,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu if (view.Settings.ShowCommentString) { - var data = view.Memory.Process.ReadRemoteMemory(ivalue, 64); + var data = view.Process.ReadRemoteMemory(ivalue, 64); // First check if it could be an UTF8 string and if not try UTF16. if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsPrintableData()) diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index 023bcd6e..db0666fd 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -113,7 +113,7 @@ public void Update(HotSpot spot, int maxId) { if (byte.TryParse(spot.Text, NumberStyles.HexNumber, null, out var val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address + spot.Id, val); + spot.Process.WriteRemoteMemory(spot.Address + spot.Id, val); } } } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 5a31bc84..910e2b40 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -136,7 +136,7 @@ public void Update(HotSpot spot, int max) { if (float.TryParse(spot.Text, out var val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address + spot.Id * ValueTypeSize, val); + spot.Process.WriteRemoteMemory(spot.Address + spot.Id * ValueTypeSize, val); } } } diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index a0cfed16..1a7d7991 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -106,10 +106,9 @@ protected BaseNode() public abstract void GetUserInterfaceInfo(out string name, out Image icon); - public virtual bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) + public virtual bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { Contract.Requires(spot != null); - Contract.Requires(memory != null); address = IntPtr.Zero; @@ -118,12 +117,10 @@ public virtual bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, o /// Gets informations about this node to show in a tool tip. /// The spot. - /// The process memory. /// The information to show in a tool tip or null if no information should be shown. - public virtual string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public virtual string GetToolTipText(HotSpot spot) { Contract.Requires(spot != null); - Contract.Requires(memory != null); return null; } @@ -297,6 +294,7 @@ protected void AddHotSpot(ViewInfo view, Rectangle spot, string text, int id, Ho Type = type, Node = this, Level = view.Level, + Process = view.Process, Memory = view.Memory }); } diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 60984853..4906b7a5 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -88,7 +88,7 @@ public override void Update(HotSpot spot) else if (spot.Id == 1) { var data = Encoding.GetBytes(spot.Text); - spot.Memory.Process.WriteRemoteMemory(spot.Address, data); + spot.Process.WriteRemoteMemory(spot.Address, data); } } diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 13857f2d..3c108dd5 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -30,7 +30,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) } var ptr = view.Memory.ReadIntPtr(Offset); - var text = view.Memory.Process.ReadRemoteString(Encoding, ptr, 64); + var text = view.Process.ReadRemoteString(Encoding, ptr, 64); var origX = x; diff --git a/ReClass.NET/Nodes/BaseWrapperNode.cs b/ReClass.NET/Nodes/BaseWrapperNode.cs index b9316722..b499f0ce 100644 --- a/ReClass.NET/Nodes/BaseWrapperNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperNode.cs @@ -1,5 +1,4 @@ using System; -using System.Security.Permissions; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index ac7bc770..65d1da38 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -209,7 +209,7 @@ public override void Update(HotSpot spot) { val &= (byte)~(1 << bit); } - spot.Memory.Process.WriteRemoteMemory(spot.Address + add, val); + spot.Process.WriteRemoteMemory(spot.Address + add, val); } } } diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index ba97f7ed..488d9e19 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -62,7 +62,7 @@ public override void Update(HotSpot spot) { if (bool.TryParse(spot.Text, out var val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, (byte)(val ? 1 : 0)); + spot.Process.WriteRemoteMemory(spot.Address, (byte)(val ? 1 : 0)); } } } diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index 495935fc..c2cd44dc 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -27,7 +27,7 @@ public override void Update(HotSpot spot) { if (double.TryParse(spot.Text, out var val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index e607b26f..8e1da21d 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -27,7 +27,7 @@ public override void Update(HotSpot spot) { if (float.TryParse(spot.Text, out var val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 1c0608f3..b4cd4b62 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -23,9 +23,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Function; } - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - DisassembleRemoteCode(memory, spot.Address); + DisassembleRemoteCode(spot.Process, spot.Address); return string.Join("\n", instructions.Select(i => i.Instruction)); } @@ -68,7 +68,7 @@ public override Size Draw(ViewInfo view, int x, int y) var size = new Size(x - origX, view.Font.Height); var ptr = view.Address + Offset; - DisassembleRemoteCode(view.Memory, ptr); + DisassembleRemoteCode(view.Process, ptr); if (LevelsOpen[view.Level]) { @@ -118,9 +118,9 @@ public override void Update(HotSpot spot) } } - private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) + private void DisassembleRemoteCode(RemoteProcess process, IntPtr address) { - Contract.Requires(memory != null); + Contract.Requires(process != null); if (this.address != address) { @@ -128,9 +128,9 @@ private void DisassembleRemoteCode(MemoryBuffer memory, IntPtr address) this.address = address; - if (!address.IsNull() && memory.Process.IsValid) + if (!address.IsNull() && process.IsValid) { - DisassembleRemoteCode(memory, address, out memorySize); + DisassembleRemoteCode(process, address, out memorySize); } GetParentContainer()?.ChildHasChanged(this); diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index bd72c878..09c619a0 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Hex_16; } - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - var value = memory.ReadObject(Offset); + var value = spot.Memory.ReadObject(Offset); return $"Int16: {value.ShortValue}\nUInt16: 0x{value.UShortValue:X04}"; } diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 50591423..3c31c6ac 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -15,18 +15,18 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Hex_32; } - public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) + public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { - var value = memory.ReadObject(Offset); + var value = spot.Memory.ReadObject(Offset); address = value.IntPtr; - return memory.Process?.GetNamedAddress(value.IntPtr) != null; + return spot.Process?.GetNamedAddress(value.IntPtr) != null; } - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - var value = memory.ReadObject(Offset); + var value = spot.Memory.ReadObject(Offset); return $"Int32: {value.IntValue}\nUInt32: 0x{value.UIntValue:X08}\nFloat: {value.FloatValue:0.000}"; } diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index ef9c909b..74472c65 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -15,18 +15,18 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Hex_64; } - public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) + public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { - var value = memory.ReadObject(Offset); + var value = spot.Memory.ReadObject(Offset); address = value.IntPtr; - return memory.Process.GetSectionToPointer(value.IntPtr) != null; + return spot.Process.GetSectionToPointer(value.IntPtr) != null; } - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - var value = memory.ReadObject(Offset); + var value = spot.Memory.ReadObject(Offset); return $"Int64: {value.LongValue}\nUInt64: 0x{value.ULongValue:X016}\nFloat: {value.FloatValue:0.000}\nDouble: {value.DoubleValue:0.000}"; } diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index fdb435e5..75337e96 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Hex_8; } - public override string GetToolTipText(HotSpot spot, MemoryBuffer memory) + public override string GetToolTipText(HotSpot spot) { - var b = memory.ReadUInt8(Offset); + var b = spot.Memory.ReadUInt8(Offset); return $"Int8: {(int)b}\nUInt8: 0x{b:X02}"; } diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index e54c9351..7c81307e 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (short.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && short.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index f2742cbc..4d0f375c 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (int.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && int.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index d4146f22..81b5e9b7 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (long.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index e1ed38c9..769be064 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (sbyte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && sbyte.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 04c001b1..584a1f3f 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -24,13 +24,13 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Pointer; } - public override bool UseMemoryPreviewToolTip(HotSpot spot, MemoryBuffer memory, out IntPtr address) + public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { // TODO Should the preview be disabled if an inner node is set? - address = memory.ReadIntPtr(Offset); + address = spot.Memory.ReadIntPtr(Offset); - return memory.Process?.GetNamedAddress(address) != null; + return spot.Process.GetNamedAddress(address) != null; } public override bool CanChangeInnerNodeTo(BaseNode node) @@ -99,8 +99,7 @@ public override Size Draw(ViewInfo view, int x, int y) if (LevelsOpen[view.Level] && InnerNode != null) { memory.Size = InnerNode.MemorySize; - memory.Process = view.Memory.Process; - memory.Update(ptr); + memory.UpdateFrom(view.Process, ptr); var v = view.Clone(); v.Address = ptr; diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index c0b28138..538ba5cd 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (ushort.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ushort.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 19925380..0ef9ac50 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (uint.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && uint.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index b8a1b8f3..c60b643e 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (ulong.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ulong.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index 7f157a23..eda54e49 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -30,7 +30,7 @@ public override void Update(HotSpot spot) { if (byte.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && byte.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) { - spot.Memory.Process.WriteRemoteMemory(spot.Address, val); + spot.Process.WriteRemoteMemory(spot.Address, val); } } } diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index 76465ec9..846772f2 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -72,8 +72,7 @@ public override Size Draw(ViewInfo view, int x, int y) var ptr = view.Memory.ReadIntPtr(Offset); memory.Size = Nodes.Count * IntPtr.Size; - memory.Process = view.Memory.Process; - memory.Update(ptr); + memory.UpdateFrom(view.Process, ptr); var v = view.Clone(); v.Address = ptr; diff --git a/ReClass.NET/UI/HotSpot.cs b/ReClass.NET/UI/HotSpot.cs index fc5e1dfc..3a0d4bc0 100644 --- a/ReClass.NET/UI/HotSpot.cs +++ b/ReClass.NET/UI/HotSpot.cs @@ -42,6 +42,8 @@ public class HotSpot public IntPtr Address { get; set; } + public RemoteProcess Process { get; set; } + public MemoryBuffer Memory { get; set; } } } diff --git a/ReClass.NET/UI/MemoryPreviewPopUp.cs b/ReClass.NET/UI/MemoryPreviewPopUp.cs index 1d04834a..0f13353d 100644 --- a/ReClass.NET/UI/MemoryPreviewPopUp.cs +++ b/ReClass.NET/UI/MemoryPreviewPopUp.cs @@ -212,15 +212,15 @@ public void InitializeMemory(RemoteProcess process, IntPtr address) memoryAddress = address; - var memory = panel.ViewInfo.Memory; - memory.Process = process; - memory.Update(address); + panel.ViewInfo.Process = process; + + panel.ViewInfo.Memory.UpdateFrom(process, address); } /// Updates the memory buffer to get current data. public void UpdateMemory() { - panel.ViewInfo.Memory.Update(memoryAddress); + panel.ViewInfo.Memory.UpdateFrom(panel.ViewInfo.Process, memoryAddress); panel.Invalidate(); } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index c870ea4a..666a4c75 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -24,7 +24,9 @@ public class SelectedNodeInfo /// The selected node. /// public BaseNode Node { get; } - + + public RemoteProcess Process { get; } + /// /// The memory this node uses. /// @@ -37,12 +39,14 @@ public class SelectedNodeInfo public int Level { get; } - public SelectedNodeInfo(BaseNode node, MemoryBuffer memory, IntPtr address, int level) + public SelectedNodeInfo(BaseNode node, RemoteProcess process, MemoryBuffer memory, IntPtr address, int level) { Contract.Requires(node != null); + Contract.Requires(process != null); Contract.Requires(memory != null); Node = node; + Process = process; Memory = memory; Address = address; Level = level; @@ -75,15 +79,19 @@ public ClassNode ClassNode classNode = value; VerticalScroll.Value = VerticalScroll.Minimum; - if (classNode != null && Memory?.Process != null) + if (classNode != null && Process != null) { - classNode.UpdateAddress(Memory.Process); + classNode.UpdateAddress(Process); } Invalidate(); } } + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public RemoteProcess Process { get; set; } + [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public MemoryBuffer Memory { get; set; } @@ -148,9 +156,9 @@ protected override void OnPaint(PaintEventArgs e) return; } - if (Memory.Process != null) + if (Process != null) { - ClassNode.UpdateAddress(Memory.Process); + ClassNode.UpdateAddress(Process); } if (memoryPreviewPopUp.Visible) @@ -159,13 +167,14 @@ protected override void OnPaint(PaintEventArgs e) } Memory.Size = ClassNode.MemorySize; - Memory.Update(ClassNode.Address); + Memory.UpdateFrom(Process, ClassNode.Address); var view = new ViewInfo { Settings = Program.Settings, Context = e.Graphics, Font = font, + Process = Process, Memory = Memory, CurrentTime = DateTime.UtcNow, ClientArea = ClientRectangle, @@ -319,6 +328,7 @@ protected override void OnMouseClick(MouseEventArgs e) { Address = (IntPtr)(containerNode.Offset + n.Offset), Node = n, + Process = first.Process, Memory = first.Memory, Level = first.Level })) @@ -465,15 +475,15 @@ protected override void OnMouseHover(EventArgs e) { if (spot.Rect.Contains(toolTipPosition)) { - if (spot.Node.UseMemoryPreviewToolTip(spot, spot.Memory, out var previewAddress)) + if (spot.Node.UseMemoryPreviewToolTip(spot, out var previewAddress)) { - memoryPreviewPopUp.InitializeMemory(spot.Memory.Process, previewAddress); + memoryPreviewPopUp.InitializeMemory(spot.Process, previewAddress); memoryPreviewPopUp.Show(this, toolTipPosition.Relocate(16, 16)); } else { - var text = spot.Node.GetToolTipText(spot, spot.Memory); + var text = spot.Node.GetToolTipText(spot); if (!string.IsNullOrEmpty(text)) { nodeInfoToolTip.Show(text, this, toolTipPosition.Relocate(16, 16)); @@ -599,6 +609,7 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { Address = (IntPtr)(containerNode.Offset + n.Offset), Node = n, + Process = toSelect.Process, Memory = toSelect.Memory, Level = toSelect.Level })) @@ -704,7 +715,7 @@ private void editBox_Committed(object sender, EventArgs e) public IReadOnlyList GetSelectedNodes() { return selectedNodes - .Select(h => new SelectedNodeInfo(h.Node, h.Memory, h.Address, h.Level)) + .Select(h => new SelectedNodeInfo(h.Node, h.Process, h.Memory, h.Address, h.Level)) .ToList(); } @@ -718,7 +729,7 @@ public void SetSelectedNodes(IEnumerable nodes) selectedNodes.Clear(); - selectedNodes.AddRange(nodes.Select(i => new HotSpot { Type = HotSpotType.Select, Node = i.Node, Memory = i.Memory, Address = i.Address, Level = i.Level })); + selectedNodes.AddRange(nodes.Select(i => new HotSpot { Type = HotSpotType.Select, Node = i.Node, Process = i.Process, Memory = i.Memory, Address = i.Address, Level = i.Level })); selectedNodes.ForEach(h => h.Node.IsSelected = true); OnSelectionChanged(); diff --git a/ReClass.NET/UI/ViewInfo.cs b/ReClass.NET/UI/ViewInfo.cs index 5ccfe64c..0519d37d 100644 --- a/ReClass.NET/UI/ViewInfo.cs +++ b/ReClass.NET/UI/ViewInfo.cs @@ -12,6 +12,7 @@ public class ViewInfo public Graphics Context { get; set; } public FontEx Font { get; set; } + public RemoteProcess Process { get; set; } public MemoryBuffer Memory { get; set; } public DateTime CurrentTime { get; set; } @@ -29,6 +30,7 @@ public ViewInfo Clone() Settings = Settings, Context = Context, Font = Font, + Process = Process, Memory = Memory, CurrentTime = CurrentTime, ClientArea = ClientArea, From 60a017d9a0c37f21ac405741406f04195f9daad1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 15 May 2019 13:40:39 +0200 Subject: [PATCH 630/777] Reduced coupling for the MemoryViewControl. --- ReClass.NET/Forms/MainForm.Designer.cs | 21 +-- ReClass.NET/Forms/MainForm.Functions.cs | 7 +- ReClass.NET/Forms/MainForm.cs | 47 +++++- ReClass.NET/ReClass.NET.csproj | 1 + ReClass.NET/UI/DrawContextRequestEventArgs.cs | 23 +++ ReClass.NET/UI/MemoryViewControl.cs | 142 +++++++----------- 6 files changed, 131 insertions(+), 110 deletions(-) create mode 100644 ReClass.NET/UI/DrawContextRequestEventArgs.cs diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 3d5cd7c2..f9eaffa6 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -157,12 +157,12 @@ private void InitializeComponent() this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.goToClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.cleanUnusedClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); this.generateCppCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.generateCSharpCodeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.showEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); @@ -349,7 +349,7 @@ private void InitializeComponent() // this.editEnumsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; this.editEnumsToolStripMenuItem.Name = "editEnumsToolStripMenuItem"; - this.editEnumsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.editEnumsToolStripMenuItem.Size = new System.Drawing.Size(142, 22); this.editEnumsToolStripMenuItem.Text = "Edit enums..."; this.editEnumsToolStripMenuItem.Click += new System.EventHandler(this.editEnumsToolStripMenuItem_Click); // @@ -362,6 +362,7 @@ private void InitializeComponent() this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Size = new System.Drawing.Size(936, 524); this.memoryViewControl.TabIndex = 0; + this.memoryViewControl.DrawContextRequested += new ReClassNET.UI.DrawContextRequestEventHandler(this.memoryViewControl_DrawContextRequested); this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); this.memoryViewControl.ChangeClassTypeClick += new ReClassNET.UI.NodeClickEventHandler(this.memoryViewControl_ChangeClassTypeClick); this.memoryViewControl.ChangeWrappedTypeClick += new ReClassNET.UI.NodeClickEventHandler(this.memoryViewControl_ChangeWrappedTypeClick); @@ -1301,6 +1302,14 @@ private void InitializeComponent() this.cleanUnusedClassesToolStripMenuItem.Text = "Remove unused classes"; this.cleanUnusedClassesToolStripMenuItem.Click += new System.EventHandler(this.cleanUnusedClassesToolStripMenuItem_Click); // + // showEnumsToolStripMenuItem + // + this.showEnumsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; + this.showEnumsToolStripMenuItem.Name = "showEnumsToolStripMenuItem"; + this.showEnumsToolStripMenuItem.Size = new System.Drawing.Size(198, 22); + this.showEnumsToolStripMenuItem.Text = "Show Enums..."; + this.showEnumsToolStripMenuItem.Click += new System.EventHandler(this.showEnumsToolStripMenuItem_Click); + // // toolStripSeparator16 // this.toolStripSeparator16.Name = "toolStripSeparator16"; @@ -1338,14 +1347,6 @@ private void InitializeComponent() this.aboutToolStripMenuItem.Text = "About..."; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // - // showEnumsToolStripMenuItem - // - this.showEnumsToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Category; - this.showEnumsToolStripMenuItem.Name = "showEnumsToolStripMenuItem"; - this.showEnumsToolStripMenuItem.Size = new System.Drawing.Size(198, 22); - this.showEnumsToolStripMenuItem.Text = "Show Enums..."; - this.showEnumsToolStripMenuItem.Click += new System.EventHandler(this.showEnumsToolStripMenuItem_Click); - // // MainForm // this.AllowDrop = true; diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 11d66d37..28f1f7c0 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -112,7 +112,7 @@ void UpdateClassNodes(BaseNode node) projectView.Clear(); projectView.AddEnums(currentProject.Enums); projectView.AddClasses(currentProject.Classes); - memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault(); + CurrentClassNode = currentProject.Classes.FirstOrDefault(); } /// Opens the and calls with the result. @@ -123,12 +123,13 @@ private void AskAddOrInsertBytes(string title, Action callback) Contract.Requires(title != null); Contract.Requires(callback != null); - if (memoryViewControl.ClassNode == null) + var classNode = CurrentClassNode; + if (classNode == null) { return; } - using (var ib = new InputBytesForm(memoryViewControl.ClassNode.MemorySize)) + using (var ib = new InputBytesForm(classNode.MemorySize)) { ib.Text = title; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 3fe93267..e230d942 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -29,6 +29,10 @@ public partial class MainForm : IconForm private ReClassNetProject currentProject; public ReClassNetProject CurrentProject => currentProject; + private ClassNode currentClassNode; + + private readonly MemoryBuffer memoryViewBuffer = new MemoryBuffer(); + private Task updateProcessInformationsTask; private Task loadSymbolsTask; private CancellationTokenSource loadSymbolsTaskToken; @@ -37,6 +41,20 @@ public partial class MainForm : IconForm public MenuStrip MainMenu => mainMenuStrip; + public ClassNode CurrentClassNode + { + get => currentClassNode; + set + { + currentClassNode = value; + + projectView.SelectedClass = value; + + memoryViewControl.Reset(); + memoryViewControl.Invalidate(); + } + } + public MainForm() { Contract.Ensures(pluginManager != null); @@ -62,9 +80,6 @@ public MainForm() processInfoToolStripStatusLabel.Text = "No process selected"; }; - memoryViewControl.Process = Program.RemoteProcess; - memoryViewControl.Memory = new MemoryBuffer(); - pluginManager = new PluginManager(new DefaultPluginHost(this, Program.RemoteProcess, Program.Logger)); } @@ -250,8 +265,6 @@ private void goToClassToolStripMenuItem_Click(object sender, EventArgs e) private void clearProjectToolStripMenuItem_Click(object sender, EventArgs e) { SetProject(new ReClassNetProject()); - - memoryViewControl.ClassNode = null; } private void saveToolStripMenuItem_Click(object sender, EventArgs e) @@ -744,9 +757,7 @@ private void processUpdateTimer_Tick(object sender, EventArgs e) private void classesView_ClassSelected(object sender, ClassNode node) { - memoryViewControl.ClassNode = node; - - memoryViewControl.Invalidate(); + CurrentClassNode = node; } private void memoryViewControl_KeyDown(object sender, KeyEventArgs e) @@ -975,5 +986,25 @@ private void showEnumsToolStripMenuItem_Click(object sender, EventArgs e) elf.ShowDialog(); } } + + private void memoryViewControl_DrawContextRequested(object sender, DrawContextRequestEventArgs args) + { + var process = Program.RemoteProcess; + + var classNode = CurrentClassNode; + if (classNode != null) + { + classNode.UpdateAddress(process); + + memoryViewBuffer.Size = classNode.MemorySize; + memoryViewBuffer.UpdateFrom(process, classNode.Address); + + args.Settings = Program.Settings; + args.Process = process; + args.Memory = memoryViewBuffer; + args.Node = classNode; + args.BaseAddress = classNode.Address; + } + } } } diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 8025a590..5b3f1352 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -313,6 +313,7 @@ + diff --git a/ReClass.NET/UI/DrawContextRequestEventArgs.cs b/ReClass.NET/UI/DrawContextRequestEventArgs.cs new file mode 100644 index 00000000..1c874a3b --- /dev/null +++ b/ReClass.NET/UI/DrawContextRequestEventArgs.cs @@ -0,0 +1,23 @@ +using System; +using ReClassNET.Memory; +using ReClassNET.Nodes; + +namespace ReClassNET.UI +{ + public class DrawContextRequestEventArgs : EventArgs + { + public DateTime CurrentTime { get; set; } = DateTime.UtcNow; + + public Settings Settings { get; set; } + + public RemoteProcess Process { get; set; } + + public MemoryBuffer Memory { get; set; } + + public BaseNode Node { get; set; } + + public IntPtr BaseAddress { get; set; } + } + + public delegate void DrawContextRequestEventHandler(object sender, DrawContextRequestEventArgs args); +} diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 666a4c75..9e94db08 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; @@ -53,8 +51,6 @@ public SelectedNodeInfo(BaseNode node, RemoteProcess process, MemoryBuffer memor } } - private ClassNode classNode; - private readonly List hotSpots = new List(); private readonly List selectedNodes = new List(); @@ -63,41 +59,9 @@ public SelectedNodeInfo(BaseNode node, RemoteProcess process, MemoryBuffer memor private readonly FontEx font; - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public ClassNode ClassNode - { - get => classNode; - set - { - editBox.Visible = false; - - ClearSelection(); - - OnSelectionChanged(); - - classNode = value; - - VerticalScroll.Value = VerticalScroll.Minimum; - if (classNode != null && Process != null) - { - classNode.UpdateAddress(Process); - } - - Invalidate(); - } - } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public RemoteProcess Process { get; set; } - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public MemoryBuffer Memory { get; set; } - public ContextMenuStrip NodeContextMenuStrip { get; set; } + public event DrawContextRequestEventHandler DrawContextRequested; public event EventHandler SelectionChanged; public event NodeClickEventHandler ChangeClassTypeClick; public event NodeClickEventHandler ChangeWrappedTypeClick; @@ -144,6 +108,11 @@ protected override void OnPaint(PaintEventArgs e) return; } + var args = new DrawContextRequestEventArgs(); + + var requestHandler = DrawContextRequested; + requestHandler?.Invoke(this, args); + hotSpots.Clear(); using (var brush = new SolidBrush(Program.Settings.BackgroundColor)) @@ -151,86 +120,69 @@ protected override void OnPaint(PaintEventArgs e) e.Graphics.FillRectangle(brush, ClientRectangle); } - if (ClassNode == null) + if (args.Process == null || args.Memory == null || args.Node == null) { return; } - if (Process != null) - { - ClassNode.UpdateAddress(Process); - } - if (memoryPreviewPopUp.Visible) { memoryPreviewPopUp.UpdateMemory(); } - Memory.Size = ClassNode.MemorySize; - Memory.UpdateFrom(Process, ClassNode.Address); - var view = new ViewInfo { - Settings = Program.Settings, + Settings = args.Settings, Context = e.Graphics, Font = font, - Process = Process, - Memory = Memory, - CurrentTime = DateTime.UtcNow, + Process = args.Process, + Memory = args.Memory, + CurrentTime = args.CurrentTime, ClientArea = ClientRectangle, HotSpots = hotSpots, - Address = classNode.Address, + Address = args.BaseAddress, Level = 0, MultipleNodesSelected = selectedNodes.Count > 1 }; - try - { - var drawnSize = ClassNode.Draw( - view, - -HorizontalScroll.Value, - -VerticalScroll.Value * font.Height - ); - drawnSize.Width += 50; - - /*foreach (var spot in hotSpots.Where(h => h.Type == HotSpotType.Select)) - { - e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); - }*/ + var drawnSize = args.Node.Draw( + view, + -HorizontalScroll.Value, + -VerticalScroll.Value * font.Height + ); + drawnSize.Width += 10; - if (drawnSize.Height > ClientSize.Height) - { - VerticalScroll.Enabled = true; + /*foreach (var spot in hotSpots.Where(h => h.Type == HotSpotType.Select)) + { + e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); + }*/ - VerticalScroll.LargeChange = ClientSize.Height / font.Height; - VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; - } - else - { - VerticalScroll.Enabled = false; + if (drawnSize.Height > ClientSize.Height) + { + VerticalScroll.Enabled = true; - VerticalScroll.Value = VerticalScroll.Minimum; - } + VerticalScroll.LargeChange = ClientSize.Height / font.Height; + VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; + } + else + { + VerticalScroll.Enabled = false; - if (drawnSize.Width > ClientSize.Width) - { - HorizontalScroll.Enabled = true; + VerticalScroll.Value = VerticalScroll.Minimum; + } - HorizontalScroll.LargeChange = ClientSize.Width; - HorizontalScroll.Maximum = drawnSize.Width - ClientSize.Width + HorizontalScroll.LargeChange; - } - else - { - HorizontalScroll.Enabled = false; + if (drawnSize.Width > ClientSize.Width) + { + HorizontalScroll.Enabled = true; - HorizontalScroll.Value = HorizontalScroll.Minimum; - } + HorizontalScroll.LargeChange = ClientSize.Width; + HorizontalScroll.Maximum = drawnSize.Width - ClientSize.Width + HorizontalScroll.LargeChange; } - catch (Exception) + else { - Debug.Assert(false); + HorizontalScroll.Enabled = false; - throw; + HorizontalScroll.Value = HorizontalScroll.Minimum; } } @@ -759,5 +711,17 @@ public void ClearSelection() //Invalidate(); } + + /// + /// Resets the control to the initial state. + /// + public void Reset() + { + ClearSelection(); + + editBox.Visible = false; + + VerticalScroll.Value = VerticalScroll.Minimum; + } } } From 74d6ccf6f45aa6637a355fc33c3970b038548b90 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 16 May 2019 11:02:54 +0200 Subject: [PATCH 631/777] Initialize the PointerNode with a class instance because this is the average use case. (Fixes #112) --- ReClass.NET/Nodes/PointerNode.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 584a1f3f..d84ef2f6 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -18,6 +18,15 @@ public PointerNode() LevelsOpen.DefaultValue = true; } + public override void Initialize() + { + var node = new ClassInstanceNode(); + node.Initialize(); + ((BaseContainerNode)node.InnerNode).AddBytes(16 * IntPtr.Size); + + ChangeInnerNode(node); + } + public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "Pointer"; From 7710bedb280f94a6e6587ec94411f1bd292a512d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 16 May 2019 11:47:02 +0200 Subject: [PATCH 632/777] Decoupled address parsing from ClassNode. --- ReClass.NET/Forms/MainForm.cs | 17 +++++++++--- ReClass.NET/Nodes/ClassNode.cs | 38 ++------------------------ ReClass.NET/UI/LinkedWindowFeatures.cs | 6 ++-- 3 files changed, 19 insertions(+), 42 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index e230d942..0ea6c239 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using ReClassNET.AddressParser; using ReClassNET.CodeGenerator; using ReClassNET.Core; using ReClassNET.DataExchange.ReClass; @@ -994,16 +995,24 @@ private void memoryViewControl_DrawContextRequested(object sender, DrawContextRe var classNode = CurrentClassNode; if (classNode != null) { - classNode.UpdateAddress(process); - memoryViewBuffer.Size = classNode.MemorySize; - memoryViewBuffer.UpdateFrom(process, classNode.Address); + + IntPtr address; + try + { + address = process.ParseAddress(classNode.AddressFormula); + } + catch (ParseException) + { + address = IntPtr.Zero; + } + memoryViewBuffer.UpdateFrom(process, address); args.Settings = Program.Settings; args.Process = process; args.Memory = memoryViewBuffer; args.Node = classNode; - args.BaseAddress = classNode.Address; + args.BaseAddress = address; } } } diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index a0642a49..49442810 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -1,13 +1,8 @@ using System; -using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; -using ReClassNET.AddressParser; -using ReClassNET.Extensions; -using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -19,8 +14,10 @@ public class ClassNode : BaseContainerNode #if RECLASSNET64 public static IntPtr DefaultAddress { get; } = (IntPtr)0x140000000; + public static string DefaultAddressFormula { get; } = "140000000"; #else public static IntPtr DefaultAddress { get; } = (IntPtr)0x400000; + public static string DefaultAddressFormula { get; } = "400000"; #endif public override int MemorySize => Nodes.Sum(n => n.MemorySize); @@ -39,20 +36,7 @@ public NodeUuid Uuid } } - private IntPtr address; - - public IntPtr Address - { - get => address; - set - { - Contract.Ensures(AddressFormula != null); - address = value; - AddressFormula = value.ToString("X"); - } - } - - public string AddressFormula { get; set; } + public string AddressFormula { get; set; } = DefaultAddressFormula; public event NodeEventHandler NodesChanged; @@ -64,8 +48,6 @@ internal ClassNode(bool notifyClassCreated) Uuid = new NodeUuid(true); - Address = DefaultAddress; - if (notifyClassCreated) { ClassCreated?.Invoke(this); @@ -208,20 +190,6 @@ public override void Update(HotSpot spot) } } - public void UpdateAddress(RemoteProcess process) - { - Contract.Requires(process != null); - - try - { - address = process.ParseAddress(AddressFormula); - } - catch (ParseException) - { - Address = IntPtr.Zero; - } - } - protected internal override void ChildHasChanged(BaseNode child) { NodesChanged?.Invoke(this); diff --git a/ReClass.NET/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs index 02f3f3e9..14eeb691 100644 --- a/ReClass.NET/UI/LinkedWindowFeatures.cs +++ b/ReClass.NET/UI/LinkedWindowFeatures.cs @@ -22,10 +22,10 @@ public static ClassNode CreateClassAtAddress(IntPtr address, bool addDefaultByte var classView = Program.MainForm.ProjectView; var node = ClassNode.Create(); - node.Address = address; + node.AddressFormula = address.ToString("X"); if (addDefaultBytes) { - node.AddBytes(64); + node.AddBytes(16 * IntPtr.Size); } classView.SelectedClass = node; @@ -56,7 +56,7 @@ public static void SetCurrentClassAddress(IntPtr address) return; } - classNode.Address = address; + classNode.AddressFormula = address.ToString("X"); } public static void FindWhatInteractsWithAddress(IntPtr address, int size, bool writeOnly) From 5849827e0a15224396cebfb1a3ba056eb3c9f447 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 18 Jun 2019 20:28:46 +0200 Subject: [PATCH 633/777] Updated to VS2019. --- NativeCore/Windows/NativeCore.vcxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 6af17c1f..b2b2b2d8 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -22,32 +22,32 @@ {22CA6FDB-7622-4F94-8FC2-2E7AB481C86F} Win32Proj NativeCore - 10.0.17134.0 + 10.0 DynamicLibrary true - v141 + v142 Unicode DynamicLibrary false - v141 + v142 true MultiByte DynamicLibrary true - v141 + v142 MultiByte DynamicLibrary false - v141 + v142 true MultiByte From 76c75306f615e1cf9c78b50e59c203a8eb75fce2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 18 Jun 2019 20:29:06 +0200 Subject: [PATCH 634/777] Added RemoteMemoryReader parameter. --- ReClass.NET/Nodes/BaseHexCommentNode.cs | 2 +- ReClass.NET/Nodes/INodeInfoReader.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 063dd8c5..6754358e 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -85,7 +85,7 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu foreach (var reader in NodeInfoReader) { - var info = reader.ReadNodeInfo(this, nodeAddress, ivalue, view.Memory); + var info = reader.ReadNodeInfo(this, view.Process, view.Memory, nodeAddress, ivalue); if (info != null) { x = AddText(view, x, y, view.Settings.PluginColor, HotSpot.ReadOnlyId, info) + view.Font.Width; diff --git a/ReClass.NET/Nodes/INodeInfoReader.cs b/ReClass.NET/Nodes/INodeInfoReader.cs index 59a3a249..75289ccf 100644 --- a/ReClass.NET/Nodes/INodeInfoReader.cs +++ b/ReClass.NET/Nodes/INodeInfoReader.cs @@ -11,19 +11,21 @@ public interface INodeInfoReader /// Used to print custom informations about a node. ///
/// The node. - /// The absolute address of the node. - /// /// The memory value of the node as . + /// The current . /// The current . + /// The absolute address of the node. + /// The memory value of the node as . /// Custom informations about the node or null. - string ReadNodeInfo(BaseHexCommentNode node, IntPtr nodeAddress, IntPtr nodeValue, MemoryBuffer memory); + string ReadNodeInfo(BaseHexCommentNode node, IRemoteMemoryReader reader, MemoryBuffer memory, IntPtr nodeAddress, IntPtr nodeValue); } [ContractClassFor(typeof(INodeInfoReader))] internal abstract class NodeInfoReaderContract : INodeInfoReader { - public string ReadNodeInfo(BaseHexCommentNode node, IntPtr nodeAddress, IntPtr nodeValue, MemoryBuffer memory) + public string ReadNodeInfo(BaseHexCommentNode node, IRemoteMemoryReader reader, MemoryBuffer memory, IntPtr nodeAddress, IntPtr nodeValue) { Contract.Requires(node != null); + Contract.Requires(reader != null); Contract.Requires(memory != null); throw new NotImplementedException(); From fffad0555b74f49191657ee4afc056f9897b50b3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 23 Jun 2019 20:21:39 +0200 Subject: [PATCH 635/777] Made strings copyable. (#115) --- ReClass.NET/Nodes/BaseTextPtrNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 3c108dd5..116bf166 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -47,7 +47,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) } x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "= '"); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text); + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, text); x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; x = AddComment(view, x, y); From c19403b6021498d578a11009d3b4a3f2c6f2ce79 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 23 Jun 2019 20:35:26 +0200 Subject: [PATCH 636/777] Increased read character count (#115). --- ReClass.NET/Memory/RemoteProcess.cs | 2 +- ReClass.NET/Nodes/BaseTextPtrNode.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 3c04c8fa..8c65e2e2 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -296,7 +296,7 @@ public string ReadRemoteString(Encoding encoding, IntPtr address, int length) var sb = new StringBuilder(encoding.GetString(data)); for (var i = 0; i < sb.Length; ++i) { - if (sb[i] == 0) + if (sb[i] == '\0') { sb.Length = i; break; diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 116bf166..d7f8bee9 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -8,6 +8,8 @@ namespace ReClassNET.Nodes { public abstract class BaseTextPtrNode : BaseNode { + private const int MaxStringCharacterCount = 256; + public override int MemorySize => IntPtr.Size; /// The encoding of the string. @@ -30,7 +32,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) } var ptr = view.Memory.ReadIntPtr(Offset); - var text = view.Process.ReadRemoteString(Encoding, ptr, 64); + var text = view.Process.ReadRemoteString(Encoding, ptr, MaxStringCharacterCount); var origX = x; From 28515e2c455efefd1bcd72ef818773fef160056f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 23 Jun 2019 20:41:27 +0200 Subject: [PATCH 637/777] Made just the string selectable. --- ReClass.NET/Nodes/BaseHexCommentNode.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index 6754358e..d58e7652 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -66,16 +66,26 @@ protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalu { var data = view.Process.ReadRemoteMemory(ivalue, 64); + var isWideString = false; + string text = null; + // First check if it could be an UTF8 string and if not try UTF16. if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsPrintableData()) { - var text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"'{text}'") + view.Font.Width; + text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); } else if(data.Take(IntPtr.Size * 2).InterpretAsDoubleByteCharacter().IsPrintableData()) { - var text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, $"L'{text}'") + view.Font.Width; + isWideString = true; + + text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); + } + + if (text != null) + { + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, isWideString ? "L'" : "'"); + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, text); + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; } } From 3147cebd2936c24e88b7a3ed6f9d0821f6acf0c2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 30 Jun 2019 22:51:30 +0200 Subject: [PATCH 638/777] Added TryGetHexString tests. --- ReClass.NET/Extensions/StringExtensions.cs | 6 ++++-- .../Extensions/StringExtensionTest.cs | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Extensions/StringExtensions.cs b/ReClass.NET/Extensions/StringExtensions.cs index 31baa487..51ae20d2 100644 --- a/ReClass.NET/Extensions/StringExtensions.cs +++ b/ReClass.NET/Extensions/StringExtensions.cs @@ -97,10 +97,12 @@ public static string LimitLength(this string s, int length) return s.Substring(0, length); } - private static readonly Regex HexRegex = new Regex("(0x|h)?([0-9A-F]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex hexadecimalValueRegex = new Regex("^(0x|h)?([0-9A-F]+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static bool TryGetHexString(this string s, out string value) { - var match = HexRegex.Match(s); + Contract.Requires(s != null); + + var match = hexadecimalValueRegex.Match(s); value = match.Success ? match.Groups[2].Value : null; return match.Success; diff --git a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs index 0166d90a..f1a0fcde 100644 --- a/ReClass.NET_Tests/Extensions/StringExtensionTest.cs +++ b/ReClass.NET_Tests/Extensions/StringExtensionTest.cs @@ -146,5 +146,24 @@ public void TestIsNotLikelyPrintableData(params char[] sut) { Check.That(sut.IsPrintableData()).IsFalse(); } + + [Theory] + [InlineData("", false, null)] + [InlineData("-", false, null)] + [InlineData("-0", false, null)] + [InlineData("-0x0", false, null)] + [InlineData("-h0", false, null)] + [InlineData("0", true, "0")] + [InlineData("h0", true, "0")] + [InlineData("0x0", true, "0")] + [InlineData("0123456789abcdef", true, "0123456789abcdef")] + [InlineData("h0123456789abcdef", true, "0123456789abcdef")] + [InlineData("0x0123456789abcdef", true, "0123456789abcdef")] + [InlineData("0123456789ABCDEF", true, "0123456789ABCDEF")] + public void TestTryGetHexString(string input, bool expectedResult, string expectedValue) + { + Check.That(input.TryGetHexString(out var value)).IsEqualTo(expectedResult); + Check.That(value).IsEqualTo(expectedValue); + } } } From 0be7a4349fce1a1a6254a624f9def8e7c6f43c91 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 4 Jul 2019 22:09:05 +0200 Subject: [PATCH 639/777] Changed method name. --- ReClass.NET/Extensions/IntPtrExtensions.cs | 6 +++--- ReClass.NET/MemoryScanner/Scanner.cs | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index e98eee15..b592914b 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -20,7 +20,7 @@ public static bool MayBeValid(this IntPtr ptr) #if RECLASSNET64 return ptr.InRange((IntPtr)0x10000, (IntPtr)long.MaxValue); #else - return ptr.InRange((IntPtr)0x10000, (IntPtr)int.MaxValue); + return ptr.IsInRange((IntPtr)0x10000, (IntPtr)int.MaxValue); #endif } @@ -94,7 +94,7 @@ public static IntPtr Negate(this IntPtr ptr) [Pure] [DebuggerStepThrough] - public static bool InRange(this IntPtr address, IntPtr start, IntPtr end) + public static bool IsInRange(this IntPtr address, IntPtr start, IntPtr end) { #if RECLASSNET64 var val = (ulong)address.ToInt64(); @@ -120,7 +120,7 @@ public static int CompareTo(this IntPtr lhs, IntPtr rhs) [DebuggerStepThrough] public static int CompareToRange(this IntPtr address, IntPtr start, IntPtr end) { - if (InRange(address, start, end)) + if (IsInRange(address, start, end)) { return 0; } diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 9f0aa41e..ee0820fc 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -122,9 +122,9 @@ private IList
GetSearchableSections() return process.Sections .Where(s => !s.Protection.HasFlag(SectionProtection.Guard)) - .Where(s => s.Start.InRange(Settings.StartAddress, Settings.StopAddress) - || Settings.StartAddress.InRange(s.Start, s.End) - || Settings.StopAddress.InRange(s.Start, s.End)) + .Where(s => s.Start.IsInRange(Settings.StartAddress, Settings.StopAddress) + || Settings.StartAddress.IsInRange(s.Start, s.End) + || Settings.StopAddress.IsInRange(s.Start, s.End)) .Where(s => { switch (s.Type) @@ -228,12 +228,12 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca var end = s.Address + s.Size; var size = s.Size; - if (Settings.StartAddress.InRange(start, end)) + if (Settings.StartAddress.IsInRange(start, end)) { size = size - Settings.StartAddress.Sub(start).ToInt32(); start = Settings.StartAddress; } - if (Settings.StopAddress.InRange(start, end)) + if (Settings.StopAddress.IsInRange(start, end)) { size = size - end.Sub(Settings.StopAddress).ToInt32(); } From af380879e748ed4f56d7c795d35ce00d95a7cb82 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 4 Jul 2019 22:45:25 +0200 Subject: [PATCH 640/777] Added tests for IntPtrExtension. --- ReClass.NET/Extensions/IntPtrExtensions.cs | 4 + .../Extensions/IntPtrExtensionTest.cs | 103 ++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + 3 files changed, 108 insertions(+) create mode 100644 ReClass.NET_Tests/Extensions/IntPtrExtensionTest.cs diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index b592914b..88c73773 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -156,11 +156,15 @@ public static long ToInt64Bits(this IntPtr ptr) #endif } + [Pure] + [DebuggerStepThrough] public static IntPtr From(int value) { return (IntPtr)value; } + [Pure] + [DebuggerStepThrough] public static IntPtr From(long value) { #if RECLASSNET64 diff --git a/ReClass.NET_Tests/Extensions/IntPtrExtensionTest.cs b/ReClass.NET_Tests/Extensions/IntPtrExtensionTest.cs new file mode 100644 index 00000000..786c681f --- /dev/null +++ b/ReClass.NET_Tests/Extensions/IntPtrExtensionTest.cs @@ -0,0 +1,103 @@ +using System; +using NFluent; +using ReClassNET.Extensions; +using Xunit; + +namespace ReClass.NET_Tests.Extensions +{ + public class IntPtrExtensionTest + { + public static TheoryData GetTestIsNullData => new TheoryData + { + { IntPtr.Zero, true }, + { (IntPtr)1, false } + }; + + [Theory] + [MemberData(nameof(GetTestIsNullData))] + public void TestIsNull(IntPtr ptr, bool expected) + { + Check.That(ptr.IsNull()).IsEqualTo(expected); + } + + public static TheoryData GetTestMayBeValidData => new TheoryData + { + { IntPtr.Zero, false }, + { (IntPtr)1, false }, + { (IntPtr)0x10000, true }, + { (IntPtr)int.MaxValue, true }, +#if RECLASSNET64 + { (IntPtr)long.MaxValue + 1, false } +#else + { (IntPtr)int.MaxValue + 1, false } +#endif + }; + + [Theory] + [MemberData(nameof(GetTestMayBeValidData))] + public void TestMayBeValid(IntPtr ptr, bool expected) + { + Check.That(ptr.MayBeValid()).IsEqualTo(expected); + } + + public static TheoryData GetTestIsInRangeData => new TheoryData + { + { (IntPtr)10, (IntPtr)100, (IntPtr)1000, false }, + { (IntPtr)100, (IntPtr)100, (IntPtr)1000, true }, + { (IntPtr)500, (IntPtr)100, (IntPtr)1000, true }, + { (IntPtr)1000, (IntPtr)100, (IntPtr)1000, true }, + { (IntPtr)1500, (IntPtr)100, (IntPtr)1000, false } + }; + + [Theory] + [MemberData(nameof(GetTestIsInRangeData))] + public void TestIsInRange(IntPtr ptr, IntPtr start, IntPtr end, bool expected) + { + Check.That(ptr.IsInRange(start, end)).IsEqualTo(expected); + } + + public static TheoryData GetTestCompareToData => new TheoryData + { + { (IntPtr)10, (IntPtr)100, -1 }, + { (IntPtr)100, (IntPtr)100, 0 }, + { (IntPtr)500, (IntPtr)100, 1 } + }; + + [Theory] + [MemberData(nameof(GetTestCompareToData))] + public void TestCompareTo(IntPtr ptr, IntPtr other, int expected) + { + Check.That(ptr.CompareTo(other)).IsEqualTo(expected); + } + + public static TheoryData GetTestCompareToRangeData => new TheoryData + { + { (IntPtr)10, (IntPtr)100, (IntPtr)1000, -1 }, + { (IntPtr)100, (IntPtr)100, (IntPtr)1000, 0 }, + { (IntPtr)500, (IntPtr)100, (IntPtr)1000, 0 }, + { (IntPtr)1000, (IntPtr)100, (IntPtr)1000, 0 }, + { (IntPtr)1500, (IntPtr)100, (IntPtr)1000, 1 } + }; + + [Theory] + [MemberData(nameof(GetTestCompareToRangeData))] + public void TestCompareToRange(IntPtr ptr, IntPtr start, IntPtr end, int expected) + { + Check.That(ptr.CompareToRange(start, end)).IsEqualTo(expected); + } + + public static TheoryData GetTestToInt64BitsData => new TheoryData + { + { (IntPtr)0x10, 0x10L }, + { (IntPtr)int.MaxValue, 0x7FFF_FFFFL }, + { (IntPtr)int.MaxValue + 1, 0x8000_0000L } + }; + + [Theory] + [MemberData(nameof(GetTestToInt64BitsData))] + public void TestToInt64Bits(IntPtr ptr, long expected) + { + Check.That(ptr.ToInt64Bits()).IsEqualTo(expected); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index f205bfcc..3494eb4c 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -73,6 +73,7 @@ + From 8f9b29ca81dccd1cf64f26a06657fb98ebaae515 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Jul 2019 22:35:45 +0200 Subject: [PATCH 641/777] Implemented IEquatable. --- ReClass.NET/MemoryScanner/ScanResult.cs | 137 ++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 8 deletions(-) diff --git a/ReClass.NET/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs index cad1b337..6ebd4766 100644 --- a/ReClass.NET/MemoryScanner/ScanResult.cs +++ b/ReClass.NET/MemoryScanner/ScanResult.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics.Contracts; +using System.Linq; using System.Text; namespace ReClassNET.MemoryScanner @@ -13,7 +14,7 @@ public abstract class ScanResult public abstract ScanResult Clone(); } - public class ByteScanResult : ScanResult + public class ByteScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Byte; @@ -28,9 +29,24 @@ public override ScanResult Clone() { return new ByteScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as ByteScanResult); + } + + public bool Equals(ByteScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class ShortScanResult : ScanResult + public class ShortScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Short; @@ -45,9 +61,24 @@ public override ScanResult Clone() { return new ShortScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as ShortScanResult); + } + + public bool Equals(ShortScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class IntegerScanResult : ScanResult + public class IntegerScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Integer; @@ -62,9 +93,24 @@ public override ScanResult Clone() { return new IntegerScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as IntegerScanResult); + } + + public bool Equals(IntegerScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class LongScanResult : ScanResult + public class LongScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Long; @@ -79,9 +125,24 @@ public override ScanResult Clone() { return new LongScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as LongScanResult); + } + + public bool Equals(LongScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class FloatScanResult : ScanResult + public class FloatScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Float; @@ -96,9 +157,24 @@ public override ScanResult Clone() { return new FloatScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as FloatScanResult); + } + + public bool Equals(FloatScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class DoubleScanResult : ScanResult + public class DoubleScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Double; @@ -113,9 +189,24 @@ public override ScanResult Clone() { return new DoubleScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as DoubleScanResult); + } + + public bool Equals(DoubleScanResult other) + { + return other != null && Address == other.Address && Value == other.Value; + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class ArrayOfBytesScanResult : ScanResult + public class ArrayOfBytesScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.ArrayOfBytes; @@ -132,9 +223,24 @@ public override ScanResult Clone() { return new ArrayOfBytesScanResult(Value) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as ArrayOfBytesScanResult); + } + + public bool Equals(ArrayOfBytesScanResult other) + { + return other != null && Address == other.Address && Enumerable.SequenceEqual(Value, other.Value); + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode(); + } } - public class StringScanResult : ScanResult + public class StringScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.String; @@ -155,5 +261,20 @@ public override ScanResult Clone() { return new StringScanResult(Value, Encoding) { Address = Address }; } + + public override bool Equals(object obj) + { + return Equals(obj as StringScanResult); + } + + public bool Equals(StringScanResult other) + { + return other != null && Address == other.Address && Value == other.Value && Encoding.Equals(other.Encoding); + } + + public override int GetHashCode() + { + return Address.GetHashCode() * 19 + Value.GetHashCode() * 19 + Encoding.GetHashCode(); + } } } From 55815f236a63bb0c1a36a376324f05673a73b827 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Jul 2019 22:36:47 +0200 Subject: [PATCH 642/777] Added tests for IntegerMemoryComparer. --- .../Comparer/IntegerMemoryComparer.cs | 153 ++++++++-------- .../Comparer/IntegerMemoryComparerTest.cs | 166 ++++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 1 + 3 files changed, 244 insertions(+), 76 deletions(-) create mode 100644 ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index 3a8b97ba..aefd4235 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -29,45 +29,37 @@ public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2 public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = BitConverter.ToInt32(data, index); - - bool IsMatch() - { - switch (CompareType) + return CompareInternal( + data, + index, + value => { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) - { - return false; - } - - result = new IntegerScanResult(value); - - return true; + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case ScanCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) @@ -80,49 +72,58 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult } public bool Compare(byte[] data, int index, IntegerScanResult previous, out ScanResult result) + { + return CompareInternal( + data, + index, + value => + { + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + + case ScanCompareType.Changed: + return value != previous.Value; + case ScanCompareType.NotChanged: + return value == previous.Value; + case ScanCompareType.Increased: + return value > previous.Value; + case ScanCompareType.IncreasedOrEqual: + return value >= previous.Value; + case ScanCompareType.Decreased: + return value < previous.Value; + case ScanCompareType.DecreasedOrEqual: + return value <= previous.Value; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); + } + + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; var value = BitConverter.ToInt32(data, index); - bool IsMatch() - { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) + if (!matcher(value)) { return false; } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs new file mode 100644 index 00000000..027432bc --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs @@ -0,0 +1,166 @@ +using System; +using NFluent; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner.Comparer +{ + public class IntegerMemoryComparerTest + { + [Theory] + [InlineData(ScanCompareType.Equal, 0, 0)] + [InlineData(ScanCompareType.Equal, 1, 2)] + [InlineData(ScanCompareType.Equal, 2, 1)] + [InlineData(ScanCompareType.Between, 2, 4)] + [InlineData(ScanCompareType.BetweenOrEqual, 4, 2)] + [InlineData(ScanCompareType.NotEqual, 0, 0)] + public void TestConstructor(ScanCompareType compareType, int value1, int value2) + { + var sut = new IntegerMemoryComparer(compareType, value1, value2); + + Check.That(sut.CompareType).IsEqualTo(compareType); + Check.That(sut.ValueSize).IsEqualTo(sizeof(int)); + Check.That(sut.Value1).IsOneOf(value1, value2); + Check.That(sut.Value2).IsOneOf(value1, value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + Check.That(sut.Value1 <= sut.Value2).IsTrue(); + } + } + + public static TheoryData GetTestCompareBasicData() => new TheoryData + { + { ScanCompareType.Equal, 0, 0, BitConverter.GetBytes(0), true, new IntegerScanResult(0) }, + { ScanCompareType.Equal, 0, 0, BitConverter.GetBytes(1), false, null }, + { ScanCompareType.Equal, 1, 0, BitConverter.GetBytes(1), true, new IntegerScanResult(1) }, + { ScanCompareType.Equal, 1, 0, BitConverter.GetBytes(0), false, null }, + { ScanCompareType.NotEqual, 1, 0, BitConverter.GetBytes(0), true, new IntegerScanResult(0) }, + { ScanCompareType.NotEqual, 1, 0, BitConverter.GetBytes(1), false, null }, + { ScanCompareType.GreaterThan, 1, 0, BitConverter.GetBytes(0), false, null }, + { ScanCompareType.GreaterThan, 1, 0, BitConverter.GetBytes(2), true, new IntegerScanResult(2) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes(0), false, null }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes(1), true, new IntegerScanResult(1) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes(2), true, new IntegerScanResult(2) }, + { ScanCompareType.LessThan, 1, 0, BitConverter.GetBytes(1), false, null }, + { ScanCompareType.LessThan, 1, 0, BitConverter.GetBytes(0), true, new IntegerScanResult(0) }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes(2), false, null }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes(1), true, new IntegerScanResult(1) }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes(0), true, new IntegerScanResult(0) }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes(0), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes(1), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes(2), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes(3), false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes(0), false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes(1), true, new IntegerScanResult(1) }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes(2), true, new IntegerScanResult(2) }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes(3), false, null } + }; + + public static TheoryData GetTestCompareScanCompareTypeUnknownData() => new TheoryData + { + { ScanCompareType.Unknown, 0, 0, BitConverter.GetBytes(0), true, new IntegerScanResult(0) }, + { ScanCompareType.Unknown, 0, 0, BitConverter.GetBytes(1), true, new IntegerScanResult(1) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareBasicData))] + [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] + public void TestCompare(ScanCompareType compareType, int value1, int value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new IntegerMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Theory] + [InlineData(ScanCompareType.Changed)] + [InlineData(ScanCompareType.NotChanged)] + [InlineData(ScanCompareType.Decreased)] + [InlineData(ScanCompareType.DecreasedOrEqual)] + [InlineData(ScanCompareType.Increased)] + [InlineData(ScanCompareType.IncreasedOrEqual)] + public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) + { + var sut = new IntegerMemoryComparer(compareType, 0, 0); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0), 0, out _)).Throws(); + } + + public static TheoryData GetTestCompareThrowsData() => new TheoryData + { + { null, 0, typeof(ArgumentNullException) }, + { new byte[0], 0, typeof(ArgumentOutOfRangeException) }, + { new byte[4], 4, typeof(ArgumentOutOfRangeException) }, + { new byte[3], 0, typeof(ArgumentException) }, + { new byte[4], 1, typeof(ArgumentException) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareThrowsData))] + public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) + { + var sut = new IntegerMemoryComparer(ScanCompareType.Equal, 0, 0); + + Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); + } + + public static TheoryData GetTestCompareWithPreviousData() + { + var data = new TheoryData + { + { ScanCompareType.Changed, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), true, new IntegerScanResult(0) }, + { ScanCompareType.Changed, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), false, null }, + { ScanCompareType.NotChanged, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), true, new IntegerScanResult(1) }, + { ScanCompareType.NotChanged, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes(2), new IntegerScanResult(1), true, new IntegerScanResult(2) }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), false, null }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes(2), new IntegerScanResult(1), true, new IntegerScanResult(2) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), true, new IntegerScanResult(1) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), true, new IntegerScanResult(0) }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes(2), new IntegerScanResult(1), false, null }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes(0), new IntegerScanResult(1), true, new IntegerScanResult(0) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes(1), new IntegerScanResult(1), true, new IntegerScanResult(1) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes(2), new IntegerScanResult(1), false, null } + }; + + var basicData = GetTestCompareBasicData(); + foreach (var x in basicData) + { + data.Add((ScanCompareType)x[0], (int)x[1], (int)x[2], (byte[])x[3], new IntegerScanResult(1), (bool)x[4], (ScanResult)x[5]); + } + + return data; + } + + [Theory] + [MemberData(nameof(GetTestCompareWithPreviousData))] + public void TestCompareWithPrevious(ScanCompareType compareType, int value1, int value2, byte[] data, ScanResult previousScanResult, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new IntegerMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, previousScanResult, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Fact] + public void TestCompareWithPreviousThrows() + { + var sut = new IntegerMemoryComparer(ScanCompareType.Unknown, 0, 0); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0), 0, new IntegerScanResult(0), out _)).Throws(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 3494eb4c..df0caa72 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -80,6 +80,7 @@ + From dac1416ff09ae7d4d013bcd4a3dcf773c84875ec Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Jul 2019 23:13:06 +0200 Subject: [PATCH 643/777] Added tests. --- .../Comparer/ByteMemoryComparer.cs | 167 ++++++++++-------- .../Comparer/LongMemoryComparer.cs | 153 ++++++++-------- .../Comparer/ShortMemoryComparer.cs | 153 ++++++++-------- .../Comparer/ByteMemoryComparerTest.cs | 164 +++++++++++++++++ .../Comparer/LongMemoryComparerTest.cs | 166 +++++++++++++++++ .../Comparer/ShortMemoryComparerTest.cs | 166 +++++++++++++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 3 + 7 files changed, 744 insertions(+), 228 deletions(-) create mode 100644 ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs create mode 100644 ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs create mode 100644 ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs diff --git a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs index 4d175d9f..849c1c38 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer @@ -28,45 +29,37 @@ public ByteMemoryComparer(ScanCompareType compareType, byte value1, byte value2) public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = data[index]; - - bool IsMatch() - { - switch (CompareType) + return CompareInternal( + data, + index, + value => { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) - { - return false; - } - - result = new ByteScanResult(value); - - return true; + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case ScanCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) @@ -80,48 +73,70 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult public bool Compare(byte[] data, int index, ByteScanResult previous, out ScanResult result) { - result = null; + return CompareInternal( + data, + index, + value => + { + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + + case ScanCompareType.Changed: + return value != previous.Value; + case ScanCompareType.NotChanged: + return value == previous.Value; + case ScanCompareType.Increased: + return value > previous.Value; + case ScanCompareType.IncreasedOrEqual: + return value >= previous.Value; + case ScanCompareType.Decreased: + return value < previous.Value; + case ScanCompareType.DecreasedOrEqual: + return value <= previous.Value; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); + } - var value = data[index]; + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + { + result = null; - bool IsMatch() + if (data == null) { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } + throw new ArgumentNullException(nameof(data)); + } + if ((uint)index >= data.Length) + { + throw new ArgumentOutOfRangeException(nameof(index)); } + if (index > data.Length - 1) + { + throw new ArgumentException(); + } + + var value = data[index]; - if (!IsMatch()) + if (!matcher(value)) { return false; } diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index 662f1a99..baa5c4fb 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -29,45 +29,37 @@ public LongMemoryComparer(ScanCompareType compareType, long value1, long value2) public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = BitConverter.ToInt64(data, index); - - bool IsMatch() - { - switch (CompareType) + return CompareInternal( + data, + index, + value => { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) - { - return false; - } - - result = new LongScanResult(value); - - return true; + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case ScanCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) @@ -80,49 +72,58 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult } public bool Compare(byte[] data, int index, LongScanResult previous, out ScanResult result) + { + return CompareInternal( + data, + index, + value => + { + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + + case ScanCompareType.Changed: + return value != previous.Value; + case ScanCompareType.NotChanged: + return value == previous.Value; + case ScanCompareType.Increased: + return value > previous.Value; + case ScanCompareType.IncreasedOrEqual: + return value >= previous.Value; + case ScanCompareType.Decreased: + return value < previous.Value; + case ScanCompareType.DecreasedOrEqual: + return value <= previous.Value; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); + } + + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; var value = BitConverter.ToInt64(data, index); - bool IsMatch() - { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) + if (!matcher(value)) { return false; } diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index 8e541704..b40d25f5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -29,45 +29,37 @@ public ShortMemoryComparer(ScanCompareType compareType, short value1, short valu public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = BitConverter.ToInt16(data, index); - - bool IsMatch() - { - switch (CompareType) + return CompareInternal( + data, + index, + value => { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) - { - return false; - } - - result = new ShortScanResult(value); - - return true; + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + case ScanCompareType.Unknown: + return true; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) @@ -80,49 +72,58 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult } public bool Compare(byte[] data, int index, ShortScanResult previous, out ScanResult result) + { + return CompareInternal( + data, + index, + value => + { + switch (CompareType) + { + case ScanCompareType.Equal: + return value == Value1; + case ScanCompareType.NotEqual: + return value != Value1; + case ScanCompareType.GreaterThan: + return value > Value1; + case ScanCompareType.GreaterThanOrEqual: + return value >= Value1; + case ScanCompareType.LessThan: + return value < Value1; + case ScanCompareType.LessThanOrEqual: + return value <= Value1; + case ScanCompareType.Between: + return Value1 < value && value < Value2; + case ScanCompareType.BetweenOrEqual: + return Value1 <= value && value <= Value2; + + case ScanCompareType.Changed: + return value != previous.Value; + case ScanCompareType.NotChanged: + return value == previous.Value; + case ScanCompareType.Increased: + return value > previous.Value; + case ScanCompareType.IncreasedOrEqual: + return value >= previous.Value; + case ScanCompareType.Decreased: + return value < previous.Value; + case ScanCompareType.DecreasedOrEqual: + return value <= previous.Value; + default: + throw new InvalidCompareTypeException(CompareType); + } + }, + out result + ); + } + + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; var value = BitConverter.ToInt16(data, index); - bool IsMatch() - { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } - } - - if (!IsMatch()) + if (!matcher(value)) { return false; } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs new file mode 100644 index 00000000..c6d1d2b0 --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs @@ -0,0 +1,164 @@ +using System; +using NFluent; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner.Comparer +{ + public class ByteMemoryComparerTest + { + [Theory] + [InlineData(ScanCompareType.Equal, 0, 0)] + [InlineData(ScanCompareType.Equal, 1, 2)] + [InlineData(ScanCompareType.Equal, 2, 1)] + [InlineData(ScanCompareType.Between, 2, 4)] + [InlineData(ScanCompareType.BetweenOrEqual, 4, 2)] + [InlineData(ScanCompareType.NotEqual, 0, 0)] + public void TestConstructor(ScanCompareType compareType, byte value1, byte value2) + { + var sut = new ByteMemoryComparer(compareType, value1, value2); + + Check.That(sut.CompareType).IsEqualTo(compareType); + Check.That(sut.ValueSize).IsEqualTo(sizeof(byte)); + Check.That(sut.Value1).IsOneOf(value1, value2); + Check.That(sut.Value2).IsOneOf(value1, value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + Check.That(sut.Value1 <= sut.Value2).IsTrue(); + } + } + + public static TheoryData GetTestCompareBasicData() => new TheoryData + { + { ScanCompareType.Equal, 0, 0, new byte[] { 0 }, true, new ByteScanResult(0) }, + { ScanCompareType.Equal, 0, 0, new byte[] { 1 }, false, null }, + { ScanCompareType.Equal, 1, 0, new byte[] { 1 }, true, new ByteScanResult(1) }, + { ScanCompareType.Equal, 1, 0, new byte[] { 0 }, false, null }, + { ScanCompareType.NotEqual, 1, 0, new byte[] { 0 }, true, new ByteScanResult(0) }, + { ScanCompareType.NotEqual, 1, 0, new byte[] { 1 }, false, null }, + { ScanCompareType.GreaterThan, 1, 0, new byte[] { 0 }, false, null }, + { ScanCompareType.GreaterThan, 1, 0, new byte[] { 2 }, true, new ByteScanResult(2) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, new byte[] { 0 }, false, null }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, new byte[] { 1 }, true, new ByteScanResult(1) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, new byte[] { 2 }, true, new ByteScanResult(2) }, + { ScanCompareType.LessThan, 1, 0, new byte[] { 1 }, false, null }, + { ScanCompareType.LessThan, 1, 0, new byte[] { 0 }, true, new ByteScanResult(0) }, + { ScanCompareType.LessThanOrEqual, 1, 0, new byte[] { 2 }, false, null }, + { ScanCompareType.LessThanOrEqual, 1, 0, new byte[] { 1 }, true, new ByteScanResult(1) }, + { ScanCompareType.LessThanOrEqual, 1, 0, new byte[] { 0 }, true, new ByteScanResult(0) }, + { ScanCompareType.Between, 1, 2, new byte[] { 0 }, false, null }, + { ScanCompareType.Between, 1, 2, new byte[] { 1 }, false, null }, + { ScanCompareType.Between, 1, 2, new byte[] { 2 }, false, null }, + { ScanCompareType.Between, 1, 2, new byte[] { 3 }, false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, new byte[] { 0 }, false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, new byte[] { 1 }, true, new ByteScanResult(1) }, + { ScanCompareType.BetweenOrEqual, 1, 2, new byte[] { 2 }, true, new ByteScanResult(2) }, + { ScanCompareType.BetweenOrEqual, 1, 2, new byte[] { 3 }, false, null } + }; + + public static TheoryData GetTestCompareScanCompareTypeUnknownData() => new TheoryData + { + { ScanCompareType.Unknown, 0, 0, new byte[] { 0 }, true, new ByteScanResult(0) }, + { ScanCompareType.Unknown, 0, 0, new byte[] { 1 }, true, new ByteScanResult(1) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareBasicData))] + [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] + public void TestCompare(ScanCompareType compareType, byte value1, byte value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new ByteMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Theory] + [InlineData(ScanCompareType.Changed)] + [InlineData(ScanCompareType.NotChanged)] + [InlineData(ScanCompareType.Decreased)] + [InlineData(ScanCompareType.DecreasedOrEqual)] + [InlineData(ScanCompareType.Increased)] + [InlineData(ScanCompareType.IncreasedOrEqual)] + public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) + { + var sut = new ByteMemoryComparer(compareType, 0, 0); + + Check.ThatCode(() => sut.Compare(new byte[] { 0 }, 0, out _)).Throws(); + } + + public static TheoryData GetTestCompareThrowsData() => new TheoryData + { + { null, 0, typeof(ArgumentNullException) }, + { new byte[0], 0, typeof(ArgumentOutOfRangeException) }, + { new byte[1], 1, typeof(ArgumentOutOfRangeException) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareThrowsData))] + public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) + { + var sut = new ByteMemoryComparer(ScanCompareType.Equal, 0, 0); + + Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); + } + + public static TheoryData GetTestCompareWithPreviousData() + { + var data = new TheoryData + { + { ScanCompareType.Changed, 0, 0, new byte[] { 0 }, new ByteScanResult(1), true, new ByteScanResult(0) }, + { ScanCompareType.Changed, 0, 0, new byte[] { 1 }, new ByteScanResult(1), false, null }, + { ScanCompareType.NotChanged, 0, 0, new byte[] { 1 }, new ByteScanResult(1), true, new ByteScanResult(1) }, + { ScanCompareType.NotChanged, 0, 0, new byte[] { 0 }, new ByteScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, new byte[] { 2 }, new ByteScanResult(1), true, new ByteScanResult(2) }, + { ScanCompareType.Increased, 0, 0, new byte[] { 1 }, new ByteScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, new byte[] { 0 }, new ByteScanResult(1), false, null }, + { ScanCompareType.IncreasedOrEqual, 0, 0, new byte[] { 2 }, new ByteScanResult(1), true, new ByteScanResult(2) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, new byte[] { 1 }, new ByteScanResult(1), true, new ByteScanResult(1) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, new byte[] { 0 }, new ByteScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, new byte[] { 0 }, new ByteScanResult(1), true, new ByteScanResult(0) }, + { ScanCompareType.Decreased, 0, 0, new byte[] { 1 }, new ByteScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, new byte[] { 2 }, new ByteScanResult(1), false, null }, + { ScanCompareType.DecreasedOrEqual, 0, 0, new byte[] { 0 }, new ByteScanResult(1), true, new ByteScanResult(0) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, new byte[] { 1 }, new ByteScanResult(1), true, new ByteScanResult(1) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, new byte[] { 2 }, new ByteScanResult(1), false, null } + }; + + var basicData = GetTestCompareBasicData(); + foreach (var x in basicData) + { + data.Add((ScanCompareType)x[0], (byte)x[1], (byte)x[2], (byte[])x[3], new ByteScanResult(1), (bool)x[4], (ScanResult)x[5]); + } + + return data; + } + + [Theory] + [MemberData(nameof(GetTestCompareWithPreviousData))] + public void TestCompareWithPrevious(ScanCompareType compareType, byte value1, byte value2, byte[] data, ScanResult previousScanResult, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new ByteMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, previousScanResult, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Fact] + public void TestCompareWithPreviousThrows() + { + var sut = new ByteMemoryComparer(ScanCompareType.Unknown, 0, 0); + + Check.ThatCode(() => sut.Compare(new byte[] { 0 }, 0, new ByteScanResult(0), out _)).Throws(); + } + } +} diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs new file mode 100644 index 00000000..86fc5e70 --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs @@ -0,0 +1,166 @@ +using System; +using NFluent; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner.Comparer +{ + public class LongMemoryComparerTest + { + [Theory] + [InlineData(ScanCompareType.Equal, 0L, 0L)] + [InlineData(ScanCompareType.Equal, 1L, 2L)] + [InlineData(ScanCompareType.Equal, 2L, 1L)] + [InlineData(ScanCompareType.Between, 2L, 4L)] + [InlineData(ScanCompareType.BetweenOrEqual, 4L, 2L)] + [InlineData(ScanCompareType.NotEqual, 0L, 0L)] + public void TestConstructor(ScanCompareType compareType, long value1, long value2) + { + var sut = new LongMemoryComparer(compareType, value1, value2); + + Check.That(sut.CompareType).IsEqualTo(compareType); + Check.That(sut.ValueSize).IsEqualTo(sizeof(long)); + Check.That(sut.Value1).IsOneOf(value1, value2); + Check.That(sut.Value2).IsOneOf(value1, value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + Check.That(sut.Value1 <= sut.Value2).IsTrue(); + } + } + + public static TheoryData GetTestCompareBasicData() => new TheoryData + { + { ScanCompareType.Equal, 0L, 0L, BitConverter.GetBytes(0L), true, new LongScanResult(0L) }, + { ScanCompareType.Equal, 0L, 0L, BitConverter.GetBytes(1L), false, null }, + { ScanCompareType.Equal, 1L, 0L, BitConverter.GetBytes(1L), true, new LongScanResult(1L) }, + { ScanCompareType.Equal, 1L, 0L, BitConverter.GetBytes(0L), false, null }, + { ScanCompareType.NotEqual, 1L, 0L, BitConverter.GetBytes(0L), true, new LongScanResult(0L) }, + { ScanCompareType.NotEqual, 1L, 0L, BitConverter.GetBytes(1L), false, null }, + { ScanCompareType.GreaterThan, 1L, 0L, BitConverter.GetBytes(0L), false, null }, + { ScanCompareType.GreaterThan, 1L, 0L, BitConverter.GetBytes(2L), true, new LongScanResult(2L) }, + { ScanCompareType.GreaterThanOrEqual, 1L, 0L, BitConverter.GetBytes(0L), false, null }, + { ScanCompareType.GreaterThanOrEqual, 1L, 0L, BitConverter.GetBytes(1L), true, new LongScanResult(1L) }, + { ScanCompareType.GreaterThanOrEqual, 1L, 0L, BitConverter.GetBytes(2L), true, new LongScanResult(2L) }, + { ScanCompareType.LessThan, 1L, 0L, BitConverter.GetBytes(1L), false, null }, + { ScanCompareType.LessThan, 1L, 0L, BitConverter.GetBytes(0L), true, new LongScanResult(0L) }, + { ScanCompareType.LessThanOrEqual, 1L, 0L, BitConverter.GetBytes(2L), false, null }, + { ScanCompareType.LessThanOrEqual, 1L, 0L, BitConverter.GetBytes(1L), true, new LongScanResult(1L) }, + { ScanCompareType.LessThanOrEqual, 1L, 0L, BitConverter.GetBytes(0L), true, new LongScanResult(0L) }, + { ScanCompareType.Between, 1L, 2L, BitConverter.GetBytes(0L), false, null }, + { ScanCompareType.Between, 1L, 2L, BitConverter.GetBytes(1L), false, null }, + { ScanCompareType.Between, 1L, 2L, BitConverter.GetBytes(2L), false, null }, + { ScanCompareType.Between, 1L, 2L, BitConverter.GetBytes(3L), false, null }, + { ScanCompareType.BetweenOrEqual, 1L, 2L, BitConverter.GetBytes(0L), false, null }, + { ScanCompareType.BetweenOrEqual, 1L, 2L, BitConverter.GetBytes(1L), true, new LongScanResult(1L) }, + { ScanCompareType.BetweenOrEqual, 1L, 2L, BitConverter.GetBytes(2L), true, new LongScanResult(2L) }, + { ScanCompareType.BetweenOrEqual, 1L, 2L, BitConverter.GetBytes(3L), false, null } + }; + + public static TheoryData GetTestCompareScanCompareTypeUnknownData() => new TheoryData + { + { ScanCompareType.Unknown, 0L, 0L, BitConverter.GetBytes(0L), true, new LongScanResult(0L) }, + { ScanCompareType.Unknown, 0L, 0L, BitConverter.GetBytes(1L), true, new LongScanResult(1L) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareBasicData))] + [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] + public void TestCompare(ScanCompareType compareType, long value1, long value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new LongMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Theory] + [InlineData(ScanCompareType.Changed)] + [InlineData(ScanCompareType.NotChanged)] + [InlineData(ScanCompareType.Decreased)] + [InlineData(ScanCompareType.DecreasedOrEqual)] + [InlineData(ScanCompareType.Increased)] + [InlineData(ScanCompareType.IncreasedOrEqual)] + public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) + { + var sut = new LongMemoryComparer(compareType, 0L, 0L); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0L), 0, out _)).Throws(); + } + + public static TheoryData GetTestCompareThrowsData() => new TheoryData + { + { null, 0, typeof(ArgumentNullException) }, + { new byte[0], 0, typeof(ArgumentOutOfRangeException) }, + { new byte[8], 8, typeof(ArgumentOutOfRangeException) }, + { new byte[7], 0, typeof(ArgumentException) }, + { new byte[8], 1, typeof(ArgumentException) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareThrowsData))] + public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) + { + var sut = new LongMemoryComparer(ScanCompareType.Equal, 0L, 0L); + + Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); + } + + public static TheoryData GetTestCompareWithPreviousData() + { + var data = new TheoryData + { + { ScanCompareType.Changed, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), true, new LongScanResult(0) }, + { ScanCompareType.Changed, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), false, null }, + { ScanCompareType.NotChanged, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), true, new LongScanResult(1) }, + { ScanCompareType.NotChanged, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), false, null }, + { ScanCompareType.Increased, 0L, 0L, BitConverter.GetBytes(2L), new LongScanResult(1L), true, new LongScanResult(2) }, + { ScanCompareType.Increased, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), false, null }, + { ScanCompareType.Increased, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), false, null }, + { ScanCompareType.IncreasedOrEqual, 0L, 0L, BitConverter.GetBytes(2L), new LongScanResult(1L), true, new LongScanResult(2) }, + { ScanCompareType.IncreasedOrEqual, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), true, new LongScanResult(1) }, + { ScanCompareType.IncreasedOrEqual, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), false, null }, + { ScanCompareType.Decreased, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), true, new LongScanResult(0) }, + { ScanCompareType.Decreased, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), false, null }, + { ScanCompareType.Decreased, 0L, 0L, BitConverter.GetBytes(2L), new LongScanResult(1L), false, null }, + { ScanCompareType.DecreasedOrEqual, 0L, 0L, BitConverter.GetBytes(0L), new LongScanResult(1L), true, new LongScanResult(0) }, + { ScanCompareType.DecreasedOrEqual, 0L, 0L, BitConverter.GetBytes(1L), new LongScanResult(1L), true, new LongScanResult(1) }, + { ScanCompareType.DecreasedOrEqual, 0L, 0L, BitConverter.GetBytes(2L), new LongScanResult(1L), false, null } + }; + + var basicData = GetTestCompareBasicData(); + foreach (var x in basicData) + { + data.Add((ScanCompareType)x[0], (long)x[1], (long)x[2], (byte[])x[3], new LongScanResult(1L), (bool)x[4], (ScanResult)x[5]); + } + + return data; + } + + [Theory] + [MemberData(nameof(GetTestCompareWithPreviousData))] + public void TestCompareWithPrevious(ScanCompareType compareType, long value1, long value2, byte[] data, ScanResult previousScanResult, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new LongMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, previousScanResult, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Fact] + public void TestCompareWithPreviousThrows() + { + var sut = new LongMemoryComparer(ScanCompareType.Unknown, 0L, 0L); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0L), 0, new LongScanResult(0L), out _)).Throws(); + } + } +} diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs new file mode 100644 index 00000000..6f013063 --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs @@ -0,0 +1,166 @@ +using System; +using NFluent; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner.Comparer +{ + public class ShortMemoryComparerTest + { + [Theory] + [InlineData(ScanCompareType.Equal, 0, 0)] + [InlineData(ScanCompareType.Equal, 1, 2)] + [InlineData(ScanCompareType.Equal, 2, 1)] + [InlineData(ScanCompareType.Between, 2, 4)] + [InlineData(ScanCompareType.BetweenOrEqual, 4, 2)] + [InlineData(ScanCompareType.NotEqual, 0, 0)] + public void TestConstructor(ScanCompareType compareType, short value1, short value2) + { + var sut = new ShortMemoryComparer(compareType, value1, value2); + + Check.That(sut.CompareType).IsEqualTo(compareType); + Check.That(sut.ValueSize).IsEqualTo(sizeof(short)); + Check.That(sut.Value1).IsOneOf(value1, value2); + Check.That(sut.Value2).IsOneOf(value1, value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + Check.That(sut.Value1 <= sut.Value2).IsTrue(); + } + } + + public static TheoryData GetTestCompareBasicData() => new TheoryData + { + { ScanCompareType.Equal, 0, 0, BitConverter.GetBytes((short)0), true, new ShortScanResult(0) }, + { ScanCompareType.Equal, 0, 0, BitConverter.GetBytes((short)1), false, null }, + { ScanCompareType.Equal, 1, 0, BitConverter.GetBytes((short)1), true, new ShortScanResult(1) }, + { ScanCompareType.Equal, 1, 0, BitConverter.GetBytes((short)0), false, null }, + { ScanCompareType.NotEqual, 1, 0, BitConverter.GetBytes((short)0), true, new ShortScanResult(0) }, + { ScanCompareType.NotEqual, 1, 0, BitConverter.GetBytes((short)1), false, null }, + { ScanCompareType.GreaterThan, 1, 0, BitConverter.GetBytes((short)0), false, null }, + { ScanCompareType.GreaterThan, 1, 0, BitConverter.GetBytes((short)2), true, new ShortScanResult(2) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes((short)0), false, null }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes((short)1), true, new ShortScanResult(1) }, + { ScanCompareType.GreaterThanOrEqual, 1, 0, BitConverter.GetBytes((short)2), true, new ShortScanResult(2) }, + { ScanCompareType.LessThan, 1, 0, BitConverter.GetBytes((short)1), false, null }, + { ScanCompareType.LessThan, 1, 0, BitConverter.GetBytes((short)0), true, new ShortScanResult(0) }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes((short)2), false, null }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes((short)1), true, new ShortScanResult(1) }, + { ScanCompareType.LessThanOrEqual, 1, 0, BitConverter.GetBytes((short)0), true, new ShortScanResult(0) }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes((short)0), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes((short)1), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes((short)2), false, null }, + { ScanCompareType.Between, 1, 2, BitConverter.GetBytes((short)3), false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes((short)0), false, null }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes((short)1), true, new ShortScanResult(1) }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes((short)2), true, new ShortScanResult(2) }, + { ScanCompareType.BetweenOrEqual, 1, 2, BitConverter.GetBytes((short)3), false, null } + }; + + public static TheoryData GetTestCompareScanCompareTypeUnknownData() => new TheoryData + { + { ScanCompareType.Unknown, 0, 0, BitConverter.GetBytes((short)0), true, new ShortScanResult(0) }, + { ScanCompareType.Unknown, 0, 0, BitConverter.GetBytes((short)1), true, new ShortScanResult(1) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareBasicData))] + [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] + public void TestCompare(ScanCompareType compareType, short value1, short value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new ShortMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Theory] + [InlineData(ScanCompareType.Changed)] + [InlineData(ScanCompareType.NotChanged)] + [InlineData(ScanCompareType.Decreased)] + [InlineData(ScanCompareType.DecreasedOrEqual)] + [InlineData(ScanCompareType.Increased)] + [InlineData(ScanCompareType.IncreasedOrEqual)] + public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) + { + var sut = new ShortMemoryComparer(compareType, 0, 0); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes((short)0), 0, out _)).Throws(); + } + + public static TheoryData GetTestCompareThrowsData() => new TheoryData + { + { null, 0, typeof(ArgumentNullException) }, + { new byte[0], 0, typeof(ArgumentOutOfRangeException) }, + { new byte[2], 2, typeof(ArgumentOutOfRangeException) }, + { new byte[1], 0, typeof(ArgumentException) }, + { new byte[2], 1, typeof(ArgumentException) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareThrowsData))] + public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) + { + var sut = new ShortMemoryComparer(ScanCompareType.Equal, 0, 0); + + Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); + } + + public static TheoryData GetTestCompareWithPreviousData() + { + var data = new TheoryData + { + { ScanCompareType.Changed, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), true, new ShortScanResult(0) }, + { ScanCompareType.Changed, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), false, null }, + { ScanCompareType.NotChanged, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), true, new ShortScanResult(1) }, + { ScanCompareType.NotChanged, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes((short)2), new ShortScanResult(1), true, new ShortScanResult(2) }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), false, null }, + { ScanCompareType.Increased, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), false, null }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes((short)2), new ShortScanResult(1), true, new ShortScanResult(2) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), true, new ShortScanResult(1) }, + { ScanCompareType.IncreasedOrEqual, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), true, new ShortScanResult(0) }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), false, null }, + { ScanCompareType.Decreased, 0, 0, BitConverter.GetBytes((short)2), new ShortScanResult(1), false, null }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes((short)0), new ShortScanResult(1), true, new ShortScanResult(0) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes((short)1), new ShortScanResult(1), true, new ShortScanResult(1) }, + { ScanCompareType.DecreasedOrEqual, 0, 0, BitConverter.GetBytes((short)2), new ShortScanResult(1), false, null } + }; + + var basicData = GetTestCompareBasicData(); + foreach (var x in basicData) + { + data.Add((ScanCompareType)x[0], (short)x[1], (short)x[2], (byte[])x[3], new ShortScanResult(1), (bool)x[4], (ScanResult)x[5]); + } + + return data; + } + + [Theory] + [MemberData(nameof(GetTestCompareWithPreviousData))] + public void TestCompareWithPrevious(ScanCompareType compareType, short value1, short value2, byte[] data, ScanResult previousScanResult, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new ShortMemoryComparer(compareType, value1, value2); + + Check.That(sut.Compare(data, 0, previousScanResult, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Fact] + public void TestCompareWithPreviousThrows() + { + var sut = new ShortMemoryComparer(ScanCompareType.Unknown, 0, 0); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes((short)0), 0, new ShortScanResult(0), out _)).Throws(); + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index df0caa72..bfb7bd79 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -80,6 +80,9 @@ + + + From 439eb9479ec8d3df9b376753999408fff1502c96 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Jul 2019 23:16:02 +0200 Subject: [PATCH 644/777] Added missing test. --- ReClass.NET_Tests/AddressParser/ExecutorTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index c85284d2..748eac5a 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -44,7 +44,8 @@ public void SimpleExpressionTest(string expression, IntPtr expected) new object[] { "", (IntPtr)0x100 }, new object[] { " + 0", (IntPtr)0x100 }, new object[] { " + 10", (IntPtr)0x110 }, - new object[] { " * 2", (IntPtr)0x200 } + new object[] { " * 2", (IntPtr)0x200 }, + new object[] { "", (IntPtr)0x0 }, }; [Theory] From d596b3ff4b72d1fb4637a17e51b6353f07ea66f7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 9 Jul 2019 18:38:13 +0200 Subject: [PATCH 645/777] Fixed #122. --- ReClass.NET/Extensions/IntPtrExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Extensions/IntPtrExtensions.cs b/ReClass.NET/Extensions/IntPtrExtensions.cs index 88c73773..7f2ff58a 100644 --- a/ReClass.NET/Extensions/IntPtrExtensions.cs +++ b/ReClass.NET/Extensions/IntPtrExtensions.cs @@ -18,7 +18,7 @@ public static bool IsNull(this IntPtr ptr) public static bool MayBeValid(this IntPtr ptr) { #if RECLASSNET64 - return ptr.InRange((IntPtr)0x10000, (IntPtr)long.MaxValue); + return ptr.IsInRange((IntPtr)0x10000, (IntPtr)long.MaxValue); #else return ptr.IsInRange((IntPtr)0x10000, (IntPtr)int.MaxValue); #endif From c3d27b599e6c1fe7bdadc3f6e7909dc06db28e8d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 Jul 2019 23:08:43 +0200 Subject: [PATCH 646/777] Moved value switch. --- ReClass.NET/Forms/ScannerForm.cs | 16 ++++++++++++++++ .../MemoryScanner/Comparer/ByteMemoryComparer.cs | 8 -------- .../Comparer/DoubleMemoryComparer.cs | 8 -------- .../Comparer/FloatMemoryComparer.cs | 8 -------- .../Comparer/IntegerMemoryComparer.cs | 8 -------- .../MemoryScanner/Comparer/LongMemoryComparer.cs | 8 -------- .../Comparer/ShortMemoryComparer.cs | 8 -------- .../Comparer/ByteMemoryComparerTest.cs | 4 ---- .../Comparer/IntegerMemoryComparerTest.cs | 4 ---- .../Comparer/LongMemoryComparerTest.cs | 4 ---- .../Comparer/ShortMemoryComparerTest.cs | 4 ---- 11 files changed, 16 insertions(+), 64 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 47f602a5..7427974e 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -734,6 +734,14 @@ private IScanComparer CreateComparer(ScanSettings settings) if (!long.TryParse(dualValueBox.Value1, numberStyle, null, out var value1)) throw new InvalidInputException(dualValueBox.Value1); if (!long.TryParse(dualValueBox.Value2, numberStyle, null, out var value2) && checkBothInputFields) throw new InvalidInputException(dualValueBox.Value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + if (value1 > value2) + { + Utils.Swap(ref value1, ref value2); + } + } + switch (settings.ValueType) { case ScanValueType.Byte: @@ -769,6 +777,14 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) var nf2 = NumberFormat.GuessNumberFormat(dualValueBox.Value2); if (!double.TryParse(dualValueBox.Value2, NumberStyles.Float, nf2, out var value2) && checkBothInputFields) throw new InvalidInputException(dualValueBox.Value2); + if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) + { + if (value1 > value2) + { + Utils.Swap(ref value1, ref value2); + } + } + var significantDigits = Math.Max( CalculateSignificantDigits(dualValueBox.Value1, nf1), CalculateSignificantDigits(dualValueBox.Value2, nf2) diff --git a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs index 849c1c38..737554f5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -15,14 +15,6 @@ public ByteMemoryComparer(ScanCompareType compareType, byte value1, byte value2) { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - Value1 = value1; Value2 = value2; } diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index eabd011a..ee713f59 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -21,14 +21,6 @@ public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - RoundType = roundType; this.significantDigits = Math.Max(significantDigits, 1); Value1 = Math.Round(value1, this.significantDigits, MidpointRounding.AwayFromZero); diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index bdcddad8..c56200cc 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -21,14 +21,6 @@ public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - RoundType = roundType; this.significantDigits = Math.Max(significantDigits, 1); Value1 = (float)Math.Round(value1, this.significantDigits, MidpointRounding.AwayFromZero); diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index aefd4235..6d2dedd1 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -15,14 +15,6 @@ public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2 { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - Value1 = value1; Value2 = value2; } diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index baa5c4fb..e6fb54ed 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -15,14 +15,6 @@ public LongMemoryComparer(ScanCompareType compareType, long value1, long value2) { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - Value1 = value1; Value2 = value2; } diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index b40d25f5..3f7e7edd 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -15,14 +15,6 @@ public ShortMemoryComparer(ScanCompareType compareType, short value1, short valu { CompareType = compareType; - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - if (value1 > value2) - { - Utils.Swap(ref value1, ref value2); - } - } - Value1 = value1; Value2 = value2; } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs index c6d1d2b0..bdb74875 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/ByteMemoryComparerTest.cs @@ -23,10 +23,6 @@ public void TestConstructor(ScanCompareType compareType, byte value1, byte value Check.That(sut.ValueSize).IsEqualTo(sizeof(byte)); Check.That(sut.Value1).IsOneOf(value1, value2); Check.That(sut.Value2).IsOneOf(value1, value2); - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - Check.That(sut.Value1 <= sut.Value2).IsTrue(); - } } public static TheoryData GetTestCompareBasicData() => new TheoryData diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs index 027432bc..acbfd201 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs @@ -23,10 +23,6 @@ public void TestConstructor(ScanCompareType compareType, int value1, int value2) Check.That(sut.ValueSize).IsEqualTo(sizeof(int)); Check.That(sut.Value1).IsOneOf(value1, value2); Check.That(sut.Value2).IsOneOf(value1, value2); - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - Check.That(sut.Value1 <= sut.Value2).IsTrue(); - } } public static TheoryData GetTestCompareBasicData() => new TheoryData diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs index 86fc5e70..f2790648 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs @@ -23,10 +23,6 @@ public void TestConstructor(ScanCompareType compareType, long value1, long value Check.That(sut.ValueSize).IsEqualTo(sizeof(long)); Check.That(sut.Value1).IsOneOf(value1, value2); Check.That(sut.Value2).IsOneOf(value1, value2); - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - Check.That(sut.Value1 <= sut.Value2).IsTrue(); - } } public static TheoryData GetTestCompareBasicData() => new TheoryData diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs index 6f013063..7c3109fe 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs @@ -23,10 +23,6 @@ public void TestConstructor(ScanCompareType compareType, short value1, short val Check.That(sut.ValueSize).IsEqualTo(sizeof(short)); Check.That(sut.Value1).IsOneOf(value1, value2); Check.That(sut.Value2).IsOneOf(value1, value2); - if (compareType == ScanCompareType.Between || compareType == ScanCompareType.BetweenOrEqual) - { - Check.That(sut.Value1 <= sut.Value2).IsTrue(); - } } public static TheoryData GetTestCompareBasicData() => new TheoryData From 61771286097093e871aa2e811c10560b9fe3d51d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 29 Jul 2019 23:10:22 +0200 Subject: [PATCH 647/777] Added x64 define. --- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index bfb7bd79..53798768 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -41,7 +41,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG;RECLASSNET64 prompt 4 x64 @@ -50,7 +50,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;RECLASSNET64 prompt 4 x64 @@ -81,6 +81,7 @@ + From d198b09d4a852d1c2cf54b18dd8a6ba425a17333 Mon Sep 17 00:00:00 2001 From: titto Date: Wed, 7 Aug 2019 01:10:37 +1000 Subject: [PATCH 648/777] Fixed the issue with enums in the flags mode caused by conversion from signed to unsigned values. Fixed ordering of the values in the Enums editor. --- ReClass.NET/Nodes/EnumNode.cs | 74 ++++++++++++++++---------- ReClass.NET/Project/EnumDescription.cs | 2 +- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 9a4dd947..1621e19e 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -51,27 +51,49 @@ public BaseNumericNode GetUnderlayingNode() throw new Exception(); // TODO } - public long ReadValueFromMemory(MemoryBuffer memory) + private long ReadValueFromMemory(MemoryBuffer memory) + { + switch (Enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + return memory.ReadInt8(Offset); + case EnumDescription.UnderlyingTypeSize.TwoBytes: + return memory.ReadInt16(Offset); + case EnumDescription.UnderlyingTypeSize.FourBytes: + return memory.ReadInt32(Offset); + case EnumDescription.UnderlyingTypeSize.EightBytes: + return memory.ReadInt64(Offset); + } + + throw new Exception(); // TODO + } + + private ulong ReadFlagsValueFromMemory(MemoryBuffer memory) { - switch (Enum.Size) - { - case EnumDescription.UnderlyingTypeSize.OneByte: - return memory.ReadInt8(Offset); - case EnumDescription.UnderlyingTypeSize.TwoBytes: - return memory.ReadInt16(Offset); - case EnumDescription.UnderlyingTypeSize.FourBytes: - return memory.ReadInt32(Offset); - case EnumDescription.UnderlyingTypeSize.EightBytes: - return memory.ReadInt64(Offset); - } - - throw new Exception(); // TODO - } - - private string GetStringRepresentation(long value) + // Flags should be read as an unsigned value. + switch (Enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + return memory.ReadUInt8(Offset); + case EnumDescription.UnderlyingTypeSize.TwoBytes: + return memory.ReadUInt16(Offset); + case EnumDescription.UnderlyingTypeSize.FourBytes: + return memory.ReadUInt32(Offset); + case EnumDescription.UnderlyingTypeSize.EightBytes: + return memory.ReadUInt64(Offset); + } + + throw new Exception(); // TODO + } + + private string GetTextRepresentation(MemoryBuffer memory) + { + return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); + } + + private string GetStringRepresentation(MemoryBuffer memory) { - if (!Enum.UseFlagsMode) - { + var value = ReadValueFromMemory(memory); var index = Enum.Values.FindIndex(kv => kv.Value == value); if (index == -1) { @@ -79,14 +101,12 @@ private string GetStringRepresentation(long value) } return Enum.Values[index].Key; - } - - return GetFlagsStringRepresentation(value); } - private string GetFlagsStringRepresentation(long value) - { - var result = (ulong)value; + private string GetFlagsStringRepresentation(MemoryBuffer memory) + { + var value = ReadFlagsValueFromMemory(memory); + var result = value; var values = Enum.Values; @@ -163,9 +183,9 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; - var value = ReadValueFromMemory(view.Memory); + var text = GetTextRepresentation(view.Memory); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, GetStringRepresentation(value)) + view.Font.Width; + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text) + view.Font.Width; x = AddComment(view, x, y); diff --git a/ReClass.NET/Project/EnumDescription.cs b/ReClass.NET/Project/EnumDescription.cs index e40d647c..6c72596b 100644 --- a/ReClass.NET/Project/EnumDescription.cs +++ b/ReClass.NET/Project/EnumDescription.cs @@ -26,7 +26,7 @@ public enum UnderlyingTypeSize public void SetData(bool useFlagsMode, UnderlyingTypeSize size, IEnumerable> values) { - var temp = values.OrderBy(t => t.Key).ToList(); + var temp = values.OrderBy(t => t.Value).ToList(); if (useFlagsMode) { From 314da154c2806df672feb3d1c94a91d1566f8933 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 11 Aug 2019 11:23:28 +0200 Subject: [PATCH 649/777] Fixed #130. --- ReClass.NET/Nodes/BitFieldNode.cs | 4 +++- ReClass.NET/Util/BitString.cs | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 65d1da38..82b7d274 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -109,6 +109,8 @@ private string ConvertValueToBitString(MemoryBuffer memory) public override Size Draw(ViewInfo view, int x, int y) { + const int BitsPerBlock = 4; + if (IsHidden && !IsWrapped) { return DrawHidden(view, x, y); @@ -135,7 +137,7 @@ public override Size Draw(ViewInfo view, int x, int y) for (var i = 0; i < bits; ++i) { - var rect = new Rectangle(x + i * view.Font.Width, y, view.Font.Width, view.Font.Height); + var rect = new Rectangle(x + (i + i / BitsPerBlock) * view.Font.Width, y, view.Font.Width, view.Font.Height); AddHotSpot(view, rect, string.Empty, i, HotSpotType.Edit); } diff --git a/ReClass.NET/Util/BitString.cs b/ReClass.NET/Util/BitString.cs index 3343ed43..ba3cd1f8 100644 --- a/ReClass.NET/Util/BitString.cs +++ b/ReClass.NET/Util/BitString.cs @@ -51,15 +51,17 @@ public static string ToString(long value) private static string AddPaddingAndBuildBlocks(int bits, string value) { + const int BitsPerBlock = 4; + var sb = new StringBuilder(bits); var padding = bits - value.Length; // Add full padding blocks. - while (padding > 4) + while (padding > BitsPerBlock) { sb.Append("0000 "); - padding -= 4; + padding -= BitsPerBlock; } // Add only a part of a block. @@ -72,7 +74,7 @@ private static string AddPaddingAndBuildBlocks(int bits, string value) } // and {4 - padding} bits of the value. - sb.Append(value, 0, 4 - padding); + sb.Append(value, 0, BitsPerBlock - padding); if (value.Length > padding) { @@ -81,10 +83,10 @@ private static string AddPaddingAndBuildBlocks(int bits, string value) } // Add all remaining blocks. - for (var i = padding == 0 ? 0 : 4 - padding; i < value.Length; i += 4) + for (var i = padding == 0 ? 0 : BitsPerBlock - padding; i < value.Length; i += BitsPerBlock) { - sb.Append(value, i, 4); - if (i < value.Length - 4) + sb.Append(value, i, BitsPerBlock); + if (i < value.Length - BitsPerBlock) { sb.Append(' '); } From a762d0c03e99754a9d9ea35d5b267004261fef29 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Aug 2019 20:48:11 +0200 Subject: [PATCH 650/777] Fixed indentation. --- ReClass.NET/Nodes/EnumNode.cs | 403 +++++++++++++++++----------------- 1 file changed, 201 insertions(+), 202 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 1621e19e..4ba0c714 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -1,204 +1,203 @@ -using System; -using System.Diagnostics.Contracts; -using System.Drawing; -using System.Text; -using ReClassNET.Extensions; -using ReClassNET.Memory; -using ReClassNET.Project; -using ReClassNET.UI; - -namespace ReClassNET.Nodes -{ - public class EnumNode : BaseNode - { - public override int MemorySize => (int)Enum.Size; - - public EnumDescription Enum { get; private set; } = EnumDescription.Default; - - public override void GetUserInterfaceInfo(out string name, out Image icon) - { - name = "Enum"; - icon = Properties.Resources.B16x16_Button_Enum; - } - - public void ChangeEnum(EnumDescription @enum) - { - Contract.Requires(@enum != null); - - Enum = @enum; - - GetParentContainer()?.ChildHasChanged(this); - } - - /// - /// Gets the underlaying node for the enum field. - /// - /// - public BaseNumericNode GetUnderlayingNode() - { - switch (Enum.Size) - { - case EnumDescription.UnderlyingTypeSize.OneByte: - return new UInt8Node(); - case EnumDescription.UnderlyingTypeSize.TwoBytes: - return new UInt16Node(); - case EnumDescription.UnderlyingTypeSize.FourBytes: - return new UInt32Node(); - case EnumDescription.UnderlyingTypeSize.EightBytes: - return new UInt64Node(); - } - - throw new Exception(); // TODO - } - - private long ReadValueFromMemory(MemoryBuffer memory) +using System; +using System.Diagnostics.Contracts; +using System.Drawing; +using System.Text; +using ReClassNET.Extensions; +using ReClassNET.Memory; +using ReClassNET.Project; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class EnumNode : BaseNode + { + public override int MemorySize => (int)Enum.Size; + + public EnumDescription Enum { get; private set; } = EnumDescription.Default; + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "Enum"; + icon = Properties.Resources.B16x16_Button_Enum; + } + + public void ChangeEnum(EnumDescription @enum) + { + Contract.Requires(@enum != null); + + Enum = @enum; + + GetParentContainer()?.ChildHasChanged(this); + } + + /// + /// Gets the underlaying node for the enum field. + /// + /// + public BaseNumericNode GetUnderlayingNode() + { + switch (Enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + return new UInt8Node(); + case EnumDescription.UnderlyingTypeSize.TwoBytes: + return new UInt16Node(); + case EnumDescription.UnderlyingTypeSize.FourBytes: + return new UInt32Node(); + case EnumDescription.UnderlyingTypeSize.EightBytes: + return new UInt64Node(); + } + + throw new Exception(); // TODO + } + + private long ReadValueFromMemory(MemoryBuffer memory) + { + switch (Enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + return memory.ReadInt8(Offset); + case EnumDescription.UnderlyingTypeSize.TwoBytes: + return memory.ReadInt16(Offset); + case EnumDescription.UnderlyingTypeSize.FourBytes: + return memory.ReadInt32(Offset); + case EnumDescription.UnderlyingTypeSize.EightBytes: + return memory.ReadInt64(Offset); + } + + throw new Exception(); // TODO + } + + private ulong ReadFlagsValueFromMemory(MemoryBuffer memory) + { + switch (Enum.Size) + { + case EnumDescription.UnderlyingTypeSize.OneByte: + return memory.ReadUInt8(Offset); + case EnumDescription.UnderlyingTypeSize.TwoBytes: + return memory.ReadUInt16(Offset); + case EnumDescription.UnderlyingTypeSize.FourBytes: + return memory.ReadUInt32(Offset); + case EnumDescription.UnderlyingTypeSize.EightBytes: + return memory.ReadUInt64(Offset); + } + + throw new Exception(); // TODO + } + + private string GetTextRepresentation(MemoryBuffer memory) + { + return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); + } + + private string GetStringRepresentation(MemoryBuffer memory) + { + var value = ReadValueFromMemory(memory); + var index = Enum.Values.FindIndex(kv => kv.Value == value); + if (index == -1) + { + return value.ToString(); + } + + return Enum.Values[index].Key; + } + + private string GetFlagsStringRepresentation(MemoryBuffer memory) + { + var value = ReadFlagsValueFromMemory(memory); + var result = value; + + var values = Enum.Values; + + var index = values.Count - 1; + var retval = new StringBuilder(); + var firstTime = true; + var saveResult = result; + + while (index >= 0) + { + var temp = (ulong)values[index].Value; + if (index == 0 && temp == 0) + { + break; + } + + if ((result & temp) == temp) + { + result -= temp; + if (!firstTime) + { + retval.Prepend(" | "); + } + + retval.Prepend(values[index].Key); + firstTime = false; + } + + index--; + } + + if (result != 0) + { + return value.ToString(); + } + + if (saveResult == 0) + { + if (values.Count > 0 && values[0].Value == 0) + { + return values[0].Key; + } + + return "0"; + } + + return retval.ToString(); + } + + public override Size Draw(ViewInfo view, int x, int y) { - switch (Enum.Size) - { - case EnumDescription.UnderlyingTypeSize.OneByte: - return memory.ReadInt8(Offset); - case EnumDescription.UnderlyingTypeSize.TwoBytes: - return memory.ReadInt16(Offset); - case EnumDescription.UnderlyingTypeSize.FourBytes: - return memory.ReadInt32(Offset); - case EnumDescription.UnderlyingTypeSize.EightBytes: - return memory.ReadInt64(Offset); - } - - throw new Exception(); // TODO - } - - private ulong ReadFlagsValueFromMemory(MemoryBuffer memory) - { - // Flags should be read as an unsigned value. - switch (Enum.Size) - { - case EnumDescription.UnderlyingTypeSize.OneByte: - return memory.ReadUInt8(Offset); - case EnumDescription.UnderlyingTypeSize.TwoBytes: - return memory.ReadUInt16(Offset); - case EnumDescription.UnderlyingTypeSize.FourBytes: - return memory.ReadUInt32(Offset); - case EnumDescription.UnderlyingTypeSize.EightBytes: - return memory.ReadUInt64(Offset); - } - - throw new Exception(); // TODO - } - - private string GetTextRepresentation(MemoryBuffer memory) - { - return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); - } - - private string GetStringRepresentation(MemoryBuffer memory) - { - var value = ReadValueFromMemory(memory); - var index = Enum.Values.FindIndex(kv => kv.Value == value); - if (index == -1) - { - return value.ToString(); - } - - return Enum.Values[index].Key; - } - - private string GetFlagsStringRepresentation(MemoryBuffer memory) + if (IsHidden && !IsWrapped) + { + return DrawHidden(view, x, y); + } + + var origX = x; + + AddSelection(view, x, y, view.Font.Height); + + x += TextPadding; + + x = AddIcon(view, x, y, Icons.Enum, HotSpot.NoneId, HotSpotType.None); + + x = AddAddressOffset(view, x, y); + + x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Enum") + view.Font.Width; + if (!IsWrapped) + { + x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + } + x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + view.Font.Width; + x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; + + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; + + var text = GetTextRepresentation(view.Memory); + + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text) + view.Font.Width; + + x = AddComment(view, x, y); + + DrawInvalidMemoryIndicatorIcon(view, y); + AddContextDropDownIcon(view, y); + AddDeleteIcon(view, y); + + return new Size(x - origX, view.Font.Height); + } + + public override int CalculateDrawnHeight(ViewInfo view) { - var value = ReadFlagsValueFromMemory(memory); - var result = value; - - var values = Enum.Values; - - var index = values.Count - 1; - var retval = new StringBuilder(); - var firstTime = true; - var saveResult = result; - - while (index >= 0) - { - var temp = (ulong)values[index].Value; - if (index == 0 && temp == 0) - { - break; - } - - if ((result & temp) == temp) - { - result -= temp; - if (!firstTime) - { - retval.Prepend(" | "); - } - - retval.Prepend(values[index].Key); - firstTime = false; - } - - index--; - } - - if (result != 0) - { - return value.ToString(); - } - - if (saveResult == 0) - { - if (values.Count > 0 && values[0].Value == 0) - { - return values[0].Key; - } - - return "0"; - } - - return retval.ToString(); - } - - public override Size Draw(ViewInfo view, int x, int y) - { - if (IsHidden && !IsWrapped) - { - return DrawHidden(view, x, y); - } - - var origX = x; - - AddSelection(view, x, y, view.Font.Height); - - x += TextPadding; - - x = AddIcon(view, x, y, Icons.Enum, HotSpot.NoneId, HotSpotType.None); - - x = AddAddressOffset(view, x, y); - - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Enum") + view.Font.Width; - if (!IsWrapped) - { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; - - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; - - var text = GetTextRepresentation(view.Memory); - - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text) + view.Font.Width; - - x = AddComment(view, x, y); - - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); - - return new Size(x - origX, view.Font.Height); - } - - public override int CalculateDrawnHeight(ViewInfo view) - { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; - } - } -} + return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + } + } +} From a94d601a09712a8be0bba1b60677f5ca1384e530 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Aug 2019 20:51:56 +0200 Subject: [PATCH 651/777] Changed method names. --- ReClass.NET/Nodes/EnumNode.cs | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 4ba0c714..82d817a4 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -51,7 +51,12 @@ public BaseNumericNode GetUnderlayingNode() throw new Exception(); // TODO } - private long ReadValueFromMemory(MemoryBuffer memory) + private string GetTextRepresentation(MemoryBuffer memory) + { + return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); + } + + private long ReadSignedValueFromMemory(MemoryBuffer memory) { switch (Enum.Size) { @@ -63,12 +68,24 @@ private long ReadValueFromMemory(MemoryBuffer memory) return memory.ReadInt32(Offset); case EnumDescription.UnderlyingTypeSize.EightBytes: return memory.ReadInt64(Offset); + default: + throw new ArgumentOutOfRangeException(); } + } - throw new Exception(); // TODO + private string GetStringRepresentation(MemoryBuffer memory) + { + var value = ReadSignedValueFromMemory(memory); + var index = Enum.Values.FindIndex(kv => kv.Value == value); + if (index == -1) + { + return value.ToString(); + } + + return Enum.Values[index].Key; } - private ulong ReadFlagsValueFromMemory(MemoryBuffer memory) + private ulong ReadUnsignedValueFromMemory(MemoryBuffer memory) { switch (Enum.Size) { @@ -80,31 +97,14 @@ private ulong ReadFlagsValueFromMemory(MemoryBuffer memory) return memory.ReadUInt32(Offset); case EnumDescription.UnderlyingTypeSize.EightBytes: return memory.ReadUInt64(Offset); + default: + throw new ArgumentOutOfRangeException(); } - - throw new Exception(); // TODO - } - - private string GetTextRepresentation(MemoryBuffer memory) - { - return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); - } - - private string GetStringRepresentation(MemoryBuffer memory) - { - var value = ReadValueFromMemory(memory); - var index = Enum.Values.FindIndex(kv => kv.Value == value); - if (index == -1) - { - return value.ToString(); - } - - return Enum.Values[index].Key; } private string GetFlagsStringRepresentation(MemoryBuffer memory) { - var value = ReadFlagsValueFromMemory(memory); + var value = ReadUnsignedValueFromMemory(memory); var result = value; var values = Enum.Values; From 613b19ce920bdfa9e9a5c395fb8da5941ec38054 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Aug 2019 20:56:04 +0200 Subject: [PATCH 652/777] Removed unused method. --- ReClass.NET/Nodes/EnumNode.cs | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 82d817a4..96a91c55 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -30,27 +30,6 @@ public void ChangeEnum(EnumDescription @enum) GetParentContainer()?.ChildHasChanged(this); } - /// - /// Gets the underlaying node for the enum field. - /// - /// - public BaseNumericNode GetUnderlayingNode() - { - switch (Enum.Size) - { - case EnumDescription.UnderlyingTypeSize.OneByte: - return new UInt8Node(); - case EnumDescription.UnderlyingTypeSize.TwoBytes: - return new UInt16Node(); - case EnumDescription.UnderlyingTypeSize.FourBytes: - return new UInt32Node(); - case EnumDescription.UnderlyingTypeSize.EightBytes: - return new UInt64Node(); - } - - throw new Exception(); // TODO - } - private string GetTextRepresentation(MemoryBuffer memory) { return Enum.UseFlagsMode ? GetFlagsStringRepresentation(memory) : GetStringRepresentation(memory); From 458642778e71a046ec7ef16acad40bf50b34a1eb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Aug 2019 20:58:07 +0200 Subject: [PATCH 653/777] Added compiler size check for classes. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index ead4bc0d..40510e36 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -348,6 +348,8 @@ private void WriteClass(IndentedTextWriter writer, ClassNode @class, IEnumerable writer.Indent--; writer.Write("}; //Size: 0x"); writer.WriteLine($"{@class.MemorySize:X04}"); + + writer.WriteLine($"static_assert(sizeof({@class.Name}) == 0x{@class.MemorySize:X});"); } /// From 6bb863d9bd7dbe2ed3ecc9b6995151e08662b1e2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 13 Sep 2019 16:44:36 +0200 Subject: [PATCH 654/777] Added missing file. --- .../Comparer/FloatMemoryComparer.cs | 1 - .../Comparer/FloatMemoryComparerTest.cs | 170 ++++++++++++++++++ 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index c56200cc..57aa6b9d 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -1,7 +1,6 @@ using System; using System.Diagnostics; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs new file mode 100644 index 00000000..5084f442 --- /dev/null +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs @@ -0,0 +1,170 @@ +using System; +using NFluent; +using ReClassNET.MemoryScanner; +using ReClassNET.MemoryScanner.Comparer; +using Xunit; + +namespace ReClass.NET_Tests.MemoryScanner.Comparer +{ + public class FloatMemoryComparerTest + { + [Theory] + [InlineData(ScanCompareType.Equal, ScanRoundMode.Normal, 0.0f, 0.0f)] + [InlineData(ScanCompareType.Equal, ScanRoundMode.Strict, 1.0f, 2.0f)] + [InlineData(ScanCompareType.Equal, ScanRoundMode.Truncate, 2.0f, 1.0f)] + [InlineData(ScanCompareType.Between, ScanRoundMode.Normal, 2.0f, 4.0f)] + [InlineData(ScanCompareType.BetweenOrEqual, ScanRoundMode.Strict, 4.0f, 2.0f)] + [InlineData(ScanCompareType.NotEqual, ScanRoundMode.Truncate, 0.0f, 0.0f)] + public void TestConstructor(ScanCompareType compareType, ScanRoundMode roundMode, float value1, float value2) + { + var sut = new FloatMemoryComparer(compareType, roundMode, 1, value1, value2); + + Check.That(sut.CompareType).IsEqualTo(compareType); + Check.That(sut.RoundType).IsEqualTo(roundMode); + Check.That(sut.ValueSize).IsEqualTo(sizeof(float)); + Check.That(sut.Value1).IsOneOf(value1, value2); + Check.That(sut.Value2).IsOneOf(value1, value2); + } + + [Theory] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + public void TestConstructorSignificantDigits(int significantDigits) + { + const float Value1 = 1.234567f; + const float Value2 = 7.654321f; + + var sut = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, significantDigits, Value1, Value2); + + Check.That(sut.Value1).IsEqualTo((float)Math.Round(Value1, significantDigits, MidpointRounding.AwayFromZero)); + Check.That(sut.Value2).IsEqualTo((float)Math.Round(Value2, significantDigits, MidpointRounding.AwayFromZero)); + } + + public static TheoryData GetTestCompareBasicData() => new TheoryData + { + { ScanCompareType.GreaterThan, 1.0f, 0.0f, BitConverter.GetBytes(0.0f), false, null }, + { ScanCompareType.GreaterThan, 1.0f, 0.0f, BitConverter.GetBytes(2.0f), true, new FloatScanResult(2.0f) }, + { ScanCompareType.GreaterThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(0.0f), false, null }, + { ScanCompareType.GreaterThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.GreaterThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(2.0f), true, new FloatScanResult(2.0f) }, + { ScanCompareType.LessThan, 1.0f, 0.0f, BitConverter.GetBytes(1.0f), false, null }, + { ScanCompareType.LessThan, 1.0f, 0.0f, BitConverter.GetBytes(0.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.LessThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(2.0f), false, null }, + { ScanCompareType.LessThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.LessThanOrEqual, 1.0f, 0.0f, BitConverter.GetBytes(0.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.Between, 1.0f, 2.0f, BitConverter.GetBytes(0.0f), false, null }, + { ScanCompareType.Between, 1.0f, 2.0f, BitConverter.GetBytes(1.0f), false, null }, + { ScanCompareType.Between, 1.0f, 2.0f, BitConverter.GetBytes(2.0f), false, null }, + { ScanCompareType.Between, 1.0f, 2.0f, BitConverter.GetBytes(3.0f), false, null }, + { ScanCompareType.BetweenOrEqual, 1.0f, 2.0f, BitConverter.GetBytes(0.0f), false, null }, + { ScanCompareType.BetweenOrEqual, 1.0f, 2.0f, BitConverter.GetBytes(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.BetweenOrEqual, 1.0f, 2.0f, BitConverter.GetBytes(2.0f), true, new FloatScanResult(2.0f) }, + { ScanCompareType.BetweenOrEqual, 1.0f, 2.0f, BitConverter.GetBytes(3.0f), false, null } + }; + + public static TheoryData GetTestCompareScanCompareTypeUnknownData() => new TheoryData + { + { ScanCompareType.Unknown, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.Unknown, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), true, new FloatScanResult(1.0f) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareBasicData))] + [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] + public void TestCompare(ScanCompareType compareType, float value1, float value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, value1, value2); + + Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Theory] + [InlineData(ScanCompareType.Changed)] + [InlineData(ScanCompareType.NotChanged)] + [InlineData(ScanCompareType.Decreased)] + [InlineData(ScanCompareType.DecreasedOrEqual)] + [InlineData(ScanCompareType.Increased)] + [InlineData(ScanCompareType.IncreasedOrEqual)] + public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) + { + var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, 0.0f, 0.0f); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0.0f), 0, out _)).Throws(); + } + + public static TheoryData GetTestCompareThrowsData() => new TheoryData + { + { null, 0, typeof(ArgumentNullException) }, + { new byte[0], 0, typeof(ArgumentOutOfRangeException) }, + { new byte[1], 1, typeof(ArgumentOutOfRangeException) } + }; + + [Theory] + [MemberData(nameof(GetTestCompareThrowsData))] + public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) + { + var sut = new FloatMemoryComparer(ScanCompareType.Unknown, ScanRoundMode.Normal, 1, 0.0f, 0.0f); + + Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); + } + + public static TheoryData GetTestCompareWithPreviousData() + { + var data = new TheoryData + { + { ScanCompareType.Changed, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.Changed, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.NotChanged, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.NotChanged, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.Increased, 0.0f, 0.0f, BitConverter.GetBytes(2.0f), new FloatScanResult(1.0f), true, new FloatScanResult(2.0f) }, + { ScanCompareType.Increased, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.Increased, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.IncreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(2.0f), new FloatScanResult(1.0f), true, new FloatScanResult(2.0f) }, + { ScanCompareType.IncreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.IncreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.Decreased, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.Decreased, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.Decreased, 0.0f, 0.0f, BitConverter.GetBytes(2.0f), new FloatScanResult(1.0f), false, null }, + { ScanCompareType.DecreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(0.0f), new FloatScanResult(1.0f), true, new FloatScanResult(0.0f) }, + { ScanCompareType.DecreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(1.0f), new FloatScanResult(1.0f), true, new FloatScanResult(1.0f) }, + { ScanCompareType.DecreasedOrEqual, 0.0f, 0.0f, BitConverter.GetBytes(2.0f), new FloatScanResult(1.0f), false, null } + }; + + var basicData = GetTestCompareBasicData(); + foreach (var x in basicData) + { + data.Add((ScanCompareType)x[0], (float)x[1], (float)x[2], (byte[])x[3], new FloatScanResult(1.0f), (bool)x[4], (ScanResult)x[5]); + } + + return data; + } + + [Theory] + [MemberData(nameof(GetTestCompareWithPreviousData))] + public void TestCompareWithPrevious(ScanCompareType compareType, float value1, float value2, byte[] data, ScanResult previousScanResult, bool expectedResult, ScanResult expectedScanResult) + { + var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, value1, value2); + + Check.That(sut.Compare(data, 0, previousScanResult, out var scanResult)).IsEqualTo(expectedResult); + Check.That(scanResult).IsEqualTo(expectedScanResult); + if (scanResult != null) + { + Check.That(scanResult).IsInstanceOf(); + } + } + + [Fact] + public void TestCompareWithPreviousThrows() + { + var sut = new FloatMemoryComparer(ScanCompareType.Unknown, ScanRoundMode.Normal, 1, 0, 0); + + Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0.0f), 0, new FloatScanResult(0.0f), out _)).Throws(); + } + } +} From 386f89d773dc0260501b69ced8ab71475d37e1bd Mon Sep 17 00:00:00 2001 From: namazso Date: Sat, 21 Sep 2019 23:18:49 +0200 Subject: [PATCH 655/777] Almost only-RPM module enumeration --- .../EnumerateRemoteSectionsAndModules.cpp | 201 +++++++++++++----- 1 file changed, 142 insertions(+), 59 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index f21f2539..d20e64f3 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -1,10 +1,108 @@ #include +#include #include #include #include #include "NativeCore.hpp" +template +static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) +{ + const auto ntdll = GetModuleHandle(TEXT("ntdll")); + if (!ntdll) + return ERROR_MOD_NOT_FOUND; + + using tRtlNtStatusToDosError = ULONG (NTAPI *)( + _In_ NTSTATUS Status + ); + const auto _RtlNtStatusToDosError = tRtlNtStatusToDosError(GetProcAddress(ntdll, "RtlNtStatusToDosError")); + if (!_RtlNtStatusToDosError) + return ERROR_NOT_FOUND; + + using tNtQueryInformationProcess = NTSTATUS (NTAPI *)( + _In_ HANDLE ProcessHandle, + _In_ PROCESSINFOCLASS ProcessInformationClass, + _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation, + _In_ ULONG ProcessInformationLength, + _Out_opt_ PULONG ReturnLength + ); + + const auto _NtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); + if (!_NtQueryInformationProcess) + return ERROR_NOT_FOUND; + + PROCESS_BASIC_INFORMATION pbi; + const auto status = _NtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr); + if (!NT_SUCCESS(status)) + return _RtlNtStatusToDosError(status); + + PPEB_LDR_DATA ldr; + auto success = ReadRemoteMemory(process, &pbi.PebBaseAddress->Ldr, &ldr, 0, sizeof(ldr)); + if (!success) + return ERROR_READ_FAULT; // we seem to swallow the error anyways, might aswell give a distinctive one back + + const auto list_head = &ldr->InMemoryOrderModuleList; // remote address + PLIST_ENTRY list_current; // remote address + success = ReadRemoteMemory(process, &list_head->Flink, &list_current, 0, sizeof(list_current)); + if (!success) + return ERROR_READ_FAULT; + + while (list_current != list_head) + { + // TODO: error handling - what do we do if module list changed? We can't un-call the callback + + LDR_DATA_TABLE_ENTRY mod; + success = ReadRemoteMemory(process, CONTAINING_RECORD(list_current, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks), &mod, 0, sizeof(mod)); + if (!success) + return ERROR_SUCCESS; // return success here to prevent running the other one + + EnumerateRemoteModuleData data = {}; + data.BaseAddress = mod.DllBase; + data.Size = *(ULONG*)&mod.Reserved2[1]; // instead of undocced member could read ImageSize from headers + const auto path_len = std::min(sizeof(RC_UnicodeChar) * (PATH_MAXIMUM_LENGTH - 1), size_t(mod.FullDllName.Length)); + success = ReadRemoteMemory(process, mod.FullDllName.Buffer, data.Path, 0, int(path_len)); + if (!success) + return ERROR_SUCCESS; // return success here to prevent running the other one + + // UNICODE_STRING is not guaranteed to be null terminated + data.Path[path_len / 2] = 0; + + proc(&data); + + list_current = mod.InMemoryOrderLinks.Flink; + } + + return ERROR_SUCCESS; +} + +template +static DWORD EnumerateRemoteModulesWinapi(HANDLE process, Proc proc) +{ + const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); + if (handle == INVALID_HANDLE_VALUE) + return GetLastError(); + + MODULEENTRY32W me32 = {}; + me32.dwSize = sizeof(MODULEENTRY32W); + if (Module32FirstW(handle, &me32)) + { + do + { + EnumerateRemoteModuleData data = {}; + data.BaseAddress = me32.modBaseAddr; + data.Size = me32.modBaseSize; + std::memcpy(data.Path, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); + + proc(&data); + } while (Module32NextW(handle, &me32)); + } + + CloseHandle(handle); + + return ERROR_SUCCESS; +} + void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) { if (callbackSection == nullptr && callbackModule == nullptr) @@ -55,82 +153,67 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate address = reinterpret_cast(memInfo.BaseAddress) + memInfo.RegionSize; } - const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); - if (handle != INVALID_HANDLE_VALUE) + const auto moduleEnumerator = [&](EnumerateRemoteModuleData* data) { - MODULEENTRY32W me32 = {}; - me32.dwSize = sizeof(MODULEENTRY32W); - if (Module32FirstW(handle, &me32)) + if (callbackModule != nullptr) + callbackModule(data); + + if (callbackSection != nullptr) { - do - { - if (callbackModule != nullptr) + auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(data->BaseAddress), [§ions](const auto& lhs, const LPVOID& rhs) { - EnumerateRemoteModuleData data = {}; - data.BaseAddress = me32.modBaseAddr; - data.Size = me32.modBaseSize; - std::memcpy(data.Path, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); - - callbackModule(&data); - } + return lhs.BaseAddress < rhs; + }); - if (callbackSection != nullptr) - { - auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(me32.modBaseAddr), [§ions](const auto& lhs, const LPVOID& rhs) - { - return lhs.BaseAddress < rhs; - }); + IMAGE_DOS_HEADER DosHdr = {}; + IMAGE_NT_HEADERS NtHdr = {}; - IMAGE_DOS_HEADER DosHdr = {}; - IMAGE_NT_HEADERS NtHdr = {}; + ReadRemoteMemory(process, data->BaseAddress, &DosHdr, 0, sizeof(IMAGE_DOS_HEADER)); + ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + DosHdr.e_lfanew, &NtHdr, 0, sizeof(IMAGE_NT_HEADERS)); - ReadRemoteMemory(process, me32.modBaseAddr, &DosHdr, 0, sizeof(IMAGE_DOS_HEADER)); - ReadRemoteMemory(process, me32.modBaseAddr + DosHdr.e_lfanew, &NtHdr, 0, sizeof(IMAGE_NT_HEADERS)); + std::vector sectionHeaders(NtHdr.FileHeader.NumberOfSections); + ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + DosHdr.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, NtHdr.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); + for (auto i = 0; i < NtHdr.FileHeader.NumberOfSections; ++i) + { + auto&& sectionHeader = sectionHeaders[i]; - std::vector sectionHeaders(NtHdr.FileHeader.NumberOfSections); - ReadRemoteMemory(process, me32.modBaseAddr + DosHdr.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, NtHdr.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); - for (auto i = 0; i < NtHdr.FileHeader.NumberOfSections; ++i) + const auto sectionAddress = reinterpret_cast(data->BaseAddress) + sectionHeader.VirtualAddress; + for (auto j = it; j != std::end(sections); ++j) + { + if (sectionAddress >= reinterpret_cast(j->BaseAddress) && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size)) { - auto&& sectionHeader = sectionHeaders[i]; + // Copy the name because it is not null padded. + char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; + std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); - const auto sectionAddress = reinterpret_cast(me32.modBaseAddr) + sectionHeader.VirtualAddress; - for (auto j = it; j != std::end(sections); ++j) + if (std::strcmp(buffer, ".text") == 0 || std::strcmp(buffer, "code") == 0) + { + j->Category = SectionCategory::CODE; + } + else if (std::strcmp(buffer, ".data") == 0 || std::strcmp(buffer, "data") == 0 || std::strcmp(buffer, ".rdata") == 0 || std::strcmp(buffer, ".idata") == 0) { - if (sectionAddress >= reinterpret_cast(j->BaseAddress) && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size)) - { - // Copy the name because it is not null padded. - char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; - std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); - - if (std::strcmp(buffer, ".text") == 0 || std::strcmp(buffer, "code") == 0) - { - j->Category = SectionCategory::CODE; - } - else if (std::strcmp(buffer, ".data") == 0 || std::strcmp(buffer, "data") == 0 || std::strcmp(buffer, ".rdata") == 0 || std::strcmp(buffer, ".idata") == 0) - { - j->Category = SectionCategory::DATA; - } - - MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); - std::memcpy(j->ModulePath, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); - - break; - } + j->Category = SectionCategory::DATA; } + MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); + std::memcpy(j->ModulePath, data->Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); + + break; } } - } while (Module32NextW(handle, &me32)); - } - CloseHandle(handle); + } + } + }; + + if(EnumerateRemoteModulesNative(process, moduleEnumerator) != ERROR_SUCCESS) + EnumerateRemoteModulesWinapi(process, moduleEnumerator); - if (callbackSection != nullptr) + if (callbackSection != nullptr) + { + for (auto&& section : sections) { - for (auto&& section : sections) - { - callbackSection(§ion); - } + callbackSection(§ion); } } } From 40a0f63c4b98845bb784a4b5e8bcf0577b08238c Mon Sep 17 00:00:00 2001 From: namazso Date: Sat, 21 Sep 2019 23:40:38 +0200 Subject: [PATCH 656/777] move PEB getting part out of module enumeration --- .../EnumerateRemoteSectionsAndModules.cpp | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index d20e64f3..782f0383 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -6,8 +6,7 @@ #include "NativeCore.hpp" -template -static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) +static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) { const auto ntdll = GetModuleHandle(TEXT("ntdll")); if (!ntdll) @@ -27,18 +26,31 @@ static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength ); - + const auto _NtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); if (!_NtQueryInformationProcess) return ERROR_NOT_FOUND; - + PROCESS_BASIC_INFORMATION pbi; const auto status = _NtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr); if (!NT_SUCCESS(status)) return _RtlNtStatusToDosError(status); + *ppeb = pbi.PebBaseAddress; + + return ERROR_SUCCESS; +} + +template +static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) +{ + PPEB ppeb; + const auto error = GetRemotePeb(process, &ppeb); + if (error != ERROR_SUCCESS) + return error; + PPEB_LDR_DATA ldr; - auto success = ReadRemoteMemory(process, &pbi.PebBaseAddress->Ldr, &ldr, 0, sizeof(ldr)); + auto success = ReadRemoteMemory(process, ppeb->Ldr, &ldr, 0, sizeof(ldr)); if (!success) return ERROR_READ_FAULT; // we seem to swallow the error anyways, might aswell give a distinctive one back From e8c25cb870df6aee863150f04f5f3565fa061267 Mon Sep 17 00:00:00 2001 From: namazso Date: Sun, 29 Sep 2019 02:25:12 +0200 Subject: [PATCH 657/777] conform the C standard --- .../Windows/EnumerateRemoteSectionsAndModules.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 782f0383..ab9fa8e8 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -15,8 +15,8 @@ static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) using tRtlNtStatusToDosError = ULONG (NTAPI *)( _In_ NTSTATUS Status ); - const auto _RtlNtStatusToDosError = tRtlNtStatusToDosError(GetProcAddress(ntdll, "RtlNtStatusToDosError")); - if (!_RtlNtStatusToDosError) + const auto pRtlNtStatusToDosError = tRtlNtStatusToDosError(GetProcAddress(ntdll, "RtlNtStatusToDosError")); + if (!pRtlNtStatusToDosError) return ERROR_NOT_FOUND; using tNtQueryInformationProcess = NTSTATUS (NTAPI *)( @@ -27,14 +27,14 @@ static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) _Out_opt_ PULONG ReturnLength ); - const auto _NtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); - if (!_NtQueryInformationProcess) + const auto pNtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); + if (!pNtQueryInformationProcess) return ERROR_NOT_FOUND; PROCESS_BASIC_INFORMATION pbi; - const auto status = _NtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr); + const auto status = pNtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr); if (!NT_SUCCESS(status)) - return _RtlNtStatusToDosError(status); + return pRtlNtStatusToDosError(status); *ppeb = pbi.PebBaseAddress; From 0d9fe99b2532f9f534c7d88e7c6a6a4cbf491895 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 9 Oct 2019 15:01:18 +0200 Subject: [PATCH 658/777] Added keyboard shortcut for opening 'Go to class...' dialog --- ReClass.NET/Forms/MainForm.Designer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index f9eaffa6..dc38bd37 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -1290,6 +1290,7 @@ private void InitializeComponent() // this.goToClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Class_Type; this.goToClassToolStripMenuItem.Name = "goToClassToolStripMenuItem"; + this.goToClassToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); this.goToClassToolStripMenuItem.Size = new System.Drawing.Size(198, 22); this.goToClassToolStripMenuItem.Text = "Go to class..."; this.goToClassToolStripMenuItem.Click += new System.EventHandler(this.goToClassToolStripMenuItem_Click); From 46c23087da85cbc83523723cd95519d4b163cdf2 Mon Sep 17 00:00:00 2001 From: LichProject Date: Tue, 29 Oct 2019 03:58:14 +0300 Subject: [PATCH 659/777] Possible quality for C# generator. Improved code-style, HEX offsets instead of decimal, support Vectors. --- .../CodeGenerator/CSharpCodeGenerator.cs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index b4d36d17..91bf5fcf 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Diagnostics.Contracts; @@ -32,8 +32,12 @@ public class CSharpCodeGenerator : ICodeGenerator [typeof(Utf16TextPtrNode)] = "IntPtr", [typeof(Utf32TextPtrNode)] = "IntPtr", [typeof(PointerNode)] = "IntPtr", - [typeof(VirtualMethodTableNode)] = "IntPtr" - }; + [typeof(VirtualMethodTableNode)] = "IntPtr", + + [typeof(Vector2Node)] = "Vector2", + [typeof(Vector3Node)] = "Vector3", + [typeof(Vector4Node)] = "Vector4" + }; public Language Language => Language.CSharp; @@ -48,6 +52,9 @@ public string GenerateCode(IReadOnlyList classes, IReadOnlyList Date: Fri, 1 Nov 2019 20:09:55 +0100 Subject: [PATCH 660/777] Updated to C++17. Use non deprecated header file. --- NativeCore/Windows/EnumerateProcesses.cpp | 5 ++--- NativeCore/Windows/NativeCore.vcxproj | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NativeCore/Windows/EnumerateProcesses.cpp b/NativeCore/Windows/EnumerateProcesses.cpp index e7d14faf..534b4a84 100644 --- a/NativeCore/Windows/EnumerateProcesses.cpp +++ b/NativeCore/Windows/EnumerateProcesses.cpp @@ -1,8 +1,7 @@ #include #include #include -#include -namespace fs = std::experimental::filesystem; +#include #include "NativeCore.hpp" @@ -73,7 +72,7 @@ void RC_CallConv EnumerateProcesses(EnumerateProcessCallback callbackProcess) EnumerateProcessData data = { }; data.Id = pe32.th32ProcessID; GetModuleFileNameExW(process, nullptr, reinterpret_cast(data.Path), PATH_MAXIMUM_LENGTH); - const auto name = fs::path(data.Path).filename().u16string(); + const auto name = std::filesystem::path(data.Path).filename().u16string(); str16cpy(data.Name, name.c_str(), std::min(name.length(), PATH_MAXIMUM_LENGTH - 1)); callbackProcess(&data); diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index b2b2b2d8..1e8d6695 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -104,6 +104,7 @@ Level3 Disabled WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + stdcpp17 Windows @@ -119,6 +120,7 @@ Level3 Disabled _DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + stdcpp17 Windows @@ -136,6 +138,7 @@ true true WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + stdcpp17 Windows @@ -155,6 +158,7 @@ true true NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + stdcpp17 Windows From 8125eac282d56fa0b9040294ca49b2febd7d9237 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 1 Nov 2019 20:14:44 +0100 Subject: [PATCH 661/777] Ignore codecvt deprecation warning until there is an official replacement. --- NativeCore/Windows/NativeCore.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 1e8d6695..520adc23 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -103,7 +103,7 @@ Level3 Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 @@ -119,7 +119,7 @@ Level3 Disabled - _DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + _DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 @@ -137,7 +137,7 @@ MaxSpeed true true - WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 @@ -157,7 +157,7 @@ MaxSpeed true true - NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;%(PreprocessorDefinitions) + NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET64;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 From 1d7214b0825d5700c7193ce414137bad39f978a6 Mon Sep 17 00:00:00 2001 From: Joel Noguera Date: Thu, 2 Jan 2020 12:53:01 -0300 Subject: [PATCH 662/777] New plugin available In case you find it interesting, I have made public a new plugin for this tool. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0040f004..b457de8b 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ This is a port of ReClass to the .NET platform with lots of additional features. - [LoadBinary Plugin](https://github.com/ReClassNET/ReClass.NET-LoadBinaryPlugin) - [Handle Abuser Plugin](https://github.com/ReClassNET/ReClass.NET-HandleAbuser) - [Unreal Plugin](https://github.com/DrP3pp3r/ReClass.NET-UnrealPlugin) (by [DrP3pp3r](https://github.com/DrP3pp3r)) +- [DriverReader](https://github.com/niemand-sec/ReClass.NET-DriverReader) (by [Niemand](https://github.com/niemand-sec)) To install a plugin just copy it in the "Plugins" folder. If you want to develop your own plugin just learn from the code of the [Sample Plugins](https://github.com/ReClassNET/ReClass.NET-SamplePlugin) and [Frostbite Plugin](https://github.com/ReClassNET/ReClass.NET-FrostbitePlugin) repositories. If you have developed a nice plugin, leave me a message and I will add it to the list above. @@ -118,4 +119,4 @@ Settings - leveln - [buddyfavors](https://github.com/buddyfavors) - [DrP3pp3r](https://github.com/DrP3pp3r) -- [ko1N](https://github.com/ko1N) \ No newline at end of file +- [ko1N](https://github.com/ko1N) From 4fba08f622256fb34b8431d9f940b2c8408a855c Mon Sep 17 00:00:00 2001 From: zeffy Date: Fri, 17 Jan 2020 15:58:09 -0800 Subject: [PATCH 663/777] Add some checks that should fix some issues with certain packers - Add sanity check for section size - Catch bad conversion exception of section name - Detect section category by characteristics flags rather than name --- .../EnumerateRemoteSectionsAndModules.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index f21f2539..e92f1d24 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -96,22 +96,27 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate const auto sectionAddress = reinterpret_cast(me32.modBaseAddr) + sectionHeader.VirtualAddress; for (auto j = it; j != std::end(sections); ++j) { - if (sectionAddress >= reinterpret_cast(j->BaseAddress) && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size)) + if (sectionAddress >= reinterpret_cast(j->BaseAddress) + && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size) + && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= me32.modBaseSize ) { - // Copy the name because it is not null padded. - char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; - std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); - - if (std::strcmp(buffer, ".text") == 0 || std::strcmp(buffer, "code") == 0) + if ((sectionHeader.Characteristics & IMAGE_SCN_CNT_CODE) == IMAGE_SCN_CNT_CODE) { j->Category = SectionCategory::CODE; } - else if (std::strcmp(buffer, ".data") == 0 || std::strcmp(buffer, "data") == 0 || std::strcmp(buffer, ".rdata") == 0 || std::strcmp(buffer, ".idata") == 0) + else if (sectionHeader.Characteristics & (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_DATA)) { j->Category = SectionCategory::DATA; } - MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); + try { + // Copy the name because it is not null padded. + char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; + std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); + MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); + } catch (std::range_error &) { + std::memset(j->Name, 0, sizeof j->Name); + } std::memcpy(j->ModulePath, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); break; From 79f3734b59d568b4a75fb9599c9386da34cd9ee1 Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Sun, 16 Feb 2020 00:49:56 +1000 Subject: [PATCH 664/777] Implemented run as admin and randomize window title option --- ReClass.NET/Forms/MainForm.cs | 10 +++- ReClass.NET/Forms/SettingsForm.Designer.cs | 69 +++++++++++++++------- ReClass.NET/Forms/SettingsForm.cs | 18 ++++++ ReClass.NET/Program.cs | 8 +++ ReClass.NET/Settings.cs | 4 ++ ReClass.NET/Util/SettingsSerializer.cs | 6 +- ReClass.NET/Util/Util.cs | 9 +++ ReClass.NET/Util/WinUtil.cs | 4 ++ 8 files changed, 103 insertions(+), 25 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 0ea6c239..9b3aec3b 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -63,21 +63,25 @@ public MainForm() InitializeComponent(); - Text = $"{Constants.ApplicationName} ({Constants.Platform})"; + string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); + + Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform})"; mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); Program.RemoteProcess.ProcessAttached += sender => { + string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; - Text = $"{Constants.ApplicationName} ({Constants.Platform}) - {text}"; + Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform}) - {text}"; processInfoToolStripStatusLabel.Text = text; }; Program.RemoteProcess.ProcessClosed += sender => { - Text = $"{Constants.ApplicationName} ({Constants.Platform})"; + string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); + Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform})"; processInfoToolStripStatusLabel.Text = "No process selected"; }; diff --git a/ReClass.NET/Forms/SettingsForm.Designer.cs b/ReClass.NET/Forms/SettingsForm.Designer.cs index cc5764b1..35faed19 100644 --- a/ReClass.NET/Forms/SettingsForm.Designer.cs +++ b/ReClass.NET/Forms/SettingsForm.Designer.cs @@ -43,6 +43,8 @@ private void InitializeComponent() this.showIntegerCheckBox = new System.Windows.Forms.CheckBox(); this.showFloatCheckBox = new System.Windows.Forms.CheckBox(); this.displayGroupBox = new System.Windows.Forms.GroupBox(); + this.randomizeWindowTitleCheckBox = new System.Windows.Forms.CheckBox(); + this.runAsAdminCheckBox = new System.Windows.Forms.CheckBox(); this.highlightChangedValuesCheckBox = new System.Windows.Forms.CheckBox(); this.showTextCheckBox = new System.Windows.Forms.CheckBox(); this.showNodeOffsetCheckBox = new System.Windows.Forms.CheckBox(); @@ -288,17 +290,40 @@ private void InitializeComponent() // // displayGroupBox // + this.displayGroupBox.Controls.Add(this.randomizeWindowTitleCheckBox); + this.displayGroupBox.Controls.Add(this.runAsAdminCheckBox); this.displayGroupBox.Controls.Add(this.highlightChangedValuesCheckBox); this.displayGroupBox.Controls.Add(this.showTextCheckBox); this.displayGroupBox.Controls.Add(this.showNodeOffsetCheckBox); this.displayGroupBox.Controls.Add(this.showNodeAddressCheckBox); this.displayGroupBox.Location = new System.Drawing.Point(283, 39); this.displayGroupBox.Name = "displayGroupBox"; - this.displayGroupBox.Size = new System.Drawing.Size(265, 113); + this.displayGroupBox.Size = new System.Drawing.Size(265, 160); this.displayGroupBox.TabIndex = 2; this.displayGroupBox.TabStop = false; this.displayGroupBox.Text = "Display"; // + // randomizeWindowTitleCheckBox + // + this.randomizeWindowTitleCheckBox.AutoSize = true; + this.randomizeWindowTitleCheckBox.Location = new System.Drawing.Point(6, 134); + this.randomizeWindowTitleCheckBox.Name = "randomizeWindowTitleCheckBox"; + this.randomizeWindowTitleCheckBox.Size = new System.Drawing.Size(137, 17); + this.randomizeWindowTitleCheckBox.TabIndex = 5; + this.randomizeWindowTitleCheckBox.Text = "Randomize window title"; + this.randomizeWindowTitleCheckBox.UseVisualStyleBackColor = true; + // + // runAsAdminCheckBox + // + this.runAsAdminCheckBox.AutoSize = true; + this.runAsAdminCheckBox.Location = new System.Drawing.Point(6, 111); + this.runAsAdminCheckBox.Name = "runAsAdminCheckBox"; + this.runAsAdminCheckBox.Size = new System.Drawing.Size(122, 17); + this.runAsAdminCheckBox.TabIndex = 4; + this.runAsAdminCheckBox.Text = "Run as administrator"; + this.runAsAdminCheckBox.UseVisualStyleBackColor = true; + this.runAsAdminCheckBox.CheckedChanged += new System.EventHandler(this.runAsAdminCheckBox_CheckedChanged); + // // highlightChangedValuesCheckBox // this.highlightChangedValuesCheckBox.AutoSize = true; @@ -695,7 +720,7 @@ private void InitializeComponent() this.boolSettingsLabel.TabIndex = 46; this.boolSettingsLabel.Text = "Bool:"; // - // boolSettingsTextBox + // boolTypeTextBox // this.boolTypeTextBox.Location = new System.Drawing.Point(346, 32); this.boolTypeTextBox.Name = "boolTypeTextBox"; @@ -720,7 +745,7 @@ private void InitializeComponent() this.functionPtrSettingsLabel.TabIndex = 43; this.functionPtrSettingsLabel.Text = "Function Pointer:"; // - // functionPtrSettingsTextBox + // functionPtrTypeTextBox // this.functionPtrTypeTextBox.Location = new System.Drawing.Point(346, 230); this.functionPtrTypeTextBox.Name = "functionPtrTypeTextBox"; @@ -736,7 +761,7 @@ private void InitializeComponent() this.utf16TextSettingsLabel.TabIndex = 39; this.utf16TextSettingsLabel.Text = "UTF16:"; // - // utf16TextSettingsTextBox + // utf16TextTypeTextBox // this.utf16TextTypeTextBox.Location = new System.Drawing.Point(346, 208); this.utf16TextTypeTextBox.Name = "utf16TextTypeTextBox"; @@ -752,7 +777,7 @@ private void InitializeComponent() this.utf8TextSettingsLabel.TabIndex = 35; this.utf8TextSettingsLabel.Text = "UTF8:"; // - // utf8TextSettingsTextBox + // utf8TextTypeTextBox // this.utf8TextTypeTextBox.Location = new System.Drawing.Point(346, 186); this.utf8TextTypeTextBox.Name = "utf8TextTypeTextBox"; @@ -768,7 +793,7 @@ private void InitializeComponent() this.matrix3x3SettingsLabel.TabIndex = 33; this.matrix3x3SettingsLabel.Text = "Matrix (3x3):"; // - // matrix3x3SettingsTextBox + // matrix3x3TypeTextBox // this.matrix3x3TypeTextBox.Location = new System.Drawing.Point(346, 120); this.matrix3x3TypeTextBox.Name = "matrix3x3TypeTextBox"; @@ -784,7 +809,7 @@ private void InitializeComponent() this.matrix3x4SettingsLabel.TabIndex = 31; this.matrix3x4SettingsLabel.Text = "Matrix (3x4):"; // - // matrix3x4SettingsTextBox + // matrix3x4TypeTextBox // this.matrix3x4TypeTextBox.Location = new System.Drawing.Point(346, 142); this.matrix3x4TypeTextBox.Name = "matrix3x4TypeTextBox"; @@ -800,7 +825,7 @@ private void InitializeComponent() this.matrix4x4SettingsLabel.TabIndex = 29; this.matrix4x4SettingsLabel.Text = "Matrix (4x4):"; // - // matrix4x4SettingsTextBox + // matrix4x4TypeTextBox // this.matrix4x4TypeTextBox.Location = new System.Drawing.Point(346, 164); this.matrix4x4TypeTextBox.Name = "matrix4x4TypeTextBox"; @@ -816,7 +841,7 @@ private void InitializeComponent() this.vector2SettingsLabel.TabIndex = 27; this.vector2SettingsLabel.Text = "Vector2:"; // - // vector2SettingsTextBox + // vector2TypeTextBox // this.vector2TypeTextBox.Location = new System.Drawing.Point(346, 54); this.vector2TypeTextBox.Name = "vector2TypeTextBox"; @@ -832,7 +857,7 @@ private void InitializeComponent() this.vector3SettingsLabel.TabIndex = 25; this.vector3SettingsLabel.Text = "Vector3:"; // - // vector3SettingsTextBox + // vector3TypeTextBox // this.vector3TypeTextBox.Location = new System.Drawing.Point(346, 76); this.vector3TypeTextBox.Name = "vector3TypeTextBox"; @@ -848,7 +873,7 @@ private void InitializeComponent() this.vector4SettingsLabel.TabIndex = 23; this.vector4SettingsLabel.Text = "Vector4:"; // - // vector4SettingsTextBox + // vector4TypeTextBox // this.vector4TypeTextBox.Location = new System.Drawing.Point(346, 98); this.vector4TypeTextBox.Name = "vector4TypeTextBox"; @@ -864,7 +889,7 @@ private void InitializeComponent() this.doubleSettingsLabel.TabIndex = 21; this.doubleSettingsLabel.Text = "Double:"; // - // doubleSettingsTextBox + // doubleTypeTextBox // this.doubleTypeTextBox.Location = new System.Drawing.Point(98, 230); this.doubleTypeTextBox.Name = "doubleTypeTextBox"; @@ -880,7 +905,7 @@ private void InitializeComponent() this.floatSettingsLabel.TabIndex = 19; this.floatSettingsLabel.Text = "Float:"; // - // floatSettingsTextBox + // floatTypeTextBox // this.floatTypeTextBox.Location = new System.Drawing.Point(98, 208); this.floatTypeTextBox.Name = "floatTypeTextBox"; @@ -896,7 +921,7 @@ private void InitializeComponent() this.uint64SettingsLabel.TabIndex = 17; this.uint64SettingsLabel.Text = "UInt64:"; // - // uint64SettingsTextBox + // uint64TypeTextBox // this.uint64TypeTextBox.Location = new System.Drawing.Point(98, 186); this.uint64TypeTextBox.Name = "uint64TypeTextBox"; @@ -912,7 +937,7 @@ private void InitializeComponent() this.uint32SettingsLabel.TabIndex = 15; this.uint32SettingsLabel.Text = "UInt32:"; // - // uint32SettingsTextBox + // uint32TypeTextBox // this.uint32TypeTextBox.Location = new System.Drawing.Point(98, 164); this.uint32TypeTextBox.Name = "uint32TypeTextBox"; @@ -928,7 +953,7 @@ private void InitializeComponent() this.uint16SettingsLabel.TabIndex = 13; this.uint16SettingsLabel.Text = "UInt16:"; // - // uint16SettingsTextBox + // uint16TypeTextBox // this.uint16TypeTextBox.Location = new System.Drawing.Point(98, 142); this.uint16TypeTextBox.Name = "uint16TypeTextBox"; @@ -944,7 +969,7 @@ private void InitializeComponent() this.uint8SettingsLabel.TabIndex = 11; this.uint8SettingsLabel.Text = "UInt8:"; // - // uint8SettingsTextBox + // uint8TypeTextBox // this.uint8TypeTextBox.Location = new System.Drawing.Point(98, 120); this.uint8TypeTextBox.Name = "uint8TypeTextBox"; @@ -960,7 +985,7 @@ private void InitializeComponent() this.int64SettingsLabel.TabIndex = 9; this.int64SettingsLabel.Text = "Int64:"; // - // int64SettingsTextBox + // int64TypeTextBox // this.int64TypeTextBox.Location = new System.Drawing.Point(98, 98); this.int64TypeTextBox.Name = "int64TypeTextBox"; @@ -976,7 +1001,7 @@ private void InitializeComponent() this.int32SettingsLabel.TabIndex = 7; this.int32SettingsLabel.Text = "Int32:"; // - // int32SettingsTextBox + // int32TypeTextBox // this.int32TypeTextBox.Location = new System.Drawing.Point(98, 76); this.int32TypeTextBox.Name = "int32TypeTextBox"; @@ -992,7 +1017,7 @@ private void InitializeComponent() this.int16SettingsLabel.TabIndex = 5; this.int16SettingsLabel.Text = "Int16:"; // - // int16SettingsTextBox + // int16TypeTextBox // this.int16TypeTextBox.Location = new System.Drawing.Point(98, 54); this.int16TypeTextBox.Name = "int16TypeTextBox"; @@ -1008,7 +1033,7 @@ private void InitializeComponent() this.int8SettingsLabel.TabIndex = 3; this.int8SettingsLabel.Text = "Int8:"; // - // int8SettingsTextBox + // int8TypeTextBox // this.int8TypeTextBox.Location = new System.Drawing.Point(98, 32); this.int8TypeTextBox.Name = "int8TypeTextBox"; @@ -1153,5 +1178,7 @@ private void InitializeComponent() private System.Windows.Forms.Button removeAssociationButton; private System.Windows.Forms.Button createAssociationButton; private System.Windows.Forms.Label associationInfoLabel; + private System.Windows.Forms.CheckBox randomizeWindowTitleCheckBox; + private System.Windows.Forms.CheckBox runAsAdminCheckBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index f065b959..8a66ac94 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Diagnostics.Contracts; using System.Windows.Forms; using ReClassNET.Extensions; @@ -105,6 +106,8 @@ private void SetGeneralBindings() SetBinding(showSymbolsCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.ShowCommentSymbol)); SetBinding(showStringCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.ShowCommentString)); SetBinding(showPluginInfoCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.ShowCommentPluginInfo)); + SetBinding(runAsAdminCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.RunAsAdmin)); + SetBinding(randomizeWindowTitleCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.RandomizeWindowTitle)); } private void SetColorBindings() @@ -149,5 +152,20 @@ private void SetTypedefinitionBindings() SetBinding(utf16TextTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUtf16Text)); SetBinding(functionPtrTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeFunctionPtr)); } + + private void runAsAdminCheckBox_CheckedChanged(object sender, EventArgs e) + { + settings.RunAsAdmin = runAsAdminCheckBox.Checked; + + if (runAsAdminCheckBox.Checked && !WinUtil.IsAdministrator) + { + var msgboxResult = MessageBox.Show("Would you like to restart ReClass.NET as administrator now?", "ReClass.NET", MessageBoxButtons.YesNo, MessageBoxIcon.Information); + if(msgboxResult == DialogResult.Yes) + { + WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, string.Empty); + Program.MainForm.Close(); + } + } + } } } diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index 2a65548b..edb8beba 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Drawing; using System.Globalization; using System.Windows.Forms; @@ -66,6 +67,13 @@ static void Main(string[] args) Settings = SettingsSerializer.Load(); Logger = new GuiLogger(); + if(Settings.RunAsAdmin && !WinUtil.IsAdministrator) + { + //todo: maybe better paramaters than just the first one? + WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, CommandLineArgs.FileName); + return; + } + #if !DEBUG try { diff --git a/ReClass.NET/Settings.cs b/ReClass.NET/Settings.cs index 49372adf..b5d9268b 100644 --- a/ReClass.NET/Settings.cs +++ b/ReClass.NET/Settings.cs @@ -12,6 +12,10 @@ public class Settings public bool StayOnTop { get; set; } = false; + public bool RunAsAdmin { get; set; } = false; + + public bool RandomizeWindowTitle { get; set; } = false; + // Node Drawing Settings public bool ShowNodeAddress { get; set; } = true; diff --git a/ReClass.NET/Util/SettingsSerializer.cs b/ReClass.NET/Util/SettingsSerializer.cs index 30897511..8376e2e6 100644 --- a/ReClass.NET/Util/SettingsSerializer.cs +++ b/ReClass.NET/Util/SettingsSerializer.cs @@ -35,6 +35,8 @@ public static Settings Load() { XElementSerializer.TryRead(general, nameof(settings.LastProcess), e => settings.LastProcess = XElementSerializer.ToString(e)); XElementSerializer.TryRead(general, nameof(settings.StayOnTop), e => settings.StayOnTop = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(general, nameof(settings.RunAsAdmin), e => settings.RunAsAdmin = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(general, nameof(settings.RandomizeWindowTitle), e => settings.RandomizeWindowTitle = XElementSerializer.ToBool(e)); } var display = root?.Element(XmlDisplayElement); if (display != null) @@ -105,7 +107,9 @@ public static void Save(Settings settings) new XElement( XmlGeneralElement, XElementSerializer.ToXml(nameof(settings.LastProcess), settings.LastProcess), - XElementSerializer.ToXml(nameof(settings.StayOnTop), settings.StayOnTop) + XElementSerializer.ToXml(nameof(settings.StayOnTop), settings.StayOnTop), + XElementSerializer.ToXml(nameof(settings.RunAsAdmin), settings.RunAsAdmin), + XElementSerializer.ToXml(nameof(settings.RandomizeWindowTitle), settings.RandomizeWindowTitle) ), new XElement( XmlDisplayElement, diff --git a/ReClass.NET/Util/Util.cs b/ReClass.NET/Util/Util.cs index 850f23ad..15859b6d 100644 --- a/ReClass.NET/Util/Util.cs +++ b/ReClass.NET/Util/Util.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Linq; namespace ReClassNET.Util { @@ -50,5 +51,13 @@ public static void Swap(ref T lhs, ref T rhs) lhs = rhs; rhs = temp; } + + //thx again stack overflow https://stackoverflow.com/a/1344242 + public static string RandomString(int length) + { + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + return new string(Enumerable.Repeat(chars, length) + .Select(s => s[Program.GlobalRandom.Next(s.Length)]).ToArray()); + } } } diff --git a/ReClass.NET/Util/WinUtil.cs b/ReClass.NET/Util/WinUtil.cs index f01c0b07..8c8fbaf9 100644 --- a/ReClass.NET/Util/WinUtil.cs +++ b/ReClass.NET/Util/WinUtil.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Diagnostics.Contracts; +using System.Security.Principal; using Microsoft.Win32; namespace ReClassNET.Util @@ -23,6 +24,9 @@ public static class WinUtil public static bool IsAtLeastWindows10 { get; } + //from https://stackoverflow.com/a/11660205 + public static bool IsAdministrator => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); + static WinUtil() { var os = Environment.OSVersion; From ebd70188f5d160479b4ca3330c827f25ba345910 Mon Sep 17 00:00:00 2001 From: Timboy67678 Date: Sun, 16 Feb 2020 01:00:47 +1000 Subject: [PATCH 665/777] added actual parameters --- ReClass.NET/Program.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index edb8beba..ab0d78fd 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -69,8 +69,7 @@ static void Main(string[] args) if(Settings.RunAsAdmin && !WinUtil.IsAdministrator) { - //todo: maybe better paramaters than just the first one? - WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, CommandLineArgs.FileName); + WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, args.Length > 0 ? string.Join(" ", args) : null); return; } From 3edc3d11c9c00c91981b8913fc654b2ace20e755 Mon Sep 17 00:00:00 2001 From: Timboy67678 <994534+Timboy67678@users.noreply.github.com> Date: Sun, 16 Feb 2020 05:11:06 +1000 Subject: [PATCH 666/777] implemented suggestions by @KN4CK3R --- ReClass.NET/Forms/MainForm.cs | 23 +++++++++++++--------- ReClass.NET/Forms/SettingsForm.Designer.cs | 5 ++--- ReClass.NET/Forms/SettingsForm.cs | 16 +-------------- ReClass.NET/Program.cs | 2 +- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 9b3aec3b..19a91628 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -56,32 +56,37 @@ public ClassNode CurrentClassNode } } + private void UpdateWindowTitle(string extra = null) + { + var title = $"{(Program.Settings.RandomizeWindowTitle ? Utils.RandomString(Program.GlobalRandom.Next(15, 20)) : Constants.ApplicationName)} ({Constants.Platform})"; + if (!string.IsNullOrEmpty(extra)) + { + title += $" - {extra}"; + } + Text = title; + } + public MainForm() { Contract.Ensures(pluginManager != null); Contract.Ensures(currentProject != null); InitializeComponent(); - - string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); - - Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform})"; + UpdateWindowTitle(); mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); Program.RemoteProcess.ProcessAttached += sender => { - string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); var text = $"{sender.UnderlayingProcess.Name} (ID: {sender.UnderlayingProcess.Id.ToString()})"; - - Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform}) - {text}"; processInfoToolStripStatusLabel.Text = text; + UpdateWindowTitle(text); + }; Program.RemoteProcess.ProcessClosed += sender => { - string randomWindowTitle = Utils.RandomString(Program.GlobalRandom.Next(15, 20)); - Text = $"{(Program.Settings.RandomizeWindowTitle ? randomWindowTitle : Constants.ApplicationName)} ({Constants.Platform})"; + UpdateWindowTitle(); processInfoToolStripStatusLabel.Text = "No process selected"; }; diff --git a/ReClass.NET/Forms/SettingsForm.Designer.cs b/ReClass.NET/Forms/SettingsForm.Designer.cs index 35faed19..517e8196 100644 --- a/ReClass.NET/Forms/SettingsForm.Designer.cs +++ b/ReClass.NET/Forms/SettingsForm.Designer.cs @@ -318,11 +318,10 @@ private void InitializeComponent() this.runAsAdminCheckBox.AutoSize = true; this.runAsAdminCheckBox.Location = new System.Drawing.Point(6, 111); this.runAsAdminCheckBox.Name = "runAsAdminCheckBox"; - this.runAsAdminCheckBox.Size = new System.Drawing.Size(122, 17); + this.runAsAdminCheckBox.Size = new System.Drawing.Size(200, 17); this.runAsAdminCheckBox.TabIndex = 4; - this.runAsAdminCheckBox.Text = "Run as administrator"; + this.runAsAdminCheckBox.Text = "Run as administrator (requires restart)"; this.runAsAdminCheckBox.UseVisualStyleBackColor = true; - this.runAsAdminCheckBox.CheckedChanged += new System.EventHandler(this.runAsAdminCheckBox_CheckedChanged); // // highlightChangedValuesCheckBox // diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index 8a66ac94..9c3f8a18 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -44,6 +44,7 @@ public SettingsForm(Settings settings, CppTypeMapping typeMapping) if (NativeMethods.IsUnix()) { fileAssociationGroupBox.Enabled = false; + runAsAdminCheckBox.Enabled = false; } else { @@ -152,20 +153,5 @@ private void SetTypedefinitionBindings() SetBinding(utf16TextTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUtf16Text)); SetBinding(functionPtrTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeFunctionPtr)); } - - private void runAsAdminCheckBox_CheckedChanged(object sender, EventArgs e) - { - settings.RunAsAdmin = runAsAdminCheckBox.Checked; - - if (runAsAdminCheckBox.Checked && !WinUtil.IsAdministrator) - { - var msgboxResult = MessageBox.Show("Would you like to restart ReClass.NET as administrator now?", "ReClass.NET", MessageBoxButtons.YesNo, MessageBoxIcon.Information); - if(msgboxResult == DialogResult.Yes) - { - WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, string.Empty); - Program.MainForm.Close(); - } - } - } } } diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index ab0d78fd..edeebd88 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -67,7 +67,7 @@ static void Main(string[] args) Settings = SettingsSerializer.Load(); Logger = new GuiLogger(); - if(Settings.RunAsAdmin && !WinUtil.IsAdministrator) + if(!NativeMethods.IsUnix() && Settings.RunAsAdmin && !WinUtil.IsAdministrator) { WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, args.Length > 0 ? string.Join(" ", args) : null); return; From 8cee86ff9f745a8f2cef66bd25d02b1a1fcd52c4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 19 Feb 2020 10:31:34 +0100 Subject: [PATCH 667/777] Use C# 8 features. --- .../ReClass/ReClassNetFile.Read.cs | 222 +++++++++--------- 1 file changed, 106 insertions(+), 116 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index fa86084b..4abee4fb 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -17,10 +17,9 @@ public partial class ReClassNetFile { public void Load(string filePath, ILogger logger) { - using (var fs = new FileStream(filePath, FileMode.Open)) - { - Load(fs, logger); - } + using var fs = new FileStream(filePath, FileMode.Open); + + Load(fs, logger); } public void Load(Stream input, ILogger logger) @@ -28,112 +27,109 @@ public void Load(Stream input, ILogger logger) Contract.Requires(input != null); Contract.Requires(logger != null); - using (var archive = new ZipArchive(input, ZipArchiveMode.Read)) + using var archive = new ZipArchive(input, ZipArchiveMode.Read); + var dataEntry = archive.GetEntry(DataFileName); + if (dataEntry == null) { - var dataEntry = archive.GetEntry(DataFileName); - if (dataEntry == null) - { - throw new FormatException(); - } - using (var entryStream = dataEntry.Open()) - { - var document = XDocument.Load(entryStream); - if (document.Root?.Element(XmlClassesElement) == null) - { - throw new FormatException("The data has not the correct format."); - } + throw new FormatException(); + } - uint.TryParse(document.Root.Attribute(XmlVersionAttribute)?.Value, out var fileVersion); - if ((fileVersion & FileVersionCriticalMask) > (FileVersion & FileVersionCriticalMask)) - { - throw new FormatException($"The file version is unsupported. A newer {Constants.ApplicationName} version is required to read it."); - } + using var entryStream = dataEntry.Open(); + var document = XDocument.Load(entryStream); + if (document.Root?.Element(XmlClassesElement) == null) + { + throw new FormatException("The data has not the correct format."); + } - var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; - if (platform != Constants.Platform) - { - logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); - } + uint.TryParse(document.Root.Attribute(XmlVersionAttribute)?.Value, out var fileVersion); + if ((fileVersion & FileVersionCriticalMask) > (FileVersion & FileVersionCriticalMask)) + { + throw new FormatException($"The file version is unsupported. A newer {Constants.ApplicationName} version is required to read it."); + } - var customDataElement = document.Root.Element(XmlCustomDataElement); - if (customDataElement != null) - { - project.CustomData.Deserialize(customDataElement); - } + var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; + if (platform != Constants.Platform) + { + logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); + } + + var customDataElement = document.Root.Element(XmlCustomDataElement); + if (customDataElement != null) + { + project.CustomData.Deserialize(customDataElement); + } - var typeMappingElement = document.Root.Element(XmlTypeMappingElement); - if (typeMappingElement != null) + var typeMappingElement = document.Root.Element(XmlTypeMappingElement); + if (typeMappingElement != null) + { + project.TypeMapping.Deserialize(typeMappingElement); + } + + var enumsElement = document.Root.Element(XmlEnumsElement); + if (enumsElement != null) + { + foreach (var enumElement in enumsElement.Elements(XmlEnumElement)) + { + var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; + var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; + var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); + + var values = new Dictionary(); + foreach (var itemElement in enumElement.Elements(XmlItemElement)) { - project.TypeMapping.Deserialize(typeMappingElement); + var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; + var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0L; + + values.Add(itemName, itemValue); } - var enumsElement = document.Root.Element(XmlEnumsElement); - if (enumsElement != null) + var @enum = new EnumDescription { - foreach (var enumElement in enumsElement.Elements(XmlEnumElement)) - { - var name = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; - var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false; - var size = enumElement.Attribute(XmlSizeAttribute).GetEnumValue(); - - var values = new Dictionary(); - foreach (var itemElement in enumElement.Elements(XmlItemElement)) - { - var itemName = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty; - var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0L; - - values.Add(itemName, itemValue); - } - - var @enum = new EnumDescription - { - Name = name - }; - @enum.SetData(useFlagsMode, size, values); - - project.AddEnum(@enum); - } - } + Name = name + }; + @enum.SetData(useFlagsMode, size, values); + + project.AddEnum(@enum); + } + } - var classes = new List>(); + var classes = new List>(); - var classesElement = document.Root.Element(XmlClassesElement); - if (classesElement != null) + var classesElement = document.Root.Element(XmlClassesElement); + if (classesElement != null) + { + foreach (var element in classesElement + .Elements(XmlClassElement) + .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value)) + { + var node = new ClassNode(false) { - foreach (var element in classesElement - .Elements(XmlClassElement) - .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value)) - { - var node = new ClassNode(false) - { - Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), - Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, - Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, - AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty - }; - - if (!project.ContainsClass(node.Uuid)) - { - project.AddClass(node); - - classes.Add(Tuple.Create(element, node)); - } - } - } + Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), + Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, + Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, + AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty + }; - foreach (var t in classes) + if (!project.ContainsClass(node.Uuid)) { - var nodes = t.Item1.Elements(XmlNodeElement) - .Select(e => CreateNodeFromElement(e, t.Item2, logger)) - .Where(n => n != null); + project.AddClass(node); - foreach (var node in nodes) - { - t.Item2.AddNode(node); - } + classes.Add(Tuple.Create(element, node)); } } } + + foreach (var t in classes) + { + var nodes = t.Item1.Elements(XmlNodeElement) + .Select(e => CreateNodeFromElement(e, t.Item2, logger)) + .Where(n => n != null); + + foreach (var node in nodes) + { + t.Item2.AddNode(node); + } + } } private BaseNode CreateNodeFromElement(XElement element, BaseNode parent, ILogger logger) @@ -199,15 +195,11 @@ ClassNode GetClassNodeFromElementReference() return null; } - switch (node) + node = node switch { - case BaseClassArrayNode classArrayNode: - node = classArrayNode.GetEquivalentNode(0, innerClass); - break; - case ClassPointerNode classPointerNode: - node = classPointerNode.GetEquivalentNode(innerClass); - break; - } + BaseClassArrayNode classArrayNode => classArrayNode.GetEquivalentNode(0, innerClass), + ClassPointerNode classPointerNode => classPointerNode.GetEquivalentNode(innerClass) + }; } else { @@ -321,26 +313,24 @@ public static Tuple, List> DeserializeNodesFromStream( Contract.Requires(logger != null); Contract.Ensures(Contract.Result, List>>() != null); - using (var project = new ReClassNetProject()) - { - templateProject?.Classes.ForEach(project.AddClass); + using var project = new ReClassNetProject(); + templateProject?.Classes.ForEach(project.AddClass); - var file = new ReClassNetFile(project); - file.Load(input, logger); + var file = new ReClassNetFile(project); + file.Load(input, logger); - var classes = project.Classes - .Where(c => c.Name != SerializationClassName); - if (templateProject != null) - { - classes = classes.Where(c => !templateProject.ContainsClass(c.Uuid)); - } + var classes = project.Classes + .Where(c => c.Name != SerializationClassName); + if (templateProject != null) + { + classes = classes.Where(c => !templateProject.ContainsClass(c.Uuid)); + } - var nodes = project.Classes - .Where(c => c.Name == SerializationClassName) - .SelectMany(c => c.Nodes); + var nodes = project.Classes + .Where(c => c.Name == SerializationClassName) + .SelectMany(c => c.Nodes); - return Tuple.Create(classes.ToList(), nodes.ToList()); - } + return Tuple.Create(classes.ToList(), nodes.ToList()); } } } From 2a181ed6d45a5dfb8ceb5c7c18184ea4a0d646ce Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 19 Feb 2020 10:41:17 +0100 Subject: [PATCH 668/777] Speed up file loading. (#148) --- .../ReClass/ReClassNetFile.Read.cs | 17 +++---- ReClass.NET/Nodes/BaseContainerNode.cs | 51 +++++++++++++------ 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 4abee4fb..228e5178 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -93,7 +93,7 @@ public void Load(Stream input, ILogger logger) } } - var classes = new List>(); + var classes = new List<(XElement, ClassNode)>(); var classesElement = document.Root.Element(XmlClassesElement); if (classesElement != null) @@ -114,21 +114,20 @@ public void Load(Stream input, ILogger logger) { project.AddClass(node); - classes.Add(Tuple.Create(element, node)); + classes.Add((element, node)); } } } - foreach (var t in classes) + foreach (var (element, classNode) in classes) { - var nodes = t.Item1.Elements(XmlNodeElement) - .Select(e => CreateNodeFromElement(e, t.Item2, logger)) + var nodes = element.Elements(XmlNodeElement) + .Select(e => CreateNodeFromElement(e, classNode, logger)) .Where(n => n != null); - foreach (var node in nodes) - { - t.Item2.AddNode(node); - } + classNode.BeginUpdate(); + classNode.AddNodes(nodes); + classNode.EndUpdate(); } } diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index f9201720..6926111f 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -8,6 +8,8 @@ public abstract class BaseContainerNode : BaseNode { private readonly List nodes = new List(); + private int updateCount; + /// The child nodes of the container. public IReadOnlyList Nodes => nodes; @@ -122,6 +124,35 @@ private bool TryGetNeighbour(BaseNode node, int offset, out BaseNode neighbour) return true; } + /// + /// Disables internal events to speed up batch processing. + /// must be called to restore the functionality. + /// + public void BeginUpdate() + { + updateCount++; + } + + /// + /// Enables internal events disabled by . + /// + public void EndUpdate() + { + updateCount = Math.Max(0, updateCount - 1); + + OnNodesUpdated(); + } + + private void OnNodesUpdated() + { + if (updateCount == 0) + { + UpdateOffsets(); + + GetParentContainer()?.ChildHasChanged(this); + } + } + /// Replaces the old node with the new node. /// The old node to replacce. /// The new node. @@ -172,9 +203,7 @@ public void ReplaceChildNode(BaseNode oldNode, BaseNode newNode, ref List @@ -253,9 +282,7 @@ protected void InsertBytes(int index, int size, ref List createdNodes) index++; } - UpdateOffsets(); - - GetParentContainer()?.ChildHasChanged(this); + OnNodesUpdated(); } /// @@ -286,9 +313,7 @@ public void AddNode(BaseNode node) nodes.Add(node); - UpdateOffsets(); - - GetParentContainer()?.ChildHasChanged(this); + OnNodesUpdated(); } /// @@ -312,9 +337,7 @@ public void InsertNode(BaseNode position, BaseNode node) nodes.Insert(index, node); - UpdateOffsets(); - - GetParentContainer()?.ChildHasChanged(this); + OnNodesUpdated(); } /// Removes the specified node. @@ -327,9 +350,7 @@ public bool RemoveNode(BaseNode node) var result = nodes.Remove(node); if (result) { - UpdateOffsets(); - - GetParentContainer()?.ChildHasChanged(this); + OnNodesUpdated(); } return result; } From 811746bf0c733f88356ec7f9370a1873387e9873 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 19 Feb 2020 11:00:24 +0100 Subject: [PATCH 669/777] Speed up node replacement. --- ReClass.NET/Forms/MainForm.Functions.cs | 51 ++++++++++++++++--------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 28f1f7c0..9fad2852 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -292,38 +292,47 @@ public void ReplaceSelectedNodesWithType(Type type) var hotSpotPartitions = selectedNodes .WhereNot(s => s.Node is ClassNode) .GroupBy(s => s.Node.GetParentContainer()) - .SelectMany(g => g - .OrderBy(s => s.Node.Offset) - .GroupWhile((h1, h2) => h1.Node.Offset + h1.Node.MemorySize == h2.Node.Offset) - ); + .Select(g => new + { + Container = g.Key, + Partitions = g.OrderBy(s => s.Node.Offset) + .GroupWhile((s1, s2) => s1.Node.Offset + s1.Node.MemorySize == s2.Node.Offset) + }); - foreach (var selectedPartition in hotSpotPartitions) + foreach (var containerPartitions in hotSpotPartitions) { - var hotSpotsToReplace = new Queue(selectedPartition); - while (hotSpotsToReplace.Count > 0) + containerPartitions.Container.BeginUpdate(); + + foreach (var partition in containerPartitions.Partitions) { - var selected = hotSpotsToReplace.Dequeue(); + var hotSpotsToReplace = new Queue(partition); + while (hotSpotsToReplace.Count > 0) + { + var selected = hotSpotsToReplace.Dequeue(); - var node = BaseNode.CreateInstanceFromType(type); + var node = BaseNode.CreateInstanceFromType(type); - var createdNodes = new List(); - selected.Node.GetParentContainer().ReplaceChildNode(selected.Node, node, ref createdNodes); + var createdNodes = new List(); + containerPartitions.Container.ReplaceChildNode(selected.Node, node, ref createdNodes); - node.IsSelected = true; + node.IsSelected = true; - var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Process, selected.Memory, selected.Address, selected.Level); + var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Process, selected.Memory, selected.Address, selected.Level); - newSelected.Add(info); + newSelected.Add(info); - // If more than one node is selected I assume the user wants to replace the complete range with the desired node type. - if (selectedNodes.Count > 1) - { - foreach (var createdNode in createdNodes) + // If more than one node is selected I assume the user wants to replace the complete range with the desired node type. + if (selectedNodes.Count > 1) { - hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Process, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level)); + foreach (var createdNode in createdNodes) + { + hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Process, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level)); + } } } } + + containerPartitions.Container.EndUpdate(); } memoryViewControl.ClearSelection(); @@ -373,6 +382,8 @@ private void PasteNodeFromClipboardToSelection() var classNode = selectedNode.GetParentClass(); if (containerNode != null && classNode != null) { + containerNode.BeginUpdate(); + foreach (var node in result.Item2) { if (node is BaseWrapperNode) @@ -394,6 +405,8 @@ private void PasteNodeFromClipboardToSelection() containerNode.InsertNode(selectedNode, node); } + + containerNode.EndUpdate(); } } } From 98141f2daff5163ffe6c95b6683067ca244ed789 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 19 Feb 2020 14:24:22 +0100 Subject: [PATCH 670/777] Fixed scrollbar not working in huge classes because of 16bit value. (#148) --- ReClass.NET/UI/ScrollableCustomControl.cs | 54 ++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/ReClass.NET/UI/ScrollableCustomControl.cs b/ReClass.NET/UI/ScrollableCustomControl.cs index ce254b83..4de6a4de 100644 --- a/ReClass.NET/UI/ScrollableCustomControl.cs +++ b/ReClass.NET/UI/ScrollableCustomControl.cs @@ -1,11 +1,35 @@ using System; using System.Diagnostics.Contracts; +using System.Runtime.InteropServices; using System.Windows.Forms; namespace ReClassNET.UI { public class ScrollableCustomControl : UserControl { + private const int WM_HSCROLL = 0x114; + private const int WM_VSCROLL = 0x115; + private const int SBS_HORZ = 0x0000; + private const int SBS_VERT = 0x0001; + private const int SIF_ALL = 0x0001 | 0x0002 | 0x0004 | 0x0010; + + [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + private static extern bool GetScrollInfo(HandleRef hWnd, int fnBar, SCROLLINFO si); + + [StructLayout(LayoutKind.Sequential)] + private class SCROLLINFO + { + public int cbSize = Marshal.SizeOf(typeof(SCROLLINFO)); + public int fMask = SIF_ALL; + public int nMin; + public int nMax; + public int nPage; + public int nPos; + public int nTrackPos; + } + + private readonly SCROLLINFO scrollinfo = new SCROLLINFO(); + public ScrollableCustomControl() { VScroll = true; @@ -49,7 +73,7 @@ protected override void OnMouseWheel(MouseEventArgs e) private const int SB_BOTTOM = 7; private const int SB_ENDSCROLL = 8; - private ScrollEventType WParamToScrollEventType(IntPtr wParam) + private static ScrollEventType WParamToScrollEventType(IntPtr wParam) { switch (LoWord((int)wParam)) { @@ -76,9 +100,6 @@ private ScrollEventType WParamToScrollEventType(IntPtr wParam) } } - private const int WM_HSCROLL = 0x114; - private const int WM_VSCROLL = 0x115; - private void SetValue(ScrollEventType type, ScrollProperties scrollProperties, int newValue) { Contract.Requires(scrollProperties != null); @@ -163,9 +184,20 @@ public void DoScroll(ScrollOrientation orientation, int amount) SetValue(ScrollEventType.ThumbPosition, scrollProperties, scrollProperties.Value + amount); } - private void ProcessMessage(ref Message msg, ScrollProperties scrollProperties) + private void ProcessMessage(ref Message msg) { - Contract.Requires(scrollProperties != null); + ScrollProperties scrollProperties; + int bar; + if (msg.Msg == WM_VSCROLL) + { + scrollProperties = VerticalScroll; + bar = SBS_VERT; + } + else + { + scrollProperties = HorizontalScroll; + bar = SBS_HORZ; + } var type = WParamToScrollEventType(msg.WParam); switch (type) @@ -180,7 +212,11 @@ private void ProcessMessage(ref Message msg, ScrollProperties scrollProperties) break; case ScrollEventType.ThumbTrack: case ScrollEventType.ThumbPosition: - SetValue(type, scrollProperties, HiWord((int)msg.WParam)); + + if (GetScrollInfo(new HandleRef(this, Handle), bar, scrollinfo)) + { + SetValue(type, scrollProperties, scrollinfo.nTrackPos); + } break; } } @@ -198,7 +234,7 @@ protected override void WndProc(ref Message msg) break; } - ProcessMessage(ref msg, msg.Msg == WM_VSCROLL ? VerticalScroll : (ScrollProperties)HorizontalScroll); + ProcessMessage(ref msg); return; } @@ -207,8 +243,6 @@ protected override void WndProc(ref Message msg) base.WndProc(ref msg); } - static int HiWord(int number) => (number >> 16) & 0xffff; - static int LoWord(int number) => number & 0xffff; } } From d53fc959e617dbbad5b39ad883a2abbc39afcddf Mon Sep 17 00:00:00 2001 From: namazso Date: Wed, 18 Mar 2020 22:30:23 +0100 Subject: [PATCH 671/777] fix broken code - how did this work --- NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index ab9fa8e8..8c3f6feb 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -50,7 +50,7 @@ static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) return error; PPEB_LDR_DATA ldr; - auto success = ReadRemoteMemory(process, ppeb->Ldr, &ldr, 0, sizeof(ldr)); + auto success = ReadRemoteMemory(process, &ppeb->Ldr, &ldr, 0, sizeof(ldr)); if (!success) return ERROR_READ_FAULT; // we seem to swallow the error anyways, might aswell give a distinctive one back From 97cda277aa311d3f0b88f5d04cfeb1d9661bc509 Mon Sep 17 00:00:00 2001 From: Dr_P3pp3r Date: Sat, 11 Apr 2020 03:27:54 +0200 Subject: [PATCH 672/777] Add memory type checkboxes into memory scanner gui. --- ReClass.NET/Forms/ScannerForm.Designer.cs | 127 +++++++++++++++------- ReClass.NET/Forms/ScannerForm.cs | 10 +- 2 files changed, 93 insertions(+), 44 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs index bbd88cb9..ccde5411 100644 --- a/ReClass.NET/Forms/ScannerForm.Designer.cs +++ b/ReClass.NET/Forms/ScannerForm.Designer.cs @@ -43,6 +43,9 @@ private void InitializeComponent() this.scanCopyOnWriteCheckBox = new System.Windows.Forms.CheckBox(); this.scanExecutableCheckBox = new System.Windows.Forms.CheckBox(); this.scanWritableCheckBox = new System.Windows.Forms.CheckBox(); + this.scanMappedCheckBox = new System.Windows.Forms.CheckBox(); + this.scanImageCheckBox = new System.Windows.Forms.CheckBox(); + this.scanPrivateCheckBox = new System.Windows.Forms.CheckBox(); this.stopAddressTextBox = new System.Windows.Forms.TextBox(); this.label4 = new System.Windows.Forms.Label(); this.startAddressTextBox = new System.Windows.Forms.TextBox(); @@ -191,6 +194,9 @@ private void InitializeComponent() this.scanOptionsGroupBox.Controls.Add(this.scanCopyOnWriteCheckBox); this.scanOptionsGroupBox.Controls.Add(this.scanExecutableCheckBox); this.scanOptionsGroupBox.Controls.Add(this.scanWritableCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanMappedCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanImageCheckBox); + this.scanOptionsGroupBox.Controls.Add(this.scanPrivateCheckBox); this.scanOptionsGroupBox.Controls.Add(this.stopAddressTextBox); this.scanOptionsGroupBox.Controls.Add(this.label4); this.scanOptionsGroupBox.Controls.Add(this.startAddressTextBox); @@ -198,37 +204,37 @@ private void InitializeComponent() this.scanOptionsGroupBox.Location = new System.Drawing.Point(3, 239); this.scanOptionsGroupBox.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3); this.scanOptionsGroupBox.Name = "scanOptionsGroupBox"; - this.scanOptionsGroupBox.Size = new System.Drawing.Size(308, 120); + this.scanOptionsGroupBox.Size = new System.Drawing.Size(308, 141); this.scanOptionsGroupBox.TabIndex = 9; this.scanOptionsGroupBox.TabStop = false; this.scanOptionsGroupBox.Text = "Scan Options"; // // fastScanAlignmentTextBox // - this.fastScanAlignmentTextBox.Location = new System.Drawing.Point(133, 91); + this.fastScanAlignmentTextBox.Location = new System.Drawing.Point(144, 112); this.fastScanAlignmentTextBox.Name = "fastScanAlignmentTextBox"; this.fastScanAlignmentTextBox.Size = new System.Drawing.Size(26, 20); - this.fastScanAlignmentTextBox.TabIndex = 9; + this.fastScanAlignmentTextBox.TabIndex = 11; // // fastScanCheckBox // this.fastScanCheckBox.AutoSize = true; this.fastScanCheckBox.Checked = true; this.fastScanCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.fastScanCheckBox.Location = new System.Drawing.Point(9, 93); + this.fastScanCheckBox.Location = new System.Drawing.Point(9, 114); this.fastScanCheckBox.Name = "fastScanCheckBox"; this.fastScanCheckBox.Size = new System.Drawing.Size(129, 17); - this.fastScanCheckBox.TabIndex = 8; + this.fastScanCheckBox.TabIndex = 10; this.fastScanCheckBox.Text = "Fast Scan, Alignment:"; this.fastScanCheckBox.UseVisualStyleBackColor = true; // // scanCopyOnWriteCheckBox // this.scanCopyOnWriteCheckBox.AutoSize = true; - this.scanCopyOnWriteCheckBox.Location = new System.Drawing.Point(189, 68); + this.scanCopyOnWriteCheckBox.Location = new System.Drawing.Point(189, 91); this.scanCopyOnWriteCheckBox.Name = "scanCopyOnWriteCheckBox"; this.scanCopyOnWriteCheckBox.Size = new System.Drawing.Size(95, 17); - this.scanCopyOnWriteCheckBox.TabIndex = 7; + this.scanCopyOnWriteCheckBox.TabIndex = 9; this.scanCopyOnWriteCheckBox.Text = "Copy On Write"; this.scanCopyOnWriteCheckBox.ThreeState = true; this.scanCopyOnWriteCheckBox.UseVisualStyleBackColor = true; @@ -238,10 +244,10 @@ private void InitializeComponent() this.scanExecutableCheckBox.AutoSize = true; this.scanExecutableCheckBox.Checked = true; this.scanExecutableCheckBox.CheckState = System.Windows.Forms.CheckState.Indeterminate; - this.scanExecutableCheckBox.Location = new System.Drawing.Point(91, 68); + this.scanExecutableCheckBox.Location = new System.Drawing.Point(91, 91); this.scanExecutableCheckBox.Name = "scanExecutableCheckBox"; this.scanExecutableCheckBox.Size = new System.Drawing.Size(79, 17); - this.scanExecutableCheckBox.TabIndex = 6; + this.scanExecutableCheckBox.TabIndex = 8; this.scanExecutableCheckBox.Text = "Executable"; this.scanExecutableCheckBox.ThreeState = true; this.scanExecutableCheckBox.UseVisualStyleBackColor = true; @@ -251,14 +257,48 @@ private void InitializeComponent() this.scanWritableCheckBox.AutoSize = true; this.scanWritableCheckBox.Checked = true; this.scanWritableCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.scanWritableCheckBox.Location = new System.Drawing.Point(9, 68); + this.scanWritableCheckBox.Location = new System.Drawing.Point(9, 91); this.scanWritableCheckBox.Name = "scanWritableCheckBox"; this.scanWritableCheckBox.Size = new System.Drawing.Size(65, 17); - this.scanWritableCheckBox.TabIndex = 5; + this.scanWritableCheckBox.TabIndex = 7; this.scanWritableCheckBox.Text = "Writable"; this.scanWritableCheckBox.ThreeState = true; this.scanWritableCheckBox.UseVisualStyleBackColor = true; // + // scanMappedCheckBox + // + this.scanMappedCheckBox.AutoSize = true; + this.scanMappedCheckBox.Location = new System.Drawing.Point(189, 68); + this.scanMappedCheckBox.Name = "scanMappedCheckBox"; + this.scanMappedCheckBox.Size = new System.Drawing.Size(65, 17); + this.scanMappedCheckBox.TabIndex = 6; + this.scanMappedCheckBox.Text = "Mapped"; + this.scanMappedCheckBox.UseVisualStyleBackColor = true; + // + // scanImageCheckBox + // + this.scanImageCheckBox.AutoSize = true; + this.scanImageCheckBox.Checked = true; + this.scanImageCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.scanImageCheckBox.Location = new System.Drawing.Point(91, 68); + this.scanImageCheckBox.Name = "scanImageCheckBox"; + this.scanImageCheckBox.Size = new System.Drawing.Size(55, 17); + this.scanImageCheckBox.TabIndex = 5; + this.scanImageCheckBox.Text = "Image"; + this.scanImageCheckBox.UseVisualStyleBackColor = true; + // + // scanPrivateCheckBox + // + this.scanPrivateCheckBox.AutoSize = true; + this.scanPrivateCheckBox.Checked = true; + this.scanPrivateCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.scanPrivateCheckBox.Location = new System.Drawing.Point(9, 68); + this.scanPrivateCheckBox.Name = "scanPrivateCheckBox"; + this.scanPrivateCheckBox.Size = new System.Drawing.Size(59, 17); + this.scanPrivateCheckBox.TabIndex = 4; + this.scanPrivateCheckBox.Text = "Private"; + this.scanPrivateCheckBox.UseVisualStyleBackColor = true; + // // stopAddressTextBox // this.stopAddressTextBox.Location = new System.Drawing.Point(66, 42); @@ -302,7 +342,7 @@ private void InitializeComponent() this.flowLayoutPanel.Location = new System.Drawing.Point(292, 80); this.flowLayoutPanel.Margin = new System.Windows.Forms.Padding(0); this.flowLayoutPanel.Name = "flowLayoutPanel"; - this.flowLayoutPanel.Size = new System.Drawing.Size(317, 294); + this.flowLayoutPanel.Size = new System.Drawing.Size(317, 314); this.flowLayoutPanel.TabIndex = 9; this.flowLayoutPanel.WrapContents = false; // @@ -461,8 +501,8 @@ private void InitializeComponent() // // resultMemoryRecordList // - this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.resultMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; this.resultMemoryRecordList.Location = new System.Drawing.Point(11, 80); this.resultMemoryRecordList.Name = "resultMemoryRecordList"; @@ -471,24 +511,24 @@ private void InitializeComponent() this.resultMemoryRecordList.ShowPreviousValueColumn = true; this.resultMemoryRecordList.ShowValueColumn = true; this.resultMemoryRecordList.ShowValueTypeColumn = false; - this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 292); + this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 314); this.resultMemoryRecordList.TabIndex = 16; this.resultMemoryRecordList.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // // resultListContextMenuStrip // this.resultListContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addSelectedResultsToAddressListToolStripMenuItem, - this.removeSelectedRecordsToolStripMenuItem, - this.changeToolStripMenuItem, - this.toolStripSeparator2, - this.setCurrentClassAddressToolStripMenuItem, - this.createClassAtAddressToolStripMenuItem, - this.toolStripSeparator3, - this.findOutWhatAccessesThisAddressToolStripMenuItem, - this.findOutWhatWritesToThisAddressToolStripMenuItem, - this.toolStripSeparator4, - this.copyAddressToolStripMenuItem}); + this.addSelectedResultsToAddressListToolStripMenuItem, + this.removeSelectedRecordsToolStripMenuItem, + this.changeToolStripMenuItem, + this.toolStripSeparator2, + this.setCurrentClassAddressToolStripMenuItem, + this.createClassAtAddressToolStripMenuItem, + this.toolStripSeparator3, + this.findOutWhatAccessesThisAddressToolStripMenuItem, + this.findOutWhatWritesToThisAddressToolStripMenuItem, + this.toolStripSeparator4, + this.copyAddressToolStripMenuItem}); this.resultListContextMenuStrip.Name = "resultListContextMenuStrip"; this.resultListContextMenuStrip.Size = new System.Drawing.Size(270, 198); this.resultListContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.resultListContextMenuStrip_Opening); @@ -512,10 +552,10 @@ private void InitializeComponent() // changeToolStripMenuItem // this.changeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.descriptionToolStripMenuItem, - this.addressToolStripMenuItem, - this.valueTypeToolStripMenuItem, - this.valueToolStripMenuItem}); + this.descriptionToolStripMenuItem, + this.addressToolStripMenuItem, + this.valueTypeToolStripMenuItem, + this.valueToolStripMenuItem}); this.changeToolStripMenuItem.Enabled = false; this.changeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Textfield_Rename; this.changeToolStripMenuItem.Name = "changeToolStripMenuItem"; @@ -603,11 +643,11 @@ private void InitializeComponent() // // addressListMemoryRecordList // - this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.addressListMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; - this.addressListMemoryRecordList.Location = new System.Drawing.Point(11, 402); + this.addressListMemoryRecordList.Location = new System.Drawing.Point(11, 425); this.addressListMemoryRecordList.Name = "addressListMemoryRecordList"; this.addressListMemoryRecordList.ShowAddressColumn = true; this.addressListMemoryRecordList.ShowDescriptionColumn = true; @@ -620,7 +660,7 @@ private void InitializeComponent() // toolStripPanel // this.toolStripPanel.Controls.Add(this.menuToolStrip); - this.toolStripPanel.Location = new System.Drawing.Point(11, 375); + this.toolStripPanel.Location = new System.Drawing.Point(11, 397); this.toolStripPanel.Name = "toolStripPanel"; this.toolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal; this.toolStripPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; @@ -632,11 +672,11 @@ private void InitializeComponent() this.menuToolStrip.Dock = System.Windows.Forms.DockStyle.None; this.menuToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.openAddressFileToolStripButton, - this.saveAddressFileToolStripButton, - this.saveAddressFileAsToolStripButton, - this.toolStripSeparator1, - this.clearAddressListToolStripButton}); + this.openAddressFileToolStripButton, + this.saveAddressFileToolStripButton, + this.saveAddressFileAsToolStripButton, + this.toolStripSeparator1, + this.clearAddressListToolStripButton}); this.menuToolStrip.Location = new System.Drawing.Point(0, 0); this.menuToolStrip.Name = "menuToolStrip"; this.menuToolStrip.Size = new System.Drawing.Size(101, 25); @@ -707,7 +747,7 @@ private void InitializeComponent() // this.showInputCorrelatorIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.showInputCorrelatorIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Canvas_Size; - this.showInputCorrelatorIconButton.Location = new System.Drawing.Point(580, 378); + this.showInputCorrelatorIconButton.Location = new System.Drawing.Point(580, 398); this.showInputCorrelatorIconButton.Name = "showInputCorrelatorIconButton"; this.showInputCorrelatorIconButton.Pressed = false; this.showInputCorrelatorIconButton.Selected = false; @@ -731,7 +771,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(612, 584); + this.ClientSize = new System.Drawing.Size(612, 607); this.Controls.Add(this.cancelScanIconButton); this.Controls.Add(this.showInputCorrelatorIconButton); this.Controls.Add(this.undoIconButton); @@ -785,6 +825,9 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox scanCopyOnWriteCheckBox; private System.Windows.Forms.CheckBox scanExecutableCheckBox; private System.Windows.Forms.CheckBox scanWritableCheckBox; + private System.Windows.Forms.CheckBox scanMappedCheckBox; + private System.Windows.Forms.CheckBox scanImageCheckBox; + private System.Windows.Forms.CheckBox scanPrivateCheckBox; private System.Windows.Forms.TextBox stopAddressTextBox; private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox startAddressTextBox; diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 7427974e..3aaed815 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -675,6 +675,9 @@ SettingState CheckStateToSettingState(CheckState state) } } + settings.ScanPrivateMemory = scanPrivateCheckBox.Checked; + settings.ScanImageMemory = scanImageCheckBox.Checked; + settings.ScanMappedMemory = scanMappedCheckBox.Checked; settings.ScanWritableMemory = CheckStateToSettingState(scanWritableCheckBox.CheckState); settings.ScanExecutableMemory = CheckStateToSettingState(scanExecutableCheckBox.CheckState); settings.ScanCopyOnWriteMemory = CheckStateToSettingState(scanCopyOnWriteCheckBox.CheckState); @@ -697,7 +700,7 @@ private void SetGuiFromSettings(ScanSettings settings) fastScanCheckBox.Checked = settings.EnableFastScan; fastScanAlignmentTextBox.Text = Math.Max(1, settings.FastScanAlignment).ToString(); - + CheckState SettingStateToCheckState(SettingState state) { switch (state) @@ -711,6 +714,9 @@ CheckState SettingStateToCheckState(SettingState state) } } + scanPrivateCheckBox.Checked = settings.ScanPrivateMemory; + scanImageCheckBox.Checked = settings.ScanImageMemory; + scanMappedCheckBox.Checked = settings.ScanMappedMemory; scanWritableCheckBox.CheckState = SettingStateToCheckState(settings.ScanWritableMemory); scanExecutableCheckBox.CheckState = SettingStateToCheckState(settings.ScanExecutableMemory); scanCopyOnWriteCheckBox.CheckState = SettingStateToCheckState(settings.ScanCopyOnWriteMemory); @@ -865,7 +871,7 @@ internal class InvalidInputException : Exception public InvalidInputException(string input) : base($"'{input}' is not a valid input.") { - + } } } From b8625dcb8c57805a5cb095c35f97b29710a53ccf Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 5 May 2020 11:33:55 +0200 Subject: [PATCH 673/777] Fixed merge error. --- .../EnumerateRemoteSectionsAndModules.cpp | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index a4ec301e..38413e0d 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -193,32 +193,31 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate for (auto j = it; j != std::end(sections); ++j) { if (sectionAddress >= reinterpret_cast(j->BaseAddress) - && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size) - && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= me32.modBaseSize ) - { - if ((sectionHeader.Characteristics & IMAGE_SCN_CNT_CODE) == IMAGE_SCN_CNT_CODE) - { - j->Category = SectionCategory::CODE; - } - else if (sectionHeader.Characteristics & (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_DATA)) - { - j->Category = SectionCategory::DATA; - } - - try { - // Copy the name because it is not null padded. - char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; - std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); - MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); - } catch (std::range_error &) { - std::memset(j->Name, 0, sizeof j->Name); - } - std::memcpy(j->ModulePath, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); - - break; - } + && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size) + && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= data->Size) + { + if ((sectionHeader.Characteristics & IMAGE_SCN_CNT_CODE) == IMAGE_SCN_CNT_CODE) + { + j->Category = SectionCategory::CODE; + } + else if (sectionHeader.Characteristics & (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_DATA)) + { + j->Category = SectionCategory::DATA; + } + + try { + // Copy the name because it is not null padded. + char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; + std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); + MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); + } catch (std::range_error &) { + std::memset(j->Name, 0, sizeof j->Name); + } + std::memcpy(j->ModulePath, data->Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); + + break; + } } - } } }; From 406a7ce28f4825005bf6593da9b902a1ffa62f96 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 5 May 2020 11:53:06 +0200 Subject: [PATCH 674/777] Restructured code (1/4) --- .../EnumerateRemoteSectionsAndModules.cpp | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 38413e0d..61f6bef8 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -160,7 +160,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate section.Category = section.Type == SectionType::Private ? SectionCategory::HEAP : SectionCategory::Unknown; - sections.push_back(std::move(section)); + sections.push_back(section); } address = reinterpret_cast(memInfo.BaseAddress) + memInfo.RegionSize; } @@ -168,52 +168,61 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate const auto moduleEnumerator = [&](EnumerateRemoteModuleData* data) { if (callbackModule != nullptr) + { callbackModule(data); + } if (callbackSection != nullptr) { auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(data->BaseAddress), [§ions](const auto& lhs, const LPVOID& rhs) - { - return lhs.BaseAddress < rhs; - }); - - IMAGE_DOS_HEADER DosHdr = {}; - IMAGE_NT_HEADERS NtHdr = {}; + { + return lhs.BaseAddress < rhs; + }); - ReadRemoteMemory(process, data->BaseAddress, &DosHdr, 0, sizeof(IMAGE_DOS_HEADER)); - ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + DosHdr.e_lfanew, &NtHdr, 0, sizeof(IMAGE_NT_HEADERS)); + IMAGE_DOS_HEADER imageDosHeader = {}; + IMAGE_NT_HEADERS imageNtHeaders = {}; - std::vector sectionHeaders(NtHdr.FileHeader.NumberOfSections); - ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + DosHdr.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, NtHdr.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); - for (auto i = 0; i < NtHdr.FileHeader.NumberOfSections; ++i) + if (!ReadRemoteMemory(process, data->BaseAddress, &imageDosHeader, 0, sizeof(IMAGE_DOS_HEADER)) + || !ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + imageDosHeader.e_lfanew, &imageNtHeaders, 0, sizeof(IMAGE_NT_HEADERS))) { - auto&& sectionHeader = sectionHeaders[i]; + return; + } + std::vector sectionHeaders(imageNtHeaders.FileHeader.NumberOfSections); + ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + imageDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, imageNtHeaders.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); + for (auto&& sectionHeader : sectionHeaders) + { const auto sectionAddress = reinterpret_cast(data->BaseAddress) + sectionHeader.VirtualAddress; - for (auto j = it; j != std::end(sections); ++j) + + for (; it != std::end(sections); ++it) { - if (sectionAddress >= reinterpret_cast(j->BaseAddress) - && sectionAddress < reinterpret_cast(j->BaseAddress) + static_cast(j->Size) + auto&& section = *it; + + if (sectionAddress >= reinterpret_cast(section.BaseAddress) + && sectionAddress < reinterpret_cast(section.BaseAddress) + static_cast(section.Size) && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= data->Size) { if ((sectionHeader.Characteristics & IMAGE_SCN_CNT_CODE) == IMAGE_SCN_CNT_CODE) { - j->Category = SectionCategory::CODE; + section.Category = SectionCategory::CODE; } else if (sectionHeader.Characteristics & (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_CNT_UNINITIALIZED_DATA)) { - j->Category = SectionCategory::DATA; + section.Category = SectionCategory::DATA; } - try { + try + { // Copy the name because it is not null padded. char buffer[IMAGE_SIZEOF_SHORT_NAME + 1] = { 0 }; std::memcpy(buffer, sectionHeader.Name, IMAGE_SIZEOF_SHORT_NAME); - MultiByteToUnicode(buffer, j->Name, IMAGE_SIZEOF_SHORT_NAME); - } catch (std::range_error &) { - std::memset(j->Name, 0, sizeof j->Name); + MultiByteToUnicode(buffer, section.Name, IMAGE_SIZEOF_SHORT_NAME); + } + catch (std::range_error &) + { + std::memset(section.Name, 0, sizeof(section.Name)); } - std::memcpy(j->ModulePath, data->Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); + std::memcpy(section.ModulePath, data->Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); break; } @@ -222,8 +231,10 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate } }; - if(EnumerateRemoteModulesNative(process, moduleEnumerator) != ERROR_SUCCESS) + if (EnumerateRemoteModulesNative(process, moduleEnumerator) != ERROR_SUCCESS) + { EnumerateRemoteModulesWinapi(process, moduleEnumerator); + } if (callbackSection != nullptr) { From bbf580a16d2e8a476907d4084a54e474272173ad Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 5 May 2020 12:07:52 +0200 Subject: [PATCH 675/777] Restructured code (2/4) --- .../EnumerateRemoteSectionsAndModules.cpp | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 61f6bef8..a5b15b79 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "NativeCore.hpp" @@ -41,24 +42,25 @@ static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) return ERROR_SUCCESS; } -template -static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) +using InternalEnumerateRemoteModulesCallback = std::function; + +static bool EnumerateRemoteModulesNative(HANDLE process, const InternalEnumerateRemoteModulesCallback& callback) { PPEB ppeb; const auto error = GetRemotePeb(process, &ppeb); if (error != ERROR_SUCCESS) - return error; + return false; PPEB_LDR_DATA ldr; auto success = ReadRemoteMemory(process, &ppeb->Ldr, &ldr, 0, sizeof(ldr)); if (!success) - return ERROR_READ_FAULT; // we seem to swallow the error anyways, might aswell give a distinctive one back + return false; const auto list_head = &ldr->InMemoryOrderModuleList; // remote address PLIST_ENTRY list_current; // remote address success = ReadRemoteMemory(process, &list_head->Flink, &list_current, 0, sizeof(list_current)); if (!success) - return ERROR_READ_FAULT; + return false; while (list_current != list_head) { @@ -67,7 +69,7 @@ static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) LDR_DATA_TABLE_ENTRY mod; success = ReadRemoteMemory(process, CONTAINING_RECORD(list_current, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks), &mod, 0, sizeof(mod)); if (!success) - return ERROR_SUCCESS; // return success here to prevent running the other one + break; EnumerateRemoteModuleData data = {}; data.BaseAddress = mod.DllBase; @@ -75,25 +77,26 @@ static DWORD EnumerateRemoteModulesNative(HANDLE process, Proc proc) const auto path_len = std::min(sizeof(RC_UnicodeChar) * (PATH_MAXIMUM_LENGTH - 1), size_t(mod.FullDllName.Length)); success = ReadRemoteMemory(process, mod.FullDllName.Buffer, data.Path, 0, int(path_len)); if (!success) - return ERROR_SUCCESS; // return success here to prevent running the other one + break; // UNICODE_STRING is not guaranteed to be null terminated data.Path[path_len / 2] = 0; - proc(&data); + callback(data); list_current = mod.InMemoryOrderLinks.Flink; } - return ERROR_SUCCESS; + return true; } -template -static DWORD EnumerateRemoteModulesWinapi(HANDLE process, Proc proc) +bool EnumerateRemoteModulesWinapi(HANDLE process, const InternalEnumerateRemoteModulesCallback& callback) { const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); if (handle == INVALID_HANDLE_VALUE) - return GetLastError(); + { + return false; + } MODULEENTRY32W me32 = {}; me32.dwSize = sizeof(MODULEENTRY32W); @@ -106,13 +109,13 @@ static DWORD EnumerateRemoteModulesWinapi(HANDLE process, Proc proc) data.Size = me32.modBaseSize; std::memcpy(data.Path, me32.szExePath, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); - proc(&data); + callback(data); } while (Module32NextW(handle, &me32)); } CloseHandle(handle); - return ERROR_SUCCESS; + return true; } void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, EnumerateRemoteSectionsCallback callbackSection, EnumerateRemoteModulesCallback callbackModule) @@ -165,16 +168,16 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate address = reinterpret_cast(memInfo.BaseAddress) + memInfo.RegionSize; } - const auto moduleEnumerator = [&](EnumerateRemoteModuleData* data) + const auto moduleEnumerator = [&](EnumerateRemoteModuleData& data) { if (callbackModule != nullptr) { - callbackModule(data); + callbackModule(&data); } if (callbackSection != nullptr) { - auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(data->BaseAddress), [§ions](const auto& lhs, const LPVOID& rhs) + auto it = std::lower_bound(std::begin(sections), std::end(sections), static_cast(data.BaseAddress), [§ions](const auto& lhs, const LPVOID& rhs) { return lhs.BaseAddress < rhs; }); @@ -182,17 +185,17 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate IMAGE_DOS_HEADER imageDosHeader = {}; IMAGE_NT_HEADERS imageNtHeaders = {}; - if (!ReadRemoteMemory(process, data->BaseAddress, &imageDosHeader, 0, sizeof(IMAGE_DOS_HEADER)) - || !ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + imageDosHeader.e_lfanew, &imageNtHeaders, 0, sizeof(IMAGE_NT_HEADERS))) + if (!ReadRemoteMemory(process, data.BaseAddress, &imageDosHeader, 0, sizeof(IMAGE_DOS_HEADER)) + || !ReadRemoteMemory(process, PUCHAR(data.BaseAddress) + imageDosHeader.e_lfanew, &imageNtHeaders, 0, sizeof(IMAGE_NT_HEADERS))) { return; } std::vector sectionHeaders(imageNtHeaders.FileHeader.NumberOfSections); - ReadRemoteMemory(process, PUCHAR(data->BaseAddress) + imageDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, imageNtHeaders.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); + ReadRemoteMemory(process, PUCHAR(data.BaseAddress) + imageDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS), sectionHeaders.data(), 0, imageNtHeaders.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)); for (auto&& sectionHeader : sectionHeaders) { - const auto sectionAddress = reinterpret_cast(data->BaseAddress) + sectionHeader.VirtualAddress; + const auto sectionAddress = reinterpret_cast(data.BaseAddress) + sectionHeader.VirtualAddress; for (; it != std::end(sections); ++it) { @@ -200,7 +203,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate if (sectionAddress >= reinterpret_cast(section.BaseAddress) && sectionAddress < reinterpret_cast(section.BaseAddress) + static_cast(section.Size) - && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= data->Size) + && sectionHeader.VirtualAddress + sectionHeader.Misc.VirtualSize <= data.Size) { if ((sectionHeader.Characteristics & IMAGE_SCN_CNT_CODE) == IMAGE_SCN_CNT_CODE) { @@ -222,7 +225,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate { std::memset(section.Name, 0, sizeof(section.Name)); } - std::memcpy(section.ModulePath, data->Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); + std::memcpy(section.ModulePath, data.Path, std::min(MAX_PATH, PATH_MAXIMUM_LENGTH)); break; } @@ -231,7 +234,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate } }; - if (EnumerateRemoteModulesNative(process, moduleEnumerator) != ERROR_SUCCESS) + if (!EnumerateRemoteModulesNative(process, moduleEnumerator)) { EnumerateRemoteModulesWinapi(process, moduleEnumerator); } From e5f78fac7f3b31b2d95ad12141f9a18e9698a7b2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 5 May 2020 12:23:34 +0200 Subject: [PATCH 676/777] Restructured code (3/4) --- .../EnumerateRemoteSectionsAndModules.cpp | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index a5b15b79..36b44160 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -44,53 +44,55 @@ static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) using InternalEnumerateRemoteModulesCallback = std::function; -static bool EnumerateRemoteModulesNative(HANDLE process, const InternalEnumerateRemoteModulesCallback& callback) +bool EnumerateRemoteModulesNative(const RC_Pointer process, const InternalEnumerateRemoteModulesCallback& callback) { PPEB ppeb; - const auto error = GetRemotePeb(process, &ppeb); - if (error != ERROR_SUCCESS) + if (GetRemotePeb(process, &ppeb) != ERROR_SUCCESS) + { return false; + } PPEB_LDR_DATA ldr; - auto success = ReadRemoteMemory(process, &ppeb->Ldr, &ldr, 0, sizeof(ldr)); - if (!success) + if (!ReadRemoteMemory(process, &ppeb->Ldr, &ldr, 0, sizeof(PPEB_LDR_DATA))) + { return false; + } - const auto list_head = &ldr->InMemoryOrderModuleList; // remote address - PLIST_ENTRY list_current; // remote address - success = ReadRemoteMemory(process, &list_head->Flink, &list_current, 0, sizeof(list_current)); - if (!success) + const auto head = &ldr->InMemoryOrderModuleList; + PLIST_ENTRY current; + if (!ReadRemoteMemory(process, &head->Flink, ¤t, 0, sizeof(PLIST_ENTRY))) + { return false; + } - while (list_current != list_head) + while (current != head) { - // TODO: error handling - what do we do if module list changed? We can't un-call the callback - - LDR_DATA_TABLE_ENTRY mod; - success = ReadRemoteMemory(process, CONTAINING_RECORD(list_current, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks), &mod, 0, sizeof(mod)); - if (!success) + LDR_DATA_TABLE_ENTRY entry; + if (!ReadRemoteMemory(process, CONTAINING_RECORD(current, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks), &entry, 0, sizeof(entry))) + { break; + } EnumerateRemoteModuleData data = {}; - data.BaseAddress = mod.DllBase; - data.Size = *(ULONG*)&mod.Reserved2[1]; // instead of undocced member could read ImageSize from headers - const auto path_len = std::min(sizeof(RC_UnicodeChar) * (PATH_MAXIMUM_LENGTH - 1), size_t(mod.FullDllName.Length)); - success = ReadRemoteMemory(process, mod.FullDllName.Buffer, data.Path, 0, int(path_len)); - if (!success) + data.BaseAddress = entry.DllBase; + data.Size = *reinterpret_cast(&entry.Reserved2[1]); // instead of undocced member could read ImageSize from headers + + const auto length = std::min(sizeof(RC_UnicodeChar) * (PATH_MAXIMUM_LENGTH - 1), entry.FullDllName.Length); + if (!ReadRemoteMemory(process, entry.FullDllName.Buffer, data.Path, 0, length)) + { break; - - // UNICODE_STRING is not guaranteed to be null terminated - data.Path[path_len / 2] = 0; + } + data.Path[length / 2] = 0; callback(data); - list_current = mod.InMemoryOrderLinks.Flink; + current = entry.InMemoryOrderLinks.Flink; } return true; } -bool EnumerateRemoteModulesWinapi(HANDLE process, const InternalEnumerateRemoteModulesCallback& callback) +bool EnumerateRemoteModulesWinapi(const RC_Pointer process, const InternalEnumerateRemoteModulesCallback& callback) { const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); if (handle == INVALID_HANDLE_VALUE) From be7455ab4c1b8adcb183e3d3b7172974c1759bfd Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 5 May 2020 12:51:13 +0200 Subject: [PATCH 677/777] Restructured code (4/4) --- .../EnumerateRemoteSectionsAndModules.cpp | 84 ++++++++----------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index 36b44160..d310a977 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -7,47 +7,37 @@ #include "NativeCore.hpp" -static DWORD GetRemotePeb(HANDLE process, PPEB* ppeb) +PPEB GetRemotePeb(const HANDLE process) { - const auto ntdll = GetModuleHandle(TEXT("ntdll")); + static auto* const ntdll = GetModuleHandle(TEXT("ntdll")); if (!ntdll) - return ERROR_MOD_NOT_FOUND; - - using tRtlNtStatusToDosError = ULONG (NTAPI *)( - _In_ NTSTATUS Status - ); - const auto pRtlNtStatusToDosError = tRtlNtStatusToDosError(GetProcAddress(ntdll, "RtlNtStatusToDosError")); - if (!pRtlNtStatusToDosError) - return ERROR_NOT_FOUND; - - using tNtQueryInformationProcess = NTSTATUS (NTAPI *)( - _In_ HANDLE ProcessHandle, - _In_ PROCESSINFOCLASS ProcessInformationClass, - _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation, - _In_ ULONG ProcessInformationLength, - _Out_opt_ PULONG ReturnLength - ); - - const auto pNtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); + { + return nullptr; + } + + using tNtQueryInformationProcess = NTSTATUS (NTAPI*)(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength); + + static const auto pNtQueryInformationProcess = tNtQueryInformationProcess(GetProcAddress(ntdll, "NtQueryInformationProcess")); if (!pNtQueryInformationProcess) - return ERROR_NOT_FOUND; + { + return nullptr; + } PROCESS_BASIC_INFORMATION pbi; - const auto status = pNtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr); - if (!NT_SUCCESS(status)) - return pRtlNtStatusToDosError(status); + if (!NT_SUCCESS(pNtQueryInformationProcess(process, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), nullptr))) + { + return nullptr; + } - *ppeb = pbi.PebBaseAddress; - - return ERROR_SUCCESS; + return pbi.PebBaseAddress; } using InternalEnumerateRemoteModulesCallback = std::function; bool EnumerateRemoteModulesNative(const RC_Pointer process, const InternalEnumerateRemoteModulesCallback& callback) { - PPEB ppeb; - if (GetRemotePeb(process, &ppeb) != ERROR_SUCCESS) + auto* const ppeb = GetRemotePeb(process); + if (ppeb == nullptr) { return false; } @@ -58,7 +48,7 @@ bool EnumerateRemoteModulesNative(const RC_Pointer process, const InternalEnumer return false; } - const auto head = &ldr->InMemoryOrderModuleList; + auto* const head = &ldr->InMemoryOrderModuleList; PLIST_ENTRY current; if (!ReadRemoteMemory(process, &head->Flink, ¤t, 0, sizeof(PLIST_ENTRY))) { @@ -94,7 +84,7 @@ bool EnumerateRemoteModulesNative(const RC_Pointer process, const InternalEnumer bool EnumerateRemoteModulesWinapi(const RC_Pointer process, const InternalEnumerateRemoteModulesCallback& callback) { - const auto handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); + auto* const handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetProcessId(process)); if (handle == INVALID_HANDLE_VALUE) { return false; @@ -129,28 +119,28 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate std::vector sections; - MEMORY_BASIC_INFORMATION memInfo = { }; - memInfo.RegionSize = 0x1000; + MEMORY_BASIC_INFORMATION memory = { }; + memory.RegionSize = 0x1000; size_t address = 0; - while (VirtualQueryEx(process, reinterpret_cast(address), &memInfo, sizeof(MEMORY_BASIC_INFORMATION)) != 0 && address + memInfo.RegionSize > address) + while (VirtualQueryEx(process, reinterpret_cast(address), &memory, sizeof(MEMORY_BASIC_INFORMATION)) != 0 && address + memory.RegionSize > address) { - if (memInfo.State == MEM_COMMIT) + if (memory.State == MEM_COMMIT) { EnumerateRemoteSectionData section = {}; - section.BaseAddress = memInfo.BaseAddress; - section.Size = memInfo.RegionSize; + section.BaseAddress = memory.BaseAddress; + section.Size = memory.RegionSize; section.Protection = SectionProtection::NoAccess; - if ((memInfo.Protect & PAGE_EXECUTE) == PAGE_EXECUTE) section.Protection |= SectionProtection::Execute; - if ((memInfo.Protect & PAGE_EXECUTE_READ) == PAGE_EXECUTE_READ) section.Protection |= SectionProtection::Execute | SectionProtection::Read; - if ((memInfo.Protect & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::Write; - if ((memInfo.Protect & PAGE_EXECUTE_WRITECOPY) == PAGE_EXECUTE_WRITECOPY) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::CopyOnWrite; - if ((memInfo.Protect & PAGE_READONLY) == PAGE_READONLY) section.Protection |= SectionProtection::Read; - if ((memInfo.Protect & PAGE_READWRITE) == PAGE_READWRITE) section.Protection |= SectionProtection::Read | SectionProtection::Write; - if ((memInfo.Protect & PAGE_WRITECOPY) == PAGE_WRITECOPY) section.Protection |= SectionProtection::Read | SectionProtection::CopyOnWrite; - if ((memInfo.Protect & PAGE_GUARD) == PAGE_GUARD) section.Protection |= SectionProtection::Guard; + if ((memory.Protect & PAGE_EXECUTE) == PAGE_EXECUTE) section.Protection |= SectionProtection::Execute; + if ((memory.Protect & PAGE_EXECUTE_READ) == PAGE_EXECUTE_READ) section.Protection |= SectionProtection::Execute | SectionProtection::Read; + if ((memory.Protect & PAGE_EXECUTE_READWRITE) == PAGE_EXECUTE_READWRITE) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::Write; + if ((memory.Protect & PAGE_EXECUTE_WRITECOPY) == PAGE_EXECUTE_WRITECOPY) section.Protection |= SectionProtection::Execute | SectionProtection::Read | SectionProtection::CopyOnWrite; + if ((memory.Protect & PAGE_READONLY) == PAGE_READONLY) section.Protection |= SectionProtection::Read; + if ((memory.Protect & PAGE_READWRITE) == PAGE_READWRITE) section.Protection |= SectionProtection::Read | SectionProtection::Write; + if ((memory.Protect & PAGE_WRITECOPY) == PAGE_WRITECOPY) section.Protection |= SectionProtection::Read | SectionProtection::CopyOnWrite; + if ((memory.Protect & PAGE_GUARD) == PAGE_GUARD) section.Protection |= SectionProtection::Guard; - switch (memInfo.Type) + switch (memory.Type) { case MEM_IMAGE: section.Type = SectionType::Image; @@ -167,7 +157,7 @@ void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer process, Enumerate sections.push_back(section); } - address = reinterpret_cast(memInfo.BaseAddress) + memInfo.RegionSize; + address = reinterpret_cast(memory.BaseAddress) + memory.RegionSize; } const auto moduleEnumerator = [&](EnumerateRemoteModuleData& data) From c0c080ebd007847789dd0f900f61f25bfb92a229 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 6 May 2020 12:04:11 +0200 Subject: [PATCH 678/777] Simplified code. --- ReClass.NET/Memory/RemoteProcess.cs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 8c65e2e2..14337cf9 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -61,12 +61,10 @@ public IEnumerable Modules { get { - List cpy; lock (modules) { - cpy = modules.ToList(); + return new List(modules); } - return cpy; } } @@ -75,12 +73,10 @@ public IEnumerable
Sections { get { - List
cpy; lock (sections) { - cpy = sections.ToList(); + return new List
(sections); } - return cpy; } } @@ -568,20 +564,20 @@ public string GetNamedAddress(IntPtr address) return null; } - public bool EnumerateRemoteSectionsAndModules(out List
sections, out List modules) + public bool EnumerateRemoteSectionsAndModules(out List
_sections, out List _modules) { if (!IsValid) { - sections = null; - modules = null; + _sections = null; + _modules = null; return false; } - sections = new List
(); - modules = new List(); + _sections = new List
(); + _modules = new List(); - coreFunctions.EnumerateRemoteSectionsAndModules(handle, sections.Add, modules.Add); + coreFunctions.EnumerateRemoteSectionsAndModules(handle, _sections.Add, _modules.Add); return true; } @@ -600,11 +596,11 @@ public Task UpdateProcessInformationsAsync() if (!IsValid) { - lock(modules) + lock (modules) { modules.Clear(); } - lock(sections) + lock (sections) { sections.Clear(); } From f8170a3237162e675b6cc99db5b8c297406d15a1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 May 2020 11:54:43 +0200 Subject: [PATCH 679/777] Fixed url protocol. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b457de8b..3ed4a224 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Memory Scanner ![](https://abload.de/img/scannerytub1.jpg) Pointer Preview -![](http://abload.de/img/memorypreview2gsfp.jpg) +![](https://abload.de/img/memorypreview2gsfp.jpg) Code Generator ![](https://abload.de/img/codegeneratorqdat2.jpg) From 6a2bdeff8d0e8c0b61cb7e11ca7a6f709464040c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 May 2020 13:18:15 +0200 Subject: [PATCH 680/777] Added editor config to force coding style. --- .editorconfig | 204 ++++++++++++++++++++++++++++++++++++++++++++++++ ReClass.NET.sln | 1 + 2 files changed, 205 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..6b2f3f66 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,204 @@ +root = true + +[*] +charset = utf-8 +trim_trailing_whitespace = true + +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = tab +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Field preferences +dotnet_style_readonly_field = true:suggestion + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = true:suggestion +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = true:suggestion +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +# Code-block preferences +csharp_prefer_braces = true:suggestion +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:error + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +# Warnings + +# CS8509: The switch expression does not handle all possible values of its input type (it is not exhaustive). +dotnet_diagnostic.CS8509.severity = none diff --git a/ReClass.NET.sln b/ReClass.NET.sln index ec68abfc..6345bb67 100644 --- a/ReClass.NET.sln +++ b/ReClass.NET.sln @@ -17,6 +17,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReClass.NET_Launcher", "ReC EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{19CF2B0F-2722-4108-8308-B628D91F7A1E}" ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig README.md = README.md EndProjectSection EndProject From 534b68461232ef8ef9eb917fc4e70456adcd70df Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 7 May 2020 13:25:03 +0200 Subject: [PATCH 681/777] Updated config. --- .editorconfig | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 6b2f3f66..e7f5fa79 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,6 +4,13 @@ root = true charset = utf-8 trim_trailing_whitespace = true +[*.{c,h,cpp,hpp}] + +# Indentation and spacing +indent_size = 4 +indent_style = tab +tab_width = 4 + [*.cs] #### Core EditorConfig Options #### @@ -198,7 +205,7 @@ dotnet_naming_style.begins_with_i.required_suffix = dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.begins_with_i.capitalization = pascal_case -# Warnings +#### Warnings #### # CS8509: The switch expression does not handle all possible values of its input type (it is not exhaustive). dotnet_diagnostic.CS8509.severity = none From 15c50631cc2c50c8d776b649dd1a0481b25f86d7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 10:16:36 +0200 Subject: [PATCH 682/777] Fixed reading wrong module size. (Fixes #161) --- NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp index d310a977..066b077b 100644 --- a/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Windows/EnumerateRemoteSectionsAndModules.cpp @@ -65,7 +65,7 @@ bool EnumerateRemoteModulesNative(const RC_Pointer process, const InternalEnumer EnumerateRemoteModuleData data = {}; data.BaseAddress = entry.DllBase; - data.Size = *reinterpret_cast(&entry.Reserved2[1]); // instead of undocced member could read ImageSize from headers + data.Size = *reinterpret_cast(&entry.Reserved3[1]); // instead of undocced member could read ImageSize from headers const auto length = std::min(sizeof(RC_UnicodeChar) * (PATH_MAXIMUM_LENGTH - 1), entry.FullDllName.Length); if (!ReadRemoteMemory(process, entry.FullDllName.Buffer, data.Path, 0, length)) From 55671436d22cda7a0675fc54449913f657f585d9 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 11:54:55 +0200 Subject: [PATCH 683/777] Code cleanup. Use using directive. Use pattern matching. Removed unneeded imports. --- .../CodeGenerator/CSharpCodeGenerator.cs | 75 +++---- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 170 +++++++------- .../DataExchange/ReClass/ReClassClipboard.cs | 28 +-- .../ReClass/ReClassNetFile.Write.cs | 128 ++++++----- .../DataExchange/Scanner/CheatEngineFile.cs | 89 ++++---- .../DataExchange/Scanner/ReClassScanFile.cs | 208 +++++++++--------- .../Debugger/RemoteDebugger.Handler.cs | 3 +- ReClass.NET/Debugger/RemoteDebugger.cs | 1 - ReClass.NET/Extensions/EncodingExtensions.cs | 17 +- ReClass.NET/Extensions/EnumerableExtension.cs | 32 ++- .../Extensions/XAttributeExtensions.cs | 2 +- ReClass.NET/Logger/BaseLogger.cs | 2 +- ReClass.NET/Logger/GuiLogger.cs | 2 +- ReClass.NET/Memory/ProcessInfo.cs | 6 +- ReClass.NET/Memory/SimplePeHeader.cs | 22 +- ReClass.NET/MemoryScanner/BytePattern.cs | 32 ++- .../MemoryScanner/InputCorrelatedScanner.cs | 25 +-- ReClass.NET/MemoryScanner/ScanResultBlock.cs | 1 - ReClass.NET/MemoryScanner/ScanResultStore.cs | 48 ++-- ReClass.NET/MemoryScanner/Scanner.cs | 49 ++--- ReClass.NET/Symbols/SymbolReader.cs | 25 +-- ReClass.NET/Symbols/SymbolStore.cs | 28 ++- 22 files changed, 466 insertions(+), 527 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 91bf5fcf..d512223c 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -43,59 +43,56 @@ public class CSharpCodeGenerator : ICodeGenerator public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { - using (var sw = new StringWriter()) + using var sw = new StringWriter(); + using var iw = new IndentedTextWriter(sw, "\t"); + + iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); + iw.WriteLine(); + iw.WriteLine("// Warning: The C# code generator doesn't support all node types!"); + iw.WriteLine(); + iw.WriteLine("using System.Runtime.InteropServices;"); + + iw.WriteLine("// optional namespace, only for vectors"); + iw.WriteLine("using System.Numerics;"); + iw.WriteLine(); + + using (var en = enums.GetEnumerator()) { - using (var iw = new IndentedTextWriter(sw, "\t")) + if (en.MoveNext()) { - iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); - iw.WriteLine(); - iw.WriteLine("// Warning: The C# code generator doesn't support all node types!"); - iw.WriteLine(); - iw.WriteLine("using System.Runtime.InteropServices;"); + WriteEnum(iw, en.Current); - iw.WriteLine("// optional namespace, only for vectors"); - iw.WriteLine("using System.Numerics;"); - iw.WriteLine(); - - using (var en = enums.GetEnumerator()) + while (en.MoveNext()) { - if (en.MoveNext()) - { - WriteEnum(iw, en.Current); + iw.WriteLine(); - while (en.MoveNext()) - { - iw.WriteLine(); + WriteEnum(iw, en.Current); + } - WriteEnum(iw, en.Current); - } + iw.WriteLine(); + } + } - iw.WriteLine(); - } - } + var classesToWrite = classes + .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. + .Distinct(); - var classesToWrite = classes - .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. - .Distinct(); + using (var en = classesToWrite.GetEnumerator()) + { + if (en.MoveNext()) + { + WriteClass(iw, en.Current, logger); - using (var en = classesToWrite.GetEnumerator()) + while (en.MoveNext()) { - if (en.MoveNext()) - { - WriteClass(iw, en.Current, logger); - - while (en.MoveNext()) - { - iw.WriteLine(); + iw.WriteLine(); - WriteClass(iw, en.Current, logger); - } - } + WriteClass(iw, en.Current, logger); } } - - return sw.ToString(); } + + return sw.ToString(); } /// diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 40510e36..41733634 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -154,76 +154,73 @@ public CppCodeGenerator(CppTypeMapping typeMapping) public string GenerateCode(IReadOnlyList classes, IReadOnlyList enums, ILogger logger) { - using (var sw = new StringWriter()) + using var sw = new StringWriter(); + using var iw = new IndentedTextWriter(sw, "\t"); + + iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); + iw.WriteLine(); + + using (var en = enums.GetEnumerator()) { - using (var iw = new IndentedTextWriter(sw, "\t")) + if (en.MoveNext()) { - iw.WriteLine($"// Created with {Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"); - iw.WriteLine(); + WriteEnum(iw, en.Current); - using (var en = enums.GetEnumerator()) + while (en.MoveNext()) { - if (en.MoveNext()) - { - WriteEnum(iw, en.Current); + iw.WriteLine(); - while (en.MoveNext()) - { - iw.WriteLine(); + WriteEnum(iw, en.Current); + } - WriteEnum(iw, en.Current); - } + iw.WriteLine(); + } + } - iw.WriteLine(); - } - } + var alreadySeen = new HashSet(); - var alreadySeen = new HashSet(); + IEnumerable GetReversedClassHierarchy(ClassNode node) + { + Contract.Requires(node != null); + Contract.Ensures(Contract.Result>() != null); - IEnumerable GetReversedClassHierarchy(ClassNode node) - { - Contract.Requires(node != null); - Contract.Ensures(Contract.Result>() != null); + if (!alreadySeen.Add(node)) + { + return Enumerable.Empty(); + } - if (!alreadySeen.Add(node)) - { - return Enumerable.Empty(); - } + var classNodes = node.Nodes + .OfType() + .Where(w => !w.IsNodePresentInChain()) // Pointers are forward declared + .Select(w => w.ResolveMostInnerNode() as ClassNode) + .Where(n => n != null); - var classNodes = node.Nodes - .OfType() - .Where(w => !w.IsNodePresentInChain()) // Pointers are forward declared - .Select(w => w.ResolveMostInnerNode() as ClassNode) - .Where(n => n != null); + return classNodes + .SelectMany(GetReversedClassHierarchy) + .Append(node); + } - return classNodes - .SelectMany(GetReversedClassHierarchy) - .Append(node); - } + var classesToWrite = classes + .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. + .SelectMany(GetReversedClassHierarchy) // Order the classes by their use hierarchy. + .Distinct(); - var classesToWrite = classes - .Where(c => c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. - .SelectMany(GetReversedClassHierarchy) // Order the classes by their use hierarchy. - .Distinct(); + using (var en = classesToWrite.GetEnumerator()) + { + if (en.MoveNext()) + { + WriteClass(iw, en.Current, classes, logger); - using (var en = classesToWrite.GetEnumerator()) + while (en.MoveNext()) { - if (en.MoveNext()) - { - WriteClass(iw, en.Current, classes, logger); - - while (en.MoveNext()) - { - iw.WriteLine(); + iw.WriteLine(); - WriteClass(iw, en.Current, classes, logger); - } - } + WriteClass(iw, en.Current, classes, logger); } } - - return sw.ToString(); } + + return sw.ToString(); } /// @@ -366,7 +363,7 @@ private void WriteNodes(IndentedTextWriter writer, IEnumerable nodes, var fill = 0; var fillStart = 0; - BaseNode CreatePaddingMember(int offset, int count) + static BaseNode CreatePaddingMember(int offset, int count) { var node = new ArrayNode { @@ -496,7 +493,7 @@ private static BaseNode TransformNode(BaseNode node) return custom.TransformNode(node); } - BaseNode GetCharacterNodeForEncoding(Encoding encoding) + static BaseNode GetCharacterNodeForEncoding(Encoding encoding) { if (encoding.IsSameCodePage(Encoding.Unicode)) { @@ -509,35 +506,35 @@ BaseNode GetCharacterNodeForEncoding(Encoding encoding) return new Utf8CharacterNode(); } - if (node is BaseTextNode textNode) - { - var arrayNode = new ArrayNode { Count = textNode.Length }; - arrayNode.CopyFromNode(node); - arrayNode.ChangeInnerNode(GetCharacterNodeForEncoding(textNode.Encoding)); - return arrayNode; - } - - if (node is BaseTextPtrNode textPtrNode) - { - var pointerNode = new PointerNode(); - pointerNode.CopyFromNode(node); - pointerNode.ChangeInnerNode(GetCharacterNodeForEncoding(textPtrNode.Encoding)); - return pointerNode; - } - - if (node is BitFieldNode bitFieldNode) - { - var underlayingNode = bitFieldNode.GetUnderlayingNode(); - underlayingNode.CopyFromNode(node); - return underlayingNode; - } - - if (node is BaseHexNode hexNode) + switch (node) { - var arrayNode = new ArrayNode { Count = hexNode.MemorySize }; - arrayNode.CopyFromNode(node); - arrayNode.ChangeInnerNode(new Utf8CharacterNode()); - return arrayNode; + case BaseTextNode textNode: + { + var arrayNode = new ArrayNode { Count = textNode.Length }; + arrayNode.CopyFromNode(node); + arrayNode.ChangeInnerNode(GetCharacterNodeForEncoding(textNode.Encoding)); + return arrayNode; + } + case BaseTextPtrNode textPtrNode: + { + var pointerNode = new PointerNode(); + pointerNode.CopyFromNode(node); + pointerNode.ChangeInnerNode(GetCharacterNodeForEncoding(textPtrNode.Encoding)); + return pointerNode; + } + case BitFieldNode bitFieldNode: + { + var underlayingNode = bitFieldNode.GetUnderlayingNode(); + underlayingNode.CopyFromNode(node); + return underlayingNode; + } + case BaseHexNode hexNode: + { + var arrayNode = new ArrayNode { Count = hexNode.MemorySize }; + arrayNode.CopyFromNode(node); + arrayNode.ChangeInnerNode(new Utf8CharacterNode()); + return arrayNode; + } } return node; @@ -564,13 +561,12 @@ private string GetTypeDefinition(BaseNode node, ILogger logger) return type; } - if (node is ClassInstanceNode classInstanceNode) - { - return $"class {classInstanceNode.InnerNode.Name}"; - } - if (node is EnumNode enumNode) + switch (node) { - return enumNode.Enum.Name; + case ClassInstanceNode classInstanceNode: + return $"class {classInstanceNode.InnerNode.Name}"; + case EnumNode enumNode: + return enumNode.Enum.Name; } return null; diff --git a/ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs b/ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs index 45b45c0c..908040c9 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassClipboard.cs @@ -25,12 +25,11 @@ public static void Copy(IEnumerable nodes, ILogger logger) Contract.Requires(nodes != null); Contract.Requires(logger != null); - using (var ms = new MemoryStream()) - { - ReClassNetFile.SerializeNodesToStream(ms, nodes, logger); + using var ms = new MemoryStream(); - Clipboard.SetData(ClipboardFormat, ms.ToArray()); - } + ReClassNetFile.SerializeNodesToStream(ms, nodes, logger); + + Clipboard.SetData(ClipboardFormat, ms.ToArray()); } /// Pastes nodes from the clipboard. @@ -43,23 +42,14 @@ public static Tuple, List> Paste(ReClassNetProject tem Contract.Requires(logger != null); Contract.Ensures(Contract.Result, List>>() != null); - var classes = new List(); - var nodes = new List(); - - if (ContainsNodes) + if (ContainsNodes && Clipboard.GetData(ClipboardFormat) is byte[] data) { - if (Clipboard.GetData(ClipboardFormat) is byte[] data) - { - using (var ms = new MemoryStream(data)) - { - var result = ReClassNetFile.DeserializeNodesFromStream(ms, templateProject, logger); - classes.AddRange(result.Item1); - nodes.AddRange(result.Item2); - } - } + using var ms = new MemoryStream(data); + + return ReClassNetFile.DeserializeNodesFromStream(ms, templateProject, logger); } - return Tuple.Create(classes, nodes); + return Tuple.Create(new List(), new List()); } } } diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 1e0cc696..65f9040b 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -14,36 +14,33 @@ public partial class ReClassNetFile { public void Save(string filePath, ILogger logger) { - using (var fs = new FileStream(filePath, FileMode.Create)) - { - Save(fs, logger); - } + using var fs = new FileStream(filePath, FileMode.Create); + + Save(fs, logger); } public void Save(Stream output, ILogger logger) { - using (var archive = new ZipArchive(output, ZipArchiveMode.Create)) - { - var dataEntry = archive.CreateEntry(DataFileName); - using (var entryStream = dataEntry.Open()) - { - var document = new XDocument( - new XComment($"{Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"), - new XComment($"Website: {Constants.HomepageUrl}"), - new XElement( - XmlRootElement, - new XAttribute(XmlVersionAttribute, FileVersion), - new XAttribute(XmlPlatformAttribute, Constants.Platform), - project.CustomData.Serialize(XmlCustomDataElement), - project.TypeMapping.Serialize(XmlTypeMappingElement), - new XElement(XmlEnumsElement, CreateEnumElements(project.Enums)), - new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)) - ) - ); - - document.Save(entryStream); - } - } + using var archive = new ZipArchive(output, ZipArchiveMode.Create); + + var dataEntry = archive.CreateEntry(DataFileName); + using var entryStream = dataEntry.Open(); + + var document = new XDocument( + new XComment($"{Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"), + new XComment($"Website: {Constants.HomepageUrl}"), + new XElement( + XmlRootElement, + new XAttribute(XmlVersionAttribute, FileVersion), + new XAttribute(XmlPlatformAttribute, Constants.Platform), + project.CustomData.Serialize(XmlCustomDataElement), + project.TypeMapping.Serialize(XmlTypeMappingElement), + new XElement(XmlEnumsElement, CreateEnumElements(project.Enums)), + new XElement(XmlClassesElement, CreateClassElements(project.Classes, logger)) + ) + ); + + document.Save(entryStream); } private static IEnumerable CreateEnumElements(IEnumerable enums) @@ -185,61 +182,60 @@ public static void SerializeNodesToStream(Stream output, IEnumerable n Contract.Requires(Contract.ForAll(nodes, n => n != null)); Contract.Requires(logger != null); - using (var project = new ReClassNetProject()) + using var project = new ReClassNetProject(); + + void RecursiveAddClasses(BaseNode node) { - void RecursiveAddClasses(BaseNode node) + ClassNode classNode = null; + switch (node) { - ClassNode classNode = null; - switch (node) - { - case ClassNode c1: - classNode = c1; - break; - case BaseWrapperNode wrapperNode when wrapperNode.ResolveMostInnerNode() is ClassNode c2: - classNode = c2; - break; - } + case ClassNode c1: + classNode = c1; + break; + case BaseWrapperNode wrapperNode when wrapperNode.ResolveMostInnerNode() is ClassNode c2: + classNode = c2; + break; + } - if (classNode == null || project.ContainsClass(classNode.Uuid)) - { - return; - } + if (classNode == null || project.ContainsClass(classNode.Uuid)) + { + return; + } - project.AddClass(classNode); + project.AddClass(classNode); - foreach (var wrapperNodeChild in classNode.Nodes.OfType()) - { - RecursiveAddClasses(wrapperNodeChild); - } + foreach (var wrapperNodeChild in classNode.Nodes.OfType()) + { + RecursiveAddClasses(wrapperNodeChild); } + } - var serialisationClass = new ClassNode(false) - { - Name = SerializationClassName - }; + var serialisationClass = new ClassNode(false) + { + Name = SerializationClassName + }; - var needsSerialisationClass = true; + var needsSerialisationClass = true; - foreach (var node in nodes) - { - RecursiveAddClasses(node); + foreach (var node in nodes) + { + RecursiveAddClasses(node); - if (!(node is ClassNode)) + if (!(node is ClassNode)) + { + if (needsSerialisationClass) { - if (needsSerialisationClass) - { - needsSerialisationClass = false; - - project.AddClass(serialisationClass); - } + needsSerialisationClass = false; - serialisationClass.AddNode(node); + project.AddClass(serialisationClass); } - } - var file = new ReClassNetFile(project); - file.Save(output, logger); + serialisationClass.AddNode(node); + } } + + var file = new ReClassNetFile(project); + file.Save(output, logger); } } } diff --git a/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs b/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs index 757846af..1c6b95d9 100644 --- a/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs +++ b/ReClass.NET/DataExchange/Scanner/CheatEngineFile.cs @@ -27,65 +27,64 @@ public class CheatEngineFile : IScannerImport public IEnumerable Load(string filePath, ILogger logger) { - using (var stream = File.OpenRead(filePath)) + using var stream = File.OpenRead(filePath); + + var document = XDocument.Load(stream); + if (document.Root != null) { - var document = XDocument.Load(stream); - if (document.Root != null) + var version = document.Root.Attribute(XmlVersionElement)?.Value; + if (string.Compare(version, Version26, StringComparison.Ordinal) >= 0) { - var version = document.Root.Attribute(XmlVersionElement)?.Value; - if (string.Compare(version, Version26, StringComparison.Ordinal) >= 0) + var entries = document.Root.Element(XmlEntriesElement); + if (entries != null) { - var entries = document.Root.Element(XmlEntriesElement); - if (entries != null) + foreach (var entry in entries.Elements(XmlEntryElement)) { - foreach (var entry in entries.Elements(XmlEntryElement)) + var description = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty; + if (description == "\"No description\"") { - var description = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty; - if (description == "\"No description\"") - { - description = string.Empty; - } - var variableTypeStr = entry.Element(XmlValueTypeElement)?.Value.Trim() ?? string.Empty; - var valueType = Parse(variableTypeStr, logger); + description = string.Empty; + } + var variableTypeStr = entry.Element(XmlValueTypeElement)?.Value.Trim() ?? string.Empty; + var valueType = Parse(variableTypeStr, logger); - var record = new MemoryRecord - { - Description = description, - ValueType = valueType - }; + var record = new MemoryRecord + { + Description = description, + ValueType = valueType + }; - var addressStr = entry.Element(XmlAddressElement)?.Value.Trim() ?? string.Empty; - var addressParts = addressStr.Split('+'); - if (addressParts.Length == 2) - { - long.TryParse(addressParts[1], NumberStyles.HexNumber, null, out var value); - record.AddressOrOffset = (IntPtr)value; + var addressStr = entry.Element(XmlAddressElement)?.Value.Trim() ?? string.Empty; + var addressParts = addressStr.Split('+'); + if (addressParts.Length == 2) + { + long.TryParse(addressParts[1], NumberStyles.HexNumber, null, out var value); + record.AddressOrOffset = (IntPtr)value; - record.ModuleName = addressParts[0].Trim(); - } - else - { - long.TryParse(addressStr, NumberStyles.HexNumber, null, out var value); - record.AddressOrOffset = (IntPtr)value; - } + record.ModuleName = addressParts[0].Trim(); + } + else + { + long.TryParse(addressStr, NumberStyles.HexNumber, null, out var value); + record.AddressOrOffset = (IntPtr)value; + } - if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) - { - var lengthStr = entry.Element(XmlLengthElement)?.Value ?? string.Empty; - int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) + { + var lengthStr = entry.Element(XmlLengthElement)?.Value ?? string.Empty; + int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); - record.ValueLength = Math.Max(1, valueLength); + record.ValueLength = Math.Max(1, valueLength); - if (valueType == ScanValueType.String) - { - var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1"; + if (valueType == ScanValueType.String) + { + var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1"; - record.Encoding = isUnicode ? Encoding.Unicode : Encoding.UTF8; - } + record.Encoding = isUnicode ? Encoding.Unicode : Encoding.UTF8; } - - yield return record; } + + yield return record; } } } diff --git a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs index 623c80fb..8af86952 100644 --- a/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs +++ b/ReClass.NET/DataExchange/Scanner/ReClassScanFile.cs @@ -35,136 +35,128 @@ public class ReClassScanFile : IScannerImport, IScannerExport public IEnumerable Load(string filePath, ILogger logger) { - using (var fs = new FileStream(filePath, FileMode.Open)) + using var fs = new FileStream(filePath, FileMode.Open); + using var archive = new ZipArchive(fs, ZipArchiveMode.Read); + + var dataEntry = archive.GetEntry(DataFileName); + if (dataEntry == null) { - using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) - { - var dataEntry = archive.GetEntry(DataFileName); - if (dataEntry == null) - { - throw new FormatException(); - } - using (var entryStream = dataEntry.Open()) - { - var document = XDocument.Load(entryStream); - if (document.Root == null) - { - logger.Log(LogLevel.Error, "File has not the correct format."); - yield break; - } + throw new FormatException(); + } - //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; - var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; - if (platform != Constants.Platform) - { - logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); - } + using var entryStream = dataEntry.Open(); + var document = XDocument.Load(entryStream); + if (document.Root == null) + { + logger.Log(LogLevel.Error, "File has not the correct format."); + yield break; + } - foreach (var element in document.Root.Elements(XmlRecordElement)) - { - var valueTypeStr = element.Attribute(XmlValueTypeAttribute)?.Value ?? string.Empty; + //var version = document.Root.Attribute(XmlVersionAttribute)?.Value; + var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value; + if (platform != Constants.Platform) + { + logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform})."); + } - if (!Enum.TryParse(valueTypeStr, out var valueType)) - { - logger?.Log(LogLevel.Warning, $"Unknown value type: {valueTypeStr}"); - continue; - } + foreach (var element in document.Root.Elements(XmlRecordElement)) + { + var valueTypeStr = element.Attribute(XmlValueTypeAttribute)?.Value ?? string.Empty; - var description = element.Attribute(XmlDescriptionAttribute)?.Value ?? string.Empty; + if (!Enum.TryParse(valueTypeStr, out var valueType)) + { + logger?.Log(LogLevel.Warning, $"Unknown value type: {valueTypeStr}"); + continue; + } - var addressStr = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty; - var moduleName = element.Attribute(XmlModuleAttribute)?.Value ?? string.Empty; + var description = element.Attribute(XmlDescriptionAttribute)?.Value ?? string.Empty; - long.TryParse(addressStr, NumberStyles.HexNumber, null, out var address); + var addressStr = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty; + var moduleName = element.Attribute(XmlModuleAttribute)?.Value ?? string.Empty; - var record = new MemoryRecord - { - Description = description, - AddressOrOffset = (IntPtr)address, - ValueType = valueType - }; + long.TryParse(addressStr, NumberStyles.HexNumber, null, out var address); - if (!string.IsNullOrEmpty(moduleName)) - { - record.ModuleName = moduleName; - } + var record = new MemoryRecord + { + Description = description, + AddressOrOffset = (IntPtr)address, + ValueType = valueType + }; - if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) - { - var lengthStr = element.Attribute(XmlValueLengthAttribute)?.Value ?? string.Empty; - int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); - - record.ValueLength = Math.Max(1, valueLength); - - if (valueType == ScanValueType.String) - { - switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty) - { - default: - record.Encoding = Encoding.UTF8; - break; - case "UTF16": - record.Encoding = Encoding.Unicode; - break; - case "UTF32": - record.Encoding = Encoding.UTF32; - break; - } - } - } + if (!string.IsNullOrEmpty(moduleName)) + { + record.ModuleName = moduleName; + } - yield return record; + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) + { + var lengthStr = element.Attribute(XmlValueLengthAttribute)?.Value ?? string.Empty; + int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength); + + record.ValueLength = Math.Max(1, valueLength); + + if (valueType == ScanValueType.String) + { + switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty) + { + default: + record.Encoding = Encoding.UTF8; + break; + case "UTF16": + record.Encoding = Encoding.Unicode; + break; + case "UTF32": + record.Encoding = Encoding.UTF32; + break; } } } + + yield return record; } } public void Save(IEnumerable records, string filePath, ILogger logger) { - using (var fs = new FileStream(filePath, FileMode.Create)) - { - using (var archive = new ZipArchive(fs, ZipArchiveMode.Create)) - { - var dataEntry = archive.CreateEntry(DataFileName); - using (var entryStream = dataEntry.Open()) + using var fs = new FileStream(filePath, FileMode.Create); + using var archive = new ZipArchive(fs, ZipArchiveMode.Create); + + var dataEntry = archive.CreateEntry(DataFileName); + using var entryStream = dataEntry.Open(); + + var document = new XDocument( + new XComment($"{Constants.ApplicationName} Scanner {Constants.ApplicationVersion} by {Constants.Author}"), + new XComment($"Website: {Constants.HomepageUrl}"), + new XElement( + XmlRootElement, + new XAttribute(XmlVersionAttribute, Version1), + new XAttribute(XmlPlatformAttribute, Constants.Platform), + records.Select(r => { - var document = new XDocument( - new XComment($"{Constants.ApplicationName} Scanner {Constants.ApplicationVersion} by {Constants.Author}"), - new XComment($"Website: {Constants.HomepageUrl}"), - new XElement( - XmlRootElement, - new XAttribute(XmlVersionAttribute, Version1), - new XAttribute(XmlPlatformAttribute, Constants.Platform), - records.Select(r => - { - var temp = new XElement( - XmlRecordElement, - new XAttribute(XmlValueTypeAttribute, r.ValueType.ToString()), - new XAttribute(XmlDescriptionAttribute, r.Description ?? string.Empty), - new XAttribute(XmlAddressAttribute, r.AddressOrOffset.ToString(Constants.AddressHexFormat)) - ); - if (r.IsRelativeAddress) - { - temp.SetAttributeValue(XmlModuleAttribute, r.ModuleName); - } - if (r.ValueType == ScanValueType.ArrayOfBytes || r.ValueType == ScanValueType.String) - { - temp.SetAttributeValue(XmlValueLengthAttribute, r.ValueLength); - if (r.ValueType == ScanValueType.String) - { - temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding.IsSameCodePage(Encoding.UTF8) ? "UTF8" : r.Encoding.IsSameCodePage(Encoding.Unicode) ? "UTF16" : "UTF32"); - } - } - return temp; - }) - ) + var temp = new XElement( + XmlRecordElement, + new XAttribute(XmlValueTypeAttribute, r.ValueType.ToString()), + new XAttribute(XmlDescriptionAttribute, r.Description ?? string.Empty), + new XAttribute(XmlAddressAttribute, r.AddressOrOffset.ToString(Constants.AddressHexFormat)) ); + if (r.IsRelativeAddress) + { + temp.SetAttributeValue(XmlModuleAttribute, r.ModuleName); + } + if (r.ValueType == ScanValueType.ArrayOfBytes || r.ValueType == ScanValueType.String) + { + temp.SetAttributeValue(XmlValueLengthAttribute, r.ValueLength); + if (r.ValueType == ScanValueType.String) + { + temp.SetAttributeValue(XmlEncodingAttribute, r.Encoding.IsSameCodePage(Encoding.UTF8) ? "UTF8" : r.Encoding.IsSameCodePage(Encoding.Unicode) ? "UTF16" : "UTF32"); + } + } + return temp; + }) + ) + ); - document.Save(entryStream); - } - } - } + document.Save(entryStream); } } } diff --git a/ReClass.NET/Debugger/RemoteDebugger.Handler.cs b/ReClass.NET/Debugger/RemoteDebugger.Handler.cs index 45009e14..60e07402 100644 --- a/ReClass.NET/Debugger/RemoteDebugger.Handler.cs +++ b/ReClass.NET/Debugger/RemoteDebugger.Handler.cs @@ -10,8 +10,7 @@ private void HandleExceptionEvent(ref DebugEvent evt) foreach (var bp in breakpoints) { - var hwbp = bp as HardwareBreakpoint; - if (hwbp?.Register == causedBy) + if (bp is HardwareBreakpoint hwbp && hwbp.Register == causedBy) { hwbp.Handler(ref evt); diff --git a/ReClass.NET/Debugger/RemoteDebugger.cs b/ReClass.NET/Debugger/RemoteDebugger.cs index bb468553..920877da 100644 --- a/ReClass.NET/Debugger/RemoteDebugger.cs +++ b/ReClass.NET/Debugger/RemoteDebugger.cs @@ -5,7 +5,6 @@ using ReClassNET.Extensions; using ReClassNET.Forms; using ReClassNET.Memory; -using ReClassNET.Util; namespace ReClassNET.Debugger { diff --git a/ReClass.NET/Extensions/EncodingExtensions.cs b/ReClass.NET/Extensions/EncodingExtensions.cs index 4f9f3bba..4a3ed695 100644 --- a/ReClass.NET/Extensions/EncodingExtensions.cs +++ b/ReClass.NET/Extensions/EncodingExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; namespace ReClassNET.Extensions @@ -10,9 +10,18 @@ public static class EncodingExtension /// The byte count per character. public static int GuessByteCountPerChar(this Encoding encoding) { - if (encoding.IsSameCodePage(Encoding.UTF8) || encoding.CodePage == 1252 /* Windows-1252 */ || encoding.IsSameCodePage(Encoding.ASCII)) return 1; - if (encoding.IsSameCodePage(Encoding.Unicode) || encoding.IsSameCodePage(Encoding.BigEndianUnicode)) return 2; - if (encoding.IsSameCodePage(Encoding.UTF32)) return 4; + if (encoding.IsSameCodePage(Encoding.UTF8) || encoding.CodePage == 1252 /* Windows-1252 */ || encoding.IsSameCodePage(Encoding.ASCII)) + { + return 1; + } + if (encoding.IsSameCodePage(Encoding.Unicode) || encoding.IsSameCodePage(Encoding.BigEndianUnicode)) + { + return 2; + } + if (encoding.IsSameCodePage(Encoding.UTF32)) + { + return 4; + } throw new NotImplementedException(); } diff --git a/ReClass.NET/Extensions/EnumerableExtension.cs b/ReClass.NET/Extensions/EnumerableExtension.cs index f027df42..0619c87f 100644 --- a/ReClass.NET/Extensions/EnumerableExtension.cs +++ b/ReClass.NET/Extensions/EnumerableExtension.cs @@ -177,31 +177,29 @@ public static IEnumerable> GroupWhile(this IEnumerable sour Contract.Requires(source != null); Contract.Requires(condition != null); - using (var it = source.GetEnumerator()) + using var it = source.GetEnumerator(); + if (it.MoveNext()) { - if (it.MoveNext()) + var previous = it.Current; + var list = new List { previous }; + + while (it.MoveNext()) { - var previous = it.Current; - var list = new List { previous }; + var item = it.Current; - while (it.MoveNext()) + if (condition(previous, item) == false) { - var item = it.Current; - - if (condition(previous, item) == false) - { - yield return list; - - list = new List(); - } + yield return list; - list.Add(item); - - previous = item; + list = new List(); } - yield return list; + list.Add(item); + + previous = item; } + + yield return list; } } } diff --git a/ReClass.NET/Extensions/XAttributeExtensions.cs b/ReClass.NET/Extensions/XAttributeExtensions.cs index 9a5f8c5d..d559e50d 100644 --- a/ReClass.NET/Extensions/XAttributeExtensions.cs +++ b/ReClass.NET/Extensions/XAttributeExtensions.cs @@ -7,7 +7,7 @@ public static class XAttributeExtensions { public static TEnum GetEnumValue(this XAttribute attribute) where TEnum : struct { - TEnum @enum = default(TEnum); + TEnum @enum = default; if (attribute != null) { Enum.TryParse(attribute.Value, out @enum); diff --git a/ReClass.NET/Logger/BaseLogger.cs b/ReClass.NET/Logger/BaseLogger.cs index 5c5f9bc4..7b1f58b4 100644 --- a/ReClass.NET/Logger/BaseLogger.cs +++ b/ReClass.NET/Logger/BaseLogger.cs @@ -4,7 +4,7 @@ namespace ReClassNET.Logger { - class BaseLogger : ILogger + public abstract class BaseLogger : ILogger { private readonly object sync = new object(); diff --git a/ReClass.NET/Logger/GuiLogger.cs b/ReClass.NET/Logger/GuiLogger.cs index 924dc6a8..7371afc2 100644 --- a/ReClass.NET/Logger/GuiLogger.cs +++ b/ReClass.NET/Logger/GuiLogger.cs @@ -6,7 +6,7 @@ namespace ReClassNET.Logger { /// A logger which displays messages in a form. - class GuiLogger : BaseLogger + public class GuiLogger : BaseLogger { private readonly LogForm form; diff --git a/ReClass.NET/Memory/ProcessInfo.cs b/ReClass.NET/Memory/ProcessInfo.cs index fe60ae2f..b2f8c67e 100644 --- a/ReClass.NET/Memory/ProcessInfo.cs +++ b/ReClass.NET/Memory/ProcessInfo.cs @@ -24,10 +24,8 @@ public ProcessInfo(IntPtr id, string name, string path) Path = path; icon = new Lazy(() => { - using (var i = NativeMethods.GetIconForFile(Path)) - { - return i?.ToBitmap(); - } + using var i = NativeMethods.GetIconForFile(Path); + return i?.ToBitmap(); }); } } diff --git a/ReClass.NET/Memory/SimplePeHeader.cs b/ReClass.NET/Memory/SimplePeHeader.cs index e3ffa4b2..89f0e804 100644 --- a/ReClass.NET/Memory/SimplePeHeader.cs +++ b/ReClass.NET/Memory/SimplePeHeader.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ReClassNET.Memory { @@ -36,18 +32,14 @@ public static void FixSectionHeaders(byte[] data) { var pe = new SimplePeHeader(data); - using (var ms = new MemoryStream(data)) + using var ms = new MemoryStream(data); + using var bw = new BinaryWriter(ms); + for (var i = 0; i < pe.NumberOfSections; ++i) { - using (var bw = new BinaryWriter(ms)) - { - for (var i = 0; i < pe.NumberOfSections; ++i) - { - var offset = pe.SectionOffset(i); - bw.Seek(offset + 16, SeekOrigin.Begin); - bw.Write(BitConverter.ToUInt32(data, offset + 8)); // SizeOfRawData = VirtualSize - bw.Write(BitConverter.ToUInt32(data, offset + 12)); // PointerToRawData = VirtualAddress - } - } + var offset = pe.SectionOffset(i); + bw.Seek(offset + 16, SeekOrigin.Begin); + bw.Write(BitConverter.ToUInt32(data, offset + 8)); // SizeOfRawData = VirtualSize + bw.Write(BitConverter.ToUInt32(data, offset + 12)); // PointerToRawData = VirtualAddress } } } diff --git a/ReClass.NET/MemoryScanner/BytePattern.cs b/ReClass.NET/MemoryScanner/BytePattern.cs index 64ff463c..3bbca9ed 100644 --- a/ReClass.NET/MemoryScanner/BytePattern.cs +++ b/ReClass.NET/MemoryScanner/BytePattern.cs @@ -213,35 +213,33 @@ public static BytePattern Parse(string value) var pattern = new BytePattern(); - using (var sr = new StringReader(value)) + using var sr = new StringReader(value); + while (true) { - while (true) + var pb = new PatternByte(); + if (pb.TryRead(sr)) { - var pb = new PatternByte(); - if (pb.TryRead(sr)) + if (!pb.HasWildcard) { - if (!pb.HasWildcard) - { - pattern.pattern.Add(new SimplePatternByte(pb.ToByte())); - } - else - { - pattern.pattern.Add(pb); - } + pattern.pattern.Add(new SimplePatternByte(pb.ToByte())); } else { - break; + pattern.pattern.Add(pb); } } - - // Check if we are not at the end of the stream - if (sr.Peek() != -1) + else { - throw new ArgumentException($"'{value}' is not a valid byte pattern."); + break; } } + // Check if we are not at the end of the stream + if (sr.Peek() != -1) + { + throw new ArgumentException($"'{value}' is not a valid byte pattern."); + } + return pattern; } diff --git a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs index 5e711e94..3a953d11 100644 --- a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs +++ b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs @@ -56,23 +56,16 @@ private IScanComparer CreateScanComparer(ScanCompareType compareType) { Contract.Ensures(Contract.Result() != null); - switch (Settings.ValueType) + return Settings.ValueType switch { - case ScanValueType.Byte: - return new ByteMemoryComparer(compareType, 0, 0); - case ScanValueType.Short: - return new ShortMemoryComparer(compareType, 0, 0); - case ScanValueType.Integer: - return new IntegerMemoryComparer(compareType, 0, 0); - case ScanValueType.Long: - return new LongMemoryComparer(compareType, 0, 0); - case ScanValueType.Float: - return new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0); - case ScanValueType.Double: - return new DoubleMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0); - default: - throw new InvalidOperationException(); - } + ScanValueType.Byte => new ByteMemoryComparer(compareType, 0, 0), + ScanValueType.Short => new ShortMemoryComparer(compareType, 0, 0), + ScanValueType.Integer => new IntegerMemoryComparer(compareType, 0, 0), + ScanValueType.Long => new LongMemoryComparer(compareType, 0, 0), + ScanValueType.Float => new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0), + ScanValueType.Double => new DoubleMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0), + _ => throw new InvalidOperationException(), + }; } /// diff --git a/ReClass.NET/MemoryScanner/ScanResultBlock.cs b/ReClass.NET/MemoryScanner/ScanResultBlock.cs index 14aad1ac..ab657c15 100644 --- a/ReClass.NET/MemoryScanner/ScanResultBlock.cs +++ b/ReClass.NET/MemoryScanner/ScanResultBlock.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner { diff --git a/ReClass.NET/MemoryScanner/ScanResultStore.cs b/ReClass.NET/MemoryScanner/ScanResultStore.cs index 5ddb1a45..1d03daf2 100644 --- a/ReClass.NET/MemoryScanner/ScanResultStore.cs +++ b/ReClass.NET/MemoryScanner/ScanResultStore.cs @@ -4,7 +4,6 @@ using System.IO; using System.Text; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner { @@ -130,16 +129,14 @@ private void AppendBlockToFile(ScanResultBlock block) { Contract.Requires(block != null); - using (var bw = new BinaryWriter(fileStream, Encoding.Unicode, true)) - { - bw.Write(block.Start); - bw.Write(block.End); - bw.Write(block.Results.Count); + using var bw = new BinaryWriter(fileStream, Encoding.Unicode, true); + bw.Write(block.Start); + bw.Write(block.End); + bw.Write(block.Results.Count); - foreach (var result in block.Results) - { - WriteSearchResult(bw, result); - } + foreach (var result in block.Results) + { + WriteSearchResult(bw, result); } } @@ -150,28 +147,25 @@ private IEnumerable ReadBlocksFromFile() { Contract.Ensures(Contract.Result>() != null); - using (var stream = File.OpenRead(storePath)) - { - using (var br = new BinaryReader(stream, Encoding.Unicode)) - { - var length = stream.Length; + using var stream = File.OpenRead(storePath); + using var br = new BinaryReader(stream, Encoding.Unicode); - while (stream.Position < length) - { - var start = br.ReadIntPtr(); - var end = br.ReadIntPtr(); + var length = stream.Length; - var resultCount = br.ReadInt32(); + while (stream.Position < length) + { + var start = br.ReadIntPtr(); + var end = br.ReadIntPtr(); - var results = new List(resultCount); - for (var i = 0; i < resultCount; ++i) - { - results.Add(ReadScanResult(br)); - } + var resultCount = br.ReadInt32(); - yield return new ScanResultBlock(start, end, results); - } + var results = new List(resultCount); + for (var i = 0; i < resultCount; ++i) + { + results.Add(ReadScanResult(br)); } + + yield return new ScanResultBlock(start, end, results); } } diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index ee0820fc..3220e46d 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; @@ -125,45 +125,42 @@ private IList
GetSearchableSections() .Where(s => s.Start.IsInRange(Settings.StartAddress, Settings.StopAddress) || Settings.StartAddress.IsInRange(s.Start, s.End) || Settings.StopAddress.IsInRange(s.Start, s.End)) - .Where(s => + .Where(s => s.Type switch { - switch (s.Type) - { - case SectionType.Private: return Settings.ScanPrivateMemory; - case SectionType.Image: return Settings.ScanImageMemory; - case SectionType.Mapped: return Settings.ScanMappedMemory; - default: return false; - } + SectionType.Private => Settings.ScanPrivateMemory, + SectionType.Image => Settings.ScanImageMemory, + SectionType.Mapped => Settings.ScanMappedMemory, + _ => false }) .Where(s => { var isWritable = s.Protection.HasFlag(SectionProtection.Write); - switch (Settings.ScanWritableMemory) + return Settings.ScanWritableMemory switch { - case SettingState.Yes: return isWritable; - case SettingState.No: return !isWritable; - default: return true; - } + SettingState.Yes => isWritable, + SettingState.No => !isWritable, + _ => true + }; }) .Where(s => { var isExecutable = s.Protection.HasFlag(SectionProtection.Execute); - switch (Settings.ScanExecutableMemory) + return Settings.ScanExecutableMemory switch { - case SettingState.Yes: return isExecutable; - case SettingState.No: return !isExecutable; - default: return true; - } + SettingState.Yes => isExecutable, + SettingState.No => !isExecutable, + _ => true + }; }) .Where(s => { var isCopyOnWrite = s.Protection.HasFlag(SectionProtection.CopyOnWrite); - switch (Settings.ScanCopyOnWriteMemory) + return Settings.ScanCopyOnWriteMemory switch { - case SettingState.Yes: return isCopyOnWrite; - case SettingState.No: return !isCopyOnWrite; - default: return true; - } + SettingState.Yes => isCopyOnWrite, + SettingState.No => !isCopyOnWrite, + _ => true + }; }) .ToList(); } @@ -230,12 +227,12 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca if (Settings.StartAddress.IsInRange(start, end)) { - size = size - Settings.StartAddress.Sub(start).ToInt32(); + size -= Settings.StartAddress.Sub(start).ToInt32(); start = Settings.StartAddress; } if (Settings.StopAddress.IsInRange(start, end)) { - size = size - end.Sub(Settings.StopAddress).ToInt32(); + size -= end.Sub(Settings.StopAddress).ToInt32(); } context.EnsureBufferSize(size); diff --git a/ReClass.NET/Symbols/SymbolReader.cs b/ReClass.NET/Symbols/SymbolReader.cs index c3df31b6..230880b2 100644 --- a/ReClass.NET/Symbols/SymbolReader.cs +++ b/ReClass.NET/Symbols/SymbolReader.cs @@ -5,7 +5,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Native; -using ReClassNET.Util; namespace ReClassNET.Symbols { @@ -49,10 +48,8 @@ public static void TryResolveSymbolsForModule(Module module, string searchPath) { Contract.Requires(module != null); - using (var diaSource = new ComDisposableWrapper(new DiaSource())) - { - diaSource.Interface.loadDataForExe(module.Path, searchPath, null); - } + using var diaSource = new ComDisposableWrapper(new DiaSource()); + diaSource.Interface.loadDataForExe(module.Path, searchPath, null); } public static SymbolReader FromModule(Module module, string searchPath) @@ -93,12 +90,11 @@ public string GetSymbolString(IntPtr address, Module module) diaSession.Interface.findSymbolByRVA((uint)rva.ToInt32(), SymTagEnum.SymTagNull, out var diaSymbol); if (diaSymbol != null) { - using (var symbol = new ComDisposableWrapper(diaSymbol)) - { - var sb = new StringBuilder(); - ReadSymbol(symbol.Interface, sb); - return sb.ToString(); - } + using var symbol = new ComDisposableWrapper(diaSymbol); + + var sb = new StringBuilder(); + ReadSymbol(symbol.Interface, sb); + return sb.ToString(); } return null; } @@ -134,10 +130,9 @@ private void ReadSymbolType(IDiaSymbol symbol, StringBuilder sb) if (symbol.type != null) { - using (var type = new ComDisposableWrapper(symbol.type)) - { - ReadType(type.Interface, sb); - } + using var type = new ComDisposableWrapper(symbol.type); + + ReadType(type.Interface, sb); } } diff --git a/ReClass.NET/Symbols/SymbolStore.cs b/ReClass.NET/Symbols/SymbolStore.cs index 5f9d3f16..4992c558 100644 --- a/ReClass.NET/Symbols/SymbolStore.cs +++ b/ReClass.NET/Symbols/SymbolStore.cs @@ -89,25 +89,23 @@ public SymbolStore() private void ResolveSearchPath() { - using (var vsKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio")) + using var vsKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio"); + if (vsKey == null) { - if (vsKey != null) + return; + } + + foreach (var subKeyName in vsKey.GetSubKeyNames()) + { + using var debuggerKey = vsKey.OpenSubKey($@"{subKeyName}\Debugger"); + if (debuggerKey?.GetValue("SymbolCacheDir") is string symbolCacheDir) { - foreach (var subKeyName in vsKey.GetSubKeyNames()) + if (Directory.Exists(symbolCacheDir)) { - using (var debuggerKey = vsKey.OpenSubKey($@"{subKeyName}\Debugger")) - { - if (debuggerKey?.GetValue("SymbolCacheDir") is string symbolCacheDir) - { - if (Directory.Exists(symbolCacheDir)) - { - SymbolCachePath = symbolCacheDir; - } - - return; - } - } + SymbolCachePath = symbolCacheDir; } + + break; } } } From cf52ca3a9a37f3dae54190a5fc903016e7f9bb49 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 11:55:22 +0200 Subject: [PATCH 684/777] Do not use Beep because of errors on unix systems. --- ReClass.NET/Program.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index edeebd88..0247418a 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Drawing; using System.Globalization; @@ -67,9 +67,9 @@ static void Main(string[] args) Settings = SettingsSerializer.Load(); Logger = new GuiLogger(); - if(!NativeMethods.IsUnix() && Settings.RunAsAdmin && !WinUtil.IsAdministrator) + if (!NativeMethods.IsUnix() && Settings.RunAsAdmin && !WinUtil.IsAdministrator) { - WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, args.Length > 0 ? string.Join(" ", args) : null); + WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, args.Length > 0 ? string.Join(" ", args) : null); return; } @@ -106,6 +106,7 @@ public static void ShowException(Exception ex) var msg = new ExceptionMessageBox(ex) { + Beep = false, ShowToolBar = true, Symbol = ExceptionMessageBoxSymbol.Error }; From 43b27807dde006d4986e1917a5142c2fad3b8928 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 11:55:58 +0200 Subject: [PATCH 685/777] Fixed comment. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index d648ec4e..eb25e52b 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -21,7 +21,7 @@ public ReClassNetFile(ReClassNetProject project) static ReClassNetFile() { - // Obsolete: The name of the class was changed. Because of this older files can't load this nodes. + // Obsolete: The name of the class was changed. Because of this older versions can't load these nodes. buildInStringToTypeMap["UTF8TextNode"] = typeof(Utf8TextNode); buildInStringToTypeMap["UTF8TextPtrNode"] = typeof(Utf8TextPtrNode); buildInStringToTypeMap["UTF16TextNode"] = typeof(Utf16TextNode); From 58ec90fdbed9b6e3d19d3ab02f0f32704e4cacbe Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 11:56:19 +0200 Subject: [PATCH 686/777] Use tuple deconstruction. --- ReClass.NET/DataExchange/ReClass/ReClassFile.cs | 8 ++++---- ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs index f036b32b..9bb01985 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassFile.cs @@ -74,15 +74,15 @@ public void Load(string filePath, ILogger logger) } var classMap = classes.ToDictionary(t => t.Item2.Name, t => t.Item2); - foreach (var t in classes) + foreach (var (classElement, classNode) in classes) { ReadNodeElements( - t.Item1.Elements("Node"), - t.Item2, + classElement.Elements("Node"), + classNode, classMap, typeMap, logger - ).ForEach(t.Item2.AddNode); + ).ForEach(classNode.AddNode); } } diff --git a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs index 43dfdcc2..275624c0 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassQtFile.cs @@ -77,14 +77,14 @@ public void Load(string filePath, ILogger logger) } var classMap = classes.ToDictionary(c => c.Item1.Attribute("ClassId")?.Value, c => c.Item2); - foreach (var t in classes) + foreach (var (classElement, classNode) in classes) { ReadNodeElements( - t.Item1.Elements("Node"), - t.Item2, + classElement.Elements("Node"), + classNode, classMap, logger - ).ForEach(t.Item2.AddNode); + ).ForEach(classNode.AddNode); } } From 700e22d072161b89d2c5c36c5c7dffc05a2bb328 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 12:44:05 +0200 Subject: [PATCH 687/777] General code cleanup. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 4 +- ReClass.NET/AddressParser/ITokenizer.cs | 2 +- ReClass.NET/AddressParser/Parser.cs | 9 +- .../DataExchange/Scanner/CrySearchFile.cs | 4 +- ReClass.NET/Debugger/RemoteDebugger.cs | 12 +- .../Extensions/RichTextBoxExtensions.cs | 4 +- ReClass.NET/Forms/ClassSelectionForm.cs | 3 +- ReClass.NET/Forms/EnumListForm.cs | 20 +- ReClass.NET/Forms/EnumSelectionForm.cs | 20 +- ReClass.NET/Forms/FoundCodeForm.cs | 3 +- ReClass.NET/Forms/MainForm.Functions.cs | 43 ++-- ReClass.NET/Forms/MainForm.cs | 178 ++++++++-------- ReClass.NET/Forms/ProcessInfoForm.cs | 38 ++-- ReClass.NET/Forms/ScannerForm.cs | 118 +++++----- ReClass.NET/Forms/SettingsForm.cs | 3 +- .../Comparer/ByteMemoryComparer.cs | 3 +- .../Comparer/DoubleMemoryComparer.cs | 3 +- .../Comparer/IntegerMemoryComparer.cs | 3 +- .../Comparer/LongMemoryComparer.cs | 3 +- .../Comparer/ShortMemoryComparer.cs | 3 +- .../Comparer/StringMemoryComparer.cs | 3 +- ReClass.NET/MemoryScanner/ScanResult.cs | 4 +- ReClass.NET/Native/NativeMethods.Windows.cs | 14 +- ReClass.NET/Nodes/BaseFunctionNode.cs | 10 +- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 13 +- ReClass.NET/Nodes/BaseNode.cs | 12 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 3 +- ReClass.NET/Nodes/FunctionNode.cs | 12 +- ReClass.NET/Nodes/Hex8Node.cs | 3 +- ReClass.NET/Nodes/Matrix3x3Node.cs | 4 +- ReClass.NET/Nodes/Matrix3x4Node.cs | 4 +- ReClass.NET/Nodes/Matrix4x4Node.cs | 4 +- ReClass.NET/Nodes/Vector2Node.cs | 4 +- ReClass.NET/Nodes/Vector3Node.cs | 4 +- ReClass.NET/Nodes/Vector4Node.cs | 4 +- ReClass.NET/Plugins/PluginInfo.cs | 2 +- ReClass.NET/Program.cs | 4 +- ReClass.NET/Symbols/ComDisposableWrapper.cs | 12 +- ReClass.NET/Symbols/SymbolStore.cs | 17 +- ReClass.NET/UI/BannerBox.cs | 4 +- ReClass.NET/UI/BannerFactory.cs | 13 +- ReClass.NET/UI/ColorBox.cs | 15 +- ReClass.NET/UI/DpiUtil.cs | 58 +++-- ReClass.NET/UI/EnumComboBox.cs | 5 +- ReClass.NET/UI/IconButton.cs | 30 ++- ReClass.NET/UI/LinkedWindowFeatures.cs | 5 +- ReClass.NET/UI/MemoryRecordList.cs | 3 +- ReClass.NET/UI/NodeTypesBuilder.cs | 3 +- ReClass.NET/UI/PlaceholderTextBox.cs | 9 +- ReClass.NET/UI/ProjectView.cs | 3 +- ReClass.NET/Util/CircularBuffer.cs | 4 +- ReClass.NET/Util/HexadecimalFormatter.cs | 4 +- ReClass.NET/Util/PathUtil.cs | 6 +- ReClass.NET/Util/Rtf/RtfBuilder.cs | 3 +- ReClass.NET/Util/SettingsSerializer.cs | 201 +++++++++--------- ReClass.NET/Util/Util.cs | 8 +- ReClass.NET/Util/WinUtil.cs | 16 +- 57 files changed, 468 insertions(+), 531 deletions(-) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 47eccb5e..44896bbd 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Linq.Expressions; using System.Reflection; @@ -92,7 +92,7 @@ private static Expression GenerateMethodBody(IExpression expression, Expression Expression.Condition( Expression.Equal(moduleVariable, Expression.Constant(null)), Expression.Constant(IntPtr.Zero), - Expression.MakeMemberAccess(moduleVariable, typeof(Memory.Module).GetProperty(nameof(Memory.Module.Start))) + Expression.MakeMemberAccess(moduleVariable, typeof(Memory.Module).GetProperty(nameof(Memory.Module.Start))!) ) ); } diff --git a/ReClass.NET/AddressParser/ITokenizer.cs b/ReClass.NET/AddressParser/ITokenizer.cs index 625e1a0f..171113a1 100644 --- a/ReClass.NET/AddressParser/ITokenizer.cs +++ b/ReClass.NET/AddressParser/ITokenizer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.AddressParser +namespace ReClassNET.AddressParser { public interface ITokenizer { diff --git a/ReClass.NET/AddressParser/Parser.cs b/ReClass.NET/AddressParser/Parser.cs index d07cdf28..4db14fda 100644 --- a/ReClass.NET/AddressParser/Parser.cs +++ b/ReClass.NET/AddressParser/Parser.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace ReClassNET.AddressParser @@ -185,10 +185,9 @@ private IExpression ParseLeaf() public static IExpression Parse(string str) { - using (var sr = new StringReader(str)) - { - return Parse(new Tokenizer(sr)); - } + using var sr = new StringReader(str); + + return Parse(new Tokenizer(sr)); } private static IExpression Parse(ITokenizer tokenizer) diff --git a/ReClass.NET/DataExchange/Scanner/CrySearchFile.cs b/ReClass.NET/DataExchange/Scanner/CrySearchFile.cs index 42d77147..2aca38c7 100644 --- a/ReClass.NET/DataExchange/Scanner/CrySearchFile.cs +++ b/ReClass.NET/DataExchange/Scanner/CrySearchFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Text; @@ -72,7 +72,7 @@ public IEnumerable Load(string filePath, ILogger logger) switch (valueTypeStr) { default: - case "8": + // case "8": record.Encoding = Encoding.UTF8; break; case "9": diff --git a/ReClass.NET/Debugger/RemoteDebugger.cs b/ReClass.NET/Debugger/RemoteDebugger.cs index 920877da..3224293a 100644 --- a/ReClass.NET/Debugger/RemoteDebugger.cs +++ b/ReClass.NET/Debugger/RemoteDebugger.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -168,13 +168,11 @@ private List SplitBreakpoint(IntPtr address, int size) continue; } } - if (size >= 1) - { - splits.Add(new BreakpointSplit { Address = address, Size = 1 }); - address += 1; - size -= 1; - } + splits.Add(new BreakpointSplit { Address = address, Size = 1 }); + + address += 1; + size -= 1; } return splits; diff --git a/ReClass.NET/Extensions/RichTextBoxExtensions.cs b/ReClass.NET/Extensions/RichTextBoxExtensions.cs index 634c4909..4c1b49a3 100644 --- a/ReClass.NET/Extensions/RichTextBoxExtensions.cs +++ b/ReClass.NET/Extensions/RichTextBoxExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; @@ -16,7 +16,7 @@ public static void SetInnerMargin(this TextBoxBase textBox, int left, int top, i } [StructLayout(LayoutKind.Sequential)] - private struct RECT + private readonly struct RECT { public readonly int Left; public readonly int Top; diff --git a/ReClass.NET/Forms/ClassSelectionForm.cs b/ReClass.NET/Forms/ClassSelectionForm.cs index ee55f0e8..e8ed984d 100644 --- a/ReClass.NET/Forms/ClassSelectionForm.cs +++ b/ReClass.NET/Forms/ClassSelectionForm.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Collections.Generic; -using System.Data; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; diff --git a/ReClass.NET/Forms/EnumListForm.cs b/ReClass.NET/Forms/EnumListForm.cs index a2e109c6..f8cafe56 100644 --- a/ReClass.NET/Forms/EnumListForm.cs +++ b/ReClass.NET/Forms/EnumListForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -57,10 +57,9 @@ private void editEnumIconButton_Click(object sender, EventArgs e) return; } - using (var eef = new EnumEditorForm(@enum)) - { - eef.ShowDialog(); - } + using var eef = new EnumEditorForm(@enum); + + eef.ShowDialog(); } private void addEnumIconButton_Click(object sender, EventArgs e) @@ -70,14 +69,13 @@ private void addEnumIconButton_Click(object sender, EventArgs e) Name = "Enum" }; - using (var eef = new EnumEditorForm(@enum)) + using var eef = new EnumEditorForm(@enum); + + if (eef.ShowDialog() == DialogResult.OK) { - if (eef.ShowDialog() == DialogResult.OK) - { - project.AddEnum(@enum); + project.AddEnum(@enum); - ShowFilteredEnums(); - } + ShowFilteredEnums(); } } diff --git a/ReClass.NET/Forms/EnumSelectionForm.cs b/ReClass.NET/Forms/EnumSelectionForm.cs index 03d11d69..6ef69d17 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -57,10 +57,9 @@ private void editEnumIconButton_Click(object sender, EventArgs e) return; } - using (var eef = new EnumEditorForm(@enum)) - { - eef.ShowDialog(); - } + using var eef = new EnumEditorForm(@enum); + + eef.ShowDialog(); } private void addEnumIconButton_Click(object sender, EventArgs e) @@ -70,14 +69,13 @@ private void addEnumIconButton_Click(object sender, EventArgs e) Name = "Enum" }; - using (var eef = new EnumEditorForm(@enum)) + using var eef = new EnumEditorForm(@enum); + + if (eef.ShowDialog() == DialogResult.OK) { - if (eef.ShowDialog() == DialogResult.OK) - { - project.AddEnum(@enum); + project.AddEnum(@enum); - ShowFilteredEnums(); - } + ShowFilteredEnums(); } } diff --git a/ReClass.NET/Forms/FoundCodeForm.cs b/ReClass.NET/Forms/FoundCodeForm.cs index 68ccd141..3169db2a 100644 --- a/ReClass.NET/Forms/FoundCodeForm.cs +++ b/ReClass.NET/Forms/FoundCodeForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Data; using System.Diagnostics.Contracts; using System.Drawing; @@ -10,7 +10,6 @@ using ReClassNET.Memory; using ReClassNET.Nodes; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Forms { diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 9fad2852..6e0d7439 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; @@ -15,7 +15,6 @@ using ReClassNET.Nodes; using ReClassNET.Project; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Forms { @@ -129,14 +128,14 @@ private void AskAddOrInsertBytes(string title, Action callback) return; } - using (var ib = new InputBytesForm(classNode.MemorySize)) + using var ib = new InputBytesForm(classNode.MemorySize) { - ib.Text = title; + Text = title + }; - if (ib.ShowDialog() == DialogResult.OK) - { - callback(ib.Bytes); - } + if (ib.ShowDialog() == DialogResult.OK) + { + callback(ib.Bytes); } } @@ -190,18 +189,18 @@ public void ClearSelection() /// The path to the selected file or null if no file was selected. public static string ShowOpenProjectFileDialog() { - using (var ofd = new OpenFileDialog()) + using var ofd = new OpenFileDialog { - ofd.CheckFileExists = true; - ofd.Filter = $"All ReClass Types |*{ReClassNetFile.FileExtension};*{ReClassFile.FileExtension};*{ReClassQtFile.FileExtension}" - + $"|{ReClassNetFile.FormatName} (*{ReClassNetFile.FileExtension})|*{ReClassNetFile.FileExtension}" - + $"|{ReClassFile.FormatName} (*{ReClassFile.FileExtension})|*{ReClassFile.FileExtension}" - + $"|{ReClassQtFile.FormatName} (*{ReClassQtFile.FileExtension})|*{ReClassQtFile.FileExtension}"; + CheckFileExists = true, + Filter = $"All ReClass Types |*{ReClassNetFile.FileExtension};*{ReClassFile.FileExtension};*{ReClassQtFile.FileExtension}" + + $"|{ReClassNetFile.FormatName} (*{ReClassNetFile.FileExtension})|*{ReClassNetFile.FileExtension}" + + $"|{ReClassFile.FormatName} (*{ReClassFile.FileExtension})|*{ReClassFile.FileExtension}" + + $"|{ReClassQtFile.FormatName} (*{ReClassQtFile.FileExtension})|*{ReClassQtFile.FileExtension}" + }; - if (ofd.ShowDialog() == DialogResult.OK) - { - return ofd.FileName; - } + if (ofd.ShowDialog() == DialogResult.OK) + { + return ofd.FileName; } return null; @@ -264,7 +263,7 @@ private void LoadAllSymbolsForCurrentProcess() infoToolStripStatusLabel.Visible = true; - int index = 0; + var index = 0; var progress = new Progress>>( report => @@ -365,8 +364,8 @@ private void CopySelectedNodesToClipboard() private void PasteNodeFromClipboardToSelection() { - var result = ReClassClipboard.Paste(CurrentProject, Program.Logger); - foreach (var pastedClassNode in result.Item1) + var (classNodes, nodes) = ReClassClipboard.Paste(CurrentProject, Program.Logger); + foreach (var pastedClassNode in classNodes) { if (!CurrentProject.ContainsClass(pastedClassNode.Uuid)) { @@ -384,7 +383,7 @@ private void PasteNodeFromClipboardToSelection() { containerNode.BeginUpdate(); - foreach (var node in result.Item2) + foreach (var node in nodes) { if (node is BaseWrapperNode) { diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 19a91628..11aa1362 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Diagnostics.Contracts; using System.IO; @@ -164,7 +164,7 @@ private async void MainForm_FormClosing(object sender, FormClosingEventArgs e) } catch { - + // ignored } loadSymbolsTask = null; @@ -178,7 +178,7 @@ private async void MainForm_FormClosing(object sender, FormClosingEventArgs e) } catch { - + // ignored } updateProcessInformationsTask = null; @@ -259,15 +259,14 @@ private void mergeWithProjectToolStripMenuItem_Click(object sender, EventArgs e) private void goToClassToolStripMenuItem_Click(object sender, EventArgs e) { - using (var csf = new ClassSelectionForm(currentProject.Classes.OrderBy(c => c.Name))) + using var csf = new ClassSelectionForm(currentProject.Classes.OrderBy(c => c.Name)); + + if (csf.ShowDialog() == DialogResult.OK) { - if (csf.ShowDialog() == DialogResult.OK) + var selectedClassNode = csf.SelectedClass; + if (selectedClassNode != null) { - var selectedClassNode = csf.SelectedClass; - if (selectedClassNode != null) - { - projectView.SelectedClass = selectedClassNode; - } + projectView.SelectedClass = selectedClassNode; } } } @@ -302,34 +301,32 @@ private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) return; } - using (var sfd = new SaveFileDialog()) + using var sfd = new SaveFileDialog { - sfd.DefaultExt = ReClassNetFile.FileExtension; - sfd.Filter = $"{ReClassNetFile.FormatName} (*{ReClassNetFile.FileExtension})|*{ReClassNetFile.FileExtension}"; + DefaultExt = ReClassNetFile.FileExtension, + Filter = $"{ReClassNetFile.FormatName} (*{ReClassNetFile.FileExtension})|*{ReClassNetFile.FileExtension}" + }; - if (sfd.ShowDialog() == DialogResult.OK) - { - currentProject.Path = sfd.FileName; + if (sfd.ShowDialog() == DialogResult.OK) + { + currentProject.Path = sfd.FileName; - saveToolStripMenuItem_Click(sender, e); - } + saveToolStripMenuItem_Click(sender, e); } } private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { - using (var sd = new SettingsForm(Program.Settings, CurrentProject.TypeMapping)) - { - sd.ShowDialog(); - } + using var sd = new SettingsForm(Program.Settings, CurrentProject.TypeMapping); + + sd.ShowDialog(); } private void pluginsToolStripButton_Click(object sender, EventArgs e) { - using (var pf = new PluginForm(pluginManager)) - { - pf.ShowDialog(); - } + using var pf = new PluginForm(pluginManager); + + pf.ShowDialog(); } private void quitToolStripMenuItem_Click(object sender, EventArgs e) @@ -354,20 +351,21 @@ private void namedAddressesToolStripMenuItem_Click(object sender, EventArgs e) private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) { - using (var ofd = new OpenFileDialog()) + using var ofd = new OpenFileDialog { - ofd.Filter = "Program Debug Database (*.pdb)|*.pdb|All Files (*.*)|*.*"; + Filter = "Program Debug Database (*.pdb)|*.pdb|All Files (*.*)|*.*" + }; + - if (ofd.ShowDialog() == DialogResult.OK) + if (ofd.ShowDialog() == DialogResult.OK) + { + try { - try - { - Program.RemoteProcess.Symbols.LoadSymbolsFromPDB(ofd.FileName); - } - catch (Exception ex) - { - Program.Logger.Log(ex); - } + Program.RemoteProcess.Symbols.LoadSymbolsFromPDB(ofd.FileName); + } + catch (Exception ex) + { + Program.Logger.Log(ex); } } } @@ -414,10 +412,9 @@ private void generateCSharpCodeToolStripMenuItem_Click(object sender, EventArgs private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { - using (var af = new AboutForm()) - { - af.ShowDialog(); - } + using var af = new AboutForm(); + + af.ShowDialog(); } #endregion @@ -426,18 +423,17 @@ private void aboutToolStripMenuItem_Click(object sender, EventArgs e) private void attachToProcessToolStripSplitButton_ButtonClick(object sender, EventArgs e) { - using (var pb = new ProcessBrowserForm(Program.Settings.LastProcess)) + using var pb = new ProcessBrowserForm(Program.Settings.LastProcess); + + if (pb.ShowDialog() == DialogResult.OK) { - if (pb.ShowDialog() == DialogResult.OK) + if (pb.SelectedProcess != null) { - if (pb.SelectedProcess != null) - { - AttachToProcess(pb.SelectedProcess); + AttachToProcess(pb.SelectedProcess); - if (pb.LoadSymbols) - { - LoadAllSymbolsForCurrentProcess(); - } + if (pb.LoadSymbols) + { + LoadAllSymbolsForCurrentProcess(); } } } @@ -819,36 +815,34 @@ private void memoryViewControl_ChangeClassTypeClick(object sender, NodeClickEven Name = "None" }; - using (var csf = new ClassSelectionForm(classes.Prepend(noneClass))) + using var csf = new ClassSelectionForm(classes.Prepend(noneClass)); + + if (csf.ShowDialog() == DialogResult.OK) { - if (csf.ShowDialog() == DialogResult.OK) + var selectedClassNode = csf.SelectedClass; + if (selectedClassNode != null) { - var selectedClassNode = csf.SelectedClass; - if (selectedClassNode != null) + if (selectedClassNode == noneClass) { - if (selectedClassNode == noneClass) - { - selectedClassNode = null; - } - - functionNode.BelongsToClass = selectedClassNode; + selectedClassNode = null; } + + functionNode.BelongsToClass = selectedClassNode; } } } else if (e.Node is BaseWrapperNode refNode) { - using (var csf = new ClassSelectionForm(classes)) + using var csf = new ClassSelectionForm(classes); + + if (csf.ShowDialog() == DialogResult.OK) { - if (csf.ShowDialog() == DialogResult.OK) + var selectedClassNode = csf.SelectedClass; + if (refNode.CanChangeInnerNodeTo(selectedClassNode)) { - var selectedClassNode = csf.SelectedClass; - if (refNode.CanChangeInnerNodeTo(selectedClassNode)) + if (!refNode.GetRootWrapperNode().ShouldPerformCycleCheckForInnerNode() || IsCycleFree(e.Node.GetParentClass(), selectedClassNode)) { - if (!refNode.GetRootWrapperNode().ShouldPerformCycleCheckForInnerNode() || IsCycleFree(e.Node.GetParentClass(), selectedClassNode)) - { - refNode.ChangeInnerNode(selectedClassNode); - } + refNode.ChangeInnerNode(selectedClassNode); } } } @@ -878,26 +872,25 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent { if (e.Node is EnumNode enumNode) { - using (var csf = new EnumSelectionForm(CurrentProject)) - { - var size = enumNode.Enum.Size; + using var csf = new EnumSelectionForm(CurrentProject); - if (csf.ShowDialog() == DialogResult.OK) - { - var @enum = csf.SelectedItem; - if (@enum != null) - { - enumNode.ChangeEnum(@enum); - } - } + var size = enumNode.Enum.Size; - if (size != enumNode.Enum.Size) + if (csf.ShowDialog() == DialogResult.OK) + { + var @enum = csf.SelectedItem; + if (@enum != null) { - // Update the parent container because the enum size has changed. - enumNode.GetParentContainer()?.ChildHasChanged(enumNode); + enumNode.ChangeEnum(@enum); } } + if (size != enumNode.Enum.Size) + { + // Update the parent container because the enum size has changed. + enumNode.GetParentContainer()?.ChildHasChanged(enumNode); + } + foreach (var @enum in CurrentProject.Enums) { projectView.UpdateEnumNode(@enum); @@ -971,10 +964,9 @@ private void deleteClassToolStripMenuItem_Click(object sender, EventArgs e) private void editEnumsToolStripMenuItem_Click(object sender, EventArgs e) { - using (var elf = new EnumListForm(currentProject)) - { - elf.ShowDialog(); - } + using var elf = new EnumListForm(currentProject); + + elf.ShowDialog(); } private void editEnumToolStripMenuItem_Click(object sender, EventArgs e) @@ -982,19 +974,17 @@ private void editEnumToolStripMenuItem_Click(object sender, EventArgs e) var @enum = projectView.SelectedEnum; if (@enum != null) { - using (var eef = new EnumEditorForm(@enum)) - { - eef.ShowDialog(); - } + using var eef = new EnumEditorForm(@enum); + + eef.ShowDialog(); } } private void showEnumsToolStripMenuItem_Click(object sender, EventArgs e) { - using (var elf = new EnumListForm(currentProject)) - { - elf.ShowDialog(); - } + using var elf = new EnumListForm(currentProject); + + elf.ShowDialog(); } private void memoryViewControl_DrawContextRequested(object sender, DrawContextRequestEventArgs args) diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index e3b7cd0f..e347270b 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Data; using System.Diagnostics.Contracts; using System.Drawing; @@ -186,26 +186,23 @@ private void dumpToolStripMenuItem_Click(object sender, EventArgs e) }; } - using (var sfd = createDialogFn()) + using var sfd = createDialogFn(); + sfd.Filter = "All|*.*"; + + if (sfd.ShowDialog() != DialogResult.OK) { - sfd.Filter = "All|*.*"; + return; + } - if (sfd.ShowDialog() != DialogResult.OK) - { - return; - } + try + { + using var stream = sfd.OpenFile(); - try - { - using (var stream = sfd.OpenFile()) - { - dumpFn(process, stream); - } - } - catch (Exception ex) - { - Program.ShowException(ex); - } + dumpFn(process, stream); + } + catch (Exception ex) + { + Program.ShowException(ex); } } @@ -224,10 +221,7 @@ private IntPtr GetSelectedAddress(object sender) { return GetSelectedModule()?.Start ?? IntPtr.Zero; } - else - { - return GetSelectedSection()?.Start ?? IntPtr.Zero; - } + return GetSelectedSection()?.Start ?? IntPtr.Zero; } private static Control GetToolStripSourceControl(object sender) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 3aaed815..ecbd6b96 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Globalization; @@ -206,58 +206,60 @@ private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRe private void openAddressFileToolStripButton_Click(object sender, EventArgs e) { - using (var ofd = new OpenFileDialog()) + using var ofd = new OpenFileDialog { - ofd.CheckFileExists = true; - ofd.Filter = $"All Scanner Types |*{ReClassScanFile.FileExtension};*{CheatEngineFile.FileExtension};*{CrySearchFile.FileExtension}" - + $"|{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" - + $"|{CheatEngineFile.FormatName} (*{CheatEngineFile.FileExtension})|*{CheatEngineFile.FileExtension}" - + $"|{CrySearchFile.FormatName} (*{CrySearchFile.FileExtension})|*{CrySearchFile.FileExtension}"; + CheckFileExists = true, + Filter = $"All Scanner Types |*{ReClassScanFile.FileExtension};*{CheatEngineFile.FileExtension};*{CrySearchFile.FileExtension}" + + $"|{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" + + $"|{CheatEngineFile.FormatName} (*{CheatEngineFile.FileExtension})|*{CheatEngineFile.FileExtension}" + + $"|{CrySearchFile.FormatName} (*{CrySearchFile.FileExtension})|*{CrySearchFile.FileExtension}" + }; - if (ofd.ShowDialog() == DialogResult.OK) + if (ofd.ShowDialog() == DialogResult.OK) + { + IScannerImport import = null; + switch (Path.GetExtension(ofd.FileName)?.ToLower()) + { + case ReClassScanFile.FileExtension: + import = new ReClassScanFile(); + break; + case CheatEngineFile.FileExtension: + import = new CheatEngineFile(); + break; + case CrySearchFile.FileExtension: + import = new CrySearchFile(); + break; + default: + Program.Logger.Log(LogLevel.Error, $"The file '{ofd.FileName}' has an unknown type."); + break; + } + if (import == null) { - IScannerImport import = null; - switch (Path.GetExtension(ofd.FileName)?.ToLower()) + return; + } + + if (addressListMemoryRecordList.Records.Any()) + { + if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { - case ReClassScanFile.FileExtension: - import = new ReClassScanFile(); - break; - case CheatEngineFile.FileExtension: - import = new CheatEngineFile(); - break; - case CrySearchFile.FileExtension: - import = new CrySearchFile(); - break; - default: - Program.Logger.Log(LogLevel.Error, $"The file '{ofd.FileName}' has an unknown type."); - break; + return; } - if (import != null) - { - if (addressListMemoryRecordList.Records.Any()) - { - if (MessageBox.Show("The address list contains addresses. Do you really want to open the file?", $"{Constants.ApplicationName} Scanner", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - { - return; - } - } + } - if (import is ReClassScanFile) - { - addressFilePath = ofd.FileName; - } - - addressListMemoryRecordList.SetRecords( - import.Load(ofd.FileName, Program.Logger) - .Select(r => - { - r.ResolveAddress(process); - r.RefreshValue(process); - return r; - }) - ); - } + if (import is ReClassScanFile) + { + addressFilePath = ofd.FileName; } + + addressListMemoryRecordList.SetRecords( + import.Load(ofd.FileName, Program.Logger) + .Select(r => + { + r.ResolveAddress(process); + r.RefreshValue(process); + return r; + }) + ); } } @@ -286,17 +288,17 @@ private void saveAsToolStripButton_Click(object sender, EventArgs e) return; } - using (var sfd = new SaveFileDialog()) + using var sfd = new SaveFileDialog { - sfd.DefaultExt = ReClassScanFile.FileExtension; - sfd.Filter = $"{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}"; + DefaultExt = ReClassScanFile.FileExtension, + Filter = $"{ReClassScanFile.FormatName} (*{ReClassScanFile.FileExtension})|*{ReClassScanFile.FileExtension}" + }; - if (sfd.ShowDialog() == DialogResult.OK) - { - addressFilePath = sfd.FileName; + if (sfd.ShowDialog() == DialogResult.OK) + { + addressFilePath = sfd.FileName; - saveAddressFileToolStripButton_Click(sender, e); - } + saveAddressFileToolStripButton_Click(sender, e); } } @@ -652,8 +654,8 @@ private ScanSettings CreateSearchSettings() long.TryParse(startAddressTextBox.Text, NumberStyles.HexNumber, null, out var startAddressVar); long.TryParse(stopAddressTextBox.Text, NumberStyles.HexNumber, null, out var endAddressVar); #if RECLASSNET64 - settings.StartAddress = unchecked((IntPtr)startAddressVar); - settings.StopAddress = unchecked((IntPtr)endAddressVar); + settings.StartAddress = (IntPtr)startAddressVar; + settings.StopAddress = (IntPtr)endAddressVar; #else settings.StartAddress = unchecked((IntPtr)(int)startAddressVar); settings.StopAddress = unchecked((IntPtr)(int)endAddressVar); @@ -662,7 +664,7 @@ private ScanSettings CreateSearchSettings() int.TryParse(fastScanAlignmentTextBox.Text, out var alignment); settings.FastScanAlignment = Math.Max(1, alignment); - SettingState CheckStateToSettingState(CheckState state) + static SettingState CheckStateToSettingState(CheckState state) { switch (state) { @@ -701,7 +703,7 @@ private void SetGuiFromSettings(ScanSettings settings) fastScanCheckBox.Checked = settings.EnableFastScan; fastScanAlignmentTextBox.Text = Math.Max(1, settings.FastScanAlignment).ToString(); - CheckState SettingStateToCheckState(SettingState state) + static CheckState SettingStateToCheckState(SettingState state) { switch (state) { diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index 9c3f8a18..9f52cac1 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics; +using System; using System.Diagnostics.Contracts; using System.Windows.Forms; using ReClassNET.Extensions; diff --git a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs index 737554f5..2f094a8b 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Diagnostics; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index ee713f59..ec0b33d3 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Diagnostics; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index 6d2dedd1..b6c68794 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Diagnostics; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index e6fb54ed..6a161fb5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Diagnostics; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index 3f7e7edd..0b35c49f 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Diagnostics; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs index 91b7b840..264229d0 100644 --- a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Diagnostics; using System.Text; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.MemoryScanner.Comparer { diff --git a/ReClass.NET/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs index 6ebd4766..1684cc28 100644 --- a/ReClass.NET/MemoryScanner/ScanResult.cs +++ b/ReClass.NET/MemoryScanner/ScanResult.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Linq; using System.Text; @@ -231,7 +231,7 @@ public override bool Equals(object obj) public bool Equals(ArrayOfBytesScanResult other) { - return other != null && Address == other.Address && Enumerable.SequenceEqual(Value, other.Value); + return other != null && Address == other.Address && Value.SequenceEqual(other.Value); } public override int GetHashCode() diff --git a/ReClass.NET/Native/NativeMethods.Windows.cs b/ReClass.NET/Native/NativeMethods.Windows.cs index 36e25d13..5b5ce08e 100644 --- a/ReClass.NET/Native/NativeMethods.Windows.cs +++ b/ReClass.NET/Native/NativeMethods.Windows.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Runtime.InteropServices; @@ -231,9 +231,9 @@ public void UnregisterExtension(string fileExtension, string extensionId) ShChangeNotify(); } - catch (Exception) + catch { - + // ignored } } @@ -243,9 +243,9 @@ private static void ShChangeNotify() { SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero); } - catch (Exception) + catch { - + // ignored } } @@ -268,9 +268,9 @@ public static void SetButtonShield(Button button, bool setShield) SendMessage(h, BCM_SETSHIELD, IntPtr.Zero, (IntPtr)(setShield ? 1 : 0)); } - catch (Exception) + catch { - + // ignored } } } diff --git a/ReClass.NET/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs index 8bb7bbf1..a7e1c6f6 100644 --- a/ReClass.NET/Nodes/BaseFunctionNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; @@ -17,8 +17,8 @@ protected class FunctionNodeInstruction public string Instruction { get; set; } } - protected IntPtr address = IntPtr.Zero; - protected readonly List instructions = new List(); + protected IntPtr Address = IntPtr.Zero; + protected readonly List Instructions = new List(); protected Size DrawInstructions(ViewInfo view, int tx, int y) { @@ -31,7 +31,7 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) using (var brush = new SolidBrush(view.Settings.HiddenColor)) { - foreach (var instruction in instructions) + foreach (var instruction in Instructions) { y += view.Font.Height; @@ -65,7 +65,7 @@ protected void DisassembleRemoteCode(RemoteProcess process, IntPtr address, out { memorySize += instruction.Length; - instructions.Add(new FunctionNodeInstruction + Instructions.Add(new FunctionNodeInstruction { Address = instruction.Address.ToString(Constants.AddressHexFormat), Data = string.Join(" ", instruction.Data.Take(instruction.Length).Select(b => $"{b:X2}")), diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index a94e5e2a..578b0a43 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; -using ReClassNET.Util; namespace ReClassNET.Nodes { @@ -19,7 +18,7 @@ public override string GetToolTipText(HotSpot spot) DisassembleRemoteCode(spot.Process, ptr); - return string.Join("\n", instructions.Select(i => i.Instruction)); + return string.Join("\n", Instructions.Select(i => i.Instruction)); } protected Size Draw(ViewInfo view, int x, int y, string type, string name) @@ -102,7 +101,7 @@ public override int CalculateDrawnHeight(ViewInfo view) var height = view.Font.Height; if (LevelsOpen[view.Level]) { - height += instructions.Count * view.Font.Height; + height += Instructions.Count * view.Font.Height; } return height; } @@ -111,11 +110,11 @@ private void DisassembleRemoteCode(RemoteProcess process, IntPtr address) { Contract.Requires(process != null); - if (this.address != address) + if (this.Address != address) { - instructions.Clear(); + Instructions.Clear(); - this.address = address; + this.Address = address; if (!address.IsNull() && process.IsValid) { diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 1a7d7991..19cd948f 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.Extensions; -using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; @@ -16,7 +15,7 @@ namespace ReClassNET.Nodes [ContractClass(typeof(BaseNodeContract))] public abstract class BaseNode { - private string DebuggerDisplay => $"Type: {GetType().Name} Name: {Name} Offset: 0x{Offset.ToString("X")}"; + private string DebuggerDisplay => $"Type: {GetType().Name} Name: {Name} Offset: 0x{Offset:X}"; internal static readonly List NodeInfoReader = new List(); @@ -375,10 +374,9 @@ protected void AddSelection(ViewInfo view, int x, int y, int height) if (IsSelected) { - using (var brush = new SolidBrush(view.Settings.SelectedColor)) - { - view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, height); - } + using var brush = new SolidBrush(view.Settings.SelectedColor); + + view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, height); } AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index a8682dac..c968a59c 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Drawing; -using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index b4cd4b62..867d7c26 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; @@ -27,7 +27,7 @@ public override string GetToolTipText(HotSpot spot) { DisassembleRemoteCode(spot.Process, spot.Address); - return string.Join("\n", instructions.Select(i => i.Instruction)); + return string.Join("\n", Instructions.Select(i => i.Instruction)); } public override Size Draw(ViewInfo view, int x, int y) @@ -103,7 +103,7 @@ public override int CalculateDrawnHeight(ViewInfo view) var height = view.Font.Height; if (LevelsOpen[view.Level]) { - height += instructions.Count * view.Font.Height; + height += Instructions.Count * view.Font.Height; } return height; } @@ -122,11 +122,11 @@ private void DisassembleRemoteCode(RemoteProcess process, IntPtr address) { Contract.Requires(process != null); - if (this.address != address) + if (this.Address != address) { - instructions.Clear(); + Instructions.Clear(); - this.address = address; + this.Address = address; if (!address.IsNull() && process.IsValid) { diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index 75337e96..e1e903bd 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -1,5 +1,4 @@ -using System.Drawing; -using ReClassNET.Memory; +using System.Drawing; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index 6d6b87f1..68366ad7 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes public class Matrix3x3Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Matrix3x3Data + private readonly struct Matrix3x3Data { [FieldOffset(0)] public readonly float _11; diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index d00322da..093e8d81 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes public class Matrix3x4Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Matrix3x4Data + private readonly struct Matrix3x4Data { [FieldOffset(0)] public readonly float _11; diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index a2adb2f0..40f23531 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes public class Matrix4x4Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Matrix4x4Data + private readonly struct Matrix4x4Data { [FieldOffset(0)] public readonly float _11; diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index b0b1643e..b23809e1 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -1,4 +1,4 @@ -using System.Drawing; +using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -7,7 +7,7 @@ namespace ReClassNET.Nodes public class Vector2Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Vector2Data + private readonly struct Vector2Data { [FieldOffset(0)] public readonly float X; diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index 99c14b49..6b174376 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -1,4 +1,4 @@ -using System.Drawing; +using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -7,7 +7,7 @@ namespace ReClassNET.Nodes public class Vector3Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Vector3Data + private readonly struct Vector3Data { [FieldOffset(0)] public readonly float X; diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 2fc086b4..0bc97dbd 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -1,4 +1,4 @@ -using System.Drawing; +using System.Drawing; using System.Runtime.InteropServices; using ReClassNET.UI; @@ -7,7 +7,7 @@ namespace ReClassNET.Nodes public class Vector4Node : BaseMatrixNode { [StructLayout(LayoutKind.Explicit)] - private struct Vector4Data + private readonly struct Vector4Data { [FieldOffset(0)] public readonly float X; diff --git a/ReClass.NET/Plugins/PluginInfo.cs b/ReClass.NET/Plugins/PluginInfo.cs index ccf29df2..c9c9e72f 100644 --- a/ReClass.NET/Plugins/PluginInfo.cs +++ b/ReClass.NET/Plugins/PluginInfo.cs @@ -79,7 +79,7 @@ public void Dispose() } catch { - + // ignored } } diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index 0247418a..65ea6838 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -47,7 +47,7 @@ static void Main(string[] args) } catch { - + // ignored } MonoSpaceFont = new FontEx @@ -69,7 +69,7 @@ static void Main(string[] args) if (!NativeMethods.IsUnix() && Settings.RunAsAdmin && !WinUtil.IsAdministrator) { - WinUtil.RunElevated(Process.GetCurrentProcess().MainModule.FileName, args.Length > 0 ? string.Join(" ", args) : null); + WinUtil.RunElevated(Process.GetCurrentProcess().MainModule?.FileName, args.Length > 0 ? string.Join(" ", args) : null); return; } diff --git a/ReClass.NET/Symbols/ComDisposableWrapper.cs b/ReClass.NET/Symbols/ComDisposableWrapper.cs index aedd3224..8666bb75 100644 --- a/ReClass.NET/Symbols/ComDisposableWrapper.cs +++ b/ReClass.NET/Symbols/ComDisposableWrapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Runtime.InteropServices; @@ -6,26 +6,26 @@ namespace ReClassNET.Symbols { class DisposableWrapper : IDisposable { - protected object obj; + protected object Object; [ContractInvariantMethod] private void ObjectInvariants() { - Contract.Invariant(obj != null); + Contract.Invariant(Object != null); } public DisposableWrapper(object obj) { Contract.Requires(obj != null); - this.obj = obj; + this.Object = obj; } protected virtual void Dispose(bool disposing) { if (disposing) { - Marshal.ReleaseComObject(obj); + Marshal.ReleaseComObject(Object); } } @@ -44,7 +44,7 @@ public void Dispose() class ComDisposableWrapper : DisposableWrapper { - public T Interface => (T)obj; + public T Interface => (T)Object; public ComDisposableWrapper(T com) : base(com) diff --git a/ReClass.NET/Symbols/SymbolStore.cs b/ReClass.NET/Symbols/SymbolStore.cs index 4992c558..80aee721 100644 --- a/ReClass.NET/Symbols/SymbolStore.cs +++ b/ReClass.NET/Symbols/SymbolStore.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; @@ -9,22 +9,21 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Native; -using ReClassNET.Util; namespace ReClassNET.Symbols { class DiaUtil : IDisposable { - public readonly IDiaDataSource diaDataSource; - public readonly IDiaSession diaSession; + public readonly IDiaDataSource DiaDataSource; + public readonly IDiaSession DiaSession; public DiaUtil(string pdbName) { Contract.Requires(pdbName != null); - diaDataSource = new DiaSource(); - diaDataSource.loadDataFromPdb(pdbName); - diaDataSource.openSession(out diaSession); + DiaDataSource = new DiaSource(); + DiaDataSource.loadDataFromPdb(pdbName); + DiaDataSource.openSession(out DiaSession); } private bool isDisposed; @@ -33,8 +32,8 @@ protected virtual void Dispose(bool disposing) { if (!isDisposed) { - Marshal.ReleaseComObject(diaSession); - Marshal.ReleaseComObject(diaDataSource); + Marshal.ReleaseComObject(DiaSession); + Marshal.ReleaseComObject(DiaDataSource); isDisposed = true; } diff --git a/ReClass.NET/UI/BannerBox.cs b/ReClass.NET/UI/BannerBox.cs index c20c541e..ca8eb6e5 100644 --- a/ReClass.NET/UI/BannerBox.cs +++ b/ReClass.NET/UI/BannerBox.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -79,7 +79,7 @@ private void UpdateBanner() } catch { - + // ignored } } } diff --git a/ReClass.NET/UI/BannerFactory.cs b/ReClass.NET/UI/BannerFactory.cs index 7e4c697d..87448e09 100644 --- a/ReClass.NET/UI/BannerFactory.cs +++ b/ReClass.NET/UI/BannerFactory.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; @@ -113,13 +113,10 @@ public static Image CreateBanner(int bannerWidth, int bannerHeight, Image icon, private static void DrawText(Graphics g, string text, int x, int y, Font font, Color color) { - using (var brush = new SolidBrush(color)) - { - using (var format = new StringFormat(StringFormatFlags.FitBlackBox | StringFormatFlags.NoClip)) - { - g.DrawString(text, font, brush, x, y, format); - } - } + using var brush = new SolidBrush(color); + using var format = new StringFormat(StringFormatFlags.FitBlackBox | StringFormatFlags.NoClip); + + g.DrawString(text, font, brush, x, y, format); } private static int DpiScaleInt(int x, int height) => (int)Math.Round((x * height) / (double)StdHeight); diff --git a/ReClass.NET/UI/ColorBox.cs b/ReClass.NET/UI/ColorBox.cs index 97148fff..d51efdaa 100644 --- a/ReClass.NET/UI/ColorBox.cs +++ b/ReClass.NET/UI/ColorBox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Drawing; @@ -77,22 +77,21 @@ private void OnTextChanged(object sender, EventArgs e) } catch { - + // ignored } } private void OnPanelClick(object sender, EventArgs e) { - using (var cd = new ColorDialog + using var cd = new ColorDialog { FullOpen = true, Color = Color - }) + }; + + if (cd.ShowDialog() == DialogResult.OK) { - if (cd.ShowDialog() == DialogResult.OK) - { - Color = cd.Color; - } + Color = cd.Color; } } diff --git a/ReClass.NET/UI/DpiUtil.cs b/ReClass.NET/UI/DpiUtil.cs index 398a090f..c3fb88c2 100644 --- a/ReClass.NET/UI/DpiUtil.cs +++ b/ReClass.NET/UI/DpiUtil.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Drawing.Drawing2D; @@ -43,21 +43,19 @@ private static void EnsureInitialized() try { - using (var g = Graphics.FromHwnd(IntPtr.Zero)) + using var g = Graphics.FromHwnd(IntPtr.Zero); + dpiX = (int)g.DpiX; + dpiY = (int)g.DpiY; + + if (dpiX <= 0 || dpiY <= 0) { - dpiX = (int)g.DpiX; - dpiY = (int)g.DpiY; - - if (dpiX <= 0 || dpiY <= 0) - { - dpiX = StdDpi; - dpiY = StdDpi; - } + dpiX = StdDpi; + dpiY = StdDpi; } } catch { - + // ignored } scaleX = dpiX / (double)StdDpi; @@ -111,34 +109,32 @@ private static Image ScaleImage(Image img, int w, int h) Contract.Requires(w >= 0); Contract.Requires(h >= 0); - var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); - using (Graphics g = Graphics.FromImage(bmp)) - { - g.Clear(Color.Transparent); + using var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(bmp); + g.Clear(Color.Transparent); - g.SmoothingMode = SmoothingMode.HighQuality; - g.CompositingQuality = CompositingQuality.HighQuality; + g.SmoothingMode = SmoothingMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; - var wSrc = img.Width; - var hSrc = img.Height; + var wSrc = img.Width; + var hSrc = img.Height; - InterpolationMode im = InterpolationMode.HighQualityBicubic; - if (wSrc > 0 && hSrc > 0) + var im = InterpolationMode.HighQualityBicubic; + if (wSrc > 0 && hSrc > 0) + { + if ((w % wSrc) == 0 && (h % hSrc) == 0) { - if ((w % wSrc) == 0 && (h % hSrc) == 0) - { - im = InterpolationMode.NearestNeighbor; - } + im = InterpolationMode.NearestNeighbor; } + } - g.InterpolationMode = im; + g.InterpolationMode = im; - var rSource = new RectangleF(0.0f, 0.0f, wSrc, hSrc); - var rDest = new RectangleF(0.0f, 0.0f, w, h); - AdjustScaleRects(ref rSource, ref rDest); + var rSource = new RectangleF(0.0f, 0.0f, wSrc, hSrc); + var rDest = new RectangleF(0.0f, 0.0f, w, h); + AdjustScaleRects(ref rSource, ref rDest); - g.DrawImage(img, rDest, rSource, GraphicsUnit.Pixel); - } + g.DrawImage(img, rDest, rSource, GraphicsUnit.Pixel); return bmp; } diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/UI/EnumComboBox.cs index c22fb6e7..b0567ead 100644 --- a/ReClass.NET/UI/EnumComboBox.cs +++ b/ReClass.NET/UI/EnumComboBox.cs @@ -1,10 +1,9 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; using ReClassNET.Extensions; -using ReClassNET.Util; namespace ReClassNET.UI { @@ -52,7 +51,7 @@ public class EnumComboBox : ComboBox where TEnum : struct [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new TEnum SelectedValue { - get => ((EnumDescriptionDisplay)base.SelectedItem)?.Value ?? default(TEnum); + get => ((EnumDescriptionDisplay)base.SelectedItem)?.Value ?? default; set => base.SelectedItem = base.Items.Cast>().PredicateOrFirst(e => e.Value.Equals(value)); } diff --git a/ReClass.NET/UI/IconButton.cs b/ReClass.NET/UI/IconButton.cs index d3331c2c..c2d80304 100644 --- a/ReClass.NET/UI/IconButton.cs +++ b/ReClass.NET/UI/IconButton.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Drawing; @@ -100,18 +100,16 @@ private void RenderButtonBackground(Graphics g) else { drawHotBorder = false; - using (var brush = new SolidBrush(BackColor)) - { - g.FillRectangle(brush, bounds); - } + using var brush = new SolidBrush(BackColor); + + g.FillRectangle(brush, bounds); } if (drawHotBorder) { - using (var pen = new Pen(colorTable.ButtonSelectedBorder)) - { - g.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); - } + using var pen = new Pen(colorTable.ButtonSelectedBorder); + + g.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); } } @@ -124,10 +122,9 @@ private void RenderPressedButtonFill(Graphics g, Rectangle bounds) return; } - using (var brush = new LinearGradientBrush(bounds, colorTable.ButtonPressedGradientBegin, colorTable.ButtonPressedGradientEnd, LinearGradientMode.Vertical)) - { - g.FillRectangle(brush, bounds); - } + using var brush = new LinearGradientBrush(bounds, colorTable.ButtonPressedGradientBegin, colorTable.ButtonPressedGradientEnd, LinearGradientMode.Vertical); + + g.FillRectangle(brush, bounds); } private void RenderSelectedButtonFill(Graphics g, Rectangle bounds) @@ -139,10 +136,9 @@ private void RenderSelectedButtonFill(Graphics g, Rectangle bounds) return; } - using (var brush = new LinearGradientBrush(bounds, colorTable.ButtonSelectedGradientBegin, colorTable.ButtonSelectedGradientEnd, LinearGradientMode.Vertical)) - { - g.FillRectangle(brush, bounds); - } + using var brush = new LinearGradientBrush(bounds, colorTable.ButtonSelectedGradientBegin, colorTable.ButtonSelectedGradientEnd, LinearGradientMode.Vertical); + + g.FillRectangle(brush, bounds); } private void RenderImage(Graphics g) diff --git a/ReClass.NET/UI/LinkedWindowFeatures.cs b/ReClass.NET/UI/LinkedWindowFeatures.cs index 14eeb691..36dab03e 100644 --- a/ReClass.NET/UI/LinkedWindowFeatures.cs +++ b/ReClass.NET/UI/LinkedWindowFeatures.cs @@ -1,15 +1,12 @@ -using System; -using System.Collections.Generic; +using System; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; -using ReClassNET.CodeGenerator; using ReClassNET.Debugger; using ReClassNET.Forms; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; using ReClassNET.Nodes; -using ReClassNET.Project; namespace ReClassNET.UI { diff --git a/ReClass.NET/UI/MemoryRecordList.cs b/ReClass.NET/UI/MemoryRecordList.cs index f3d63b92..4bd53773 100644 --- a/ReClass.NET/UI/MemoryRecordList.cs +++ b/ReClass.NET/UI/MemoryRecordList.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Drawing; @@ -7,7 +7,6 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.MemoryScanner; -using ReClassNET.Util; namespace ReClassNET.UI { diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index b896e785..e5e85161 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; using System.Windows.Forms; -using ReClassNET.Extensions; using ReClassNET.Nodes; using ReClassNET.Plugins; diff --git a/ReClass.NET/UI/PlaceholderTextBox.cs b/ReClass.NET/UI/PlaceholderTextBox.cs index d0ac5d25..282bb08d 100644 --- a/ReClass.NET/UI/PlaceholderTextBox.cs +++ b/ReClass.NET/UI/PlaceholderTextBox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -66,10 +66,9 @@ protected override void OnPaint(PaintEventArgs e) if (string.IsNullOrEmpty(Text) && Focused == false) { - using (var brush = new SolidBrush(PlaceholderColor)) - { - e.Graphics.DrawString(PlaceholderText ?? string.Empty, Font, brush, new PointF(-1.0f, 1.0f)); - } + using var brush = new SolidBrush(PlaceholderColor); + + e.Graphics.DrawString(PlaceholderText ?? string.Empty, Font, brush, new PointF(-1.0f, 1.0f)); } } } diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/UI/ProjectView.cs index 9be2363d..94d1f27d 100644 --- a/ReClass.NET/UI/ProjectView.cs +++ b/ReClass.NET/UI/ProjectView.cs @@ -1,9 +1,8 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; -using System.Runtime.Remoting.Contexts; using System.Windows.Forms; using ReClassNET.Extensions; using ReClassNET.Nodes; diff --git a/ReClass.NET/Util/CircularBuffer.cs b/ReClass.NET/Util/CircularBuffer.cs index 4a802c6a..4a10ae72 100644 --- a/ReClass.NET/Util/CircularBuffer.cs +++ b/ReClass.NET/Util/CircularBuffer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; @@ -56,7 +56,7 @@ public T Dequeue() } var dequeued = buffer[head]; - buffer[head] = default(T); + buffer[head] = default; if (head == 0) { head = Capacity - 1; diff --git a/ReClass.NET/Util/HexadecimalFormatter.cs b/ReClass.NET/Util/HexadecimalFormatter.cs index 6e4fa50c..18f6e907 100644 --- a/ReClass.NET/Util/HexadecimalFormatter.cs +++ b/ReClass.NET/Util/HexadecimalFormatter.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; namespace ReClassNET.Util { @@ -12,7 +12,7 @@ private static uint[] CreateHexLookup() for (var i = 0; i < 256; i++) { var s = i.ToString("X2"); - result[i] = (uint)s[0] + ((uint)s[1] << 16); + result[i] = s[0] + ((uint)s[1] << 16); } return result; } diff --git a/ReClass.NET/Util/PathUtil.cs b/ReClass.NET/Util/PathUtil.cs index f4170bf5..e8823d5d 100644 --- a/ReClass.NET/Util/PathUtil.cs +++ b/ReClass.NET/Util/PathUtil.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.IO; using System.Reflection; @@ -14,9 +14,9 @@ public class PathUtil { path = Assembly.GetExecutingAssembly().Location; } - catch (Exception) + catch { - + // ignored } if (string.IsNullOrEmpty(path)) diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index 20334875..4015722d 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; -using ReClassNET.Extensions; namespace ReClassNET.Util.Rtf { diff --git a/ReClass.NET/Util/SettingsSerializer.cs b/ReClass.NET/Util/SettingsSerializer.cs index 8376e2e6..2a5a4e82 100644 --- a/ReClass.NET/Util/SettingsSerializer.cs +++ b/ReClass.NET/Util/SettingsSerializer.cs @@ -1,4 +1,3 @@ -using System; using System.Diagnostics.Contracts; using System.IO; using System.Xml.Linq; @@ -25,61 +24,60 @@ public static Settings Load() { var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); - using (var sr = new StreamReader(path)) + using var sr = new StreamReader(path); + + var document = XDocument.Load(sr); + var root = document.Root; + + var general = root?.Element(XmlGeneralElement); + if (general != null) + { + XElementSerializer.TryRead(general, nameof(settings.LastProcess), e => settings.LastProcess = XElementSerializer.ToString(e)); + XElementSerializer.TryRead(general, nameof(settings.StayOnTop), e => settings.StayOnTop = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(general, nameof(settings.RunAsAdmin), e => settings.RunAsAdmin = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(general, nameof(settings.RandomizeWindowTitle), e => settings.RandomizeWindowTitle = XElementSerializer.ToBool(e)); + } + var display = root?.Element(XmlDisplayElement); + if (display != null) + { + XElementSerializer.TryRead(display, nameof(settings.ShowNodeAddress), e => settings.ShowNodeAddress = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowNodeOffset), e => settings.ShowNodeOffset = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowNodeText), e => settings.ShowNodeText = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.HighlightChangedValues), e => settings.HighlightChangedValues = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentFloat), e => settings.ShowCommentFloat = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentInteger), e => settings.ShowCommentInteger = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentPointer), e => settings.ShowCommentPointer = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentRtti), e => settings.ShowCommentRtti = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentSymbol), e => settings.ShowCommentSymbol = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentString), e => settings.ShowCommentString = XElementSerializer.ToBool(e)); + XElementSerializer.TryRead(display, nameof(settings.ShowCommentPluginInfo), e => settings.ShowCommentPluginInfo = XElementSerializer.ToBool(e)); + } + var colors = root?.Element(XmlColorsElement); + if (colors != null) + { + XElementSerializer.TryRead(colors, nameof(settings.BackgroundColor), e => settings.BackgroundColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.SelectedColor), e => settings.SelectedColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.HiddenColor), e => settings.HiddenColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.OffsetColor), e => settings.OffsetColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.AddressColor), e => settings.AddressColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.HexColor), e => settings.HexColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.TypeColor), e => settings.TypeColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.NameColor), e => settings.NameColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.ValueColor), e => settings.ValueColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.IndexColor), e => settings.IndexColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.CommentColor), e => settings.CommentColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.TextColor), e => settings.TextColor = XElementSerializer.ToColor(e)); + XElementSerializer.TryRead(colors, nameof(settings.VTableColor), e => settings.VTableColor = XElementSerializer.ToColor(e)); + } + var customData = root?.Element(XmlCustomDataElement); + if (customData != null) { - var document = XDocument.Load(sr); - var root = document.Root; - - var general = root?.Element(XmlGeneralElement); - if (general != null) - { - XElementSerializer.TryRead(general, nameof(settings.LastProcess), e => settings.LastProcess = XElementSerializer.ToString(e)); - XElementSerializer.TryRead(general, nameof(settings.StayOnTop), e => settings.StayOnTop = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(general, nameof(settings.RunAsAdmin), e => settings.RunAsAdmin = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(general, nameof(settings.RandomizeWindowTitle), e => settings.RandomizeWindowTitle = XElementSerializer.ToBool(e)); - } - var display = root?.Element(XmlDisplayElement); - if (display != null) - { - XElementSerializer.TryRead(display, nameof(settings.ShowNodeAddress), e => settings.ShowNodeAddress = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowNodeOffset), e => settings.ShowNodeOffset = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowNodeText), e => settings.ShowNodeText = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.HighlightChangedValues), e => settings.HighlightChangedValues = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentFloat), e => settings.ShowCommentFloat = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentInteger), e => settings.ShowCommentInteger = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentPointer), e => settings.ShowCommentPointer = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentRtti), e => settings.ShowCommentRtti = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentSymbol), e => settings.ShowCommentSymbol = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentString), e => settings.ShowCommentString = XElementSerializer.ToBool(e)); - XElementSerializer.TryRead(display, nameof(settings.ShowCommentPluginInfo), e => settings.ShowCommentPluginInfo = XElementSerializer.ToBool(e)); - } - var colors = root?.Element(XmlColorsElement); - if (colors != null) - { - XElementSerializer.TryRead(colors, nameof(settings.BackgroundColor), e => settings.BackgroundColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.SelectedColor), e => settings.SelectedColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.HiddenColor), e => settings.HiddenColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.OffsetColor), e => settings.OffsetColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.AddressColor), e => settings.AddressColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.HexColor), e => settings.HexColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.TypeColor), e => settings.TypeColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.NameColor), e => settings.NameColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.ValueColor), e => settings.ValueColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.IndexColor), e => settings.IndexColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.CommentColor), e => settings.CommentColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.TextColor), e => settings.TextColor = XElementSerializer.ToColor(e)); - XElementSerializer.TryRead(colors, nameof(settings.VTableColor), e => settings.VTableColor = XElementSerializer.ToColor(e)); - } - var customData = root?.Element(XmlCustomDataElement); - if (customData != null) - { - settings.CustomData.Deserialize(customData); - } + settings.CustomData.Deserialize(customData); } } catch { - + // ignored } return settings; @@ -97,56 +95,55 @@ public static void Save(Settings settings) var path = Path.Combine(PathUtil.SettingsFolderPath, Constants.SettingsFile); - using (var sw = new StreamWriter(path)) - { - var document = new XDocument( - new XComment($"{Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"), - new XComment($"Website: {Constants.HomepageUrl}"), + using var sw = new StreamWriter(path); + + var document = new XDocument( + new XComment($"{Constants.ApplicationName} {Constants.ApplicationVersion} by {Constants.Author}"), + new XComment($"Website: {Constants.HomepageUrl}"), + new XElement( + XmlRootElement, new XElement( - XmlRootElement, - new XElement( - XmlGeneralElement, - XElementSerializer.ToXml(nameof(settings.LastProcess), settings.LastProcess), - XElementSerializer.ToXml(nameof(settings.StayOnTop), settings.StayOnTop), - XElementSerializer.ToXml(nameof(settings.RunAsAdmin), settings.RunAsAdmin), - XElementSerializer.ToXml(nameof(settings.RandomizeWindowTitle), settings.RandomizeWindowTitle) - ), - new XElement( - XmlDisplayElement, - XElementSerializer.ToXml(nameof(settings.ShowNodeAddress), settings.ShowNodeAddress), - XElementSerializer.ToXml(nameof(settings.ShowNodeOffset), settings.ShowNodeOffset), - XElementSerializer.ToXml(nameof(settings.ShowNodeText), settings.ShowNodeText), - XElementSerializer.ToXml(nameof(settings.HighlightChangedValues), settings.HighlightChangedValues), - XElementSerializer.ToXml(nameof(settings.ShowCommentFloat), settings.ShowCommentFloat), - XElementSerializer.ToXml(nameof(settings.ShowCommentInteger), settings.ShowCommentInteger), - XElementSerializer.ToXml(nameof(settings.ShowCommentPointer), settings.ShowCommentPointer), - XElementSerializer.ToXml(nameof(settings.ShowCommentRtti), settings.ShowCommentRtti), - XElementSerializer.ToXml(nameof(settings.ShowCommentSymbol), settings.ShowCommentSymbol), - XElementSerializer.ToXml(nameof(settings.ShowCommentString), settings.ShowCommentString), - XElementSerializer.ToXml(nameof(settings.ShowCommentPluginInfo), settings.ShowCommentPluginInfo) - ), - new XElement( - XmlColorsElement, - XElementSerializer.ToXml(nameof(settings.BackgroundColor), settings.BackgroundColor), - XElementSerializer.ToXml(nameof(settings.SelectedColor), settings.SelectedColor), - XElementSerializer.ToXml(nameof(settings.HiddenColor), settings.HiddenColor), - XElementSerializer.ToXml(nameof(settings.OffsetColor), settings.OffsetColor), - XElementSerializer.ToXml(nameof(settings.AddressColor), settings.AddressColor), - XElementSerializer.ToXml(nameof(settings.HexColor), settings.HexColor), - XElementSerializer.ToXml(nameof(settings.TypeColor), settings.TypeColor), - XElementSerializer.ToXml(nameof(settings.NameColor), settings.NameColor), - XElementSerializer.ToXml(nameof(settings.ValueColor), settings.ValueColor), - XElementSerializer.ToXml(nameof(settings.IndexColor), settings.IndexColor), - XElementSerializer.ToXml(nameof(settings.CommentColor), settings.CommentColor), - XElementSerializer.ToXml(nameof(settings.TextColor), settings.TextColor), - XElementSerializer.ToXml(nameof(settings.VTableColor), settings.VTableColor) - ), - settings.CustomData.Serialize(XmlCustomDataElement) - ) - ); - - document.Save(sw); - } + XmlGeneralElement, + XElementSerializer.ToXml(nameof(settings.LastProcess), settings.LastProcess), + XElementSerializer.ToXml(nameof(settings.StayOnTop), settings.StayOnTop), + XElementSerializer.ToXml(nameof(settings.RunAsAdmin), settings.RunAsAdmin), + XElementSerializer.ToXml(nameof(settings.RandomizeWindowTitle), settings.RandomizeWindowTitle) + ), + new XElement( + XmlDisplayElement, + XElementSerializer.ToXml(nameof(settings.ShowNodeAddress), settings.ShowNodeAddress), + XElementSerializer.ToXml(nameof(settings.ShowNodeOffset), settings.ShowNodeOffset), + XElementSerializer.ToXml(nameof(settings.ShowNodeText), settings.ShowNodeText), + XElementSerializer.ToXml(nameof(settings.HighlightChangedValues), settings.HighlightChangedValues), + XElementSerializer.ToXml(nameof(settings.ShowCommentFloat), settings.ShowCommentFloat), + XElementSerializer.ToXml(nameof(settings.ShowCommentInteger), settings.ShowCommentInteger), + XElementSerializer.ToXml(nameof(settings.ShowCommentPointer), settings.ShowCommentPointer), + XElementSerializer.ToXml(nameof(settings.ShowCommentRtti), settings.ShowCommentRtti), + XElementSerializer.ToXml(nameof(settings.ShowCommentSymbol), settings.ShowCommentSymbol), + XElementSerializer.ToXml(nameof(settings.ShowCommentString), settings.ShowCommentString), + XElementSerializer.ToXml(nameof(settings.ShowCommentPluginInfo), settings.ShowCommentPluginInfo) + ), + new XElement( + XmlColorsElement, + XElementSerializer.ToXml(nameof(settings.BackgroundColor), settings.BackgroundColor), + XElementSerializer.ToXml(nameof(settings.SelectedColor), settings.SelectedColor), + XElementSerializer.ToXml(nameof(settings.HiddenColor), settings.HiddenColor), + XElementSerializer.ToXml(nameof(settings.OffsetColor), settings.OffsetColor), + XElementSerializer.ToXml(nameof(settings.AddressColor), settings.AddressColor), + XElementSerializer.ToXml(nameof(settings.HexColor), settings.HexColor), + XElementSerializer.ToXml(nameof(settings.TypeColor), settings.TypeColor), + XElementSerializer.ToXml(nameof(settings.NameColor), settings.NameColor), + XElementSerializer.ToXml(nameof(settings.ValueColor), settings.ValueColor), + XElementSerializer.ToXml(nameof(settings.IndexColor), settings.IndexColor), + XElementSerializer.ToXml(nameof(settings.CommentColor), settings.CommentColor), + XElementSerializer.ToXml(nameof(settings.TextColor), settings.TextColor), + XElementSerializer.ToXml(nameof(settings.VTableColor), settings.VTableColor) + ), + settings.CustomData.Serialize(XmlCustomDataElement) + ) + ); + + document.Save(sw); } #endregion @@ -160,9 +157,9 @@ private static void EnsureSettingsDirectoryAvailable() Directory.CreateDirectory(PathUtil.SettingsFolderPath); } } - catch (Exception) + catch { - + // ignored } } } diff --git a/ReClass.NET/Util/Util.cs b/ReClass.NET/Util/Util.cs index 15859b6d..a2f79378 100644 --- a/ReClass.NET/Util/Util.cs +++ b/ReClass.NET/Util/Util.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -33,7 +33,7 @@ public static T Max(T item1, T item2, Func keySelector) where U : IC return Max(item1, item2, keySelector, Comparer.Default); } - public static T Max(T item1, T item2, Func keySelector, IComparer comparer) + public static T1 Max(T1 item1, T1 item2, Func keySelector, IComparer comparer) { Contract.Requires(keySelector != null); Contract.Requires(comparer != null); @@ -55,8 +55,8 @@ public static void Swap(ref T lhs, ref T rhs) //thx again stack overflow https://stackoverflow.com/a/1344242 public static string RandomString(int length) { - const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - return new string(Enumerable.Repeat(chars, length) + const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + return new string(Enumerable.Repeat(Chars, length) .Select(s => s[Program.GlobalRandom.Next(s.Length)]).ToArray()); } } diff --git a/ReClass.NET/Util/WinUtil.cs b/ReClass.NET/Util/WinUtil.cs index 8c8fbaf9..8173c315 100644 --- a/ReClass.NET/Util/WinUtil.cs +++ b/ReClass.NET/Util/WinUtil.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Diagnostics.Contracts; using System.Security.Principal; @@ -43,21 +43,19 @@ static WinUtil() try { - using (var rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false)) + using var rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false); + if (rk != null) { - if (rk != null) + var str = rk.GetValue("CurrentMajorVersionNumber", string.Empty)?.ToString(); + if (uint.TryParse(str, out var u)) { - var str = rk.GetValue("CurrentMajorVersionNumber", string.Empty)?.ToString(); - if (uint.TryParse(str, out var u)) - { - IsAtLeastWindows10 = u >= 10; - } + IsAtLeastWindows10 = u >= 10; } } } catch { - + // ignored } } From bc67ff6f36f81ac4fdb61d25b34503dde0522880 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 14:45:23 +0200 Subject: [PATCH 688/777] Fixed wrong byte size. --- ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs index 264229d0..2e457306 100644 --- a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -25,7 +25,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) { result = null; - var value = Encoding.GetString(data, index, Value.Length); + var value = Encoding.GetString(data, index, ValueSize); if (!Value.Equals(value, CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase)) { From 01239e5b3523046cc5aad496c3a35f2890519403 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 19:18:31 +0200 Subject: [PATCH 689/777] Extracted interface IScannerWorker. --- ReClass.NET/MemoryScanner/IScannerWorker.cs | 29 +++++++++++++++++++++ ReClass.NET/MemoryScanner/ScannerWorker.cs | 20 ++------------ 2 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 ReClass.NET/MemoryScanner/IScannerWorker.cs diff --git a/ReClass.NET/MemoryScanner/IScannerWorker.cs b/ReClass.NET/MemoryScanner/IScannerWorker.cs new file mode 100644 index 00000000..494c5874 --- /dev/null +++ b/ReClass.NET/MemoryScanner/IScannerWorker.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Threading; +using ReClassNET.MemoryScanner.Comparer; + +namespace ReClassNET.MemoryScanner +{ + internal interface IScannerWorker + { + /// + /// Uses the to scan the byte array for results. + /// + /// The data to scan. + /// The length of the parameter. + /// The to stop the scan. + /// An enumeration of all s. + IList Search(byte[] data, int count, CancellationToken ct); + + /// + /// Uses the to scan the byte array for results. + /// The comparer uses the provided previous results to compare to the current value. + /// + /// The data to scan. + /// The length of the parameter. + /// The previous results to use. + /// The to stop the scan. + /// An enumeration of all s. + IList Search(byte[] data, int count, IEnumerable previousResults, CancellationToken ct); + } +} diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs index b83dc714..4da20b68 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ScannerWorker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; @@ -6,7 +6,7 @@ namespace ReClassNET.MemoryScanner { - internal class ScannerWorker + internal class ScannerWorker : IScannerWorker { private readonly ScanSettings settings; private readonly IScanComparer comparer; @@ -20,13 +20,6 @@ public ScannerWorker(ScanSettings settings, IScanComparer comparer) this.comparer = comparer; } - /// - /// Uses the to scan the byte array for results. - /// - /// The data to scan. - /// The length of the parameter. - /// The to stop the scan. - /// An enumeration of all s. public IList Search(byte[] data, int count, CancellationToken ct) { Contract.Requires(data != null); @@ -53,15 +46,6 @@ public IList Search(byte[] data, int count, CancellationToken ct) return results; } - /// - /// Uses the to scan the byte array for results. - /// The comparer uses the provided previous results to compare to the current value. - /// - /// The data to scan. - /// The length of the parameter. - /// The previous results to use. - /// The to stop the scan. - /// An enumeration of all s. public IList Search(byte[] data, int count, IEnumerable previousResults, CancellationToken ct) { Contract.Requires(data != null); From 8b091bb753593bb338614a4af03bda6a2d75a514 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 19:23:39 +0200 Subject: [PATCH 690/777] Extracted ISimpleScanComparer interface. --- .../Comparer/ArrayOfBytesMemoryComparer.cs | 4 +- .../Comparer/ByteMemoryComparer.cs | 2 +- .../Comparer/DoubleMemoryComparer.cs | 2 +- .../Comparer/FloatMemoryComparer.cs | 4 +- .../MemoryScanner/Comparer/IScanComparer.cs | 57 ------------------- .../Comparer/ISimpleScanComparer.cs | 27 +++++++++ .../Comparer/IntegerMemoryComparer.cs | 2 +- .../Comparer/LongMemoryComparer.cs | 2 +- .../Comparer/ShortMemoryComparer.cs | 2 +- .../Comparer/StringMemoryComparer.cs | 2 +- ReClass.NET/MemoryScanner/Scanner.cs | 14 ++++- ReClass.NET/MemoryScanner/ScannerContext.cs | 11 ++-- ReClass.NET/MemoryScanner/ScannerWorker.cs | 4 +- ReClass.NET/ReClass.NET.csproj | 4 +- 14 files changed, 58 insertions(+), 79 deletions(-) create mode 100644 ReClass.NET/MemoryScanner/Comparer/ISimpleScanComparer.cs diff --git a/ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs index e7e2bcbc..3e377f25 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ArrayOfBytesMemoryComparer.cs @@ -1,10 +1,10 @@ -using System; +using System; using System.Diagnostics; using System.Diagnostics.Contracts; namespace ReClassNET.MemoryScanner.Comparer { - public class ArrayOfBytesMemoryComparer : IScanComparer + public class ArrayOfBytesMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType => ScanCompareType.Equal; public int ValueSize => bytePattern?.Length ?? byteArray.Length; diff --git a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs index 2f094a8b..0c376e9a 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class ByteMemoryComparer : IScanComparer + public class ByteMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public byte Value1 { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index ec0b33d3..1a7c7dc5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -4,7 +4,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class DoubleMemoryComparer : IScanComparer + public class DoubleMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public ScanRoundMode RoundType { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index 57aa6b9d..3e529422 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -1,10 +1,10 @@ -using System; +using System; using System.Diagnostics; using ReClassNET.Extensions; namespace ReClassNET.MemoryScanner.Comparer { - public class FloatMemoryComparer : IScanComparer + public class FloatMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public ScanRoundMode RoundType { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs index 35be65f5..4f3c2e4f 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IScanComparer.cs @@ -1,64 +1,7 @@ -using System; -using System.Diagnostics.Contracts; - namespace ReClassNET.MemoryScanner.Comparer { - [ContractClass(typeof(ScanComparerContract))] public interface IScanComparer { ScanCompareType CompareType { get; } - int ValueSize { get; } - - /// - /// Compares the data at the provided index to the current . - /// - /// The byte array to be compared. - /// The index into the byte array. - /// [out] The scan result if the matched. - /// True if matched. - bool Compare(byte[] data, int index, out ScanResult result); - - /// - /// Compares the data at the provided index to the current . - /// The previous results may be used. - /// - /// The byte array to be compared. - /// The index into the byte array. - /// Scan result to be compared. - /// [out] The scan result if the matched. - /// True if matched. - bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result); - } - - [ContractClassFor(typeof(IScanComparer))] - internal abstract class ScanComparerContract : IScanComparer - { - public ScanCompareType CompareType => throw new NotImplementedException(); - - public int ValueSize - { - get - { - Contract.Ensures(ValueSize > 0); - - throw new NotImplementedException(); - } - } - public bool Compare(byte[] data, int index, out ScanResult result) - { - Contract.Requires(data != null); - Contract.Requires(index >= 0); - - throw new NotImplementedException(); - } - - public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) - { - Contract.Requires(data != null); - Contract.Requires(index >= 0); - Contract.Requires(previous != null); - - throw new NotImplementedException(); - } } } diff --git a/ReClass.NET/MemoryScanner/Comparer/ISimpleScanComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ISimpleScanComparer.cs new file mode 100644 index 00000000..a54b2f70 --- /dev/null +++ b/ReClass.NET/MemoryScanner/Comparer/ISimpleScanComparer.cs @@ -0,0 +1,27 @@ +namespace ReClassNET.MemoryScanner.Comparer +{ + public interface ISimpleScanComparer : IScanComparer + { + int ValueSize { get; } + + /// + /// Compares the data at the provided index to the current . + /// + /// The byte array to be compared. + /// The index into the byte array. + /// [out] The scan result if the matched. + /// True if matched. + bool Compare(byte[] data, int index, out ScanResult result); + + /// + /// Compares the data at the provided index to the current . + /// The previous results may be used. + /// + /// The byte array to be compared. + /// The index into the byte array. + /// Scan result to be compared. + /// [out] The scan result if the matched. + /// True if matched. + bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result); + } +} \ No newline at end of file diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index b6c68794..a55e074e 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class IntegerMemoryComparer : IScanComparer + public class IntegerMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public int Value1 { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index 6a161fb5..75c15945 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class LongMemoryComparer : IScanComparer + public class LongMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public long Value1 { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index 0b35c49f..1754ff23 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -3,7 +3,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class ShortMemoryComparer : IScanComparer + public class ShortMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType { get; } public short Value1 { get; } diff --git a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs index 2e457306..c6875aba 100644 --- a/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/StringMemoryComparer.cs @@ -5,7 +5,7 @@ namespace ReClassNET.MemoryScanner.Comparer { - public class StringMemoryComparer : IScanComparer + public class StringMemoryComparer : ISimpleScanComparer { public ScanCompareType CompareType => ScanCompareType.Equal; public bool CaseSensitive { get; } diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 3220e46d..fad4b00d 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -216,7 +216,7 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca var result = Parallel.ForEach( regions, // Sections get grouped by the framework to balance the workers. - () => new ScannerContext(Settings, comparer, initialBufferSize), // Create a new context for every worker (thread). + () => new ScannerContext(CreateWorker(Settings, comparer), initialBufferSize), // Create a new context for every worker (thread). (s, state, _, context) => { if (!ct.IsCancellationRequested) @@ -295,7 +295,7 @@ private Task NextScan(IScanComparer comparer, IProgress progress, Can { var result = Parallel.ForEach( CurrentStore.GetResultBlocks(), - () => new ScannerContext(Settings, comparer, 0), + () => new ScannerContext(CreateWorker(Settings, comparer), 0), (b, state, _, context) => { if (!ct.IsCancellationRequested) @@ -397,5 +397,15 @@ private static ScanResultBlock CreateResultBlock(IReadOnlyList resul ); return block; } + + private static IScannerWorker CreateWorker(ScanSettings settings, IScanComparer comparer) + { + if (comparer is ISimpleScanComparer simpleScanComparer) + { + return new ScannerWorker(settings, simpleScanComparer); + } + + throw new Exception(); + } } } diff --git a/ReClass.NET/MemoryScanner/ScannerContext.cs b/ReClass.NET/MemoryScanner/ScannerContext.cs index 6b6f20cc..55caffc1 100644 --- a/ReClass.NET/MemoryScanner/ScannerContext.cs +++ b/ReClass.NET/MemoryScanner/ScannerContext.cs @@ -1,24 +1,21 @@ -using System.Diagnostics.Contracts; -using ReClassNET.MemoryScanner.Comparer; +using System.Diagnostics.Contracts; namespace ReClassNET.MemoryScanner { internal class ScannerContext { public byte[] Buffer { get; private set; } - public ScannerWorker Worker { get; } + public IScannerWorker Worker { get; } - public ScannerContext(ScanSettings settings, IScanComparer comparer, int bufferSize) + public ScannerContext(IScannerWorker worker, int bufferSize) { - Contract.Requires(settings != null); - Contract.Requires(comparer != null); Contract.Requires(bufferSize >= 0); Contract.Ensures(Buffer != null); Contract.Ensures(Worker != null); EnsureBufferSize(bufferSize); - Worker = new ScannerWorker(settings, comparer); + Worker = worker; } public void EnsureBufferSize(int size) diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/ScannerWorker.cs index 4da20b68..3a41dd78 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ScannerWorker.cs @@ -9,9 +9,9 @@ namespace ReClassNET.MemoryScanner internal class ScannerWorker : IScannerWorker { private readonly ScanSettings settings; - private readonly IScanComparer comparer; + private readonly ISimpleScanComparer comparer; - public ScannerWorker(ScanSettings settings, IScanComparer comparer) + public ScannerWorker(ScanSettings settings, ISimpleScanComparer comparer) { Contract.Requires(settings != null); Contract.Requires(comparer != null); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 5b3f1352..884119f0 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -244,10 +244,12 @@ + + From 4bc3d72e3aa1e1a79055d46b94bd46074b0a694e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 19:27:01 +0200 Subject: [PATCH 691/777] Added ScanResult.ValueSize. --- ReClass.NET/MemoryScanner/ScanResult.cs | 18 ++++++++++++++++++ ReClass.NET/MemoryScanner/Scanner.cs | 16 +++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs index 1684cc28..238f994b 100644 --- a/ReClass.NET/MemoryScanner/ScanResult.cs +++ b/ReClass.NET/MemoryScanner/ScanResult.cs @@ -11,6 +11,8 @@ public abstract class ScanResult public IntPtr Address { get; set; } + public abstract int ValueSize { get; } + public abstract ScanResult Clone(); } @@ -18,6 +20,8 @@ public class ByteScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Byte; + public override int ValueSize => sizeof(byte); + public byte Value { get; } public ByteScanResult(byte value) @@ -50,6 +54,8 @@ public class ShortScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Short; + public override int ValueSize => sizeof(short); + public short Value { get; } public ShortScanResult(short value) @@ -82,6 +88,8 @@ public class IntegerScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Integer; + public override int ValueSize => sizeof(int); + public int Value { get; } public IntegerScanResult(int value) @@ -114,6 +122,8 @@ public class LongScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Long; + public override int ValueSize => sizeof(long); + public long Value { get; } public LongScanResult(long value) @@ -146,6 +156,8 @@ public class FloatScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Float; + public override int ValueSize => sizeof(float); + public float Value { get; } public FloatScanResult(float value) @@ -178,6 +190,8 @@ public class DoubleScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.Double; + public override int ValueSize => sizeof(double); + public double Value { get; } public DoubleScanResult(double value) @@ -210,6 +224,8 @@ public class ArrayOfBytesScanResult : ScanResult, IEquatable ScanValueType.ArrayOfBytes; + public override int ValueSize => Value.Length; + public byte[] Value { get; } public ArrayOfBytesScanResult(byte[] value) @@ -244,6 +260,8 @@ public class StringScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.String; + public override int ValueSize => Value.Length; + public string Value { get; } public Encoding Encoding { get; } diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index fad4b00d..167f3fee 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -244,7 +244,7 @@ private Task FirstScan(IScanComparer comparer, IProgress progress, Ca .ToList(); if (results.Count > 0) { - var block = CreateResultBlock(results, start, comparer.ValueSize); + var block = CreateResultBlock(results, start); store.AddBlock(block); // Store the result block. } } @@ -309,7 +309,7 @@ private Task NextScan(IScanComparer comparer, IProgress progress, Can .ToList(); if (results.Count > 0) { - var block = CreateResultBlock(results, b.Start, comparer.ValueSize); + var block = CreateResultBlock(results, b.Start); store.AddBlock(block); } } @@ -375,16 +375,18 @@ private static List ConsolidateSections(IList
///
/// The results in this block. /// The start address of the previous block or section. - /// The size of the value type. /// The new result block. - private static ScanResultBlock CreateResultBlock(IReadOnlyList results, IntPtr previousStartAddress, int valueSize) + private static ScanResultBlock CreateResultBlock(IReadOnlyList results, IntPtr previousStartAddress) { + var firstResult = results.First(); + var lastResult = results.Last(); + // Calculate start and end address - var startAddress = results.First().Address.Add(previousStartAddress); - var endAddress = results.Last().Address.Add(previousStartAddress) + valueSize; + var startAddress = firstResult.Address.Add(previousStartAddress); + var endAddress = lastResult.Address.Add(previousStartAddress) + lastResult.ValueSize; // Adjust the offsets of the results - var firstOffset = results.First().Address; + var firstOffset = firstResult.Address; foreach (var result in results) { result.Address = result.Address.Sub(firstOffset); From 30f5320c5f77fe76a5eec4dfcedc570c392298d1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 19:29:12 +0200 Subject: [PATCH 692/777] Renamed class. --- ReClass.NET/MemoryScanner/Scanner.cs | 3 ++- .../{ScannerWorker.cs => SimpleScannerWorker.cs} | 4 ++-- ReClass.NET/ReClass.NET.csproj | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) rename ReClass.NET/MemoryScanner/{ScannerWorker.cs => SimpleScannerWorker.cs} (92%) diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 167f3fee..ad91adbb 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -404,7 +404,8 @@ private static IScannerWorker CreateWorker(ScanSettings settings, IScanComparer { if (comparer is ISimpleScanComparer simpleScanComparer) { - return new ScannerWorker(settings, simpleScanComparer); + return new SimpleScannerWorker(settings, simpleScanComparer); + } } throw new Exception(); diff --git a/ReClass.NET/MemoryScanner/ScannerWorker.cs b/ReClass.NET/MemoryScanner/SimpleScannerWorker.cs similarity index 92% rename from ReClass.NET/MemoryScanner/ScannerWorker.cs rename to ReClass.NET/MemoryScanner/SimpleScannerWorker.cs index 3a41dd78..3c384f5d 100644 --- a/ReClass.NET/MemoryScanner/ScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/SimpleScannerWorker.cs @@ -6,12 +6,12 @@ namespace ReClassNET.MemoryScanner { - internal class ScannerWorker : IScannerWorker + internal class SimpleScannerWorker : IScannerWorker { private readonly ScanSettings settings; private readonly ISimpleScanComparer comparer; - public ScannerWorker(ScanSettings settings, ISimpleScanComparer comparer) + public SimpleScannerWorker(ScanSettings settings, ISimpleScanComparer comparer) { Contract.Requires(settings != null); Contract.Requires(comparer != null); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 884119f0..53ae6a15 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -254,7 +254,7 @@ - + From 0bb9d3b583c77b87e44deb67562b9144883b010f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 19:40:46 +0200 Subject: [PATCH 693/777] Added IComplexScanComparer. Implemented RegexStringMemoryComparer. Implemented ComplexScannerWorker. --- .../Comparer/IComplexScanComparer.cs | 26 +++++++ .../Comparer/RegexStringMemoryComparer.cs | 74 +++++++++++++++++++ .../MemoryScanner/ComplexScannerWorker.cs | 57 ++++++++++++++ ReClass.NET/MemoryScanner/ScanResult.cs | 14 ++++ ReClass.NET/MemoryScanner/Scanner.cs | 3 + ReClass.NET/ReClass.NET.csproj | 5 +- 6 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET/MemoryScanner/Comparer/IComplexScanComparer.cs create mode 100644 ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs create mode 100644 ReClass.NET/MemoryScanner/ComplexScannerWorker.cs diff --git a/ReClass.NET/MemoryScanner/Comparer/IComplexScanComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IComplexScanComparer.cs new file mode 100644 index 00000000..55e1cd8e --- /dev/null +++ b/ReClass.NET/MemoryScanner/Comparer/IComplexScanComparer.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace ReClassNET.MemoryScanner.Comparer +{ + public interface IComplexScanComparer : IScanComparer + { + /// + /// Compares all data to the current . + /// + /// The byte array to be compared. + /// The index into the byte array. + /// List of matches. + IEnumerable Compare(byte[] data, int size); + + /// + /// Compares all data to the current . + /// The previous results may be used. + /// + /// The byte array to be compared. + /// The index into the byte array. + /// Scan result to be compared. + /// [out] The scan result if the matched. + /// True if matched. + bool CompareWithPrevious(byte[] data, int size, ScanResult previous, out ScanResult result); + } +} diff --git a/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs new file mode 100644 index 00000000..5163200b --- /dev/null +++ b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace ReClassNET.MemoryScanner.Comparer +{ + public class RegexStringMemoryComparer : IComplexScanComparer + { + public ScanCompareType CompareType => ScanCompareType.Equal; + + public Regex Pattern { get; } + + public Encoding Encoding { get; } + + public RegexStringMemoryComparer(string pattern, Encoding encoding) + { + Pattern = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled); + + Encoding = encoding; + } + + public IEnumerable Compare(byte[] data, int size) + { + var buffer = Encoding.GetString(data, 0, size); + var bufferArray = buffer.ToCharArray(); + + var lastIndex = 0; + var lastOffset = 0; + + var match = Pattern.Match(buffer); + while (match.Success) + { + var byteOffset = Encoding.GetByteCount(bufferArray, lastIndex, match.Index) + lastOffset; + + lastIndex = match.Index; + lastOffset = byteOffset; + + yield return new RegexStringScanResult(match.Value, Encoding) + { + Address = (IntPtr)byteOffset + }; + + match = match.NextMatch(); + } + } + + public bool CompareWithPrevious(byte[] data, int size, ScanResult previous, out ScanResult result) + { + result = null; + + var byteOffset = previous.Address.ToInt32(); + if (byteOffset >= size) + { + return false; + } + + var buffer = Encoding.GetString(data, byteOffset, size - byteOffset); + + var match = Pattern.Match(buffer); + if (!match.Success) + { + return false; + } + + result = new RegexStringScanResult(match.Value, Encoding) + { + Address = (IntPtr)byteOffset + }; + + return true; + } + } +} diff --git a/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs b/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs new file mode 100644 index 00000000..d7299c5d --- /dev/null +++ b/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs @@ -0,0 +1,57 @@ +using System.Collections.Generic; +using System.Threading; +using ReClassNET.MemoryScanner.Comparer; + +namespace ReClassNET.MemoryScanner +{ + internal class ComplexScannerWorker : IScannerWorker + { + private readonly ScanSettings settings; + private readonly IComplexScanComparer comparer; + + public ComplexScannerWorker(ScanSettings settings, IComplexScanComparer comparer) + { + this.settings = settings; + this.comparer = comparer; + } + + public IList Search(byte[] data, int count, CancellationToken ct) + { + var results = new List(); + + foreach (var result in comparer.Compare(data, count)) + { + results.Add(result); + + if (ct.IsCancellationRequested) + { + break; + } + } + + return results; + } + + public IList Search(byte[] data, int count, IEnumerable previousResults, CancellationToken ct) + { + var results = new List(); + + foreach (var previousResult in previousResults) + { + if (ct.IsCancellationRequested) + { + break; + } + + if (comparer.CompareWithPrevious(data, count, previousResult, out var result)) + { + result.Address = previousResult.Address; + + results.Add(result); + } + } + + return results; + } + } +} diff --git a/ReClass.NET/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs index 238f994b..51172316 100644 --- a/ReClass.NET/MemoryScanner/ScanResult.cs +++ b/ReClass.NET/MemoryScanner/ScanResult.cs @@ -295,4 +295,18 @@ public override int GetHashCode() return Address.GetHashCode() * 19 + Value.GetHashCode() * 19 + Encoding.GetHashCode(); } } + + public class RegexStringScanResult : StringScanResult + { + public RegexStringScanResult(string value, Encoding encoding) + : base(value, encoding) + { + + } + + public override ScanResult Clone() + { + return new RegexStringScanResult(Value, Encoding) { Address = Address }; + } + } } diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index ad91adbb..99937f86 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -406,6 +406,9 @@ private static IScannerWorker CreateWorker(ScanSettings settings, IScanComparer { return new SimpleScannerWorker(settings, simpleScanComparer); } + if (comparer is IComplexScanComparer complexScanComparer) + { + return new ComplexScannerWorker(settings, complexScanComparer); } throw new Exception(); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 53ae6a15..7277a1f8 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -242,12 +242,15 @@ + + + From 30ad5e92ab6579c31a012388b5b54a0191ca2ecd Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:19:56 +0200 Subject: [PATCH 694/777] Added ScanValueType.Regex. --- ReClass.NET/Forms/ScannerForm.cs | 19 ++++++++++++++----- .../Comparer/RegexStringMemoryComparer.cs | 10 ++++++++-- ReClass.NET/MemoryScanner/MemoryRecord.cs | 5 ++++- ReClass.NET/MemoryScanner/ScanResultStore.cs | 14 +++++++++++--- ReClass.NET/MemoryScanner/ScanValueType.cs | 6 ++++-- 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index ecbd6b96..03a38858 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -456,6 +456,7 @@ private void OnCompareTypeChanged() case ScanValueType.Double: case ScanValueType.ArrayOfBytes: case ScanValueType.String: + case ScanValueType.Regex: isHexCheckBox.Checked = false; enableHexCheckBox = false; break; @@ -487,6 +488,7 @@ private void OnValueTypeChanged() case ScanValueType.Double: case ScanValueType.ArrayOfBytes: case ScanValueType.String: + case ScanValueType.Regex: isHexCheckBox.Checked = false; isHexCheckBox.Enabled = false; break; @@ -508,7 +510,7 @@ private void OnValueTypeChanged() fastScanAlignmentTextBox.Text = alignment.ToString(); floatingOptionsGroupBox.Visible = valueType == ScanValueType.Float || valueType == ScanValueType.Double; - stringOptionsGroupBox.Visible = valueType == ScanValueType.String; + stringOptionsGroupBox.Visible = valueType == ScanValueType.String || valueType == ScanValueType.Regex; } /// @@ -518,7 +520,7 @@ private void SetValidCompareTypes() { var compareType = compareTypeComboBox.SelectedValue; var valueType = valueTypeComboBox.SelectedValue; - if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String) + if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String || valueType == ScanValueType.Regex) { compareTypeComboBox.SetAvailableValues(ScanCompareType.Equal); } @@ -814,7 +816,7 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) return new ArrayOfBytesMemoryComparer(pattern); } - else if (settings.ValueType == ScanValueType.String) + else if (settings.ValueType == ScanValueType.String || settings.ValueType == ScanValueType.Regex) { if (string.IsNullOrEmpty(dualValueBox.Value1)) { @@ -822,8 +824,14 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) } var encoding = encodingUtf8RadioButton.Checked ? Encoding.UTF8 : encodingUtf16RadioButton.Checked ? Encoding.Unicode : Encoding.UTF32; - - return new StringMemoryComparer(dualValueBox.Value1, encoding, caseSensitiveCheckBox.Checked); + if (settings.ValueType == ScanValueType.String) + { + return new StringMemoryComparer(dualValueBox.Value1, encoding, caseSensitiveCheckBox.Checked); + } + else + { + return new RegexStringMemoryComparer(dualValueBox.Value1, encoding, caseSensitiveCheckBox.Checked); + } } throw new InvalidOperationException(); @@ -858,6 +866,7 @@ private static void FindWhatInteractsWithSelectedRecord(MemoryRecord record, boo size = record.ValueLength; break; case ScanValueType.String: + case ScanValueType.Regex: size = record.ValueLength; break; default: diff --git a/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs index 5163200b..7a76ede5 100644 --- a/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs @@ -13,9 +13,15 @@ public class RegexStringMemoryComparer : IComplexScanComparer public Encoding Encoding { get; } - public RegexStringMemoryComparer(string pattern, Encoding encoding) + public RegexStringMemoryComparer(string pattern, Encoding encoding, bool caseSensitive) { - Pattern = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled); + var options = RegexOptions.Singleline | RegexOptions.Compiled; + if (!caseSensitive) + { + options |= RegexOptions.IgnoreCase; + } + + Pattern = new Regex(pattern, options); Encoding = encoding; } diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index ea17019d..11361d5f 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Globalization; @@ -102,6 +102,7 @@ public MemoryRecord(ScanResult result) ValueStr = FormatValue(byteData); break; case ScanValueType.String: + case ScanValueType.Regex: var strResult = (StringScanResult)result; ValueLength = strResult.Value.Length; Encoding = strResult.Encoding; @@ -177,6 +178,7 @@ public void RefreshValue(RemoteProcess process) buffer = new byte[ValueLength]; break; case ScanValueType.String: + case ScanValueType.Regex: buffer = new byte[ValueLength * Encoding.GuessByteCountPerChar()]; break; default: @@ -209,6 +211,7 @@ public void RefreshValue(RemoteProcess process) ValueStr = FormatValue(buffer); break; case ScanValueType.String: + case ScanValueType.Regex: ValueStr = FormatValue(Encoding.GetString(buffer)); break; } diff --git a/ReClass.NET/MemoryScanner/ScanResultStore.cs b/ReClass.NET/MemoryScanner/ScanResultStore.cs index 1d03daf2..e88033b8 100644 --- a/ReClass.NET/MemoryScanner/ScanResultStore.cs +++ b/ReClass.NET/MemoryScanner/ScanResultStore.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; @@ -206,8 +206,16 @@ private ScanResult ReadScanResult(BinaryReader br) result = new ArrayOfBytesScanResult(br.ReadBytes(br.ReadInt32())); break; case ScanValueType.String: - var encoding = br.ReadInt32(); - result = new StringScanResult(br.ReadString(), encoding == 0 ? Encoding.UTF8 : encoding == 1 ? Encoding.Unicode : Encoding.UTF32); + case ScanValueType.Regex: + var encoding = br.ReadInt32() switch + { + 0 => Encoding.UTF8, + 1 => Encoding.Unicode, + _ => Encoding.UTF32 + }; + var value = br.ReadString(); + + result = valueType == ScanValueType.String ? new StringScanResult(value, encoding) : new RegexStringScanResult(value, encoding); break; default: throw new ArgumentOutOfRangeException(); diff --git a/ReClass.NET/MemoryScanner/ScanValueType.cs b/ReClass.NET/MemoryScanner/ScanValueType.cs index 7bfef7a4..8371e061 100644 --- a/ReClass.NET/MemoryScanner/ScanValueType.cs +++ b/ReClass.NET/MemoryScanner/ScanValueType.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; namespace ReClassNET.MemoryScanner { @@ -19,6 +19,8 @@ public enum ScanValueType [Description("Array of Bytes")] ArrayOfBytes, [Description("String")] - String + String, + [Description("Regular Expression")] + Regex } } From 14bd0e876f7a3f3521b3d87d1b2161ae7f6bb611 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:20:11 +0200 Subject: [PATCH 695/777] Removed unneeded code. --- ReClass.NET/MemoryScanner/ComplexScannerWorker.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs b/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs index d7299c5d..fab1b22c 100644 --- a/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs +++ b/ReClass.NET/MemoryScanner/ComplexScannerWorker.cs @@ -45,8 +45,6 @@ public IList Search(byte[] data, int count, IEnumerable if (comparer.CompareWithPrevious(data, count, previousResult, out var result)) { - result.Address = previousResult.Address; - results.Add(result); } } From 6ba85fcdcb20a33cc380449e90126d156f80357e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:20:28 +0200 Subject: [PATCH 696/777] Use better variable name. --- ReClass.NET/MemoryScanner/Scanner.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ReClass.NET/MemoryScanner/Scanner.cs b/ReClass.NET/MemoryScanner/Scanner.cs index 99937f86..acf8532b 100644 --- a/ReClass.NET/MemoryScanner/Scanner.cs +++ b/ReClass.NET/MemoryScanner/Scanner.cs @@ -82,9 +82,9 @@ public IEnumerable GetResults() return CurrentStore.GetResultBlocks().SelectMany(rb => rb.Results.Select(r => { // Convert the block offset to a real address. - var c = r.Clone(); - c.Address = c.Address.Add(rb.Start); - return c; + var scanResult = r.Clone(); + scanResult.Address = scanResult.Address.Add(rb.Start); + return scanResult; })); } From f0e6dbdd2627fa48c1066d029032fc2b569d8215 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:21:14 +0200 Subject: [PATCH 697/777] Fixed parameter too big. --- ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs index 7a76ede5..efd9d448 100644 --- a/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/RegexStringMemoryComparer.cs @@ -37,7 +37,7 @@ public IEnumerable Compare(byte[] data, int size) var match = Pattern.Match(buffer); while (match.Success) { - var byteOffset = Encoding.GetByteCount(bufferArray, lastIndex, match.Index) + lastOffset; + var byteOffset = Encoding.GetByteCount(bufferArray, lastIndex, match.Index - lastIndex) + lastOffset; lastIndex = match.Index; lastOffset = byteOffset; From ff54aa658cc2ebffc302ac115032f10f926bfa45 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:21:31 +0200 Subject: [PATCH 698/777] Fixed wrong size calculation. --- ReClass.NET/MemoryScanner/ScanResult.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/MemoryScanner/ScanResult.cs b/ReClass.NET/MemoryScanner/ScanResult.cs index 51172316..d46ff437 100644 --- a/ReClass.NET/MemoryScanner/ScanResult.cs +++ b/ReClass.NET/MemoryScanner/ScanResult.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Linq; using System.Text; +using ReClassNET.Extensions; namespace ReClassNET.MemoryScanner { @@ -260,7 +261,7 @@ public class StringScanResult : ScanResult, IEquatable { public override ScanValueType ValueType => ScanValueType.String; - public override int ValueSize => Value.Length; + public override int ValueSize => Value.Length * Encoding.GuessByteCountPerChar(); public string Value { get; } @@ -298,6 +299,8 @@ public override int GetHashCode() public class RegexStringScanResult : StringScanResult { + public override ScanValueType ValueType => ScanValueType.Regex; + public RegexStringScanResult(string value, Encoding encoding) : base(value, encoding) { From 4df29d680e5cb16a787ffb527cb9edd47a64bc3a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 5 Jul 2020 20:23:59 +0200 Subject: [PATCH 699/777] Use latest C# language version. --- ReClass.NET_Launcher/ReClass.NET_Launcher.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj index 72eba584..87001366 100644 --- a/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj +++ b/ReClass.NET_Launcher/ReClass.NET_Launcher.csproj @@ -24,6 +24,7 @@ prompt 4 false + latest AnyCPU @@ -35,6 +36,7 @@ prompt 4 false + latest ReClassNet.ico From dc723706bb8a3e38a67cec5f610727a87598c5f7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 15 Jul 2020 16:18:37 +0200 Subject: [PATCH 700/777] Rewrote the memory view scrolling. (Fixes #162) --- ReClass.NET/ReClass.NET.csproj | 3 - ReClass.NET/UI/MemoryViewControl.cs | 64 ++---- ReClass.NET/UI/ScrollableCustomControl.cs | 248 ---------------------- 3 files changed, 17 insertions(+), 298 deletions(-) delete mode 100644 ReClass.NET/UI/ScrollableCustomControl.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 7277a1f8..c7249340 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -505,9 +505,6 @@ - - UserControl - diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 9e94db08..64b05a23 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Drawing; @@ -11,7 +11,7 @@ namespace ReClassNET.UI { - public partial class MemoryViewControl : ScrollableCustomControl + public partial class MemoryViewControl : UserControl { /// /// Contains informations about a selected node. @@ -78,6 +78,8 @@ public MemoryViewControl() return; } + AutoScroll = true; + font = Program.MonoSpaceFont; editBox.Font = font; @@ -85,18 +87,6 @@ public MemoryViewControl() memoryPreviewPopUp = new MemoryPreviewPopUp(font); } - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - VerticalScroll.Enabled = true; - VerticalScroll.Visible = true; - VerticalScroll.SmallChange = 10; - HorizontalScroll.Enabled = true; - HorizontalScroll.Visible = true; - HorizontalScroll.SmallChange = 100; - } - protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); @@ -147,8 +137,8 @@ protected override void OnPaint(PaintEventArgs e) var drawnSize = args.Node.Draw( view, - -HorizontalScroll.Value, - -VerticalScroll.Value * font.Height + AutoScrollPosition.X, + AutoScrollPosition.Y ); drawnSize.Width += 10; @@ -157,33 +147,7 @@ protected override void OnPaint(PaintEventArgs e) e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(150, 255, 0, 0)), 1), spot.Rect); }*/ - if (drawnSize.Height > ClientSize.Height) - { - VerticalScroll.Enabled = true; - - VerticalScroll.LargeChange = ClientSize.Height / font.Height; - VerticalScroll.Maximum = (drawnSize.Height - ClientSize.Height) / font.Height + VerticalScroll.LargeChange; - } - else - { - VerticalScroll.Enabled = false; - - VerticalScroll.Value = VerticalScroll.Minimum; - } - - if (drawnSize.Width > ClientSize.Width) - { - HorizontalScroll.Enabled = true; - - HorizontalScroll.LargeChange = ClientSize.Width; - HorizontalScroll.Maximum = drawnSize.Width - ClientSize.Width + HorizontalScroll.LargeChange; - } - else - { - HorizontalScroll.Enabled = false; - - HorizontalScroll.Value = HorizontalScroll.Minimum; - } + AutoScrollMinSize = new Size(Math.Max(drawnSize.Width, ClientSize.Width), Math.Max(drawnSize.Height, ClientSize.Height)); } private void OnSelectionChanged() @@ -333,9 +297,12 @@ protected override void OnMouseClick(MouseEventArgs e) } else if (hotSpot.Type == HotSpotType.ChangeClassType || hotSpot.Type == HotSpotType.ChangeWrappedType || hotSpot.Type == HotSpotType.ChangeEnumType) { - var handler = hotSpot.Type == HotSpotType.ChangeClassType - ? ChangeClassTypeClick : hotSpot.Type == HotSpotType.ChangeWrappedType - ? ChangeWrappedTypeClick : ChangeEnumTypeClick; + var handler = hotSpot.Type switch + { + HotSpotType.ChangeClassType => ChangeClassTypeClick, + HotSpotType.ChangeWrappedType => ChangeWrappedTypeClick, + HotSpotType.ChangeEnumType => ChangeEnumTypeClick + }; handler?.Invoke(this, new NodeClickEventArgs(hitObject, hotSpot.Address, hotSpot.Memory, e.Button, e.Location)); @@ -574,7 +541,10 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) if (isAtEnd) { - DoScroll(ScrollOrientation.VerticalScroll, key == Keys.Down ? 1 : - 1); + const int ScrollAmount = 3; + + var position = AutoScrollPosition; + AutoScrollPosition = new Point(-position.X, -position.Y + (key == Keys.Down ? ScrollAmount : -ScrollAmount) * font.Height); } Invalidate(); diff --git a/ReClass.NET/UI/ScrollableCustomControl.cs b/ReClass.NET/UI/ScrollableCustomControl.cs deleted file mode 100644 index 4de6a4de..00000000 --- a/ReClass.NET/UI/ScrollableCustomControl.cs +++ /dev/null @@ -1,248 +0,0 @@ -using System; -using System.Diagnostics.Contracts; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace ReClassNET.UI -{ - public class ScrollableCustomControl : UserControl - { - private const int WM_HSCROLL = 0x114; - private const int WM_VSCROLL = 0x115; - private const int SBS_HORZ = 0x0000; - private const int SBS_VERT = 0x0001; - private const int SIF_ALL = 0x0001 | 0x0002 | 0x0004 | 0x0010; - - [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] - private static extern bool GetScrollInfo(HandleRef hWnd, int fnBar, SCROLLINFO si); - - [StructLayout(LayoutKind.Sequential)] - private class SCROLLINFO - { - public int cbSize = Marshal.SizeOf(typeof(SCROLLINFO)); - public int fMask = SIF_ALL; - public int nMin; - public int nMax; - public int nPage; - public int nPos; - public int nTrackPos; - } - - private readonly SCROLLINFO scrollinfo = new SCROLLINFO(); - - public ScrollableCustomControl() - { - VScroll = true; - HScroll = true; - } - - protected override void OnMouseWheel(MouseEventArgs e) - { - Contract.Assume(VerticalScroll != null); - Contract.Assume(HorizontalScroll != null); - - const int WHEEL_DELTA = 120; - - var scrollProperties = VerticalScroll.Enabled ? VerticalScroll : (ScrollProperties)HorizontalScroll; - - var wheelDelta = e.Delta; - while (Math.Abs(wheelDelta) >= WHEEL_DELTA) - { - if (wheelDelta > 0) - { - wheelDelta -= WHEEL_DELTA; - DoScroll(ScrollEventType.SmallDecrement, scrollProperties); - } - else - { - wheelDelta += WHEEL_DELTA; - DoScroll(ScrollEventType.SmallIncrement, scrollProperties); - } - } - - base.OnMouseWheel(e); - } - - private const int SB_LINEUP = 0; - private const int SB_LINEDOWN = 1; - private const int SB_PAGEUP = 2; - private const int SB_PAGEDOWN = 3; - private const int SB_THUMBPOSITION = 4; - private const int SB_THUMBTRACK = 5; - private const int SB_TOP = 6; - private const int SB_BOTTOM = 7; - private const int SB_ENDSCROLL = 8; - - private static ScrollEventType WParamToScrollEventType(IntPtr wParam) - { - switch (LoWord((int)wParam)) - { - case SB_LINEUP: - return ScrollEventType.SmallDecrement; - case SB_LINEDOWN: - return ScrollEventType.SmallIncrement; - case SB_PAGEUP: - return ScrollEventType.LargeDecrement; - case SB_PAGEDOWN: - return ScrollEventType.LargeIncrement; - case SB_THUMBTRACK: - return ScrollEventType.ThumbTrack; - case SB_TOP: - return ScrollEventType.First; - case SB_BOTTOM: - return ScrollEventType.Last; - case SB_THUMBPOSITION: - return ScrollEventType.ThumbPosition; - case SB_ENDSCROLL: - return ScrollEventType.EndScroll; - default: - return ScrollEventType.EndScroll; - } - } - - private void SetValue(ScrollEventType type, ScrollProperties scrollProperties, int newValue) - { - Contract.Requires(scrollProperties != null); - - if (!scrollProperties.Enabled) - { - return; - } - - if (newValue < scrollProperties.Minimum) - { - newValue = scrollProperties.Minimum; - } - if (newValue > scrollProperties.Maximum - scrollProperties.LargeChange) - { - newValue = scrollProperties.Maximum - scrollProperties.LargeChange + 1; - } - if (scrollProperties.Value != newValue) - { - var oldValue = scrollProperties.Value; - - scrollProperties.Value = newValue; - - if (type != ScrollEventType.EndScroll) - { - OnScroll(new ScrollEventArgs( - type, - oldValue, - newValue, - scrollProperties is VScrollProperties ? ScrollOrientation.VerticalScroll : ScrollOrientation.HorizontalScroll - )); - Invalidate(); - } - } - } - - private void DoScroll(ScrollEventType type, ScrollProperties scrollProperties) - { - Contract.Requires(scrollProperties != null); - - var oldValue = scrollProperties.Value; - var newValue = oldValue; - - switch (type) - { - case ScrollEventType.SmallDecrement: - newValue = oldValue - (ModifierKeys == Keys.Control ? 1 : scrollProperties.SmallChange); - break; - case ScrollEventType.SmallIncrement: - newValue = oldValue + (ModifierKeys == Keys.Control ? 1 : scrollProperties.SmallChange); - break; - case ScrollEventType.LargeDecrement: - newValue = oldValue - scrollProperties.LargeChange; - break; - case ScrollEventType.LargeIncrement: - newValue = oldValue + scrollProperties.LargeChange; - break; - case ScrollEventType.First: - newValue = scrollProperties.Minimum; - break; - case ScrollEventType.Last: - newValue = scrollProperties.Maximum; - break; - } - - SetValue(type, scrollProperties, newValue); - } - - public void DoScroll(ScrollOrientation orientation, int amount) - { - if (orientation == ScrollOrientation.VerticalScroll && VerticalScroll.Enabled == false) - { - return; - } - if (orientation == ScrollOrientation.HorizontalScroll && HorizontalScroll.Enabled == false) - { - return; - } - - var scrollProperties = orientation == ScrollOrientation.VerticalScroll ? VerticalScroll : (ScrollProperties)HorizontalScroll; - - SetValue(ScrollEventType.ThumbPosition, scrollProperties, scrollProperties.Value + amount); - } - - private void ProcessMessage(ref Message msg) - { - ScrollProperties scrollProperties; - int bar; - if (msg.Msg == WM_VSCROLL) - { - scrollProperties = VerticalScroll; - bar = SBS_VERT; - } - else - { - scrollProperties = HorizontalScroll; - bar = SBS_HORZ; - } - - var type = WParamToScrollEventType(msg.WParam); - switch (type) - { - case ScrollEventType.SmallDecrement: - case ScrollEventType.SmallIncrement: - case ScrollEventType.LargeDecrement: - case ScrollEventType.LargeIncrement: - case ScrollEventType.First: - case ScrollEventType.Last: - DoScroll(type, scrollProperties); - break; - case ScrollEventType.ThumbTrack: - case ScrollEventType.ThumbPosition: - - if (GetScrollInfo(new HandleRef(this, Handle), bar, scrollinfo)) - { - SetValue(type, scrollProperties, scrollinfo.nTrackPos); - } - break; - } - } - - protected override void WndProc(ref Message msg) - { - if (msg.HWnd == Handle) - { - switch (msg.Msg) - { - case WM_VSCROLL: - case WM_HSCROLL: - if (msg.LParam != IntPtr.Zero) - { - break; - } - - ProcessMessage(ref msg); - - return; - } - } - - base.WndProc(ref msg); - } - - static int LoWord(int number) => number & 0xffff; - } -} From 8ded5959295c2edd86a0a0e3450f34b443a38902 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 6 Aug 2020 22:48:41 +0200 Subject: [PATCH 701/777] Should fix the scrolling issue. (#164) --- ReClass.NET/UI/MemoryViewControl.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 64b05a23..835aaeec 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -135,10 +135,12 @@ protected override void OnPaint(PaintEventArgs e) MultipleNodesSelected = selectedNodes.Count > 1 }; + var scrollPosition = AutoScrollPosition; + var drawnSize = args.Node.Draw( view, - AutoScrollPosition.X, - AutoScrollPosition.Y + scrollPosition.X, + scrollPosition.Y ); drawnSize.Width += 10; @@ -148,6 +150,9 @@ protected override void OnPaint(PaintEventArgs e) }*/ AutoScrollMinSize = new Size(Math.Max(drawnSize.Width, ClientSize.Width), Math.Max(drawnSize.Height, ClientSize.Height)); + + // Sometimes setting AutoScrollMinSize resets AutoScrollPosition. This restores the original position. + AutoScrollPosition = new Point(-scrollPosition.X, -scrollPosition.Y); } private void OnSelectionChanged() From 3fcd108eacce79370e1e02ff6fd6864955f48e48 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 30 Aug 2020 17:31:32 +0200 Subject: [PATCH 702/777] Do not dispose the returned image (#168). --- ReClass.NET/UI/DpiUtil.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/UI/DpiUtil.cs b/ReClass.NET/UI/DpiUtil.cs index c3fb88c2..c46c7038 100644 --- a/ReClass.NET/UI/DpiUtil.cs +++ b/ReClass.NET/UI/DpiUtil.cs @@ -109,7 +109,7 @@ private static Image ScaleImage(Image img, int w, int h) Contract.Requires(w >= 0); Contract.Requires(h >= 0); - using var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); + var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); using var g = Graphics.FromImage(bmp); g.Clear(Color.Transparent); From 5172c82c1d4ffc69b9bbcc0221355506a153bf30 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 30 Aug 2020 17:59:30 +0200 Subject: [PATCH 703/777] Use better variable names. --- ReClass.NET/UI/DpiUtil.cs | 75 ++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/ReClass.NET/UI/DpiUtil.cs b/ReClass.NET/UI/DpiUtil.cs index c46c7038..0f24b004 100644 --- a/ReClass.NET/UI/DpiUtil.cs +++ b/ReClass.NET/UI/DpiUtil.cs @@ -83,73 +83,74 @@ public static int ScaleIntY(int i) return (int)Math.Round(i * scaleY); } - public static Image ScaleImage(Image img) + public static Image ScaleImage(Image sourceImage) { - if (img == null) + if (sourceImage == null) { return null; } - int w = img.Width; - int h = img.Height; - int sw = ScaleIntX(w); - int sh = ScaleIntY(h); + var width = sourceImage.Width; + var height = sourceImage.Height; + var scaledWidth = ScaleIntX(width); + var scaledHeight = ScaleIntY(height); - if (w == sw && h == sh) + if (width == scaledWidth && height == scaledHeight) { - return img; + return sourceImage; } - return ScaleImage(img, sw, sh); + return ScaleImage(sourceImage, scaledWidth, scaledHeight); } - private static Image ScaleImage(Image img, int w, int h) + private static Image ScaleImage(Image sourceImage, int width, int height) { - Contract.Requires(img != null); - Contract.Requires(w >= 0); - Contract.Requires(h >= 0); + Contract.Requires(sourceImage != null); + Contract.Requires(width >= 0); + Contract.Requires(height >= 0); - var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); - using var g = Graphics.FromImage(bmp); + var scaledImage = new Bitmap(width, height, PixelFormat.Format32bppArgb); + + using var g = Graphics.FromImage(scaledImage); g.Clear(Color.Transparent); g.SmoothingMode = SmoothingMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; - var wSrc = img.Width; - var hSrc = img.Height; + var sourceWidth = sourceImage.Width; + var sourceHeight = sourceImage.Height; - var im = InterpolationMode.HighQualityBicubic; - if (wSrc > 0 && hSrc > 0) + var interpolationMode = InterpolationMode.HighQualityBicubic; + if (sourceWidth > 0 && sourceHeight > 0) { - if ((w % wSrc) == 0 && (h % hSrc) == 0) + if ((width % sourceWidth) == 0 && (height % sourceHeight) == 0) { - im = InterpolationMode.NearestNeighbor; + interpolationMode = InterpolationMode.NearestNeighbor; } } - g.InterpolationMode = im; + g.InterpolationMode = interpolationMode; - var rSource = new RectangleF(0.0f, 0.0f, wSrc, hSrc); - var rDest = new RectangleF(0.0f, 0.0f, w, h); - AdjustScaleRects(ref rSource, ref rDest); + var srcRect = new RectangleF(0.0f, 0.0f, sourceWidth, sourceHeight); + var destRect = new RectangleF(0.0f, 0.0f, width, height); + AdjustScaleRects(ref srcRect, ref destRect); - g.DrawImage(img, rDest, rSource, GraphicsUnit.Pixel); + g.DrawImage(sourceImage, destRect, srcRect, GraphicsUnit.Pixel); - return bmp; + return scaledImage; } - private static void AdjustScaleRects(ref RectangleF rSource, ref RectangleF rDest) + private static void AdjustScaleRects(ref RectangleF srcRect, ref RectangleF destRect) { - if (rDest.Width > rSource.Width) - rSource.X = rSource.X - 0.5f; - if (rDest.Height > rSource.Height) - rSource.Y = rSource.Y - 0.5f; - - if (rDest.Width < rSource.Width) - rSource.X = rSource.X + 0.5f; - if (rDest.Height < rSource.Height) - rSource.Y = rSource.Y + 0.5f; + if (destRect.Width > srcRect.Width) + srcRect.X -= 0.5f; + if (destRect.Height > srcRect.Height) + srcRect.Y -= 0.5f; + + if (destRect.Width < srcRect.Width) + srcRect.X += 0.5f; + if (destRect.Height < srcRect.Height) + srcRect.Y += 0.5f; } } } From 30f09c810f3645c846abd4c7f05c617af8d71c2c Mon Sep 17 00:00:00 2001 From: Frederik Munk Madsen Date: Mon, 14 Sep 2020 22:51:15 +0200 Subject: [PATCH 704/777] Focus MemoryView when EditBox commits --- ReClass.NET/UI/MemoryViewControl.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 835aaeec..4a3740bd 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -631,6 +631,8 @@ private void editBox_Committed(object sender, EventArgs e) Invalidate(); } + + Focus(); } #endregion From a8a8266476335d29a59e9691257336895bcc3563 Mon Sep 17 00:00:00 2001 From: Frederik Munk Madsen Date: Mon, 14 Sep 2020 22:53:17 +0200 Subject: [PATCH 705/777] Edit node name when F2 is pressed --- ReClass.NET/Forms/MainForm.Functions.cs | 11 +++++++++ ReClass.NET/Forms/MainForm.cs | 26 +++++++++++--------- ReClass.NET/UI/HotSpotTextBox.cs | 2 +- ReClass.NET/UI/MemoryViewControl.Designer.cs | 2 +- ReClass.NET/UI/MemoryViewControl.cs | 14 +++++++++++ 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 6e0d7439..160cb9fc 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -410,6 +410,17 @@ private void PasteNodeFromClipboardToSelection() } } + private void EditSelectedNodeName() + { + var selected = memoryViewControl.GetSelectedNodes(); + var selectedNode = selected.FirstOrDefault(); + + if (selected.Count == 1) + { + memoryViewControl.ShowEditBoxForName(selectedNode); + } + } + private void RemoveSelectedNodes() { memoryViewControl.GetSelectedNodes() diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 11aa1362..7df1daff 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -766,22 +766,24 @@ private void classesView_ClassSelected(object sender, ClassNode node) CurrentClassNode = node; } - private void memoryViewControl_KeyDown(object sender, KeyEventArgs e) + private void memoryViewControl_KeyDown(object sender, KeyEventArgs args) { - if (e.Control) + switch (args.KeyCode) { - if (e.KeyCode == Keys.C) - { + case Keys.C when args.Control: CopySelectedNodesToClipboard(); - } - else if (e.KeyCode == Keys.V) - { + break; + case Keys.V when args.Control: PasteNodeFromClipboardToSelection(); - } - } - else if (e.KeyCode == Keys.Delete) - { - RemoveSelectedNodes(); + break; + + case Keys.Delete: + RemoveSelectedNodes(); + break; + + case Keys.F2: + EditSelectedNodeName(); + break; } } diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index be90dc8d..2fbd7ba7 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Windows.Forms; diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 5642eba4..7f0bcca8 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.UI { partial class MemoryViewControl { diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 4a3740bd..96bdd48f 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -381,6 +381,20 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) base.OnMouseDoubleClick(e); } + public void ShowEditBoxForName(SelectedNodeInfo selection) + { + var hotSpot = hotSpots.FirstOrDefault(spot => spot.Address == selection.Address && + spot.Type == HotSpotType.Edit && + spot.Text == selection.Node.Name); + if (hotSpot != null) + { + editBox.BackColor = Program.Settings.SelectedColor; + editBox.HotSpot = hotSpot; + editBox.Visible = true; + editBox.ReadOnly = false; + } + } + private Point toolTipPosition; protected override void OnMouseHover(EventArgs e) { From acfb2331ad507248b21410e88933ee9ab221b59a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 29 Sep 2020 18:09:31 +0200 Subject: [PATCH 706/777] Enable DPI scaling setting. --- ReClass.NET/App.config | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/App.config b/ReClass.NET/App.config index ecdcf8a5..1b379a17 100644 --- a/ReClass.NET/App.config +++ b/ReClass.NET/App.config @@ -1,6 +1,9 @@ - - - - + + + + + + + \ No newline at end of file From ad77de0b75127eb9e5b7c64d6b8dc1494f85ed7b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 29 Sep 2020 18:11:06 +0200 Subject: [PATCH 707/777] Added DpiUtil tests. --- ReClass.NET/Program.cs | 1 + ReClass.NET/UI/DpiUtil.cs | 60 +++++++--------------- ReClass.NET_Tests/ReClass.NET_Tests.csproj | 2 + ReClass.NET_Tests/UI/DpiUtilTest.cs | 43 ++++++++++++++++ 4 files changed, 65 insertions(+), 41 deletions(-) create mode 100644 ReClass.NET_Tests/UI/DpiUtilTest.cs diff --git a/ReClass.NET/Program.cs b/ReClass.NET/Program.cs index 65ea6838..f28cb0bd 100644 --- a/ReClass.NET/Program.cs +++ b/ReClass.NET/Program.cs @@ -44,6 +44,7 @@ static void Main(string[] args) try { DpiUtil.ConfigureProcess(); + DpiUtil.TrySetDpiFromCurrentDesktop(); } catch { diff --git a/ReClass.NET/UI/DpiUtil.cs b/ReClass.NET/UI/DpiUtil.cs index 0f24b004..58b8b7e0 100644 --- a/ReClass.NET/UI/DpiUtil.cs +++ b/ReClass.NET/UI/DpiUtil.cs @@ -9,77 +9,55 @@ namespace ReClassNET.UI { public static class DpiUtil { - private const int StdDpi = 96; + public const int DefalutDpi = 96; - private static bool initialized; - - private static int dpiX = StdDpi; - private static int dpiY = StdDpi; + private static int dpiX = DefalutDpi; + private static int dpiY = DefalutDpi; private static double scaleX = 1.0; private static double scaleY = 1.0; - public static bool ScalingRequired + public static void ConfigureProcess() { - get - { - if (Program.DesignMode) - { - return false; - } - - EnsureInitialized(); - - return dpiX != StdDpi || dpiY != StdDpi; - } + NativeMethods.SetProcessDpiAwareness(); } - private static void EnsureInitialized() + public static void SetDpi(int x, int y) { - if (initialized) + dpiX = x; + dpiY = y; + + if (dpiX <= 0 || dpiY <= 0) { - return; + dpiX = DefalutDpi; + dpiY = DefalutDpi; } + scaleX = dpiX / (double)DefalutDpi; + scaleY = dpiY / (double)DefalutDpi; + } + + public static void TrySetDpiFromCurrentDesktop() + { try { using var g = Graphics.FromHwnd(IntPtr.Zero); - dpiX = (int)g.DpiX; - dpiY = (int)g.DpiY; - if (dpiX <= 0 || dpiY <= 0) - { - dpiX = StdDpi; - dpiY = StdDpi; - } + SetDpi((int)g.DpiX, (int)g.DpiY); } catch { // ignored } - - scaleX = dpiX / (double)StdDpi; - scaleY = dpiY / (double)StdDpi; - - initialized = true; - } - - public static void ConfigureProcess() - { - NativeMethods.SetProcessDpiAwareness(); } public static int ScaleIntX(int i) { - EnsureInitialized(); - return (int)Math.Round(i * scaleX); } public static int ScaleIntY(int i) { - EnsureInitialized(); - return (int)Math.Round(i * scaleY); } diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 53798768..1ed78ef2 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -87,6 +87,7 @@ + @@ -121,5 +122,6 @@ all + \ No newline at end of file diff --git a/ReClass.NET_Tests/UI/DpiUtilTest.cs b/ReClass.NET_Tests/UI/DpiUtilTest.cs new file mode 100644 index 00000000..bf768490 --- /dev/null +++ b/ReClass.NET_Tests/UI/DpiUtilTest.cs @@ -0,0 +1,43 @@ +using System.Drawing; +using NFluent; +using ReClassNET.UI; +using Xunit; + +namespace ReClass.NET_Tests.UI +{ + public class DpiUtilTest + { + [Fact] + public void ScaleImageReturnsNullOnNull() + { + Check.That(DpiUtil.ScaleImage(null)).IsNull(); + } + + [Fact] + public void ScaleImageReturnsOriginalInstanceOnSameSize() + { + DpiUtil.SetDpi(DpiUtil.DefalutDpi, DpiUtil.DefalutDpi); + + using var sourceImage = new Bitmap(10, 10); + var scaledImage = DpiUtil.ScaleImage(sourceImage); + + Check.That(sourceImage).IsSameReferenceAs(scaledImage); + } + + [Fact] + public void ScaleImageReturnsScaledImage() + { + const int SourceSize = 10; + const int ScaleFactor = 2; + + DpiUtil.SetDpi(DpiUtil.DefalutDpi * ScaleFactor, DpiUtil.DefalutDpi * ScaleFactor); + + using var sourceImage = new Bitmap(SourceSize, SourceSize); + using var scaledImage = DpiUtil.ScaleImage(sourceImage); + + Check.That(sourceImage).Not.IsSameReferenceAs(scaledImage); + Check.That(scaledImage.Width).IsEqualTo(sourceImage.Width * ScaleFactor); + Check.That(scaledImage.Height).IsEqualTo(sourceImage.Height * ScaleFactor); + } + } +} From 7f10070f8f91651d30176af5eb752e22a403dd2a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 29 Sep 2020 18:33:29 +0200 Subject: [PATCH 708/777] Addition to #170. --- ReClass.NET/Forms/MainForm.Functions.cs | 8 +++---- ReClass.NET/UI/MemoryViewControl.cs | 31 ++++++++++++++----------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 160cb9fc..8339bcf0 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -412,12 +412,10 @@ private void PasteNodeFromClipboardToSelection() private void EditSelectedNodeName() { - var selected = memoryViewControl.GetSelectedNodes(); - var selectedNode = selected.FirstOrDefault(); - - if (selected.Count == 1) + var selectedNodes = memoryViewControl.GetSelectedNodes(); + if (selectedNodes.Count == 1) { - memoryViewControl.ShowEditBoxForName(selectedNode); + memoryViewControl.ShowNodeNameEditBox(selectedNodes[0].Node); } } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 96bdd48f..0d32a9fe 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -354,11 +354,7 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) } if (hotSpot.Type == HotSpotType.Edit) { - editBox.BackColor = Program.Settings.SelectedColor; - editBox.HotSpot = hotSpot; - editBox.Visible = true; - - editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; + ShowNodeNameEditBox(hotSpot); break; } @@ -381,20 +377,29 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) base.OnMouseDoubleClick(e); } - public void ShowEditBoxForName(SelectedNodeInfo selection) + public void ShowNodeNameEditBox(BaseNode node) { - var hotSpot = hotSpots.FirstOrDefault(spot => spot.Address == selection.Address && - spot.Type == HotSpotType.Edit && - spot.Text == selection.Node.Name); + if (node == null || node is BaseHexNode) + { + return; + } + + var hotSpot = hotSpots + .FirstOrDefault(s => s.Node == node && s.Type == HotSpotType.Edit && s.Id == HotSpot.NameId); if (hotSpot != null) { - editBox.BackColor = Program.Settings.SelectedColor; - editBox.HotSpot = hotSpot; - editBox.Visible = true; - editBox.ReadOnly = false; + ShowNodeNameEditBox(hotSpot); } } + private void ShowNodeNameEditBox(HotSpot hotSpot) + { + editBox.BackColor = Program.Settings.SelectedColor; + editBox.HotSpot = hotSpot; + editBox.Visible = true; + editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; + } + private Point toolTipPosition; protected override void OnMouseHover(EventArgs e) { From c945ab41dc5bd291d3a3a8a83694c9c935b29936 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 21:20:10 +0200 Subject: [PATCH 709/777] Restore old behaviour. --- ReClass.NET/UI/MemoryViewControl.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index 0d32a9fe..befa4dd8 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -464,6 +464,8 @@ protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseWheel(MouseEventArgs e) { + editBox.Visible = false; + if (memoryPreviewPopUp.Visible) { memoryPreviewPopUp.HandleMouseWheelEvent(e); @@ -474,15 +476,6 @@ protected override void OnMouseWheel(MouseEventArgs e) } } - protected override void OnScroll(ScrollEventArgs e) - { - Contract.Requires(e != null); - - base.OnScroll(e); - - editBox.Visible = false; - } - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (editBox.Visible == false) // Only process keys if the edit field is not visible. From 3a95ffe7e3aa2f6b272c0a80cfb825aab0315b2d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:01:32 +0200 Subject: [PATCH 710/777] Moved methods out of wrong region. --- ReClass.NET/UI/MemoryViewControl.cs | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index befa4dd8..d69681d5 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -377,29 +377,6 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) base.OnMouseDoubleClick(e); } - public void ShowNodeNameEditBox(BaseNode node) - { - if (node == null || node is BaseHexNode) - { - return; - } - - var hotSpot = hotSpots - .FirstOrDefault(s => s.Node == node && s.Type == HotSpotType.Edit && s.Id == HotSpot.NameId); - if (hotSpot != null) - { - ShowNodeNameEditBox(hotSpot); - } - } - - private void ShowNodeNameEditBox(HotSpot hotSpot) - { - editBox.BackColor = Program.Settings.SelectedColor; - editBox.HotSpot = hotSpot; - editBox.Visible = true; - editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; - } - private Point toolTipPosition; protected override void OnMouseHover(EventArgs e) { @@ -685,6 +662,29 @@ private void ShowNodeContextMenu(Point location) NodeContextMenuStrip?.Show(this, location); } + public void ShowNodeNameEditBox(BaseNode node) + { + if (node == null || node is BaseHexNode) + { + return; + } + + var hotSpot = hotSpots + .FirstOrDefault(s => s.Node == node && s.Type == HotSpotType.Edit && s.Id == HotSpot.NameId); + if (hotSpot != null) + { + ShowNodeNameEditBox(hotSpot); + } + } + + private void ShowNodeNameEditBox(HotSpot hotSpot) + { + editBox.BackColor = Program.Settings.SelectedColor; + editBox.HotSpot = hotSpot; + editBox.Visible = true; + editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; + } + /// /// Resets the selection state of all selected nodes. /// From 7f134722a4911fd4567714a6bce087b75a76de11 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:03:55 +0200 Subject: [PATCH 711/777] Directly call SetBounds. --- ReClass.NET/UI/HotSpotTextBox.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index 2fbd7ba7..23939f09 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -19,10 +19,7 @@ public HotSpot HotSpot { hotSpot = value; - Left = hotSpot.Rect.Left + 2; - Top = hotSpot.Rect.Top; - Width = hotSpot.Rect.Width; - Height = hotSpot.Rect.Height; + SetBounds(hotSpot.Rect.Left + 2, hotSpot.Rect.Top, hotSpot.Rect.Width, hotSpot.Rect.Height); MinimumWidth = Width; From 08a5996e2a3433256688f042bc1ba0e54c8417fa Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:09:12 +0200 Subject: [PATCH 712/777] Made minimum width member private. --- ReClass.NET/UI/HotSpotTextBox.cs | 11 ++++++----- ReClass.NET/UI/MemoryViewControl.Designer.cs | 3 +-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index 23939f09..ca05744b 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -19,18 +19,19 @@ public HotSpot HotSpot { hotSpot = value; - SetBounds(hotSpot.Rect.Left + 2, hotSpot.Rect.Top, hotSpot.Rect.Width, hotSpot.Rect.Height); + var rect = hotSpot.Rect; - MinimumWidth = Width; + SetBounds(rect.Left + 2, rect.Top, rect.Width, rect.Height); + + minimumWidth = rect.Width; Text = hotSpot.Text.Trim(); } } } - public int MinimumWidth { get; set; } - private FontEx font; + private int minimumWidth; [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] @@ -94,7 +95,7 @@ protected override void OnTextChanged(EventArgs e) base.OnTextChanged(e); var w = (TextLength + 1) * font.Width; - if (w > MinimumWidth) + if (w > minimumWidth) { Width = w; } diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index 7f0bcca8..b56874ff 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -43,8 +43,7 @@ private void InitializeComponent() // editBox // this.editBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.editBox.Location = new System.Drawing.Point(36, 81); - this.editBox.MinimumWidth = 0; + this.editBox.Location = new System.Drawing.Point(0, 0); this.editBox.Name = "editBox"; this.editBox.Size = new System.Drawing.Size(100, 13); this.editBox.TabIndex = 1; From 93850bf5c40e79f075640ddecc438ee4d109310e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:28:35 +0200 Subject: [PATCH 713/777] Added ShowOnHotSpot method. --- ReClass.NET/UI/HotSpotTextBox.cs | 84 ++++++++++++-------- ReClass.NET/UI/MemoryViewControl.Designer.cs | 72 ++++++++--------- ReClass.NET/UI/MemoryViewControl.cs | 32 +++----- 3 files changed, 97 insertions(+), 91 deletions(-) diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/UI/HotSpotTextBox.cs index ca05744b..70b19a64 100644 --- a/ReClass.NET/UI/HotSpotTextBox.cs +++ b/ReClass.NET/UI/HotSpotTextBox.cs @@ -1,34 +1,13 @@ using System; using System.ComponentModel; +using System.Drawing; using System.Windows.Forms; namespace ReClassNET.UI { public class HotSpotTextBox : TextBox { - private HotSpot hotSpot; - - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public HotSpot HotSpot - { - get => hotSpot; - set - { - if (hotSpot != value) - { - hotSpot = value; - - var rect = hotSpot.Rect; - - SetBounds(rect.Left + 2, rect.Top, rect.Width, rect.Height); - - minimumWidth = rect.Width; - - Text = hotSpot.Text.Trim(); - } - } - } + private HotSpot currentHotSpot; private FontEx font; private int minimumWidth; @@ -49,20 +28,24 @@ public HotSpot HotSpot } } - public event EventHandler Committed; + public event HotSpotTextBoxCommitEventHandler Committed; public HotSpotTextBox() { BorderStyle = BorderStyle.None; } + #region Events + protected override void OnVisibleChanged(EventArgs e) { base.OnVisibleChanged(e); if (Visible) { - if (HotSpot != null) + BackColor = Program.Settings.BackgroundColor; + + if (currentHotSpot != null) { Focus(); Select(0, TextLength); @@ -83,13 +66,6 @@ protected override void OnKeyDown(KeyEventArgs e) base.OnKeyDown(e); } - /*protected override void OnLeave(EventArgs e) - { - base.OnLeave(e); - - OnCommit(); - }*/ - protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); @@ -105,9 +81,49 @@ private void OnCommit() { Visible = false; - hotSpot.Text = Text.Trim(); + currentHotSpot.Text = Text.Trim(); + + Committed?.Invoke(this, new HotSpotTextBoxCommitEventArgs(currentHotSpot)); + } - Committed?.Invoke(this, EventArgs.Empty); + #endregion + + public void ShowOnHotSpot(HotSpot hotSpot) + { + currentHotSpot = hotSpot; + + if (hotSpot == null) + { + Visible = false; + + return; + } + + AlignToRect(hotSpot.Rect); + + Text = hotSpot.Text.Trim(); + ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; + + Visible = true; + } + + private void AlignToRect(Rectangle rect) + { + SetBounds(rect.Left + 2, rect.Top, rect.Width, rect.Height); + + minimumWidth = rect.Width; + } + } + + public delegate void HotSpotTextBoxCommitEventHandler(object sender, HotSpotTextBoxCommitEventArgs e); + + public class HotSpotTextBoxCommitEventArgs : EventArgs + { + public HotSpot HotSpot { get; set; } + + public HotSpotTextBoxCommitEventArgs(HotSpot hotSpot) + { + HotSpot = hotSpot; } } } diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/UI/MemoryViewControl.Designer.cs index b56874ff..a7e9ccc1 100644 --- a/ReClass.NET/UI/MemoryViewControl.Designer.cs +++ b/ReClass.NET/UI/MemoryViewControl.Designer.cs @@ -28,47 +28,47 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.repaintTimer = new System.Windows.Forms.Timer(this.components); - this.editBox = new ReClassNET.UI.HotSpotTextBox(); - this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.SuspendLayout(); - // - // repaintTimer - // - this.repaintTimer.Enabled = true; - this.repaintTimer.Interval = 250; - this.repaintTimer.Tick += new System.EventHandler(this.repaintTimer_Tick); - // - // editBox - // - this.editBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.editBox.Location = new System.Drawing.Point(0, 0); - this.editBox.Name = "editBox"; - this.editBox.Size = new System.Drawing.Size(100, 13); - this.editBox.TabIndex = 1; - this.editBox.TabStop = false; - this.editBox.Visible = false; - this.editBox.Committed += new System.EventHandler(this.editBox_Committed); - // - // nodeInfoToolTip - // - this.nodeInfoToolTip.ShowAlways = true; - // - // MemoryViewControl - // - this.Controls.Add(this.editBox); - this.DoubleBuffered = true; - this.Name = "MemoryViewControl"; - this.Size = new System.Drawing.Size(150, 162); - this.ResumeLayout(false); - this.PerformLayout(); + this.components = new System.ComponentModel.Container(); + this.repaintTimer = new System.Windows.Forms.Timer(this.components); + this.hotSpotEditBox = new ReClassNET.UI.HotSpotTextBox(); + this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); + this.SuspendLayout(); + // + // repaintTimer + // + this.repaintTimer.Enabled = true; + this.repaintTimer.Interval = 250; + this.repaintTimer.Tick += new System.EventHandler(this.repaintTimer_Tick); + // + // hotSpotEditBox + // + this.hotSpotEditBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.hotSpotEditBox.Location = new System.Drawing.Point(0, 0); + this.hotSpotEditBox.Name = "hotSpotEditBox"; + this.hotSpotEditBox.Size = new System.Drawing.Size(100, 13); + this.hotSpotEditBox.TabIndex = 1; + this.hotSpotEditBox.TabStop = false; + this.hotSpotEditBox.Visible = false; + this.hotSpotEditBox.Committed += new ReClassNET.UI.HotSpotTextBoxCommitEventHandler(this.editBox_Committed); + // + // nodeInfoToolTip + // + this.nodeInfoToolTip.ShowAlways = true; + // + // MemoryViewControl + // + this.Controls.Add(this.hotSpotEditBox); + this.DoubleBuffered = true; + this.Name = "MemoryViewControl"; + this.Size = new System.Drawing.Size(150, 162); + this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.Timer repaintTimer; - private HotSpotTextBox editBox; + private HotSpotTextBox hotSpotEditBox; private System.Windows.Forms.ToolTip nodeInfoToolTip; } } diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/UI/MemoryViewControl.cs index d69681d5..f6cef494 100644 --- a/ReClass.NET/UI/MemoryViewControl.cs +++ b/ReClass.NET/UI/MemoryViewControl.cs @@ -82,7 +82,7 @@ public MemoryViewControl() font = Program.MonoSpaceFont; - editBox.Font = font; + hotSpotEditBox.Font = font; memoryPreviewPopUp = new MemoryPreviewPopUp(font); } @@ -166,6 +166,8 @@ protected override void OnMouseClick(MouseEventArgs e) { Contract.Requires(e != null); + hotSpotEditBox.Hide(); + var invalidate = false; foreach (var hotSpot in hotSpots) @@ -316,8 +318,6 @@ protected override void OnMouseClick(MouseEventArgs e) } } - editBox.Visible = false; - if (invalidate) { Invalidate(); @@ -330,7 +330,7 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) { Contract.Requires(e != null); - editBox.Visible = false; + hotSpotEditBox.Hide(); var invalidate = false; @@ -354,7 +354,7 @@ protected override void OnMouseDoubleClick(MouseEventArgs e) } if (hotSpot.Type == HotSpotType.Edit) { - ShowNodeNameEditBox(hotSpot); + hotSpotEditBox.ShowOnHotSpot(hotSpot); break; } @@ -441,7 +441,7 @@ protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseWheel(MouseEventArgs e) { - editBox.Visible = false; + hotSpotEditBox.Hide(); if (memoryPreviewPopUp.Visible) { @@ -455,7 +455,7 @@ protected override void OnMouseWheel(MouseEventArgs e) protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { - if (editBox.Visible == false) // Only process keys if the edit field is not visible. + if (hotSpotEditBox.Visible == false) // Only process keys if the edit field is not visible. { var key = keyData & Keys.KeyCode; var modifier = keyData & Keys.Modifiers; @@ -602,11 +602,9 @@ private void repaintTimer_Tick(object sender, EventArgs e) Invalidate(false); } - private void editBox_Committed(object sender, EventArgs e) + private void editBox_Committed(object sender, HotSpotTextBoxCommitEventArgs e) { - var hotspotTextBox = sender as HotSpotTextBox; - - var hotSpot = hotspotTextBox?.HotSpot; + var hotSpot = e.HotSpot; if (hotSpot != null) { try @@ -673,18 +671,10 @@ public void ShowNodeNameEditBox(BaseNode node) .FirstOrDefault(s => s.Node == node && s.Type == HotSpotType.Edit && s.Id == HotSpot.NameId); if (hotSpot != null) { - ShowNodeNameEditBox(hotSpot); + hotSpotEditBox.ShowOnHotSpot(hotSpot); } } - private void ShowNodeNameEditBox(HotSpot hotSpot) - { - editBox.BackColor = Program.Settings.SelectedColor; - editBox.HotSpot = hotSpot; - editBox.Visible = true; - editBox.ReadOnly = hotSpot.Id == HotSpot.ReadOnlyId; - } - /// /// Resets the selection state of all selected nodes. /// @@ -708,7 +698,7 @@ public void Reset() { ClearSelection(); - editBox.Visible = false; + hotSpotEditBox.Hide(); VerticalScroll.Value = VerticalScroll.Minimum; } From 6e5f25bd3e6cf006d007ee979c00df5e6adc30de Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:42:58 +0200 Subject: [PATCH 714/777] Fixes #169. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ed4a224..5859c353 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ This is a port of ReClass to the .NET platform with lots of additional features. - [MemoryPipe Plugin](https://github.com/ReClassNET/ReClass.NET-MemoryPipePlugin) - [LoadBinary Plugin](https://github.com/ReClassNET/ReClass.NET-LoadBinaryPlugin) - [Handle Abuser Plugin](https://github.com/ReClassNET/ReClass.NET-HandleAbuser) -- [Unreal Plugin](https://github.com/DrP3pp3r/ReClass.NET-UnrealPlugin) (by [DrP3pp3r](https://github.com/DrP3pp3r)) +- Unreal Plugin (not available anymore) (by [DrP3pp3r](https://github.com/DrP3pp3r)) - [DriverReader](https://github.com/niemand-sec/ReClass.NET-DriverReader) (by [Niemand](https://github.com/niemand-sec)) To install a plugin just copy it in the "Plugins" folder. From c8c47eab6e39c82624b56c8c62f85e826aa750e3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 8 Oct 2020 22:46:06 +0200 Subject: [PATCH 715/777] Added BlackHat reference. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5859c353..771e3fbe 100644 --- a/README.md +++ b/README.md @@ -120,3 +120,4 @@ Settings - [buddyfavors](https://github.com/buddyfavors) - [DrP3pp3r](https://github.com/DrP3pp3r) - [ko1N](https://github.com/ko1N) +- [Niemand](https://github.com/niemand-sec) (see his talk at [BlackHat Europe 2019 (London) "Unveiling the underground world of Anti-Cheats"](https://www.blackhat.com/eu-19/briefings/schedule/index.html#unveiling-the-underground-world-of-anti-cheats-17358)) \ No newline at end of file From a451675941b861f4538230640fae8ffea9cd577e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 16:08:23 +0200 Subject: [PATCH 716/777] Moved files to seperate folder. --- ReClass.NET/{UI => Controls}/BannerBox.cs | 0 .../{UI => Controls}/ColorBox.Designer.cs | 0 ReClass.NET/{UI => Controls}/ColorBox.cs | 0 ReClass.NET/{UI => Controls}/ColorBox.resx | 0 .../{UI => Controls}/CustomToolStripItems.cs | 0 .../DrawContextRequestEventArgs.cs | 0 .../{UI => Controls}/DualValueBox.Designer.cs | 0 ReClass.NET/{UI => Controls}/DualValueBox.cs | 0 .../{UI => Controls}/DualValueBox.resx | 0 ReClass.NET/{UI => Controls}/EnumComboBox.cs | 0 .../EnumDescriptionDisplay.cs | 0 .../{UI => Controls}/HotSpotTextBox.cs | 0 .../{UI => Controls}/HotkeyBox.Designer.cs | 0 ReClass.NET/{UI => Controls}/HotkeyBox.cs | 0 ReClass.NET/{UI => Controls}/HotkeyBox.resx | 0 ReClass.NET/{UI => Controls}/IconButton.cs | 0 .../{UI => Controls}/MemoryPreviewPopUp.cs | 0 .../MemoryRecordList.Designer.cs | 0 .../{UI => Controls}/MemoryRecordList.cs | 0 .../{UI => Controls}/MemoryRecordList.resx | 0 .../MemoryViewControl.Designer.cs | 0 .../{UI => Controls}/MemoryViewControl.cs | 0 .../{UI => Controls}/MemoryViewControl.resx | 0 .../{UI => Controls}/NodeClickEventArgs.cs | 0 .../{UI => Controls}/PlaceholderTextBox.cs | 0 .../{UI => Controls}/ProjectView.Designer.cs | 0 ReClass.NET/{UI => Controls}/ProjectView.cs | 0 ReClass.NET/{UI => Controls}/ProjectView.resx | 0 ReClass.NET/{UI => Controls}/ViewInfo.cs | 0 ReClass.NET/ReClass.NET.csproj | 59 ++++++++++--------- 30 files changed, 30 insertions(+), 29 deletions(-) rename ReClass.NET/{UI => Controls}/BannerBox.cs (100%) rename ReClass.NET/{UI => Controls}/ColorBox.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/ColorBox.cs (100%) rename ReClass.NET/{UI => Controls}/ColorBox.resx (100%) rename ReClass.NET/{UI => Controls}/CustomToolStripItems.cs (100%) rename ReClass.NET/{UI => Controls}/DrawContextRequestEventArgs.cs (100%) rename ReClass.NET/{UI => Controls}/DualValueBox.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/DualValueBox.cs (100%) rename ReClass.NET/{UI => Controls}/DualValueBox.resx (100%) rename ReClass.NET/{UI => Controls}/EnumComboBox.cs (100%) rename ReClass.NET/{UI => Controls}/EnumDescriptionDisplay.cs (100%) rename ReClass.NET/{UI => Controls}/HotSpotTextBox.cs (100%) rename ReClass.NET/{UI => Controls}/HotkeyBox.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/HotkeyBox.cs (100%) rename ReClass.NET/{UI => Controls}/HotkeyBox.resx (100%) rename ReClass.NET/{UI => Controls}/IconButton.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryPreviewPopUp.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryRecordList.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryRecordList.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryRecordList.resx (100%) rename ReClass.NET/{UI => Controls}/MemoryViewControl.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryViewControl.cs (100%) rename ReClass.NET/{UI => Controls}/MemoryViewControl.resx (100%) rename ReClass.NET/{UI => Controls}/NodeClickEventArgs.cs (100%) rename ReClass.NET/{UI => Controls}/PlaceholderTextBox.cs (100%) rename ReClass.NET/{UI => Controls}/ProjectView.Designer.cs (100%) rename ReClass.NET/{UI => Controls}/ProjectView.cs (100%) rename ReClass.NET/{UI => Controls}/ProjectView.resx (100%) rename ReClass.NET/{UI => Controls}/ViewInfo.cs (100%) diff --git a/ReClass.NET/UI/BannerBox.cs b/ReClass.NET/Controls/BannerBox.cs similarity index 100% rename from ReClass.NET/UI/BannerBox.cs rename to ReClass.NET/Controls/BannerBox.cs diff --git a/ReClass.NET/UI/ColorBox.Designer.cs b/ReClass.NET/Controls/ColorBox.Designer.cs similarity index 100% rename from ReClass.NET/UI/ColorBox.Designer.cs rename to ReClass.NET/Controls/ColorBox.Designer.cs diff --git a/ReClass.NET/UI/ColorBox.cs b/ReClass.NET/Controls/ColorBox.cs similarity index 100% rename from ReClass.NET/UI/ColorBox.cs rename to ReClass.NET/Controls/ColorBox.cs diff --git a/ReClass.NET/UI/ColorBox.resx b/ReClass.NET/Controls/ColorBox.resx similarity index 100% rename from ReClass.NET/UI/ColorBox.resx rename to ReClass.NET/Controls/ColorBox.resx diff --git a/ReClass.NET/UI/CustomToolStripItems.cs b/ReClass.NET/Controls/CustomToolStripItems.cs similarity index 100% rename from ReClass.NET/UI/CustomToolStripItems.cs rename to ReClass.NET/Controls/CustomToolStripItems.cs diff --git a/ReClass.NET/UI/DrawContextRequestEventArgs.cs b/ReClass.NET/Controls/DrawContextRequestEventArgs.cs similarity index 100% rename from ReClass.NET/UI/DrawContextRequestEventArgs.cs rename to ReClass.NET/Controls/DrawContextRequestEventArgs.cs diff --git a/ReClass.NET/UI/DualValueBox.Designer.cs b/ReClass.NET/Controls/DualValueBox.Designer.cs similarity index 100% rename from ReClass.NET/UI/DualValueBox.Designer.cs rename to ReClass.NET/Controls/DualValueBox.Designer.cs diff --git a/ReClass.NET/UI/DualValueBox.cs b/ReClass.NET/Controls/DualValueBox.cs similarity index 100% rename from ReClass.NET/UI/DualValueBox.cs rename to ReClass.NET/Controls/DualValueBox.cs diff --git a/ReClass.NET/UI/DualValueBox.resx b/ReClass.NET/Controls/DualValueBox.resx similarity index 100% rename from ReClass.NET/UI/DualValueBox.resx rename to ReClass.NET/Controls/DualValueBox.resx diff --git a/ReClass.NET/UI/EnumComboBox.cs b/ReClass.NET/Controls/EnumComboBox.cs similarity index 100% rename from ReClass.NET/UI/EnumComboBox.cs rename to ReClass.NET/Controls/EnumComboBox.cs diff --git a/ReClass.NET/UI/EnumDescriptionDisplay.cs b/ReClass.NET/Controls/EnumDescriptionDisplay.cs similarity index 100% rename from ReClass.NET/UI/EnumDescriptionDisplay.cs rename to ReClass.NET/Controls/EnumDescriptionDisplay.cs diff --git a/ReClass.NET/UI/HotSpotTextBox.cs b/ReClass.NET/Controls/HotSpotTextBox.cs similarity index 100% rename from ReClass.NET/UI/HotSpotTextBox.cs rename to ReClass.NET/Controls/HotSpotTextBox.cs diff --git a/ReClass.NET/UI/HotkeyBox.Designer.cs b/ReClass.NET/Controls/HotkeyBox.Designer.cs similarity index 100% rename from ReClass.NET/UI/HotkeyBox.Designer.cs rename to ReClass.NET/Controls/HotkeyBox.Designer.cs diff --git a/ReClass.NET/UI/HotkeyBox.cs b/ReClass.NET/Controls/HotkeyBox.cs similarity index 100% rename from ReClass.NET/UI/HotkeyBox.cs rename to ReClass.NET/Controls/HotkeyBox.cs diff --git a/ReClass.NET/UI/HotkeyBox.resx b/ReClass.NET/Controls/HotkeyBox.resx similarity index 100% rename from ReClass.NET/UI/HotkeyBox.resx rename to ReClass.NET/Controls/HotkeyBox.resx diff --git a/ReClass.NET/UI/IconButton.cs b/ReClass.NET/Controls/IconButton.cs similarity index 100% rename from ReClass.NET/UI/IconButton.cs rename to ReClass.NET/Controls/IconButton.cs diff --git a/ReClass.NET/UI/MemoryPreviewPopUp.cs b/ReClass.NET/Controls/MemoryPreviewPopUp.cs similarity index 100% rename from ReClass.NET/UI/MemoryPreviewPopUp.cs rename to ReClass.NET/Controls/MemoryPreviewPopUp.cs diff --git a/ReClass.NET/UI/MemoryRecordList.Designer.cs b/ReClass.NET/Controls/MemoryRecordList.Designer.cs similarity index 100% rename from ReClass.NET/UI/MemoryRecordList.Designer.cs rename to ReClass.NET/Controls/MemoryRecordList.Designer.cs diff --git a/ReClass.NET/UI/MemoryRecordList.cs b/ReClass.NET/Controls/MemoryRecordList.cs similarity index 100% rename from ReClass.NET/UI/MemoryRecordList.cs rename to ReClass.NET/Controls/MemoryRecordList.cs diff --git a/ReClass.NET/UI/MemoryRecordList.resx b/ReClass.NET/Controls/MemoryRecordList.resx similarity index 100% rename from ReClass.NET/UI/MemoryRecordList.resx rename to ReClass.NET/Controls/MemoryRecordList.resx diff --git a/ReClass.NET/UI/MemoryViewControl.Designer.cs b/ReClass.NET/Controls/MemoryViewControl.Designer.cs similarity index 100% rename from ReClass.NET/UI/MemoryViewControl.Designer.cs rename to ReClass.NET/Controls/MemoryViewControl.Designer.cs diff --git a/ReClass.NET/UI/MemoryViewControl.cs b/ReClass.NET/Controls/MemoryViewControl.cs similarity index 100% rename from ReClass.NET/UI/MemoryViewControl.cs rename to ReClass.NET/Controls/MemoryViewControl.cs diff --git a/ReClass.NET/UI/MemoryViewControl.resx b/ReClass.NET/Controls/MemoryViewControl.resx similarity index 100% rename from ReClass.NET/UI/MemoryViewControl.resx rename to ReClass.NET/Controls/MemoryViewControl.resx diff --git a/ReClass.NET/UI/NodeClickEventArgs.cs b/ReClass.NET/Controls/NodeClickEventArgs.cs similarity index 100% rename from ReClass.NET/UI/NodeClickEventArgs.cs rename to ReClass.NET/Controls/NodeClickEventArgs.cs diff --git a/ReClass.NET/UI/PlaceholderTextBox.cs b/ReClass.NET/Controls/PlaceholderTextBox.cs similarity index 100% rename from ReClass.NET/UI/PlaceholderTextBox.cs rename to ReClass.NET/Controls/PlaceholderTextBox.cs diff --git a/ReClass.NET/UI/ProjectView.Designer.cs b/ReClass.NET/Controls/ProjectView.Designer.cs similarity index 100% rename from ReClass.NET/UI/ProjectView.Designer.cs rename to ReClass.NET/Controls/ProjectView.Designer.cs diff --git a/ReClass.NET/UI/ProjectView.cs b/ReClass.NET/Controls/ProjectView.cs similarity index 100% rename from ReClass.NET/UI/ProjectView.cs rename to ReClass.NET/Controls/ProjectView.cs diff --git a/ReClass.NET/UI/ProjectView.resx b/ReClass.NET/Controls/ProjectView.resx similarity index 100% rename from ReClass.NET/UI/ProjectView.resx rename to ReClass.NET/Controls/ProjectView.resx diff --git a/ReClass.NET/UI/ViewInfo.cs b/ReClass.NET/Controls/ViewInfo.cs similarity index 100% rename from ReClass.NET/UI/ViewInfo.cs rename to ReClass.NET/Controls/ViewInfo.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index c7249340..736b0388 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -295,7 +295,7 @@ - + Component @@ -318,14 +318,14 @@ - - + + - + UserControl - + ProjectView.cs @@ -334,13 +334,13 @@ CodeForm.cs - + UserControl - + ColorBox.cs - + Component @@ -352,41 +352,41 @@ LogForm.cs - + UserControl - + DualValueBox.cs - + Component - - + + UserControl - + HotkeyBox.cs - + Component - + Component - + UserControl - + MemoryRecordList.cs - + MemoryViewControl.cs - + Component @@ -420,7 +420,7 @@ - + Component @@ -439,7 +439,7 @@ - + UserControl @@ -510,7 +510,7 @@ - + @@ -558,7 +558,7 @@ ScannerForm.cs - + ProjectView.cs Designer @@ -569,19 +569,19 @@ MainForm.cs Designer - + ColorBox.cs - + DualValueBox.cs - + HotkeyBox.cs - + MemoryRecordList.cs - + MemoryViewControl.cs @@ -1011,6 +1011,7 @@ + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" From a03b37113b06d191c588cb24c610de9e524cca2f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 16:11:48 +0200 Subject: [PATCH 717/777] Adjusted namespaces. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 4 +- ReClass.NET/Controls/BannerBox.cs | 3 +- ReClass.NET/Controls/ColorBox.Designer.cs | 2 +- ReClass.NET/Controls/ColorBox.cs | 2 +- ReClass.NET/Controls/CustomToolStripItems.cs | 4 +- .../Controls/DrawContextRequestEventArgs.cs | 4 +- ReClass.NET/Controls/DualValueBox.Designer.cs | 2 +- ReClass.NET/Controls/DualValueBox.cs | 4 +- ReClass.NET/Controls/EnumComboBox.cs | 2 +- .../Controls/EnumDescriptionDisplay.cs | 4 +- ReClass.NET/Controls/HotSpotTextBox.cs | 3 +- ReClass.NET/Controls/HotkeyBox.Designer.cs | 2 +- ReClass.NET/Controls/HotkeyBox.cs | 4 +- ReClass.NET/Controls/IconButton.cs | 2 +- ReClass.NET/Controls/MemoryPreviewPopUp.cs | 5 +- .../Controls/MemoryRecordList.Designer.cs | 2 +- ReClass.NET/Controls/MemoryRecordList.cs | 3 +- .../Controls/MemoryViewControl.Designer.cs | 6 +- ReClass.NET/Controls/MemoryViewControl.cs | 3 +- ReClass.NET/Controls/NodeClickEventArgs.cs | 4 +- ReClass.NET/Controls/PlaceholderTextBox.cs | 2 +- ReClass.NET/Controls/ProjectView.Designer.cs | 2 +- ReClass.NET/Controls/ProjectView.cs | 2 +- ReClass.NET/Controls/ViewInfo.cs | 5 +- .../ReClass/Legacy/BaseClassArrayNode.cs | 4 +- .../ReClass/Legacy/ClassPointerNode.cs | 4 +- .../DataExchange/ReClass/Legacy/CustomNode.cs | 4 +- ReClass.NET/Forms/AboutForm.Designer.cs | 8 +- .../Forms/ClassSelectionForm.Designer.cs | 12 +- ReClass.NET/Forms/CodeForm.Designer.cs | 8 +- ReClass.NET/Forms/EnumEditorForm.Designer.cs | 8 +- ReClass.NET/Forms/EnumEditorForm.cs | 3 +- ReClass.NET/Forms/EnumListForm.Designer.cs | 24 ++-- .../Forms/EnumSelectionForm.Designer.cs | 24 ++-- ReClass.NET/Forms/FoundCodeForm.Designer.cs | 8 +- .../Forms/InputCorrelatorForm.Designer.cs | 12 +- ReClass.NET/Forms/MainForm.Designer.cs | 134 +++++++++--------- ReClass.NET/Forms/MainForm.Functions.cs | 1 + ReClass.NET/Forms/MainForm.cs | 1 + .../Forms/NamedAddressesForm.Designer.cs | 24 ++-- ReClass.NET/Forms/PluginForm.Designer.cs | 8 +- .../Forms/ProcessBrowserForm.Designer.cs | 8 +- ReClass.NET/Forms/ProcessInfoForm.Designer.cs | 8 +- ReClass.NET/Forms/ScannerForm.Designer.cs | 34 ++--- ReClass.NET/Forms/ScannerForm.cs | 1 + ReClass.NET/Forms/SettingsForm.Designer.cs | 64 +++++---- ReClass.NET/Forms/SettingsForm.cs | 1 + ReClass.NET/Nodes/ArrayNode.cs | 4 +- ReClass.NET/Nodes/BaseFunctionNode.cs | 1 + ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 1 + ReClass.NET/Nodes/BaseHexCommentNode.cs | 3 +- ReClass.NET/Nodes/BaseHexNode.cs | 1 + ReClass.NET/Nodes/BaseMatrixNode.cs | 3 +- ReClass.NET/Nodes/BaseNode.cs | 1 + ReClass.NET/Nodes/BaseNumericNode.cs | 3 +- ReClass.NET/Nodes/BaseTextNode.cs | 3 +- ReClass.NET/Nodes/BaseTextPtrNode.cs | 3 +- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 3 +- ReClass.NET/Nodes/BitFieldNode.cs | 3 +- ReClass.NET/Nodes/BoolNode.cs | 3 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 1 + ReClass.NET/Nodes/ClassNode.cs | 3 +- ReClass.NET/Nodes/DoubleNode.cs | 3 +- ReClass.NET/Nodes/EnumNode.cs | 3 +- ReClass.NET/Nodes/FloatNode.cs | 3 +- ReClass.NET/Nodes/FunctionNode.cs | 1 + ReClass.NET/Nodes/FunctionPtrNode.cs | 4 +- ReClass.NET/Nodes/Hex16Node.cs | 3 +- ReClass.NET/Nodes/Hex32Node.cs | 3 +- ReClass.NET/Nodes/Hex64Node.cs | 3 +- ReClass.NET/Nodes/Hex8Node.cs | 1 + ReClass.NET/Nodes/Int16Node.cs | 3 +- ReClass.NET/Nodes/Int32Node.cs | 3 +- ReClass.NET/Nodes/Int64Node.cs | 3 +- ReClass.NET/Nodes/Int8Node.cs | 3 +- ReClass.NET/Nodes/Matrix3x3Node.cs | 1 + ReClass.NET/Nodes/Matrix3x4Node.cs | 1 + ReClass.NET/Nodes/Matrix4x4Node.cs | 1 + ReClass.NET/Nodes/PointerNode.cs | 3 +- ReClass.NET/Nodes/UInt16Node.cs | 3 +- ReClass.NET/Nodes/UInt32Node.cs | 3 +- ReClass.NET/Nodes/UInt64Node.cs | 3 +- ReClass.NET/Nodes/UInt8Node.cs | 3 +- ReClass.NET/Nodes/UTF16TextNode.cs | 4 +- ReClass.NET/Nodes/UTF16TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UTF32TextNode.cs | 4 +- ReClass.NET/Nodes/UTF32TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UTF8TextNode.cs | 4 +- ReClass.NET/Nodes/UTF8TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UnionNode.cs | 3 +- ReClass.NET/Nodes/Vector2Node.cs | 1 + ReClass.NET/Nodes/Vector3Node.cs | 1 + ReClass.NET/Nodes/Vector4Node.cs | 1 + ReClass.NET/Nodes/VirtualMethodNode.cs | 4 +- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 3 +- ReClass.NET/UI/NodeTypesBuilder.cs | 1 + 96 files changed, 344 insertions(+), 263 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 41733634..10318705 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Diagnostics.Contracts; @@ -6,11 +6,11 @@ using System.IO; using System.Linq; using System.Text; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Logger; using ReClassNET.Nodes; using ReClassNET.Project; -using ReClassNET.UI; namespace ReClassNET.CodeGenerator { diff --git a/ReClass.NET/Controls/BannerBox.cs b/ReClass.NET/Controls/BannerBox.cs index ca8eb6e5..b3cdab8c 100644 --- a/ReClass.NET/Controls/BannerBox.cs +++ b/ReClass.NET/Controls/BannerBox.cs @@ -1,8 +1,9 @@ using System.ComponentModel; using System.Drawing; using System.Windows.Forms; +using ReClassNET.UI; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class BannerBox : Control, ISupportInitialize { diff --git a/ReClass.NET/Controls/ColorBox.Designer.cs b/ReClass.NET/Controls/ColorBox.Designer.cs index 2cdd1b19..0757df19 100644 --- a/ReClass.NET/Controls/ColorBox.Designer.cs +++ b/ReClass.NET/Controls/ColorBox.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class ColorBox { diff --git a/ReClass.NET/Controls/ColorBox.cs b/ReClass.NET/Controls/ColorBox.cs index d51efdaa..9325e645 100644 --- a/ReClass.NET/Controls/ColorBox.cs +++ b/ReClass.NET/Controls/ColorBox.cs @@ -4,7 +4,7 @@ using System.Drawing; using System.Windows.Forms; -namespace ReClassNET.UI +namespace ReClassNET.Controls { [DefaultEvent(nameof(ColorChanged))] [DefaultBindingProperty(nameof(Color))] diff --git a/ReClass.NET/Controls/CustomToolStripItems.cs b/ReClass.NET/Controls/CustomToolStripItems.cs index 779b24d0..ea186f17 100644 --- a/ReClass.NET/Controls/CustomToolStripItems.cs +++ b/ReClass.NET/Controls/CustomToolStripItems.cs @@ -1,8 +1,8 @@ -using System; +using System; using System.Windows.Forms; using System.Windows.Forms.Design; -namespace ReClassNET.UI +namespace ReClassNET.Controls { [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)] public class IntegerToolStripMenuItem : ToolStripMenuItem diff --git a/ReClass.NET/Controls/DrawContextRequestEventArgs.cs b/ReClass.NET/Controls/DrawContextRequestEventArgs.cs index 1c874a3b..2f57a36f 100644 --- a/ReClass.NET/Controls/DrawContextRequestEventArgs.cs +++ b/ReClass.NET/Controls/DrawContextRequestEventArgs.cs @@ -1,8 +1,8 @@ -using System; +using System; using ReClassNET.Memory; using ReClassNET.Nodes; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class DrawContextRequestEventArgs : EventArgs { diff --git a/ReClass.NET/Controls/DualValueBox.Designer.cs b/ReClass.NET/Controls/DualValueBox.Designer.cs index f94500f7..dd5a675b 100644 --- a/ReClass.NET/Controls/DualValueBox.Designer.cs +++ b/ReClass.NET/Controls/DualValueBox.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class DualValueBox { diff --git a/ReClass.NET/Controls/DualValueBox.cs b/ReClass.NET/Controls/DualValueBox.cs index a3f473f9..d2b8d264 100644 --- a/ReClass.NET/Controls/DualValueBox.cs +++ b/ReClass.NET/Controls/DualValueBox.cs @@ -1,8 +1,8 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Windows.Forms; using System.Windows.Forms.Design; -namespace ReClassNET.UI +namespace ReClassNET.Controls { [Designer(typeof(DualValueControlDesigner))] public partial class DualValueBox : UserControl diff --git a/ReClass.NET/Controls/EnumComboBox.cs b/ReClass.NET/Controls/EnumComboBox.cs index b0567ead..4875b85d 100644 --- a/ReClass.NET/Controls/EnumComboBox.cs +++ b/ReClass.NET/Controls/EnumComboBox.cs @@ -5,7 +5,7 @@ using System.Windows.Forms; using ReClassNET.Extensions; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class EnumComboBox : ComboBox where TEnum : struct { diff --git a/ReClass.NET/Controls/EnumDescriptionDisplay.cs b/ReClass.NET/Controls/EnumDescriptionDisplay.cs index 5f638238..e2fa4c1b 100644 --- a/ReClass.NET/Controls/EnumDescriptionDisplay.cs +++ b/ReClass.NET/Controls/EnumDescriptionDisplay.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; using System.Linq; using System.Reflection; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class EnumDescriptionDisplay where TEnum : struct { diff --git a/ReClass.NET/Controls/HotSpotTextBox.cs b/ReClass.NET/Controls/HotSpotTextBox.cs index 70b19a64..218cdeb7 100644 --- a/ReClass.NET/Controls/HotSpotTextBox.cs +++ b/ReClass.NET/Controls/HotSpotTextBox.cs @@ -2,8 +2,9 @@ using System.ComponentModel; using System.Drawing; using System.Windows.Forms; +using ReClassNET.UI; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class HotSpotTextBox : TextBox { diff --git a/ReClass.NET/Controls/HotkeyBox.Designer.cs b/ReClass.NET/Controls/HotkeyBox.Designer.cs index 5654a7d5..c65ead37 100644 --- a/ReClass.NET/Controls/HotkeyBox.Designer.cs +++ b/ReClass.NET/Controls/HotkeyBox.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class HotkeyBox { diff --git a/ReClass.NET/Controls/HotkeyBox.cs b/ReClass.NET/Controls/HotkeyBox.cs index 8a5d1747..9a24e7b3 100644 --- a/ReClass.NET/Controls/HotkeyBox.cs +++ b/ReClass.NET/Controls/HotkeyBox.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.ComponentModel; using System.Linq; using System.Windows.Forms; using System.Windows.Forms.Design; using ReClassNET.Input; -namespace ReClassNET.UI +namespace ReClassNET.Controls { [Designer(typeof(HotkeyBoxDesigner))] public partial class HotkeyBox : UserControl diff --git a/ReClass.NET/Controls/IconButton.cs b/ReClass.NET/Controls/IconButton.cs index c2d80304..5d45a198 100644 --- a/ReClass.NET/Controls/IconButton.cs +++ b/ReClass.NET/Controls/IconButton.cs @@ -6,7 +6,7 @@ using System.Windows.Forms; using System.Windows.Forms.Design; -namespace ReClassNET.UI +namespace ReClassNET.Controls { /// /// Based on . diff --git a/ReClass.NET/Controls/MemoryPreviewPopUp.cs b/ReClass.NET/Controls/MemoryPreviewPopUp.cs index 0f13353d..218e24de 100644 --- a/ReClass.NET/Controls/MemoryPreviewPopUp.cs +++ b/ReClass.NET/Controls/MemoryPreviewPopUp.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.Contracts; @@ -8,8 +8,9 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Nodes; +using ReClassNET.UI; -namespace ReClassNET.UI +namespace ReClassNET.Controls { [ToolboxItem(false)] public class MemoryPreviewPopUp : ToolStripDropDown diff --git a/ReClass.NET/Controls/MemoryRecordList.Designer.cs b/ReClass.NET/Controls/MemoryRecordList.Designer.cs index 34475868..8f3e0379 100644 --- a/ReClass.NET/Controls/MemoryRecordList.Designer.cs +++ b/ReClass.NET/Controls/MemoryRecordList.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class MemoryRecordList { diff --git a/ReClass.NET/Controls/MemoryRecordList.cs b/ReClass.NET/Controls/MemoryRecordList.cs index 4bd53773..b3a06672 100644 --- a/ReClass.NET/Controls/MemoryRecordList.cs +++ b/ReClass.NET/Controls/MemoryRecordList.cs @@ -7,8 +7,9 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.MemoryScanner; +using ReClassNET.UI; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public delegate void MemorySearchResultControlResultDoubleClickEventHandler(object sender, MemoryRecord record); diff --git a/ReClass.NET/Controls/MemoryViewControl.Designer.cs b/ReClass.NET/Controls/MemoryViewControl.Designer.cs index a7e9ccc1..942c196d 100644 --- a/ReClass.NET/Controls/MemoryViewControl.Designer.cs +++ b/ReClass.NET/Controls/MemoryViewControl.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class MemoryViewControl { @@ -30,7 +30,7 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.repaintTimer = new System.Windows.Forms.Timer(this.components); - this.hotSpotEditBox = new ReClassNET.UI.HotSpotTextBox(); + this.hotSpotEditBox = new HotSpotTextBox(); this.nodeInfoToolTip = new System.Windows.Forms.ToolTip(this.components); this.SuspendLayout(); // @@ -49,7 +49,7 @@ private void InitializeComponent() this.hotSpotEditBox.TabIndex = 1; this.hotSpotEditBox.TabStop = false; this.hotSpotEditBox.Visible = false; - this.hotSpotEditBox.Committed += new ReClassNET.UI.HotSpotTextBoxCommitEventHandler(this.editBox_Committed); + this.hotSpotEditBox.Committed += new HotSpotTextBoxCommitEventHandler(this.editBox_Committed); // // nodeInfoToolTip // diff --git a/ReClass.NET/Controls/MemoryViewControl.cs b/ReClass.NET/Controls/MemoryViewControl.cs index f6cef494..c6d2742c 100644 --- a/ReClass.NET/Controls/MemoryViewControl.cs +++ b/ReClass.NET/Controls/MemoryViewControl.cs @@ -7,9 +7,10 @@ using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Nodes; +using ReClassNET.UI; using ReClassNET.Util; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public partial class MemoryViewControl : UserControl { diff --git a/ReClass.NET/Controls/NodeClickEventArgs.cs b/ReClass.NET/Controls/NodeClickEventArgs.cs index 70f3948a..3d9dd82f 100644 --- a/ReClass.NET/Controls/NodeClickEventArgs.cs +++ b/ReClass.NET/Controls/NodeClickEventArgs.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Windows.Forms; using ReClassNET.Memory; using ReClassNET.Nodes; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class NodeClickEventArgs : EventArgs { diff --git a/ReClass.NET/Controls/PlaceholderTextBox.cs b/ReClass.NET/Controls/PlaceholderTextBox.cs index 282bb08d..59734c10 100644 --- a/ReClass.NET/Controls/PlaceholderTextBox.cs +++ b/ReClass.NET/Controls/PlaceholderTextBox.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.Windows.Forms; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class PlaceholderTextBox : TextBox { diff --git a/ReClass.NET/Controls/ProjectView.Designer.cs b/ReClass.NET/Controls/ProjectView.Designer.cs index 1658a477..25d6422e 100644 --- a/ReClass.NET/Controls/ProjectView.Designer.cs +++ b/ReClass.NET/Controls/ProjectView.Designer.cs @@ -1,4 +1,4 @@ -namespace ReClassNET.UI +namespace ReClassNET.Controls { partial class ProjectView { diff --git a/ReClass.NET/Controls/ProjectView.cs b/ReClass.NET/Controls/ProjectView.cs index 94d1f27d..f1b12261 100644 --- a/ReClass.NET/Controls/ProjectView.cs +++ b/ReClass.NET/Controls/ProjectView.cs @@ -8,7 +8,7 @@ using ReClassNET.Nodes; using ReClassNET.Project; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public partial class ProjectView : UserControl { diff --git a/ReClass.NET/Controls/ViewInfo.cs b/ReClass.NET/Controls/ViewInfo.cs index 0519d37d..7f0028e5 100644 --- a/ReClass.NET/Controls/ViewInfo.cs +++ b/ReClass.NET/Controls/ViewInfo.cs @@ -1,9 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.Drawing; using ReClassNET.Memory; +using ReClassNET.UI; -namespace ReClassNET.UI +namespace ReClassNET.Controls { public class ViewInfo { diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs index 97f4561b..563902f1 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs @@ -1,7 +1,7 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Nodes; -using ReClassNET.UI; namespace ReClassNET.DataExchange.ReClass.Legacy { diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs index 6511cb04..fc5de075 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs @@ -1,7 +1,7 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Nodes; -using ReClassNET.UI; namespace ReClassNET.DataExchange.ReClass.Legacy { diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs index 96238c84..53c6bd13 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs @@ -1,8 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Nodes; -using ReClassNET.UI; namespace ReClassNET.DataExchange.ReClass.Legacy { diff --git a/ReClass.NET/Forms/AboutForm.Designer.cs b/ReClass.NET/Forms/AboutForm.Designer.cs index 25e94816..97793e12 100644 --- a/ReClass.NET/Forms/AboutForm.Designer.cs +++ b/ReClass.NET/Forms/AboutForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class AboutForm { @@ -29,7 +31,7 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm)); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.infoLabel = new System.Windows.Forms.Label(); this.platformLabel = new System.Windows.Forms.Label(); this.buildTimeLabel = new System.Windows.Forms.Label(); @@ -191,7 +193,7 @@ private void InitializeComponent() #endregion - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.Label infoLabel; private System.Windows.Forms.Label platformLabel; private System.Windows.Forms.Label buildTimeLabel; diff --git a/ReClass.NET/Forms/ClassSelectionForm.Designer.cs b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs index 7a2aa18f..cc441d54 100644 --- a/ReClass.NET/Forms/ClassSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/ClassSelectionForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class ClassSelectionForm { @@ -28,9 +30,9 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.classesListBox = new System.Windows.Forms.ListBox(); - this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.filterNameTextBox = new PlaceholderTextBox(); this.cancelButton = new System.Windows.Forms.Button(); this.selectButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); @@ -118,9 +120,9 @@ private void InitializeComponent() #endregion - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.ListBox classesListBox; - private UI.PlaceholderTextBox filterNameTextBox; + private PlaceholderTextBox filterNameTextBox; private System.Windows.Forms.Button cancelButton; private System.Windows.Forms.Button selectButton; } diff --git a/ReClass.NET/Forms/CodeForm.Designer.cs b/ReClass.NET/Forms/CodeForm.Designer.cs index fee807e4..4c419b03 100644 --- a/ReClass.NET/Forms/CodeForm.Designer.cs +++ b/ReClass.NET/Forms/CodeForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class CodeForm { @@ -28,7 +30,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.codeRichTextBox = new System.Windows.Forms.RichTextBox(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); @@ -71,7 +73,7 @@ private void InitializeComponent() } #endregion - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.RichTextBox codeRichTextBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumEditorForm.Designer.cs b/ReClass.NET/Forms/EnumEditorForm.Designer.cs index 998c6184..c06e2978 100644 --- a/ReClass.NET/Forms/EnumEditorForm.Designer.cs +++ b/ReClass.NET/Forms/EnumEditorForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class EnumEditorForm { @@ -28,7 +30,7 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.saveButton = new System.Windows.Forms.Button(); this.enumNameLabel = new System.Windows.Forms.Label(); this.cancelButton = new System.Windows.Forms.Button(); @@ -179,7 +181,7 @@ private void InitializeComponent() #endregion - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.Button saveButton; private System.Windows.Forms.Label enumNameLabel; private System.Windows.Forms.Button cancelButton; diff --git a/ReClass.NET/Forms/EnumEditorForm.cs b/ReClass.NET/Forms/EnumEditorForm.cs index 573ea1b9..cfdc5302 100644 --- a/ReClass.NET/Forms/EnumEditorForm.cs +++ b/ReClass.NET/Forms/EnumEditorForm.cs @@ -1,8 +1,9 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Windows.Forms; +using ReClassNET.Controls; using ReClassNET.Project; using ReClassNET.UI; diff --git a/ReClass.NET/Forms/EnumListForm.Designer.cs b/ReClass.NET/Forms/EnumListForm.Designer.cs index b03c4e31..44d1f381 100644 --- a/ReClass.NET/Forms/EnumListForm.Designer.cs +++ b/ReClass.NET/Forms/EnumListForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class EnumListForm { @@ -28,12 +30,12 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { - this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.filterNameTextBox = new PlaceholderTextBox(); this.itemListBox = new System.Windows.Forms.ListBox(); - this.bannerBox = new ReClassNET.UI.BannerBox(); - this.addEnumIconButton = new ReClassNET.UI.IconButton(); - this.removeEnumIconButton = new ReClassNET.UI.IconButton(); - this.editEnumIconButton = new ReClassNET.UI.IconButton(); + this.bannerBox = new BannerBox(); + this.addEnumIconButton = new IconButton(); + this.removeEnumIconButton = new IconButton(); + this.editEnumIconButton = new IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); // @@ -130,11 +132,11 @@ private void InitializeComponent() } #endregion - private UI.PlaceholderTextBox filterNameTextBox; + private PlaceholderTextBox filterNameTextBox; private System.Windows.Forms.ListBox itemListBox; - private UI.BannerBox bannerBox; - private UI.IconButton addEnumIconButton; - private UI.IconButton removeEnumIconButton; - private UI.IconButton editEnumIconButton; + private BannerBox bannerBox; + private IconButton addEnumIconButton; + private IconButton removeEnumIconButton; + private IconButton editEnumIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs index 3e96b886..6334244a 100644 --- a/ReClass.NET/Forms/EnumSelectionForm.Designer.cs +++ b/ReClass.NET/Forms/EnumSelectionForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class EnumSelectionForm { @@ -30,12 +32,12 @@ private void InitializeComponent() { this.selectButton = new System.Windows.Forms.Button(); this.cancelButton = new System.Windows.Forms.Button(); - this.filterNameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.filterNameTextBox = new PlaceholderTextBox(); this.itemListBox = new System.Windows.Forms.ListBox(); - this.bannerBox = new ReClassNET.UI.BannerBox(); - this.addEnumIconButton = new ReClassNET.UI.IconButton(); - this.removeEnumIconButton = new ReClassNET.UI.IconButton(); - this.editEnumIconButton = new ReClassNET.UI.IconButton(); + this.bannerBox = new BannerBox(); + this.addEnumIconButton = new IconButton(); + this.removeEnumIconButton = new IconButton(); + this.editEnumIconButton = new IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); // @@ -163,11 +165,11 @@ private void InitializeComponent() private System.Windows.Forms.Button selectButton; private System.Windows.Forms.Button cancelButton; - private UI.PlaceholderTextBox filterNameTextBox; + private PlaceholderTextBox filterNameTextBox; private System.Windows.Forms.ListBox itemListBox; - private UI.BannerBox bannerBox; - private UI.IconButton addEnumIconButton; - private UI.IconButton removeEnumIconButton; - private UI.IconButton editEnumIconButton; + private BannerBox bannerBox; + private IconButton addEnumIconButton; + private IconButton removeEnumIconButton; + private IconButton editEnumIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/FoundCodeForm.Designer.cs b/ReClass.NET/Forms/FoundCodeForm.Designer.cs index 1e1d5dcf..75df742e 100644 --- a/ReClass.NET/Forms/FoundCodeForm.Designer.cs +++ b/ReClass.NET/Forms/FoundCodeForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class FoundCodeForm { @@ -36,7 +38,7 @@ private void InitializeComponent() this.stopButton = new System.Windows.Forms.Button(); this.closeButton = new System.Windows.Forms.Button(); this.createFunctionButton = new System.Windows.Forms.Button(); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); @@ -194,6 +196,6 @@ private void InitializeComponent() private System.Windows.Forms.Button closeButton; private System.Windows.Forms.TextBox infoTextBox; private System.Windows.Forms.Button createFunctionButton; - private UI.BannerBox bannerBox; + private BannerBox bannerBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs b/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs index 6b75bc36..27a18a9f 100644 --- a/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs +++ b/ReClass.NET/Forms/InputCorrelatorForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class InputCorrelatorForm { @@ -30,14 +32,14 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.refineTimer = new System.Windows.Forms.Timer(this.components); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.settingsGroupBox = new System.Windows.Forms.GroupBox(); this.removeButton = new System.Windows.Forms.Button(); this.addButton = new System.Windows.Forms.Button(); this.valueTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanValueTypeComboBox(); this.label1 = new System.Windows.Forms.Label(); this.hotkeyListBox = new System.Windows.Forms.ListBox(); - this.hotkeyBox = new ReClassNET.UI.HotkeyBox(); + this.hotkeyBox = new HotkeyBox(); this.startStopButton = new System.Windows.Forms.Button(); this.infoLabel = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); @@ -181,9 +183,9 @@ private void InitializeComponent() #endregion private System.Windows.Forms.Timer refineTimer; - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.GroupBox settingsGroupBox; - private UI.HotkeyBox hotkeyBox; + private HotkeyBox hotkeyBox; private System.Windows.Forms.ListBox hotkeyListBox; private System.Windows.Forms.Button removeButton; private System.Windows.Forms.Button addButton; diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index dc38bd37..71a1a118 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class MainForm { @@ -32,7 +34,7 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); this.splitContainer = new System.Windows.Forms.SplitContainer(); - this.projectView = new ReClassNET.UI.ProjectView(); + this.projectView = new ProjectView(); this.projectClassContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.deleteClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); @@ -51,26 +53,26 @@ private void InitializeComponent() this.editEnumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.projectEnumsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.editEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.memoryViewControl = new ReClassNET.UI.MemoryViewControl(); + this.memoryViewControl = new MemoryViewControl(); this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.integerToolStripMenuItem1 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem2 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem3 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem4 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem5 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem6 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem7 = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem1 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem2 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem3 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem4 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem5 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem6 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem7 = new IntegerToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.insertBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.integerToolStripMenuItem8 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem9 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem10 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem11 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem12 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem13 = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.integerToolStripMenuItem14 = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem8 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem9 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem10 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem11 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem12 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem13 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem14 = new IntegerToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.createClassFromNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -105,22 +107,22 @@ private void InitializeComponent() this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.newClassToolStripButton = new System.Windows.Forms.ToolStripButton(); this.addBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.add4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.add4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.add4BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add8BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add64BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add256BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add1024BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add2048BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add4096BytesToolStripMenuItem = new IntegerToolStripMenuItem(); this.addXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.insertBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.insert4BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert8BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert64BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert256BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert1024BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert2048BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); - this.insert4096BytesToolStripMenuItem = new ReClassNET.UI.IntegerToolStripMenuItem(); + this.insert4BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert8BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert64BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert256BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert1024BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert2048BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert4096BytesToolStripMenuItem = new IntegerToolStripMenuItem(); this.insertXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.nodeTypesToolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); this.statusStrip = new System.Windows.Forms.StatusStrip(); @@ -213,7 +215,7 @@ private void InitializeComponent() this.projectView.Name = "projectView"; this.projectView.Size = new System.Drawing.Size(201, 524); this.projectView.TabIndex = 0; - this.projectView.SelectionChanged += new ReClassNET.UI.ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); + this.projectView.SelectionChanged += new ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); // // projectClassContextMenuStrip // @@ -362,11 +364,11 @@ private void InitializeComponent() this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Size = new System.Drawing.Size(936, 524); this.memoryViewControl.TabIndex = 0; - this.memoryViewControl.DrawContextRequested += new ReClassNET.UI.DrawContextRequestEventHandler(this.memoryViewControl_DrawContextRequested); + this.memoryViewControl.DrawContextRequested += new DrawContextRequestEventHandler(this.memoryViewControl_DrawContextRequested); this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); - this.memoryViewControl.ChangeClassTypeClick += new ReClassNET.UI.NodeClickEventHandler(this.memoryViewControl_ChangeClassTypeClick); - this.memoryViewControl.ChangeWrappedTypeClick += new ReClassNET.UI.NodeClickEventHandler(this.memoryViewControl_ChangeWrappedTypeClick); - this.memoryViewControl.ChangeEnumTypeClick += new ReClassNET.UI.NodeClickEventHandler(this.memoryViewControl_ChangeEnumTypeClick); + this.memoryViewControl.ChangeClassTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeClassTypeClick); + this.memoryViewControl.ChangeWrappedTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeWrappedTypeClick); + this.memoryViewControl.ChangeEnumTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeEnumTypeClick); this.memoryViewControl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.memoryViewControl_KeyDown); // // selectedNodeContextMenuStrip @@ -1388,7 +1390,7 @@ private void InitializeComponent() #endregion - private UI.MemoryViewControl memoryViewControl; + private MemoryViewControl memoryViewControl; private System.Windows.Forms.StatusStrip statusStrip; private System.Windows.Forms.MenuStrip mainMenuStrip; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; @@ -1421,25 +1423,25 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; private System.Windows.Forms.ToolStripButton newClassToolStripButton; private System.Windows.Forms.ToolStripDropDownButton addBytesToolStripDropDownButton; - private UI.IntegerToolStripMenuItem add4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem add4096BytesToolStripMenuItem; + private IntegerToolStripMenuItem add4BytesToolStripMenuItem; + private IntegerToolStripMenuItem add8BytesToolStripMenuItem; + private IntegerToolStripMenuItem add64BytesToolStripMenuItem; + private IntegerToolStripMenuItem add256BytesToolStripMenuItem; + private IntegerToolStripMenuItem add1024BytesToolStripMenuItem; + private IntegerToolStripMenuItem add2048BytesToolStripMenuItem; + private IntegerToolStripMenuItem add4096BytesToolStripMenuItem; private System.Windows.Forms.ToolStripDropDownButton insertBytesToolStripDropDownButton; - private UI.IntegerToolStripMenuItem insert4BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert8BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert64BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert256BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert4BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert8BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert64BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert256BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert1024BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert2048BytesToolStripMenuItem; + private IntegerToolStripMenuItem insert4096BytesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem addXBytesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem insertXBytesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator nodeTypesToolStripSeparator; - private UI.ProjectView projectView; + private ProjectView projectView; private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem cleanUnusedClassesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; @@ -1459,21 +1461,21 @@ private void InitializeComponent() private System.Windows.Forms.ContextMenuStrip selectedNodeContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem changeTypeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem addBytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem1; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem2; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem3; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem4; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem5; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem6; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem7; + private IntegerToolStripMenuItem integerToolStripMenuItem1; + private IntegerToolStripMenuItem integerToolStripMenuItem2; + private IntegerToolStripMenuItem integerToolStripMenuItem3; + private IntegerToolStripMenuItem integerToolStripMenuItem4; + private IntegerToolStripMenuItem integerToolStripMenuItem5; + private IntegerToolStripMenuItem integerToolStripMenuItem6; + private IntegerToolStripMenuItem integerToolStripMenuItem7; private System.Windows.Forms.ToolStripMenuItem insertBytesToolStripMenuItem; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem8; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem9; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem10; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem11; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem12; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem13; - private UI.IntegerToolStripMenuItem integerToolStripMenuItem14; + private IntegerToolStripMenuItem integerToolStripMenuItem8; + private IntegerToolStripMenuItem integerToolStripMenuItem9; + private IntegerToolStripMenuItem integerToolStripMenuItem10; + private IntegerToolStripMenuItem integerToolStripMenuItem11; + private IntegerToolStripMenuItem integerToolStripMenuItem12; + private IntegerToolStripMenuItem integerToolStripMenuItem13; + private IntegerToolStripMenuItem integerToolStripMenuItem14; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem createClassFromNodesToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; diff --git a/ReClass.NET/Forms/MainForm.Functions.cs b/ReClass.NET/Forms/MainForm.Functions.cs index 8339bcf0..84f1b53a 100644 --- a/ReClass.NET/Forms/MainForm.Functions.cs +++ b/ReClass.NET/Forms/MainForm.Functions.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using ReClassNET.CodeGenerator; +using ReClassNET.Controls; using ReClassNET.DataExchange.ReClass; using ReClassNET.Extensions; using ReClassNET.Logger; diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 7df1daff..32526168 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using ReClassNET.AddressParser; using ReClassNET.CodeGenerator; +using ReClassNET.Controls; using ReClassNET.Core; using ReClassNET.DataExchange.ReClass; using ReClassNET.Extensions; diff --git a/ReClass.NET/Forms/NamedAddressesForm.Designer.cs b/ReClass.NET/Forms/NamedAddressesForm.Designer.cs index ed7e807c..a6a8a6e3 100644 --- a/ReClass.NET/Forms/NamedAddressesForm.Designer.cs +++ b/ReClass.NET/Forms/NamedAddressesForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class NamedAddressesForm { @@ -28,12 +30,12 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { - this.bannerBox = new ReClassNET.UI.BannerBox(); - this.addressTextBox = new ReClassNET.UI.PlaceholderTextBox(); - this.nameTextBox = new ReClassNET.UI.PlaceholderTextBox(); + this.bannerBox = new BannerBox(); + this.addressTextBox = new PlaceholderTextBox(); + this.nameTextBox = new PlaceholderTextBox(); this.namedAddressesListBox = new System.Windows.Forms.ListBox(); - this.removeAddressIconButton = new ReClassNET.UI.IconButton(); - this.addAddressIconButton = new ReClassNET.UI.IconButton(); + this.removeAddressIconButton = new IconButton(); + this.addAddressIconButton = new IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.SuspendLayout(); // @@ -128,11 +130,11 @@ private void InitializeComponent() #endregion - private UI.BannerBox bannerBox; - private UI.PlaceholderTextBox addressTextBox; - private UI.PlaceholderTextBox nameTextBox; + private BannerBox bannerBox; + private PlaceholderTextBox addressTextBox; + private PlaceholderTextBox nameTextBox; private System.Windows.Forms.ListBox namedAddressesListBox; - private UI.IconButton removeAddressIconButton; - private UI.IconButton addAddressIconButton; + private IconButton removeAddressIconButton; + private IconButton addAddressIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs index 0caecd06..86a82777 100644 --- a/ReClass.NET/Forms/PluginForm.Designer.cs +++ b/ReClass.NET/Forms/PluginForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class PluginForm { @@ -43,7 +45,7 @@ private void InitializeComponent() this.label1 = new System.Windows.Forms.Label(); this.getMoreLinkLabel = new System.Windows.Forms.LinkLabel(); this.closeButton = new System.Windows.Forms.Button(); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.tabControl.SuspendLayout(); this.pluginsTabPage.SuspendLayout(); this.descriptionGroupBox.SuspendLayout(); @@ -275,7 +277,7 @@ private void InitializeComponent() private System.Windows.Forms.DataGridViewTextBoxColumn nameColumn; private System.Windows.Forms.DataGridViewTextBoxColumn versionColumn; private System.Windows.Forms.DataGridViewTextBoxColumn authorColumn; - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.ComboBox functionsProvidersComboBox; private System.Windows.Forms.Label label2; } diff --git a/ReClass.NET/Forms/ProcessBrowserForm.Designer.cs b/ReClass.NET/Forms/ProcessBrowserForm.Designer.cs index d8677633..d4e111d5 100644 --- a/ReClass.NET/Forms/ProcessBrowserForm.Designer.cs +++ b/ReClass.NET/Forms/ProcessBrowserForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class ProcessBrowserForm { @@ -42,7 +44,7 @@ private void InitializeComponent() this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.filterTextBox = new System.Windows.Forms.TextBox(); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); ((System.ComponentModel.ISupportInitialize)(this.processDataGridView)).BeginInit(); this.filterGroupBox.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); @@ -271,6 +273,6 @@ private void InitializeComponent() private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox filterTextBox; - private UI.BannerBox bannerBox; + private BannerBox bannerBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs index c4d9e46b..8be2cb73 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class ProcessInfoForm { @@ -41,7 +43,7 @@ private void InitializeComponent() this.protectionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.typeColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.moduleColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.bannerBox1 = new ReClassNET.UI.BannerBox(); + this.bannerBox1 = new BannerBox(); this.tabControl = new System.Windows.Forms.TabControl(); this.modulesTabPage = new System.Windows.Forms.TabPage(); this.modulesDataGridView = new System.Windows.Forms.DataGridView(); @@ -325,7 +327,7 @@ private void InitializeComponent() private System.Windows.Forms.ContextMenuStrip contextMenuStrip; private System.Windows.Forms.ToolStripMenuItem setCurrentClassAddressToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem createClassAtAddressToolStripMenuItem; - private UI.BannerBox bannerBox1; + private BannerBox bannerBox1; private System.Windows.Forms.TabControl tabControl; private System.Windows.Forms.TabPage modulesTabPage; private System.Windows.Forms.DataGridView modulesDataGridView; diff --git a/ReClass.NET/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs index ccde5411..58d867ea 100644 --- a/ReClass.NET/Forms/ScannerForm.Designer.cs +++ b/ReClass.NET/Forms/ScannerForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class ScannerForm { @@ -29,14 +31,14 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.filterGroupBox = new System.Windows.Forms.GroupBox(); this.valueTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanValueTypeComboBox(); this.label3 = new System.Windows.Forms.Label(); this.compareTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanCompareTypeComboBox(); this.label1 = new System.Windows.Forms.Label(); this.isHexCheckBox = new System.Windows.Forms.CheckBox(); - this.dualValueBox = new ReClassNET.UI.DualValueBox(); + this.dualValueBox = new DualValueBox(); this.scanOptionsGroupBox = new System.Windows.Forms.GroupBox(); this.fastScanAlignmentTextBox = new System.Windows.Forms.TextBox(); this.fastScanCheckBox = new System.Windows.Forms.CheckBox(); @@ -65,7 +67,7 @@ private void InitializeComponent() this.scanProgressBar = new System.Windows.Forms.ProgressBar(); this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); - this.resultMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); + this.resultMemoryRecordList = new MemoryRecordList(); this.resultListContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.addSelectedResultsToAddressListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeSelectedRecordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -82,7 +84,7 @@ private void InitializeComponent() this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addressListMemoryRecordList = new ReClassNET.UI.MemoryRecordList(); + this.addressListMemoryRecordList = new MemoryRecordList(); this.toolStripPanel = new System.Windows.Forms.ToolStripPanel(); this.menuToolStrip = new System.Windows.Forms.ToolStrip(); this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); @@ -91,9 +93,9 @@ private void InitializeComponent() this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.undoIconButton = new ReClassNET.UI.IconButton(); - this.showInputCorrelatorIconButton = new ReClassNET.UI.IconButton(); - this.cancelScanIconButton = new ReClassNET.UI.IconButton(); + this.undoIconButton = new IconButton(); + this.showInputCorrelatorIconButton = new IconButton(); + this.cancelScanIconButton = new IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -513,7 +515,7 @@ private void InitializeComponent() this.resultMemoryRecordList.ShowValueTypeColumn = false; this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 314); this.resultMemoryRecordList.TabIndex = 16; - this.resultMemoryRecordList.RecordDoubleClick += new ReClassNET.UI.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); + this.resultMemoryRecordList.RecordDoubleClick += new MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // // resultListContextMenuStrip // @@ -811,9 +813,9 @@ private void InitializeComponent() #endregion - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.GroupBox filterGroupBox; - private UI.DualValueBox dualValueBox; + private DualValueBox dualValueBox; private System.Windows.Forms.CheckBox isHexCheckBox; private ScanCompareTypeComboBox compareTypeComboBox; private System.Windows.Forms.Label label1; @@ -847,8 +849,8 @@ private void InitializeComponent() private System.Windows.Forms.ProgressBar scanProgressBar; private System.Windows.Forms.Label resultCountLabel; private System.Windows.Forms.Timer updateValuesTimer; - private UI.MemoryRecordList resultMemoryRecordList; - private UI.MemoryRecordList addressListMemoryRecordList; + private MemoryRecordList resultMemoryRecordList; + private MemoryRecordList addressListMemoryRecordList; private System.Windows.Forms.ToolStripPanel toolStripPanel; private System.Windows.Forms.ToolStrip menuToolStrip; private System.Windows.Forms.ToolStripButton openAddressFileToolStripButton; @@ -873,8 +875,8 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem valueToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripMenuItem copyAddressToolStripMenuItem; - private UI.IconButton undoIconButton; - private UI.IconButton showInputCorrelatorIconButton; - private UI.IconButton cancelScanIconButton; + private IconButton undoIconButton; + private IconButton showInputCorrelatorIconButton; + private IconButton cancelScanIconButton; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index 03a38858..c52e7187 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using ReClassNET.Controls; using ReClassNET.DataExchange.Scanner; using ReClassNET.Extensions; using ReClassNET.Logger; diff --git a/ReClass.NET/Forms/SettingsForm.Designer.cs b/ReClass.NET/Forms/SettingsForm.Designer.cs index 517e8196..d00f8b9d 100644 --- a/ReClass.NET/Forms/SettingsForm.Designer.cs +++ b/ReClass.NET/Forms/SettingsForm.Designer.cs @@ -1,4 +1,6 @@ -namespace ReClassNET.Forms +using ReClassNET.Controls; + +namespace ReClassNET.Forms { partial class SettingsForm { @@ -54,32 +56,32 @@ private void InitializeComponent() this.nodeColorGroupBox = new System.Windows.Forms.GroupBox(); this.nodeValueLabel = new System.Windows.Forms.Label(); this.nodePluginLabel = new System.Windows.Forms.Label(); - this.nodeHexValueColorBox = new ReClassNET.UI.ColorBox(); - this.nodePluginColorBox = new ReClassNET.UI.ColorBox(); + this.nodeHexValueColorBox = new ColorBox(); + this.nodePluginColorBox = new ColorBox(); this.nodeHexValueLabel = new System.Windows.Forms.Label(); this.nodeVTableLabel = new System.Windows.Forms.Label(); - this.nodeOffsetColorBox = new ReClassNET.UI.ColorBox(); - this.nodeVTableColorBox = new ReClassNET.UI.ColorBox(); + this.nodeOffsetColorBox = new ColorBox(); + this.nodeVTableColorBox = new ColorBox(); this.nodeOffsetLabel = new System.Windows.Forms.Label(); this.nodeTextLabel = new System.Windows.Forms.Label(); - this.nodeAddressColorBox = new ReClassNET.UI.ColorBox(); - this.nodeTextColorBox = new ReClassNET.UI.ColorBox(); + this.nodeAddressColorBox = new ColorBox(); + this.nodeTextColorBox = new ColorBox(); this.nodeAddressLabel = new System.Windows.Forms.Label(); this.nodeCommentLabel = new System.Windows.Forms.Label(); - this.nodeHiddenColorBox = new ReClassNET.UI.ColorBox(); - this.nodeCommentColorBox = new ReClassNET.UI.ColorBox(); + this.nodeHiddenColorBox = new ColorBox(); + this.nodeCommentColorBox = new ColorBox(); this.nodeHiddenLabel = new System.Windows.Forms.Label(); this.nodeIndexLabel = new System.Windows.Forms.Label(); - this.nodeSelectedColorBox = new ReClassNET.UI.ColorBox(); - this.nodeIndexColorBox = new ReClassNET.UI.ColorBox(); + this.nodeSelectedColorBox = new ColorBox(); + this.nodeIndexColorBox = new ColorBox(); this.nodeSelectedLabel = new System.Windows.Forms.Label(); - this.nodeTypeColorBox = new ReClassNET.UI.ColorBox(); - this.nodeValueColorBox = new ReClassNET.UI.ColorBox(); + this.nodeTypeColorBox = new ColorBox(); + this.nodeValueColorBox = new ColorBox(); this.nodeTypeLabel = new System.Windows.Forms.Label(); this.nodeNameLabel = new System.Windows.Forms.Label(); - this.nodeNameColorBox = new ReClassNET.UI.ColorBox(); + this.nodeNameColorBox = new ColorBox(); this.backgroundLabel = new System.Windows.Forms.Label(); - this.backgroundColorBox = new ReClassNET.UI.ColorBox(); + this.backgroundColorBox = new ColorBox(); this.typeDefinitionsSettingsTabPage = new System.Windows.Forms.TabPage(); this.boolSettingsLabel = new System.Windows.Forms.Label(); this.boolTypeTextBox = new System.Windows.Forms.TextBox(); @@ -122,7 +124,7 @@ private void InitializeComponent() this.int16TypeTextBox = new System.Windows.Forms.TextBox(); this.int8SettingsLabel = new System.Windows.Forms.Label(); this.int8TypeTextBox = new System.Windows.Forms.TextBox(); - this.bannerBox = new ReClassNET.UI.BannerBox(); + this.bannerBox = new BannerBox(); this.settingsTabControl.SuspendLayout(); this.generalSettingsTabPage.SuspendLayout(); this.fileAssociationGroupBox.SuspendLayout(); @@ -1102,34 +1104,34 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox showPluginInfoCheckBox; private System.Windows.Forms.CheckBox showStringCheckBox; private System.Windows.Forms.CheckBox showSymbolsCheckBox; - private UI.ColorBox backgroundColorBox; + private ColorBox backgroundColorBox; private System.Windows.Forms.Label nodeSelectedLabel; - private UI.ColorBox nodeSelectedColorBox; + private ColorBox nodeSelectedColorBox; private System.Windows.Forms.Label nodeHiddenLabel; - private UI.ColorBox nodeHiddenColorBox; + private ColorBox nodeHiddenColorBox; private System.Windows.Forms.Label nodeAddressLabel; - private UI.ColorBox nodeAddressColorBox; + private ColorBox nodeAddressColorBox; private System.Windows.Forms.Label nodeOffsetLabel; - private UI.ColorBox nodeOffsetColorBox; + private ColorBox nodeOffsetColorBox; private System.Windows.Forms.Label nodeHexValueLabel; - private UI.ColorBox nodeHexValueColorBox; + private ColorBox nodeHexValueColorBox; private System.Windows.Forms.Label backgroundLabel; private System.Windows.Forms.Label nodeValueLabel; - private UI.ColorBox nodeValueColorBox; + private ColorBox nodeValueColorBox; private System.Windows.Forms.Label nodeNameLabel; - private UI.ColorBox nodeNameColorBox; + private ColorBox nodeNameColorBox; private System.Windows.Forms.Label nodeTypeLabel; - private UI.ColorBox nodeTypeColorBox; + private ColorBox nodeTypeColorBox; private System.Windows.Forms.Label nodeVTableLabel; - private UI.ColorBox nodeVTableColorBox; + private ColorBox nodeVTableColorBox; private System.Windows.Forms.Label nodeTextLabel; - private UI.ColorBox nodeTextColorBox; + private ColorBox nodeTextColorBox; private System.Windows.Forms.Label nodeCommentLabel; - private UI.ColorBox nodeCommentColorBox; + private ColorBox nodeCommentColorBox; private System.Windows.Forms.Label nodeIndexLabel; - private UI.ColorBox nodeIndexColorBox; + private ColorBox nodeIndexColorBox; private System.Windows.Forms.Label nodePluginLabel; - private UI.ColorBox nodePluginColorBox; + private ColorBox nodePluginColorBox; private System.Windows.Forms.Label floatSettingsLabel; private System.Windows.Forms.TextBox floatTypeTextBox; private System.Windows.Forms.Label uint64SettingsLabel; @@ -1170,7 +1172,7 @@ private void InitializeComponent() private System.Windows.Forms.TextBox doubleTypeTextBox; private System.Windows.Forms.GroupBox nodeColorGroupBox; private System.Windows.Forms.Label label1; - private UI.BannerBox bannerBox; + private BannerBox bannerBox; private System.Windows.Forms.Label boolSettingsLabel; private System.Windows.Forms.TextBox boolTypeTextBox; private System.Windows.Forms.GroupBox fileAssociationGroupBox; diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index 9f52cac1..4c242fa3 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics.Contracts; using System.Windows.Forms; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Native; using ReClassNET.Project; diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs index d21d4c0c..3f72e24a 100644 --- a/ReClass.NET/Nodes/ArrayNode.cs +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -1,6 +1,6 @@ -using System; +using System; using System.Drawing; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs index a7e1c6f6..cf28ecd7 100644 --- a/ReClass.NET/Nodes/BaseFunctionNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 578b0a43..476fff1c 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index d58e7652..d6515452 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Linq; using System.Text; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index db0666fd..b32f745a 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 910e2b40..55057e0a 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -1,5 +1,6 @@ -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 19cd948f..05e21eb9 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index edbbfacc..5714b9f0 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -1,5 +1,6 @@ -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 4906b7a5..e35fd6b7 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -1,6 +1,7 @@ -using System.Diagnostics.Contracts; +using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index d7f8bee9..ea32e11b 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 462940da..5ec12c14 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 82b7d274..733d4f8f 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 488d9e19..b5f12f5a 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index c968a59c..d5c36a54 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -1,5 +1,6 @@ using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 49442810..7ce6a53f 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index c2cd44dc..7c0deda8 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 96a91c55..f4b16ca7 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; using System.Text; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.Project; diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 8e1da21d..4fe0072b 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 867d7c26..0f5311cb 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs index 7530d91c..74a8042c 100644 --- a/ReClass.NET/Nodes/FunctionPtrNode.cs +++ b/ReClass.NET/Nodes/FunctionPtrNode.cs @@ -1,5 +1,5 @@ -using System.Drawing; -using ReClassNET.UI; +using System.Drawing; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index 09c619a0..1c4c0165 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 3c31c6ac..5dc57825 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index 74472c65..9ba992d8 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index e1e903bd..bac7c22b 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -1,4 +1,5 @@ using System.Drawing; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 7c81307e..7d4c7e1e 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 4d0f375c..c495e9e0 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index 81b5e9b7..cd750b94 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 769be064..bd09480f 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index 68366ad7..0fbb8eea 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index 093e8d81..5018cc7e 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index 40f23531..bef0b97e 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index d84ef2f6..358c48a3 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Drawing; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 538ba5cd..81fb9bc8 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 0ef9ac50..081b574f 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index c60b643e..20464b9b 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index eda54e49..a5dec2c9 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -1,5 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Globalization; +using ReClassNET.Controls; using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index 8a7cef54..a0e3a175 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs index ec210c23..54ab0271 100644 --- a/ReClass.NET/Nodes/UTF16TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF16TextPtrNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index 0868a3ae..b7d9fa41 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs index 840717fd..97934150 100644 --- a/ReClass.NET/Nodes/UTF32TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF32TextPtrNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index 934c2d19..6fdbd0c3 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs index 71c7bfc8..ddebecd0 100644 --- a/ReClass.NET/Nodes/UTF8TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF8TextPtrNode.cs @@ -1,6 +1,6 @@ -using System.Drawing; +using System.Drawing; using System.Text; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs index 80d43c85..5506e8f9 100644 --- a/ReClass.NET/Nodes/UnionNode.cs +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index b23809e1..8464478d 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index 6b174376..6d5e93df 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 0bc97dbd..8ca4af3b 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -1,5 +1,6 @@ using System.Drawing; using System.Runtime.InteropServices; +using ReClassNET.Controls; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/VirtualMethodNode.cs b/ReClass.NET/Nodes/VirtualMethodNode.cs index 88b80a61..f71d6c90 100644 --- a/ReClass.NET/Nodes/VirtualMethodNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodNode.cs @@ -1,7 +1,7 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Drawing; -using ReClassNET.UI; +using ReClassNET.Controls; namespace ReClassNET.Nodes { diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index 846772f2..08d8fc65 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Drawing; using System.Linq; +using ReClassNET.Controls; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index e5e85161..689171ab 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using ReClassNET.Controls; using ReClassNET.Nodes; using ReClassNET.Plugins; From e82e0d8e55ada31141f9c51b143594dd2f0e4355 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 17:20:16 +0200 Subject: [PATCH 718/777] Added IconProvider. --- .../Controls/DrawContextRequestEventArgs.cs | 3 ++ ReClass.NET/Controls/MemoryViewControl.cs | 1 + ReClass.NET/Controls/ViewInfo.cs | 2 ++ ReClass.NET/Forms/MainForm.cs | 2 ++ ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 4 +-- ReClass.NET/Nodes/BaseHexNode.cs | 4 ++- ReClass.NET/Nodes/BaseMatrixNode.cs | 8 ++--- ReClass.NET/Nodes/BaseNode.cs | 33 +++++++++++-------- ReClass.NET/Nodes/BaseNumericNode.cs | 2 +- ReClass.NET/Nodes/BaseTextNode.cs | 5 +-- ReClass.NET/Nodes/BaseTextPtrNode.cs | 5 +-- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 8 ++--- ReClass.NET/Nodes/BitFieldNode.cs | 3 +- ReClass.NET/Nodes/BoolNode.cs | 3 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 4 +-- ReClass.NET/Nodes/ClassNode.cs | 2 +- ReClass.NET/Nodes/DoubleNode.cs | 2 +- ReClass.NET/Nodes/EnumNode.cs | 6 ++-- ReClass.NET/Nodes/FloatNode.cs | 2 +- ReClass.NET/Nodes/FunctionNode.cs | 6 ++-- ReClass.NET/Nodes/Int16Node.cs | 2 +- ReClass.NET/Nodes/Int32Node.cs | 2 +- ReClass.NET/Nodes/Int64Node.cs | 2 +- ReClass.NET/Nodes/Int8Node.cs | 2 +- ReClass.NET/Nodes/PointerNode.cs | 6 ++-- ReClass.NET/Nodes/UInt16Node.cs | 2 +- ReClass.NET/Nodes/UInt32Node.cs | 2 +- ReClass.NET/Nodes/UInt64Node.cs | 2 +- ReClass.NET/Nodes/UInt8Node.cs | 2 +- ReClass.NET/Nodes/UnionNode.cs | 2 +- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 2 +- ReClass.NET/ReClass.NET.csproj | 2 +- ReClass.NET/UI/IconProvider.cs | 31 +++++++++++++++++ ReClass.NET/UI/Icons.cs | 31 ----------------- 34 files changed, 108 insertions(+), 87 deletions(-) create mode 100644 ReClass.NET/UI/IconProvider.cs delete mode 100644 ReClass.NET/UI/Icons.cs diff --git a/ReClass.NET/Controls/DrawContextRequestEventArgs.cs b/ReClass.NET/Controls/DrawContextRequestEventArgs.cs index 2f57a36f..13c04d03 100644 --- a/ReClass.NET/Controls/DrawContextRequestEventArgs.cs +++ b/ReClass.NET/Controls/DrawContextRequestEventArgs.cs @@ -1,6 +1,7 @@ using System; using ReClassNET.Memory; using ReClassNET.Nodes; +using ReClassNET.UI; namespace ReClassNET.Controls { @@ -10,6 +11,8 @@ public class DrawContextRequestEventArgs : EventArgs public Settings Settings { get; set; } + public IconProvider IconProvider { get; set; } + public RemoteProcess Process { get; set; } public MemoryBuffer Memory { get; set; } diff --git a/ReClass.NET/Controls/MemoryViewControl.cs b/ReClass.NET/Controls/MemoryViewControl.cs index c6d2742c..34d8741c 100644 --- a/ReClass.NET/Controls/MemoryViewControl.cs +++ b/ReClass.NET/Controls/MemoryViewControl.cs @@ -126,6 +126,7 @@ protected override void OnPaint(PaintEventArgs e) Settings = args.Settings, Context = e.Graphics, Font = font, + IconProvider = args.IconProvider, Process = args.Process, Memory = args.Memory, CurrentTime = args.CurrentTime, diff --git a/ReClass.NET/Controls/ViewInfo.cs b/ReClass.NET/Controls/ViewInfo.cs index 7f0028e5..84b5fb91 100644 --- a/ReClass.NET/Controls/ViewInfo.cs +++ b/ReClass.NET/Controls/ViewInfo.cs @@ -12,6 +12,7 @@ public class ViewInfo public Graphics Context { get; set; } public FontEx Font { get; set; } + public IconProvider IconProvider { get; set; } public RemoteProcess Process { get; set; } public MemoryBuffer Memory { get; set; } @@ -31,6 +32,7 @@ public ViewInfo Clone() Settings = Settings, Context = Context, Font = Font, + IconProvider = IconProvider, Process = Process, Memory = Memory, CurrentTime = CurrentTime, diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 32526168..9b6aa9bb 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -27,6 +27,7 @@ namespace ReClassNET.Forms public partial class MainForm : IconForm { private readonly PluginManager pluginManager; + private readonly IconProvider iconProvider = new IconProvider(); private ReClassNetProject currentProject; public ReClassNetProject CurrentProject => currentProject; @@ -1011,6 +1012,7 @@ private void memoryViewControl_DrawContextRequested(object sender, DrawContextRe memoryViewBuffer.UpdateFrom(process, address); args.Settings = Program.Settings; + args.IconProvider = iconProvider; args.Process = process; args.Memory = memoryViewBuffer; args.Node = classNode; diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 476fff1c..0a4d4a9f 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -37,9 +37,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); - x = AddIcon(view, x, y, Icons.Function, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); var tx = x; diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index b32f745a..cce27cab 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -45,7 +45,9 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) AddSelection(view, x, y, view.Font.Height); - x += TextPadding + 16; + x = AddIconPadding(view, x); + x = AddIconPadding(view, x); + x = AddAddressOffset(view, x, y); if (!string.IsNullOrEmpty(text)) diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 55057e0a..7a1927d0 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -33,9 +33,9 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); - x = AddIcon(view, x, y, Icons.Matrix, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Matrix, HotSpot.NoneId, HotSpotType.None); var tx = x; @@ -83,9 +83,9 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); - x = AddIcon(view, x, y, Icons.Vector, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Vector, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 05e21eb9..953f2db9 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -20,7 +20,6 @@ public abstract class BaseNode internal static readonly List NodeInfoReader = new List(); - protected static readonly int TextPadding = Icons.Dimensions; protected static readonly int HiddenHeight = 0; private static int nodeIndex = 0; @@ -383,6 +382,11 @@ protected void AddSelection(ViewInfo view, int x, int y, int height) AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); } + protected int AddIconPadding(ViewInfo view, int x) + { + return x + view.IconProvider.Dimensions; + } + /// Draws an icon and adds a if is not . /// The view information. /// The x coordinate. @@ -397,19 +401,21 @@ protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotTy Contract.Requires(view.Context != null); Contract.Requires(icon != null); - if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0) + var size = view.IconProvider.Dimensions; + + if (y > view.ClientArea.Bottom || y + size < 0) { - return x + Icons.Dimensions; + return x + size; } - view.Context.DrawImage(icon, x + 2, y, Icons.Dimensions, Icons.Dimensions); + view.Context.DrawImage(icon, x + 2, y, size, size); if (id != HotSpot.NoneId) { - AddHotSpot(view, new Rectangle(x, y, Icons.Dimensions, Icons.Dimensions), string.Empty, id, type); + AddHotSpot(view, new Rectangle(x, y, size, size), string.Empty, id, type); } - return x + Icons.Dimensions; + return x + size; } /// Adds a togglable Open/Close icon. @@ -422,12 +428,13 @@ protected int AddOpenCloseIcon(ViewInfo view, int x, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0) + if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0) { - return x + Icons.Dimensions; + return x + view.IconProvider.Dimensions; } - return AddIcon(view, x, y, LevelsOpen[view.Level] ? Icons.OpenCloseOpen : Icons.OpenCloseClosed, 0, HotSpotType.OpenClose); + var icon = LevelsOpen[view.Level] ? view.IconProvider.OpenCloseOpen : view.IconProvider.OpenCloseClosed; + return AddIcon(view, x, y, icon, 0, HotSpotType.OpenClose); } /// Draws a context drop icon if the node is selected. @@ -438,14 +445,14 @@ protected void AddContextDropDownIcon(ViewInfo view, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (view.MultipleNodesSelected || y > view.ClientArea.Bottom || y + Icons.Dimensions < 0 || IsWrapped) + if (view.MultipleNodesSelected || y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) { return; } if (IsSelected) { - AddIcon(view, 0, y, Icons.DropArrow, 0, HotSpotType.Context); + AddIcon(view, 0, y, view.IconProvider.DropArrow, 0, HotSpotType.Context); } } @@ -457,14 +464,14 @@ protected void AddDeleteIcon(ViewInfo view, int y) Contract.Requires(view != null); Contract.Requires(view.Context != null); - if (y > view.ClientArea.Bottom || y + Icons.Dimensions < 0 || IsWrapped) + if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) { return; } if (IsSelected) { - AddIcon(view, view.ClientArea.Right - Icons.Dimensions, y, Icons.Delete, 0, HotSpotType.Delete); + AddIcon(view, view.ClientArea.Right - view.IconProvider.Dimensions, y, view.IconProvider.Delete, 0, HotSpotType.Delete); } } diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index 5714b9f0..c0a540fc 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -32,7 +32,7 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); x = AddIcon(view, x, y, icon, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index e35fd6b7..70b52dda 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -42,8 +42,9 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) AddSelection(view, x, y, view.Font.Height); - x += TextPadding; - x = AddIcon(view, x, y, Icons.Text, HotSpot.NoneId, HotSpotType.None); + x = AddIconPadding(view, x); + + x = AddIcon(view, x, y, view.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index ea32e11b..df0f6ee2 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -39,8 +39,9 @@ public Size DrawText(ViewInfo view, int x, int y, string type) AddSelection(view, x, y, view.Font.Height); - x += TextPadding; - x = AddIcon(view, x, y, Icons.Text, HotSpot.NoneId, HotSpotType.None); + x = AddIconPadding(view, x); + + x = AddIcon(view, x, y, view.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 5ec12c14..6694ba6f 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -40,7 +40,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type) AddSelection(view, x, y, view.Font.Height); x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.Array, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Array, HotSpot.NoneId, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); @@ -54,14 +54,14 @@ protected Size Draw(ViewInfo view, int x, int y, string type) x = AddText(view, x, y, view.Settings.IndexColor, IsReadOnly ? HotSpot.NoneId : 0, Count.ToString()); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]"); - x = AddIcon(view, x, y, Icons.LeftArrow, 2, HotSpotType.Click); + x = AddIcon(view, x, y, view.IconProvider.LeftArrow, 2, HotSpotType.Click); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "("); x = AddText(view, x, y, view.Settings.IndexColor, 1, CurrentIndex.ToString()); x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, ")"); - x = AddIcon(view, x, y, Icons.RightArrow, 3, HotSpotType.Click) + view.Font.Width; + x = AddIcon(view, x, y, view.IconProvider.RightArrow, 3, HotSpotType.Click) + view.Font.Width; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"") + view.Font.Width; - x = AddIcon(view, x + 2, y, Icons.Change, 4, HotSpotType.ChangeWrappedType); + x = AddIcon(view, x + 2, y, view.IconProvider.Change, 4, HotSpotType.ChangeWrappedType); x += view.Font.Width; x = AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 733d4f8f..f12b4f0b 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -122,7 +122,8 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x += TextPadding + Icons.Dimensions; + x = AddIconPadding(view, x); + x = AddIconPadding(view, x); x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index b5f12f5a..e448b8f4 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -25,7 +25,8 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x += TextPadding + Icons.Dimensions; + x = AddIconPadding(view, x); + x = AddIconPadding(view, x); x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index d5c36a54..a6395c6b 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -30,7 +30,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.Class, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); @@ -41,7 +41,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; } x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; + x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; x = AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 7ce6a53f..3c4897a3 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -96,7 +96,7 @@ public override Size Draw(ViewInfo view, int x, int y) var tx = x; - x = AddIcon(view, x, y, Icons.Class, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); x = AddText(view, x, y, view.Settings.OffsetColor, 0, AddressFormula) + view.Font.Width; x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Class") + view.Font.Width; diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index 7c0deda8..f37e4c08 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -17,7 +17,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000"), null); + return DrawNumeric(view, x, y, view.IconProvider.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index f4b16ca7..cc6f25df 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -146,9 +146,9 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); - x = AddIcon(view, x, y, Icons.Enum, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Enum, HotSpot.NoneId, HotSpotType.None); x = AddAddressOffset(view, x, y); @@ -158,7 +158,7 @@ public override Size Draw(ViewInfo view, int x, int y) x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; } x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; + x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 4fe0072b..73e47e7a 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -17,7 +17,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { - return DrawNumeric(view, x, y, Icons.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000"), null); + return DrawNumeric(view, x, y, view.IconProvider.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 0f5311cb..75dd6d2b 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -44,9 +44,9 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); - x += TextPadding; + x = AddIconPadding(view, x); - x = AddIcon(view, x, y, Icons.Function, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); var tx = x; @@ -82,7 +82,7 @@ public override Size Draw(ViewInfo view, int x, int y) y += view.Font.Height; x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, Icons.Change, 1, HotSpotType.ChangeClassType); + x = AddIcon(view, x, y, view.IconProvider.Change, 1, HotSpotType.ChangeClassType); size.Width = Math.Max(size.Width, x - origX); size.Height += view.Font.Height; diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index 7d4c7e1e..cba270a4 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int16", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index c495e9e0..28518e87 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int32", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index cd750b94..3cb9e8a5 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int64", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index bd09480f..4690a69b 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Signed, "Int8", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 358c48a3..0c7b5139 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -73,9 +73,9 @@ public override Size Draw(ViewInfo view, int x, int y) } else { - x += TextPadding; + x = AddIconPadding(view, x); } - x = AddIcon(view, x, y, Icons.Pointer, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Pointer, HotSpot.NoneId, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); @@ -89,7 +89,7 @@ public override Size Draw(ViewInfo view, int x, int y) { x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "") + view.Font.Width; } - x = AddIcon(view, x, y, Icons.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width; + x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width; var ptr = view.Memory.ReadIntPtr(Offset); diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 81fb9bc8..32177b36 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt16", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 081b574f..625f58a3 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt32", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 20464b9b..903a8bae 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt64", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index a5dec2c9..da5be305 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -20,7 +20,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(ViewInfo view, int x, int y) { var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, Icons.Unsigned, "UInt8", value.ToString(), $"0x{value:X}"); + return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs index 5506e8f9..e30eb3cb 100644 --- a/ReClass.NET/Nodes/UnionNode.cs +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -57,7 +57,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.Union, -1, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.Union, -1, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index 08d8fc65..64b10a65 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -47,7 +47,7 @@ public override Size Draw(ViewInfo view, int x, int y) AddSelection(view, x, y, view.Font.Height); x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, Icons.VTable, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(view, x, y, view.IconProvider.VirtualTable, HotSpot.NoneId, HotSpotType.None); var tx = x; x = AddAddressOffset(view, x, y); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 736b0388..c16db79d 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -371,6 +371,7 @@ Component + Component @@ -423,7 +424,6 @@ Component - Form diff --git a/ReClass.NET/UI/IconProvider.cs b/ReClass.NET/UI/IconProvider.cs new file mode 100644 index 00000000..f60bce26 --- /dev/null +++ b/ReClass.NET/UI/IconProvider.cs @@ -0,0 +1,31 @@ +using System.Drawing; + +namespace ReClassNET.UI +{ + public class IconProvider + { + public int Dimensions { get; } = DpiUtil.ScaleIntX(16); + + public Image OpenCloseOpen { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Open_Icon); + public Image OpenCloseClosed { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Closed_Icon); + public Image Delete { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Delete); + public Image DropArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Drop_Down); + public Image Class { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Class_Type); + public Image Enum { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Enum_Type); + public Image Array { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Array_Type); + public Image Union => Array; + public Image LeftArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Left_Button); + public Image RightArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Right_Button); + public Image Change { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Exchange_Button); + public Image Unsigned { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Unsigned_Type); + public Image Signed { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Signed_Type); + public Image Float { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Float_Type); + public Image Double { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Double_Type); + public Image Vector { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Vector_Type); + public Image Matrix { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Matrix_Type); + public Image Text { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Text_Type); + public Image Pointer { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Pointer_Type); + public Image Function { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Function_Type); + public Image VirtualTable { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Interface_Type); + } +} diff --git a/ReClass.NET/UI/Icons.cs b/ReClass.NET/UI/Icons.cs deleted file mode 100644 index 0ae65d0e..00000000 --- a/ReClass.NET/UI/Icons.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Drawing; - -namespace ReClassNET.UI -{ - public class Icons - { - public static int Dimensions { get; } = DpiUtil.ScaleIntX(16); - - public static Image OpenCloseOpen { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Open_Icon); - public static Image OpenCloseClosed { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Closed_Icon); - public static Image Delete { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Delete); - public static Image DropArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Button_Drop_Down); - public static Image Class { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Class_Type); - public static Image Enum { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Enum_Type); - public static Image Array { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Array_Type); - public static Image Union => Array; - public static Image LeftArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Left_Button); - public static Image RightArrow { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Right_Button); - public static Image Change { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Exchange_Button); - public static Image Unsigned { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Unsigned_Type); - public static Image Signed { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Signed_Type); - public static Image Float { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Float_Type); - public static Image Double { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Double_Type); - public static Image Vector { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Vector_Type); - public static Image Matrix { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Matrix_Type); - public static Image Text { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Text_Type); - public static Image Pointer { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Pointer_Type); - public static Image Function { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Function_Type); - public static Image VTable { get; } = DpiUtil.ScaleImage(Properties.Resources.B16x16_Interface_Type); - } -} From 924382387e89b40980e2970ce014eb2820f83717 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 19:53:41 +0200 Subject: [PATCH 719/777] Renamed ViewInfo to DrawContext. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 12 +-- .../Controls/{ViewInfo.cs => DrawContext.cs} | 10 +-- ReClass.NET/Controls/MemoryPreviewPopUp.cs | 30 +++---- ReClass.NET/Controls/MemoryViewControl.cs | 4 +- .../ReClass/Legacy/BaseClassArrayNode.cs | 4 +- .../ReClass/Legacy/ClassPointerNode.cs | 4 +- .../DataExchange/ReClass/Legacy/CustomNode.cs | 4 +- ReClass.NET/Nodes/ArrayNode.cs | 6 +- ReClass.NET/Nodes/BaseFunctionNode.cs | 6 +- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 4 +- ReClass.NET/Nodes/BaseHexCommentNode.cs | 2 +- ReClass.NET/Nodes/BaseHexNode.cs | 4 +- ReClass.NET/Nodes/BaseMatrixNode.cs | 8 +- ReClass.NET/Nodes/BaseNode.cs | 90 +++++++++---------- ReClass.NET/Nodes/BaseNumericNode.cs | 6 +- ReClass.NET/Nodes/BaseTextNode.cs | 4 +- ReClass.NET/Nodes/BaseTextPtrNode.cs | 6 +- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 6 +- ReClass.NET/Nodes/BitFieldNode.cs | 48 +++++----- ReClass.NET/Nodes/BoolNode.cs | 34 +++---- ReClass.NET/Nodes/ClassInstanceNode.cs | 40 ++++----- ReClass.NET/Nodes/ClassNode.cs | 30 +++---- ReClass.NET/Nodes/DoubleNode.cs | 4 +- ReClass.NET/Nodes/EnumNode.cs | 38 ++++---- ReClass.NET/Nodes/FloatNode.cs | 4 +- ReClass.NET/Nodes/FunctionNode.cs | 58 ++++++------ ReClass.NET/Nodes/FunctionPtrNode.cs | 4 +- ReClass.NET/Nodes/Hex16Node.cs | 4 +- ReClass.NET/Nodes/Hex32Node.cs | 6 +- ReClass.NET/Nodes/Hex64Node.cs | 6 +- ReClass.NET/Nodes/Hex8Node.cs | 4 +- ReClass.NET/Nodes/Int16Node.cs | 6 +- ReClass.NET/Nodes/Int32Node.cs | 6 +- ReClass.NET/Nodes/Int64Node.cs | 6 +- ReClass.NET/Nodes/Int8Node.cs | 6 +- ReClass.NET/Nodes/Matrix3x3Node.cs | 56 ++++++------ ReClass.NET/Nodes/Matrix3x4Node.cs | 68 +++++++------- ReClass.NET/Nodes/Matrix4x4Node.cs | 88 +++++++++--------- ReClass.NET/Nodes/PointerNode.cs | 46 +++++----- ReClass.NET/Nodes/UInt16Node.cs | 6 +- ReClass.NET/Nodes/UInt32Node.cs | 6 +- ReClass.NET/Nodes/UInt64Node.cs | 6 +- ReClass.NET/Nodes/UInt8Node.cs | 6 +- ReClass.NET/Nodes/UTF16TextNode.cs | 4 +- ReClass.NET/Nodes/UTF16TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UTF32TextNode.cs | 4 +- ReClass.NET/Nodes/UTF32TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UTF8TextNode.cs | 4 +- ReClass.NET/Nodes/UTF8TextPtrNode.cs | 4 +- ReClass.NET/Nodes/UnionNode.cs | 36 ++++---- ReClass.NET/Nodes/Vector2Node.cs | 18 ++-- ReClass.NET/Nodes/Vector3Node.cs | 24 ++--- ReClass.NET/Nodes/Vector4Node.cs | 28 +++--- ReClass.NET/Nodes/VirtualMethodNode.cs | 4 +- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 36 ++++---- ReClass.NET/ReClass.NET.csproj | 2 +- 56 files changed, 484 insertions(+), 484 deletions(-) rename ReClass.NET/Controls/{ViewInfo.cs => DrawContext.cs} (86%) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 10318705..71bca3a8 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -100,24 +100,24 @@ private class Utf8CharacterNode : BaseNode { public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); - public override Size Draw(ViewInfo view, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(ViewInfo view) => throw new NotImplementedException(); + public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); } private class Utf16CharacterNode : BaseNode { public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); - public override Size Draw(ViewInfo view, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(ViewInfo view) => throw new NotImplementedException(); + public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); } private class Utf32CharacterNode : BaseNode { public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); - public override Size Draw(ViewInfo view, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(ViewInfo view) => throw new NotImplementedException(); + public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); } #endregion diff --git a/ReClass.NET/Controls/ViewInfo.cs b/ReClass.NET/Controls/DrawContext.cs similarity index 86% rename from ReClass.NET/Controls/ViewInfo.cs rename to ReClass.NET/Controls/DrawContext.cs index 84b5fb91..6d233780 100644 --- a/ReClass.NET/Controls/ViewInfo.cs +++ b/ReClass.NET/Controls/DrawContext.cs @@ -6,11 +6,11 @@ namespace ReClassNET.Controls { - public class ViewInfo + public class DrawContext { public Settings Settings { get; set; } - public Graphics Context { get; set; } + public Graphics Graphics { get; set; } public FontEx Font { get; set; } public IconProvider IconProvider { get; set; } @@ -25,12 +25,12 @@ public class ViewInfo public int Level { get; set; } public bool MultipleNodesSelected { get; set; } - public ViewInfo Clone() + public DrawContext Clone() { - return new ViewInfo + return new DrawContext { Settings = Settings, - Context = Context, + Graphics = Graphics, Font = Font, IconProvider = IconProvider, Process = Process, diff --git a/ReClass.NET/Controls/MemoryPreviewPopUp.cs b/ReClass.NET/Controls/MemoryPreviewPopUp.cs index 218e24de..982edfcb 100644 --- a/ReClass.NET/Controls/MemoryPreviewPopUp.cs +++ b/ReClass.NET/Controls/MemoryPreviewPopUp.cs @@ -23,7 +23,7 @@ private class MemoryPreviewPanel : Panel { private const int MinNodeCount = 10; - public ViewInfo ViewInfo { get; } + public DrawContext DrawContext { get; } private readonly List nodes; @@ -35,7 +35,7 @@ public MemoryPreviewPanel(FontEx font) nodes = new List(); - ViewInfo = new ViewInfo + DrawContext = new DrawContext { Font = font, @@ -75,7 +75,7 @@ BaseHexNode CreateNode(int index) nodes.RemoveRange(count, nodes.Count - count); } - ViewInfo.Memory.Size = nodes.Select(n => n.MemorySize).Sum(); + DrawContext.Memory.Size = nodes.Select(n => n.MemorySize).Sum(); } /// Changes the number of nodes with the provided delta. @@ -100,29 +100,29 @@ private void CalculateSize() { var size = new Size( ToolTipWidth, - nodes.Sum(n => n.CalculateDrawnHeight(ViewInfo)) + ToolTipPadding + nodes.Sum(n => n.CalculateDrawnHeight(DrawContext)) + ToolTipPadding ); - ViewInfo.ClientArea = new Rectangle(ToolTipPadding / 2, ToolTipPadding / 2, size.Width - ToolTipPadding, size.Height - ToolTipPadding); + DrawContext.ClientArea = new Rectangle(ToolTipPadding / 2, ToolTipPadding / 2, size.Width - ToolTipPadding, size.Height - ToolTipPadding); Size = MinimumSize = MaximumSize = size; } protected override void OnPaint(PaintEventArgs e) { - ViewInfo.HotSpots.Clear(); + DrawContext.HotSpots.Clear(); // Some settings are not usefull for the preview. - ViewInfo.Settings = Program.Settings.Clone(); - ViewInfo.Settings.ShowNodeAddress = false; + DrawContext.Settings = Program.Settings.Clone(); + DrawContext.Settings.ShowNodeAddress = false; - ViewInfo.Context = e.Graphics; + DrawContext.Graphics = e.Graphics; - using (var brush = new SolidBrush(ViewInfo.Settings.BackgroundColor)) + using (var brush = new SolidBrush(DrawContext.Settings.BackgroundColor)) { e.Graphics.FillRectangle(brush, ClientRectangle); } - using (var pen = new Pen(ViewInfo.Settings.BackgroundColor.Invert(), 1)) + using (var pen = new Pen(DrawContext.Settings.BackgroundColor.Invert(), 1)) { e.Graphics.DrawRectangle(pen, new Rectangle(Bounds.X, Bounds.Y, Bounds.Width - 1, Bounds.Height - 1)); } @@ -131,7 +131,7 @@ protected override void OnPaint(PaintEventArgs e) int y = 2; foreach (var node in nodes) { - y += node.Draw(ViewInfo, x, y).Height; + y += node.Draw(DrawContext, x, y).Height; } } } @@ -213,15 +213,15 @@ public void InitializeMemory(RemoteProcess process, IntPtr address) memoryAddress = address; - panel.ViewInfo.Process = process; + panel.DrawContext.Process = process; - panel.ViewInfo.Memory.UpdateFrom(process, address); + panel.DrawContext.Memory.UpdateFrom(process, address); } /// Updates the memory buffer to get current data. public void UpdateMemory() { - panel.ViewInfo.Memory.UpdateFrom(panel.ViewInfo.Process, memoryAddress); + panel.DrawContext.Memory.UpdateFrom(panel.DrawContext.Process, memoryAddress); panel.Invalidate(); } diff --git a/ReClass.NET/Controls/MemoryViewControl.cs b/ReClass.NET/Controls/MemoryViewControl.cs index 34d8741c..64b8dfa4 100644 --- a/ReClass.NET/Controls/MemoryViewControl.cs +++ b/ReClass.NET/Controls/MemoryViewControl.cs @@ -121,10 +121,10 @@ protected override void OnPaint(PaintEventArgs e) memoryPreviewPopUp.UpdateMemory(); } - var view = new ViewInfo + var view = new DrawContext { Settings = args.Settings, - Context = e.Graphics, + Graphics = e.Graphics, Font = font, IconProvider = args.IconProvider, Process = args.Process, diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs index 563902f1..82006a0e 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs @@ -14,12 +14,12 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { throw new NotImplementedException(); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { throw new NotImplementedException(); } diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs index fc5de075..81588504 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs @@ -14,12 +14,12 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { throw new NotImplementedException(); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { throw new NotImplementedException(); } diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs index 53c6bd13..42c9bd05 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs @@ -15,12 +15,12 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { throw new NotImplementedException(); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { throw new NotImplementedException(); } diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs index 3f72e24a..6c30e194 100644 --- a/ReClass.NET/Nodes/ArrayNode.cs +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -22,12 +22,12 @@ public override void Initialize() ChangeInnerNode(IntPtr.Size == 4 ? (BaseNode)new Hex32Node() : new Hex64Node()); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, "Array"); + return Draw(context, x, y, "Array"); } - protected override Size DrawChild(ViewInfo view, int x, int y) + protected override Size DrawChild(DrawContext view, int x, int y) { var v = view.Clone(); v.Address = view.Address + Offset + InnerNode.MemorySize * CurrentIndex; diff --git a/ReClass.NET/Nodes/BaseFunctionNode.cs b/ReClass.NET/Nodes/BaseFunctionNode.cs index cf28ecd7..8e143585 100644 --- a/ReClass.NET/Nodes/BaseFunctionNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionNode.cs @@ -21,7 +21,7 @@ protected class FunctionNodeInstruction protected IntPtr Address = IntPtr.Zero; protected readonly List Instructions = new List(); - protected Size DrawInstructions(ViewInfo view, int tx, int y) + protected Size DrawInstructions(DrawContext view, int tx, int y) { Contract.Requires(view != null); @@ -38,12 +38,12 @@ protected Size DrawInstructions(ViewInfo view, int tx, int y) var x = AddText(view, tx, y, view.Settings.AddressColor, HotSpot.ReadOnlyId, instruction.Address) + 6; - view.Context.FillRectangle(brush, x, y, 1, view.Font.Height); + view.Graphics.FillRectangle(brush, x, y, 1, view.Font.Height); x += 6; x = Math.Max(AddText(view, x, y, view.Settings.HexColor, HotSpot.ReadOnlyId, instruction.Data) + 6, x + minWidth); - view.Context.FillRectangle(brush, x, y, 1, view.Font.Height); + view.Graphics.FillRectangle(brush, x, y, 1, view.Font.Height); x += 6; x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.ReadOnlyId, instruction.Instruction); diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 0a4d4a9f..577459f7 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -22,7 +22,7 @@ public override string GetToolTipText(HotSpot spot) return string.Join("\n", Instructions.Select(i => i.Instruction)); } - protected Size Draw(ViewInfo view, int x, int y, string type, string name) + protected Size Draw(DrawContext view, int x, int y, string type, string name) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -92,7 +92,7 @@ protected Size Draw(ViewInfo view, int x, int y, string type, string name) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden) { diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index d6515452..ca1421e1 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -10,7 +10,7 @@ namespace ReClassNET.Nodes { public abstract class BaseHexCommentNode : BaseHexNode { - protected int AddComment(ViewInfo view, int x, int y, float fvalue, IntPtr ivalue, UIntPtr uvalue) + protected int AddComment(DrawContext view, int x, int y, float fvalue, IntPtr ivalue, UIntPtr uvalue) { Contract.Requires(view != null); diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index cce27cab..f57dd68b 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -32,7 +32,7 @@ protected BaseHexNode() buffer = new byte[MemorySize]; } - protected Size Draw(ViewInfo view, int x, int y, string text, int length) + protected Size Draw(DrawContext view, int x, int y, string text, int length) { Contract.Requires(view != null); @@ -98,7 +98,7 @@ protected Size Draw(ViewInfo view, int x, int y, string text, int length) return new Size(x - origX, view.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index 7a1927d0..ac964051 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -17,7 +17,7 @@ protected BaseMatrixNode() protected delegate void DrawMatrixValues(int x, ref int maxX, ref int y); - protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatrixValues drawValues) + protected Size DrawMatrixType(DrawContext view, int x, int y, string type, DrawMatrixValues drawValues) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -65,7 +65,7 @@ protected Size DrawMatrixType(ViewInfo view, int x, int y, string type, DrawMatr } protected delegate void DrawVectorValues(ref int x, ref int y); - protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVectorValues drawValues) + protected Size DrawVectorType(DrawContext view, int x, int y, string type, DrawVectorValues drawValues) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -110,7 +110,7 @@ protected Size DrawVectorType(ViewInfo view, int x, int y, string type, DrawVect return new Size(x - origX, y - origY + view.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { @@ -125,7 +125,7 @@ public override int CalculateDrawnHeight(ViewInfo view) return height; } - protected abstract int CalculateValuesHeight(ViewInfo view); + protected abstract int CalculateValuesHeight(DrawContext view); public void Update(HotSpot spot, int max) { diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 953f2db9..41c1cd49 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -221,20 +221,20 @@ public virtual void ClearSelection() } /// Draws the node. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The pixel size the node occupies. - public abstract Size Draw(ViewInfo view, int x, int y); + public abstract Size Draw(DrawContext context, int x, int y); /// /// Calculates the height of the node if drawn. /// This method is used to determine if a node outside the visible area should be drawn. - /// The returned height must be equal to the height which is returned by the method. + /// The returned height must be equal to the height which is returned by the method. /// - /// The view information. + /// The drawing context. /// The calculated height. - public abstract int CalculateDrawnHeight(ViewInfo view); + public abstract int CalculateDrawnHeight(DrawContext view); /// Updates the node from the given . Sets the and of the node. /// The spot. @@ -268,12 +268,12 @@ internal void SetLevelOpen(int level, bool open) } /// Adds a the user can interact with. - /// The view information. + /// The drawing context. /// The spot. /// The text to edit. /// The id of the spot. /// The type of the spot. - protected void AddHotSpot(ViewInfo view, Rectangle spot, string text, int id, HotSpotType type) + protected void AddHotSpot(DrawContext view, Rectangle spot, string text, int id, HotSpotType type) { Contract.Requires(view != null); Contract.Requires(view.Memory != null); @@ -299,17 +299,17 @@ protected void AddHotSpot(ViewInfo view, Rectangle spot, string text, int id, Ho } /// Draws the specific text and adds a if is not . - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The color of the text. /// Id for the clickable area. /// The text to draw. /// The new x coordinate after drawing the text. - protected int AddText(ViewInfo view, int x, int y, Color color, int hitId, string text) + protected int AddText(DrawContext view, int x, int y, Color color, int hitId, string text) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); Contract.Requires(view.Font != null); Contract.Requires(text != null); @@ -323,10 +323,10 @@ protected int AddText(ViewInfo view, int x, int y, Color color, int hitId, strin AddHotSpot(view, rect, text, hitId, HotSpotType.Edit); } - view.Context.DrawStringEx(text, view.Font.Font, color, x, y); + view.Graphics.DrawStringEx(text, view.Font.Font, color, x, y); /*using (var brush = new SolidBrush(color)) { - view.Context.DrawString(text, view.Font.Font, brush, x, y); + context.Graphics.DrawString(text, context.Font.Font, brush, x, y); }*/ } @@ -334,14 +334,14 @@ protected int AddText(ViewInfo view, int x, int y, Color color, int hitId, strin } /// Draws the address and of the node. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the text. - protected int AddAddressOffset(ViewInfo view, int x, int y) + protected int AddAddressOffset(DrawContext view, int x, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); Contract.Requires(view.Font != null); if (view.Settings.ShowNodeOffset) @@ -358,14 +358,14 @@ protected int AddAddressOffset(ViewInfo view, int x, int y) } /// Draws a bar which indicates the selection status of the node. A for this area gets added too. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The height of the bar. - protected void AddSelection(ViewInfo view, int x, int y, int height) + protected void AddSelection(DrawContext view, int x, int y, int height) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); if (y > view.ClientArea.Bottom || y + height < 0 || IsWrapped) { @@ -376,29 +376,29 @@ protected void AddSelection(ViewInfo view, int x, int y, int height) { using var brush = new SolidBrush(view.Settings.SelectedColor); - view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, height); + view.Graphics.FillRectangle(brush, 0, y, view.ClientArea.Right, height); } AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); } - protected int AddIconPadding(ViewInfo view, int x) + protected int AddIconPadding(DrawContext view, int x) { return x + view.IconProvider.Dimensions; } /// Draws an icon and adds a if is not . - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The icon. /// The id of the spot. /// The type of the spot. /// The new x coordinate after drawing the icon. - protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotType type) + protected int AddIcon(DrawContext view, int x, int y, Image icon, int id, HotSpotType type) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); Contract.Requires(icon != null); var size = view.IconProvider.Dimensions; @@ -408,7 +408,7 @@ protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotTy return x + size; } - view.Context.DrawImage(icon, x + 2, y, size, size); + view.Graphics.DrawImage(icon, x + 2, y, size, size); if (id != HotSpot.NoneId) { @@ -419,14 +419,14 @@ protected int AddIcon(ViewInfo view, int x, int y, Image icon, int id, HotSpotTy } /// Adds a togglable Open/Close icon. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the icon. - protected int AddOpenCloseIcon(ViewInfo view, int x, int y) + protected int AddOpenCloseIcon(DrawContext view, int x, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0) { @@ -438,12 +438,12 @@ protected int AddOpenCloseIcon(ViewInfo view, int x, int y) } /// Draws a context drop icon if the node is selected. - /// The view information. + /// The drawing context. /// The y coordinate. - protected void AddContextDropDownIcon(ViewInfo view, int y) + protected void AddContextDropDownIcon(DrawContext view, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); if (view.MultipleNodesSelected || y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) { @@ -457,12 +457,12 @@ protected void AddContextDropDownIcon(ViewInfo view, int y) } /// Draws a delete icon if the node is selected. - /// The view information. + /// The drawing context. /// The y coordinate. - protected void AddDeleteIcon(ViewInfo view, int y) + protected void AddDeleteIcon(DrawContext view, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) { @@ -476,14 +476,14 @@ protected void AddDeleteIcon(ViewInfo view, int y) } /// Draws the . - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the comment. - protected virtual int AddComment(ViewInfo view, int x, int y) + protected virtual int AddComment(DrawContext view, int x, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); Contract.Requires(view.Font != null); x = AddText(view, x, y, view.Settings.CommentColor, HotSpot.NoneId, "//"); @@ -493,27 +493,27 @@ protected virtual int AddComment(ViewInfo view, int x, int y) } /// Draws a vertical line to show the hidden state. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The size of the drawing. - protected Size DrawHidden(ViewInfo view, int x, int y) + protected Size DrawHidden(DrawContext view, int x, int y) { Contract.Requires(view != null); - Contract.Requires(view.Context != null); + Contract.Requires(view.Graphics != null); using (var brush = new SolidBrush(IsSelected ? view.Settings.SelectedColor : view.Settings.HiddenColor)) { - view.Context.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); + view.Graphics.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); } return new Size(0, HiddenHeight); } /// Draws an error indicator if the used memory buffer is not valid. - /// The view information. + /// The drawing context. /// The y coordinate. - protected void DrawInvalidMemoryIndicatorIcon(ViewInfo view, int y) + protected void DrawInvalidMemoryIndicatorIcon(DrawContext view, int y) { if (!view.Memory.ContainsValidData) { @@ -535,14 +535,14 @@ public override int MemorySize } } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - Contract.Requires(view != null); + Contract.Requires(context != null); throw new NotImplementedException(); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { Contract.Requires(view != null); diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index c0a540fc..ae223dee 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes public abstract class BaseNumericNode : BaseNode { /// Draws the node. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The icon of the node. @@ -16,7 +16,7 @@ public abstract class BaseNumericNode : BaseNode /// The value of the node. /// An alternative value of the node. /// The pixel size the node occupies. - protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, string value, string alternativeValue) + protected Size DrawNumeric(DrawContext view, int x, int y, Image icon, string type, string value, string alternativeValue) { Contract.Requires(view != null); Contract.Requires(icon != null); @@ -58,7 +58,7 @@ protected Size DrawNumeric(ViewInfo view, int x, int y, Image icon, string type, return new Size(x - origX, view.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 70b52dda..213e0034 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -25,7 +25,7 @@ public override void CopyFromNode(BaseNode node) Length = node.MemorySize / CharacterSize; } - protected Size DrawText(ViewInfo view, int x, int y, string type) + protected Size DrawText(DrawContext view, int x, int y, string type) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -69,7 +69,7 @@ protected Size DrawText(ViewInfo view, int x, int y, string type) return new Size(x - origX, view.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index df0f6ee2..2afd4974 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -17,12 +17,12 @@ public abstract class BaseTextPtrNode : BaseNode public abstract Encoding Encoding { get; } /// Draws this node. - /// The view information. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The name of the type. /// The pixel size the node occupies. - public Size DrawText(ViewInfo view, int x, int y, string type) + public Size DrawText(DrawContext view, int x, int y, string type) { Contract.Requires(view != null); Contract.Requires(type != null); @@ -63,7 +63,7 @@ public Size DrawText(ViewInfo view, int x, int y, string type) return new Size(x - origX, view.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 6694ba6f..62ac318c 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -28,7 +28,7 @@ public override bool CanChangeInnerNodeTo(BaseNode node) return true; } - protected Size Draw(ViewInfo view, int x, int y, string type) + protected Size Draw(DrawContext view, int x, int y, string type) { if (IsHidden && !IsWrapped) { @@ -85,9 +85,9 @@ protected Size Draw(ViewInfo view, int x, int y, string type) return size; } - protected abstract Size DrawChild(ViewInfo view, int x, int y); + protected abstract Size DrawChild(DrawContext view, int x, int y); - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index f12b4f0b..cf44700a 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -108,76 +108,76 @@ private string ConvertValueToBitString(MemoryBuffer memory) } } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { const int BitsPerBlock = 4; if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); + x = AddIconPadding(context, x); - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bits") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Bits") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddOpenCloseIcon(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(context, x, y) + context.Font.Width; var tx = x - 3; for (var i = 0; i < bits; ++i) { - var rect = new Rectangle(x + (i + i / BitsPerBlock) * view.Font.Width, y, view.Font.Width, view.Font.Height); - AddHotSpot(view, rect, string.Empty, i, HotSpotType.Edit); + var rect = new Rectangle(x + (i + i / BitsPerBlock) * context.Font.Width, y, context.Font.Width, context.Font.Height); + AddHotSpot(context, rect, string.Empty, i, HotSpotType.Edit); } - var value = ConvertValueToBitString(view.Memory); + var value = ConvertValueToBitString(context.Memory); - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, value) + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, value) + context.Font.Width; - x += view.Font.Width; + x += context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - y += view.Font.Height; + y += context.Font.Height; var format = new StringFormat(StringFormatFlags.DirectionVertical); - using (var brush = new SolidBrush(view.Settings.ValueColor)) + using (var brush = new SolidBrush(context.Settings.ValueColor)) { var maxCharCount = bits + (bits / 4 - 1) - 1; for (int bitCount = 0, padding = 0; bitCount < bits; bitCount += 4, padding += 5) { - view.Context.DrawString(bitCount.ToString(), view.Font.Font, brush, tx + (maxCharCount - padding) * view.Font.Width, y, format); + context.Graphics.DrawString(bitCount.ToString(), context.Font.Font, brush, tx + (maxCharCount - padding) * context.Font.Width, y, format); } } y += 2; } - return new Size(x - origX, y - origY + view.Font.Height); + return new Size(x - origX, y - origY + context.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index e448b8f4..44e17e0a 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -14,42 +14,42 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Bool; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); + x = AddIconPadding(context, x); - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Bool") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Bool") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "=") + context.Font.Width; - var value = view.Memory.ReadUInt8(Offset); - x = AddText(view, x, y, view.Settings.ValueColor, 0, value == 0 ? "false" : "true") + view.Font.Width; + var value = context.Memory.ReadUInt8(Offset); + x = AddText(context, x, y, context.Settings.ValueColor, 0, value == 0 ? "false" : "true") + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index a6395c6b..d18646a8 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -17,47 +17,47 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Class_Instance; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, view.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); + x = AddOpenCloseIcon(context, x, y); + x = AddIcon(context, x, y, context.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Instance") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Instance") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeClassType) + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, $"<{InnerNode.Name}>") + context.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.Change, 4, HotSpotType.ChangeClassType) + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - y += view.Font.Height; + y += context.Font.Height; var size = new Size(x - origX, y - origY); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - var v = view.Clone(); - v.Address = view.Address + Offset; - v.Memory = view.Memory.Clone(); + var v = context.Clone(); + v.Address = context.Address + Offset; + v.Memory = context.Memory.Clone(); v.Memory.Offset += Offset; var innerSize = InnerNode.Draw(v, tx, y); @@ -68,7 +68,7 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 3c4897a3..65544d1c 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -85,34 +85,34 @@ public override void Initialize() AddBytes(IntPtr.Size); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - AddSelection(view, 0, y, view.Font.Height); + AddSelection(context, 0, y, context.Font.Height); var origX = x; var origY = y; - x = AddOpenCloseIcon(view, x, y); + x = AddOpenCloseIcon(context, x, y); var tx = x; - x = AddIcon(view, x, y, view.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); - x = AddText(view, x, y, view.Settings.OffsetColor, 0, AddressFormula) + view.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.Class, HotSpot.NoneId, HotSpotType.None); + x = AddText(context, x, y, context.Settings.OffsetColor, 0, AddressFormula) + context.Font.Width; - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Class") + view.Font.Width; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"[{MemorySize}]") + view.Font.Width; - x = AddComment(view, x, y); + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Class") + context.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, $"[{MemorySize}]") + context.Font.Width; + x = AddComment(context, x, y); - y += view.Font.Height; + y += context.Font.Height; var size = new Size(x - origX, y - origY); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { var childOffset = tx - origX; - var nv = view.Clone(); + var nv = context.Clone(); nv.Level++; foreach (var node in Nodes) { @@ -127,7 +127,7 @@ Size ExtendWidth(Size baseSize, int width) } // Draw the node if it is in the visible area. - if (view.ClientArea.Contains(tx, y)) + if (context.ClientArea.Contains(tx, y)) { var innerSize = node.Draw(nv, tx, y); @@ -141,7 +141,7 @@ Size ExtendWidth(Size baseSize, int width) var calculatedHeight = node.CalculateDrawnHeight(nv); // and check if the node area overlaps with the visible area... - if (new Rectangle(tx, y, 9999999, calculatedHeight).IntersectsWith(view.ClientArea)) + if (new Rectangle(tx, y, 9999999, calculatedHeight).IntersectsWith(context.ClientArea)) { // then draw the node... var innerSize = node.Draw(nv, tx, y); @@ -164,7 +164,7 @@ Size ExtendWidth(Size baseSize, int width) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden) { diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index f37e4c08..c7de5fee 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -15,9 +15,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Double; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawNumeric(view, x, y, view.IconProvider.Double, "Double", ReadValueFromMemory(view.Memory).ToString("0.000"), null); + return DrawNumeric(context, x, y, context.IconProvider.Double, "Double", ReadValueFromMemory(context.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index cc6f25df..411cd002 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -135,47 +135,47 @@ private string GetFlagsStringRepresentation(MemoryBuffer memory) return retval.ToString(); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Enum, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(context, x, y, context.IconProvider.Enum, HotSpot.NoneId, HotSpotType.None); - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Enum") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Enum") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeEnumType) + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, $"<{Enum.Name}>") + context.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.Change, 4, HotSpotType.ChangeEnumType) + context.Font.Width; - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "=") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, "=") + context.Font.Width; - var text = GetTextRepresentation(view.Memory); + var text = GetTextRepresentation(context.Memory); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, text) + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; } diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 73e47e7a..4b51c51f 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -15,9 +15,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Float; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawNumeric(view, x, y, view.IconProvider.Float, "Float", ReadValueFromMemory(view.Memory).ToString("0.000"), null); + return DrawNumeric(context, x, y, context.IconProvider.Float, "Float", ReadValueFromMemory(context.Memory).ToString("0.000"), null); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 75dd6d2b..30dfd5bd 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -31,62 +31,62 @@ public override string GetToolTipText(HotSpot spot) return string.Join("\n", Instructions.Select(i => i.Instruction)); } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - Contract.Requires(view != null); + Contract.Requires(context != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(context, x, y, context.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Function") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Function") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddOpenCloseIcon(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(context, x, y) + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - var size = new Size(x - origX, view.Font.Height); + var size = new Size(x - origX, context.Font.Height); - var ptr = view.Address + Offset; - DisassembleRemoteCode(view.Process, ptr); + var ptr = context.Address + Offset; + DisassembleRemoteCode(context.Process, ptr); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - y += view.Font.Height; - x = AddText(view, tx, y, view.Settings.TypeColor, HotSpot.NoneId, "Signature:") + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, 0, Signature); + y += context.Font.Height; + x = AddText(context, tx, y, context.Settings.TypeColor, HotSpot.NoneId, "Signature:") + context.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, 0, Signature); size.Width = Math.Max(size.Width, x - origX); - size.Height += view.Font.Height; + size.Height += context.Font.Height; - y += view.Font.Height; - x = AddText(view, tx, y, view.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>") + view.Font.Width; - x = AddIcon(view, x, y, view.IconProvider.Change, 1, HotSpotType.ChangeClassType); + y += context.Font.Height; + x = AddText(context, tx, y, context.Settings.TextColor, HotSpot.NoneId, "Belongs to: "); + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, BelongsToClass == null ? "" : $"<{BelongsToClass.Name}>") + context.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.Change, 1, HotSpotType.ChangeClassType); size.Width = Math.Max(size.Width, x - origX); - size.Height += view.Font.Height; + size.Height += context.Font.Height; - var instructionSize = DrawInstructions(view, tx, y + 4); + var instructionSize = DrawInstructions(context, tx, y + 4); size.Width = Math.Max(size.Width, instructionSize.Width + tx - origX); size.Height += instructionSize.Height + 4; } @@ -94,7 +94,7 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/FunctionPtrNode.cs b/ReClass.NET/Nodes/FunctionPtrNode.cs index 74a8042c..6b7d28e7 100644 --- a/ReClass.NET/Nodes/FunctionPtrNode.cs +++ b/ReClass.NET/Nodes/FunctionPtrNode.cs @@ -11,9 +11,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Function_Pointer; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, "FunctionPtr", Name); + return Draw(context, x, y, "FunctionPtr", Name); } } } diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index 1c4c0165..c567bda6 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -22,9 +22,9 @@ public override string GetToolTipText(HotSpot spot) return $"Int16: {value.ShortValue}\nUInt16: 0x{value.UShortValue:X04}"; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 2) + " " : null, 2); + return Draw(context, x, y, context.Settings.ShowNodeText ? context.Memory.ReadString(context.Settings.RawDataEncoding, Offset, 2) + " " : null, 2); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 5dc57825..75ebed62 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -32,9 +32,9 @@ public override string GetToolTipText(HotSpot spot) return $"Int32: {value.IntValue}\nUInt32: 0x{value.UIntValue:X08}\nFloat: {value.FloatValue:0.000}"; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 4) + " " : null, 4); + return Draw(context, x, y, context.Settings.ShowNodeText ? context.Memory.ReadString(context.Settings.RawDataEncoding, Offset, 4) + " " : null, 4); } public override void Update(HotSpot spot) @@ -42,7 +42,7 @@ public override void Update(HotSpot spot) Update(spot, 4); } - protected override int AddComment(ViewInfo view, int x, int y) + protected override int AddComment(DrawContext view, int x, int y) { x = base.AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index 9ba992d8..093bcdfb 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -32,9 +32,9 @@ public override string GetToolTipText(HotSpot spot) return $"Int64: {value.LongValue}\nUInt64: 0x{value.ULongValue:X016}\nFloat: {value.FloatValue:0.000}\nDouble: {value.DoubleValue:0.000}"; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 8) + " " : null, 8); + return Draw(context, x, y, context.Settings.ShowNodeText ? context.Memory.ReadString(context.Settings.RawDataEncoding, Offset, 8) + " " : null, 8); } public override void Update(HotSpot spot) @@ -42,7 +42,7 @@ public override void Update(HotSpot spot) Update(spot, 8); } - protected override int AddComment(ViewInfo view, int x, int y) + protected override int AddComment(DrawContext view, int x, int y) { x = base.AddComment(view, x, y); diff --git a/ReClass.NET/Nodes/Hex8Node.cs b/ReClass.NET/Nodes/Hex8Node.cs index bac7c22b..7c29884e 100644 --- a/ReClass.NET/Nodes/Hex8Node.cs +++ b/ReClass.NET/Nodes/Hex8Node.cs @@ -21,9 +21,9 @@ public override string GetToolTipText(HotSpot spot) return $"Int8: {(int)b}\nUInt8: 0x{b:X02}"; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, view.Settings.ShowNodeText ? view.Memory.ReadString(view.Settings.RawDataEncoding, Offset, 1) + " " : null, 1); + return Draw(context, x, y, context.Settings.ShowNodeText ? context.Memory.ReadString(context.Settings.RawDataEncoding, Offset, 1) + " " : null, 1); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int16Node.cs b/ReClass.NET/Nodes/Int16Node.cs index cba270a4..e67b2145 100644 --- a/ReClass.NET/Nodes/Int16Node.cs +++ b/ReClass.NET/Nodes/Int16Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Int_16; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int16", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "Int16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int32Node.cs b/ReClass.NET/Nodes/Int32Node.cs index 28518e87..5ba2090e 100644 --- a/ReClass.NET/Nodes/Int32Node.cs +++ b/ReClass.NET/Nodes/Int32Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Int_32; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int32", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "Int32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int64Node.cs b/ReClass.NET/Nodes/Int64Node.cs index 3cb9e8a5..935e4569 100644 --- a/ReClass.NET/Nodes/Int64Node.cs +++ b/ReClass.NET/Nodes/Int64Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Int_64; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int64", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "Int64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Int8Node.cs b/ReClass.NET/Nodes/Int8Node.cs index 4690a69b..fbfe4038 100644 --- a/ReClass.NET/Nodes/Int8Node.cs +++ b/ReClass.NET/Nodes/Int8Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Int_8; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Signed, "Int8", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "Int8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index 0fbb8eea..c0de02d8 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -41,48 +41,48 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Matrix_3x3; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => + return DrawMatrixType(context, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => { - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - y += view.Font.Height; + y += context.Font.Height; var x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value._21,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 4, $"{value._22,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 5, $"{value._23,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._21,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._22,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._23,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 6, $"{value._31,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._32,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 8, $"{value._33,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._31,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._32,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._33,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 3 * view.Font.Height; } diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index 5018cc7e..ab790584 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -47,54 +47,54 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Matrix_3x4; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => + return DrawMatrixType(context, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => { - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - y += view.Font.Height; + y += context.Font.Height; var x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._14,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 4, $"{value._21,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 5, $"{value._22,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 6, $"{value._23,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._21,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._22,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._23,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._24,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 8, $"{value._31,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 9, $"{value._32,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 10, $"{value._33,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._31,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 9, $"{value._32,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 10, $"{value._33,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 11, $"{value._34,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 3 * view.Font.Height; } diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index bef0b97e..097e1469 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -55,67 +55,67 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Matrix_4x4; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(view, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => + return DrawMatrixType(context, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => { - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - y += view.Font.Height; + y += context.Font.Height; var x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._14,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 4, $"{value._21,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 5, $"{value._22,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 6, $"{value._23,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._21,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._22,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._23,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._24,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 8, $"{value._31,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 9, $"{value._32,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 10, $"{value._33,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._31,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 9, $"{value._32,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 10, $"{value._33,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 11, $"{value._34,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); - y += view.Font.Height; + y += context.Font.Height; x = defaultX; - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(view, x, y, view.Settings.ValueColor, 12, $"{value._41,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 13, $"{value._42,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 14, $"{value._43,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 15, $"{value._44,14:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + x = AddText(context, x, y, context.Settings.ValueColor, 12, $"{value._41,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 13, $"{value._42,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 14, $"{value._43,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 15, $"{value._44,14:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); maxX = Math.Max(x, maxX); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 4 * view.Font.Height; } diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 0c7b5139..8920feb6 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -55,63 +55,63 @@ public override bool CanChangeInnerNodeTo(BaseNode node) return true; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); if (InnerNode != null) { - x = AddOpenCloseIcon(view, x, y); + x = AddOpenCloseIcon(context, x, y); } else { - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); } - x = AddIcon(view, x, y, view.IconProvider.Pointer, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(context, x, y, context.IconProvider.Pointer, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Ptr") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Ptr") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } if (InnerNode == null) { - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, "") + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, "") + context.Font.Width; } - x = AddIcon(view, x, y, view.IconProvider.Change, 4, HotSpotType.ChangeWrappedType) + view.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.Change, 4, HotSpotType.ChangeWrappedType) + context.Font.Width; - var ptr = view.Memory.ReadIntPtr(Offset); + var ptr = context.Memory.ReadIntPtr(Offset); - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, 0, "0x" + ptr.ToString(Constants.AddressHexFormat)) + view.Font.Width; + x = AddText(context, x, y, context.Settings.OffsetColor, HotSpot.NoneId, "->") + context.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, 0, "0x" + ptr.ToString(Constants.AddressHexFormat)) + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - y += view.Font.Height; + y += context.Font.Height; var size = new Size(x - origX, y - origY); - if (LevelsOpen[view.Level] && InnerNode != null) + if (LevelsOpen[context.Level] && InnerNode != null) { memory.Size = InnerNode.MemorySize; - memory.UpdateFrom(view.Process, ptr); + memory.UpdateFrom(context.Process, ptr); - var v = view.Clone(); + var v = context.Clone(); v.Address = ptr; v.Memory = memory; @@ -124,7 +124,7 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/UInt16Node.cs b/ReClass.NET/Nodes/UInt16Node.cs index 32177b36..47f72602 100644 --- a/ReClass.NET/Nodes/UInt16Node.cs +++ b/ReClass.NET/Nodes/UInt16Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UInt_16; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt16", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "UInt16", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt32Node.cs b/ReClass.NET/Nodes/UInt32Node.cs index 625f58a3..ad97faae 100644 --- a/ReClass.NET/Nodes/UInt32Node.cs +++ b/ReClass.NET/Nodes/UInt32Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UInt_32; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt32", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "UInt32", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt64Node.cs b/ReClass.NET/Nodes/UInt64Node.cs index 903a8bae..603eb784 100644 --- a/ReClass.NET/Nodes/UInt64Node.cs +++ b/ReClass.NET/Nodes/UInt64Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UInt_64; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt64", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "UInt64", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UInt8Node.cs b/ReClass.NET/Nodes/UInt8Node.cs index da5be305..ce6def15 100644 --- a/ReClass.NET/Nodes/UInt8Node.cs +++ b/ReClass.NET/Nodes/UInt8Node.cs @@ -17,10 +17,10 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UInt_8; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(view.Memory); - return DrawNumeric(view, x, y, view.IconProvider.Unsigned, "UInt8", value.ToString(), $"0x{value:X}"); + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "UInt8", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/UTF16TextNode.cs b/ReClass.NET/Nodes/UTF16TextNode.cs index a0e3a175..9ea1bc6a 100644 --- a/ReClass.NET/Nodes/UTF16TextNode.cs +++ b/ReClass.NET/Nodes/UTF16TextNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UText; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text16"); + return DrawText(context, x, y, "Text16"); } } } diff --git a/ReClass.NET/Nodes/UTF16TextPtrNode.cs b/ReClass.NET/Nodes/UTF16TextPtrNode.cs index 54ab0271..dc02f3f1 100644 --- a/ReClass.NET/Nodes/UTF16TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF16TextPtrNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UText_Pointer; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text16Ptr"); + return DrawText(context, x, y, "Text16Ptr"); } } } diff --git a/ReClass.NET/Nodes/UTF32TextNode.cs b/ReClass.NET/Nodes/UTF32TextNode.cs index b7d9fa41..f08d7735 100644 --- a/ReClass.NET/Nodes/UTF32TextNode.cs +++ b/ReClass.NET/Nodes/UTF32TextNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UText; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text32"); + return DrawText(context, x, y, "Text32"); } } } diff --git a/ReClass.NET/Nodes/UTF32TextPtrNode.cs b/ReClass.NET/Nodes/UTF32TextPtrNode.cs index 97934150..3e7b920e 100644 --- a/ReClass.NET/Nodes/UTF32TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF32TextPtrNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_UText_Pointer; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text32Ptr"); + return DrawText(context, x, y, "Text32Ptr"); } } } diff --git a/ReClass.NET/Nodes/UTF8TextNode.cs b/ReClass.NET/Nodes/UTF8TextNode.cs index 6fdbd0c3..ef9c5ff6 100644 --- a/ReClass.NET/Nodes/UTF8TextNode.cs +++ b/ReClass.NET/Nodes/UTF8TextNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Text; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text8"); + return DrawText(context, x, y, "Text8"); } } } diff --git a/ReClass.NET/Nodes/UTF8TextPtrNode.cs b/ReClass.NET/Nodes/UTF8TextPtrNode.cs index ddebecd0..d1173ff2 100644 --- a/ReClass.NET/Nodes/UTF8TextPtrNode.cs +++ b/ReClass.NET/Nodes/UTF8TextPtrNode.cs @@ -14,9 +14,9 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Text_Pointer; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return DrawText(view, x, y, "Text8Ptr"); + return DrawText(context, x, y, "Text8Ptr"); } } } diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs index e30eb3cb..5d1df2d4 100644 --- a/ReClass.NET/Nodes/UnionNode.cs +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -44,45 +44,45 @@ public override void UpdateOffsets() } } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, view.IconProvider.Union, -1, HotSpotType.None); + x = AddOpenCloseIcon(context, x, y); + x = AddIcon(context, x, y, context.IconProvider.Union, -1, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, "Union") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, "Union") + context.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"[Nodes: {Nodes.Count}, Size: {MemorySize}]") + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, $"[Nodes: {Nodes.Count}, Size: {MemorySize}]") + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - y += view.Font.Height; + y += context.Font.Height; var size = new Size(x - origX, y - origY); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - var v = view.Clone(); + var v = context.Clone(); v.Settings = Program.Settings.Clone(); v.Settings.ShowNodeAddress = false; - v.Address = view.Address + Offset; - v.Memory = view.Memory.Clone(); + v.Address = context.Address + Offset; + v.Memory = context.Memory.Clone(); v.Memory.Offset += Offset; foreach (var node in Nodes) @@ -99,7 +99,7 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index 8464478d..5ad249dd 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -26,21 +26,21 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Vector_2; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(view, x2, y2, "Vector2", (ref int x, ref int y) => + return DrawVectorType(context, x2, y2, "Vector2", (ref int x, ref int y) => { - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ")"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 0; } diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index 6d5e93df..2d153ec7 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -28,23 +28,23 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Vector_3; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(view, x2, y2, "Vector3", (ref int x, ref int y) => + return DrawVectorType(context, x2, y2, "Vector3", (ref int x, ref int y) => { - var value = view.Memory.ReadObject(Offset); - - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value.Z:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ")"); + var value = context.Memory.ReadObject(Offset); + + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value.Z:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 0; } diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 8ca4af3b..3c193cb4 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -30,25 +30,25 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) icon = Properties.Resources.B16x16_Button_Vector_4; } - public override Size Draw(ViewInfo view, int x2, int y2) + public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(view, x2, y2, "Vector4", (ref int x, ref int y) => + return DrawVectorType(context, x2, y2, "Vector4", (ref int x, ref int y) => { - var value = view.Memory.ReadObject(Offset); - - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(view, x, y, view.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 2, $"{value.Z:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(view, x, y, view.Settings.ValueColor, 3, $"{value.W:0.000}"); - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, ")"); + var value = context.Memory.ReadObject(Offset); + + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); + x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value.Z:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value.W:0.000}"); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); }); } - protected override int CalculateValuesHeight(ViewInfo view) + protected override int CalculateValuesHeight(DrawContext view) { return 0; } diff --git a/ReClass.NET/Nodes/VirtualMethodNode.cs b/ReClass.NET/Nodes/VirtualMethodNode.cs index f71d6c90..22bae685 100644 --- a/ReClass.NET/Nodes/VirtualMethodNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodNode.cs @@ -21,9 +21,9 @@ public VirtualMethodNode() Name = string.Empty; } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { - return Draw(view, x, y, $"({Offset / IntPtr.Size})", MethodName); + return Draw(context, x, y, $"({Offset / IntPtr.Size})", MethodName); } } } diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index 64b10a65..bd08fb28 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -34,48 +34,48 @@ public override void Initialize() } } - public override Size Draw(ViewInfo view, int x, int y) + public override Size Draw(DrawContext context, int x, int y) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, view.IconProvider.VirtualTable, HotSpot.NoneId, HotSpotType.None); + x = AddOpenCloseIcon(context, x, y); + x = AddIcon(context, x, y, context.IconProvider.VirtualTable, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.VTableColor, HotSpot.NoneId, $"VTable[{Nodes.Count}]") + view.Font.Width; + x = AddText(context, x, y, context.Settings.VTableColor, HotSpot.NoneId, $"VTable[{Nodes.Count}]") + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - y += view.Font.Height; + y += context.Font.Height; var size = new Size(x - origX, y - origY); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - var ptr = view.Memory.ReadIntPtr(Offset); + var ptr = context.Memory.ReadIntPtr(Offset); memory.Size = Nodes.Count * IntPtr.Size; - memory.UpdateFrom(view.Process, ptr); + memory.UpdateFrom(context.Process, ptr); - var v = view.Clone(); + var v = context.Clone(); v.Address = ptr; v.Memory = memory; @@ -93,7 +93,7 @@ public override Size Draw(ViewInfo view, int x, int y) return size; } - public override int CalculateDrawnHeight(ViewInfo view) + public override int CalculateDrawnHeight(DrawContext view) { if (IsHidden && !IsWrapped) { diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index c16db79d..b5761ac2 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -510,7 +510,7 @@ - + From 099638ddda21871275a500813083a382dc84c188 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 19:59:03 +0200 Subject: [PATCH 720/777] Set IconProvider for preview. --- ReClass.NET/Controls/MemoryPreviewPopUp.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReClass.NET/Controls/MemoryPreviewPopUp.cs b/ReClass.NET/Controls/MemoryPreviewPopUp.cs index 982edfcb..c407a40d 100644 --- a/ReClass.NET/Controls/MemoryPreviewPopUp.cs +++ b/ReClass.NET/Controls/MemoryPreviewPopUp.cs @@ -38,6 +38,7 @@ public MemoryPreviewPanel(FontEx font) DrawContext = new DrawContext { Font = font, + IconProvider = new IconProvider(), // TODO use single instance Memory = new MemoryBuffer(), From fd4d4b3c18b071d871412e80cc47985958e20bd3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 20:14:08 +0200 Subject: [PATCH 721/777] Changed Visual Studio version (fixes #150). --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 771e3fbe..6a83bf03 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Just download the [latest version](https://github.com/ReClassNET/ReClass.NET/rel Valid operations are read ([..]), add (+), sub (-), mul (*) and div (/). Please note that all operations are integer calculations. ## Compiling -If you want to compile ReClass.NET just fork the repository and open the ReClass.NET.sln file with Visual Studio 2017. +If you want to compile ReClass.NET just fork the repository and open the ReClass.NET.sln file with Visual Studio 2019. Compile the project and copy the dependencies to the output folder. ## Videos From 02de2bb1b617852083058329b2ff092191c79d5c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 20:20:06 +0200 Subject: [PATCH 722/777] Write field offset in own line. --- ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index d512223c..b1364ace 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -174,7 +174,8 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog var type = GetTypeDefinition(node); if (type != null) { - writer.Write($"[FieldOffset(0x{node.Offset:X})] public readonly {type} {node.Name};"); + writer.WriteLine($"[FieldOffset(0x{node.Offset:X})]"); + writer.Write($"public readonly {type} {node.Name};"); if (!string.IsNullOrEmpty(node.Comment)) { writer.Write(" "); From aeaf3e6f057b11df69a741c3584bd8da05c7438e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 20:22:25 +0200 Subject: [PATCH 723/777] Fixed generation of comments. --- ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index b1364ace..5ab710ee 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -178,7 +178,7 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog writer.Write($"public readonly {type} {node.Name};"); if (!string.IsNullOrEmpty(node.Comment)) { - writer.Write(" "); + writer.Write(" //"); writer.Write(node.Comment); } writer.WriteLine(); From 1f3fad139b0a85ee100f8f8933d1e1e7d56aafbd Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 10 Oct 2020 20:50:34 +0200 Subject: [PATCH 724/777] Added support for UTF8 strings. --- .../CodeGenerator/CSharpCodeGenerator.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 5ab710ee..2a90c1e5 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -171,10 +171,14 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog .WhereNot(n => n is FunctionNode || n is BaseHexNode); foreach (var node in nodes) { - var type = GetTypeDefinition(node); + var (type, attribute) = GetTypeDefinition(node); if (type != null) { writer.WriteLine($"[FieldOffset(0x{node.Offset:X})]"); + if (attribute != null) + { + writer.WriteLine(attribute); + } writer.Write($"public readonly {type} {node.Name};"); if (!string.IsNullOrEmpty(node.Comment)) { @@ -198,7 +202,7 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog ///
/// The target node. /// The type definition for the node or null if no simple type is available. - private static string GetTypeDefinition(BaseNode node) + private static (string typeName, string attribute) GetTypeDefinition(BaseNode node) { Contract.Requires(node != null); @@ -211,15 +215,20 @@ private static string GetTypeDefinition(BaseNode node) if (nodeTypeToTypeDefinationMap.TryGetValue(node.GetType(), out var type)) { - return type; + return (type, null); } if (node is EnumNode enumNode) { - return enumNode.Enum.Name; + return (enumNode.Enum.Name, null); + } + + if (node is Utf8TextNode utf8TextNode) + { + return ("string", $"[MarshalAs(UnmanagedType.ByValTStr, SizeConst = {utf8TextNode.Length})]"); } - return null; + return (null, null); } } } From 594b9f802b63634744052088f00bfeb980944855 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 11 Oct 2020 12:30:19 +0200 Subject: [PATCH 725/777] Output the additional attribute first. --- ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 2a90c1e5..79be0afe 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -174,11 +174,12 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog var (type, attribute) = GetTypeDefinition(node); if (type != null) { - writer.WriteLine($"[FieldOffset(0x{node.Offset:X})]"); if (attribute != null) { writer.WriteLine(attribute); } + + writer.WriteLine($"[FieldOffset(0x{node.Offset:X})]"); writer.Write($"public readonly {type} {node.Name};"); if (!string.IsNullOrEmpty(node.Comment)) { From fdc07483c63f248d842cf6aabd0aec361af35e9f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 11 Oct 2020 15:47:40 +0200 Subject: [PATCH 726/777] Added support for unicode strings. (fixes #149) --- .../CodeGenerator/CSharpCodeGenerator.cs | 64 +++++++++++++++---- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 79be0afe..0eedf1f9 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -37,7 +37,7 @@ public class CSharpCodeGenerator : ICodeGenerator [typeof(Vector2Node)] = "Vector2", [typeof(Vector3Node)] = "Vector3", [typeof(Vector4Node)] = "Vector4" - }; + }; public Language Language => Language.CSharp; @@ -77,21 +77,42 @@ public string GenerateCode(IReadOnlyList classes, IReadOnlyList c.Nodes.None(n => n is FunctionNode)) // Skip class which contains FunctionNodes because these are not data classes. .Distinct(); + var unicodeStringClassLengthsToGenerate = new HashSet(); + using (var en = classesToWrite.GetEnumerator()) { if (en.MoveNext()) { + void FindUnicodeStringClasses(IEnumerable nodes) + { + unicodeStringClassLengthsToGenerate.UnionWith(nodes.OfType().Select(n => n.Length)); + } + + FindUnicodeStringClasses(en.Current!.Nodes); + WriteClass(iw, en.Current, logger); while (en.MoveNext()) { iw.WriteLine(); + FindUnicodeStringClasses(en.Current!.Nodes); + WriteClass(iw, en.Current, logger); } } } + if (unicodeStringClassLengthsToGenerate.Any()) + { + foreach (var length in unicodeStringClassLengthsToGenerate) + { + iw.WriteLine(); + + WriteUnicodeStringClass(iw, length); + } + } + return sw.ToString(); } @@ -152,7 +173,7 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog Contract.Requires(@class != null); Contract.Requires(logger != null); - writer.WriteLine("[StructLayout(LayoutKind.Explicit)]"); + writer.WriteLine("[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]"); writer.Write("public struct "); writer.Write(@class.Name); @@ -199,10 +220,10 @@ private static void WriteClass(IndentedTextWriter writer, ClassNode @class, ILog } /// - /// Gets the type definition for the given node. If the node is not a simple node null is returned. + /// Gets the type definition for the given node. If the node is not expressible null as typename is returned. /// /// The target node. - /// The type definition for the node or null if no simple type is available. + /// The type definition for the node or null as typename if the node is not expressible. private static (string typeName, string attribute) GetTypeDefinition(BaseNode node) { Contract.Requires(node != null); @@ -219,17 +240,36 @@ private static (string typeName, string attribute) GetTypeDefinition(BaseNode no return (type, null); } - if (node is EnumNode enumNode) + return node switch { - return (enumNode.Enum.Name, null); - } + EnumNode enumNode => (enumNode.Enum.Name, null), + Utf8TextNode utf8TextNode => ("string", $"[MarshalAs(UnmanagedType.ByValTStr, SizeConst = {utf8TextNode.Length})]"), + Utf16TextNode utf16TextNode => (GetUnicodeStringClassName(utf16TextNode.Length), "[MarshalAs(UnmanagedType.Struct)]"), + _ => (null, null) + }; + } - if (node is Utf8TextNode utf8TextNode) - { - return ("string", $"[MarshalAs(UnmanagedType.ByValTStr, SizeConst = {utf8TextNode.Length})]"); - } + private static string GetUnicodeStringClassName(int length) => $"__UnicodeString{length}"; - return (null, null); + /// + /// Writes a helper class for unicode strings with the specific length. + /// + /// The writer to output to. + /// The string length for this class. + private static void WriteUnicodeStringClass(IndentedTextWriter writer, int length) + { + var className = GetUnicodeStringClassName(length); + + writer.WriteLine("[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]"); + writer.WriteLine($"public struct {className}"); + writer.WriteLine("{"); + writer.Indent++; + writer.WriteLine($"[MarshalAs(UnmanagedType.ByValTStr, SizeConst = {length})]"); + writer.WriteLine("public string Value;"); + writer.WriteLine(); + writer.WriteLine($"public static implicit operator string({className} value) => value.Value;"); + writer.Indent--; + writer.WriteLine("}"); } } } From 062cced817db2a71fe8fd41dbeec2753cafa1e1d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 17 Oct 2020 12:23:10 +0200 Subject: [PATCH 727/777] Fixed parameter names. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 6 +- .../ReClass/Legacy/BaseClassArrayNode.cs | 2 +- .../ReClass/Legacy/ClassPointerNode.cs | 2 +- .../DataExchange/ReClass/Legacy/CustomNode.cs | 2 +- ReClass.NET/Nodes/ArrayNode.cs | 12 +- ReClass.NET/Nodes/BaseFunctionPtrNode.cs | 56 +++--- ReClass.NET/Nodes/BaseHexNode.cs | 52 +++--- ReClass.NET/Nodes/BaseMatrixNode.cs | 78 ++++---- ReClass.NET/Nodes/BaseNode.cs | 172 +++++++++--------- ReClass.NET/Nodes/BaseNumericNode.cs | 40 ++-- ReClass.NET/Nodes/BaseTextNode.cs | 46 ++--- ReClass.NET/Nodes/BaseTextPtrNode.cs | 44 ++--- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 64 +++---- ReClass.NET/Nodes/BitFieldNode.cs | 8 +- ReClass.NET/Nodes/BoolNode.cs | 4 +- ReClass.NET/Nodes/ClassInstanceNode.cs | 18 +- ReClass.NET/Nodes/ClassNode.cs | 18 +- ReClass.NET/Nodes/EnumNode.cs | 4 +- ReClass.NET/Nodes/FunctionNode.cs | 8 +- ReClass.NET/Nodes/Hex32Node.cs | 8 +- ReClass.NET/Nodes/Hex64Node.cs | 8 +- ReClass.NET/Nodes/Matrix3x3Node.cs | 4 +- ReClass.NET/Nodes/Matrix3x4Node.cs | 4 +- ReClass.NET/Nodes/Matrix4x4Node.cs | 4 +- ReClass.NET/Nodes/PointerNode.cs | 32 ++-- ReClass.NET/Nodes/UnionNode.cs | 22 +-- ReClass.NET/Nodes/Vector2Node.cs | 2 +- ReClass.NET/Nodes/Vector3Node.cs | 2 +- ReClass.NET/Nodes/Vector4Node.cs | 2 +- ReClass.NET/Nodes/VirtualMethodTableNode.cs | 16 +- 30 files changed, 368 insertions(+), 372 deletions(-) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 71bca3a8..8988118e 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -101,7 +101,7 @@ private class Utf8CharacterNode : BaseNode public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext context) => throw new NotImplementedException(); } private class Utf16CharacterNode : BaseNode @@ -109,7 +109,7 @@ private class Utf16CharacterNode : BaseNode public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext context) => throw new NotImplementedException(); } private class Utf32CharacterNode : BaseNode @@ -117,7 +117,7 @@ private class Utf32CharacterNode : BaseNode public override int MemorySize => throw new NotImplementedException(); public override void GetUserInterfaceInfo(out string name, out Image icon) => throw new NotImplementedException(); public override Size Draw(DrawContext context, int x, int y) => throw new NotImplementedException(); - public override int CalculateDrawnHeight(DrawContext view) => throw new NotImplementedException(); + public override int CalculateDrawnHeight(DrawContext context) => throw new NotImplementedException(); } #endregion diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs index 82006a0e..0871658d 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/BaseClassArrayNode.cs @@ -14,7 +14,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { throw new NotImplementedException(); } diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs index 81588504..243707e8 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/ClassPointerNode.cs @@ -14,7 +14,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { throw new NotImplementedException(); } diff --git a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs index 42c9bd05..0645f860 100644 --- a/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs +++ b/ReClass.NET/DataExchange/ReClass/Legacy/CustomNode.cs @@ -15,7 +15,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { throw new NotImplementedException(); } diff --git a/ReClass.NET/Nodes/ArrayNode.cs b/ReClass.NET/Nodes/ArrayNode.cs index 6c30e194..4a0fbec3 100644 --- a/ReClass.NET/Nodes/ArrayNode.cs +++ b/ReClass.NET/Nodes/ArrayNode.cs @@ -27,14 +27,14 @@ public override Size Draw(DrawContext context, int x, int y) return Draw(context, x, y, "Array"); } - protected override Size DrawChild(DrawContext view, int x, int y) + protected override Size DrawChild(DrawContext context, int x, int y) { - var v = view.Clone(); - v.Address = view.Address + Offset + InnerNode.MemorySize * CurrentIndex; - v.Memory = view.Memory.Clone(); - v.Memory.Offset += Offset + InnerNode.MemorySize * CurrentIndex; + var innerContext = context.Clone(); + innerContext.Address = context.Address + Offset + InnerNode.MemorySize * CurrentIndex; + innerContext.Memory = context.Memory.Clone(); + innerContext.Memory.Offset += Offset + InnerNode.MemorySize * CurrentIndex; - return InnerNode.Draw(v, x, y); + return InnerNode.Draw(innerContext, x, y); } } } diff --git a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs index 577459f7..4fd73a2c 100644 --- a/ReClass.NET/Nodes/BaseFunctionPtrNode.cs +++ b/ReClass.NET/Nodes/BaseFunctionPtrNode.cs @@ -22,68 +22,68 @@ public override string GetToolTipText(HotSpot spot) return string.Join("\n", Instructions.Select(i => i.Instruction)); } - protected Size Draw(DrawContext view, int x, int y, string type, string name) + protected Size Draw(DrawContext context, int x, int y, string type, string name) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(type != null); Contract.Requires(name != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(context, x, y, context.IconProvider.Function, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, name) + context.Font.Width; } - x = AddOpenCloseIcon(view, x, y) + view.Font.Width; + x = AddOpenCloseIcon(context, x, y) + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - if (view.Settings.ShowCommentSymbol) + if (context.Settings.ShowCommentSymbol) { - var value = view.Memory.ReadIntPtr(Offset); + var value = context.Memory.ReadIntPtr(Offset); - var module = view.Process.GetModuleToPointer(value); + var module = context.Process.GetModuleToPointer(value); if (module != null) { - var symbols = view.Process.Symbols.GetSymbolsForModule(module); + var symbols = context.Process.Symbols.GetSymbolsForModule(module); var symbol = symbols?.GetSymbolString(value, module); if (!string.IsNullOrEmpty(symbol)) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol); + x = AddText(context, x, y, context.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol); } } } - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - var size = new Size(x - origX, view.Font.Height); + var size = new Size(x - origX, context.Font.Height); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - var ptr = view.Memory.ReadIntPtr(Offset); + var ptr = context.Memory.ReadIntPtr(Offset); - DisassembleRemoteCode(view.Process, ptr); + DisassembleRemoteCode(context.Process, ptr); - var instructionSize = DrawInstructions(view, tx, y); + var instructionSize = DrawInstructions(context, tx, y); size.Width = Math.Max(size.Width, instructionSize.Width + tx - origX); size.Height += instructionSize.Height; @@ -92,17 +92,17 @@ protected Size Draw(DrawContext view, int x, int y, string type, string name) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += Instructions.Count * view.Font.Height; + height += Instructions.Count * context.Font.Height; } return height; } diff --git a/ReClass.NET/Nodes/BaseHexNode.cs b/ReClass.NET/Nodes/BaseHexNode.cs index f57dd68b..060db7da 100644 --- a/ReClass.NET/Nodes/BaseHexNode.cs +++ b/ReClass.NET/Nodes/BaseHexNode.cs @@ -32,53 +32,53 @@ protected BaseHexNode() buffer = new byte[MemorySize]; } - protected Size Draw(DrawContext view, int x, int y, string text, int length) + protected Size Draw(DrawContext context, int x, int y, string text, int length) { - Contract.Requires(view != null); + Contract.Requires(context != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); + x = AddIconPadding(context, x); - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); if (!string.IsNullOrEmpty(text)) { - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, text); + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, text); } - view.Memory.ReadBytes(Offset, buffer); + context.Memory.ReadBytes(Offset, buffer); - var color = view.Settings.HexColor; - if (view.Settings.HighlightChangedValues) + var color = context.Settings.HexColor; + if (context.Settings.HighlightChangedValues) { - var address = view.Address + Offset; + var address = context.Address + Offset; - highlightTimer.RemoveWhere(kv => kv.Value.Value < view.CurrentTime); + highlightTimer.RemoveWhere(kv => kv.Value.Value < context.CurrentTime); if (highlightTimer.TryGetValue(address, out var until)) { - if (until.Value >= view.CurrentTime) + if (until.Value >= context.CurrentTime) { color = GetRandomHighlightColor(); - if (view.Memory.HasChanged(Offset, MemorySize)) + if (context.Memory.HasChanged(Offset, MemorySize)) { - until.Value = view.CurrentTime.Add(hightlightDuration); + until.Value = context.CurrentTime.Add(hightlightDuration); } } } - else if (view.Memory.HasChanged(Offset, MemorySize)) + else if (context.Memory.HasChanged(Offset, MemorySize)) { - highlightTimer.Add(address, view.CurrentTime.Add(hightlightDuration)); + highlightTimer.Add(address, context.CurrentTime.Add(hightlightDuration)); color = GetRandomHighlightColor(); } @@ -86,21 +86,21 @@ protected Size Draw(DrawContext view, int x, int y, string text, int length) for (var i = 0; i < length; ++i) { - x = AddText(view, x, y, color, i, $"{buffer[i]:X02}") + view.Font.Width; + x = AddText(context, x, y, color, i, $"{buffer[i]:X02}") + context.Font.Width; } - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } /// Updates the node from the given spot. Sets the value of the selected byte. diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index ac964051..d97d7bc0 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -17,115 +17,115 @@ protected BaseMatrixNode() protected delegate void DrawMatrixValues(int x, ref int maxX, ref int y); - protected Size DrawMatrixType(DrawContext view, int x, int y, string type, DrawMatrixValues drawValues) + protected Size DrawMatrixType(DrawContext context, int x, int y, string type, DrawMatrixValues drawValues) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(type != null); Contract.Requires(drawValues != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Matrix, HotSpot.NoneId, HotSpotType.None); + x = AddIcon(context, x, y, context.IconProvider.Matrix, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name); } - x = AddOpenCloseIcon(view, x, y); + x = AddOpenCloseIcon(context, x, y); - x += view.Font.Width; + x += context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { drawValues(tx, ref x, ref y); } - return new Size(x - origX, y - origY + view.Font.Height); + return new Size(x - origX, y - origY + context.Font.Height); } protected delegate void DrawVectorValues(ref int x, ref int y); - protected Size DrawVectorType(DrawContext view, int x, int y, string type, DrawVectorValues drawValues) + protected Size DrawVectorType(DrawContext context, int x, int y, string type, DrawVectorValues drawValues) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(type != null); Contract.Requires(drawValues != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } - DrawInvalidMemoryIndicatorIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); var origX = x; var origY = y; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Vector, HotSpot.NoneId, HotSpotType.None); - x = AddAddressOffset(view, x, y); + x = AddIcon(context, x, y, context.IconProvider.Vector, HotSpot.NoneId, HotSpotType.None); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name); } - x = AddOpenCloseIcon(view, x, y); + x = AddOpenCloseIcon(context, x, y); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { drawValues(ref x, ref y); } - x += view.Font.Width; + x += context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, y - origY + view.Font.Height); + return new Size(x - origX, y - origY + context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += CalculateValuesHeight(view); + height += CalculateValuesHeight(context); } return height; } - protected abstract int CalculateValuesHeight(DrawContext view); + protected abstract int CalculateValuesHeight(DrawContext context); public void Update(HotSpot spot, int max) { diff --git a/ReClass.NET/Nodes/BaseNode.cs b/ReClass.NET/Nodes/BaseNode.cs index 41c1cd49..adef39e5 100644 --- a/ReClass.NET/Nodes/BaseNode.cs +++ b/ReClass.NET/Nodes/BaseNode.cs @@ -232,9 +232,9 @@ public virtual void ClearSelection() /// This method is used to determine if a node outside the visible area should be drawn. /// The returned height must be equal to the height which is returned by the method. ///
- /// The drawing context. + /// The drawing context. /// The calculated height. - public abstract int CalculateDrawnHeight(DrawContext view); + public abstract int CalculateDrawnHeight(DrawContext context); /// Updates the node from the given . Sets the and of the node. /// The spot. @@ -268,62 +268,62 @@ internal void SetLevelOpen(int level, bool open) } /// Adds a the user can interact with. - /// The drawing context. + /// The drawing context. /// The spot. /// The text to edit. /// The id of the spot. /// The type of the spot. - protected void AddHotSpot(DrawContext view, Rectangle spot, string text, int id, HotSpotType type) + protected void AddHotSpot(DrawContext context, Rectangle spot, string text, int id, HotSpotType type) { - Contract.Requires(view != null); - Contract.Requires(view.Memory != null); + Contract.Requires(context != null); + Contract.Requires(context.Memory != null); Contract.Requires(text != null); - if (spot.Top > view.ClientArea.Bottom || spot.Bottom < 0) + if (spot.Top > context.ClientArea.Bottom || spot.Bottom < 0) { return; } - view.HotSpots.Add(new HotSpot + context.HotSpots.Add(new HotSpot { Rect = spot, Text = text, - Address = view.Address + Offset, + Address = context.Address + Offset, Id = id, Type = type, Node = this, - Level = view.Level, - Process = view.Process, - Memory = view.Memory + Level = context.Level, + Process = context.Process, + Memory = context.Memory }); } /// Draws the specific text and adds a if is not . - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The color of the text. /// Id for the clickable area. /// The text to draw. /// The new x coordinate after drawing the text. - protected int AddText(DrawContext view, int x, int y, Color color, int hitId, string text) + protected int AddText(DrawContext context, int x, int y, Color color, int hitId, string text) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); - Contract.Requires(view.Font != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); + Contract.Requires(context.Font != null); Contract.Requires(text != null); - var width = Math.Max(text.Length, hitId != HotSpot.NoneId ? 1 : 0) * view.Font.Width; + var width = Math.Max(text.Length, hitId != HotSpot.NoneId ? 1 : 0) * context.Font.Width; - if (y >= -view.Font.Height && y + view.Font.Height <= view.ClientArea.Bottom + view.Font.Height) + if (y >= -context.Font.Height && y + context.Font.Height <= context.ClientArea.Bottom + context.Font.Height) { if (hitId != HotSpot.NoneId) { - var rect = new Rectangle(x, y, width, view.Font.Height); - AddHotSpot(view, rect, text, hitId, HotSpotType.Edit); + var rect = new Rectangle(x, y, width, context.Font.Height); + AddHotSpot(context, rect, text, hitId, HotSpotType.Edit); } - view.Graphics.DrawStringEx(text, view.Font.Font, color, x, y); + context.Graphics.DrawStringEx(text, context.Font.Font, color, x, y); /*using (var brush = new SolidBrush(color)) { context.Graphics.DrawString(text, context.Font.Font, brush, x, y); @@ -334,52 +334,52 @@ protected int AddText(DrawContext view, int x, int y, Color color, int hitId, st } /// Draws the address and of the node. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the text. - protected int AddAddressOffset(DrawContext view, int x, int y) + protected int AddAddressOffset(DrawContext context, int x, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); - Contract.Requires(view.Font != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); + Contract.Requires(context.Font != null); - if (view.Settings.ShowNodeOffset) + if (context.Settings.ShowNodeOffset) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, $"{Offset:X04}") + view.Font.Width; + x = AddText(context, x, y, context.Settings.OffsetColor, HotSpot.NoneId, $"{Offset:X04}") + context.Font.Width; } - if (view.Settings.ShowNodeAddress) + if (context.Settings.ShowNodeAddress) { - x = AddText(view, x, y, view.Settings.AddressColor, HotSpot.AddressId, (view.Address + Offset).ToString(Constants.AddressHexFormat)) + view.Font.Width; + x = AddText(context, x, y, context.Settings.AddressColor, HotSpot.AddressId, (context.Address + Offset).ToString(Constants.AddressHexFormat)) + context.Font.Width; } return x; } /// Draws a bar which indicates the selection status of the node. A for this area gets added too. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The height of the bar. - protected void AddSelection(DrawContext view, int x, int y, int height) + protected void AddSelection(DrawContext context, int x, int y, int height) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); - if (y > view.ClientArea.Bottom || y + height < 0 || IsWrapped) + if (y > context.ClientArea.Bottom || y + height < 0 || IsWrapped) { return; } if (IsSelected) { - using var brush = new SolidBrush(view.Settings.SelectedColor); + using var brush = new SolidBrush(context.Settings.SelectedColor); - view.Graphics.FillRectangle(brush, 0, y, view.ClientArea.Right, height); + context.Graphics.FillRectangle(brush, 0, y, context.ClientArea.Right, height); } - AddHotSpot(view, new Rectangle(0, y, view.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); + AddHotSpot(context, new Rectangle(0, y, context.ClientArea.Right - (IsSelected ? 16 : 0), height), string.Empty, HotSpot.NoneId, HotSpotType.Select); } protected int AddIconPadding(DrawContext view, int x) @@ -388,136 +388,136 @@ protected int AddIconPadding(DrawContext view, int x) } /// Draws an icon and adds a if is not . - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The icon. /// The id of the spot. /// The type of the spot. /// The new x coordinate after drawing the icon. - protected int AddIcon(DrawContext view, int x, int y, Image icon, int id, HotSpotType type) + protected int AddIcon(DrawContext context, int x, int y, Image icon, int id, HotSpotType type) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); Contract.Requires(icon != null); - var size = view.IconProvider.Dimensions; + var size = context.IconProvider.Dimensions; - if (y > view.ClientArea.Bottom || y + size < 0) + if (y > context.ClientArea.Bottom || y + size < 0) { return x + size; } - view.Graphics.DrawImage(icon, x + 2, y, size, size); + context.Graphics.DrawImage(icon, x + 2, y, size, size); if (id != HotSpot.NoneId) { - AddHotSpot(view, new Rectangle(x, y, size, size), string.Empty, id, type); + AddHotSpot(context, new Rectangle(x, y, size, size), string.Empty, id, type); } return x + size; } /// Adds a togglable Open/Close icon. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the icon. - protected int AddOpenCloseIcon(DrawContext view, int x, int y) + protected int AddOpenCloseIcon(DrawContext context, int x, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); - if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0) + if (y > context.ClientArea.Bottom || y + context.IconProvider.Dimensions < 0) { - return x + view.IconProvider.Dimensions; + return x + context.IconProvider.Dimensions; } - var icon = LevelsOpen[view.Level] ? view.IconProvider.OpenCloseOpen : view.IconProvider.OpenCloseClosed; - return AddIcon(view, x, y, icon, 0, HotSpotType.OpenClose); + var icon = LevelsOpen[context.Level] ? context.IconProvider.OpenCloseOpen : context.IconProvider.OpenCloseClosed; + return AddIcon(context, x, y, icon, 0, HotSpotType.OpenClose); } /// Draws a context drop icon if the node is selected. - /// The drawing context. + /// The drawing context. /// The y coordinate. - protected void AddContextDropDownIcon(DrawContext view, int y) + protected void AddContextDropDownIcon(DrawContext context, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); - if (view.MultipleNodesSelected || y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) + if (context.MultipleNodesSelected || y > context.ClientArea.Bottom || y + context.IconProvider.Dimensions < 0 || IsWrapped) { return; } if (IsSelected) { - AddIcon(view, 0, y, view.IconProvider.DropArrow, 0, HotSpotType.Context); + AddIcon(context, 0, y, context.IconProvider.DropArrow, 0, HotSpotType.Context); } } /// Draws a delete icon if the node is selected. - /// The drawing context. + /// The drawing context. /// The y coordinate. - protected void AddDeleteIcon(DrawContext view, int y) + protected void AddDeleteIcon(DrawContext context, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); - if (y > view.ClientArea.Bottom || y + view.IconProvider.Dimensions < 0 || IsWrapped) + if (y > context.ClientArea.Bottom || y + context.IconProvider.Dimensions < 0 || IsWrapped) { return; } if (IsSelected) { - AddIcon(view, view.ClientArea.Right - view.IconProvider.Dimensions, y, view.IconProvider.Delete, 0, HotSpotType.Delete); + AddIcon(context, context.ClientArea.Right - context.IconProvider.Dimensions, y, context.IconProvider.Delete, 0, HotSpotType.Delete); } } /// Draws the . - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The new x coordinate after drawing the comment. - protected virtual int AddComment(DrawContext view, int x, int y) + protected virtual int AddComment(DrawContext context, int x, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); - Contract.Requires(view.Font != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); + Contract.Requires(context.Font != null); - x = AddText(view, x, y, view.Settings.CommentColor, HotSpot.NoneId, "//"); - x = AddText(view, x, y, view.Settings.CommentColor, HotSpot.CommentId, Comment) + view.Font.Width; + x = AddText(context, x, y, context.Settings.CommentColor, HotSpot.NoneId, "//"); + x = AddText(context, x, y, context.Settings.CommentColor, HotSpot.CommentId, Comment) + context.Font.Width; return x; } /// Draws a vertical line to show the hidden state. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The size of the drawing. - protected Size DrawHidden(DrawContext view, int x, int y) + protected Size DrawHidden(DrawContext context, int x, int y) { - Contract.Requires(view != null); - Contract.Requires(view.Graphics != null); + Contract.Requires(context != null); + Contract.Requires(context.Graphics != null); - using (var brush = new SolidBrush(IsSelected ? view.Settings.SelectedColor : view.Settings.HiddenColor)) + using (var brush = new SolidBrush(IsSelected ? context.Settings.SelectedColor : context.Settings.HiddenColor)) { - view.Graphics.FillRectangle(brush, 0, y, view.ClientArea.Right, 1); + context.Graphics.FillRectangle(brush, 0, y, context.ClientArea.Right, 1); } return new Size(0, HiddenHeight); } /// Draws an error indicator if the used memory buffer is not valid. - /// The drawing context. + /// The drawing context. /// The y coordinate. - protected void DrawInvalidMemoryIndicatorIcon(DrawContext view, int y) + protected void DrawInvalidMemoryIndicatorIcon(DrawContext context, int y) { - if (!view.Memory.ContainsValidData) + if (!context.Memory.ContainsValidData) { - AddIcon(view, 0, y, Properties.Resources.B16x16_Error, HotSpot.NoneId, HotSpotType.None); + AddIcon(context, 0, y, Properties.Resources.B16x16_Error, HotSpot.NoneId, HotSpotType.None); } } } @@ -542,9 +542,9 @@ public override Size Draw(DrawContext context, int x, int y) throw new NotImplementedException(); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - Contract.Requires(view != null); + Contract.Requires(context != null); throw new NotImplementedException(); } diff --git a/ReClass.NET/Nodes/BaseNumericNode.cs b/ReClass.NET/Nodes/BaseNumericNode.cs index ae223dee..61782ca6 100644 --- a/ReClass.NET/Nodes/BaseNumericNode.cs +++ b/ReClass.NET/Nodes/BaseNumericNode.cs @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes public abstract class BaseNumericNode : BaseNode { /// Draws the node. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The icon of the node. @@ -16,51 +16,51 @@ public abstract class BaseNumericNode : BaseNode /// The value of the node. /// An alternative value of the node. /// The pixel size the node occupies. - protected Size DrawNumeric(DrawContext view, int x, int y, Image icon, string type, string value, string alternativeValue) + protected Size DrawNumeric(DrawContext context, int x, int y, Image icon, string type, string value, string alternativeValue) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(icon != null); Contract.Requires(type != null); Contract.Requires(value != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, icon, HotSpot.NoneId, HotSpotType.None); - x = AddAddressOffset(view, x, y); + x = AddIcon(context, x, y, icon, HotSpot.NoneId, HotSpotType.None); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NoneId, "=") + view.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, 0, value) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "=") + context.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, 0, value) + context.Font.Width; if (alternativeValue != null) { - x = AddText(view, x, y, view.Settings.ValueColor, 1, alternativeValue) + view.Font.Width; + x = AddText(context, x, y, context.Settings.ValueColor, 1, alternativeValue) + context.Font.Width; } - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } } } diff --git a/ReClass.NET/Nodes/BaseTextNode.cs b/ReClass.NET/Nodes/BaseTextNode.cs index 213e0034..d395b24d 100644 --- a/ReClass.NET/Nodes/BaseTextNode.cs +++ b/ReClass.NET/Nodes/BaseTextNode.cs @@ -25,53 +25,53 @@ public override void CopyFromNode(BaseNode node) Length = node.MemorySize / CharacterSize; } - protected Size DrawText(DrawContext view, int x, int y, string type) + protected Size DrawText(DrawContext context, int x, int y, string type) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(type != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var length = MemorySize / CharacterSize; - var text = ReadValueFromMemory(view.Memory); + var text = ReadValueFromMemory(context.Memory); var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); - x = AddAddressOffset(view, x, y); + x = AddIcon(context, x, y, context.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name); } - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); - x = AddText(view, x, y, view.Settings.IndexColor, 0, length.ToString()); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]") + view.Font.Width; + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, "["); + x = AddText(context, x, y, context.Settings.IndexColor, 0, length.ToString()); + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, "]") + context.Font.Width; - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "= '"); - x = AddText(view, x, y, view.Settings.TextColor, 1, text.LimitLength(150)); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, "= '"); + x = AddText(context, x, y, context.Settings.TextColor, 1, text.LimitLength(150)); + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, "'") + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 2afd4974..95096602 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -17,55 +17,55 @@ public abstract class BaseTextPtrNode : BaseNode public abstract Encoding Encoding { get; } /// Draws this node. - /// The drawing context. + /// The drawing context. /// The x coordinate. /// The y coordinate. /// The name of the type. /// The pixel size the node occupies. - public Size DrawText(DrawContext view, int x, int y, string type) + public Size DrawText(DrawContext context, int x, int y, string type) { - Contract.Requires(view != null); + Contract.Requires(context != null); Contract.Requires(type != null); if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } - var ptr = view.Memory.ReadIntPtr(Offset); - var text = view.Process.ReadRemoteString(Encoding, ptr, MaxStringCharacterCount); + var ptr = context.Memory.ReadIntPtr(Offset); + var text = context.Process.ReadRemoteString(Encoding, ptr, MaxStringCharacterCount); var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddIconPadding(view, x); + x = AddIconPadding(context, x); - x = AddIcon(view, x, y, view.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); - x = AddAddressOffset(view, x, y); + x = AddIcon(context, x, y, context.IconProvider.Text, HotSpot.NoneId, HotSpotType.None); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name) + view.Font.Width; + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name) + context.Font.Width; } - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "= '"); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, text); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, "= '"); + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.ReadOnlyId, text); + x = AddText(context, x, y, context.Settings.TextColor, HotSpot.NoneId, "'") + context.Font.Width; - x = AddComment(view, x, y); + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - return new Size(x - origX, view.Font.Height); + return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } } } diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 62ac318c..52d5d948 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -28,55 +28,55 @@ public override bool CanChangeInnerNodeTo(BaseNode node) return true; } - protected Size Draw(DrawContext view, int x, int y, string type) + protected Size Draw(DrawContext context, int x, int y, string type) { if (IsHidden && !IsWrapped) { - return DrawHidden(view, x, y); + return DrawHidden(context, x, y); } var origX = x; - AddSelection(view, x, y, view.Font.Height); + AddSelection(context, x, y, context.Font.Height); - x = AddOpenCloseIcon(view, x, y); - x = AddIcon(view, x, y, view.IconProvider.Array, HotSpot.NoneId, HotSpotType.None); + x = AddOpenCloseIcon(context, x, y); + x = AddIcon(context, x, y, context.IconProvider.Array, HotSpot.NoneId, HotSpotType.None); var tx = x; - x = AddAddressOffset(view, x, y); + x = AddAddressOffset(context, x, y); - x = AddText(view, x, y, view.Settings.TypeColor, HotSpot.NoneId, type) + view.Font.Width; + x = AddText(context, x, y, context.Settings.TypeColor, HotSpot.NoneId, type) + context.Font.Width; if (!IsWrapped) { - x = AddText(view, x, y, view.Settings.NameColor, HotSpot.NameId, Name); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NameId, Name); } - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "["); - x = AddText(view, x, y, view.Settings.IndexColor, IsReadOnly ? HotSpot.NoneId : 0, Count.ToString()); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "]"); + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, "["); + x = AddText(context, x, y, context.Settings.IndexColor, IsReadOnly ? HotSpot.NoneId : 0, Count.ToString()); + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, "]"); - x = AddIcon(view, x, y, view.IconProvider.LeftArrow, 2, HotSpotType.Click); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, "("); - x = AddText(view, x, y, view.Settings.IndexColor, 1, CurrentIndex.ToString()); - x = AddText(view, x, y, view.Settings.IndexColor, HotSpot.NoneId, ")"); - x = AddIcon(view, x, y, view.IconProvider.RightArrow, 3, HotSpotType.Click) + view.Font.Width; + x = AddIcon(context, x, y, context.IconProvider.LeftArrow, 2, HotSpotType.Click); + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, "("); + x = AddText(context, x, y, context.Settings.IndexColor, 1, CurrentIndex.ToString()); + x = AddText(context, x, y, context.Settings.IndexColor, HotSpot.NoneId, ")"); + x = AddIcon(context, x, y, context.IconProvider.RightArrow, 3, HotSpotType.Click) + context.Font.Width; - x = AddText(view, x, y, view.Settings.ValueColor, HotSpot.NoneId, $"") + view.Font.Width; - x = AddIcon(view, x + 2, y, view.IconProvider.Change, 4, HotSpotType.ChangeWrappedType); + x = AddText(context, x, y, context.Settings.ValueColor, HotSpot.NoneId, $"") + context.Font.Width; + x = AddIcon(context, x + 2, y, context.IconProvider.Change, 4, HotSpotType.ChangeWrappedType); - x += view.Font.Width; - x = AddComment(view, x, y); + x += context.Font.Width; + x = AddComment(context, x, y); - DrawInvalidMemoryIndicatorIcon(view, y); - AddContextDropDownIcon(view, y); - AddDeleteIcon(view, y); + DrawInvalidMemoryIndicatorIcon(context, y); + AddContextDropDownIcon(context, y); + AddDeleteIcon(context, y); - y += view.Font.Height; + y += context.Font.Height; - var size = new Size(x - origX, view.Font.Height); + var size = new Size(x - origX, context.Font.Height); - if (LevelsOpen[view.Level]) + if (LevelsOpen[context.Level]) { - var childSize = DrawChild(view, tx, y); + var childSize = DrawChild(context, tx, y); size.Width = Math.Max(size.Width, childSize.Width + tx - origX); size.Height += childSize.Height; @@ -85,19 +85,19 @@ protected Size Draw(DrawContext view, int x, int y, string type) return size; } - protected abstract Size DrawChild(DrawContext view, int x, int y); + protected abstract Size DrawChild(DrawContext context, int x, int y); - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += InnerNode.CalculateDrawnHeight(view); + height += InnerNode.CalculateDrawnHeight(context); } return height; } diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index cf44700a..7255e0e3 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -177,17 +177,17 @@ public override Size Draw(DrawContext context, int x, int y) return new Size(x - origX, y - origY + context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += view.Font.Height + 2; + height += context.Font.Height + 2; } return height; } diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 44e17e0a..076c0d48 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -49,9 +49,9 @@ public override Size Draw(DrawContext context, int x, int y) return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } /// Updates the node from the given spot and sets the value. diff --git a/ReClass.NET/Nodes/ClassInstanceNode.cs b/ReClass.NET/Nodes/ClassInstanceNode.cs index d18646a8..0a52b51a 100644 --- a/ReClass.NET/Nodes/ClassInstanceNode.cs +++ b/ReClass.NET/Nodes/ClassInstanceNode.cs @@ -55,12 +55,12 @@ public override Size Draw(DrawContext context, int x, int y) if (LevelsOpen[context.Level]) { - var v = context.Clone(); - v.Address = context.Address + Offset; - v.Memory = context.Memory.Clone(); - v.Memory.Offset += Offset; + var innerContext = context.Clone(); + innerContext.Address = context.Address + Offset; + innerContext.Memory = context.Memory.Clone(); + innerContext.Memory.Offset += Offset; - var innerSize = InnerNode.Draw(v, tx, y); + var innerSize = InnerNode.Draw(innerContext, tx, y); size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); size.Height += innerSize.Height; } @@ -68,17 +68,17 @@ public override Size Draw(DrawContext context, int x, int y) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += InnerNode.CalculateDrawnHeight(view); + height += InnerNode.CalculateDrawnHeight(context); } return height; } diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 65544d1c..2125e8e9 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -112,8 +112,8 @@ public override Size Draw(DrawContext context, int x, int y) { var childOffset = tx - origX; - var nv = context.Clone(); - nv.Level++; + var innerContext = context.Clone(); + innerContext.Level++; foreach (var node in Nodes) { Size AggregateNodeSizes(Size baseSize, Size newSize) @@ -129,7 +129,7 @@ Size ExtendWidth(Size baseSize, int width) // Draw the node if it is in the visible area. if (context.ClientArea.Contains(tx, y)) { - var innerSize = node.Draw(nv, tx, y); + var innerSize = node.Draw(innerContext, tx, y); size = AggregateNodeSizes(size, ExtendWidth(innerSize, childOffset)); @@ -138,13 +138,13 @@ Size ExtendWidth(Size baseSize, int width) else { // Otherwise calculate the height... - var calculatedHeight = node.CalculateDrawnHeight(nv); + var calculatedHeight = node.CalculateDrawnHeight(innerContext); // and check if the node area overlaps with the visible area... if (new Rectangle(tx, y, 9999999, calculatedHeight).IntersectsWith(context.ClientArea)) { // then draw the node... - var innerSize = node.Draw(nv, tx, y); + var innerSize = node.Draw(innerContext, tx, y); size = AggregateNodeSizes(size, ExtendWidth(innerSize, childOffset)); @@ -164,17 +164,17 @@ Size ExtendWidth(Size baseSize, int width) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - var nv = view.Clone(); + var nv = context.Clone(); nv.Level++; height += Nodes.Sum(n => n.CalculateDrawnHeight(nv)); } diff --git a/ReClass.NET/Nodes/EnumNode.cs b/ReClass.NET/Nodes/EnumNode.cs index 411cd002..d2fcf746 100644 --- a/ReClass.NET/Nodes/EnumNode.cs +++ b/ReClass.NET/Nodes/EnumNode.cs @@ -175,9 +175,9 @@ public override Size Draw(DrawContext context, int x, int y) return new Size(x - origX, context.Font.Height); } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { - return IsHidden && !IsWrapped ? HiddenHeight : view.Font.Height; + return IsHidden && !IsWrapped ? HiddenHeight : context.Font.Height; } } } diff --git a/ReClass.NET/Nodes/FunctionNode.cs b/ReClass.NET/Nodes/FunctionNode.cs index 30dfd5bd..8a6c4429 100644 --- a/ReClass.NET/Nodes/FunctionNode.cs +++ b/ReClass.NET/Nodes/FunctionNode.cs @@ -94,17 +94,17 @@ public override Size Draw(DrawContext context, int x, int y) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += Instructions.Count * view.Font.Height; + height += Instructions.Count * context.Font.Height; } return height; } diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index 75ebed62..b58567fb 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -42,13 +42,13 @@ public override void Update(HotSpot spot) Update(spot, 4); } - protected override int AddComment(DrawContext view, int x, int y) + protected override int AddComment(DrawContext context, int x, int y) { - x = base.AddComment(view, x, y); + x = base.AddComment(context, x, y); - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - x = AddComment(view, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); + x = AddComment(context, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); return x; } diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index 093bcdfb..3cacf264 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -42,13 +42,13 @@ public override void Update(HotSpot spot) Update(spot, 8); } - protected override int AddComment(DrawContext view, int x, int y) + protected override int AddComment(DrawContext context, int x, int y) { - x = base.AddComment(view, x, y); + x = base.AddComment(context, x, y); - var value = view.Memory.ReadObject(Offset); + var value = context.Memory.ReadObject(Offset); - x = AddComment(view, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); + x = AddComment(context, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); return x; } diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index c0de02d8..91a212b9 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -82,9 +82,9 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { - return 3 * view.Font.Height; + return 3 * context.Font.Height; } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index ab790584..8a5969c0 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -94,9 +94,9 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { - return 3 * view.Font.Height; + return 3 * context.Font.Height; } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index 097e1469..d8c022f9 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -115,9 +115,9 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { - return 4 * view.Font.Height; + return 4 * context.Font.Height; } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/PointerNode.cs b/ReClass.NET/Nodes/PointerNode.cs index 8920feb6..027b0d28 100644 --- a/ReClass.NET/Nodes/PointerNode.cs +++ b/ReClass.NET/Nodes/PointerNode.cs @@ -43,17 +43,13 @@ public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) return spot.Process.GetNamedAddress(address) != null; } - public override bool CanChangeInnerNodeTo(BaseNode node) - { - switch (node) + public override bool CanChangeInnerNodeTo(BaseNode node) => + node switch { - case ClassNode _: - case VirtualMethodNode _: - return false; - } - - return true; - } + ClassNode _ => false, + VirtualMethodNode _ => false, + _ => true + }; public override Size Draw(DrawContext context, int x, int y) { @@ -111,11 +107,11 @@ public override Size Draw(DrawContext context, int x, int y) memory.Size = InnerNode.MemorySize; memory.UpdateFrom(context.Process, ptr); - var v = context.Clone(); - v.Address = ptr; - v.Memory = memory; + var innerContext = context.Clone(); + innerContext.Address = ptr; + innerContext.Memory = memory; - var innerSize = InnerNode.Draw(v, tx, y); + var innerSize = InnerNode.Draw(innerContext, tx, y); size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); size.Height += innerSize.Height; @@ -124,17 +120,17 @@ public override Size Draw(DrawContext context, int x, int y) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level] && InnerNode != null) + var height = context.Font.Height; + if (LevelsOpen[context.Level] && InnerNode != null) { - height += InnerNode.CalculateDrawnHeight(view); + height += InnerNode.CalculateDrawnHeight(context); } return height; } diff --git a/ReClass.NET/Nodes/UnionNode.cs b/ReClass.NET/Nodes/UnionNode.cs index 5d1df2d4..f46108c2 100644 --- a/ReClass.NET/Nodes/UnionNode.cs +++ b/ReClass.NET/Nodes/UnionNode.cs @@ -78,16 +78,16 @@ public override Size Draw(DrawContext context, int x, int y) if (LevelsOpen[context.Level]) { - var v = context.Clone(); - v.Settings = Program.Settings.Clone(); - v.Settings.ShowNodeAddress = false; - v.Address = context.Address + Offset; - v.Memory = context.Memory.Clone(); - v.Memory.Offset += Offset; + var innerContext = context.Clone(); + innerContext.Settings = Program.Settings.Clone(); + innerContext.Settings.ShowNodeAddress = false; + innerContext.Address = context.Address + Offset; + innerContext.Memory = context.Memory.Clone(); + innerContext.Memory.Offset += Offset; foreach (var node in Nodes) { - var innerSize = node.Draw(v, tx, y); + var innerSize = node.Draw(innerContext, tx, y); size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); size.Height += innerSize.Height; @@ -99,17 +99,17 @@ public override Size Draw(DrawContext context, int x, int y) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += Nodes.Sum(n => n.CalculateDrawnHeight(view)); + height += Nodes.Sum(n => n.CalculateDrawnHeight(context)); } return height; } diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index 5ad249dd..a9e876d6 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -40,7 +40,7 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { return 0; } diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index 2d153ec7..8f49111a 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -44,7 +44,7 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { return 0; } diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 3c193cb4..7321d1d3 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -48,7 +48,7 @@ public override Size Draw(DrawContext context, int x2, int y2) }); } - protected override int CalculateValuesHeight(DrawContext view) + protected override int CalculateValuesHeight(DrawContext context) { return 0; } diff --git a/ReClass.NET/Nodes/VirtualMethodTableNode.cs b/ReClass.NET/Nodes/VirtualMethodTableNode.cs index bd08fb28..9e82ab40 100644 --- a/ReClass.NET/Nodes/VirtualMethodTableNode.cs +++ b/ReClass.NET/Nodes/VirtualMethodTableNode.cs @@ -75,13 +75,13 @@ public override Size Draw(DrawContext context, int x, int y) memory.Size = Nodes.Count * IntPtr.Size; memory.UpdateFrom(context.Process, ptr); - var v = context.Clone(); - v.Address = ptr; - v.Memory = memory; + var innerContext = context.Clone(); + innerContext.Address = ptr; + innerContext.Memory = memory; foreach (var node in Nodes) { - var innerSize = node.Draw(v, tx, y); + var innerSize = node.Draw(innerContext, tx, y); size.Width = Math.Max(size.Width, innerSize.Width + tx - origX); size.Height += innerSize.Height; @@ -93,17 +93,17 @@ public override Size Draw(DrawContext context, int x, int y) return size; } - public override int CalculateDrawnHeight(DrawContext view) + public override int CalculateDrawnHeight(DrawContext context) { if (IsHidden && !IsWrapped) { return HiddenHeight; } - var height = view.Font.Height; - if (LevelsOpen[view.Level]) + var height = context.Font.Height; + if (LevelsOpen[context.Level]) { - height += Nodes.Sum(n => n.CalculateDrawnHeight(view)); + height += Nodes.Sum(n => n.CalculateDrawnHeight(context)); } return height; } From 8773c39ceb67ca2a2606fee845f8e4cf7377ff92 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 13:49:01 +0200 Subject: [PATCH 728/777] Added nodes for native integer sizes. --- ReClass.NET/Memory/MemoryBuffer.cs | 16 ++++++++- ReClass.NET/Nodes/IntNativeNode.cs | 52 ++++++++++++++++++++++++++++ ReClass.NET/Nodes/UIntNativeNode.cs | 53 +++++++++++++++++++++++++++++ ReClass.NET/ReClass.NET.csproj | 2 ++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 ReClass.NET/Nodes/IntNativeNode.cs create mode 100644 ReClass.NET/Nodes/UIntNativeNode.cs diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index ddaed91b..f81b3885 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.Contracts; using System.Runtime.InteropServices; using System.Text; @@ -326,6 +326,20 @@ public IntPtr ReadIntPtr(int offset) #endif } + /// Reads a from the specific offset. + /// The offset into the data. + /// The data read as or 0 if the offset is outside the data. + public UIntPtr ReadUIntPtr(int offset) + { + Contract.Requires(offset >= 0); + +#if RECLASSNET64 + return (UIntPtr)ReadUInt64(offset); +#else + return (UIntPtr)ReadUInt32(offset); +#endif + } + #endregion public string ReadString(Encoding encoding, int offset, int length) diff --git a/ReClass.NET/Nodes/IntNativeNode.cs b/ReClass.NET/Nodes/IntNativeNode.cs new file mode 100644 index 00000000..bde88d62 --- /dev/null +++ b/ReClass.NET/Nodes/IntNativeNode.cs @@ -0,0 +1,52 @@ +using System; +using System.Drawing; +using System.Globalization; +using ReClassNET.Controls; +using ReClassNET.Extensions; +using ReClassNET.Memory; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class IntNativeNode : BaseNumericNode + { + public override int MemorySize => 8; + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "NInt"; + icon = Properties.Resources.B16x16_Button_Int_64; + } + + public override Size Draw(DrawContext context, int x, int y) + { + var value = ReadValueFromMemory(context.Memory); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "NInt", value.ToInt64().ToString(), "0x" + value.ToString(Constants.AddressHexFormat)); + } + + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0 || spot.Id == 1) + { +#if RECLASSNET64 + if (long.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && long.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) + { + spot.Process.WriteRemoteMemory(spot.Address, val); + } +#else + if (int.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && int.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) + { + spot.Process.WriteRemoteMemory(spot.Address, val); + } +#endif + } + } + + public IntPtr ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadIntPtr(Offset); + } + } +} diff --git a/ReClass.NET/Nodes/UIntNativeNode.cs b/ReClass.NET/Nodes/UIntNativeNode.cs new file mode 100644 index 00000000..4902cee8 --- /dev/null +++ b/ReClass.NET/Nodes/UIntNativeNode.cs @@ -0,0 +1,53 @@ +using System; +using System.Drawing; +using System.Globalization; +using ReClassNET.Controls; +using ReClassNET.Extensions; +using ReClassNET.Memory; +using ReClassNET.UI; + +namespace ReClassNET.Nodes +{ + public class UIntNativeNode : BaseNumericNode + { + public override int MemorySize => 8; + + public override void GetUserInterfaceInfo(out string name, out Image icon) + { + name = "NUInt"; + icon = Properties.Resources.B16x16_Button_UInt_64; + } + + public override Size Draw(DrawContext context, int x, int y) + { + var value = ReadValueFromMemory(context.Memory); + var uvalue = value.ToUInt64(); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "NUInt", uvalue.ToString(), "0x" + uvalue.ToString(Constants.AddressHexFormat)); + } + + public override void Update(HotSpot spot) + { + base.Update(spot); + + if (spot.Id == 0 || spot.Id == 1) + { +#if RECLASSNET64 + if (ulong.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && ulong.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) + { + spot.Process.WriteRemoteMemory(spot.Address, val); + } +#else + if (uint.TryParse(spot.Text, out var val) || spot.Text.TryGetHexString(out var hexValue) && uint.TryParse(hexValue, NumberStyles.HexNumber, null, out val)) + { + spot.Process.WriteRemoteMemory(spot.Address, val); + } +#endif + } + } + + public UIntPtr ReadValueFromMemory(MemoryBuffer memory) + { + return memory.ReadUIntPtr(Offset); + } + } +} diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index b5761ac2..c0fd19d6 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -289,8 +289,10 @@ + + From 3162e2d54856e6d3f23fa4376961890fc9b0760b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:04:41 +0200 Subject: [PATCH 729/777] Added icons. --- ReClass.NET/Nodes/IntNativeNode.cs | 2 +- ReClass.NET/Nodes/UIntNativeNode.cs | 2 +- ReClass.NET/Properties/Resources.Designer.cs | 24 ++++++++++++++++-- ReClass.NET/Properties/Resources.resx | 6 +++++ ReClass.NET/ReClass.NET.csproj | 7 ++++- .../Resources/Images/B16x16_Button_NInt.png | Bin 0 -> 188 bytes .../Resources/Images/B16x16_Button_NUInt.png | Bin 0 -> 189 bytes 7 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 ReClass.NET/Resources/Images/B16x16_Button_NInt.png create mode 100644 ReClass.NET/Resources/Images/B16x16_Button_NUInt.png diff --git a/ReClass.NET/Nodes/IntNativeNode.cs b/ReClass.NET/Nodes/IntNativeNode.cs index bde88d62..b50f6e3f 100644 --- a/ReClass.NET/Nodes/IntNativeNode.cs +++ b/ReClass.NET/Nodes/IntNativeNode.cs @@ -15,7 +15,7 @@ public class IntNativeNode : BaseNumericNode public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "NInt"; - icon = Properties.Resources.B16x16_Button_Int_64; + icon = Properties.Resources.B16x16_Button_NInt; } public override Size Draw(DrawContext context, int x, int y) diff --git a/ReClass.NET/Nodes/UIntNativeNode.cs b/ReClass.NET/Nodes/UIntNativeNode.cs index 4902cee8..50da79f0 100644 --- a/ReClass.NET/Nodes/UIntNativeNode.cs +++ b/ReClass.NET/Nodes/UIntNativeNode.cs @@ -15,7 +15,7 @@ public class UIntNativeNode : BaseNumericNode public override void GetUserInterfaceInfo(out string name, out Image icon) { name = "NUInt"; - icon = Properties.Resources.B16x16_Button_UInt_64; + icon = Properties.Resources.B16x16_Button_NUInt; } public override Size Draw(DrawContext context, int x, int y) diff --git a/ReClass.NET/Properties/Resources.Designer.cs b/ReClass.NET/Properties/Resources.Designer.cs index 538bd01c..3d412074 100644 --- a/ReClass.NET/Properties/Resources.Designer.cs +++ b/ReClass.NET/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace ReClassNET.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -510,6 +510,26 @@ internal static System.Drawing.Bitmap B16x16_Button_Matrix_4x4 { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_NInt { + get { + object obj = ResourceManager.GetObject("B16x16_Button_NInt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap B16x16_Button_NUInt { + get { + object obj = ResourceManager.GetObject("B16x16_Button_NUInt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1351,7 +1371,7 @@ internal static System.Drawing.Bitmap B32x32_Plugin { } /// - /// Looks up a localized string similar to 2019/03/31 20:34:22 + /// Looks up a localized string similar to 2020/10/17 09:45:04 ///. /// internal static string BuildDate { diff --git a/ReClass.NET/Properties/Resources.resx b/ReClass.NET/Properties/Resources.resx index 7c64e77f..48c2c826 100644 --- a/ReClass.NET/Properties/Resources.resx +++ b/ReClass.NET/Properties/Resources.resx @@ -511,4 +511,10 @@ ..\Resources\Images\B16x16_Button_Union.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Images\B16x16_Button_NInt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\B16x16_Button_NUInt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index c0fd19d6..415d3b07 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1013,7 +1013,12 @@ - + + + + + + powershell -Command "((Get-Date).ToUniversalTime()).ToString(\"yyyy\/MM\/dd HH:mm:ss\") | Out-File '$(ProjectDir)Resources\BuildDate.txt'" diff --git a/ReClass.NET/Resources/Images/B16x16_Button_NInt.png b/ReClass.NET/Resources/Images/B16x16_Button_NInt.png new file mode 100644 index 0000000000000000000000000000000000000000..0e07b5766d59d437f99e1a44beac99872739e304 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0G|+7ApM`g07y>n*|io(F_#4S1^@rgaQzf7P%VR#r;B5VM)1_Lfm{p< z9LyKK{ANS%G}c0G|+7AkEg z4(0=2{`cqQ%@k$z^{{Q3CC?Z!^(Irq1v|#YSqJ8^KQM`JD*M`S$CB}b_tUCCp}7Vv e>l2RcWq!So@yMxvJcohCF?hQAxvX Date: Sun, 18 Oct 2020 14:05:35 +0200 Subject: [PATCH 730/777] Fixed memory size. --- ReClass.NET/Nodes/IntNativeNode.cs | 2 +- ReClass.NET/Nodes/UIntNativeNode.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/IntNativeNode.cs b/ReClass.NET/Nodes/IntNativeNode.cs index b50f6e3f..b6278de8 100644 --- a/ReClass.NET/Nodes/IntNativeNode.cs +++ b/ReClass.NET/Nodes/IntNativeNode.cs @@ -10,7 +10,7 @@ namespace ReClassNET.Nodes { public class IntNativeNode : BaseNumericNode { - public override int MemorySize => 8; + public override int MemorySize => IntPtr.Size; public override void GetUserInterfaceInfo(out string name, out Image icon) { diff --git a/ReClass.NET/Nodes/UIntNativeNode.cs b/ReClass.NET/Nodes/UIntNativeNode.cs index 50da79f0..0ad770b4 100644 --- a/ReClass.NET/Nodes/UIntNativeNode.cs +++ b/ReClass.NET/Nodes/UIntNativeNode.cs @@ -10,7 +10,7 @@ namespace ReClassNET.Nodes { public class UIntNativeNode : BaseNumericNode { - public override int MemorySize => 8; + public override int MemorySize => UIntPtr.Size; public override void GetUserInterfaceInfo(out string name, out Image icon) { From b09b294d21f4877ebca9e5b568a4dc05915cd35c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:08:39 +0200 Subject: [PATCH 731/777] Changed node name. --- ReClass.NET/Nodes/{IntNativeNode.cs => NIntNode.cs} | 2 +- ReClass.NET/Nodes/{UIntNativeNode.cs => NUIntNode.cs} | 2 +- ReClass.NET/ReClass.NET.csproj | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename ReClass.NET/Nodes/{IntNativeNode.cs => NIntNode.cs} (96%) rename ReClass.NET/Nodes/{UIntNativeNode.cs => NUIntNode.cs} (96%) diff --git a/ReClass.NET/Nodes/IntNativeNode.cs b/ReClass.NET/Nodes/NIntNode.cs similarity index 96% rename from ReClass.NET/Nodes/IntNativeNode.cs rename to ReClass.NET/Nodes/NIntNode.cs index b6278de8..3b469e7e 100644 --- a/ReClass.NET/Nodes/IntNativeNode.cs +++ b/ReClass.NET/Nodes/NIntNode.cs @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes { - public class IntNativeNode : BaseNumericNode + public class NIntNode : BaseNumericNode { public override int MemorySize => IntPtr.Size; diff --git a/ReClass.NET/Nodes/UIntNativeNode.cs b/ReClass.NET/Nodes/NUIntNode.cs similarity index 96% rename from ReClass.NET/Nodes/UIntNativeNode.cs rename to ReClass.NET/Nodes/NUIntNode.cs index 0ad770b4..2736d071 100644 --- a/ReClass.NET/Nodes/UIntNativeNode.cs +++ b/ReClass.NET/Nodes/NUIntNode.cs @@ -8,7 +8,7 @@ namespace ReClassNET.Nodes { - public class UIntNativeNode : BaseNumericNode + public class NUIntNode : BaseNumericNode { public override int MemorySize => UIntPtr.Size; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 415d3b07..77ac1145 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -289,10 +289,10 @@ - + - + From 3b6d432298f2665247bca349fd039984dd2cd4b3 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:19:18 +0200 Subject: [PATCH 732/777] Changed hex display. --- ReClass.NET/Nodes/NIntNode.cs | 4 ++-- ReClass.NET/Nodes/NUIntNode.cs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Nodes/NIntNode.cs b/ReClass.NET/Nodes/NIntNode.cs index 3b469e7e..63661b08 100644 --- a/ReClass.NET/Nodes/NIntNode.cs +++ b/ReClass.NET/Nodes/NIntNode.cs @@ -20,8 +20,8 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(context.Memory); - return DrawNumeric(context, x, y, context.IconProvider.Signed, "NInt", value.ToInt64().ToString(), "0x" + value.ToString(Constants.AddressHexFormat)); + var value = ReadValueFromMemory(context.Memory).ToInt64(); + return DrawNumeric(context, x, y, context.IconProvider.Signed, "NInt", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) diff --git a/ReClass.NET/Nodes/NUIntNode.cs b/ReClass.NET/Nodes/NUIntNode.cs index 2736d071..8f98c7d4 100644 --- a/ReClass.NET/Nodes/NUIntNode.cs +++ b/ReClass.NET/Nodes/NUIntNode.cs @@ -20,9 +20,8 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(context.Memory); - var uvalue = value.ToUInt64(); - return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "NUInt", uvalue.ToString(), "0x" + uvalue.ToString(Constants.AddressHexFormat)); + var value = ReadValueFromMemory(context.Memory).ToUInt64(); + return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "NUInt", value.ToString(), $"0x{value:X}"); } public override void Update(HotSpot spot) From c61bae4374ddfaa5bb62942a9a43fe3c5fb8c25b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:20:37 +0200 Subject: [PATCH 733/777] Added node type to gui. --- ReClass.NET/UI/NodeTypesBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/UI/NodeTypesBuilder.cs b/ReClass.NET/UI/NodeTypesBuilder.cs index 689171ab..8d519022 100644 --- a/ReClass.NET/UI/NodeTypesBuilder.cs +++ b/ReClass.NET/UI/NodeTypesBuilder.cs @@ -18,8 +18,8 @@ internal static class NodeTypesBuilder static NodeTypesBuilder() { defaultNodeTypeGroupList.Add(new[] { typeof(Hex64Node), typeof(Hex32Node), typeof(Hex16Node), typeof(Hex8Node) }); - defaultNodeTypeGroupList.Add(new[] { typeof(Int64Node), typeof(Int32Node), typeof(Int16Node), typeof(Int8Node) }); - defaultNodeTypeGroupList.Add(new[] { typeof(UInt64Node), typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(NIntNode), typeof(Int64Node), typeof(Int32Node), typeof(Int16Node), typeof(Int8Node) }); + defaultNodeTypeGroupList.Add(new[] { typeof(NUIntNode), typeof(UInt64Node), typeof(UInt32Node), typeof(UInt16Node), typeof(UInt8Node) }); defaultNodeTypeGroupList.Add(new[] { typeof(BoolNode), typeof(BitFieldNode), typeof(EnumNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(FloatNode), typeof(DoubleNode) }); defaultNodeTypeGroupList.Add(new[] { typeof(Vector4Node), typeof(Vector3Node), typeof(Vector2Node), typeof(Matrix4x4Node), typeof(Matrix3x4Node), typeof(Matrix3x3Node) }); From 6b7ea59e9b4dac4ceb3d9d86dec602606ac6afd5 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:25:26 +0200 Subject: [PATCH 734/777] Added import and export for native int nodes. --- ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs index eb25e52b..af258a04 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -54,6 +54,7 @@ static ReClassNetFile() typeof(Int16Node), typeof(Int32Node), typeof(Int64Node), + typeof(NIntNode), typeof(Matrix3x3Node), typeof(Matrix3x4Node), typeof(Matrix4x4Node), @@ -61,6 +62,7 @@ static ReClassNetFile() typeof(UInt16Node), typeof(UInt32Node), typeof(UInt64Node), + typeof(NUIntNode), typeof(Utf8TextNode), typeof(Utf8TextPtrNode), typeof(Utf16TextNode), From be778fd129052d1b6ecee705019e546793e91d5f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 14:49:17 +0200 Subject: [PATCH 735/777] Added memory searcher functionality. --- ReClass.NET/Forms/MainForm.cs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 9b6aa9bb..81c6cf63 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -595,10 +595,10 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg comparer = new ArrayOfBytesMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory)); break; case FloatNode node: - comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0f); break; case DoubleNode node: - comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0); break; case Int8Node node: comparer = new ByteMemoryComparer(ScanCompareType.Equal, (byte)node.ReadValueFromMemory(selectedNode.Memory), 0); @@ -619,11 +619,31 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0); break; case Int64Node node: - comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0L); break; case UInt64Node node: - comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0L); break; + case NIntNode node: + { + var value = node.ReadValueFromMemory(selectedNode.Memory); +#if RECLASSNET64 + comparer = new LongMemoryComparer(ScanCompareType.Equal, value.ToInt64(), 0L); +#else + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, value.ToInt32(), 0); +#endif + break; + } + case NUIntNode node: + { + var value = node.ReadValueFromMemory(selectedNode.Memory); +#if RECLASSNET64 + comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)value.ToUInt64(), 0L); +#else + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)value.ToUInt32(), 0); +#endif + break; + } case Utf8TextNode node: comparer = new StringMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory), Encoding.UTF8, true); break; @@ -716,7 +736,7 @@ private void shrinkClassToolStripMenuItem_Click(object sender, EventArgs e) } } - #endregion +#endregion private void MainForm_DragEnter(object sender, DragEventArgs e) { From 12381e077b707bb1a4be5104ff12baab9eae6f9b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 15:28:26 +0200 Subject: [PATCH 736/777] Add support for code generation. --- ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs | 2 ++ ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 2 ++ ReClass.NET/Project/CppTypeMapping.cs | 8 +++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs index 0eedf1f9..c46bb836 100644 --- a/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CSharpCodeGenerator.cs @@ -22,10 +22,12 @@ public class CSharpCodeGenerator : ICodeGenerator [typeof(Int16Node)] = "short", [typeof(Int32Node)] = "int", [typeof(Int64Node)] = "long", + [typeof(NIntNode)] = "IntPtr", [typeof(UInt8Node)] = "byte", [typeof(UInt16Node)] = "ushort", [typeof(UInt32Node)] = "uint", [typeof(UInt64Node)] = "ulong", + [typeof(NUIntNode)] = "UIntPtr", [typeof(FunctionPtrNode)] = "IntPtr", [typeof(Utf8TextPtrNode)] = "IntPtr", diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 8988118e..4cefbf8f 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -136,6 +136,7 @@ public CppCodeGenerator(CppTypeMapping typeMapping) [typeof(Int16Node)] = typeMapping.TypeInt16, [typeof(Int32Node)] = typeMapping.TypeInt32, [typeof(Int64Node)] = typeMapping.TypeInt64, + [typeof(NIntNode)] = typeMapping.TypeNInt, [typeof(Matrix3x3Node)] = typeMapping.TypeMatrix3x3, [typeof(Matrix3x4Node)] = typeMapping.TypeMatrix3x4, [typeof(Matrix4x4Node)] = typeMapping.TypeMatrix4x4, @@ -143,6 +144,7 @@ public CppCodeGenerator(CppTypeMapping typeMapping) [typeof(UInt16Node)] = typeMapping.TypeUInt16, [typeof(UInt32Node)] = typeMapping.TypeUInt32, [typeof(UInt64Node)] = typeMapping.TypeUInt64, + [typeof(NUIntNode)] = typeMapping.TypeNUInt, [typeof(Utf8CharacterNode)] = typeMapping.TypeUtf8Text, [typeof(Utf16CharacterNode)] = typeMapping.TypeUtf16Text, [typeof(Utf32CharacterNode)] = typeMapping.TypeUtf32Text, diff --git a/ReClass.NET/Project/CppTypeMapping.cs b/ReClass.NET/Project/CppTypeMapping.cs index eb90a174..03e1bc48 100644 --- a/ReClass.NET/Project/CppTypeMapping.cs +++ b/ReClass.NET/Project/CppTypeMapping.cs @@ -1,4 +1,4 @@ -using System.Xml.Linq; +using System.Xml.Linq; using ReClassNET.Util; namespace ReClassNET.Project @@ -11,11 +11,13 @@ public class CppTypeMapping public string TypeInt16 { get; set; } = "int16_t"; public string TypeInt32 { get; set; } = "int32_t"; public string TypeInt64 { get; set; } = "int64_t"; + public string TypeNInt { get; set; } = "ptrdiff_t"; public string TypeUInt8 { get; set; } = "uint8_t"; public string TypeUInt16 { get; set; } = "uint16_t"; public string TypeUInt32 { get; set; } = "uint32_t"; public string TypeUInt64 { get; set; } = "uint64_t"; + public string TypeNUInt { get; set; } = "size_t"; public string TypeFloat { get; set; } = "float"; public string TypeDouble { get; set; } = "double"; @@ -43,10 +45,12 @@ internal XElement Serialize(string name) XElementSerializer.ToXml(nameof(TypeInt16), TypeInt16), XElementSerializer.ToXml(nameof(TypeInt32), TypeInt32), XElementSerializer.ToXml(nameof(TypeInt64), TypeInt64), + XElementSerializer.ToXml(nameof(TypeNInt), TypeNInt), XElementSerializer.ToXml(nameof(TypeUInt8), TypeUInt8), XElementSerializer.ToXml(nameof(TypeUInt16), TypeUInt16), XElementSerializer.ToXml(nameof(TypeUInt32), TypeUInt32), XElementSerializer.ToXml(nameof(TypeUInt64), TypeUInt64), + XElementSerializer.ToXml(nameof(TypeNUInt), TypeNUInt), XElementSerializer.ToXml(nameof(TypeFloat), TypeFloat), XElementSerializer.ToXml(nameof(TypeDouble), TypeDouble), XElementSerializer.ToXml(nameof(TypeVector2), TypeVector2), @@ -69,10 +73,12 @@ internal void Deserialize(XElement element) XElementSerializer.TryRead(element, nameof(TypeInt16), e => TypeInt16 = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeInt32), e => TypeInt32 = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeInt64), e => TypeInt64 = XElementSerializer.ToString(e)); + XElementSerializer.TryRead(element, nameof(TypeNInt), e => TypeNInt = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeUInt8), e => TypeUInt8 = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeUInt16), e => TypeUInt16 = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeUInt32), e => TypeUInt32 = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeUInt64), e => TypeUInt64 = XElementSerializer.ToString(e)); + XElementSerializer.TryRead(element, nameof(TypeNUInt), e => TypeNUInt = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeFloat), e => TypeFloat = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeDouble), e => TypeDouble = XElementSerializer.ToString(e)); XElementSerializer.TryRead(element, nameof(TypeVector2), e => TypeVector2 = XElementSerializer.ToString(e)); From 802fb66d3384337393cc8e1134836d4d98021e69 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 15:31:56 +0200 Subject: [PATCH 737/777] Fixed formatting for negative 4byte values. --- ReClass.NET/Nodes/NIntNode.cs | 7 ++++++- ReClass.NET/Nodes/NUIntNode.cs | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/NIntNode.cs b/ReClass.NET/Nodes/NIntNode.cs index 63661b08..77d021e0 100644 --- a/ReClass.NET/Nodes/NIntNode.cs +++ b/ReClass.NET/Nodes/NIntNode.cs @@ -20,7 +20,12 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(context.Memory).ToInt64(); + var value = ReadValueFromMemory(context.Memory) +#if RECLASSNET64 + .ToInt64(); +#else + .ToInt32(); +#endif return DrawNumeric(context, x, y, context.IconProvider.Signed, "NInt", value.ToString(), $"0x{value:X}"); } diff --git a/ReClass.NET/Nodes/NUIntNode.cs b/ReClass.NET/Nodes/NUIntNode.cs index 8f98c7d4..1b502ad0 100644 --- a/ReClass.NET/Nodes/NUIntNode.cs +++ b/ReClass.NET/Nodes/NUIntNode.cs @@ -20,7 +20,12 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x, int y) { - var value = ReadValueFromMemory(context.Memory).ToUInt64(); + var value = ReadValueFromMemory(context.Memory) +#if RECLASSNET64 + .ToUInt64(); +#else + .ToUInt32(); +#endif return DrawNumeric(context, x, y, context.IconProvider.Unsigned, "NUInt", value.ToString(), $"0x{value:X}"); } From 00652273722e81639556ef79d43de2a4b715a199 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 19:47:11 +0200 Subject: [PATCH 738/777] Enable search context menu for native int nodes. --- ReClass.NET/Forms/MainForm.cs | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 81c6cf63..0b3f3008 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -466,26 +466,26 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs var parentNode = node?.GetParentContainer(); var nodeIsClass = node is ClassNode; - var nodeIsSearchableValueNode = false; - switch (node) + var nodeIsSearchableValueNode = node switch { - case BaseHexNode _: - case FloatNode _: - case DoubleNode _: - case Int8Node _: - case UInt8Node _: - case Int16Node _: - case UInt16Node _: - case Int32Node _: - case UInt32Node _: - case Int64Node _: - case UInt64Node _: - case Utf8TextNode _: - case Utf16TextNode _: - case Utf32TextNode _: - nodeIsSearchableValueNode = true; - break; - } + BaseHexNode _ => true, + FloatNode _ => true, + DoubleNode _ => true, + Int8Node _ => true, + UInt8Node _ => true, + Int16Node _ => true, + UInt16Node _ => true, + Int32Node _ => true, + UInt32Node _ => true, + Int64Node _ => true, + UInt64Node _ => true, + NIntNode _ => true, + NUIntNode _ => true, + Utf8TextNode _ => true, + Utf16TextNode _ => true, + Utf32TextNode _ => true, + _ => false + }; addBytesToolStripMenuItem.Enabled = parentNode != null || nodeIsClass; insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null; From 7406e05231404b78e3aae2d70c156137305f520a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 18 Oct 2020 19:59:54 +0200 Subject: [PATCH 739/777] Added missing type settings to form. --- ReClass.NET/Forms/SettingsForm.Designer.cs | 2170 ++++++++++---------- ReClass.NET/Forms/SettingsForm.cs | 12 +- 2 files changed, 1124 insertions(+), 1058 deletions(-) diff --git a/ReClass.NET/Forms/SettingsForm.Designer.cs b/ReClass.NET/Forms/SettingsForm.Designer.cs index d00f8b9d..82e4efd9 100644 --- a/ReClass.NET/Forms/SettingsForm.Designer.cs +++ b/ReClass.NET/Forms/SettingsForm.Designer.cs @@ -30,1058 +30,1118 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { - this.settingsTabControl = new System.Windows.Forms.TabControl(); - this.generalSettingsTabPage = new System.Windows.Forms.TabPage(); - this.fileAssociationGroupBox = new System.Windows.Forms.GroupBox(); - this.removeAssociationButton = new System.Windows.Forms.Button(); - this.createAssociationButton = new System.Windows.Forms.Button(); - this.associationInfoLabel = new System.Windows.Forms.Label(); - this.commentsGroupBox = new System.Windows.Forms.GroupBox(); - this.showPluginInfoCheckBox = new System.Windows.Forms.CheckBox(); - this.showStringCheckBox = new System.Windows.Forms.CheckBox(); - this.showSymbolsCheckBox = new System.Windows.Forms.CheckBox(); - this.showRttiCheckBox = new System.Windows.Forms.CheckBox(); - this.showPointerCheckBox = new System.Windows.Forms.CheckBox(); - this.showIntegerCheckBox = new System.Windows.Forms.CheckBox(); - this.showFloatCheckBox = new System.Windows.Forms.CheckBox(); - this.displayGroupBox = new System.Windows.Forms.GroupBox(); - this.randomizeWindowTitleCheckBox = new System.Windows.Forms.CheckBox(); - this.runAsAdminCheckBox = new System.Windows.Forms.CheckBox(); - this.highlightChangedValuesCheckBox = new System.Windows.Forms.CheckBox(); - this.showTextCheckBox = new System.Windows.Forms.CheckBox(); - this.showNodeOffsetCheckBox = new System.Windows.Forms.CheckBox(); - this.showNodeAddressCheckBox = new System.Windows.Forms.CheckBox(); - this.stayOnTopCheckBox = new System.Windows.Forms.CheckBox(); - this.colorsSettingTabPage = new System.Windows.Forms.TabPage(); - this.nodeColorGroupBox = new System.Windows.Forms.GroupBox(); - this.nodeValueLabel = new System.Windows.Forms.Label(); - this.nodePluginLabel = new System.Windows.Forms.Label(); - this.nodeHexValueColorBox = new ColorBox(); - this.nodePluginColorBox = new ColorBox(); - this.nodeHexValueLabel = new System.Windows.Forms.Label(); - this.nodeVTableLabel = new System.Windows.Forms.Label(); - this.nodeOffsetColorBox = new ColorBox(); - this.nodeVTableColorBox = new ColorBox(); - this.nodeOffsetLabel = new System.Windows.Forms.Label(); - this.nodeTextLabel = new System.Windows.Forms.Label(); - this.nodeAddressColorBox = new ColorBox(); - this.nodeTextColorBox = new ColorBox(); - this.nodeAddressLabel = new System.Windows.Forms.Label(); - this.nodeCommentLabel = new System.Windows.Forms.Label(); - this.nodeHiddenColorBox = new ColorBox(); - this.nodeCommentColorBox = new ColorBox(); - this.nodeHiddenLabel = new System.Windows.Forms.Label(); - this.nodeIndexLabel = new System.Windows.Forms.Label(); - this.nodeSelectedColorBox = new ColorBox(); - this.nodeIndexColorBox = new ColorBox(); - this.nodeSelectedLabel = new System.Windows.Forms.Label(); - this.nodeTypeColorBox = new ColorBox(); - this.nodeValueColorBox = new ColorBox(); - this.nodeTypeLabel = new System.Windows.Forms.Label(); - this.nodeNameLabel = new System.Windows.Forms.Label(); - this.nodeNameColorBox = new ColorBox(); - this.backgroundLabel = new System.Windows.Forms.Label(); - this.backgroundColorBox = new ColorBox(); - this.typeDefinitionsSettingsTabPage = new System.Windows.Forms.TabPage(); - this.boolSettingsLabel = new System.Windows.Forms.Label(); - this.boolTypeTextBox = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.functionPtrSettingsLabel = new System.Windows.Forms.Label(); - this.functionPtrTypeTextBox = new System.Windows.Forms.TextBox(); - this.utf16TextSettingsLabel = new System.Windows.Forms.Label(); - this.utf16TextTypeTextBox = new System.Windows.Forms.TextBox(); - this.utf8TextSettingsLabel = new System.Windows.Forms.Label(); - this.utf8TextTypeTextBox = new System.Windows.Forms.TextBox(); - this.matrix3x3SettingsLabel = new System.Windows.Forms.Label(); - this.matrix3x3TypeTextBox = new System.Windows.Forms.TextBox(); - this.matrix3x4SettingsLabel = new System.Windows.Forms.Label(); - this.matrix3x4TypeTextBox = new System.Windows.Forms.TextBox(); - this.matrix4x4SettingsLabel = new System.Windows.Forms.Label(); - this.matrix4x4TypeTextBox = new System.Windows.Forms.TextBox(); - this.vector2SettingsLabel = new System.Windows.Forms.Label(); - this.vector2TypeTextBox = new System.Windows.Forms.TextBox(); - this.vector3SettingsLabel = new System.Windows.Forms.Label(); - this.vector3TypeTextBox = new System.Windows.Forms.TextBox(); - this.vector4SettingsLabel = new System.Windows.Forms.Label(); - this.vector4TypeTextBox = new System.Windows.Forms.TextBox(); - this.doubleSettingsLabel = new System.Windows.Forms.Label(); - this.doubleTypeTextBox = new System.Windows.Forms.TextBox(); - this.floatSettingsLabel = new System.Windows.Forms.Label(); - this.floatTypeTextBox = new System.Windows.Forms.TextBox(); - this.uint64SettingsLabel = new System.Windows.Forms.Label(); - this.uint64TypeTextBox = new System.Windows.Forms.TextBox(); - this.uint32SettingsLabel = new System.Windows.Forms.Label(); - this.uint32TypeTextBox = new System.Windows.Forms.TextBox(); - this.uint16SettingsLabel = new System.Windows.Forms.Label(); - this.uint16TypeTextBox = new System.Windows.Forms.TextBox(); - this.uint8SettingsLabel = new System.Windows.Forms.Label(); - this.uint8TypeTextBox = new System.Windows.Forms.TextBox(); - this.int64SettingsLabel = new System.Windows.Forms.Label(); - this.int64TypeTextBox = new System.Windows.Forms.TextBox(); - this.int32SettingsLabel = new System.Windows.Forms.Label(); - this.int32TypeTextBox = new System.Windows.Forms.TextBox(); - this.int16SettingsLabel = new System.Windows.Forms.Label(); - this.int16TypeTextBox = new System.Windows.Forms.TextBox(); - this.int8SettingsLabel = new System.Windows.Forms.Label(); - this.int8TypeTextBox = new System.Windows.Forms.TextBox(); - this.bannerBox = new BannerBox(); - this.settingsTabControl.SuspendLayout(); - this.generalSettingsTabPage.SuspendLayout(); - this.fileAssociationGroupBox.SuspendLayout(); - this.commentsGroupBox.SuspendLayout(); - this.displayGroupBox.SuspendLayout(); - this.colorsSettingTabPage.SuspendLayout(); - this.nodeColorGroupBox.SuspendLayout(); - this.typeDefinitionsSettingsTabPage.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); - this.SuspendLayout(); - // - // settingsTabControl - // - this.settingsTabControl.Controls.Add(this.generalSettingsTabPage); - this.settingsTabControl.Controls.Add(this.colorsSettingTabPage); - this.settingsTabControl.Controls.Add(this.typeDefinitionsSettingsTabPage); - this.settingsTabControl.Location = new System.Drawing.Point(12, 60); - this.settingsTabControl.Name = "settingsTabControl"; - this.settingsTabControl.SelectedIndex = 0; - this.settingsTabControl.Size = new System.Drawing.Size(562, 355); - this.settingsTabControl.TabIndex = 1; - // - // generalSettingsTabPage - // - this.generalSettingsTabPage.Controls.Add(this.fileAssociationGroupBox); - this.generalSettingsTabPage.Controls.Add(this.commentsGroupBox); - this.generalSettingsTabPage.Controls.Add(this.displayGroupBox); - this.generalSettingsTabPage.Controls.Add(this.stayOnTopCheckBox); - this.generalSettingsTabPage.Location = new System.Drawing.Point(4, 22); - this.generalSettingsTabPage.Name = "generalSettingsTabPage"; - this.generalSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.generalSettingsTabPage.Size = new System.Drawing.Size(554, 329); - this.generalSettingsTabPage.TabIndex = 0; - this.generalSettingsTabPage.Text = "General"; - this.generalSettingsTabPage.UseVisualStyleBackColor = true; - // - // fileAssociationGroupBox - // - this.fileAssociationGroupBox.Controls.Add(this.removeAssociationButton); - this.fileAssociationGroupBox.Controls.Add(this.createAssociationButton); - this.fileAssociationGroupBox.Controls.Add(this.associationInfoLabel); - this.fileAssociationGroupBox.Location = new System.Drawing.Point(6, 231); - this.fileAssociationGroupBox.Name = "fileAssociationGroupBox"; - this.fileAssociationGroupBox.Size = new System.Drawing.Size(542, 85); - this.fileAssociationGroupBox.TabIndex = 4; - this.fileAssociationGroupBox.TabStop = false; - this.fileAssociationGroupBox.Text = "RCNET File Association"; - // - // removeAssociationButton - // - this.removeAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.removeAssociationButton.Location = new System.Drawing.Point(146, 52); - this.removeAssociationButton.Name = "removeAssociationButton"; - this.removeAssociationButton.Size = new System.Drawing.Size(135, 23); - this.removeAssociationButton.TabIndex = 2; - this.removeAssociationButton.Text = "&Remove Association"; - this.removeAssociationButton.UseVisualStyleBackColor = true; - this.removeAssociationButton.Click += new System.EventHandler(this.removeAssociationButton_Click); - // - // createAssociationButton - // - this.createAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.createAssociationButton.Location = new System.Drawing.Point(9, 52); - this.createAssociationButton.Name = "createAssociationButton"; - this.createAssociationButton.Size = new System.Drawing.Size(131, 23); - this.createAssociationButton.TabIndex = 1; - this.createAssociationButton.Text = "Create &Association"; - this.createAssociationButton.UseVisualStyleBackColor = true; - this.createAssociationButton.Click += new System.EventHandler(this.createAssociationButton_Click); - // - // associationInfoLabel - // - this.associationInfoLabel.Location = new System.Drawing.Point(6, 21); - this.associationInfoLabel.Name = "associationInfoLabel"; - this.associationInfoLabel.Size = new System.Drawing.Size(525, 28); - this.associationInfoLabel.TabIndex = 0; - this.associationInfoLabel.Text = "RCNET files can be associated with ReClass.NET. When you double-click a RCNET fil" + + this.settingsTabControl = new System.Windows.Forms.TabControl(); + this.generalSettingsTabPage = new System.Windows.Forms.TabPage(); + this.fileAssociationGroupBox = new System.Windows.Forms.GroupBox(); + this.removeAssociationButton = new System.Windows.Forms.Button(); + this.createAssociationButton = new System.Windows.Forms.Button(); + this.associationInfoLabel = new System.Windows.Forms.Label(); + this.commentsGroupBox = new System.Windows.Forms.GroupBox(); + this.showPluginInfoCheckBox = new System.Windows.Forms.CheckBox(); + this.showStringCheckBox = new System.Windows.Forms.CheckBox(); + this.showSymbolsCheckBox = new System.Windows.Forms.CheckBox(); + this.showRttiCheckBox = new System.Windows.Forms.CheckBox(); + this.showPointerCheckBox = new System.Windows.Forms.CheckBox(); + this.showIntegerCheckBox = new System.Windows.Forms.CheckBox(); + this.showFloatCheckBox = new System.Windows.Forms.CheckBox(); + this.displayGroupBox = new System.Windows.Forms.GroupBox(); + this.randomizeWindowTitleCheckBox = new System.Windows.Forms.CheckBox(); + this.runAsAdminCheckBox = new System.Windows.Forms.CheckBox(); + this.highlightChangedValuesCheckBox = new System.Windows.Forms.CheckBox(); + this.showTextCheckBox = new System.Windows.Forms.CheckBox(); + this.showNodeOffsetCheckBox = new System.Windows.Forms.CheckBox(); + this.showNodeAddressCheckBox = new System.Windows.Forms.CheckBox(); + this.stayOnTopCheckBox = new System.Windows.Forms.CheckBox(); + this.colorsSettingTabPage = new System.Windows.Forms.TabPage(); + this.nodeColorGroupBox = new System.Windows.Forms.GroupBox(); + this.nodeValueLabel = new System.Windows.Forms.Label(); + this.nodePluginLabel = new System.Windows.Forms.Label(); + this.nodeHexValueColorBox = new ReClassNET.Controls.ColorBox(); + this.nodePluginColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeHexValueLabel = new System.Windows.Forms.Label(); + this.nodeVTableLabel = new System.Windows.Forms.Label(); + this.nodeOffsetColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeVTableColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeOffsetLabel = new System.Windows.Forms.Label(); + this.nodeTextLabel = new System.Windows.Forms.Label(); + this.nodeAddressColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeTextColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeAddressLabel = new System.Windows.Forms.Label(); + this.nodeCommentLabel = new System.Windows.Forms.Label(); + this.nodeHiddenColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeCommentColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeHiddenLabel = new System.Windows.Forms.Label(); + this.nodeIndexLabel = new System.Windows.Forms.Label(); + this.nodeSelectedColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeIndexColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeSelectedLabel = new System.Windows.Forms.Label(); + this.nodeTypeColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeValueColorBox = new ReClassNET.Controls.ColorBox(); + this.nodeTypeLabel = new System.Windows.Forms.Label(); + this.nodeNameLabel = new System.Windows.Forms.Label(); + this.nodeNameColorBox = new ReClassNET.Controls.ColorBox(); + this.backgroundLabel = new System.Windows.Forms.Label(); + this.backgroundColorBox = new ReClassNET.Controls.ColorBox(); + this.typeDefinitionsSettingsTabPage = new System.Windows.Forms.TabPage(); + this.nuintSettingsLabel = new System.Windows.Forms.Label(); + this.nuintTypeTextBox = new System.Windows.Forms.TextBox(); + this.nintSettingsLabel = new System.Windows.Forms.Label(); + this.nintTypeTextBox = new System.Windows.Forms.TextBox(); + this.boolSettingsLabel = new System.Windows.Forms.Label(); + this.boolTypeTextBox = new System.Windows.Forms.TextBox(); + this.generatorInfoLabel = new System.Windows.Forms.Label(); + this.functionPtrSettingsLabel = new System.Windows.Forms.Label(); + this.functionPtrTypeTextBox = new System.Windows.Forms.TextBox(); + this.utf16TextSettingsLabel = new System.Windows.Forms.Label(); + this.utf16TextTypeTextBox = new System.Windows.Forms.TextBox(); + this.utf8TextSettingsLabel = new System.Windows.Forms.Label(); + this.utf8TextTypeTextBox = new System.Windows.Forms.TextBox(); + this.matrix3x3SettingsLabel = new System.Windows.Forms.Label(); + this.matrix3x3TypeTextBox = new System.Windows.Forms.TextBox(); + this.matrix3x4SettingsLabel = new System.Windows.Forms.Label(); + this.matrix3x4TypeTextBox = new System.Windows.Forms.TextBox(); + this.matrix4x4SettingsLabel = new System.Windows.Forms.Label(); + this.matrix4x4TypeTextBox = new System.Windows.Forms.TextBox(); + this.vector2SettingsLabel = new System.Windows.Forms.Label(); + this.vector2TypeTextBox = new System.Windows.Forms.TextBox(); + this.vector3SettingsLabel = new System.Windows.Forms.Label(); + this.vector3TypeTextBox = new System.Windows.Forms.TextBox(); + this.vector4SettingsLabel = new System.Windows.Forms.Label(); + this.vector4TypeTextBox = new System.Windows.Forms.TextBox(); + this.doubleSettingsLabel = new System.Windows.Forms.Label(); + this.doubleTypeTextBox = new System.Windows.Forms.TextBox(); + this.floatSettingsLabel = new System.Windows.Forms.Label(); + this.floatTypeTextBox = new System.Windows.Forms.TextBox(); + this.uint64SettingsLabel = new System.Windows.Forms.Label(); + this.uint64TypeTextBox = new System.Windows.Forms.TextBox(); + this.uint32SettingsLabel = new System.Windows.Forms.Label(); + this.uint32TypeTextBox = new System.Windows.Forms.TextBox(); + this.uint16SettingsLabel = new System.Windows.Forms.Label(); + this.uint16TypeTextBox = new System.Windows.Forms.TextBox(); + this.uint8SettingsLabel = new System.Windows.Forms.Label(); + this.uint8TypeTextBox = new System.Windows.Forms.TextBox(); + this.int64SettingsLabel = new System.Windows.Forms.Label(); + this.int64TypeTextBox = new System.Windows.Forms.TextBox(); + this.int32SettingsLabel = new System.Windows.Forms.Label(); + this.int32TypeTextBox = new System.Windows.Forms.TextBox(); + this.int16SettingsLabel = new System.Windows.Forms.Label(); + this.int16TypeTextBox = new System.Windows.Forms.TextBox(); + this.int8SettingsLabel = new System.Windows.Forms.Label(); + this.int8TypeTextBox = new System.Windows.Forms.TextBox(); + this.bannerBox = new ReClassNET.Controls.BannerBox(); + this.utf32TextSettingsLabel = new System.Windows.Forms.Label(); + this.utf32TextTypeTextBox = new System.Windows.Forms.TextBox(); + this.settingsTabControl.SuspendLayout(); + this.generalSettingsTabPage.SuspendLayout(); + this.fileAssociationGroupBox.SuspendLayout(); + this.commentsGroupBox.SuspendLayout(); + this.displayGroupBox.SuspendLayout(); + this.colorsSettingTabPage.SuspendLayout(); + this.nodeColorGroupBox.SuspendLayout(); + this.typeDefinitionsSettingsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); + this.SuspendLayout(); + // + // settingsTabControl + // + this.settingsTabControl.Controls.Add(this.generalSettingsTabPage); + this.settingsTabControl.Controls.Add(this.colorsSettingTabPage); + this.settingsTabControl.Controls.Add(this.typeDefinitionsSettingsTabPage); + this.settingsTabControl.Location = new System.Drawing.Point(12, 60); + this.settingsTabControl.Name = "settingsTabControl"; + this.settingsTabControl.SelectedIndex = 0; + this.settingsTabControl.Size = new System.Drawing.Size(562, 355); + this.settingsTabControl.TabIndex = 1; + // + // generalSettingsTabPage + // + this.generalSettingsTabPage.Controls.Add(this.fileAssociationGroupBox); + this.generalSettingsTabPage.Controls.Add(this.commentsGroupBox); + this.generalSettingsTabPage.Controls.Add(this.displayGroupBox); + this.generalSettingsTabPage.Controls.Add(this.stayOnTopCheckBox); + this.generalSettingsTabPage.Location = new System.Drawing.Point(4, 22); + this.generalSettingsTabPage.Name = "generalSettingsTabPage"; + this.generalSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); + this.generalSettingsTabPage.Size = new System.Drawing.Size(554, 329); + this.generalSettingsTabPage.TabIndex = 0; + this.generalSettingsTabPage.Text = "General"; + this.generalSettingsTabPage.UseVisualStyleBackColor = true; + // + // fileAssociationGroupBox + // + this.fileAssociationGroupBox.Controls.Add(this.removeAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.createAssociationButton); + this.fileAssociationGroupBox.Controls.Add(this.associationInfoLabel); + this.fileAssociationGroupBox.Location = new System.Drawing.Point(6, 231); + this.fileAssociationGroupBox.Name = "fileAssociationGroupBox"; + this.fileAssociationGroupBox.Size = new System.Drawing.Size(542, 85); + this.fileAssociationGroupBox.TabIndex = 4; + this.fileAssociationGroupBox.TabStop = false; + this.fileAssociationGroupBox.Text = "RCNET File Association"; + // + // removeAssociationButton + // + this.removeAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.removeAssociationButton.Location = new System.Drawing.Point(146, 52); + this.removeAssociationButton.Name = "removeAssociationButton"; + this.removeAssociationButton.Size = new System.Drawing.Size(135, 23); + this.removeAssociationButton.TabIndex = 2; + this.removeAssociationButton.Text = "&Remove Association"; + this.removeAssociationButton.UseVisualStyleBackColor = true; + this.removeAssociationButton.Click += new System.EventHandler(this.removeAssociationButton_Click); + // + // createAssociationButton + // + this.createAssociationButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.createAssociationButton.Location = new System.Drawing.Point(9, 52); + this.createAssociationButton.Name = "createAssociationButton"; + this.createAssociationButton.Size = new System.Drawing.Size(131, 23); + this.createAssociationButton.TabIndex = 1; + this.createAssociationButton.Text = "Create &Association"; + this.createAssociationButton.UseVisualStyleBackColor = true; + this.createAssociationButton.Click += new System.EventHandler(this.createAssociationButton_Click); + // + // associationInfoLabel + // + this.associationInfoLabel.Location = new System.Drawing.Point(6, 21); + this.associationInfoLabel.Name = "associationInfoLabel"; + this.associationInfoLabel.Size = new System.Drawing.Size(525, 28); + this.associationInfoLabel.TabIndex = 0; + this.associationInfoLabel.Text = "RCNET files can be associated with ReClass.NET. When you double-click a RCNET fil" + "e, they will automatically be opened by ReClass.NET."; - // - // commentsGroupBox - // - this.commentsGroupBox.Controls.Add(this.showPluginInfoCheckBox); - this.commentsGroupBox.Controls.Add(this.showStringCheckBox); - this.commentsGroupBox.Controls.Add(this.showSymbolsCheckBox); - this.commentsGroupBox.Controls.Add(this.showRttiCheckBox); - this.commentsGroupBox.Controls.Add(this.showPointerCheckBox); - this.commentsGroupBox.Controls.Add(this.showIntegerCheckBox); - this.commentsGroupBox.Controls.Add(this.showFloatCheckBox); - this.commentsGroupBox.Location = new System.Drawing.Point(6, 39); - this.commentsGroupBox.Name = "commentsGroupBox"; - this.commentsGroupBox.Size = new System.Drawing.Size(265, 186); - this.commentsGroupBox.TabIndex = 3; - this.commentsGroupBox.TabStop = false; - this.commentsGroupBox.Text = "Node Comments"; - // - // showPluginInfoCheckBox - // - this.showPluginInfoCheckBox.AutoSize = true; - this.showPluginInfoCheckBox.Location = new System.Drawing.Point(6, 157); - this.showPluginInfoCheckBox.Name = "showPluginInfoCheckBox"; - this.showPluginInfoCheckBox.Size = new System.Drawing.Size(111, 17); - this.showPluginInfoCheckBox.TabIndex = 6; - this.showPluginInfoCheckBox.Text = "Show Plugin Infos"; - this.showPluginInfoCheckBox.UseVisualStyleBackColor = true; - // - // showStringCheckBox - // - this.showStringCheckBox.AutoSize = true; - this.showStringCheckBox.Location = new System.Drawing.Point(6, 134); - this.showStringCheckBox.Name = "showStringCheckBox"; - this.showStringCheckBox.Size = new System.Drawing.Size(88, 17); - this.showStringCheckBox.TabIndex = 5; - this.showStringCheckBox.Text = "Show Strings"; - this.showStringCheckBox.UseVisualStyleBackColor = true; - // - // showSymbolsCheckBox - // - this.showSymbolsCheckBox.AutoSize = true; - this.showSymbolsCheckBox.Location = new System.Drawing.Point(6, 111); - this.showSymbolsCheckBox.Name = "showSymbolsCheckBox"; - this.showSymbolsCheckBox.Size = new System.Drawing.Size(130, 17); - this.showSymbolsCheckBox.TabIndex = 4; - this.showSymbolsCheckBox.Text = "Show Debug Symbols"; - this.showSymbolsCheckBox.UseVisualStyleBackColor = true; - // - // showRttiCheckBox - // - this.showRttiCheckBox.AutoSize = true; - this.showRttiCheckBox.Location = new System.Drawing.Point(6, 88); - this.showRttiCheckBox.Name = "showRttiCheckBox"; - this.showRttiCheckBox.Size = new System.Drawing.Size(81, 17); - this.showRttiCheckBox.TabIndex = 3; - this.showRttiCheckBox.Text = "Show RTTI"; - this.showRttiCheckBox.UseVisualStyleBackColor = true; - // - // showPointerCheckBox - // - this.showPointerCheckBox.AutoSize = true; - this.showPointerCheckBox.Location = new System.Drawing.Point(6, 65); - this.showPointerCheckBox.Name = "showPointerCheckBox"; - this.showPointerCheckBox.Size = new System.Drawing.Size(94, 17); - this.showPointerCheckBox.TabIndex = 2; - this.showPointerCheckBox.Text = "Show Pointers"; - this.showPointerCheckBox.UseVisualStyleBackColor = true; - // - // showIntegerCheckBox - // - this.showIntegerCheckBox.AutoSize = true; - this.showIntegerCheckBox.Location = new System.Drawing.Point(6, 42); - this.showIntegerCheckBox.Name = "showIntegerCheckBox"; - this.showIntegerCheckBox.Size = new System.Drawing.Size(124, 17); - this.showIntegerCheckBox.TabIndex = 1; - this.showIntegerCheckBox.Text = "Show Integer Values"; - this.showIntegerCheckBox.UseVisualStyleBackColor = true; - // - // showFloatCheckBox - // - this.showFloatCheckBox.AutoSize = true; - this.showFloatCheckBox.Location = new System.Drawing.Point(6, 19); - this.showFloatCheckBox.Name = "showFloatCheckBox"; - this.showFloatCheckBox.Size = new System.Drawing.Size(114, 17); - this.showFloatCheckBox.TabIndex = 0; - this.showFloatCheckBox.Text = "Show Float Values"; - this.showFloatCheckBox.UseVisualStyleBackColor = true; - // - // displayGroupBox - // - this.displayGroupBox.Controls.Add(this.randomizeWindowTitleCheckBox); - this.displayGroupBox.Controls.Add(this.runAsAdminCheckBox); - this.displayGroupBox.Controls.Add(this.highlightChangedValuesCheckBox); - this.displayGroupBox.Controls.Add(this.showTextCheckBox); - this.displayGroupBox.Controls.Add(this.showNodeOffsetCheckBox); - this.displayGroupBox.Controls.Add(this.showNodeAddressCheckBox); - this.displayGroupBox.Location = new System.Drawing.Point(283, 39); - this.displayGroupBox.Name = "displayGroupBox"; - this.displayGroupBox.Size = new System.Drawing.Size(265, 160); - this.displayGroupBox.TabIndex = 2; - this.displayGroupBox.TabStop = false; - this.displayGroupBox.Text = "Display"; - // - // randomizeWindowTitleCheckBox - // - this.randomizeWindowTitleCheckBox.AutoSize = true; - this.randomizeWindowTitleCheckBox.Location = new System.Drawing.Point(6, 134); - this.randomizeWindowTitleCheckBox.Name = "randomizeWindowTitleCheckBox"; - this.randomizeWindowTitleCheckBox.Size = new System.Drawing.Size(137, 17); - this.randomizeWindowTitleCheckBox.TabIndex = 5; - this.randomizeWindowTitleCheckBox.Text = "Randomize window title"; - this.randomizeWindowTitleCheckBox.UseVisualStyleBackColor = true; - // - // runAsAdminCheckBox - // - this.runAsAdminCheckBox.AutoSize = true; - this.runAsAdminCheckBox.Location = new System.Drawing.Point(6, 111); - this.runAsAdminCheckBox.Name = "runAsAdminCheckBox"; - this.runAsAdminCheckBox.Size = new System.Drawing.Size(200, 17); - this.runAsAdminCheckBox.TabIndex = 4; - this.runAsAdminCheckBox.Text = "Run as administrator (requires restart)"; - this.runAsAdminCheckBox.UseVisualStyleBackColor = true; - // - // highlightChangedValuesCheckBox - // - this.highlightChangedValuesCheckBox.AutoSize = true; - this.highlightChangedValuesCheckBox.Location = new System.Drawing.Point(6, 88); - this.highlightChangedValuesCheckBox.Name = "highlightChangedValuesCheckBox"; - this.highlightChangedValuesCheckBox.Size = new System.Drawing.Size(148, 17); - this.highlightChangedValuesCheckBox.TabIndex = 3; - this.highlightChangedValuesCheckBox.Text = "Highlight Changed Values"; - this.highlightChangedValuesCheckBox.UseVisualStyleBackColor = true; - // - // showTextCheckBox - // - this.showTextCheckBox.AutoSize = true; - this.showTextCheckBox.Location = new System.Drawing.Point(6, 65); - this.showTextCheckBox.Name = "showTextCheckBox"; - this.showTextCheckBox.Size = new System.Drawing.Size(166, 17); - this.showTextCheckBox.TabIndex = 2; - this.showTextCheckBox.Text = "Show Textual Representation"; - this.showTextCheckBox.UseVisualStyleBackColor = true; - // - // showNodeOffsetCheckBox - // - this.showNodeOffsetCheckBox.AutoSize = true; - this.showNodeOffsetCheckBox.Location = new System.Drawing.Point(6, 42); - this.showNodeOffsetCheckBox.Name = "showNodeOffsetCheckBox"; - this.showNodeOffsetCheckBox.Size = new System.Drawing.Size(113, 17); - this.showNodeOffsetCheckBox.TabIndex = 1; - this.showNodeOffsetCheckBox.Text = "Show Node Offset"; - this.showNodeOffsetCheckBox.UseVisualStyleBackColor = true; - // - // showNodeAddressCheckBox - // - this.showNodeAddressCheckBox.AutoSize = true; - this.showNodeAddressCheckBox.Location = new System.Drawing.Point(6, 19); - this.showNodeAddressCheckBox.Name = "showNodeAddressCheckBox"; - this.showNodeAddressCheckBox.Size = new System.Drawing.Size(123, 17); - this.showNodeAddressCheckBox.TabIndex = 0; - this.showNodeAddressCheckBox.Text = "Show Node Address"; - this.showNodeAddressCheckBox.UseVisualStyleBackColor = true; - // - // stayOnTopCheckBox - // - this.stayOnTopCheckBox.AutoSize = true; - this.stayOnTopCheckBox.Location = new System.Drawing.Point(6, 6); - this.stayOnTopCheckBox.Name = "stayOnTopCheckBox"; - this.stayOnTopCheckBox.Size = new System.Drawing.Size(187, 17); - this.stayOnTopCheckBox.TabIndex = 1; - this.stayOnTopCheckBox.Text = "Force ReClass.NET to stay on top"; - this.stayOnTopCheckBox.UseVisualStyleBackColor = true; - // - // colorsSettingTabPage - // - this.colorsSettingTabPage.Controls.Add(this.nodeColorGroupBox); - this.colorsSettingTabPage.Controls.Add(this.backgroundLabel); - this.colorsSettingTabPage.Controls.Add(this.backgroundColorBox); - this.colorsSettingTabPage.Location = new System.Drawing.Point(4, 22); - this.colorsSettingTabPage.Name = "colorsSettingTabPage"; - this.colorsSettingTabPage.Padding = new System.Windows.Forms.Padding(3); - this.colorsSettingTabPage.Size = new System.Drawing.Size(554, 329); - this.colorsSettingTabPage.TabIndex = 1; - this.colorsSettingTabPage.Text = "Colors"; - this.colorsSettingTabPage.UseVisualStyleBackColor = true; - // - // nodeColorGroupBox - // - this.nodeColorGroupBox.Controls.Add(this.nodeValueLabel); - this.nodeColorGroupBox.Controls.Add(this.nodePluginLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeHexValueColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodePluginColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeHexValueLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeVTableLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeOffsetColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeVTableColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeOffsetLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeTextLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeAddressColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeTextColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeAddressLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeCommentLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeHiddenColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeCommentColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeHiddenLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeIndexLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeSelectedColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeIndexColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeSelectedLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeTypeColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeValueColorBox); - this.nodeColorGroupBox.Controls.Add(this.nodeTypeLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeNameLabel); - this.nodeColorGroupBox.Controls.Add(this.nodeNameColorBox); - this.nodeColorGroupBox.Location = new System.Drawing.Point(9, 43); - this.nodeColorGroupBox.Name = "nodeColorGroupBox"; - this.nodeColorGroupBox.Size = new System.Drawing.Size(539, 225); - this.nodeColorGroupBox.TabIndex = 28; - this.nodeColorGroupBox.TabStop = false; - this.nodeColorGroupBox.Text = "Node Colors"; - // - // nodeValueLabel - // - this.nodeValueLabel.AutoSize = true; - this.nodeValueLabel.Location = new System.Drawing.Point(9, 198); - this.nodeValueLabel.Name = "nodeValueLabel"; - this.nodeValueLabel.Size = new System.Drawing.Size(64, 13); - this.nodeValueLabel.TabIndex = 17; - this.nodeValueLabel.Text = "Value Color:"; - // - // nodePluginLabel - // - this.nodePluginLabel.AutoSize = true; - this.nodePluginLabel.Location = new System.Drawing.Point(286, 172); - this.nodePluginLabel.Name = "nodePluginLabel"; - this.nodePluginLabel.Size = new System.Drawing.Size(87, 13); - this.nodePluginLabel.TabIndex = 27; - this.nodePluginLabel.Text = "Plugin Info Color:"; - // - // nodeHexValueColorBox - // - this.nodeHexValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeHexValueColorBox.Location = new System.Drawing.Point(133, 117); - this.nodeHexValueColorBox.Name = "nodeHexValueColorBox"; - this.nodeHexValueColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeHexValueColorBox.TabIndex = 2; - // - // nodePluginColorBox - // - this.nodePluginColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodePluginColorBox.Location = new System.Drawing.Point(410, 169); - this.nodePluginColorBox.Name = "nodePluginColorBox"; - this.nodePluginColorBox.Size = new System.Drawing.Size(123, 20); - this.nodePluginColorBox.TabIndex = 26; - // - // nodeHexValueLabel - // - this.nodeHexValueLabel.AutoSize = true; - this.nodeHexValueLabel.Location = new System.Drawing.Point(9, 120); - this.nodeHexValueLabel.Name = "nodeHexValueLabel"; - this.nodeHexValueLabel.Size = new System.Drawing.Size(86, 13); - this.nodeHexValueLabel.TabIndex = 3; - this.nodeHexValueLabel.Text = "Hex Value Color:"; - // - // nodeVTableLabel - // - this.nodeVTableLabel.AutoSize = true; - this.nodeVTableLabel.Location = new System.Drawing.Point(286, 94); - this.nodeVTableLabel.Name = "nodeVTableLabel"; - this.nodeVTableLabel.Size = new System.Drawing.Size(71, 13); - this.nodeVTableLabel.TabIndex = 25; - this.nodeVTableLabel.Text = "VTable Color:"; - // - // nodeOffsetColorBox - // - this.nodeOffsetColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeOffsetColorBox.Location = new System.Drawing.Point(133, 91); - this.nodeOffsetColorBox.Name = "nodeOffsetColorBox"; - this.nodeOffsetColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeOffsetColorBox.TabIndex = 4; - // - // nodeVTableColorBox - // - this.nodeVTableColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeVTableColorBox.Location = new System.Drawing.Point(410, 91); - this.nodeVTableColorBox.Name = "nodeVTableColorBox"; - this.nodeVTableColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeVTableColorBox.TabIndex = 24; - // - // nodeOffsetLabel - // - this.nodeOffsetLabel.AutoSize = true; - this.nodeOffsetLabel.Location = new System.Drawing.Point(9, 94); - this.nodeOffsetLabel.Name = "nodeOffsetLabel"; - this.nodeOffsetLabel.Size = new System.Drawing.Size(65, 13); - this.nodeOffsetLabel.TabIndex = 5; - this.nodeOffsetLabel.Text = "Offset Color:"; - // - // nodeTextLabel - // - this.nodeTextLabel.AutoSize = true; - this.nodeTextLabel.Location = new System.Drawing.Point(286, 146); - this.nodeTextLabel.Name = "nodeTextLabel"; - this.nodeTextLabel.Size = new System.Drawing.Size(58, 13); - this.nodeTextLabel.TabIndex = 23; - this.nodeTextLabel.Text = "Text Color:"; - // - // nodeAddressColorBox - // - this.nodeAddressColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeAddressColorBox.Location = new System.Drawing.Point(133, 65); - this.nodeAddressColorBox.Name = "nodeAddressColorBox"; - this.nodeAddressColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeAddressColorBox.TabIndex = 6; - // - // nodeTextColorBox - // - this.nodeTextColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeTextColorBox.Location = new System.Drawing.Point(410, 143); - this.nodeTextColorBox.Name = "nodeTextColorBox"; - this.nodeTextColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeTextColorBox.TabIndex = 22; - // - // nodeAddressLabel - // - this.nodeAddressLabel.AutoSize = true; - this.nodeAddressLabel.Location = new System.Drawing.Point(9, 68); - this.nodeAddressLabel.Name = "nodeAddressLabel"; - this.nodeAddressLabel.Size = new System.Drawing.Size(75, 13); - this.nodeAddressLabel.TabIndex = 7; - this.nodeAddressLabel.Text = "Address Color:"; - // - // nodeCommentLabel - // - this.nodeCommentLabel.AutoSize = true; - this.nodeCommentLabel.Location = new System.Drawing.Point(286, 120); - this.nodeCommentLabel.Name = "nodeCommentLabel"; - this.nodeCommentLabel.Size = new System.Drawing.Size(81, 13); - this.nodeCommentLabel.TabIndex = 21; - this.nodeCommentLabel.Text = "Comment Color:"; - // - // nodeHiddenColorBox - // - this.nodeHiddenColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeHiddenColorBox.Location = new System.Drawing.Point(410, 18); - this.nodeHiddenColorBox.Name = "nodeHiddenColorBox"; - this.nodeHiddenColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeHiddenColorBox.TabIndex = 8; - // - // nodeCommentColorBox - // - this.nodeCommentColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeCommentColorBox.Location = new System.Drawing.Point(410, 117); - this.nodeCommentColorBox.Name = "nodeCommentColorBox"; - this.nodeCommentColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeCommentColorBox.TabIndex = 20; - // - // nodeHiddenLabel - // - this.nodeHiddenLabel.AutoSize = true; - this.nodeHiddenLabel.Location = new System.Drawing.Point(286, 21); - this.nodeHiddenLabel.Name = "nodeHiddenLabel"; - this.nodeHiddenLabel.Size = new System.Drawing.Size(71, 13); - this.nodeHiddenLabel.TabIndex = 9; - this.nodeHiddenLabel.Text = "Hidden Color:"; - // - // nodeIndexLabel - // - this.nodeIndexLabel.AutoSize = true; - this.nodeIndexLabel.Location = new System.Drawing.Point(286, 68); - this.nodeIndexLabel.Name = "nodeIndexLabel"; - this.nodeIndexLabel.Size = new System.Drawing.Size(63, 13); - this.nodeIndexLabel.TabIndex = 19; - this.nodeIndexLabel.Text = "Index Color:"; - // - // nodeSelectedColorBox - // - this.nodeSelectedColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeSelectedColorBox.Location = new System.Drawing.Point(133, 18); - this.nodeSelectedColorBox.Name = "nodeSelectedColorBox"; - this.nodeSelectedColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeSelectedColorBox.TabIndex = 10; - // - // nodeIndexColorBox - // - this.nodeIndexColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeIndexColorBox.Location = new System.Drawing.Point(410, 65); - this.nodeIndexColorBox.Name = "nodeIndexColorBox"; - this.nodeIndexColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeIndexColorBox.TabIndex = 18; - // - // nodeSelectedLabel - // - this.nodeSelectedLabel.AutoSize = true; - this.nodeSelectedLabel.Location = new System.Drawing.Point(9, 21); - this.nodeSelectedLabel.Name = "nodeSelectedLabel"; - this.nodeSelectedLabel.Size = new System.Drawing.Size(79, 13); - this.nodeSelectedLabel.TabIndex = 11; - this.nodeSelectedLabel.Text = "Selected Color:"; - // - // nodeTypeColorBox - // - this.nodeTypeColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeTypeColorBox.Location = new System.Drawing.Point(133, 143); - this.nodeTypeColorBox.Name = "nodeTypeColorBox"; - this.nodeTypeColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeTypeColorBox.TabIndex = 12; - // - // nodeValueColorBox - // - this.nodeValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeValueColorBox.Location = new System.Drawing.Point(133, 195); - this.nodeValueColorBox.Name = "nodeValueColorBox"; - this.nodeValueColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeValueColorBox.TabIndex = 16; - // - // nodeTypeLabel - // - this.nodeTypeLabel.AutoSize = true; - this.nodeTypeLabel.Location = new System.Drawing.Point(9, 146); - this.nodeTypeLabel.Name = "nodeTypeLabel"; - this.nodeTypeLabel.Size = new System.Drawing.Size(61, 13); - this.nodeTypeLabel.TabIndex = 13; - this.nodeTypeLabel.Text = "Type Color:"; - // - // nodeNameLabel - // - this.nodeNameLabel.AutoSize = true; - this.nodeNameLabel.Location = new System.Drawing.Point(9, 172); - this.nodeNameLabel.Name = "nodeNameLabel"; - this.nodeNameLabel.Size = new System.Drawing.Size(65, 13); - this.nodeNameLabel.TabIndex = 15; - this.nodeNameLabel.Text = "Name Color:"; - // - // nodeNameColorBox - // - this.nodeNameColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.nodeNameColorBox.Location = new System.Drawing.Point(133, 169); - this.nodeNameColorBox.Name = "nodeNameColorBox"; - this.nodeNameColorBox.Size = new System.Drawing.Size(123, 20); - this.nodeNameColorBox.TabIndex = 14; - // - // backgroundLabel - // - this.backgroundLabel.AutoSize = true; - this.backgroundLabel.Location = new System.Drawing.Point(6, 14); - this.backgroundLabel.Name = "backgroundLabel"; - this.backgroundLabel.Size = new System.Drawing.Size(161, 13); - this.backgroundLabel.TabIndex = 1; - this.backgroundLabel.Text = "Memory View Background Color:"; - // - // backgroundColorBox - // - this.backgroundColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.backgroundColorBox.Location = new System.Drawing.Point(175, 11); - this.backgroundColorBox.Name = "backgroundColorBox"; - this.backgroundColorBox.Size = new System.Drawing.Size(123, 20); - this.backgroundColorBox.TabIndex = 0; - // - // typeDefinitionsSettingsTabPage - // - this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.label1); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatTypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16TypeTextBox); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsLabel); - this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8TypeTextBox); - this.typeDefinitionsSettingsTabPage.Location = new System.Drawing.Point(4, 22); - this.typeDefinitionsSettingsTabPage.Name = "typeDefinitionsSettingsTabPage"; - this.typeDefinitionsSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); - this.typeDefinitionsSettingsTabPage.Size = new System.Drawing.Size(554, 329); - this.typeDefinitionsSettingsTabPage.TabIndex = 2; - this.typeDefinitionsSettingsTabPage.Text = "Type Definitions"; - this.typeDefinitionsSettingsTabPage.UseVisualStyleBackColor = true; - // - // boolSettingsLabel - // - this.boolSettingsLabel.AutoSize = true; - this.boolSettingsLabel.Location = new System.Drawing.Point(254, 35); - this.boolSettingsLabel.Name = "boolSettingsLabel"; - this.boolSettingsLabel.Size = new System.Drawing.Size(31, 13); - this.boolSettingsLabel.TabIndex = 46; - this.boolSettingsLabel.Text = "Bool:"; - // - // boolTypeTextBox - // - this.boolTypeTextBox.Location = new System.Drawing.Point(346, 32); - this.boolTypeTextBox.Name = "boolTypeTextBox"; - this.boolTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.boolTypeTextBox.TabIndex = 45; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(6, 6); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(214, 13); - this.label1.TabIndex = 44; - this.label1.Text = "These types are used to generate the code:"; - // - // functionPtrSettingsLabel - // - this.functionPtrSettingsLabel.AutoSize = true; - this.functionPtrSettingsLabel.Location = new System.Drawing.Point(254, 233); - this.functionPtrSettingsLabel.Name = "functionPtrSettingsLabel"; - this.functionPtrSettingsLabel.Size = new System.Drawing.Size(87, 13); - this.functionPtrSettingsLabel.TabIndex = 43; - this.functionPtrSettingsLabel.Text = "Function Pointer:"; - // - // functionPtrTypeTextBox - // - this.functionPtrTypeTextBox.Location = new System.Drawing.Point(346, 230); - this.functionPtrTypeTextBox.Name = "functionPtrTypeTextBox"; - this.functionPtrTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.functionPtrTypeTextBox.TabIndex = 42; - // - // utf16TextSettingsLabel - // - this.utf16TextSettingsLabel.AutoSize = true; - this.utf16TextSettingsLabel.Location = new System.Drawing.Point(254, 211); - this.utf16TextSettingsLabel.Name = "utf16TextSettingsLabel"; - this.utf16TextSettingsLabel.Size = new System.Drawing.Size(43, 13); - this.utf16TextSettingsLabel.TabIndex = 39; - this.utf16TextSettingsLabel.Text = "UTF16:"; - // - // utf16TextTypeTextBox - // - this.utf16TextTypeTextBox.Location = new System.Drawing.Point(346, 208); - this.utf16TextTypeTextBox.Name = "utf16TextTypeTextBox"; - this.utf16TextTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.utf16TextTypeTextBox.TabIndex = 38; - // - // utf8TextSettingsLabel - // - this.utf8TextSettingsLabel.AutoSize = true; - this.utf8TextSettingsLabel.Location = new System.Drawing.Point(254, 189); - this.utf8TextSettingsLabel.Name = "utf8TextSettingsLabel"; - this.utf8TextSettingsLabel.Size = new System.Drawing.Size(37, 13); - this.utf8TextSettingsLabel.TabIndex = 35; - this.utf8TextSettingsLabel.Text = "UTF8:"; - // - // utf8TextTypeTextBox - // - this.utf8TextTypeTextBox.Location = new System.Drawing.Point(346, 186); - this.utf8TextTypeTextBox.Name = "utf8TextTypeTextBox"; - this.utf8TextTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.utf8TextTypeTextBox.TabIndex = 34; - // - // matrix3x3SettingsLabel - // - this.matrix3x3SettingsLabel.AutoSize = true; - this.matrix3x3SettingsLabel.Location = new System.Drawing.Point(254, 123); - this.matrix3x3SettingsLabel.Name = "matrix3x3SettingsLabel"; - this.matrix3x3SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix3x3SettingsLabel.TabIndex = 33; - this.matrix3x3SettingsLabel.Text = "Matrix (3x3):"; - // - // matrix3x3TypeTextBox - // - this.matrix3x3TypeTextBox.Location = new System.Drawing.Point(346, 120); - this.matrix3x3TypeTextBox.Name = "matrix3x3TypeTextBox"; - this.matrix3x3TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix3x3TypeTextBox.TabIndex = 32; - // - // matrix3x4SettingsLabel - // - this.matrix3x4SettingsLabel.AutoSize = true; - this.matrix3x4SettingsLabel.Location = new System.Drawing.Point(254, 145); - this.matrix3x4SettingsLabel.Name = "matrix3x4SettingsLabel"; - this.matrix3x4SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix3x4SettingsLabel.TabIndex = 31; - this.matrix3x4SettingsLabel.Text = "Matrix (3x4):"; - // - // matrix3x4TypeTextBox - // - this.matrix3x4TypeTextBox.Location = new System.Drawing.Point(346, 142); - this.matrix3x4TypeTextBox.Name = "matrix3x4TypeTextBox"; - this.matrix3x4TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix3x4TypeTextBox.TabIndex = 30; - // - // matrix4x4SettingsLabel - // - this.matrix4x4SettingsLabel.AutoSize = true; - this.matrix4x4SettingsLabel.Location = new System.Drawing.Point(254, 167); - this.matrix4x4SettingsLabel.Name = "matrix4x4SettingsLabel"; - this.matrix4x4SettingsLabel.Size = new System.Drawing.Size(64, 13); - this.matrix4x4SettingsLabel.TabIndex = 29; - this.matrix4x4SettingsLabel.Text = "Matrix (4x4):"; - // - // matrix4x4TypeTextBox - // - this.matrix4x4TypeTextBox.Location = new System.Drawing.Point(346, 164); - this.matrix4x4TypeTextBox.Name = "matrix4x4TypeTextBox"; - this.matrix4x4TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.matrix4x4TypeTextBox.TabIndex = 28; - // - // vector2SettingsLabel - // - this.vector2SettingsLabel.AutoSize = true; - this.vector2SettingsLabel.Location = new System.Drawing.Point(254, 57); - this.vector2SettingsLabel.Name = "vector2SettingsLabel"; - this.vector2SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector2SettingsLabel.TabIndex = 27; - this.vector2SettingsLabel.Text = "Vector2:"; - // - // vector2TypeTextBox - // - this.vector2TypeTextBox.Location = new System.Drawing.Point(346, 54); - this.vector2TypeTextBox.Name = "vector2TypeTextBox"; - this.vector2TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.vector2TypeTextBox.TabIndex = 26; - // - // vector3SettingsLabel - // - this.vector3SettingsLabel.AutoSize = true; - this.vector3SettingsLabel.Location = new System.Drawing.Point(254, 79); - this.vector3SettingsLabel.Name = "vector3SettingsLabel"; - this.vector3SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector3SettingsLabel.TabIndex = 25; - this.vector3SettingsLabel.Text = "Vector3:"; - // - // vector3TypeTextBox - // - this.vector3TypeTextBox.Location = new System.Drawing.Point(346, 76); - this.vector3TypeTextBox.Name = "vector3TypeTextBox"; - this.vector3TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.vector3TypeTextBox.TabIndex = 24; - // - // vector4SettingsLabel - // - this.vector4SettingsLabel.AutoSize = true; - this.vector4SettingsLabel.Location = new System.Drawing.Point(254, 101); - this.vector4SettingsLabel.Name = "vector4SettingsLabel"; - this.vector4SettingsLabel.Size = new System.Drawing.Size(47, 13); - this.vector4SettingsLabel.TabIndex = 23; - this.vector4SettingsLabel.Text = "Vector4:"; - // - // vector4TypeTextBox - // - this.vector4TypeTextBox.Location = new System.Drawing.Point(346, 98); - this.vector4TypeTextBox.Name = "vector4TypeTextBox"; - this.vector4TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.vector4TypeTextBox.TabIndex = 22; - // - // doubleSettingsLabel - // - this.doubleSettingsLabel.AutoSize = true; - this.doubleSettingsLabel.Location = new System.Drawing.Point(6, 233); - this.doubleSettingsLabel.Name = "doubleSettingsLabel"; - this.doubleSettingsLabel.Size = new System.Drawing.Size(44, 13); - this.doubleSettingsLabel.TabIndex = 21; - this.doubleSettingsLabel.Text = "Double:"; - // - // doubleTypeTextBox - // - this.doubleTypeTextBox.Location = new System.Drawing.Point(98, 230); - this.doubleTypeTextBox.Name = "doubleTypeTextBox"; - this.doubleTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.doubleTypeTextBox.TabIndex = 20; - // - // floatSettingsLabel - // - this.floatSettingsLabel.AutoSize = true; - this.floatSettingsLabel.Location = new System.Drawing.Point(6, 211); - this.floatSettingsLabel.Name = "floatSettingsLabel"; - this.floatSettingsLabel.Size = new System.Drawing.Size(33, 13); - this.floatSettingsLabel.TabIndex = 19; - this.floatSettingsLabel.Text = "Float:"; - // - // floatTypeTextBox - // - this.floatTypeTextBox.Location = new System.Drawing.Point(98, 208); - this.floatTypeTextBox.Name = "floatTypeTextBox"; - this.floatTypeTextBox.Size = new System.Drawing.Size(120, 20); - this.floatTypeTextBox.TabIndex = 18; - // - // uint64SettingsLabel - // - this.uint64SettingsLabel.AutoSize = true; - this.uint64SettingsLabel.Location = new System.Drawing.Point(6, 189); - this.uint64SettingsLabel.Name = "uint64SettingsLabel"; - this.uint64SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint64SettingsLabel.TabIndex = 17; - this.uint64SettingsLabel.Text = "UInt64:"; - // - // uint64TypeTextBox - // - this.uint64TypeTextBox.Location = new System.Drawing.Point(98, 186); - this.uint64TypeTextBox.Name = "uint64TypeTextBox"; - this.uint64TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.uint64TypeTextBox.TabIndex = 16; - // - // uint32SettingsLabel - // - this.uint32SettingsLabel.AutoSize = true; - this.uint32SettingsLabel.Location = new System.Drawing.Point(6, 167); - this.uint32SettingsLabel.Name = "uint32SettingsLabel"; - this.uint32SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint32SettingsLabel.TabIndex = 15; - this.uint32SettingsLabel.Text = "UInt32:"; - // - // uint32TypeTextBox - // - this.uint32TypeTextBox.Location = new System.Drawing.Point(98, 164); - this.uint32TypeTextBox.Name = "uint32TypeTextBox"; - this.uint32TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.uint32TypeTextBox.TabIndex = 14; - // - // uint16SettingsLabel - // - this.uint16SettingsLabel.AutoSize = true; - this.uint16SettingsLabel.Location = new System.Drawing.Point(6, 145); - this.uint16SettingsLabel.Name = "uint16SettingsLabel"; - this.uint16SettingsLabel.Size = new System.Drawing.Size(42, 13); - this.uint16SettingsLabel.TabIndex = 13; - this.uint16SettingsLabel.Text = "UInt16:"; - // - // uint16TypeTextBox - // - this.uint16TypeTextBox.Location = new System.Drawing.Point(98, 142); - this.uint16TypeTextBox.Name = "uint16TypeTextBox"; - this.uint16TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.uint16TypeTextBox.TabIndex = 12; - // - // uint8SettingsLabel - // - this.uint8SettingsLabel.AutoSize = true; - this.uint8SettingsLabel.Location = new System.Drawing.Point(6, 123); - this.uint8SettingsLabel.Name = "uint8SettingsLabel"; - this.uint8SettingsLabel.Size = new System.Drawing.Size(36, 13); - this.uint8SettingsLabel.TabIndex = 11; - this.uint8SettingsLabel.Text = "UInt8:"; - // - // uint8TypeTextBox - // - this.uint8TypeTextBox.Location = new System.Drawing.Point(98, 120); - this.uint8TypeTextBox.Name = "uint8TypeTextBox"; - this.uint8TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.uint8TypeTextBox.TabIndex = 10; - // - // int64SettingsLabel - // - this.int64SettingsLabel.AutoSize = true; - this.int64SettingsLabel.Location = new System.Drawing.Point(6, 101); - this.int64SettingsLabel.Name = "int64SettingsLabel"; - this.int64SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int64SettingsLabel.TabIndex = 9; - this.int64SettingsLabel.Text = "Int64:"; - // - // int64TypeTextBox - // - this.int64TypeTextBox.Location = new System.Drawing.Point(98, 98); - this.int64TypeTextBox.Name = "int64TypeTextBox"; - this.int64TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.int64TypeTextBox.TabIndex = 8; - // - // int32SettingsLabel - // - this.int32SettingsLabel.AutoSize = true; - this.int32SettingsLabel.Location = new System.Drawing.Point(6, 79); - this.int32SettingsLabel.Name = "int32SettingsLabel"; - this.int32SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int32SettingsLabel.TabIndex = 7; - this.int32SettingsLabel.Text = "Int32:"; - // - // int32TypeTextBox - // - this.int32TypeTextBox.Location = new System.Drawing.Point(98, 76); - this.int32TypeTextBox.Name = "int32TypeTextBox"; - this.int32TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.int32TypeTextBox.TabIndex = 6; - // - // int16SettingsLabel - // - this.int16SettingsLabel.AutoSize = true; - this.int16SettingsLabel.Location = new System.Drawing.Point(6, 57); - this.int16SettingsLabel.Name = "int16SettingsLabel"; - this.int16SettingsLabel.Size = new System.Drawing.Size(34, 13); - this.int16SettingsLabel.TabIndex = 5; - this.int16SettingsLabel.Text = "Int16:"; - // - // int16TypeTextBox - // - this.int16TypeTextBox.Location = new System.Drawing.Point(98, 54); - this.int16TypeTextBox.Name = "int16TypeTextBox"; - this.int16TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.int16TypeTextBox.TabIndex = 4; - // - // int8SettingsLabel - // - this.int8SettingsLabel.AutoSize = true; - this.int8SettingsLabel.Location = new System.Drawing.Point(6, 35); - this.int8SettingsLabel.Name = "int8SettingsLabel"; - this.int8SettingsLabel.Size = new System.Drawing.Size(28, 13); - this.int8SettingsLabel.TabIndex = 3; - this.int8SettingsLabel.Text = "Int8:"; - // - // int8TypeTextBox - // - this.int8TypeTextBox.Location = new System.Drawing.Point(98, 32); - this.int8TypeTextBox.Name = "int8TypeTextBox"; - this.int8TypeTextBox.Size = new System.Drawing.Size(120, 20); - this.int8TypeTextBox.TabIndex = 2; - // - // bannerBox - // - this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; - this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Cogs; - this.bannerBox.Location = new System.Drawing.Point(0, 0); - this.bannerBox.Name = "bannerBox"; - this.bannerBox.Size = new System.Drawing.Size(586, 48); - this.bannerBox.TabIndex = 2; - this.bannerBox.Text = "Configure the global settings."; - this.bannerBox.Title = "Settings"; - // - // SettingsForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(586, 427); - this.Controls.Add(this.bannerBox); - this.Controls.Add(this.settingsTabControl); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "SettingsForm"; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "ReClass.NET - Settings"; - this.settingsTabControl.ResumeLayout(false); - this.generalSettingsTabPage.ResumeLayout(false); - this.generalSettingsTabPage.PerformLayout(); - this.fileAssociationGroupBox.ResumeLayout(false); - this.commentsGroupBox.ResumeLayout(false); - this.commentsGroupBox.PerformLayout(); - this.displayGroupBox.ResumeLayout(false); - this.displayGroupBox.PerformLayout(); - this.colorsSettingTabPage.ResumeLayout(false); - this.colorsSettingTabPage.PerformLayout(); - this.nodeColorGroupBox.ResumeLayout(false); - this.nodeColorGroupBox.PerformLayout(); - this.typeDefinitionsSettingsTabPage.ResumeLayout(false); - this.typeDefinitionsSettingsTabPage.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); - this.ResumeLayout(false); + // + // commentsGroupBox + // + this.commentsGroupBox.Controls.Add(this.showPluginInfoCheckBox); + this.commentsGroupBox.Controls.Add(this.showStringCheckBox); + this.commentsGroupBox.Controls.Add(this.showSymbolsCheckBox); + this.commentsGroupBox.Controls.Add(this.showRttiCheckBox); + this.commentsGroupBox.Controls.Add(this.showPointerCheckBox); + this.commentsGroupBox.Controls.Add(this.showIntegerCheckBox); + this.commentsGroupBox.Controls.Add(this.showFloatCheckBox); + this.commentsGroupBox.Location = new System.Drawing.Point(6, 39); + this.commentsGroupBox.Name = "commentsGroupBox"; + this.commentsGroupBox.Size = new System.Drawing.Size(265, 186); + this.commentsGroupBox.TabIndex = 3; + this.commentsGroupBox.TabStop = false; + this.commentsGroupBox.Text = "Node Comments"; + // + // showPluginInfoCheckBox + // + this.showPluginInfoCheckBox.AutoSize = true; + this.showPluginInfoCheckBox.Location = new System.Drawing.Point(6, 157); + this.showPluginInfoCheckBox.Name = "showPluginInfoCheckBox"; + this.showPluginInfoCheckBox.Size = new System.Drawing.Size(111, 17); + this.showPluginInfoCheckBox.TabIndex = 6; + this.showPluginInfoCheckBox.Text = "Show Plugin Infos"; + this.showPluginInfoCheckBox.UseVisualStyleBackColor = true; + // + // showStringCheckBox + // + this.showStringCheckBox.AutoSize = true; + this.showStringCheckBox.Location = new System.Drawing.Point(6, 134); + this.showStringCheckBox.Name = "showStringCheckBox"; + this.showStringCheckBox.Size = new System.Drawing.Size(88, 17); + this.showStringCheckBox.TabIndex = 5; + this.showStringCheckBox.Text = "Show Strings"; + this.showStringCheckBox.UseVisualStyleBackColor = true; + // + // showSymbolsCheckBox + // + this.showSymbolsCheckBox.AutoSize = true; + this.showSymbolsCheckBox.Location = new System.Drawing.Point(6, 111); + this.showSymbolsCheckBox.Name = "showSymbolsCheckBox"; + this.showSymbolsCheckBox.Size = new System.Drawing.Size(130, 17); + this.showSymbolsCheckBox.TabIndex = 4; + this.showSymbolsCheckBox.Text = "Show Debug Symbols"; + this.showSymbolsCheckBox.UseVisualStyleBackColor = true; + // + // showRttiCheckBox + // + this.showRttiCheckBox.AutoSize = true; + this.showRttiCheckBox.Location = new System.Drawing.Point(6, 88); + this.showRttiCheckBox.Name = "showRttiCheckBox"; + this.showRttiCheckBox.Size = new System.Drawing.Size(81, 17); + this.showRttiCheckBox.TabIndex = 3; + this.showRttiCheckBox.Text = "Show RTTI"; + this.showRttiCheckBox.UseVisualStyleBackColor = true; + // + // showPointerCheckBox + // + this.showPointerCheckBox.AutoSize = true; + this.showPointerCheckBox.Location = new System.Drawing.Point(6, 65); + this.showPointerCheckBox.Name = "showPointerCheckBox"; + this.showPointerCheckBox.Size = new System.Drawing.Size(94, 17); + this.showPointerCheckBox.TabIndex = 2; + this.showPointerCheckBox.Text = "Show Pointers"; + this.showPointerCheckBox.UseVisualStyleBackColor = true; + // + // showIntegerCheckBox + // + this.showIntegerCheckBox.AutoSize = true; + this.showIntegerCheckBox.Location = new System.Drawing.Point(6, 42); + this.showIntegerCheckBox.Name = "showIntegerCheckBox"; + this.showIntegerCheckBox.Size = new System.Drawing.Size(124, 17); + this.showIntegerCheckBox.TabIndex = 1; + this.showIntegerCheckBox.Text = "Show Integer Values"; + this.showIntegerCheckBox.UseVisualStyleBackColor = true; + // + // showFloatCheckBox + // + this.showFloatCheckBox.AutoSize = true; + this.showFloatCheckBox.Location = new System.Drawing.Point(6, 19); + this.showFloatCheckBox.Name = "showFloatCheckBox"; + this.showFloatCheckBox.Size = new System.Drawing.Size(114, 17); + this.showFloatCheckBox.TabIndex = 0; + this.showFloatCheckBox.Text = "Show Float Values"; + this.showFloatCheckBox.UseVisualStyleBackColor = true; + // + // displayGroupBox + // + this.displayGroupBox.Controls.Add(this.randomizeWindowTitleCheckBox); + this.displayGroupBox.Controls.Add(this.runAsAdminCheckBox); + this.displayGroupBox.Controls.Add(this.highlightChangedValuesCheckBox); + this.displayGroupBox.Controls.Add(this.showTextCheckBox); + this.displayGroupBox.Controls.Add(this.showNodeOffsetCheckBox); + this.displayGroupBox.Controls.Add(this.showNodeAddressCheckBox); + this.displayGroupBox.Location = new System.Drawing.Point(283, 39); + this.displayGroupBox.Name = "displayGroupBox"; + this.displayGroupBox.Size = new System.Drawing.Size(265, 160); + this.displayGroupBox.TabIndex = 2; + this.displayGroupBox.TabStop = false; + this.displayGroupBox.Text = "Display"; + // + // randomizeWindowTitleCheckBox + // + this.randomizeWindowTitleCheckBox.AutoSize = true; + this.randomizeWindowTitleCheckBox.Location = new System.Drawing.Point(6, 134); + this.randomizeWindowTitleCheckBox.Name = "randomizeWindowTitleCheckBox"; + this.randomizeWindowTitleCheckBox.Size = new System.Drawing.Size(137, 17); + this.randomizeWindowTitleCheckBox.TabIndex = 5; + this.randomizeWindowTitleCheckBox.Text = "Randomize window title"; + this.randomizeWindowTitleCheckBox.UseVisualStyleBackColor = true; + // + // runAsAdminCheckBox + // + this.runAsAdminCheckBox.AutoSize = true; + this.runAsAdminCheckBox.Location = new System.Drawing.Point(6, 111); + this.runAsAdminCheckBox.Name = "runAsAdminCheckBox"; + this.runAsAdminCheckBox.Size = new System.Drawing.Size(200, 17); + this.runAsAdminCheckBox.TabIndex = 4; + this.runAsAdminCheckBox.Text = "Run as administrator (requires restart)"; + this.runAsAdminCheckBox.UseVisualStyleBackColor = true; + // + // highlightChangedValuesCheckBox + // + this.highlightChangedValuesCheckBox.AutoSize = true; + this.highlightChangedValuesCheckBox.Location = new System.Drawing.Point(6, 88); + this.highlightChangedValuesCheckBox.Name = "highlightChangedValuesCheckBox"; + this.highlightChangedValuesCheckBox.Size = new System.Drawing.Size(148, 17); + this.highlightChangedValuesCheckBox.TabIndex = 3; + this.highlightChangedValuesCheckBox.Text = "Highlight Changed Values"; + this.highlightChangedValuesCheckBox.UseVisualStyleBackColor = true; + // + // showTextCheckBox + // + this.showTextCheckBox.AutoSize = true; + this.showTextCheckBox.Location = new System.Drawing.Point(6, 65); + this.showTextCheckBox.Name = "showTextCheckBox"; + this.showTextCheckBox.Size = new System.Drawing.Size(166, 17); + this.showTextCheckBox.TabIndex = 2; + this.showTextCheckBox.Text = "Show Textual Representation"; + this.showTextCheckBox.UseVisualStyleBackColor = true; + // + // showNodeOffsetCheckBox + // + this.showNodeOffsetCheckBox.AutoSize = true; + this.showNodeOffsetCheckBox.Location = new System.Drawing.Point(6, 42); + this.showNodeOffsetCheckBox.Name = "showNodeOffsetCheckBox"; + this.showNodeOffsetCheckBox.Size = new System.Drawing.Size(113, 17); + this.showNodeOffsetCheckBox.TabIndex = 1; + this.showNodeOffsetCheckBox.Text = "Show Node Offset"; + this.showNodeOffsetCheckBox.UseVisualStyleBackColor = true; + // + // showNodeAddressCheckBox + // + this.showNodeAddressCheckBox.AutoSize = true; + this.showNodeAddressCheckBox.Location = new System.Drawing.Point(6, 19); + this.showNodeAddressCheckBox.Name = "showNodeAddressCheckBox"; + this.showNodeAddressCheckBox.Size = new System.Drawing.Size(123, 17); + this.showNodeAddressCheckBox.TabIndex = 0; + this.showNodeAddressCheckBox.Text = "Show Node Address"; + this.showNodeAddressCheckBox.UseVisualStyleBackColor = true; + // + // stayOnTopCheckBox + // + this.stayOnTopCheckBox.AutoSize = true; + this.stayOnTopCheckBox.Location = new System.Drawing.Point(6, 6); + this.stayOnTopCheckBox.Name = "stayOnTopCheckBox"; + this.stayOnTopCheckBox.Size = new System.Drawing.Size(187, 17); + this.stayOnTopCheckBox.TabIndex = 1; + this.stayOnTopCheckBox.Text = "Force ReClass.NET to stay on top"; + this.stayOnTopCheckBox.UseVisualStyleBackColor = true; + // + // colorsSettingTabPage + // + this.colorsSettingTabPage.Controls.Add(this.nodeColorGroupBox); + this.colorsSettingTabPage.Controls.Add(this.backgroundLabel); + this.colorsSettingTabPage.Controls.Add(this.backgroundColorBox); + this.colorsSettingTabPage.Location = new System.Drawing.Point(4, 22); + this.colorsSettingTabPage.Name = "colorsSettingTabPage"; + this.colorsSettingTabPage.Padding = new System.Windows.Forms.Padding(3); + this.colorsSettingTabPage.Size = new System.Drawing.Size(554, 329); + this.colorsSettingTabPage.TabIndex = 1; + this.colorsSettingTabPage.Text = "Colors"; + this.colorsSettingTabPage.UseVisualStyleBackColor = true; + // + // nodeColorGroupBox + // + this.nodeColorGroupBox.Controls.Add(this.nodeValueLabel); + this.nodeColorGroupBox.Controls.Add(this.nodePluginLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeHexValueColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodePluginColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeHexValueLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeVTableLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeOffsetColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeVTableColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeOffsetLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeTextLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeAddressColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeTextColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeAddressLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeCommentLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeHiddenColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeCommentColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeHiddenLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeIndexLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeSelectedColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeIndexColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeSelectedLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeTypeColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeValueColorBox); + this.nodeColorGroupBox.Controls.Add(this.nodeTypeLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeNameLabel); + this.nodeColorGroupBox.Controls.Add(this.nodeNameColorBox); + this.nodeColorGroupBox.Location = new System.Drawing.Point(9, 43); + this.nodeColorGroupBox.Name = "nodeColorGroupBox"; + this.nodeColorGroupBox.Size = new System.Drawing.Size(539, 225); + this.nodeColorGroupBox.TabIndex = 28; + this.nodeColorGroupBox.TabStop = false; + this.nodeColorGroupBox.Text = "Node Colors"; + // + // nodeValueLabel + // + this.nodeValueLabel.AutoSize = true; + this.nodeValueLabel.Location = new System.Drawing.Point(9, 198); + this.nodeValueLabel.Name = "nodeValueLabel"; + this.nodeValueLabel.Size = new System.Drawing.Size(64, 13); + this.nodeValueLabel.TabIndex = 17; + this.nodeValueLabel.Text = "Value Color:"; + // + // nodePluginLabel + // + this.nodePluginLabel.AutoSize = true; + this.nodePluginLabel.Location = new System.Drawing.Point(286, 172); + this.nodePluginLabel.Name = "nodePluginLabel"; + this.nodePluginLabel.Size = new System.Drawing.Size(87, 13); + this.nodePluginLabel.TabIndex = 27; + this.nodePluginLabel.Text = "Plugin Info Color:"; + // + // nodeHexValueColorBox + // + this.nodeHexValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeHexValueColorBox.Location = new System.Drawing.Point(133, 117); + this.nodeHexValueColorBox.Name = "nodeHexValueColorBox"; + this.nodeHexValueColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeHexValueColorBox.TabIndex = 2; + // + // nodePluginColorBox + // + this.nodePluginColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodePluginColorBox.Location = new System.Drawing.Point(410, 169); + this.nodePluginColorBox.Name = "nodePluginColorBox"; + this.nodePluginColorBox.Size = new System.Drawing.Size(123, 20); + this.nodePluginColorBox.TabIndex = 26; + // + // nodeHexValueLabel + // + this.nodeHexValueLabel.AutoSize = true; + this.nodeHexValueLabel.Location = new System.Drawing.Point(9, 120); + this.nodeHexValueLabel.Name = "nodeHexValueLabel"; + this.nodeHexValueLabel.Size = new System.Drawing.Size(86, 13); + this.nodeHexValueLabel.TabIndex = 3; + this.nodeHexValueLabel.Text = "Hex Value Color:"; + // + // nodeVTableLabel + // + this.nodeVTableLabel.AutoSize = true; + this.nodeVTableLabel.Location = new System.Drawing.Point(286, 94); + this.nodeVTableLabel.Name = "nodeVTableLabel"; + this.nodeVTableLabel.Size = new System.Drawing.Size(71, 13); + this.nodeVTableLabel.TabIndex = 25; + this.nodeVTableLabel.Text = "VTable Color:"; + // + // nodeOffsetColorBox + // + this.nodeOffsetColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeOffsetColorBox.Location = new System.Drawing.Point(133, 91); + this.nodeOffsetColorBox.Name = "nodeOffsetColorBox"; + this.nodeOffsetColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeOffsetColorBox.TabIndex = 4; + // + // nodeVTableColorBox + // + this.nodeVTableColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeVTableColorBox.Location = new System.Drawing.Point(410, 91); + this.nodeVTableColorBox.Name = "nodeVTableColorBox"; + this.nodeVTableColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeVTableColorBox.TabIndex = 24; + // + // nodeOffsetLabel + // + this.nodeOffsetLabel.AutoSize = true; + this.nodeOffsetLabel.Location = new System.Drawing.Point(9, 94); + this.nodeOffsetLabel.Name = "nodeOffsetLabel"; + this.nodeOffsetLabel.Size = new System.Drawing.Size(65, 13); + this.nodeOffsetLabel.TabIndex = 5; + this.nodeOffsetLabel.Text = "Offset Color:"; + // + // nodeTextLabel + // + this.nodeTextLabel.AutoSize = true; + this.nodeTextLabel.Location = new System.Drawing.Point(286, 146); + this.nodeTextLabel.Name = "nodeTextLabel"; + this.nodeTextLabel.Size = new System.Drawing.Size(58, 13); + this.nodeTextLabel.TabIndex = 23; + this.nodeTextLabel.Text = "Text Color:"; + // + // nodeAddressColorBox + // + this.nodeAddressColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeAddressColorBox.Location = new System.Drawing.Point(133, 65); + this.nodeAddressColorBox.Name = "nodeAddressColorBox"; + this.nodeAddressColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeAddressColorBox.TabIndex = 6; + // + // nodeTextColorBox + // + this.nodeTextColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeTextColorBox.Location = new System.Drawing.Point(410, 143); + this.nodeTextColorBox.Name = "nodeTextColorBox"; + this.nodeTextColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeTextColorBox.TabIndex = 22; + // + // nodeAddressLabel + // + this.nodeAddressLabel.AutoSize = true; + this.nodeAddressLabel.Location = new System.Drawing.Point(9, 68); + this.nodeAddressLabel.Name = "nodeAddressLabel"; + this.nodeAddressLabel.Size = new System.Drawing.Size(75, 13); + this.nodeAddressLabel.TabIndex = 7; + this.nodeAddressLabel.Text = "Address Color:"; + // + // nodeCommentLabel + // + this.nodeCommentLabel.AutoSize = true; + this.nodeCommentLabel.Location = new System.Drawing.Point(286, 120); + this.nodeCommentLabel.Name = "nodeCommentLabel"; + this.nodeCommentLabel.Size = new System.Drawing.Size(81, 13); + this.nodeCommentLabel.TabIndex = 21; + this.nodeCommentLabel.Text = "Comment Color:"; + // + // nodeHiddenColorBox + // + this.nodeHiddenColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeHiddenColorBox.Location = new System.Drawing.Point(410, 18); + this.nodeHiddenColorBox.Name = "nodeHiddenColorBox"; + this.nodeHiddenColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeHiddenColorBox.TabIndex = 8; + // + // nodeCommentColorBox + // + this.nodeCommentColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeCommentColorBox.Location = new System.Drawing.Point(410, 117); + this.nodeCommentColorBox.Name = "nodeCommentColorBox"; + this.nodeCommentColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeCommentColorBox.TabIndex = 20; + // + // nodeHiddenLabel + // + this.nodeHiddenLabel.AutoSize = true; + this.nodeHiddenLabel.Location = new System.Drawing.Point(286, 21); + this.nodeHiddenLabel.Name = "nodeHiddenLabel"; + this.nodeHiddenLabel.Size = new System.Drawing.Size(71, 13); + this.nodeHiddenLabel.TabIndex = 9; + this.nodeHiddenLabel.Text = "Hidden Color:"; + // + // nodeIndexLabel + // + this.nodeIndexLabel.AutoSize = true; + this.nodeIndexLabel.Location = new System.Drawing.Point(286, 68); + this.nodeIndexLabel.Name = "nodeIndexLabel"; + this.nodeIndexLabel.Size = new System.Drawing.Size(63, 13); + this.nodeIndexLabel.TabIndex = 19; + this.nodeIndexLabel.Text = "Index Color:"; + // + // nodeSelectedColorBox + // + this.nodeSelectedColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeSelectedColorBox.Location = new System.Drawing.Point(133, 18); + this.nodeSelectedColorBox.Name = "nodeSelectedColorBox"; + this.nodeSelectedColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeSelectedColorBox.TabIndex = 10; + // + // nodeIndexColorBox + // + this.nodeIndexColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeIndexColorBox.Location = new System.Drawing.Point(410, 65); + this.nodeIndexColorBox.Name = "nodeIndexColorBox"; + this.nodeIndexColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeIndexColorBox.TabIndex = 18; + // + // nodeSelectedLabel + // + this.nodeSelectedLabel.AutoSize = true; + this.nodeSelectedLabel.Location = new System.Drawing.Point(9, 21); + this.nodeSelectedLabel.Name = "nodeSelectedLabel"; + this.nodeSelectedLabel.Size = new System.Drawing.Size(79, 13); + this.nodeSelectedLabel.TabIndex = 11; + this.nodeSelectedLabel.Text = "Selected Color:"; + // + // nodeTypeColorBox + // + this.nodeTypeColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeTypeColorBox.Location = new System.Drawing.Point(133, 143); + this.nodeTypeColorBox.Name = "nodeTypeColorBox"; + this.nodeTypeColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeTypeColorBox.TabIndex = 12; + // + // nodeValueColorBox + // + this.nodeValueColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeValueColorBox.Location = new System.Drawing.Point(133, 195); + this.nodeValueColorBox.Name = "nodeValueColorBox"; + this.nodeValueColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeValueColorBox.TabIndex = 16; + // + // nodeTypeLabel + // + this.nodeTypeLabel.AutoSize = true; + this.nodeTypeLabel.Location = new System.Drawing.Point(9, 146); + this.nodeTypeLabel.Name = "nodeTypeLabel"; + this.nodeTypeLabel.Size = new System.Drawing.Size(61, 13); + this.nodeTypeLabel.TabIndex = 13; + this.nodeTypeLabel.Text = "Type Color:"; + // + // nodeNameLabel + // + this.nodeNameLabel.AutoSize = true; + this.nodeNameLabel.Location = new System.Drawing.Point(9, 172); + this.nodeNameLabel.Name = "nodeNameLabel"; + this.nodeNameLabel.Size = new System.Drawing.Size(65, 13); + this.nodeNameLabel.TabIndex = 15; + this.nodeNameLabel.Text = "Name Color:"; + // + // nodeNameColorBox + // + this.nodeNameColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.nodeNameColorBox.Location = new System.Drawing.Point(133, 169); + this.nodeNameColorBox.Name = "nodeNameColorBox"; + this.nodeNameColorBox.Size = new System.Drawing.Size(123, 20); + this.nodeNameColorBox.TabIndex = 14; + // + // backgroundLabel + // + this.backgroundLabel.AutoSize = true; + this.backgroundLabel.Location = new System.Drawing.Point(6, 14); + this.backgroundLabel.Name = "backgroundLabel"; + this.backgroundLabel.Size = new System.Drawing.Size(161, 13); + this.backgroundLabel.TabIndex = 1; + this.backgroundLabel.Text = "Memory View Background Color:"; + // + // backgroundColorBox + // + this.backgroundColorBox.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); + this.backgroundColorBox.Location = new System.Drawing.Point(175, 11); + this.backgroundColorBox.Name = "backgroundColorBox"; + this.backgroundColorBox.Size = new System.Drawing.Size(123, 20); + this.backgroundColorBox.TabIndex = 0; + // + // typeDefinitionsSettingsTabPage + // + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf32TextSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf32TextTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.nuintSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.nuintTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.nintSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.nintTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.boolTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.generatorInfoLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.functionPtrTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf16TextTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.utf8TextTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x3TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix3x4TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.matrix4x4TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector2TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector3TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.vector4TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.doubleTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatSettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.floatTypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint64TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint32TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint16TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.uint8TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int64TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int32TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int16TypeTextBox); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8SettingsLabel); + this.typeDefinitionsSettingsTabPage.Controls.Add(this.int8TypeTextBox); + this.typeDefinitionsSettingsTabPage.Location = new System.Drawing.Point(4, 22); + this.typeDefinitionsSettingsTabPage.Name = "typeDefinitionsSettingsTabPage"; + this.typeDefinitionsSettingsTabPage.Padding = new System.Windows.Forms.Padding(3); + this.typeDefinitionsSettingsTabPage.Size = new System.Drawing.Size(554, 329); + this.typeDefinitionsSettingsTabPage.TabIndex = 2; + this.typeDefinitionsSettingsTabPage.Text = "Type Definitions"; + this.typeDefinitionsSettingsTabPage.UseVisualStyleBackColor = true; + // + // nuintSettingsLabel + // + this.nuintSettingsLabel.AutoSize = true; + this.nuintSettingsLabel.Location = new System.Drawing.Point(6, 233); + this.nuintSettingsLabel.Name = "nuintSettingsLabel"; + this.nuintSettingsLabel.Size = new System.Drawing.Size(38, 13); + this.nuintSettingsLabel.TabIndex = 50; + this.nuintSettingsLabel.Text = "NUInt:"; + // + // nuintTypeTextBox + // + this.nuintTypeTextBox.Location = new System.Drawing.Point(98, 230); + this.nuintTypeTextBox.Name = "nuintTypeTextBox"; + this.nuintTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.nuintTypeTextBox.TabIndex = 49; + // + // nintSettingsLabel + // + this.nintSettingsLabel.AutoSize = true; + this.nintSettingsLabel.Location = new System.Drawing.Point(6, 123); + this.nintSettingsLabel.Name = "nintSettingsLabel"; + this.nintSettingsLabel.Size = new System.Drawing.Size(30, 13); + this.nintSettingsLabel.TabIndex = 48; + this.nintSettingsLabel.Text = "NInt:"; + // + // nintTypeTextBox + // + this.nintTypeTextBox.Location = new System.Drawing.Point(98, 120); + this.nintTypeTextBox.Name = "nintTypeTextBox"; + this.nintTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.nintTypeTextBox.TabIndex = 47; + // + // boolSettingsLabel + // + this.boolSettingsLabel.AutoSize = true; + this.boolSettingsLabel.Location = new System.Drawing.Point(254, 35); + this.boolSettingsLabel.Name = "boolSettingsLabel"; + this.boolSettingsLabel.Size = new System.Drawing.Size(31, 13); + this.boolSettingsLabel.TabIndex = 46; + this.boolSettingsLabel.Text = "Bool:"; + // + // boolTypeTextBox + // + this.boolTypeTextBox.Location = new System.Drawing.Point(346, 32); + this.boolTypeTextBox.Name = "boolTypeTextBox"; + this.boolTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.boolTypeTextBox.TabIndex = 45; + // + // generatorInfoLabel + // + this.generatorInfoLabel.AutoSize = true; + this.generatorInfoLabel.Location = new System.Drawing.Point(6, 6); + this.generatorInfoLabel.Name = "generatorInfoLabel"; + this.generatorInfoLabel.Size = new System.Drawing.Size(236, 13); + this.generatorInfoLabel.TabIndex = 44; + this.generatorInfoLabel.Text = "These types are used to generate the C++ code:"; + // + // functionPtrSettingsLabel + // + this.functionPtrSettingsLabel.AutoSize = true; + this.functionPtrSettingsLabel.Location = new System.Drawing.Point(254, 255); + this.functionPtrSettingsLabel.Name = "functionPtrSettingsLabel"; + this.functionPtrSettingsLabel.Size = new System.Drawing.Size(87, 13); + this.functionPtrSettingsLabel.TabIndex = 43; + this.functionPtrSettingsLabel.Text = "Function Pointer:"; + // + // functionPtrTypeTextBox + // + this.functionPtrTypeTextBox.Location = new System.Drawing.Point(346, 252); + this.functionPtrTypeTextBox.Name = "functionPtrTypeTextBox"; + this.functionPtrTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.functionPtrTypeTextBox.TabIndex = 42; + // + // utf16TextSettingsLabel + // + this.utf16TextSettingsLabel.AutoSize = true; + this.utf16TextSettingsLabel.Location = new System.Drawing.Point(254, 211); + this.utf16TextSettingsLabel.Name = "utf16TextSettingsLabel"; + this.utf16TextSettingsLabel.Size = new System.Drawing.Size(43, 13); + this.utf16TextSettingsLabel.TabIndex = 39; + this.utf16TextSettingsLabel.Text = "UTF16:"; + // + // utf16TextTypeTextBox + // + this.utf16TextTypeTextBox.Location = new System.Drawing.Point(346, 208); + this.utf16TextTypeTextBox.Name = "utf16TextTypeTextBox"; + this.utf16TextTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.utf16TextTypeTextBox.TabIndex = 38; + // + // utf8TextSettingsLabel + // + this.utf8TextSettingsLabel.AutoSize = true; + this.utf8TextSettingsLabel.Location = new System.Drawing.Point(254, 189); + this.utf8TextSettingsLabel.Name = "utf8TextSettingsLabel"; + this.utf8TextSettingsLabel.Size = new System.Drawing.Size(37, 13); + this.utf8TextSettingsLabel.TabIndex = 35; + this.utf8TextSettingsLabel.Text = "UTF8:"; + // + // utf8TextTypeTextBox + // + this.utf8TextTypeTextBox.Location = new System.Drawing.Point(346, 186); + this.utf8TextTypeTextBox.Name = "utf8TextTypeTextBox"; + this.utf8TextTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.utf8TextTypeTextBox.TabIndex = 34; + // + // matrix3x3SettingsLabel + // + this.matrix3x3SettingsLabel.AutoSize = true; + this.matrix3x3SettingsLabel.Location = new System.Drawing.Point(254, 123); + this.matrix3x3SettingsLabel.Name = "matrix3x3SettingsLabel"; + this.matrix3x3SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix3x3SettingsLabel.TabIndex = 33; + this.matrix3x3SettingsLabel.Text = "Matrix (3x3):"; + // + // matrix3x3TypeTextBox + // + this.matrix3x3TypeTextBox.Location = new System.Drawing.Point(346, 120); + this.matrix3x3TypeTextBox.Name = "matrix3x3TypeTextBox"; + this.matrix3x3TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix3x3TypeTextBox.TabIndex = 32; + // + // matrix3x4SettingsLabel + // + this.matrix3x4SettingsLabel.AutoSize = true; + this.matrix3x4SettingsLabel.Location = new System.Drawing.Point(254, 145); + this.matrix3x4SettingsLabel.Name = "matrix3x4SettingsLabel"; + this.matrix3x4SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix3x4SettingsLabel.TabIndex = 31; + this.matrix3x4SettingsLabel.Text = "Matrix (3x4):"; + // + // matrix3x4TypeTextBox + // + this.matrix3x4TypeTextBox.Location = new System.Drawing.Point(346, 142); + this.matrix3x4TypeTextBox.Name = "matrix3x4TypeTextBox"; + this.matrix3x4TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix3x4TypeTextBox.TabIndex = 30; + // + // matrix4x4SettingsLabel + // + this.matrix4x4SettingsLabel.AutoSize = true; + this.matrix4x4SettingsLabel.Location = new System.Drawing.Point(254, 167); + this.matrix4x4SettingsLabel.Name = "matrix4x4SettingsLabel"; + this.matrix4x4SettingsLabel.Size = new System.Drawing.Size(64, 13); + this.matrix4x4SettingsLabel.TabIndex = 29; + this.matrix4x4SettingsLabel.Text = "Matrix (4x4):"; + // + // matrix4x4TypeTextBox + // + this.matrix4x4TypeTextBox.Location = new System.Drawing.Point(346, 164); + this.matrix4x4TypeTextBox.Name = "matrix4x4TypeTextBox"; + this.matrix4x4TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.matrix4x4TypeTextBox.TabIndex = 28; + // + // vector2SettingsLabel + // + this.vector2SettingsLabel.AutoSize = true; + this.vector2SettingsLabel.Location = new System.Drawing.Point(254, 57); + this.vector2SettingsLabel.Name = "vector2SettingsLabel"; + this.vector2SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector2SettingsLabel.TabIndex = 27; + this.vector2SettingsLabel.Text = "Vector2:"; + // + // vector2TypeTextBox + // + this.vector2TypeTextBox.Location = new System.Drawing.Point(346, 54); + this.vector2TypeTextBox.Name = "vector2TypeTextBox"; + this.vector2TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.vector2TypeTextBox.TabIndex = 26; + // + // vector3SettingsLabel + // + this.vector3SettingsLabel.AutoSize = true; + this.vector3SettingsLabel.Location = new System.Drawing.Point(254, 79); + this.vector3SettingsLabel.Name = "vector3SettingsLabel"; + this.vector3SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector3SettingsLabel.TabIndex = 25; + this.vector3SettingsLabel.Text = "Vector3:"; + // + // vector3TypeTextBox + // + this.vector3TypeTextBox.Location = new System.Drawing.Point(346, 76); + this.vector3TypeTextBox.Name = "vector3TypeTextBox"; + this.vector3TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.vector3TypeTextBox.TabIndex = 24; + // + // vector4SettingsLabel + // + this.vector4SettingsLabel.AutoSize = true; + this.vector4SettingsLabel.Location = new System.Drawing.Point(254, 101); + this.vector4SettingsLabel.Name = "vector4SettingsLabel"; + this.vector4SettingsLabel.Size = new System.Drawing.Size(47, 13); + this.vector4SettingsLabel.TabIndex = 23; + this.vector4SettingsLabel.Text = "Vector4:"; + // + // vector4TypeTextBox + // + this.vector4TypeTextBox.Location = new System.Drawing.Point(346, 98); + this.vector4TypeTextBox.Name = "vector4TypeTextBox"; + this.vector4TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.vector4TypeTextBox.TabIndex = 22; + // + // doubleSettingsLabel + // + this.doubleSettingsLabel.AutoSize = true; + this.doubleSettingsLabel.Location = new System.Drawing.Point(6, 277); + this.doubleSettingsLabel.Name = "doubleSettingsLabel"; + this.doubleSettingsLabel.Size = new System.Drawing.Size(44, 13); + this.doubleSettingsLabel.TabIndex = 21; + this.doubleSettingsLabel.Text = "Double:"; + // + // doubleTypeTextBox + // + this.doubleTypeTextBox.Location = new System.Drawing.Point(98, 274); + this.doubleTypeTextBox.Name = "doubleTypeTextBox"; + this.doubleTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.doubleTypeTextBox.TabIndex = 20; + // + // floatSettingsLabel + // + this.floatSettingsLabel.AutoSize = true; + this.floatSettingsLabel.Location = new System.Drawing.Point(6, 255); + this.floatSettingsLabel.Name = "floatSettingsLabel"; + this.floatSettingsLabel.Size = new System.Drawing.Size(33, 13); + this.floatSettingsLabel.TabIndex = 19; + this.floatSettingsLabel.Text = "Float:"; + // + // floatTypeTextBox + // + this.floatTypeTextBox.Location = new System.Drawing.Point(98, 252); + this.floatTypeTextBox.Name = "floatTypeTextBox"; + this.floatTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.floatTypeTextBox.TabIndex = 18; + // + // uint64SettingsLabel + // + this.uint64SettingsLabel.AutoSize = true; + this.uint64SettingsLabel.Location = new System.Drawing.Point(6, 211); + this.uint64SettingsLabel.Name = "uint64SettingsLabel"; + this.uint64SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint64SettingsLabel.TabIndex = 17; + this.uint64SettingsLabel.Text = "UInt64:"; + // + // uint64TypeTextBox + // + this.uint64TypeTextBox.Location = new System.Drawing.Point(98, 208); + this.uint64TypeTextBox.Name = "uint64TypeTextBox"; + this.uint64TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.uint64TypeTextBox.TabIndex = 16; + // + // uint32SettingsLabel + // + this.uint32SettingsLabel.AutoSize = true; + this.uint32SettingsLabel.Location = new System.Drawing.Point(6, 189); + this.uint32SettingsLabel.Name = "uint32SettingsLabel"; + this.uint32SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint32SettingsLabel.TabIndex = 15; + this.uint32SettingsLabel.Text = "UInt32:"; + // + // uint32TypeTextBox + // + this.uint32TypeTextBox.Location = new System.Drawing.Point(98, 186); + this.uint32TypeTextBox.Name = "uint32TypeTextBox"; + this.uint32TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.uint32TypeTextBox.TabIndex = 14; + // + // uint16SettingsLabel + // + this.uint16SettingsLabel.AutoSize = true; + this.uint16SettingsLabel.Location = new System.Drawing.Point(6, 167); + this.uint16SettingsLabel.Name = "uint16SettingsLabel"; + this.uint16SettingsLabel.Size = new System.Drawing.Size(42, 13); + this.uint16SettingsLabel.TabIndex = 13; + this.uint16SettingsLabel.Text = "UInt16:"; + // + // uint16TypeTextBox + // + this.uint16TypeTextBox.Location = new System.Drawing.Point(98, 164); + this.uint16TypeTextBox.Name = "uint16TypeTextBox"; + this.uint16TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.uint16TypeTextBox.TabIndex = 12; + // + // uint8SettingsLabel + // + this.uint8SettingsLabel.AutoSize = true; + this.uint8SettingsLabel.Location = new System.Drawing.Point(6, 145); + this.uint8SettingsLabel.Name = "uint8SettingsLabel"; + this.uint8SettingsLabel.Size = new System.Drawing.Size(36, 13); + this.uint8SettingsLabel.TabIndex = 11; + this.uint8SettingsLabel.Text = "UInt8:"; + // + // uint8TypeTextBox + // + this.uint8TypeTextBox.Location = new System.Drawing.Point(98, 142); + this.uint8TypeTextBox.Name = "uint8TypeTextBox"; + this.uint8TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.uint8TypeTextBox.TabIndex = 10; + // + // int64SettingsLabel + // + this.int64SettingsLabel.AutoSize = true; + this.int64SettingsLabel.Location = new System.Drawing.Point(6, 101); + this.int64SettingsLabel.Name = "int64SettingsLabel"; + this.int64SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int64SettingsLabel.TabIndex = 9; + this.int64SettingsLabel.Text = "Int64:"; + // + // int64TypeTextBox + // + this.int64TypeTextBox.Location = new System.Drawing.Point(98, 98); + this.int64TypeTextBox.Name = "int64TypeTextBox"; + this.int64TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.int64TypeTextBox.TabIndex = 8; + // + // int32SettingsLabel + // + this.int32SettingsLabel.AutoSize = true; + this.int32SettingsLabel.Location = new System.Drawing.Point(6, 79); + this.int32SettingsLabel.Name = "int32SettingsLabel"; + this.int32SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int32SettingsLabel.TabIndex = 7; + this.int32SettingsLabel.Text = "Int32:"; + // + // int32TypeTextBox + // + this.int32TypeTextBox.Location = new System.Drawing.Point(98, 76); + this.int32TypeTextBox.Name = "int32TypeTextBox"; + this.int32TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.int32TypeTextBox.TabIndex = 6; + // + // int16SettingsLabel + // + this.int16SettingsLabel.AutoSize = true; + this.int16SettingsLabel.Location = new System.Drawing.Point(6, 57); + this.int16SettingsLabel.Name = "int16SettingsLabel"; + this.int16SettingsLabel.Size = new System.Drawing.Size(34, 13); + this.int16SettingsLabel.TabIndex = 5; + this.int16SettingsLabel.Text = "Int16:"; + // + // int16TypeTextBox + // + this.int16TypeTextBox.Location = new System.Drawing.Point(98, 54); + this.int16TypeTextBox.Name = "int16TypeTextBox"; + this.int16TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.int16TypeTextBox.TabIndex = 4; + // + // int8SettingsLabel + // + this.int8SettingsLabel.AutoSize = true; + this.int8SettingsLabel.Location = new System.Drawing.Point(6, 35); + this.int8SettingsLabel.Name = "int8SettingsLabel"; + this.int8SettingsLabel.Size = new System.Drawing.Size(28, 13); + this.int8SettingsLabel.TabIndex = 3; + this.int8SettingsLabel.Text = "Int8:"; + // + // int8TypeTextBox + // + this.int8TypeTextBox.Location = new System.Drawing.Point(98, 32); + this.int8TypeTextBox.Name = "int8TypeTextBox"; + this.int8TypeTextBox.Size = new System.Drawing.Size(120, 20); + this.int8TypeTextBox.TabIndex = 2; + // + // bannerBox + // + this.bannerBox.Dock = System.Windows.Forms.DockStyle.Top; + this.bannerBox.Icon = global::ReClassNET.Properties.Resources.B32x32_Cogs; + this.bannerBox.Location = new System.Drawing.Point(0, 0); + this.bannerBox.Name = "bannerBox"; + this.bannerBox.Size = new System.Drawing.Size(586, 48); + this.bannerBox.TabIndex = 2; + this.bannerBox.Text = "Configure the global settings."; + this.bannerBox.Title = "Settings"; + // + // utf32TextSettingsLabel + // + this.utf32TextSettingsLabel.AutoSize = true; + this.utf32TextSettingsLabel.Location = new System.Drawing.Point(254, 233); + this.utf32TextSettingsLabel.Name = "utf32TextSettingsLabel"; + this.utf32TextSettingsLabel.Size = new System.Drawing.Size(43, 13); + this.utf32TextSettingsLabel.TabIndex = 52; + this.utf32TextSettingsLabel.Text = "UTF32:"; + // + // utf32TextTypeTextBox + // + this.utf32TextTypeTextBox.Location = new System.Drawing.Point(346, 230); + this.utf32TextTypeTextBox.Name = "utf32TextTypeTextBox"; + this.utf32TextTypeTextBox.Size = new System.Drawing.Size(120, 20); + this.utf32TextTypeTextBox.TabIndex = 51; + // + // SettingsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(586, 427); + this.Controls.Add(this.bannerBox); + this.Controls.Add(this.settingsTabControl); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SettingsForm"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ReClass.NET - Settings"; + this.settingsTabControl.ResumeLayout(false); + this.generalSettingsTabPage.ResumeLayout(false); + this.generalSettingsTabPage.PerformLayout(); + this.fileAssociationGroupBox.ResumeLayout(false); + this.commentsGroupBox.ResumeLayout(false); + this.commentsGroupBox.PerformLayout(); + this.displayGroupBox.ResumeLayout(false); + this.displayGroupBox.PerformLayout(); + this.colorsSettingTabPage.ResumeLayout(false); + this.colorsSettingTabPage.PerformLayout(); + this.nodeColorGroupBox.ResumeLayout(false); + this.nodeColorGroupBox.PerformLayout(); + this.typeDefinitionsSettingsTabPage.ResumeLayout(false); + this.typeDefinitionsSettingsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).EndInit(); + this.ResumeLayout(false); } @@ -1171,7 +1231,7 @@ private void InitializeComponent() private System.Windows.Forms.Label doubleSettingsLabel; private System.Windows.Forms.TextBox doubleTypeTextBox; private System.Windows.Forms.GroupBox nodeColorGroupBox; - private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label generatorInfoLabel; private BannerBox bannerBox; private System.Windows.Forms.Label boolSettingsLabel; private System.Windows.Forms.TextBox boolTypeTextBox; @@ -1181,5 +1241,11 @@ private void InitializeComponent() private System.Windows.Forms.Label associationInfoLabel; private System.Windows.Forms.CheckBox randomizeWindowTitleCheckBox; private System.Windows.Forms.CheckBox runAsAdminCheckBox; + private System.Windows.Forms.Label nuintSettingsLabel; + private System.Windows.Forms.TextBox nuintTypeTextBox; + private System.Windows.Forms.Label nintSettingsLabel; + private System.Windows.Forms.TextBox nintTypeTextBox; + private System.Windows.Forms.Label utf32TextSettingsLabel; + private System.Windows.Forms.TextBox utf32TextTypeTextBox; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/SettingsForm.cs b/ReClass.NET/Forms/SettingsForm.cs index 4c242fa3..fcc4121e 100644 --- a/ReClass.NET/Forms/SettingsForm.cs +++ b/ReClass.NET/Forms/SettingsForm.cs @@ -39,7 +39,7 @@ public SettingsForm(Settings settings, CppTypeMapping typeMapping) SetGeneralBindings(); SetColorBindings(); - SetTypedefinitionBindings(); + SetTypeDefinitionBindings(); if (NativeMethods.IsUnix()) { @@ -90,10 +90,7 @@ private static void SetBinding(IBindableComponent control, string propertyName, private void SetGeneralBindings() { SetBinding(stayOnTopCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.StayOnTop)); - stayOnTopCheckBox.CheckedChanged += (sender, e) => - { - GlobalWindowManager.Windows.ForEach(w => w.TopMost = stayOnTopCheckBox.Checked); - }; + stayOnTopCheckBox.CheckedChanged += (_, _2) => GlobalWindowManager.Windows.ForEach(w => w.TopMost = stayOnTopCheckBox.Checked); SetBinding(showNodeAddressCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.ShowNodeAddress)); SetBinding(showNodeOffsetCheckBox, nameof(CheckBox.Checked), settings, nameof(Settings.ShowNodeOffset)); @@ -130,17 +127,19 @@ private void SetColorBindings() SetBinding(nodePluginColorBox, nameof(ColorBox.Color), settings, nameof(Settings.PluginColor)); } - private void SetTypedefinitionBindings() + private void SetTypeDefinitionBindings() { SetBinding(boolTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeBool)); SetBinding(int8TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeInt8)); SetBinding(int16TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeInt16)); SetBinding(int32TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeInt32)); SetBinding(int64TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeInt64)); + SetBinding(nintTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeNInt)); SetBinding(uint8TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUInt8)); SetBinding(uint16TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUInt16)); SetBinding(uint32TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUInt32)); SetBinding(uint64TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUInt64)); + SetBinding(nuintTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeNUInt)); SetBinding(floatTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeFloat)); SetBinding(doubleTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeDouble)); SetBinding(vector2TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeVector2)); @@ -151,6 +150,7 @@ private void SetTypedefinitionBindings() SetBinding(matrix4x4TypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeMatrix4x4)); SetBinding(utf8TextTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUtf8Text)); SetBinding(utf16TextTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUtf16Text)); + SetBinding(utf32TextTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeUtf32Text)); SetBinding(functionPtrTypeTextBox, nameof(TextBox.Text), typeMapping, nameof(CppTypeMapping.TypeFunctionPtr)); } } From b54f55be2ef6f716c59bb4c9c8761b060247ca4c Mon Sep 17 00:00:00 2001 From: GH-Rake Date: Thu, 22 Oct 2020 20:26:26 -0400 Subject: [PATCH 740/777] Fix RegisterExtension double quoted path --- ReClass.NET/Native/NativeMethods.Windows.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ReClass.NET/Native/NativeMethods.Windows.cs b/ReClass.NET/Native/NativeMethods.Windows.cs index 5b5ce08e..f27f9184 100644 --- a/ReClass.NET/Native/NativeMethods.Windows.cs +++ b/ReClass.NET/Native/NativeMethods.Windows.cs @@ -188,11 +188,6 @@ public bool RegisterExtension(string fileExtension, string extensionId, string a using (var icon = extensionInfoKey?.CreateSubKey("DefaultIcon")) { - if (applicationPath.IndexOfAny(new[] { ' ', '\t' }) < 0) - { - applicationPath = "\"" + applicationPath + "\""; - } - icon?.SetValue(string.Empty, "\"" + applicationPath + "\",0", RegistryValueKind.String); } From a2d1c6d4987dc15cf2d923bb20b5de8d7590f5ae Mon Sep 17 00:00:00 2001 From: ko1N Date: Sat, 31 Oct 2020 20:35:43 +0100 Subject: [PATCH 741/777] Added containerized builds via docker/podman --- Makefile | 32 ++++++++++++++++++++++++++++++++ ReClass.NET/Makefile | 18 ++++++++++++++++++ ReClass.NET_Launcher/Makefile | 14 ++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/Makefile b/Makefile index f169682b..50b259f4 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +.PHONY: all clean debug clean_debug release clean_release update docker_all docker_debug docker_release podman_all podman_debug podman_release dist + all: debug release dist clean: clean_debug clean_release @@ -27,6 +29,36 @@ clean_release: update: cd ReClass.NET && make update +docker_all: + make docker_debug + make docker_release + make dist + +docker_debug: + cd ReClass.NET_Launcher && make docker_debug + cd ReClass.NET && make docker_debug + docker container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make debug" + +docker_release: + cd ReClass.NET_Launcher && make docker_release + cd ReClass.NET && make docker_release + docker container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make release" + +podman_all: + make podman_debug + make podman_release + make dist + +podman_debug: + cd ReClass.NET_Launcher && make podman_debug + cd ReClass.NET && make podman_debug + podman container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make debug" + +podman_release: + cd ReClass.NET_Launcher && make podman_release + cd ReClass.NET && make podman_release + podman container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make release" + dist: test -d build || mkdir -p build cp -r ReClass.NET/bin/* build/ diff --git a/ReClass.NET/Makefile b/ReClass.NET/Makefile index 52bcae5b..779202bd 100644 --- a/ReClass.NET/Makefile +++ b/ReClass.NET/Makefile @@ -1,3 +1,5 @@ +.PHONY: all clean debug clean_debug release clean_release update docker_debug docker_release podman_debug podman_release + all: debug release clean: clean_debug clean_release @@ -18,3 +20,19 @@ clean_release: update: mono --runtime=v4.0 ../Dependencies/nuget.exe restore ReClass.NET.csproj -SolutionDirectory ../ + +docker_debug: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj" + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj" + +docker_release: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj" + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj" + +podman_debug: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj" + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj" + +podman_release: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj" + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj" diff --git a/ReClass.NET_Launcher/Makefile b/ReClass.NET_Launcher/Makefile index eb8e3c4d..0a121e0d 100644 --- a/ReClass.NET_Launcher/Makefile +++ b/ReClass.NET_Launcher/Makefile @@ -1,3 +1,5 @@ +.PHONY: all clean debug clean_debug release clean_release docker_debug docker_release podman_debug podman_release + all: debug release clean: clean_debug clean_release @@ -13,3 +15,15 @@ release: clean_release: msbuild /t:Clean ReClass.NET_Launcher.csproj + +docker_debug: + docker container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj" + +docker_release: + docker container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Release ReClass.NET_Launcher.csproj" + +podman_debug: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj" + +podman_release: + podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Release ReClass.NET_Launcher.csproj" From a584d57eb0f811af5f9378ca66f8e1686b4f7980 Mon Sep 17 00:00:00 2001 From: ko1N Date: Sat, 31 Oct 2020 22:32:22 +0100 Subject: [PATCH 742/777] Docker now generates the files as the current user --- Makefile | 8 ++++++-- ReClass.NET/Makefile | 8 ++++---- ReClass.NET_Launcher/Makefile | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 50b259f4..72130cd8 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,10 @@ clean_release: cd NativeCore/Unix && make clean_release rm -rf build/Release +test: + echo ${PWD} + echo ${USER} + update: cd ReClass.NET && make update @@ -37,12 +41,12 @@ docker_all: docker_debug: cd ReClass.NET_Launcher && make docker_debug cd ReClass.NET && make docker_debug - docker container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make debug" + docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc:latest bash -c "cd NativeCore/Unix && make debug" docker_release: cd ReClass.NET_Launcher && make docker_release cd ReClass.NET && make docker_release - docker container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make release" + docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc:latest bash -c "cd NativeCore/Unix && make release" podman_all: make podman_debug diff --git a/ReClass.NET/Makefile b/ReClass.NET/Makefile index 779202bd..d66fd569 100644 --- a/ReClass.NET/Makefile +++ b/ReClass.NET/Makefile @@ -22,12 +22,12 @@ update: mono --runtime=v4.0 ../Dependencies/nuget.exe restore ReClass.NET.csproj -SolutionDirectory ../ docker_debug: - podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj" - podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x64 ReClass.NET.csproj" docker_release: - podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj" - podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x86 ReClass.NET.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Release /p:Platform=x64 ReClass.NET.csproj" podman_debug: podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET && msbuild /p:Configuration=Debug /p:Platform=x86 ReClass.NET.csproj" diff --git a/ReClass.NET_Launcher/Makefile b/ReClass.NET_Launcher/Makefile index 0a121e0d..bc9ddd11 100644 --- a/ReClass.NET_Launcher/Makefile +++ b/ReClass.NET_Launcher/Makefile @@ -17,10 +17,10 @@ clean_release: msbuild /t:Clean ReClass.NET_Launcher.csproj docker_debug: - docker container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj" docker_release: - docker container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Release ReClass.NET_Launcher.csproj" + docker container run --rm -v ${PWD}/..:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Release ReClass.NET_Launcher.csproj" podman_debug: podman container run --rm -v ${PWD}/..:/build:z -w /build mono:latest bash -c "cd ReClass.NET_Launcher && msbuild /p:Configuration=Debug ReClass.NET_Launcher.csproj" From 1816cbee5c6796bebf0e039f57357064810ea3b1 Mon Sep 17 00:00:00 2001 From: ko1N Date: Thu, 5 Nov 2020 10:12:27 +0100 Subject: [PATCH 743/777] Removed test block from Makefile --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index 72130cd8..10ab0620 100644 --- a/Makefile +++ b/Makefile @@ -26,10 +26,6 @@ clean_release: cd NativeCore/Unix && make clean_release rm -rf build/Release -test: - echo ${PWD} - echo ${USER} - update: cd ReClass.NET && make update From 726b6ab444ef004fe77add0f1a99c5f22dca96b4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 9 Nov 2020 00:06:28 +0100 Subject: [PATCH 744/777] Auto scale plugin images. --- ReClass.NET/Forms/PluginForm.Designer.cs | 91 ++++++++++++------------ ReClass.NET/Forms/PluginForm.cs | 2 +- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/ReClass.NET/Forms/PluginForm.Designer.cs b/ReClass.NET/Forms/PluginForm.Designer.cs index 86a82777..c1df5042 100644 --- a/ReClass.NET/Forms/PluginForm.Designer.cs +++ b/ReClass.NET/Forms/PluginForm.Designer.cs @@ -35,17 +35,17 @@ private void InitializeComponent() this.descriptionGroupBox = new System.Windows.Forms.GroupBox(); this.descriptionLabel = new System.Windows.Forms.Label(); this.pluginsDataGridView = new System.Windows.Forms.DataGridView(); - this.iconColumn = new System.Windows.Forms.DataGridViewImageColumn(); - this.nameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.versionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.authorColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.nativesTabPage = new System.Windows.Forms.TabPage(); this.label2 = new System.Windows.Forms.Label(); this.functionsProvidersComboBox = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.getMoreLinkLabel = new System.Windows.Forms.LinkLabel(); this.closeButton = new System.Windows.Forms.Button(); - this.bannerBox = new BannerBox(); + this.bannerBox = new ReClassNET.Controls.BannerBox(); + this.iconColumn = new System.Windows.Forms.DataGridViewImageColumn(); + this.nameColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.versionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.authorColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.tabControl.SuspendLayout(); this.pluginsTabPage.SuspendLayout(); this.descriptionGroupBox.SuspendLayout(); @@ -119,43 +119,6 @@ private void InitializeComponent() this.pluginsDataGridView.TabIndex = 0; this.pluginsDataGridView.SelectionChanged += new System.EventHandler(this.pluginsDataGridView_SelectionChanged); // - // iconColumn - // - this.iconColumn.DataPropertyName = "Icon"; - this.iconColumn.HeaderText = ""; - this.iconColumn.MinimumWidth = 18; - this.iconColumn.Name = "iconColumn"; - this.iconColumn.ReadOnly = true; - this.iconColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True; - this.iconColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; - this.iconColumn.Width = 18; - // - // nameColumn - // - this.nameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.nameColumn.DataPropertyName = "Name"; - this.nameColumn.HeaderText = "Name"; - this.nameColumn.Name = "nameColumn"; - this.nameColumn.ReadOnly = true; - // - // versionColumn - // - this.versionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.versionColumn.DataPropertyName = "Version"; - this.versionColumn.HeaderText = "Version"; - this.versionColumn.Name = "versionColumn"; - this.versionColumn.ReadOnly = true; - this.versionColumn.Width = 67; - // - // authorColumn - // - this.authorColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; - this.authorColumn.DataPropertyName = "Author"; - this.authorColumn.HeaderText = "Author"; - this.authorColumn.Name = "authorColumn"; - this.authorColumn.ReadOnly = true; - this.authorColumn.Width = 63; - // // nativesTabPage // this.nativesTabPage.Controls.Add(this.label2); @@ -233,6 +196,44 @@ private void InitializeComponent() this.bannerBox.Text = "Here you can configure all loaded ReClass.NET plugins."; this.bannerBox.Title = "Plugins"; // + // iconColumn + // + this.iconColumn.DataPropertyName = "Icon"; + this.iconColumn.HeaderText = ""; + this.iconColumn.ImageLayout = System.Windows.Forms.DataGridViewImageCellLayout.Zoom; + this.iconColumn.MinimumWidth = 18; + this.iconColumn.Name = "iconColumn"; + this.iconColumn.ReadOnly = true; + this.iconColumn.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.iconColumn.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.iconColumn.Width = 18; + // + // nameColumn + // + this.nameColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.nameColumn.DataPropertyName = "Name"; + this.nameColumn.HeaderText = "Name"; + this.nameColumn.Name = "nameColumn"; + this.nameColumn.ReadOnly = true; + // + // versionColumn + // + this.versionColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.versionColumn.DataPropertyName = "Version"; + this.versionColumn.HeaderText = "Version"; + this.versionColumn.Name = "versionColumn"; + this.versionColumn.ReadOnly = true; + this.versionColumn.Width = 67; + // + // authorColumn + // + this.authorColumn.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.authorColumn.DataPropertyName = "Author"; + this.authorColumn.HeaderText = "Author"; + this.authorColumn.Name = "authorColumn"; + this.authorColumn.ReadOnly = true; + this.authorColumn.Width = 63; + // // PluginForm // this.AcceptButton = this.closeButton; @@ -273,12 +274,12 @@ private void InitializeComponent() private System.Windows.Forms.Button closeButton; private System.Windows.Forms.Label descriptionLabel; private System.Windows.Forms.Label label1; + private BannerBox bannerBox; + private System.Windows.Forms.ComboBox functionsProvidersComboBox; + private System.Windows.Forms.Label label2; private System.Windows.Forms.DataGridViewImageColumn iconColumn; private System.Windows.Forms.DataGridViewTextBoxColumn nameColumn; private System.Windows.Forms.DataGridViewTextBoxColumn versionColumn; private System.Windows.Forms.DataGridViewTextBoxColumn authorColumn; - private BannerBox bannerBox; - private System.Windows.Forms.ComboBox functionsProvidersComboBox; - private System.Windows.Forms.Label label2; } } \ No newline at end of file diff --git a/ReClass.NET/Forms/PluginForm.cs b/ReClass.NET/Forms/PluginForm.cs index c8493df2..81577f7f 100644 --- a/ReClass.NET/Forms/PluginForm.cs +++ b/ReClass.NET/Forms/PluginForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Diagnostics.Contracts; using System.Drawing; From ead9f20327da4ba4507ec687ee626fddb3b37836 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Tue, 10 Nov 2020 00:14:33 +0100 Subject: [PATCH 745/777] Removed methods which read structs from memory. This change is needed to add support for little/big endian support. Benchmarks have shown that the ReadObject method is faster for structs with more than six 4 byte fields. Only the matrix nodes have such big structures so this change speeds up all smaller reads. --- ReClass.NET/Memory/IRemoteMemoryReader.cs | 8 +- ReClass.NET/Memory/MemoryBuffer.cs | 17 ---- ReClass.NET/Memory/NodeDissector.cs | 20 +++-- ReClass.NET/Memory/RemoteProcess.cs | 13 +-- ReClass.NET/Memory/UnionDataType.cs | 19 ++--- ReClass.NET/Nodes/BaseMatrixNode.cs | 42 ++++++++-- ReClass.NET/Nodes/Hex16Node.cs | 2 +- ReClass.NET/Nodes/Hex32Node.cs | 11 ++- ReClass.NET/Nodes/Hex64Node.cs | 12 ++- ReClass.NET/Nodes/Matrix3x3Node.cs | 63 +-------------- ReClass.NET/Nodes/Matrix3x4Node.cs | 75 +----------------- ReClass.NET/Nodes/Matrix4x4Node.cs | 96 +---------------------- ReClass.NET/Nodes/Vector2Node.cs | 21 +---- ReClass.NET/Nodes/Vector3Node.cs | 25 +----- ReClass.NET/Nodes/Vector4Node.cs | 29 +------ 15 files changed, 85 insertions(+), 368 deletions(-) diff --git a/ReClass.NET/Memory/IRemoteMemoryReader.cs b/ReClass.NET/Memory/IRemoteMemoryReader.cs index b4f75544..3f926c82 100644 --- a/ReClass.NET/Memory/IRemoteMemoryReader.cs +++ b/ReClass.NET/Memory/IRemoteMemoryReader.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; namespace ReClassNET.Memory @@ -23,12 +23,6 @@ public interface IRemoteMemoryReader /// An array of bytes. byte[] ReadRemoteMemory(IntPtr address, int size); - /// Reads the object from the address in the remote process. - /// Type of the value to read. - /// The address to read from. - /// The remote object. - T ReadRemoteObject(IntPtr address) where T : struct; - /// Reads a from the address in the remote process. /// The address to read from. /// The data read as or 0 if the read fails. diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index f81b3885..52f874b5 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -133,23 +133,6 @@ public void ReadBytes(int offset, byte[] buffer) Array.Copy(data, offset, buffer, 0, buffer.Length); } - public T ReadObject(int offset) where T : struct - { - Contract.Requires(offset >= 0); - - offset = Offset + offset; - if (offset + Marshal.SizeOf(typeof(T)) > data.Length) - { - return default; - } - - var handle = GCHandle.Alloc(data, GCHandleType.Pinned); - var obj = Marshal.PtrToStructure(handle.AddrOfPinnedObject() + offset); - handle.Free(); - - return obj; - } - #region Read Primitive Types /// Reads a from the specific offset. diff --git a/ReClass.NET/Memory/NodeDissector.cs b/ReClass.NET/Memory/NodeDissector.cs index 3e103b16..e03b92e9 100644 --- a/ReClass.NET/Memory/NodeDissector.cs +++ b/ReClass.NET/Memory/NodeDissector.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -41,8 +41,15 @@ public static bool GuessNode(BaseHexNode node, IProcessReader reader, MemoryBuff return false; } - var data64 = memory.ReadObject(offset); - var data32 = memory.ReadObject(offset); + var data64 = new UInt64FloatDoubleData + { + Raw1 = memory.ReadInt32(offset), + Raw2 = memory.ReadInt32(offset + sizeof(int)) + }; ; + var data32 = new UInt32FloatData + { + Raw = memory.ReadInt32(offset) + }; var raw = memory.ReadBytes(offset, node.MemorySize); if (raw.InterpretAsSingleByteCharacter().IsLikelyPrintableData()) @@ -135,10 +142,9 @@ private static bool GuessPointerNode(IntPtr address, IProcessReader process, out if (section.Category == SectionCategory.DATA || section.Category == SectionCategory.HEAP) // If the section contains data, it is at least a pointer to a class or something. { // Check if it is a vtable. Check if the first 3 values are pointers to a code section. - var possibleVmt = process.ReadRemoteObject(address); - if (process.GetSectionToPointer(possibleVmt.Pointer1)?.Category == SectionCategory.CODE - && process.GetSectionToPointer(possibleVmt.Pointer2)?.Category == SectionCategory.CODE - && process.GetSectionToPointer(possibleVmt.Pointer3)?.Category == SectionCategory.CODE) + if (process.GetSectionToPointer(process.ReadRemoteIntPtr(address))?.Category == SectionCategory.CODE + && process.GetSectionToPointer(process.ReadRemoteIntPtr(address + IntPtr.Size))?.Category == SectionCategory.CODE + && process.GetSectionToPointer(process.ReadRemoteIntPtr(address + 2 * IntPtr.Size))?.Category == SectionCategory.CODE) { node = new VirtualMethodTableNode(); diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 14337cf9..b23286c0 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -185,17 +185,6 @@ public byte[] ReadRemoteMemory(IntPtr address, int size) return data; } - public T ReadRemoteObject(IntPtr address) where T : struct - { - var data = ReadRemoteMemory(address, Marshal.SizeOf()); - - var gcHandle = GCHandle.Alloc(data, GCHandleType.Pinned); - var obj = (T)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(T)); - gcHandle.Free(); - - return obj; - } - #region Read Remote Primitive Types public sbyte ReadRemoteInt8(IntPtr address) diff --git a/ReClass.NET/Memory/UnionDataType.cs b/ReClass.NET/Memory/UnionDataType.cs index 3c53b48b..36a47a7e 100644 --- a/ReClass.NET/Memory/UnionDataType.cs +++ b/ReClass.NET/Memory/UnionDataType.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace ReClassNET.Memory @@ -26,6 +26,9 @@ public struct UInt16Data [StructLayout(LayoutKind.Explicit)] public struct UInt32FloatData { + [FieldOffset(0)] + public int Raw; + [FieldOffset(0)] public int IntValue; @@ -43,6 +46,12 @@ public struct UInt32FloatData [StructLayout(LayoutKind.Explicit)] public struct UInt64FloatDoubleData { + [FieldOffset(0)] + public int Raw1; + + [FieldOffset(4)] + public int Raw2; + [FieldOffset(0)] public long LongValue; @@ -69,12 +78,4 @@ public struct UInt64FloatDoubleData [FieldOffset(0)] public double DoubleValue; } - - [StructLayout(LayoutKind.Sequential)] - public struct ThreePointersData - { - public IntPtr Pointer1; - public IntPtr Pointer2; - public IntPtr Pointer3; - } } diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index d97d7bc0..d080b08d 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.Controls; @@ -17,11 +18,10 @@ protected BaseMatrixNode() protected delegate void DrawMatrixValues(int x, ref int maxX, ref int y); - protected Size DrawMatrixType(DrawContext context, int x, int y, string type, DrawMatrixValues drawValues) + protected Size DrawMatrixType(DrawContext context, int x, int y, string type, int rows, int columns) { Contract.Requires(context != null); Contract.Requires(type != null); - Contract.Requires(drawValues != null); if (IsHidden && !IsWrapped) { @@ -58,18 +58,36 @@ protected Size DrawMatrixType(DrawContext context, int x, int y, string type, Dr if (LevelsOpen[context.Level]) { - drawValues(tx, ref x, ref y); + var index = 0; + for (var row = 0; row < rows; ++row) + { + y += context.Font.Height; + var x2 = tx; + + x2 = AddText(context, x2, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + + for (var column = 0; column < columns; ++column) + { + var value = context.Memory.ReadFloat(Offset + index * sizeof(float)); + x2 = AddText(context, x2, y, context.Settings.ValueColor, index, $"{value,14:0.000}"); + + index++; + } + + x2 = AddText(context, x2, y, context.Settings.NameColor, HotSpot.NoneId, "|"); + + x = Math.Max(x2, x); + } } return new Size(x - origX, y - origY + context.Font.Height); } protected delegate void DrawVectorValues(ref int x, ref int y); - protected Size DrawVectorType(DrawContext context, int x, int y, string type, DrawVectorValues drawValues) + protected Size DrawVectorType(DrawContext context, int x, int y, string type, int columns) { Contract.Requires(context != null); Contract.Requires(type != null); - Contract.Requires(drawValues != null); if (IsHidden && !IsWrapped) { @@ -97,7 +115,19 @@ protected Size DrawVectorType(DrawContext context, int x, int y, string type, Dr if (LevelsOpen[context.Level]) { - drawValues(ref x, ref y); + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); + for (var column = 0; column < columns; ++column) + { + var value = context.Memory.ReadFloat(Offset + column * sizeof(float)); + + x = AddText(context, x, y, context.Settings.ValueColor, column, $"{value:0.000}"); + + if (column < columns - 1) + { + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); + } + } + x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); } x += context.Font.Width; diff --git a/ReClass.NET/Nodes/Hex16Node.cs b/ReClass.NET/Nodes/Hex16Node.cs index c567bda6..2e18994a 100644 --- a/ReClass.NET/Nodes/Hex16Node.cs +++ b/ReClass.NET/Nodes/Hex16Node.cs @@ -17,7 +17,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override string GetToolTipText(HotSpot spot) { - var value = spot.Memory.ReadObject(Offset); + var value = new UInt16Data { ShortValue = spot.Memory.ReadInt16(Offset) }; return $"Int16: {value.ShortValue}\nUInt16: 0x{value.UShortValue:X04}"; } diff --git a/ReClass.NET/Nodes/Hex32Node.cs b/ReClass.NET/Nodes/Hex32Node.cs index b58567fb..c7b54027 100644 --- a/ReClass.NET/Nodes/Hex32Node.cs +++ b/ReClass.NET/Nodes/Hex32Node.cs @@ -18,7 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { - var value = spot.Memory.ReadObject(Offset); + var value = ReadFromBuffer(spot.Memory, Offset); address = value.IntPtr; @@ -27,7 +27,7 @@ public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) public override string GetToolTipText(HotSpot spot) { - var value = spot.Memory.ReadObject(Offset); + var value = ReadFromBuffer(spot.Memory, Offset); return $"Int32: {value.IntValue}\nUInt32: 0x{value.UIntValue:X08}\nFloat: {value.FloatValue:0.000}"; } @@ -46,11 +46,16 @@ protected override int AddComment(DrawContext context, int x, int y) { x = base.AddComment(context, x, y); - var value = context.Memory.ReadObject(Offset); + var value = ReadFromBuffer(context.Memory, Offset); x = AddComment(context, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); return x; } + + private static UInt32FloatData ReadFromBuffer(MemoryBuffer memory, int offset) => new UInt32FloatData + { + Raw = memory.ReadInt32(offset) + }; } } diff --git a/ReClass.NET/Nodes/Hex64Node.cs b/ReClass.NET/Nodes/Hex64Node.cs index 3cacf264..d54f1e71 100644 --- a/ReClass.NET/Nodes/Hex64Node.cs +++ b/ReClass.NET/Nodes/Hex64Node.cs @@ -18,7 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) { - var value = spot.Memory.ReadObject(Offset); + var value = ReadFromBuffer(spot.Memory, Offset); address = value.IntPtr; @@ -27,7 +27,7 @@ public override bool UseMemoryPreviewToolTip(HotSpot spot, out IntPtr address) public override string GetToolTipText(HotSpot spot) { - var value = spot.Memory.ReadObject(Offset); + var value = ReadFromBuffer(spot.Memory, Offset); return $"Int64: {value.LongValue}\nUInt64: 0x{value.ULongValue:X016}\nFloat: {value.FloatValue:0.000}\nDouble: {value.DoubleValue:0.000}"; } @@ -46,11 +46,17 @@ protected override int AddComment(DrawContext context, int x, int y) { x = base.AddComment(context, x, y); - var value = context.Memory.ReadObject(Offset); + var value = ReadFromBuffer(context.Memory, Offset); x = AddComment(context, x, y, value.FloatValue, value.IntPtr, value.UIntPtr); return x; } + + private static UInt64FloatDoubleData ReadFromBuffer(MemoryBuffer memory, int offset) => new UInt64FloatDoubleData + { + Raw1 = memory.ReadInt32(offset), + Raw2 = memory.ReadInt32(offset + sizeof(int)) + }; } } diff --git a/ReClass.NET/Nodes/Matrix3x3Node.cs b/ReClass.NET/Nodes/Matrix3x3Node.cs index 91a212b9..37bc1802 100644 --- a/ReClass.NET/Nodes/Matrix3x3Node.cs +++ b/ReClass.NET/Nodes/Matrix3x3Node.cs @@ -1,6 +1,4 @@ -using System; using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -8,29 +6,6 @@ namespace ReClassNET.Nodes { public class Matrix3x3Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Matrix3x3Data - { - [FieldOffset(0)] - public readonly float _11; - [FieldOffset(4)] - public readonly float _12; - [FieldOffset(8)] - public readonly float _13; - [FieldOffset(12)] - public readonly float _21; - [FieldOffset(16)] - public readonly float _22; - [FieldOffset(20)] - public readonly float _23; - [FieldOffset(24)] - public readonly float _31; - [FieldOffset(28)] - public readonly float _32; - [FieldOffset(32)] - public readonly float _33; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 9 * ValueTypeSize; @@ -43,43 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(context, x2, y2, "Matrix (3x3)", (int defaultX, ref int maxX, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - y += context.Font.Height; - var x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._21,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._22,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._23,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._31,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._32,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._33,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - }); + return DrawMatrixType(context, x2, y2, "Matrix (3x3)", 3, 3); } protected override int CalculateValuesHeight(DrawContext context) diff --git a/ReClass.NET/Nodes/Matrix3x4Node.cs b/ReClass.NET/Nodes/Matrix3x4Node.cs index 8a5969c0..96948064 100644 --- a/ReClass.NET/Nodes/Matrix3x4Node.cs +++ b/ReClass.NET/Nodes/Matrix3x4Node.cs @@ -1,6 +1,4 @@ -using System; using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -8,35 +6,6 @@ namespace ReClassNET.Nodes { public class Matrix3x4Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Matrix3x4Data - { - [FieldOffset(0)] - public readonly float _11; - [FieldOffset(4)] - public readonly float _12; - [FieldOffset(8)] - public readonly float _13; - [FieldOffset(12)] - public readonly float _14; - [FieldOffset(16)] - public readonly float _21; - [FieldOffset(20)] - public readonly float _22; - [FieldOffset(24)] - public readonly float _23; - [FieldOffset(28)] - public readonly float _24; - [FieldOffset(32)] - public readonly float _31; - [FieldOffset(36)] - public readonly float _32; - [FieldOffset(40)] - public readonly float _33; - [FieldOffset(44)] - public readonly float _34; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 12 * ValueTypeSize; @@ -49,49 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(context, x2, y2, "Matrix (3x4)", (int defaultX, ref int maxX, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - y += context.Font.Height; - var x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._21,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._22,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._23,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._31,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 9, $"{value._32,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 10, $"{value._33,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - }); + return DrawMatrixType(context, x2, y2, "Matrix (3x4)", 3, 4); } protected override int CalculateValuesHeight(DrawContext context) diff --git a/ReClass.NET/Nodes/Matrix4x4Node.cs b/ReClass.NET/Nodes/Matrix4x4Node.cs index d8c022f9..69318694 100644 --- a/ReClass.NET/Nodes/Matrix4x4Node.cs +++ b/ReClass.NET/Nodes/Matrix4x4Node.cs @@ -1,6 +1,4 @@ -using System; using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -8,43 +6,6 @@ namespace ReClassNET.Nodes { public class Matrix4x4Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Matrix4x4Data - { - [FieldOffset(0)] - public readonly float _11; - [FieldOffset(4)] - public readonly float _12; - [FieldOffset(8)] - public readonly float _13; - [FieldOffset(12)] - public readonly float _14; - [FieldOffset(16)] - public readonly float _21; - [FieldOffset(20)] - public readonly float _22; - [FieldOffset(24)] - public readonly float _23; - [FieldOffset(28)] - public readonly float _24; - [FieldOffset(32)] - public readonly float _31; - [FieldOffset(36)] - public readonly float _32; - [FieldOffset(40)] - public readonly float _33; - [FieldOffset(44)] - public readonly float _34; - [FieldOffset(48)] - public readonly float _41; - [FieldOffset(52)] - public readonly float _42; - [FieldOffset(56)] - public readonly float _43; - [FieldOffset(60)] - public readonly float _44; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 16 * ValueTypeSize; @@ -57,62 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawMatrixType(context, x2, y2, "Matrix (4x4)", (int defaultX, ref int maxX, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - y += context.Font.Height; - var x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value._11,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value._12,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value._13,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value._14,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 4, $"{value._21,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 5, $"{value._22,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 6, $"{value._23,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 7, $"{value._24,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 8, $"{value._31,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 9, $"{value._32,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 10, $"{value._33,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 11, $"{value._34,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - - y += context.Font.Height; - x = defaultX; - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - x = AddText(context, x, y, context.Settings.ValueColor, 12, $"{value._41,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 13, $"{value._42,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 14, $"{value._43,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 15, $"{value._44,14:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "|"); - maxX = Math.Max(x, maxX); - }); + return DrawMatrixType(context, x2, y2, "Matrix (4x4)", 4, 4); } protected override int CalculateValuesHeight(DrawContext context) diff --git a/ReClass.NET/Nodes/Vector2Node.cs b/ReClass.NET/Nodes/Vector2Node.cs index a9e876d6..a3df104a 100644 --- a/ReClass.NET/Nodes/Vector2Node.cs +++ b/ReClass.NET/Nodes/Vector2Node.cs @@ -1,5 +1,4 @@ using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -7,15 +6,6 @@ namespace ReClassNET.Nodes { public class Vector2Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Vector2Data - { - [FieldOffset(0)] - public readonly float X; - [FieldOffset(4)] - public readonly float Y; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 2 * ValueTypeSize; @@ -28,16 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(context, x2, y2, "Vector2", (ref int x, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); - }); + return DrawVectorType(context, x2, y2, "Vector2", 2); } protected override int CalculateValuesHeight(DrawContext context) diff --git a/ReClass.NET/Nodes/Vector3Node.cs b/ReClass.NET/Nodes/Vector3Node.cs index 8f49111a..b2b84b25 100644 --- a/ReClass.NET/Nodes/Vector3Node.cs +++ b/ReClass.NET/Nodes/Vector3Node.cs @@ -1,5 +1,4 @@ using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -7,17 +6,6 @@ namespace ReClassNET.Nodes { public class Vector3Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Vector3Data - { - [FieldOffset(0)] - public readonly float X; - [FieldOffset(4)] - public readonly float Y; - [FieldOffset(8)] - public readonly float Z; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 3 * ValueTypeSize; @@ -30,18 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(context, x2, y2, "Vector3", (ref int x, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value.Z:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); - }); + return DrawVectorType(context, x2, y2, "Vector3", 3); } protected override int CalculateValuesHeight(DrawContext context) diff --git a/ReClass.NET/Nodes/Vector4Node.cs b/ReClass.NET/Nodes/Vector4Node.cs index 7321d1d3..54f1a43c 100644 --- a/ReClass.NET/Nodes/Vector4Node.cs +++ b/ReClass.NET/Nodes/Vector4Node.cs @@ -1,5 +1,4 @@ using System.Drawing; -using System.Runtime.InteropServices; using ReClassNET.Controls; using ReClassNET.UI; @@ -7,19 +6,6 @@ namespace ReClassNET.Nodes { public class Vector4Node : BaseMatrixNode { - [StructLayout(LayoutKind.Explicit)] - private readonly struct Vector4Data - { - [FieldOffset(0)] - public readonly float X; - [FieldOffset(4)] - public readonly float Y; - [FieldOffset(8)] - public readonly float Z; - [FieldOffset(12)] - public readonly float W; - } - public override int ValueTypeSize => sizeof(float); public override int MemorySize => 4 * ValueTypeSize; @@ -32,20 +18,7 @@ public override void GetUserInterfaceInfo(out string name, out Image icon) public override Size Draw(DrawContext context, int x2, int y2) { - return DrawVectorType(context, x2, y2, "Vector4", (ref int x, ref int y) => - { - var value = context.Memory.ReadObject(Offset); - - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, "("); - x = AddText(context, x, y, context.Settings.ValueColor, 0, $"{value.X:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 1, $"{value.Y:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 2, $"{value.Z:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ","); - x = AddText(context, x, y, context.Settings.ValueColor, 3, $"{value.W:0.000}"); - x = AddText(context, x, y, context.Settings.NameColor, HotSpot.NoneId, ")"); - }); + return DrawVectorType(context, x2, y2, "Vector4", 4); } protected override int CalculateValuesHeight(DrawContext context) From 64b947998021dd7fb7bd51723f15147fb4d275c4 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Nov 2020 18:19:25 +0100 Subject: [PATCH 746/777] Use switch expressions. --- .../Comparer/ByteMemoryComparer.cs | 86 +++++--------- .../Comparer/DoubleMemoryComparer.cs | 111 ++++++------------ .../Comparer/FloatMemoryComparer.cs | 111 ++++++------------ .../Comparer/IntegerMemoryComparer.cs | 86 +++++--------- .../Comparer/LongMemoryComparer.cs | 86 +++++--------- .../Comparer/ShortMemoryComparer.cs | 86 +++++--------- 6 files changed, 184 insertions(+), 382 deletions(-) diff --git a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs index 0c376e9a..10efe5cc 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ByteMemoryComparer.cs @@ -23,31 +23,18 @@ public bool Compare(byte[] data, int index, out ScanResult result) return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); @@ -67,42 +54,23 @@ public bool Compare(byte[] data, int index, ByteScanResult previous, out ScanRes return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index 1a7c7dc5..22ea04e1 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -31,20 +31,14 @@ public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType maxValue = value1 + 1.0 / factor; } - private bool CheckRoundedEquality(double value) + private bool CheckRoundedEquality(double value) => + RoundType switch { - switch (RoundType) - { - case ScanRoundMode.Strict: - return Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001); - case ScanRoundMode.Normal: - return minValue < value && value < maxValue; - case ScanRoundMode.Truncate: - return (long)value == (long)Value1; - default: - throw new ArgumentOutOfRangeException(); - } - } + ScanRoundMode.Strict => Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001), + ScanRoundMode.Normal => minValue < value && value < maxValue, + ScanRoundMode.Truncate => (long)value == (long)Value1, + _ => throw new ArgumentOutOfRangeException() + }; public bool Compare(byte[] data, int index, out ScanResult result) { @@ -52,32 +46,20 @@ public bool Compare(byte[] data, int index, out ScanResult result) var value = BitConverter.ToDouble(data, index); - bool IsMatch() + bool IsMatch() => + CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return CheckRoundedEquality(value); - case ScanCompareType.NotEqual: - return !CheckRoundedEquality(value); - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } + ScanCompareType.Equal => CheckRoundedEquality(value), + ScanCompareType.NotEqual => !CheckRoundedEquality(value), + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) + }; if (!IsMatch()) { @@ -104,42 +86,25 @@ public bool Compare(byte[] data, int index, DoubleScanResult previous, out ScanR var value = BitConverter.ToDouble(data, index); - bool IsMatch() + bool IsMatch() => + CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return CheckRoundedEquality(value); - case ScanCompareType.NotEqual: - return !CheckRoundedEquality(value); - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } - } + ScanCompareType.Equal => CheckRoundedEquality(value), + ScanCompareType.NotEqual => !CheckRoundedEquality(value), + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + _ => throw new InvalidCompareTypeException(CompareType) + }; if (!IsMatch()) { diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index 3e529422..abf9118d 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -31,20 +31,14 @@ public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, maxValue = value1 + 1.0f / factor; } - private bool CheckRoundedEquality(float value) + private bool CheckRoundedEquality(float value) => + RoundType switch { - switch (RoundType) - { - case ScanRoundMode.Strict: - return Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001f); - case ScanRoundMode.Normal: - return minValue < value && value < maxValue; - case ScanRoundMode.Truncate: - return (int)value == (int)Value1; - default: - throw new ArgumentOutOfRangeException(); - } - } + ScanRoundMode.Strict => Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001f), + ScanRoundMode.Normal => minValue < value && value < maxValue, + ScanRoundMode.Truncate => (int)value == (int)Value1, + _ => throw new ArgumentOutOfRangeException() + }; public bool Compare(byte[] data, int index, out ScanResult result) { @@ -52,32 +46,20 @@ public bool Compare(byte[] data, int index, out ScanResult result) var value = BitConverter.ToSingle(data, index); - bool IsMatch() + bool IsMatch() => + CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return CheckRoundedEquality(value); - case ScanCompareType.NotEqual: - return !CheckRoundedEquality(value); - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } - } + ScanCompareType.Equal => CheckRoundedEquality(value), + ScanCompareType.NotEqual => !CheckRoundedEquality(value), + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) + }; if (!IsMatch()) { @@ -104,42 +86,25 @@ public bool Compare(byte[] data, int index, FloatScanResult previous, out ScanRe var value = BitConverter.ToSingle(data, index); - bool IsMatch() + bool IsMatch() => + CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return CheckRoundedEquality(value); - case ScanCompareType.NotEqual: - return !CheckRoundedEquality(value); - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - default: - throw new InvalidCompareTypeException(CompareType); - } - } + ScanCompareType.Equal => CheckRoundedEquality(value), + ScanCompareType.NotEqual => !CheckRoundedEquality(value), + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + _ => throw new InvalidCompareTypeException(CompareType) + }; if (!IsMatch()) { diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index a55e074e..1935accf 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -23,31 +23,18 @@ public bool Compare(byte[] data, int index, out ScanResult result) return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); @@ -67,42 +54,23 @@ public bool Compare(byte[] data, int index, IntegerScanResult previous, out Scan return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index 75c15945..3b1172cf 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -23,31 +23,18 @@ public bool Compare(byte[] data, int index, out ScanResult result) return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); @@ -67,42 +54,23 @@ public bool Compare(byte[] data, int index, LongScanResult previous, out ScanRes return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index 1754ff23..5cdfbad0 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -23,31 +23,18 @@ public bool Compare(byte[] data, int index, out ScanResult result) return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - case ScanCompareType.Unknown: - return true; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Unknown => true, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); @@ -67,42 +54,23 @@ public bool Compare(byte[] data, int index, ShortScanResult previous, out ScanRe return CompareInternal( data, index, - value => + value => CompareType switch { - switch (CompareType) - { - case ScanCompareType.Equal: - return value == Value1; - case ScanCompareType.NotEqual: - return value != Value1; - case ScanCompareType.GreaterThan: - return value > Value1; - case ScanCompareType.GreaterThanOrEqual: - return value >= Value1; - case ScanCompareType.LessThan: - return value < Value1; - case ScanCompareType.LessThanOrEqual: - return value <= Value1; - case ScanCompareType.Between: - return Value1 < value && value < Value2; - case ScanCompareType.BetweenOrEqual: - return Value1 <= value && value <= Value2; - - case ScanCompareType.Changed: - return value != previous.Value; - case ScanCompareType.NotChanged: - return value == previous.Value; - case ScanCompareType.Increased: - return value > previous.Value; - case ScanCompareType.IncreasedOrEqual: - return value >= previous.Value; - case ScanCompareType.Decreased: - return value < previous.Value; - case ScanCompareType.DecreasedOrEqual: - return value <= previous.Value; - default: - throw new InvalidCompareTypeException(CompareType); - } + ScanCompareType.Equal => value == Value1, + ScanCompareType.NotEqual => value != Value1, + ScanCompareType.GreaterThan => value > Value1, + ScanCompareType.GreaterThanOrEqual => value >= Value1, + ScanCompareType.LessThan => value < Value1, + ScanCompareType.LessThanOrEqual => value <= Value1, + ScanCompareType.Between => Value1 < value && value < Value2, + ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, + ScanCompareType.Changed => value != previous.Value, + ScanCompareType.NotChanged => value == previous.Value, + ScanCompareType.Increased => value > previous.Value, + ScanCompareType.IncreasedOrEqual => value >= previous.Value, + ScanCompareType.Decreased => value < previous.Value, + ScanCompareType.DecreasedOrEqual => value <= previous.Value, + _ => throw new InvalidCompareTypeException(CompareType) }, out result ); From e611be53e59f9cdab5b0f0439c2cb774bdeef18f Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Nov 2020 18:27:21 +0100 Subject: [PATCH 747/777] Match other comparer logic. --- .../Comparer/DoubleMemoryComparer.cs | 46 +++++++++---------- .../Comparer/FloatMemoryComparer.cs | 46 +++++++++---------- 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index 22ea04e1..b8428041 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -42,12 +42,10 @@ private bool CheckRoundedEquality(double value) => public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = BitConverter.ToDouble(data, index); - - bool IsMatch() => - CompareType switch + return CompareInternal( + data, + index, + value => CompareType switch { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), @@ -59,18 +57,11 @@ bool IsMatch() => ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, ScanCompareType.Unknown => true, _ => throw new InvalidCompareTypeException(CompareType) - }; - - if (!IsMatch()) - { - return false; + }, + out result + ); } - result = new DoubleScanResult(value); - - return true; - } - public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG @@ -82,12 +73,10 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult public bool Compare(byte[] data, int index, DoubleScanResult previous, out ScanResult result) { - result = null; - - var value = BitConverter.ToDouble(data, index); - - bool IsMatch() => - CompareType switch + return CompareInternal( + data, + index, + value => CompareType switch { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), @@ -104,9 +93,18 @@ bool IsMatch() => ScanCompareType.Between => Value1 < value && value < Value2, ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, _ => throw new InvalidCompareTypeException(CompareType) - }; + }, + out result + ); + } + + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + { + result = null; + + var value = BitConverter.ToDouble(data, index); - if (!IsMatch()) + if (!matcher(value)) { return false; } diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index abf9118d..27c8dd13 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -42,12 +42,10 @@ private bool CheckRoundedEquality(float value) => public bool Compare(byte[] data, int index, out ScanResult result) { - result = null; - - var value = BitConverter.ToSingle(data, index); - - bool IsMatch() => - CompareType switch + return CompareInternal( + data, + index, + value => CompareType switch { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), @@ -59,18 +57,11 @@ bool IsMatch() => ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, ScanCompareType.Unknown => true, _ => throw new InvalidCompareTypeException(CompareType) - }; - - if (!IsMatch()) - { - return false; + }, + out result + ); } - result = new FloatScanResult(value); - - return true; - } - public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { #if DEBUG @@ -82,12 +73,10 @@ public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult public bool Compare(byte[] data, int index, FloatScanResult previous, out ScanResult result) { - result = null; - - var value = BitConverter.ToSingle(data, index); - - bool IsMatch() => - CompareType switch + return CompareInternal( + data, + index, + value => CompareType switch { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), @@ -104,9 +93,18 @@ bool IsMatch() => ScanCompareType.Between => Value1 < value && value < Value2, ScanCompareType.BetweenOrEqual => Value1 <= value && value <= Value2, _ => throw new InvalidCompareTypeException(CompareType) - }; + }, + out result + ); + } + + private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + { + result = null; + + var value = BitConverter.ToSingle(data, index); - if (!IsMatch()) + if (!matcher(value)) { return false; } From 82b9db37f3e6f27c7dcea63a791874a2bcf8a041 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Nov 2020 20:06:23 +0100 Subject: [PATCH 748/777] Fixed padding to next node. --- ReClass.NET/Nodes/BitFieldNode.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 7255e0e3..8f302fda 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -171,7 +171,7 @@ public override Size Draw(DrawContext context, int x, int y) } } - y += 2; + y += 8; } return new Size(x - origX, y - origY + context.Font.Height); @@ -187,7 +187,7 @@ public override int CalculateDrawnHeight(DrawContext context) var height = context.Font.Height; if (LevelsOpen[context.Level]) { - height += context.Font.Height + 2; + height += context.Font.Height + 8; } return height; } From 6547cc1b3572f66cc0dbfaeb77d26dda091c3428 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 11 Nov 2020 20:30:08 +0100 Subject: [PATCH 749/777] Replaced NodeUuid with Guid. --- .../ReClass/ReClassNetFile.Read.cs | 14 +- .../ReClass/ReClassNetFile.Write.cs | 11 +- ReClass.NET/Nodes/ClassNode.cs | 14 +- ReClass.NET/Nodes/NodeUuid.cs | 206 ------------------ ReClass.NET/Project/ReClassNetProject.cs | 6 +- ReClass.NET/ReClass.NET.csproj | 3 +- 6 files changed, 22 insertions(+), 232 deletions(-) delete mode 100644 ReClass.NET/Nodes/NodeUuid.cs diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs index 228e5178..4a3cb65d 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Read.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; @@ -104,7 +104,7 @@ public void Load(Stream input, ILogger logger) { var node = new ClassNode(false) { - Uuid = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true), + Uuid = ParseUuid(element.Attribute(XmlUuidAttribute)?.Value), Name = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty, Comment = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty, AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty @@ -173,7 +173,7 @@ BaseNode CreateNode() { ClassNode GetClassNodeFromElementReference() { - var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); + var reference = ParseUuid(element.Attribute(XmlReferenceAttribute)?.Value); if (!project.ContainsClass(reference)) { logger.Log(LogLevel.Error, $"Skipping node with unknown reference: {reference}"); @@ -286,7 +286,7 @@ ClassNode GetClassNodeFromElementReference() { functionNode.Signature = element.Attribute(XmlSignatureAttribute)?.Value ?? string.Empty; - var reference = NodeUuid.FromBase64String(element.Attribute(XmlReferenceAttribute)?.Value, false); + var reference = ParseUuid(element.Attribute(XmlReferenceAttribute)?.Value); if (project.ContainsClass(reference)) { functionNode.BelongsToClass = project.GetClassByUuid(reference); @@ -306,6 +306,12 @@ ClassNode GetClassNodeFromElementReference() return node; } + private static Guid ParseUuid(string raw) => raw == null + ? throw new ArgumentNullException() + : raw.Length == 24 + ? new Guid(Convert.FromBase64String(raw)) + : Guid.Parse(raw); + public static Tuple, List> DeserializeNodesFromStream(Stream input, ReClassNetProject templateProject, ILogger logger) { Contract.Requires(input != null); diff --git a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs index 65f9040b..1d33ebc5 100644 --- a/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs +++ b/ReClass.NET/DataExchange/ReClass/ReClassNetFile.Write.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; using System.IO.Compression; @@ -67,7 +68,7 @@ private static IEnumerable CreateClassElements(IEnumerable return classes.Select(c => new XElement( XmlClassElement, - new XAttribute(XmlUuidAttribute, c.Uuid.ToBase64String()), + new XAttribute(XmlUuidAttribute, c.Uuid), new XAttribute(XmlNameAttribute, c.Name ?? string.Empty), new XAttribute(XmlCommentAttribute, c.Comment ?? string.Empty), new XAttribute(XmlAddressAttribute, c.AddressFormula ?? string.Empty), @@ -118,7 +119,7 @@ XElement CreateElement() { if (node is BaseClassWrapperNode classWrapperNode) { - element.SetAttributeValue(XmlReferenceAttribute, ((ClassNode)classWrapperNode.InnerNode).Uuid.ToBase64String()); + element.SetAttributeValue(XmlReferenceAttribute, ((ClassNode)classWrapperNode.InnerNode).Uuid); } else if (wrapperNode.InnerNode != null) { @@ -160,8 +161,8 @@ XElement CreateElement() } case FunctionNode functionNode: { - var uuid = functionNode.BelongsToClass == null ? NodeUuid.Zero : functionNode.BelongsToClass.Uuid; - element.SetAttributeValue(XmlReferenceAttribute, uuid.ToBase64String()); + var uuid = functionNode.BelongsToClass?.Uuid ?? Guid.Empty; + element.SetAttributeValue(XmlReferenceAttribute, uuid); element.SetAttributeValue(XmlSignatureAttribute, functionNode.Signature); break; } diff --git a/ReClass.NET/Nodes/ClassNode.cs b/ReClass.NET/Nodes/ClassNode.cs index 2125e8e9..9b144061 100644 --- a/ReClass.NET/Nodes/ClassNode.cs +++ b/ReClass.NET/Nodes/ClassNode.cs @@ -25,17 +25,7 @@ public class ClassNode : BaseContainerNode protected override bool ShouldCompensateSizeChanges => true; - private NodeUuid uuid; - public NodeUuid Uuid - { - get => uuid; - set - { - Contract.Requires(value != null); - - uuid = value; - } - } + public Guid Uuid { get; set; } public string AddressFormula { get; set; } = DefaultAddressFormula; @@ -47,7 +37,7 @@ internal ClassNode(bool notifyClassCreated) LevelsOpen.DefaultValue = true; - Uuid = new NodeUuid(true); + Uuid = Guid.NewGuid(); if (notifyClassCreated) { diff --git a/ReClass.NET/Nodes/NodeUuid.cs b/ReClass.NET/Nodes/NodeUuid.cs deleted file mode 100644 index 3eddf506..00000000 --- a/ReClass.NET/Nodes/NodeUuid.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System; -using System.Diagnostics.Contracts; - -namespace ReClassNET.Nodes -{ - public sealed class NodeUuid : IComparable, IEquatable - { - /// Size in bytes of a UUID. - public const int UuidSize = 16; - - /// Zero UUID (all bytes are zero). - public static readonly NodeUuid Zero = new NodeUuid(false); - - /// The maximum reserved UUID value. - private static readonly NodeUuid maxReserved = new NodeUuid(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }); - - /// Checks if the given UUID is reserved. - /// The uuid. - /// True if reserved, false if not. - public static bool IsReserved(NodeUuid uuid) - { - Contract.Requires(uuid != null); - - return uuid.CompareTo(maxReserved) <= 0; - } - - private byte[] uuidBytes; - private readonly int uuidHash; - - /// Get the 16 UUID bytes. - public byte[] UuidBytes => uuidBytes; - - /// Construct a new UUID object. - /// If this parameter is true, a new UUID is generated. - /// If it is false, the UUID is initialized to zero. - public NodeUuid(bool createNew) - { - Contract.Ensures(uuidBytes != null); - - if (createNew) - { - CreateNew(); - } - else - { - SetZero(); - } - - uuidHash = CalculateHash(); - } - - /// Construct a new UUID object. - /// Initial value of the object. - private NodeUuid(byte[] valueBytes) - { - Contract.Requires(valueBytes != null); - Contract.Requires(valueBytes.Length == UuidSize); - Contract.Ensures(uuidBytes != null); - - SetValue(valueBytes); - - uuidHash = CalculateHash(); - } - - public static NodeUuid FromBase64String(string base64, bool createNew) - { - try - { - if (base64 != null) - { - var bytes = Convert.FromBase64String(base64); - - if (bytes.Length == UuidSize) - { - return new NodeUuid(bytes); - } - } - } - catch (ArgumentNullException) - { - - } - - return new NodeUuid(createNew); - } - - /// Create a new, random UUID. - /// Returns true if a random UUID has been generated, otherwise it returns false. - private void CreateNew() - { - Contract.Ensures(uuidBytes != null); - - while (true) - { - uuidBytes = Guid.NewGuid().ToByteArray(); - - if (uuidBytes == null || uuidBytes.Length != UuidSize) - { - throw new InvalidOperationException(); - } - - // Do not generate reserved UUIDs. - if (!IsReserved(this)) - { - break; - } - } - } - - /// Sets the UUID to the given value. - /// Initial value of the object. - private void SetValue(byte[] valueBytes) - { - Contract.Requires(valueBytes != null); - Contract.Requires(valueBytes.Length == UuidSize); - Contract.Ensures(uuidBytes != null); - - uuidBytes = new byte[UuidSize]; - - Array.Copy(valueBytes, uuidBytes, UuidSize); - } - - /// Sets the UUID to zero. - private void SetZero() - { - Contract.Ensures(uuidBytes != null); - - uuidBytes = new byte[UuidSize]; - } - - public override bool Equals(object obj) - { - return Equals(obj as NodeUuid); - } - - public bool Equals(NodeUuid other) - { - if (other == null) - { - return false; - } - - for (var i = 0; i < UuidSize; ++i) - { - if (uuidBytes[i] != other.uuidBytes[i]) - { - return false; - } - } - - return true; - } - - private int CalculateHash() - { - var hash = 17; - unchecked - { - foreach (var b in uuidBytes) - { - hash = hash * 31 + b.GetHashCode(); - } - } - return hash; - } - - public override int GetHashCode() - { - return uuidHash; - } - - public int CompareTo(NodeUuid other) - { - for (var i = 0; i < UuidSize; ++i) - { - if (uuidBytes[i] < other.uuidBytes[i]) - { - return -1; - } - if (uuidBytes[i] > other.uuidBytes[i]) - { - return 1; - } - } - - return 0; - } - - public string ToBase64String() - { - return Convert.ToBase64String(uuidBytes); - } - - /// Convert the UUID to its string representation. - /// String containing the UUID value. - public string ToHexString() - { - return BitConverter.ToString(uuidBytes).Replace("-", string.Empty); - } - - public override string ToString() - { - return ToHexString(); - } - } -} diff --git a/ReClass.NET/Project/ReClassNetProject.cs b/ReClass.NET/Project/ReClassNetProject.cs index c91a3286..90f4b5ca 100644 --- a/ReClass.NET/Project/ReClassNetProject.cs +++ b/ReClass.NET/Project/ReClassNetProject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -59,14 +59,14 @@ public void AddClass(ClassNode node) ClassAdded?.Invoke(node); } - public bool ContainsClass(NodeUuid uuid) + public bool ContainsClass(Guid uuid) { Contract.Requires(uuid != null); return classes.Any(c => c.Uuid.Equals(uuid)); } - public ClassNode GetClassByUuid(NodeUuid uuid) + public ClassNode GetClassByUuid(Guid uuid) { Contract.Requires(uuid != null); diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 77ac1145..9eb45804 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -290,7 +290,6 @@ - From 7f890e16726039e8ada1fc289cd0244068769174 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 22 Nov 2020 20:02:15 +0100 Subject: [PATCH 750/777] Removed unused constructor. Prevent negative size. --- ReClass.NET/Memory/MemoryBuffer.cs | 14 +++----------- ReClass.NET_Tests/Memory/MemoryBufferTest.cs | 7 +++++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index 52f874b5..c6e847fe 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -20,7 +20,7 @@ public int Size get => data.Length; set { - if (value != data.Length) + if (value >= 0 && value != data.Length) { data = new byte[value]; historyData = new byte[value]; @@ -44,20 +44,12 @@ private void ObjectInvariants() } public MemoryBuffer() - : this(0) { Contract.Ensures(data != null); Contract.Ensures(historyData != null); - } - - public MemoryBuffer(int size) - { - Contract.Requires(size >= 0); - Contract.Ensures(data != null); - Contract.Ensures(historyData != null); - data = new byte[size]; - historyData = new byte[size]; + data = Array.Empty(); + historyData = Array.Empty(); } public MemoryBuffer(MemoryBuffer other) diff --git a/ReClass.NET_Tests/Memory/MemoryBufferTest.cs b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs index 7e545f56..d9fb45a1 100644 --- a/ReClass.NET_Tests/Memory/MemoryBufferTest.cs +++ b/ReClass.NET_Tests/Memory/MemoryBufferTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; using NFluent; using ReClassNET.Memory; @@ -10,7 +10,10 @@ public class MemoryBufferTest { private static MemoryBuffer CreateFromBytes(params byte[] data) { - var buffer = new MemoryBuffer(data.Length); + var buffer = new MemoryBuffer + { + Size = data.Length + }; Array.Copy(data, buffer.RawData, data.Length); return buffer; } From 8f6bd4146a8e6ee843ed66209d26dae98b6a17cb Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 22 Nov 2020 20:16:10 +0100 Subject: [PATCH 751/777] Removed unused constant. --- ReClass.NET/ReClass.NET.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 9eb45804..76b54d3b 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -25,7 +25,7 @@ false $(SolutionDir)bin\Debug\x86\ $(SolutionDir)obj\$(Configuration)\x86\$(MSBuildProjectName)\ - TRACE;DEBUG;RECLASSNET32 + TRACE;DEBUG prompt 4 false @@ -79,7 +79,7 @@ true $(SolutionDir)bin\Release\x86\ $(SolutionDir)obj\$(Configuration)\x86\$(MSBuildProjectName)\ - TRACE;RECLASSNET32;RELEASE + TRACE;RELEASE prompt 4 From c0f7e53728dc3e794df2ef9d7b57882ed947b086 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 22 Nov 2020 21:34:38 +0100 Subject: [PATCH 752/777] Added BigEndianBitConverter and LittleEndianBitConverter. --- ReClass.NET/ReClass.NET.csproj | 3 + .../Util/Conversion/BigEndianBitConverter.cs | 39 ++++++ .../Util/Conversion/EndianBitConverter.cs | 83 +++++++++++++ .../Conversion/LittleEndianBitConverter.cs | 39 ++++++ ReClass.NET_Tests/ReClass.NET_Tests.csproj | 3 + .../Conversion/BigEndianBitConverterTest.cs | 114 ++++++++++++++++++ .../Util/Conversion/EndianBitConverterTest.cs | 25 ++++ .../LittleEndianBitConverterTest.cs | 114 ++++++++++++++++++ 8 files changed, 420 insertions(+) create mode 100644 ReClass.NET/Util/Conversion/BigEndianBitConverter.cs create mode 100644 ReClass.NET/Util/Conversion/EndianBitConverter.cs create mode 100644 ReClass.NET/Util/Conversion/LittleEndianBitConverter.cs create mode 100644 ReClass.NET_Tests/Util/Conversion/BigEndianBitConverterTest.cs create mode 100644 ReClass.NET_Tests/Util/Conversion/EndianBitConverterTest.cs create mode 100644 ReClass.NET_Tests/Util/Conversion/LittleEndianBitConverterTest.cs diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 76b54d3b..be3a033a 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -394,6 +394,9 @@ + + + diff --git a/ReClass.NET/Util/Conversion/BigEndianBitConverter.cs b/ReClass.NET/Util/Conversion/BigEndianBitConverter.cs new file mode 100644 index 00000000..4469dca0 --- /dev/null +++ b/ReClass.NET/Util/Conversion/BigEndianBitConverter.cs @@ -0,0 +1,39 @@ +using System; + +namespace ReClassNET.Util.Conversion +{ + public sealed class BigEndianBitConverter : EndianBitConverter + { + protected override long FromBytes(byte[] buffer, int index, int bytesToConvert) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + if (index + bytesToConvert > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + long ret = 0; + for (var i = 0; i < bytesToConvert; i++) + { + ret = unchecked((ret << 8) | buffer[index + i]); + } + return ret; + } + + protected override byte[] ToBytes(long value, int bytes) + { + var endOffset = bytes - 1; + + var buffer = new byte[bytes]; + for (var i = 0; i < bytes; i++) + { + buffer[endOffset - i] = unchecked((byte)(value & 0xFF)); + value >>= 8; + } + return buffer; + } + } +} diff --git a/ReClass.NET/Util/Conversion/EndianBitConverter.cs b/ReClass.NET/Util/Conversion/EndianBitConverter.cs new file mode 100644 index 00000000..eb231dd8 --- /dev/null +++ b/ReClass.NET/Util/Conversion/EndianBitConverter.cs @@ -0,0 +1,83 @@ +using System; +using System.Runtime.InteropServices; + +namespace ReClassNET.Util.Conversion +{ + public abstract class EndianBitConverter + { + public static LittleEndianBitConverter Little { get; } = new LittleEndianBitConverter(); + + public static BigEndianBitConverter Big { get; } = new BigEndianBitConverter(); + + public static EndianBitConverter System { get; } = BitConverter.IsLittleEndian ? (EndianBitConverter)Little : Big; + + + public bool ToBoolean(byte[] value, int startIndex) => BitConverter.ToBoolean(value, startIndex); + + public char ToChar(byte[] value, int startIndex) => unchecked((char)FromBytes(value, startIndex, 2)); + + public double ToDouble(byte[] value, int startIndex) => BitConverter.Int64BitsToDouble(ToInt64(value, startIndex)); + + public float ToSingle(byte[] value, int startIndex) => new Int32FloatUnion(ToInt32(value, startIndex)).FloatValue; + + public short ToInt16(byte[] value, int startIndex) => unchecked((short)FromBytes(value, startIndex, 2)); + + public int ToInt32(byte[] value, int startIndex) => unchecked((int)FromBytes(value, startIndex, 4)); + + public long ToInt64(byte[] value, int startIndex) => FromBytes(value, startIndex, 8); + + public ushort ToUInt16(byte[] value, int startIndex) => unchecked((ushort)FromBytes(value, startIndex, 2)); + + public uint ToUInt32(byte[] value, int startIndex) => unchecked((uint)FromBytes(value, startIndex, 4)); + + public ulong ToUInt64(byte[] value, int startIndex) => unchecked((ulong)FromBytes(value, startIndex, 8)); + + protected abstract long FromBytes(byte[] value, int index, int bytesToConvert); + + + public byte[] GetBytes(bool value) => BitConverter.GetBytes(value); + + public byte[] GetBytes(char value) => ToBytes(value, 2); + + public byte[] GetBytes(double value) => ToBytes(BitConverter.DoubleToInt64Bits(value), 8); + + public byte[] GetBytes(short value) => ToBytes(value, 2); + + public byte[] GetBytes(int value) => ToBytes(value, 4); + + public byte[] GetBytes(long value) => ToBytes(value, 8); + + public byte[] GetBytes(float value) => ToBytes(new Int32FloatUnion(value).IntValue, 4); + + public byte[] GetBytes(ushort value) => ToBytes(value, 2); + + public byte[] GetBytes(uint value) => ToBytes(value, 4); + + public byte[] GetBytes(ulong value) => ToBytes(unchecked((long)value), 8); + + protected abstract byte[] ToBytes(long value, int bytes); + + + [StructLayout(LayoutKind.Explicit)] + private readonly struct Int32FloatUnion + { + [FieldOffset(0)] + public readonly int IntValue; + + [FieldOffset(0)] + public readonly float FloatValue; + + internal Int32FloatUnion(int value) + { + FloatValue = 0.0f; + IntValue = value; + } + + internal Int32FloatUnion(float value) + { + IntValue = 0; + FloatValue = value; + } + } + } +} diff --git a/ReClass.NET/Util/Conversion/LittleEndianBitConverter.cs b/ReClass.NET/Util/Conversion/LittleEndianBitConverter.cs new file mode 100644 index 00000000..af12706a --- /dev/null +++ b/ReClass.NET/Util/Conversion/LittleEndianBitConverter.cs @@ -0,0 +1,39 @@ +using System; + +namespace ReClassNET.Util.Conversion +{ + public sealed class LittleEndianBitConverter : EndianBitConverter + { + protected override long FromBytes(byte[] buffer, int index, int bytesToConvert) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + if (index + bytesToConvert > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + var ret = 0L; + for (var i = 0; i < bytesToConvert; i++) + { + ret = unchecked((ret << 8) | buffer[index + bytesToConvert - 1 - i]); + } + return ret; + } + + protected override byte[] ToBytes(long value, int bytes) + { + var buffer = new byte[bytes]; + + for (var i = 0; i < bytes; i++) + { + buffer[i] = unchecked((byte)(value & 0xFF)); + value >>= 8; + } + + return buffer; + } + } +} diff --git a/ReClass.NET_Tests/ReClass.NET_Tests.csproj b/ReClass.NET_Tests/ReClass.NET_Tests.csproj index 1ed78ef2..02c7ae25 100644 --- a/ReClass.NET_Tests/ReClass.NET_Tests.csproj +++ b/ReClass.NET_Tests/ReClass.NET_Tests.csproj @@ -91,6 +91,9 @@ + + + diff --git a/ReClass.NET_Tests/Util/Conversion/BigEndianBitConverterTest.cs b/ReClass.NET_Tests/Util/Conversion/BigEndianBitConverterTest.cs new file mode 100644 index 00000000..a55599a3 --- /dev/null +++ b/ReClass.NET_Tests/Util/Conversion/BigEndianBitConverterTest.cs @@ -0,0 +1,114 @@ +using System; +using NFluent; +using ReClassNET.Util.Conversion; +using Xunit; + +namespace ReClass.NET_Tests.Util.Conversion +{ + public class BigEndianBitConverterTest + { + [Fact] + public void ToXXX_ThrowsOnNull() + { + var sut = new BigEndianBitConverter(); + + Check.ThatCode(() => sut.ToInt32(null, 0)).Throws(); + } + + [Fact] + public void ToXXX_ThrowsOnInvalidIndexOrSize() + { + var sut = new BigEndianBitConverter(); + + var data = new byte[3]; + Check.ThatCode(() => sut.ToInt32(data, 0)).Throws(); + + data = new byte[4]; + Check.ThatCode(() => sut.ToInt32(data, 1)).Throws(); + } + + [Fact] + public void GetBytes() + { + var sut = new BigEndianBitConverter(); + + Check.That(new byte[] { 0 }).ContainsExactly(sut.GetBytes(false)); + Check.That(new byte[] { 1 }).ContainsExactly(sut.GetBytes(true)); + + Check.That(new byte[] { 0, 0 }).ContainsExactly(sut.GetBytes((short)0)); + Check.That(new byte[] { 0, 1 }).ContainsExactly(sut.GetBytes((short)1)); + Check.That(new byte[] { 1, 0 }).ContainsExactly(sut.GetBytes((short)256)); + Check.That(new byte[] { 255, 255 }).ContainsExactly(sut.GetBytes((short)-1)); + + Check.That(new byte[] { 0, 0 }).ContainsExactly(sut.GetBytes((ushort)0)); + Check.That(new byte[] { 0, 1 }).ContainsExactly(sut.GetBytes((ushort)1)); + Check.That(new byte[] { 1, 0 }).ContainsExactly(sut.GetBytes((ushort)256)); + Check.That(new byte[] { 255, 255 }).ContainsExactly(sut.GetBytes(ushort.MaxValue)); + + Check.That(new byte[] { 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0)); + Check.That(new byte[] { 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(1)); + Check.That(new byte[] { 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(256)); + Check.That(new byte[] { 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(65536)); + Check.That(new byte[] { 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216)); + Check.That(new byte[] { 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(-1)); + + Check.That(new byte[] { 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0u)); + Check.That(new byte[] { 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(1u)); + Check.That(new byte[] { 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(256u)); + Check.That(new byte[] { 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(65536u)); + Check.That(new byte[] { 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216u)); + Check.That(new byte[] { 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(uint.MaxValue)); + + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(1L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(256L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(65536L)); + Check.That(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216L)); + Check.That(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(4294967296L)); + Check.That(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1099511627776L)); + Check.That(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(281474976710656L)); + Check.That(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(72057594037927936L)); + Check.That(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(-1L)); + + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(1UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(256UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(65536UL)); + Check.That(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216UL)); + Check.That(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(4294967296UL)); + Check.That(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1099511627776UL)); + Check.That(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(281474976710656UL)); + Check.That(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(72057594037927936UL)); + Check.That(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(ulong.MaxValue)); + } + + [Fact] + public void ToXXX() + { + var sut = new BigEndianBitConverter(); + + var data = new byte[] { 0, 0, 0, 0, 0, 0, 0, 3 }; + Check.That(sut.ToBoolean(data, 0)).IsFalse(); + Check.That(sut.ToBoolean(data, 7)).IsTrue(); + Check.That(sut.ToChar(data, 0)).IsEqualTo('\0'); + Check.That(sut.ToChar(data, 6)).IsEqualTo('\u0003'); + Check.That(sut.ToInt16(data, 0)).IsEqualTo(0); + Check.That(sut.ToInt16(data, 6)).IsEqualTo(3); + Check.That(sut.ToUInt16(data, 0)).IsEqualTo(0u); + Check.That(sut.ToUInt16(data, 6)).IsEqualTo(3u); + Check.That(sut.ToInt32(data, 0)).IsEqualTo(0); + Check.That(sut.ToInt32(data, 4)).IsEqualTo(3); + Check.That(sut.ToUInt32(data, 0)).IsEqualTo(0u); + Check.That(sut.ToUInt32(data, 4)).IsEqualTo(3u); + Check.That(sut.ToInt64(data, 0)).IsEqualTo(3L); + Check.That(sut.ToUInt64(data, 0)).IsEqualTo(3UL); + + data = new byte[] { 0x41, 0x20, 0, 0, 0, 0, 0, 0 }; + Check.That(sut.ToSingle(data, 0)).IsEqualTo(10.0f); + Check.That(sut.ToSingle(data, 4)).IsEqualTo(0.0f); + + data = new byte[] { 0x40, 0x24, 0, 0, 0, 0, 0, 0 }; + Check.That(sut.ToDouble(data, 0)).IsEqualTo(10.0); + } + } +} diff --git a/ReClass.NET_Tests/Util/Conversion/EndianBitConverterTest.cs b/ReClass.NET_Tests/Util/Conversion/EndianBitConverterTest.cs new file mode 100644 index 00000000..1a5e54a1 --- /dev/null +++ b/ReClass.NET_Tests/Util/Conversion/EndianBitConverterTest.cs @@ -0,0 +1,25 @@ +using System; +using NFluent; +using ReClassNET.Util.Conversion; +using Xunit; + +namespace ReClass.NET_Tests.Util.Conversion +{ + public class EndianBitConverterTest + { + [Fact] + public void Properties_AreNotNull() + { + Check.That(EndianBitConverter.System).IsNotNull(); + Check.That(EndianBitConverter.Big).IsNotNull(); + Check.That(EndianBitConverter.Little).IsNotNull(); + } + + [Fact] + public void Types() + { + Check.That(EndianBitConverter.Big.GetType()).IsNotEqualTo(EndianBitConverter.Little.GetType()); + Check.That(EndianBitConverter.System.GetType()).IsEqualTo(BitConverter.IsLittleEndian ? EndianBitConverter.Little.GetType() : EndianBitConverter.Big.GetType()); + } + } +} diff --git a/ReClass.NET_Tests/Util/Conversion/LittleEndianBitConverterTest.cs b/ReClass.NET_Tests/Util/Conversion/LittleEndianBitConverterTest.cs new file mode 100644 index 00000000..5a740ef5 --- /dev/null +++ b/ReClass.NET_Tests/Util/Conversion/LittleEndianBitConverterTest.cs @@ -0,0 +1,114 @@ +using System; +using NFluent; +using ReClassNET.Util.Conversion; +using Xunit; + +namespace ReClass.NET_Tests.Util.Conversion +{ + public class LittleEndianBitConverterTest + { + [Fact] + public void ToXXX_ThrowsOnNull() + { + var sut = new LittleEndianBitConverter(); + + Check.ThatCode(() => sut.ToInt32(null, 0)).Throws(); + } + + [Fact] + public void ToXXX_ThrowsOnInvalidIndexOrSize() + { + var sut = new LittleEndianBitConverter(); + + var data = new byte[3]; + Check.ThatCode(() => sut.ToInt32(data, 0)).Throws(); + + data = new byte[4]; + Check.ThatCode(() => sut.ToInt32(data, 1)).Throws(); + } + + [Fact] + public void GetBytes() + { + var sut = new LittleEndianBitConverter(); + + Check.That(new byte[] { 0 }).ContainsExactly(sut.GetBytes(false)); + Check.That(new byte[] { 1 }).ContainsExactly(sut.GetBytes(true)); + + Check.That(new byte[] { 0, 0 }).ContainsExactly(sut.GetBytes((short)0)); + Check.That(new byte[] { 1, 0 }).ContainsExactly(sut.GetBytes((short)1)); + Check.That(new byte[] { 0, 1 }).ContainsExactly(sut.GetBytes((short)256)); + Check.That(new byte[] { 255, 255 }).ContainsExactly(sut.GetBytes((short)-1)); + + Check.That(new byte[] { 0, 0 }).ContainsExactly(sut.GetBytes((ushort)0)); + Check.That(new byte[] { 1, 0 }).ContainsExactly(sut.GetBytes((ushort)1)); + Check.That(new byte[] { 0, 1 }).ContainsExactly(sut.GetBytes((ushort)256)); + Check.That(new byte[] { 255, 255 }).ContainsExactly(sut.GetBytes(ushort.MaxValue)); + + Check.That(new byte[] { 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0)); + Check.That(new byte[] { 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1)); + Check.That(new byte[] { 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(256)); + Check.That(new byte[] { 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(65536)); + Check.That(new byte[] { 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(16777216)); + Check.That(new byte[] { 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(-1)); + + Check.That(new byte[] { 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0u)); + Check.That(new byte[] { 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1u)); + Check.That(new byte[] { 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(256u)); + Check.That(new byte[] { 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(65536u)); + Check.That(new byte[] { 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(16777216u)); + Check.That(new byte[] { 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(uint.MaxValue)); + + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0L)); + Check.That(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1L)); + Check.That(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(256L)); + Check.That(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(65536L)); + Check.That(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216L)); + Check.That(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(4294967296L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(1099511627776L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(281474976710656L)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(72057594037927936L)); + Check.That(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(-1L)); + + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(0UL)); + Check.That(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(1UL)); + Check.That(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(256UL)); + Check.That(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(65536UL)); + Check.That(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }).ContainsExactly(sut.GetBytes(16777216UL)); + Check.That(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }).ContainsExactly(sut.GetBytes(4294967296UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }).ContainsExactly(sut.GetBytes(1099511627776UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }).ContainsExactly(sut.GetBytes(281474976710656UL)); + Check.That(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }).ContainsExactly(sut.GetBytes(72057594037927936UL)); + Check.That(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }).ContainsExactly(sut.GetBytes(ulong.MaxValue)); + } + + [Fact] + public void ToXXX() + { + var sut = new LittleEndianBitConverter(); + + var data = new byte[] { 0x03, 0, 0, 0, 0, 0, 0, 0 }; + Check.That(sut.ToBoolean(data, 0)).IsTrue(); + Check.That(sut.ToBoolean(data, 7)).IsFalse(); + Check.That(sut.ToChar(data, 0)).IsEqualTo('\u0003'); + Check.That(sut.ToChar(data, 6)).IsEqualTo('\0'); + Check.That(sut.ToInt16(data, 0)).IsEqualTo(3); + Check.That(sut.ToInt16(data, 6)).IsEqualTo(0); + Check.That(sut.ToUInt16(data, 0)).IsEqualTo(3u); + Check.That(sut.ToUInt16(data, 6)).IsEqualTo(0u); + Check.That(sut.ToInt32(data, 0)).IsEqualTo(3); + Check.That(sut.ToInt32(data, 4)).IsEqualTo(0); + Check.That(sut.ToUInt32(data, 0)).IsEqualTo(3u); + Check.That(sut.ToUInt32(data, 4)).IsEqualTo(0u); + Check.That(sut.ToInt64(data, 0)).IsEqualTo(3L); + Check.That(sut.ToUInt64(data, 0)).IsEqualTo(3UL); + + data = new byte[] { 0, 0, 0, 0, 0, 0, 0x20, 0x41 }; + Check.That(sut.ToSingle(data, 0)).IsEqualTo(0.0f); + Check.That(sut.ToSingle(data, 4)).IsEqualTo(10.0f); + + data = new byte[] { 0, 0, 0, 0, 0, 0, 0x24, 0x40 }; + Check.That(sut.ToDouble(data, 0)).IsEqualTo(10.0); + } + } +} From 15b08867a6580db54937ec7d0e487d202d623b4d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 22 Nov 2020 21:56:39 +0100 Subject: [PATCH 753/777] Replaced BitConverter with EndianBitConverter. --- ReClass.NET/Forms/MainForm.cs | 26 +++++++++--------- ReClass.NET/Forms/ScannerForm.cs | 10 +++---- ReClass.NET/Memory/IRemoteMemoryReader.cs | 3 +++ ReClass.NET/Memory/IRemoteMemoryWriter.cs | 5 +++- ReClass.NET/Memory/MemoryBuffer.cs | 27 +++++++++---------- ReClass.NET/Memory/RemoteProcess.cs | 3 +++ .../Comparer/DoubleMemoryComparer.cs | 19 ++++++++----- .../Comparer/FloatMemoryComparer.cs | 19 ++++++++----- .../Comparer/IntegerMemoryComparer.cs | 11 +++++--- .../Comparer/LongMemoryComparer.cs | 11 +++++--- .../Comparer/ShortMemoryComparer.cs | 11 +++++--- .../MemoryScanner/InputCorrelatedScanner.cs | 14 +++++----- ReClass.NET/MemoryScanner/MemoryRecord.cs | 22 +++++++-------- .../Comparer/FloatMemoryComparerTest.cs | 19 +++++++------ .../Comparer/IntegerMemoryComparerTest.cs | 17 +++++++----- .../Comparer/LongMemoryComparerTest.cs | 17 +++++++----- .../Comparer/ShortMemoryComparerTest.cs | 17 +++++++----- 17 files changed, 149 insertions(+), 102 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 0b3f3008..bff83d26 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -588,6 +588,8 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg return; } + var bitConverter = Program.RemoteProcess.BitConverter; + IScanComparer comparer; switch (selectedNode.Node) { @@ -595,10 +597,10 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg comparer = new ArrayOfBytesMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory)); break; case FloatNode node: - comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0f); + comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0f, bitConverter); break; case DoubleNode node: - comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0); + comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0, bitConverter); break; case Int8Node node: comparer = new ByteMemoryComparer(ScanCompareType.Equal, (byte)node.ReadValueFromMemory(selectedNode.Memory), 0); @@ -607,30 +609,30 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg comparer = new ByteMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); break; case Int16Node node: - comparer = new ShortMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new ShortMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter); break; case UInt16Node node: - comparer = new ShortMemoryComparer(ScanCompareType.Equal, (short)node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new ShortMemoryComparer(ScanCompareType.Equal, (short)node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter); break; case Int32Node node: - comparer = new IntegerMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter); break; case UInt32Node node: - comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0); + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter); break; case Int64Node node: - comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0L); + comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0L, bitConverter); break; case UInt64Node node: - comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0L); + comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0L, bitConverter); break; case NIntNode node: { var value = node.ReadValueFromMemory(selectedNode.Memory); #if RECLASSNET64 - comparer = new LongMemoryComparer(ScanCompareType.Equal, value.ToInt64(), 0L); + comparer = new LongMemoryComparer(ScanCompareType.Equal, value.ToInt64(), 0L, bitConverter); #else - comparer = new IntegerMemoryComparer(ScanCompareType.Equal, value.ToInt32(), 0); + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, value.ToInt32(), 0, bitConverter); #endif break; } @@ -638,9 +640,9 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg { var value = node.ReadValueFromMemory(selectedNode.Memory); #if RECLASSNET64 - comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)value.ToUInt64(), 0L); + comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)value.ToUInt64(), 0L, bitConverter); #else - comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)value.ToUInt32(), 0); + comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)value.ToUInt32(), 0, bitConverter); #endif break; } diff --git a/ReClass.NET/Forms/ScannerForm.cs b/ReClass.NET/Forms/ScannerForm.cs index c52e7187..0fb4d430 100644 --- a/ReClass.NET/Forms/ScannerForm.cs +++ b/ReClass.NET/Forms/ScannerForm.cs @@ -758,11 +758,11 @@ private IScanComparer CreateComparer(ScanSettings settings) case ScanValueType.Byte: return new ByteMemoryComparer(compareType, (byte)value1, (byte)value2); case ScanValueType.Short: - return new ShortMemoryComparer(compareType, (short)value1, (short)value2); + return new ShortMemoryComparer(compareType, (short)value1, (short)value2, process.BitConverter); case ScanValueType.Integer: - return new IntegerMemoryComparer(compareType, (int)value1, (int)value2); + return new IntegerMemoryComparer(compareType, (int)value1, (int)value2, process.BitConverter); case ScanValueType.Long: - return new LongMemoryComparer(compareType, value1, value2); + return new LongMemoryComparer(compareType, value1, value2, process.BitConverter); } } else if (settings.ValueType == ScanValueType.Float || settings.ValueType == ScanValueType.Double) @@ -806,9 +806,9 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat) switch (settings.ValueType) { case ScanValueType.Float: - return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2); + return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2, process.BitConverter); case ScanValueType.Double: - return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2); + return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2, process.BitConverter); } } else if (settings.ValueType == ScanValueType.ArrayOfBytes) diff --git a/ReClass.NET/Memory/IRemoteMemoryReader.cs b/ReClass.NET/Memory/IRemoteMemoryReader.cs index 3f926c82..ed514ddd 100644 --- a/ReClass.NET/Memory/IRemoteMemoryReader.cs +++ b/ReClass.NET/Memory/IRemoteMemoryReader.cs @@ -1,10 +1,13 @@ using System; using System.Text; +using ReClassNET.Util.Conversion; namespace ReClassNET.Memory { public interface IRemoteMemoryReader { + EndianBitConverter BitConverter { get; set; } + /// Reads remote memory from the address into the buffer. /// The address to read from. /// [out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros. diff --git a/ReClass.NET/Memory/IRemoteMemoryWriter.cs b/ReClass.NET/Memory/IRemoteMemoryWriter.cs index bc466d42..57bba946 100644 --- a/ReClass.NET/Memory/IRemoteMemoryWriter.cs +++ b/ReClass.NET/Memory/IRemoteMemoryWriter.cs @@ -1,9 +1,12 @@ -using System; +using System; +using ReClassNET.Util.Conversion; namespace ReClassNET.Memory { public interface IRemoteMemoryWriter { + EndianBitConverter BitConverter { get; set; } + /// Writes the given to the in the remote process. /// The address to write to. /// The data to write. diff --git a/ReClass.NET/Memory/MemoryBuffer.cs b/ReClass.NET/Memory/MemoryBuffer.cs index c6e847fe..e1b515a4 100644 --- a/ReClass.NET/Memory/MemoryBuffer.cs +++ b/ReClass.NET/Memory/MemoryBuffer.cs @@ -1,8 +1,8 @@ using System; using System.Diagnostics.Contracts; -using System.Runtime.InteropServices; using System.Text; using ReClassNET.Extensions; +using ReClassNET.Util.Conversion; namespace ReClassNET.Memory { @@ -15,6 +15,8 @@ public class MemoryBuffer public byte[] RawData => data; + public EndianBitConverter BitConverter { get; set; } = EndianBitConverter.System; + public int Size { get => data.Length; @@ -52,25 +54,18 @@ public MemoryBuffer() historyData = Array.Empty(); } - public MemoryBuffer(MemoryBuffer other) - { - Contract.Requires(other != null); - Contract.Ensures(data != null); - Contract.Ensures(historyData != null); - - data = other.data; - historyData = other.historyData; - hasHistory = other.hasHistory; - - ContainsValidData = other.ContainsValidData; - } - public MemoryBuffer Clone() { Contract.Ensures(Contract.Result() != null); - return new MemoryBuffer(this) + return new MemoryBuffer { + data = data, + historyData = historyData, + hasHistory = hasHistory, + + BitConverter = BitConverter, + ContainsValidData = ContainsValidData, Offset = Offset }; } @@ -90,6 +85,8 @@ public void UpdateFrom(IRemoteMemoryReader reader, IntPtr address) hasHistory = ContainsValidData; + BitConverter = reader.BitConverter; + ContainsValidData = reader.ReadRemoteMemoryIntoBuffer(address, ref data); if (!ContainsValidData) { diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index b23286c0..bebdf175 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -13,6 +13,7 @@ using ReClassNET.MemoryScanner; using ReClassNET.Native; using ReClassNET.Symbols; +using ReClassNET.Util.Conversion; namespace ReClassNET.Memory { @@ -56,6 +57,8 @@ public class RemoteProcess : IDisposable, IRemoteMemoryReader, IRemoteMemoryWrit public SymbolStore Symbols => symbols; + public EndianBitConverter BitConverter { get; set; } = EndianBitConverter.System; + /// Gets a copy of the current modules list. This list may change if the remote process (un)loads a module. public IEnumerable Modules { diff --git a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs index b8428041..5e866608 100644 --- a/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using ReClassNET.Extensions; +using ReClassNET.Util.Conversion; namespace ReClassNET.MemoryScanner.Comparer { @@ -16,7 +17,9 @@ public class DoubleMemoryComparer : ISimpleScanComparer private readonly double minValue; private readonly double maxValue; - public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, double value1, double value2) + private readonly EndianBitConverter bitConverter; + + public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, double value1, double value2, EndianBitConverter bitConverter) { CompareType = compareType; @@ -29,11 +32,13 @@ public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType minValue = value1 - 1.0 / factor; maxValue = value1 + 1.0 / factor; + + this.bitConverter = bitConverter; } private bool CheckRoundedEquality(double value) => RoundType switch - { + { ScanRoundMode.Strict => Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001), ScanRoundMode.Normal => minValue < value && value < maxValue, ScanRoundMode.Truncate => (long)value == (long)Value1, @@ -46,7 +51,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) data, index, value => CompareType switch - { + { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), ScanCompareType.GreaterThan => value > Value1, @@ -60,7 +65,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) }, out result ); - } + } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { @@ -77,7 +82,7 @@ public bool Compare(byte[] data, int index, DoubleScanResult previous, out ScanR data, index, value => CompareType switch - { + { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), ScanCompareType.Changed => value != previous.Value, @@ -98,11 +103,11 @@ out result ); } - private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + private bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; - var value = BitConverter.ToDouble(data, index); + var value = bitConverter.ToDouble(data, index); if (!matcher(value)) { diff --git a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs index 27c8dd13..60a3acdf 100644 --- a/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using ReClassNET.Extensions; +using ReClassNET.Util.Conversion; namespace ReClassNET.MemoryScanner.Comparer { @@ -16,7 +17,9 @@ public class FloatMemoryComparer : ISimpleScanComparer private readonly float minValue; private readonly float maxValue; - public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, float value1, float value2) + private readonly EndianBitConverter bitConverter; + + public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, float value1, float value2, EndianBitConverter bitConverter) { CompareType = compareType; @@ -29,11 +32,13 @@ public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, minValue = value1 - 1.0f / factor; maxValue = value1 + 1.0f / factor; + + this.bitConverter = bitConverter; } private bool CheckRoundedEquality(float value) => RoundType switch - { + { ScanRoundMode.Strict => Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001f), ScanRoundMode.Normal => minValue < value && value < maxValue, ScanRoundMode.Truncate => (int)value == (int)Value1, @@ -46,7 +51,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) data, index, value => CompareType switch - { + { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), ScanCompareType.GreaterThan => value > Value1, @@ -60,7 +65,7 @@ public bool Compare(byte[] data, int index, out ScanResult result) }, out result ); - } + } public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result) { @@ -77,7 +82,7 @@ public bool Compare(byte[] data, int index, FloatScanResult previous, out ScanRe data, index, value => CompareType switch - { + { ScanCompareType.Equal => CheckRoundedEquality(value), ScanCompareType.NotEqual => !CheckRoundedEquality(value), ScanCompareType.Changed => value != previous.Value, @@ -98,11 +103,11 @@ out result ); } - private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + private bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; - var value = BitConverter.ToSingle(data, index); + var value = bitConverter.ToSingle(data, index); if (!matcher(value)) { diff --git a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs index 1935accf..44b372af 100644 --- a/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Util.Conversion; namespace ReClassNET.MemoryScanner.Comparer { @@ -10,12 +11,16 @@ public class IntegerMemoryComparer : ISimpleScanComparer public int Value2 { get; } public int ValueSize => sizeof(int); - public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2) + private readonly EndianBitConverter bitConverter; + + public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2, EndianBitConverter bitConverter) { CompareType = compareType; Value1 = value1; Value2 = value2; + + this.bitConverter = bitConverter; } public bool Compare(byte[] data, int index, out ScanResult result) @@ -76,11 +81,11 @@ out result ); } - private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + private bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; - var value = BitConverter.ToInt32(data, index); + var value = bitConverter.ToInt32(data, index); if (!matcher(value)) { diff --git a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs index 3b1172cf..f95051ad 100644 --- a/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/LongMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Util.Conversion; namespace ReClassNET.MemoryScanner.Comparer { @@ -10,12 +11,16 @@ public class LongMemoryComparer : ISimpleScanComparer public long Value2 { get; } public int ValueSize => sizeof(long); - public LongMemoryComparer(ScanCompareType compareType, long value1, long value2) + private readonly EndianBitConverter bitConverter; + + public LongMemoryComparer(ScanCompareType compareType, long value1, long value2, EndianBitConverter bitConverter) { CompareType = compareType; Value1 = value1; Value2 = value2; + + this.bitConverter = bitConverter; } public bool Compare(byte[] data, int index, out ScanResult result) @@ -76,11 +81,11 @@ out result ); } - private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + private bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; - var value = BitConverter.ToInt64(data, index); + var value = bitConverter.ToInt64(data, index); if (!matcher(value)) { diff --git a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs index 5cdfbad0..6d8ba6a3 100644 --- a/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs +++ b/ReClass.NET/MemoryScanner/Comparer/ShortMemoryComparer.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using ReClassNET.Util.Conversion; namespace ReClassNET.MemoryScanner.Comparer { @@ -10,12 +11,16 @@ public class ShortMemoryComparer : ISimpleScanComparer public short Value2 { get; } public int ValueSize => sizeof(short); - public ShortMemoryComparer(ScanCompareType compareType, short value1, short value2) + private readonly EndianBitConverter bitConverter; + + public ShortMemoryComparer(ScanCompareType compareType, short value1, short value2, EndianBitConverter bitConverter) { CompareType = compareType; Value1 = value1; Value2 = value2; + + this.bitConverter = bitConverter; } public bool Compare(byte[] data, int index, out ScanResult result) @@ -76,11 +81,11 @@ out result ); } - private static bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) + private bool CompareInternal(byte[] data, int index, Func matcher, out ScanResult result) { result = null; - var value = BitConverter.ToInt16(data, index); + var value = bitConverter.ToInt16(data, index); if (!matcher(value)) { diff --git a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs index 3a953d11..33e3b719 100644 --- a/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs +++ b/ReClass.NET/MemoryScanner/InputCorrelatedScanner.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -13,6 +13,7 @@ namespace ReClassNET.MemoryScanner { public class InputCorrelatedScanner : Scanner { + private readonly RemoteProcess process; private readonly KeyboardInput input; private readonly List hotkeys; @@ -29,6 +30,7 @@ public InputCorrelatedScanner(RemoteProcess process, KeyboardInput input, IEnume Contract.Requires(hotkeys != null); Contract.Ensures(this.input != null); + this.process = process; this.input = input; this.hotkeys = hotkeys.ToList(); } @@ -59,11 +61,11 @@ private IScanComparer CreateScanComparer(ScanCompareType compareType) return Settings.ValueType switch { ScanValueType.Byte => new ByteMemoryComparer(compareType, 0, 0), - ScanValueType.Short => new ShortMemoryComparer(compareType, 0, 0), - ScanValueType.Integer => new IntegerMemoryComparer(compareType, 0, 0), - ScanValueType.Long => new LongMemoryComparer(compareType, 0, 0), - ScanValueType.Float => new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0), - ScanValueType.Double => new DoubleMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0), + ScanValueType.Short => new ShortMemoryComparer(compareType, 0, 0, process.BitConverter), + ScanValueType.Integer => new IntegerMemoryComparer(compareType, 0, 0, process.BitConverter), + ScanValueType.Long => new LongMemoryComparer(compareType, 0, 0, process.BitConverter), + ScanValueType.Float => new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0, process.BitConverter), + ScanValueType.Double => new DoubleMemoryComparer(compareType, ScanRoundMode.Normal, 2, 0, 0, process.BitConverter), _ => throw new InvalidOperationException(), }; } diff --git a/ReClass.NET/MemoryScanner/MemoryRecord.cs b/ReClass.NET/MemoryScanner/MemoryRecord.cs index 11361d5f..e40e3ff9 100644 --- a/ReClass.NET/MemoryScanner/MemoryRecord.cs +++ b/ReClass.NET/MemoryScanner/MemoryRecord.cs @@ -193,19 +193,19 @@ public void RefreshValue(RemoteProcess process) ValueStr = FormatValue(buffer[0], ShowValueHexadecimal); break; case ScanValueType.Short: - ValueStr = FormatValue(BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(process.BitConverter.ToInt16(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Integer: - ValueStr = FormatValue(BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(process.BitConverter.ToInt32(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Long: - ValueStr = FormatValue(BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); + ValueStr = FormatValue(process.BitConverter.ToInt64(buffer, 0), ShowValueHexadecimal); break; case ScanValueType.Float: - ValueStr = FormatValue(BitConverter.ToSingle(buffer, 0)); + ValueStr = FormatValue(process.BitConverter.ToSingle(buffer, 0)); break; case ScanValueType.Double: - ValueStr = FormatValue(BitConverter.ToDouble(buffer, 0)); + ValueStr = FormatValue(process.BitConverter.ToDouble(buffer, 0)); break; case ScanValueType.ArrayOfBytes: ValueStr = FormatValue(buffer); @@ -241,16 +241,16 @@ public void SetValue(RemoteProcess process, string input, bool isHex) switch (ValueType) { case ScanValueType.Byte: - data = BitConverter.GetBytes((byte)value); + data = process.BitConverter.GetBytes((byte)value); break; case ScanValueType.Short: - data = BitConverter.GetBytes((short)value); + data = process.BitConverter.GetBytes((short)value); break; case ScanValueType.Integer: - data = BitConverter.GetBytes((int)value); + data = process.BitConverter.GetBytes((int)value); break; case ScanValueType.Long: - data = BitConverter.GetBytes(value); + data = process.BitConverter.GetBytes(value); break; } } @@ -262,10 +262,10 @@ public void SetValue(RemoteProcess process, string input, bool isHex) switch (ValueType) { case ScanValueType.Float: - data = BitConverter.GetBytes((float)value); + data = process.BitConverter.GetBytes((float)value); break; case ScanValueType.Double: - data = BitConverter.GetBytes(value); + data = process.BitConverter.GetBytes(value); break; } } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs index 5084f442..b9824d4d 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/FloatMemoryComparerTest.cs @@ -1,13 +1,16 @@ -using System; +using System; using NFluent; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; +using ReClassNET.Util.Conversion; using Xunit; namespace ReClass.NET_Tests.MemoryScanner.Comparer { public class FloatMemoryComparerTest { + private static EndianBitConverter BitConverter { get; } = EndianBitConverter.System; + [Theory] [InlineData(ScanCompareType.Equal, ScanRoundMode.Normal, 0.0f, 0.0f)] [InlineData(ScanCompareType.Equal, ScanRoundMode.Strict, 1.0f, 2.0f)] @@ -17,7 +20,7 @@ public class FloatMemoryComparerTest [InlineData(ScanCompareType.NotEqual, ScanRoundMode.Truncate, 0.0f, 0.0f)] public void TestConstructor(ScanCompareType compareType, ScanRoundMode roundMode, float value1, float value2) { - var sut = new FloatMemoryComparer(compareType, roundMode, 1, value1, value2); + var sut = new FloatMemoryComparer(compareType, roundMode, 1, value1, value2, BitConverter); Check.That(sut.CompareType).IsEqualTo(compareType); Check.That(sut.RoundType).IsEqualTo(roundMode); @@ -35,7 +38,7 @@ public void TestConstructorSignificantDigits(int significantDigits) const float Value1 = 1.234567f; const float Value2 = 7.654321f; - var sut = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, significantDigits, Value1, Value2); + var sut = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, significantDigits, Value1, Value2, BitConverter); Check.That(sut.Value1).IsEqualTo((float)Math.Round(Value1, significantDigits, MidpointRounding.AwayFromZero)); Check.That(sut.Value2).IsEqualTo((float)Math.Round(Value2, significantDigits, MidpointRounding.AwayFromZero)); @@ -74,7 +77,7 @@ public void TestConstructorSignificantDigits(int significantDigits) [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] public void TestCompare(ScanCompareType compareType, float value1, float value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) { - var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, value1, value2); + var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, value1, value2, BitConverter); Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); Check.That(scanResult).IsEqualTo(expectedScanResult); @@ -93,7 +96,7 @@ public void TestCompare(ScanCompareType compareType, float value1, float value2, [InlineData(ScanCompareType.IncreasedOrEqual)] public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) { - var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, 0.0f, 0.0f); + var sut = new FloatMemoryComparer(compareType, ScanRoundMode.Normal, 1, 0.0f, 0.0f, BitConverter); Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0.0f), 0, out _)).Throws(); } @@ -109,7 +112,7 @@ public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) [MemberData(nameof(GetTestCompareThrowsData))] public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) { - var sut = new FloatMemoryComparer(ScanCompareType.Unknown, ScanRoundMode.Normal, 1, 0.0f, 0.0f); + var sut = new FloatMemoryComparer(ScanCompareType.Unknown, ScanRoundMode.Normal, 1, 0.0f, 0.0f, BitConverter); Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); } @@ -149,7 +152,7 @@ public static TheoryData sut.Compare(BitConverter.GetBytes(0.0f), 0, new FloatScanResult(0.0f), out _)).Throws(); } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs index acbfd201..0d6b8e1d 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/IntegerMemoryComparerTest.cs @@ -1,13 +1,16 @@ -using System; +using System; using NFluent; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; +using ReClassNET.Util.Conversion; using Xunit; namespace ReClass.NET_Tests.MemoryScanner.Comparer { public class IntegerMemoryComparerTest { + private static EndianBitConverter BitConverter { get; } = EndianBitConverter.System; + [Theory] [InlineData(ScanCompareType.Equal, 0, 0)] [InlineData(ScanCompareType.Equal, 1, 2)] @@ -17,7 +20,7 @@ public class IntegerMemoryComparerTest [InlineData(ScanCompareType.NotEqual, 0, 0)] public void TestConstructor(ScanCompareType compareType, int value1, int value2) { - var sut = new IntegerMemoryComparer(compareType, value1, value2); + var sut = new IntegerMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.CompareType).IsEqualTo(compareType); Check.That(sut.ValueSize).IsEqualTo(sizeof(int)); @@ -64,7 +67,7 @@ public void TestConstructor(ScanCompareType compareType, int value1, int value2) [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] public void TestCompare(ScanCompareType compareType, int value1, int value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) { - var sut = new IntegerMemoryComparer(compareType, value1, value2); + var sut = new IntegerMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); Check.That(scanResult).IsEqualTo(expectedScanResult); @@ -83,7 +86,7 @@ public void TestCompare(ScanCompareType compareType, int value1, int value2, byt [InlineData(ScanCompareType.IncreasedOrEqual)] public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) { - var sut = new IntegerMemoryComparer(compareType, 0, 0); + var sut = new IntegerMemoryComparer(compareType, 0, 0, BitConverter); Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0), 0, out _)).Throws(); } @@ -101,7 +104,7 @@ public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) [MemberData(nameof(GetTestCompareThrowsData))] public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) { - var sut = new IntegerMemoryComparer(ScanCompareType.Equal, 0, 0); + var sut = new IntegerMemoryComparer(ScanCompareType.Equal, 0, 0, BitConverter); Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); } @@ -141,7 +144,7 @@ public static TheoryData sut.Compare(BitConverter.GetBytes(0), 0, new IntegerScanResult(0), out _)).Throws(); } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs index f2790648..a298ebb3 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/LongMemoryComparerTest.cs @@ -1,13 +1,16 @@ -using System; +using System; using NFluent; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; +using ReClassNET.Util.Conversion; using Xunit; namespace ReClass.NET_Tests.MemoryScanner.Comparer { public class LongMemoryComparerTest { + private static EndianBitConverter BitConverter { get; } = EndianBitConverter.System; + [Theory] [InlineData(ScanCompareType.Equal, 0L, 0L)] [InlineData(ScanCompareType.Equal, 1L, 2L)] @@ -17,7 +20,7 @@ public class LongMemoryComparerTest [InlineData(ScanCompareType.NotEqual, 0L, 0L)] public void TestConstructor(ScanCompareType compareType, long value1, long value2) { - var sut = new LongMemoryComparer(compareType, value1, value2); + var sut = new LongMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.CompareType).IsEqualTo(compareType); Check.That(sut.ValueSize).IsEqualTo(sizeof(long)); @@ -64,7 +67,7 @@ public void TestConstructor(ScanCompareType compareType, long value1, long value [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] public void TestCompare(ScanCompareType compareType, long value1, long value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) { - var sut = new LongMemoryComparer(compareType, value1, value2); + var sut = new LongMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); Check.That(scanResult).IsEqualTo(expectedScanResult); @@ -83,7 +86,7 @@ public void TestCompare(ScanCompareType compareType, long value1, long value2, b [InlineData(ScanCompareType.IncreasedOrEqual)] public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) { - var sut = new LongMemoryComparer(compareType, 0L, 0L); + var sut = new LongMemoryComparer(compareType, 0L, 0L, BitConverter); Check.ThatCode(() => sut.Compare(BitConverter.GetBytes(0L), 0, out _)).Throws(); } @@ -101,7 +104,7 @@ public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) [MemberData(nameof(GetTestCompareThrowsData))] public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) { - var sut = new LongMemoryComparer(ScanCompareType.Equal, 0L, 0L); + var sut = new LongMemoryComparer(ScanCompareType.Equal, 0L, 0L, BitConverter); Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); } @@ -141,7 +144,7 @@ public static TheoryData sut.Compare(BitConverter.GetBytes(0L), 0, new LongScanResult(0L), out _)).Throws(); } diff --git a/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs index 7c3109fe..b87f37ef 100644 --- a/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs +++ b/ReClass.NET_Tests/MemoryScanner/Comparer/ShortMemoryComparerTest.cs @@ -1,13 +1,16 @@ -using System; +using System; using NFluent; using ReClassNET.MemoryScanner; using ReClassNET.MemoryScanner.Comparer; +using ReClassNET.Util.Conversion; using Xunit; namespace ReClass.NET_Tests.MemoryScanner.Comparer { public class ShortMemoryComparerTest { + private static EndianBitConverter BitConverter { get; } = EndianBitConverter.System; + [Theory] [InlineData(ScanCompareType.Equal, 0, 0)] [InlineData(ScanCompareType.Equal, 1, 2)] @@ -17,7 +20,7 @@ public class ShortMemoryComparerTest [InlineData(ScanCompareType.NotEqual, 0, 0)] public void TestConstructor(ScanCompareType compareType, short value1, short value2) { - var sut = new ShortMemoryComparer(compareType, value1, value2); + var sut = new ShortMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.CompareType).IsEqualTo(compareType); Check.That(sut.ValueSize).IsEqualTo(sizeof(short)); @@ -64,7 +67,7 @@ public void TestConstructor(ScanCompareType compareType, short value1, short val [MemberData(nameof(GetTestCompareScanCompareTypeUnknownData))] public void TestCompare(ScanCompareType compareType, short value1, short value2, byte[] data, bool expectedResult, ScanResult expectedScanResult) { - var sut = new ShortMemoryComparer(compareType, value1, value2); + var sut = new ShortMemoryComparer(compareType, value1, value2, BitConverter); Check.That(sut.Compare(data, 0, out var scanResult)).IsEqualTo(expectedResult); Check.That(scanResult).IsEqualTo(expectedScanResult); @@ -83,7 +86,7 @@ public void TestCompare(ScanCompareType compareType, short value1, short value2, [InlineData(ScanCompareType.IncreasedOrEqual)] public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) { - var sut = new ShortMemoryComparer(compareType, 0, 0); + var sut = new ShortMemoryComparer(compareType, 0, 0, BitConverter); Check.ThatCode(() => sut.Compare(BitConverter.GetBytes((short)0), 0, out _)).Throws(); } @@ -101,7 +104,7 @@ public void TestCompareInvalidCompareTypeThrows(ScanCompareType compareType) [MemberData(nameof(GetTestCompareThrowsData))] public void TestCompareInvalidDataThrows(byte[] data, int index, Type expectedExceptionType) { - var sut = new ShortMemoryComparer(ScanCompareType.Equal, 0, 0); + var sut = new ShortMemoryComparer(ScanCompareType.Equal, 0, 0, BitConverter); Check.ThatCode(() => sut.Compare(data, index, out _)).ThrowsType(expectedExceptionType); } @@ -141,7 +144,7 @@ public static TheoryData sut.Compare(BitConverter.GetBytes((short)0), 0, new ShortScanResult(0), out _)).Throws(); } From 4c50197e7cdfe88b0c7f03a73d84a2e3506d6f7c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 22 Nov 2020 22:05:24 +0100 Subject: [PATCH 754/777] Added converter switch to menu. --- ReClass.NET/Forms/MainForm.Designer.cs | 105 +++++++++++++++---------- ReClass.NET/Forms/MainForm.cs | 7 ++ 2 files changed, 69 insertions(+), 43 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.Designer.cs b/ReClass.NET/Forms/MainForm.Designer.cs index 71a1a118..e2b2a199 100644 --- a/ReClass.NET/Forms/MainForm.Designer.cs +++ b/ReClass.NET/Forms/MainForm.Designer.cs @@ -34,7 +34,7 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.processUpdateTimer = new System.Windows.Forms.Timer(this.components); this.splitContainer = new System.Windows.Forms.SplitContainer(); - this.projectView = new ProjectView(); + this.projectView = new ReClassNET.Controls.ProjectView(); this.projectClassContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.deleteClassToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); @@ -53,26 +53,26 @@ private void InitializeComponent() this.editEnumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.projectEnumsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.editEnumsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.memoryViewControl = new MemoryViewControl(); + this.memoryViewControl = new ReClassNET.Controls.MemoryViewControl(); this.selectedNodeContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.changeTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.integerToolStripMenuItem1 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem2 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem3 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem4 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem5 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem6 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem7 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem1 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem2 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem3 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem4 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem5 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem6 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem7 = new ReClassNET.Controls.IntegerToolStripMenuItem(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.insertBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.integerToolStripMenuItem8 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem9 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem10 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem11 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem12 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem13 = new IntegerToolStripMenuItem(); - this.integerToolStripMenuItem14 = new IntegerToolStripMenuItem(); + this.integerToolStripMenuItem8 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem9 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem10 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem11 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem12 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem13 = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.integerToolStripMenuItem14 = new ReClassNET.Controls.IntegerToolStripMenuItem(); this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.createClassFromNodesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -107,22 +107,22 @@ private void InitializeComponent() this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.newClassToolStripButton = new System.Windows.Forms.ToolStripButton(); this.addBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.add4BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add8BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add64BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add256BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add1024BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add2048BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.add4096BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.add4BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add8BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add64BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add256BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add1024BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add2048BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.add4096BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); this.addXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.insertBytesToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.insert4BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert8BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert64BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert256BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert1024BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert2048BytesToolStripMenuItem = new IntegerToolStripMenuItem(); - this.insert4096BytesToolStripMenuItem = new IntegerToolStripMenuItem(); + this.insert4BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert8BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert64BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert256BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert1024BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert2048BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); + this.insert4096BytesToolStripMenuItem = new ReClassNET.Controls.IntegerToolStripMenuItem(); this.insertXBytesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.nodeTypesToolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); this.statusStrip = new System.Windows.Forms.StatusStrip(); @@ -149,6 +149,8 @@ private void InitializeComponent() this.processInformationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.memorySearcherToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.namedAddressesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); + this.isLittleEndianToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.loadSymbolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.loadSymbolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -215,7 +217,7 @@ private void InitializeComponent() this.projectView.Name = "projectView"; this.projectView.Size = new System.Drawing.Size(201, 524); this.projectView.TabIndex = 0; - this.projectView.SelectionChanged += new ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); + this.projectView.SelectionChanged += new ReClassNET.Controls.ProjectView.SelectionChangedEvent(this.classesView_ClassSelected); // // projectClassContextMenuStrip // @@ -273,33 +275,33 @@ private void InitializeComponent() this.toolStripSeparator22, this.addNewClassToolStripMenuItem}); this.projectClassesContextMenuStrip.Name = "rootContextMenuStrip"; - this.projectClassesContextMenuStrip.Size = new System.Drawing.Size(221, 126); + this.projectClassesContextMenuStrip.Size = new System.Drawing.Size(222, 126); // // enableHierarchyViewToolStripMenuItem // this.enableHierarchyViewToolStripMenuItem.Name = "enableHierarchyViewToolStripMenuItem"; - this.enableHierarchyViewToolStripMenuItem.Size = new System.Drawing.Size(220, 22); + this.enableHierarchyViewToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.enableHierarchyViewToolStripMenuItem.Text = "Enable hierarchy view"; this.enableHierarchyViewToolStripMenuItem.Click += new System.EventHandler(this.enableHierarchyViewToolStripMenuItem_Click); // // autoExpandHierarchyViewToolStripMenuItem // this.autoExpandHierarchyViewToolStripMenuItem.Name = "autoExpandHierarchyViewToolStripMenuItem"; - this.autoExpandHierarchyViewToolStripMenuItem.Size = new System.Drawing.Size(220, 22); + this.autoExpandHierarchyViewToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.autoExpandHierarchyViewToolStripMenuItem.Text = "Auto expand hierarchy view"; this.autoExpandHierarchyViewToolStripMenuItem.Click += new System.EventHandler(this.autoExpandHierarchyViewToolStripMenuItem_Click); // // toolStripSeparator21 // this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(217, 6); + this.toolStripSeparator21.Size = new System.Drawing.Size(218, 6); // // expandAllClassesToolStripMenuItem // this.expandAllClassesToolStripMenuItem.Enabled = false; this.expandAllClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Tree_Expand; this.expandAllClassesToolStripMenuItem.Name = "expandAllClassesToolStripMenuItem"; - this.expandAllClassesToolStripMenuItem.Size = new System.Drawing.Size(220, 22); + this.expandAllClassesToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.expandAllClassesToolStripMenuItem.Text = "Expand all classes"; this.expandAllClassesToolStripMenuItem.Click += new System.EventHandler(this.expandAllClassesToolStripMenuItem_Click); // @@ -308,20 +310,20 @@ private void InitializeComponent() this.collapseAllClassesToolStripMenuItem.Enabled = false; this.collapseAllClassesToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Tree_Collapse; this.collapseAllClassesToolStripMenuItem.Name = "collapseAllClassesToolStripMenuItem"; - this.collapseAllClassesToolStripMenuItem.Size = new System.Drawing.Size(220, 22); + this.collapseAllClassesToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.collapseAllClassesToolStripMenuItem.Text = "Collapse all classes"; this.collapseAllClassesToolStripMenuItem.Click += new System.EventHandler(this.collapseAllClassesToolStripMenuItem_Click); // // toolStripSeparator22 // this.toolStripSeparator22.Name = "toolStripSeparator22"; - this.toolStripSeparator22.Size = new System.Drawing.Size(217, 6); + this.toolStripSeparator22.Size = new System.Drawing.Size(218, 6); // // addNewClassToolStripMenuItem // this.addNewClassToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Class_Add; this.addNewClassToolStripMenuItem.Name = "addNewClassToolStripMenuItem"; - this.addNewClassToolStripMenuItem.Size = new System.Drawing.Size(220, 22); + this.addNewClassToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.addNewClassToolStripMenuItem.Text = "Add new class"; this.addNewClassToolStripMenuItem.Click += new System.EventHandler(this.newClassToolStripButton_Click); // @@ -364,11 +366,11 @@ private void InitializeComponent() this.memoryViewControl.NodeContextMenuStrip = this.selectedNodeContextMenuStrip; this.memoryViewControl.Size = new System.Drawing.Size(936, 524); this.memoryViewControl.TabIndex = 0; - this.memoryViewControl.DrawContextRequested += new DrawContextRequestEventHandler(this.memoryViewControl_DrawContextRequested); + this.memoryViewControl.DrawContextRequested += new ReClassNET.Controls.DrawContextRequestEventHandler(this.memoryViewControl_DrawContextRequested); this.memoryViewControl.SelectionChanged += new System.EventHandler(this.memoryViewControl_SelectionChanged); - this.memoryViewControl.ChangeClassTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeClassTypeClick); - this.memoryViewControl.ChangeWrappedTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeWrappedTypeClick); - this.memoryViewControl.ChangeEnumTypeClick += new NodeClickEventHandler(this.memoryViewControl_ChangeEnumTypeClick); + this.memoryViewControl.ChangeClassTypeClick += new ReClassNET.Controls.NodeClickEventHandler(this.memoryViewControl_ChangeClassTypeClick); + this.memoryViewControl.ChangeWrappedTypeClick += new ReClassNET.Controls.NodeClickEventHandler(this.memoryViewControl_ChangeWrappedTypeClick); + this.memoryViewControl.ChangeEnumTypeClick += new ReClassNET.Controls.NodeClickEventHandler(this.memoryViewControl_ChangeEnumTypeClick); this.memoryViewControl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.memoryViewControl_KeyDown); // // selectedNodeContextMenuStrip @@ -1190,6 +1192,8 @@ private void InitializeComponent() this.processInformationsToolStripMenuItem, this.memorySearcherToolStripMenuItem, this.namedAddressesToolStripMenuItem, + this.toolStripSeparator23, + this.isLittleEndianToolStripMenuItem, this.toolStripSeparator17, this.loadSymbolToolStripMenuItem, this.loadSymbolsToolStripMenuItem, @@ -1225,6 +1229,19 @@ private void InitializeComponent() this.namedAddressesToolStripMenuItem.Text = "Named Addresses..."; this.namedAddressesToolStripMenuItem.Click += new System.EventHandler(this.namedAddressesToolStripMenuItem_Click); // + // toolStripSeparator23 + // + this.toolStripSeparator23.Name = "toolStripSeparator23"; + this.toolStripSeparator23.Size = new System.Drawing.Size(191, 6); + // + // isLittleEndianToolStripMenuItem + // + this.isLittleEndianToolStripMenuItem.CheckOnClick = true; + this.isLittleEndianToolStripMenuItem.Name = "isLittleEndianToolStripMenuItem"; + this.isLittleEndianToolStripMenuItem.Size = new System.Drawing.Size(194, 22); + this.isLittleEndianToolStripMenuItem.Text = "Is Little Endian"; + this.isLittleEndianToolStripMenuItem.Click += new System.EventHandler(this.isLittleEndianToolStripMenuItem_Click); + // // toolStripSeparator17 // this.toolStripSeparator17.Name = "toolStripSeparator17"; @@ -1523,6 +1540,8 @@ private void InitializeComponent() private System.Windows.Forms.ContextMenuStrip projectEnumsContextMenuStrip; private System.Windows.Forms.ToolStripMenuItem editEnumsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem showEnumsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator23; + private System.Windows.Forms.ToolStripMenuItem isLittleEndianToolStripMenuItem; } } diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index bff83d26..e9a18b38 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -21,6 +21,7 @@ using ReClassNET.Project; using ReClassNET.UI; using ReClassNET.Util; +using ReClassNET.Util.Conversion; namespace ReClassNET.Forms { @@ -78,6 +79,7 @@ public MainForm() mainMenuStrip.Renderer = new CustomToolStripProfessionalRenderer(true, true); toolStrip.Renderer = new CustomToolStripProfessionalRenderer(true, false); + isLittleEndianToolStripMenuItem.Checked = BitConverter.IsLittleEndian; Program.RemoteProcess.ProcessAttached += sender => { @@ -351,6 +353,11 @@ private void namedAddressesToolStripMenuItem_Click(object sender, EventArgs e) new NamedAddressesForm(Program.RemoteProcess).Show(); } + private void isLittleEndianToolStripMenuItem_Click(object sender, EventArgs e) + { + Program.RemoteProcess.BitConverter = isLittleEndianToolStripMenuItem.Checked ? (EndianBitConverter)EndianBitConverter.Little : EndianBitConverter.Big; + } + private void loadSymbolToolStripMenuItem_Click(object sender, EventArgs e) { using var ofd = new OpenFileDialog From e7d0513cb46a61b42b18743e44cb508079e70f75 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 23 Nov 2020 14:20:31 +0100 Subject: [PATCH 755/777] Filter null pointers. --- ReClass.NET/Nodes/BaseHexCommentNode.cs | 103 ++++++++++++------------ 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/ReClass.NET/Nodes/BaseHexCommentNode.cs b/ReClass.NET/Nodes/BaseHexCommentNode.cs index ca1421e1..f2a4053f 100644 --- a/ReClass.NET/Nodes/BaseHexCommentNode.cs +++ b/ReClass.NET/Nodes/BaseHexCommentNode.cs @@ -31,75 +31,78 @@ protected int AddComment(DrawContext view, int x, int y, float fvalue, IntPtr iv } } - var namedAddress = view.Process.GetNamedAddress(ivalue); - if (!string.IsNullOrEmpty(namedAddress)) + if (ivalue != IntPtr.Zero) { - if (view.Settings.ShowCommentPointer) + var namedAddress = view.Process.GetNamedAddress(ivalue); + if (!string.IsNullOrEmpty(namedAddress)) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, namedAddress) + view.Font.Width; - } - - if (view.Settings.ShowCommentRtti) - { - var rtti = view.Process.ReadRemoteRuntimeTypeInformation(ivalue); - if (!string.IsNullOrEmpty(rtti)) + if (view.Settings.ShowCommentPointer) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, rtti) + view.Font.Width; + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.NoneId, "->") + view.Font.Width; + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, namedAddress) + view.Font.Width; } - } - if (view.Settings.ShowCommentSymbol) - { - var module = view.Process.GetModuleToPointer(ivalue); - if (module != null) + if (view.Settings.ShowCommentRtti) { - var symbols = view.Process.Symbols.GetSymbolsForModule(module); - var symbol = symbols?.GetSymbolString(ivalue, module); - if (!string.IsNullOrEmpty(symbol)) + var rtti = view.Process.ReadRemoteRuntimeTypeInformation(ivalue); + if (!string.IsNullOrEmpty(rtti)) { - x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol) + view.Font.Width; + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, rtti) + view.Font.Width; } } - } - if (view.Settings.ShowCommentString) - { - var data = view.Process.ReadRemoteMemory(ivalue, 64); - - var isWideString = false; - string text = null; - - // First check if it could be an UTF8 string and if not try UTF16. - if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsPrintableData()) + if (view.Settings.ShowCommentSymbol) { - text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); + var module = view.Process.GetModuleToPointer(ivalue); + if (module != null) + { + var symbols = view.Process.Symbols.GetSymbolsForModule(module); + var symbol = symbols?.GetSymbolString(ivalue, module); + if (!string.IsNullOrEmpty(symbol)) + { + x = AddText(view, x, y, view.Settings.OffsetColor, HotSpot.ReadOnlyId, symbol) + view.Font.Width; + } + } } - else if(data.Take(IntPtr.Size * 2).InterpretAsDoubleByteCharacter().IsPrintableData()) + + if (view.Settings.ShowCommentString) { - isWideString = true; + var data = view.Process.ReadRemoteMemory(ivalue, 64); - text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); - } + var isWideString = false; + string text = null; - if (text != null) - { - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, isWideString ? "L'" : "'"); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, text); - x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; - } - } + // First check if it could be an UTF8 string and if not try UTF16. + if (data.Take(IntPtr.Size).InterpretAsSingleByteCharacter().IsPrintableData()) + { + text = new string(Encoding.UTF8.GetChars(data).TakeWhile(c => c != 0).ToArray()); + } + else if (data.Take(IntPtr.Size * 2).InterpretAsDoubleByteCharacter().IsPrintableData()) + { + isWideString = true; - if (view.Settings.ShowCommentPluginInfo) - { - var nodeAddress = view.Address + Offset; + text = new string(Encoding.Unicode.GetChars(data).TakeWhile(c => c != 0).ToArray()); + } + + if (text != null) + { + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, isWideString ? "L'" : "'"); + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.ReadOnlyId, text); + x = AddText(view, x, y, view.Settings.TextColor, HotSpot.NoneId, "'") + view.Font.Width; + } + } - foreach (var reader in NodeInfoReader) + if (view.Settings.ShowCommentPluginInfo) { - var info = reader.ReadNodeInfo(this, view.Process, view.Memory, nodeAddress, ivalue); - if (info != null) + var nodeAddress = view.Address + Offset; + + foreach (var reader in NodeInfoReader) { - x = AddText(view, x, y, view.Settings.PluginColor, HotSpot.ReadOnlyId, info) + view.Font.Width; + var info = reader.ReadNodeInfo(this, view.Process, view.Memory, nodeAddress, ivalue); + if (info != null) + { + x = AddText(view, x, y, view.Settings.PluginColor, HotSpot.ReadOnlyId, info) + view.Font.Width; + } } } } From e968a2908f3f53a42be61a27a61552f0e91fdc4a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 23 Nov 2020 14:35:14 +0100 Subject: [PATCH 756/777] Reduced IRemoteMemoryReader interface size. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 45 ++--- .../IRemoteMemoryReaderExtension.cs | 146 +++++++++++++++ ReClass.NET/Memory/IRemoteMemoryReader.cs | 70 -------- ReClass.NET/Memory/RemoteProcess.cs | 168 ++---------------- ReClass.NET/Nodes/BaseTextPtrNode.cs | 3 +- ReClass.NET/ReClass.NET.csproj | 3 +- .../AddressParser/ExecutorTest.cs | 3 +- 7 files changed, 183 insertions(+), 255 deletions(-) create mode 100644 ReClass.NET/Extensions/IRemoteMemoryReaderExtension.cs diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 44896bbd..5a23f586 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -29,10 +29,12 @@ public static Func CompileExpression(IExpression express ).Compile(); } - private static Expression GenerateMethodBody(IExpression expression, Expression parameter) + private static Expression GenerateMethodBody(IExpression expression, Expression processParameter) { Contract.Requires(expression != null); - Contract.Requires(parameter != null); + Contract.Requires(processParameter != null); + + static MethodInfo GetIntPtrExtension(string name) => typeof(IntPtrExtension).GetRuntimeMethod(name, new[] { typeof(IntPtr), typeof(IntPtr) }); switch (expression) { @@ -44,7 +46,7 @@ private static Expression GenerateMethodBody(IExpression expression, Expression } case NegateExpression negateExpression: { - var argument = GenerateMethodBody(negateExpression.Expression, parameter); + var argument = GenerateMethodBody(negateExpression.Expression, processParameter); var negateFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.Negate), new[] { typeof(IntPtr) }); @@ -52,29 +54,29 @@ private static Expression GenerateMethodBody(IExpression expression, Expression } case AddExpression addExpression: { - var argument1 = GenerateMethodBody(addExpression.Lhs, parameter); - var argument2 = GenerateMethodBody(addExpression.Rhs, parameter); + var argument1 = GenerateMethodBody(addExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(addExpression.Rhs, processParameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Add)), argument1, argument2); } case SubtractExpression subtractExpression: { - var argument1 = GenerateMethodBody(subtractExpression.Lhs, parameter); - var argument2 = GenerateMethodBody(subtractExpression.Rhs, parameter); + var argument1 = GenerateMethodBody(subtractExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(subtractExpression.Rhs, processParameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Sub)), argument1, argument2); } case MultiplyExpression multiplyExpression: { - var argument1 = GenerateMethodBody(multiplyExpression.Lhs, parameter); - var argument2 = GenerateMethodBody(multiplyExpression.Rhs, parameter); + var argument1 = GenerateMethodBody(multiplyExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(multiplyExpression.Rhs, processParameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Mul)), argument1, argument2); } case DivideExpression divideExpression: { - var argument1 = GenerateMethodBody(divideExpression.Lhs, parameter); - var argument2 = GenerateMethodBody(divideExpression.Rhs, parameter); + var argument1 = GenerateMethodBody(divideExpression.Lhs, processParameter); + var argument2 = GenerateMethodBody(divideExpression.Rhs, processParameter); return Expression.Call(null, GetIntPtrExtension(nameof(IntPtrExtension.Div)), argument1, argument2); } @@ -84,7 +86,7 @@ private static Expression GenerateMethodBody(IExpression expression, Expression var moduleNameConstant = Expression.Constant(moduleExpression.Name); var moduleVariable = Expression.Variable(typeof(Memory.Module)); - var assignExpression = Expression.Assign(moduleVariable, Expression.Call(parameter, getModuleByNameFunc, moduleNameConstant)); + var assignExpression = Expression.Assign(moduleVariable, Expression.Call(processParameter, getModuleByNameFunc, moduleNameConstant)); return Expression.Block( new[] { moduleVariable }, @@ -98,28 +100,15 @@ private static Expression GenerateMethodBody(IExpression expression, Expression } case ReadMemoryExpression readMemoryExpression: { - var argument = GenerateMethodBody(readMemoryExpression.Expression, parameter); - - var functionName = readMemoryExpression.ByteCount == 4 ? nameof(IRemoteMemoryReader.ReadRemoteInt32) : nameof(IRemoteMemoryReader.ReadRemoteInt64); - var readRemoteIntFn = typeof(IRemoteMemoryReader).GetRuntimeMethod(functionName, new[] { typeof(IntPtr) }); + var addressParameter = GenerateMethodBody(readMemoryExpression.Expression, processParameter); - var callExpression = Expression.Call(parameter, readRemoteIntFn, argument); + var readRemoteIntPtrFn = typeof(IRemoteMemoryReaderExtension).GetRuntimeMethod(nameof(IRemoteMemoryReaderExtension.ReadRemoteIntPtr), new[] { typeof(IRemoteMemoryReader), typeof(IntPtr) }); - var paramType = readMemoryExpression.ByteCount == 4 ? typeof(int) : typeof(long); - var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { paramType }); - - return Expression.Call(null, convertFn, callExpression); + return Expression.Call(null, readRemoteIntPtrFn, processParameter, addressParameter); } } throw new ArgumentException($"Unsupported operation '{expression.GetType().FullName}'."); } - - private static MethodInfo GetIntPtrExtension(string name) - { - Contract.Requires(name != null); - - return typeof(IntPtrExtension).GetRuntimeMethod(name, new[] { typeof(IntPtr), typeof(IntPtr) }); - } } } diff --git a/ReClass.NET/Extensions/IRemoteMemoryReaderExtension.cs b/ReClass.NET/Extensions/IRemoteMemoryReaderExtension.cs new file mode 100644 index 00000000..b8f36bab --- /dev/null +++ b/ReClass.NET/Extensions/IRemoteMemoryReaderExtension.cs @@ -0,0 +1,146 @@ +using System; +using System.Diagnostics.Contracts; +using System.Text; +using ReClassNET.Memory; +using ReClassNET.MemoryScanner; + +namespace ReClassNET.Extensions +{ + public static class IRemoteMemoryReaderExtension + { + public static sbyte ReadRemoteInt8(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(sbyte)); + + return (sbyte)data[0]; + } + + public static byte ReadRemoteUInt8(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(byte)); + + return data[0]; + } + + public static short ReadRemoteInt16(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(short)); + + return reader.BitConverter.ToInt16(data, 0); + } + + public static ushort ReadRemoteUInt16(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(ushort)); + + return reader.BitConverter.ToUInt16(data, 0); + } + + public static int ReadRemoteInt32(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(int)); + + return reader.BitConverter.ToInt32(data, 0); + } + + public static uint ReadRemoteUInt32(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(uint)); + + return reader.BitConverter.ToUInt32(data, 0); + } + + public static long ReadRemoteInt64(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(long)); + + return reader.BitConverter.ToInt64(data, 0); + } + + public static ulong ReadRemoteUInt64(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(ulong)); + + return reader.BitConverter.ToUInt64(data, 0); + } + + public static float ReadRemoteFloat(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(float)); + + return reader.BitConverter.ToSingle(data, 0); + } + + public static double ReadRemoteDouble(this IRemoteMemoryReader reader, IntPtr address) + { + var data = reader.ReadRemoteMemory(address, sizeof(double)); + + return reader.BitConverter.ToDouble(data, 0); + } + + public static IntPtr ReadRemoteIntPtr(this IRemoteMemoryReader reader, IntPtr address) + { +#if RECLASSNET64 + return (IntPtr)reader.ReadRemoteInt64(address); +#else + return (IntPtr)reader.ReadRemoteInt32(address); +#endif + } + + public static string ReadRemoteString(this IRemoteMemoryReader reader, IntPtr address, Encoding encoding, int length) + { + Contract.Requires(encoding != null); + Contract.Requires(length >= 0); + Contract.Ensures(Contract.Result() != null); + + var data = reader.ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); + + try + { + var sb = new StringBuilder(encoding.GetString(data)); + for (var i = 0; i < sb.Length; ++i) + { + if (sb[i] == '\0') + { + sb.Length = i; + break; + } + if (!sb[i].IsPrintable()) + { + sb[i] = '.'; + } + } + return sb.ToString(); + } + catch + { + return string.Empty; + } + } + + public static string ReadRemoteStringUntilFirstNullCharacter(this IRemoteMemoryReader reader, IntPtr address, Encoding encoding, int length) + { + Contract.Requires(encoding != null); + Contract.Requires(length >= 0); + Contract.Ensures(Contract.Result() != null); + + var data = reader.ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); + + // TODO We should cache the pattern per encoding. + var index = PatternScanner.FindPattern(BytePattern.From(new byte[encoding.GuessByteCountPerChar()]), data); + if (index == -1) + { + index = data.Length; + } + + try + { + return encoding.GetString(data, 0, Math.Min(index, data.Length)); + } + catch + { + return string.Empty; + } + } + } +} diff --git a/ReClass.NET/Memory/IRemoteMemoryReader.cs b/ReClass.NET/Memory/IRemoteMemoryReader.cs index ed514ddd..f60a4aaf 100644 --- a/ReClass.NET/Memory/IRemoteMemoryReader.cs +++ b/ReClass.NET/Memory/IRemoteMemoryReader.cs @@ -1,5 +1,4 @@ using System; -using System.Text; using ReClassNET.Util.Conversion; namespace ReClassNET.Memory @@ -26,75 +25,6 @@ public interface IRemoteMemoryReader /// An array of bytes. byte[] ReadRemoteMemory(IntPtr address, int size); - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - sbyte ReadRemoteInt8(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - byte ReadRemoteUInt8(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - short ReadRemoteInt16(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - ushort ReadRemoteUInt16(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - int ReadRemoteInt32(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - uint ReadRemoteUInt32(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - long ReadRemoteInt64(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - ulong ReadRemoteUInt64(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - float ReadRemoteFloat(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - double ReadRemoteDouble(IntPtr address); - - /// Reads a from the address in the remote process. - /// The address to read from. - /// The data read as or 0 if the read fails. - IntPtr ReadRemoteIntPtr(IntPtr address); - - /// Reads a string from the address in the remote process with the given length using the provided encoding. - /// The encoding used by the string. - /// The address of the string. - /// The length of the string. - /// The string. - string ReadRemoteString(Encoding encoding, IntPtr address, int length); - - /// Reads a string from the address in the remote process with the given length and encoding. The string gets truncated at the first zero character. - /// The encoding used by the string. - /// The address of the string. - /// The maximum length of the string. - /// The string. - string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length); - /// Reads remote runtime type information for the given address from the remote process. /// The address. /// A string containing the runtime type information or null if no information could get found. diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index bebdf175..55aa6d83 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -10,7 +10,6 @@ using ReClassNET.Core; using ReClassNET.Debugger; using ReClassNET.Extensions; -using ReClassNET.MemoryScanner; using ReClassNET.Native; using ReClassNET.Symbols; using ReClassNET.Util.Conversion; @@ -188,152 +187,13 @@ public byte[] ReadRemoteMemory(IntPtr address, int size) return data; } - #region Read Remote Primitive Types - - public sbyte ReadRemoteInt8(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(sbyte)); - - return (sbyte)data[0]; - } - - public byte ReadRemoteUInt8(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(byte)); - - return data[0]; - } - - public short ReadRemoteInt16(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(short)); - - return BitConverter.ToInt16(data, 0); - } - - public ushort ReadRemoteUInt16(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(ushort)); - - return BitConverter.ToUInt16(data, 0); - } - - public int ReadRemoteInt32(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(int)); - - return BitConverter.ToInt32(data, 0); - } - - public uint ReadRemoteUInt32(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(uint)); - - return BitConverter.ToUInt32(data, 0); - } - - public long ReadRemoteInt64(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(long)); - - return BitConverter.ToInt64(data, 0); - } - - public ulong ReadRemoteUInt64(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(ulong)); - - return BitConverter.ToUInt64(data, 0); - } - - public float ReadRemoteFloat(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(float)); - - return BitConverter.ToSingle(data, 0); - } - - public double ReadRemoteDouble(IntPtr address) - { - var data = ReadRemoteMemory(address, sizeof(double)); - - return BitConverter.ToDouble(data, 0); - } - - public IntPtr ReadRemoteIntPtr(IntPtr address) - { -#if RECLASSNET64 - return (IntPtr)ReadRemoteInt64(address); -#else - return (IntPtr)ReadRemoteInt32(address); -#endif - } - - #endregion - - public string ReadRemoteString(Encoding encoding, IntPtr address, int length) - { - Contract.Requires(encoding != null); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - var data = ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); - - try - { - var sb = new StringBuilder(encoding.GetString(data)); - for (var i = 0; i < sb.Length; ++i) - { - if (sb[i] == '\0') - { - sb.Length = i; - break; - } - if (!sb[i].IsPrintable()) - { - sb[i] = '.'; - } - } - return sb.ToString(); - } - catch - { - return string.Empty; - } - } - - public string ReadRemoteStringUntilFirstNullCharacter(Encoding encoding, IntPtr address, int length) - { - Contract.Requires(encoding != null); - Contract.Requires(length >= 0); - Contract.Ensures(Contract.Result() != null); - - var data = ReadRemoteMemory(address, length * encoding.GuessByteCountPerChar()); - - // TODO We should cache the pattern per encoding. - var index = PatternScanner.FindPattern(BytePattern.From(new byte[encoding.GuessByteCountPerChar()]), data); - if (index == -1) - { - index = data.Length; - } - - try - { - return encoding.GetString(data, 0, Math.Min(index, data.Length)); - } - catch - { - return string.Empty; - } - } - public string ReadRemoteRuntimeTypeInformation(IntPtr address) { if (address.MayBeValid()) { if (!rttiCache.TryGetValue(address, out var rtti)) { - var objectLocatorPtr = ReadRemoteIntPtr(address - IntPtr.Size); + var objectLocatorPtr = this.ReadRemoteIntPtr(address - IntPtr.Size); if (objectLocatorPtr.MayBeValid()) { @@ -354,25 +214,25 @@ public string ReadRemoteRuntimeTypeInformation(IntPtr address) private string ReadRemoteRuntimeTypeInformation32(IntPtr address) { - var classHierarchyDescriptorPtr = ReadRemoteIntPtr(address + 0x10); + var classHierarchyDescriptorPtr = this.ReadRemoteIntPtr(address + 0x10); if (classHierarchyDescriptorPtr.MayBeValid()) { - var baseClassCount = ReadRemoteInt32(classHierarchyDescriptorPtr + 8); + var baseClassCount = this.ReadRemoteInt32(classHierarchyDescriptorPtr + 8); if (baseClassCount > 0 && baseClassCount < 25) { - var baseClassArrayPtr = ReadRemoteIntPtr(classHierarchyDescriptorPtr + 0xC); + var baseClassArrayPtr = this.ReadRemoteIntPtr(classHierarchyDescriptorPtr + 0xC); if (baseClassArrayPtr.MayBeValid()) { var sb = new StringBuilder(); for (var i = 0; i < baseClassCount; ++i) { - var baseClassDescriptorPtr = ReadRemoteIntPtr(baseClassArrayPtr + (4 * i)); + var baseClassDescriptorPtr = this.ReadRemoteIntPtr(baseClassArrayPtr + (4 * i)); if (baseClassDescriptorPtr.MayBeValid()) { - var typeDescriptorPtr = ReadRemoteIntPtr(baseClassDescriptorPtr); + var typeDescriptorPtr = this.ReadRemoteIntPtr(baseClassDescriptorPtr); if (typeDescriptorPtr.MayBeValid()) { - var name = ReadRemoteStringUntilFirstNullCharacter(Encoding.UTF8, typeDescriptorPtr + 0x0C, 60); + var name = this.ReadRemoteStringUntilFirstNullCharacter(typeDescriptorPtr + 0x0C, Encoding.UTF8, 60); if (name.EndsWith("@@")) { name = NativeMethods.UndecorateSymbolName("?" + name); @@ -403,20 +263,20 @@ private string ReadRemoteRuntimeTypeInformation32(IntPtr address) private string ReadRemoteRuntimeTypeInformation64(IntPtr address) { - int baseOffset = ReadRemoteInt32(address + 0x14); + int baseOffset = this.ReadRemoteInt32(address + 0x14); if (baseOffset != 0) { var baseAddress = address - baseOffset; - var classHierarchyDescriptorOffset = ReadRemoteInt32(address + 0x10); + var classHierarchyDescriptorOffset = this.ReadRemoteInt32(address + 0x10); if (classHierarchyDescriptorOffset != 0) { var classHierarchyDescriptorPtr = baseAddress + classHierarchyDescriptorOffset; - var baseClassCount = ReadRemoteInt32(classHierarchyDescriptorPtr + 0x08); + var baseClassCount = this.ReadRemoteInt32(classHierarchyDescriptorPtr + 0x08); if (baseClassCount > 0 && baseClassCount < 25) { - var baseClassArrayOffset = ReadRemoteInt32(classHierarchyDescriptorPtr + 0x0C); + var baseClassArrayOffset = this.ReadRemoteInt32(classHierarchyDescriptorPtr + 0x0C); if (baseClassArrayOffset != 0) { var baseClassArrayPtr = baseAddress + baseClassArrayOffset; @@ -424,17 +284,17 @@ private string ReadRemoteRuntimeTypeInformation64(IntPtr address) var sb = new StringBuilder(); for (var i = 0; i < baseClassCount; ++i) { - var baseClassDescriptorOffset = ReadRemoteInt32(baseClassArrayPtr + (4 * i)); + var baseClassDescriptorOffset = this.ReadRemoteInt32(baseClassArrayPtr + (4 * i)); if (baseClassDescriptorOffset != 0) { var baseClassDescriptorPtr = baseAddress + baseClassDescriptorOffset; - var typeDescriptorOffset = ReadRemoteInt32(baseClassDescriptorPtr); + var typeDescriptorOffset = this.ReadRemoteInt32(baseClassDescriptorPtr); if (typeDescriptorOffset != 0) { var typeDescriptorPtr = baseAddress + typeDescriptorOffset; - var name = ReadRemoteStringUntilFirstNullCharacter(Encoding.UTF8, typeDescriptorPtr + 0x14, 60); + var name = this.ReadRemoteStringUntilFirstNullCharacter(typeDescriptorPtr + 0x14, Encoding.UTF8, 60); if (string.IsNullOrEmpty(name)) { break; diff --git a/ReClass.NET/Nodes/BaseTextPtrNode.cs b/ReClass.NET/Nodes/BaseTextPtrNode.cs index 95096602..d7b00238 100644 --- a/ReClass.NET/Nodes/BaseTextPtrNode.cs +++ b/ReClass.NET/Nodes/BaseTextPtrNode.cs @@ -3,6 +3,7 @@ using System.Drawing; using System.Text; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes @@ -33,7 +34,7 @@ public Size DrawText(DrawContext context, int x, int y, string type) } var ptr = context.Memory.ReadIntPtr(Offset); - var text = context.Process.ReadRemoteString(Encoding, ptr, MaxStringCharacterCount); + var text = context.Process.ReadRemoteString(ptr, Encoding, MaxStringCharacterCount); var origX = x; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index be3a033a..1914f3cf 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -1,4 +1,4 @@ - + @@ -173,6 +173,7 @@ + diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index 748eac5a..6f203bc4 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -1,8 +1,9 @@ -using System; +using System; using System.Collections.Generic; using Moq; using NFluent; using ReClassNET.AddressParser; +using ReClassNET.Extensions; using ReClassNET.Memory; using Xunit; From cb74eb50f68548aacd1cc37641001e6be377bd6e Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 23 Nov 2020 15:07:20 +0100 Subject: [PATCH 757/777] Restored old functionality. --- ReClass.NET/AddressParser/DynamicCompiler.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/AddressParser/DynamicCompiler.cs b/ReClass.NET/AddressParser/DynamicCompiler.cs index 5a23f586..2ffd110b 100644 --- a/ReClass.NET/AddressParser/DynamicCompiler.cs +++ b/ReClass.NET/AddressParser/DynamicCompiler.cs @@ -102,9 +102,15 @@ private static Expression GenerateMethodBody(IExpression expression, Expression { var addressParameter = GenerateMethodBody(readMemoryExpression.Expression, processParameter); - var readRemoteIntPtrFn = typeof(IRemoteMemoryReaderExtension).GetRuntimeMethod(nameof(IRemoteMemoryReaderExtension.ReadRemoteIntPtr), new[] { typeof(IRemoteMemoryReader), typeof(IntPtr) }); + var functionName = readMemoryExpression.ByteCount == 4 ? nameof(IRemoteMemoryReaderExtension.ReadRemoteInt32) : nameof(IRemoteMemoryReaderExtension.ReadRemoteInt64); + var readRemoteIntPtrFn = typeof(IRemoteMemoryReaderExtension).GetRuntimeMethod(functionName, new[] { typeof(IRemoteMemoryReader), typeof(IntPtr) }); - return Expression.Call(null, readRemoteIntPtrFn, processParameter, addressParameter); + var callExpression = Expression.Call(null, readRemoteIntPtrFn, processParameter, addressParameter); + + var paramType = readMemoryExpression.ByteCount == 4 ? typeof(int) : typeof(long); + var convertFn = typeof(IntPtrExtension).GetRuntimeMethod(nameof(IntPtrExtension.From), new[] { paramType }); + + return Expression.Call(null, convertFn, callExpression); } } From 9041ff4243ddc328af13d7cfe6b1373c9080c80a Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 23 Nov 2020 15:09:36 +0100 Subject: [PATCH 758/777] Adjusted tests. --- .../AddressParser/ExecutorTest.cs | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs index 6f203bc4..75de668e 100644 --- a/ReClass.NET_Tests/AddressParser/ExecutorTest.cs +++ b/ReClass.NET_Tests/AddressParser/ExecutorTest.cs @@ -3,8 +3,8 @@ using Moq; using NFluent; using ReClassNET.AddressParser; -using ReClassNET.Extensions; using ReClassNET.Memory; +using ReClassNET.Util.Conversion; using Xunit; namespace ReClass.NET_Tests.AddressParser @@ -76,15 +76,20 @@ public void ModuleExpressionTest(string expression, IntPtr expected) [MemberData(nameof(GetReadMemoryExpressionTestData), 4)] public void ReadMemoryExpression32Test(string expression, IntPtr expected) { + var converter = EndianBitConverter.System; + var mock = new Mock(); - mock.Setup(p => p.ReadRemoteInt32((IntPtr)0)) - .Returns(0); - mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x10)) - .Returns(0x10); - mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x20)) - .Returns(0x20); - mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x30)) - .Returns(0x30); + mock.SetupProperty(p => p.BitConverter) + .SetupGet(p => p.BitConverter) + .Returns(converter); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0, sizeof(int))) + .Returns(converter.GetBytes(0)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x10, sizeof(int))) + .Returns(converter.GetBytes(0x10)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x20, sizeof(int))) + .Returns(converter.GetBytes(0x20)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x30, sizeof(int))) + .Returns(converter.GetBytes(0x30)); var executor = CreateExecutor(); @@ -95,15 +100,20 @@ public void ReadMemoryExpression32Test(string expression, IntPtr expected) [MemberData(nameof(GetReadMemoryExpressionTestData), 8)] public void ReadMemoryExpression64Test(string expression, IntPtr expected) { + var converter = EndianBitConverter.System; + var mock = new Mock(); - mock.Setup(p => p.ReadRemoteInt64((IntPtr)0)) - .Returns(0); - mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x10)) - .Returns(0x10); - mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x20)) - .Returns(0x20); - mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x30)) - .Returns(0x30); + mock.SetupProperty(p => p.BitConverter) + .SetupGet(p => p.BitConverter) + .Returns(converter); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0, sizeof(long))) + .Returns(converter.GetBytes(0L)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x10, sizeof(long))) + .Returns(converter.GetBytes(0x10L)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x20, sizeof(long))) + .Returns(converter.GetBytes(0x20L)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x30, sizeof(long))) + .Returns(converter.GetBytes(0x30L)); var executor = CreateExecutor(); @@ -113,11 +123,16 @@ public void ReadMemoryExpression64Test(string expression, IntPtr expected) [Fact] public void ReadMemoryExpressionInvariantTest() { + var converter = EndianBitConverter.System; + var mock = new Mock(); - mock.Setup(p => p.ReadRemoteInt32((IntPtr)0x10)) - .Returns(0x10); - mock.Setup(p => p.ReadRemoteInt64((IntPtr)0x10)) - .Returns(0x10); + mock.SetupProperty(p => p.BitConverter) + .SetupGet(p => p.BitConverter) + .Returns(converter); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x10, sizeof(int))) + .Returns(converter.GetBytes(0x10)); + mock.Setup(p => p.ReadRemoteMemory((IntPtr)0x10, sizeof(long))) + .Returns(converter.GetBytes(0x10L)); var executor = CreateExecutor(); From 774ec6f94a86426d70c76fc26d68e95caaa3696c Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 23 Nov 2020 22:14:01 +0100 Subject: [PATCH 759/777] Replaced generic method with normal methods. --- .../IRemoteMemoryWriterExtension.cs | 40 +++++++++++++++++++ ReClass.NET/Memory/IRemoteMemoryWriter.cs | 8 +--- ReClass.NET/Memory/RemoteProcess.cs | 11 ----- ReClass.NET/Nodes/BaseMatrixNode.cs | 1 + ReClass.NET/Nodes/BitFieldNode.cs | 1 + ReClass.NET/Nodes/BoolNode.cs | 1 + ReClass.NET/Nodes/DoubleNode.cs | 1 + ReClass.NET/Nodes/FloatNode.cs | 1 + ReClass.NET/ReClass.NET.csproj | 1 + 9 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs diff --git a/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs b/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs new file mode 100644 index 00000000..c587a2d1 --- /dev/null +++ b/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs @@ -0,0 +1,40 @@ +using System; +using System.Text; +using ReClassNET.Memory; + +namespace ReClassNET.Extensions +{ + public static class IRemoteMemoryWriterExtension + { + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, sbyte value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, byte value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, short value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, ushort value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, int value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, uint value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, long value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, ulong value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, float value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, double value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, IntPtr value) + { +#if RECLASSNET64 + writer.WriteRemoteMemory(address, value.ToInt64()); +#else + writer.WriteRemoteMemory(address, value.ToInt32()); +#endif + } + + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, string value, Encoding encoding) => writer.WriteRemoteMemory(address, encoding.GetBytes(value)); + } +} diff --git a/ReClass.NET/Memory/IRemoteMemoryWriter.cs b/ReClass.NET/Memory/IRemoteMemoryWriter.cs index 57bba946..fc895b3a 100644 --- a/ReClass.NET/Memory/IRemoteMemoryWriter.cs +++ b/ReClass.NET/Memory/IRemoteMemoryWriter.cs @@ -1,4 +1,5 @@ using System; +using System.Text; using ReClassNET.Util.Conversion; namespace ReClassNET.Memory @@ -12,12 +13,5 @@ public interface IRemoteMemoryWriter /// The data to write. /// True if it succeeds, false if it fails. bool WriteRemoteMemory(IntPtr address, byte[] data); - - /// Writes the given to the in the remote process. - /// Type of the value to write. - /// The address to write to. - /// The value to write. - /// True if it succeeds, false if it fails. - bool WriteRemoteMemory(IntPtr address, T value) where T : struct; } } diff --git a/ReClass.NET/Memory/RemoteProcess.cs b/ReClass.NET/Memory/RemoteProcess.cs index 55aa6d83..0f994e20 100644 --- a/ReClass.NET/Memory/RemoteProcess.cs +++ b/ReClass.NET/Memory/RemoteProcess.cs @@ -345,17 +345,6 @@ public bool WriteRemoteMemory(IntPtr address, byte[] data) return coreFunctions.WriteRemoteMemory(handle, address, ref data, 0, data.Length); } - public bool WriteRemoteMemory(IntPtr address, T value) where T : struct - { - var data = new byte[Marshal.SizeOf()]; - - var gcHandle = GCHandle.Alloc(data, GCHandleType.Pinned); - Marshal.StructureToPtr(value, gcHandle.AddrOfPinnedObject(), false); - gcHandle.Free(); - - return WriteRemoteMemory(address, data); - } - #endregion public Section GetSectionToPointer(IntPtr address) diff --git a/ReClass.NET/Nodes/BaseMatrixNode.cs b/ReClass.NET/Nodes/BaseMatrixNode.cs index d080b08d..84929c5e 100644 --- a/ReClass.NET/Nodes/BaseMatrixNode.cs +++ b/ReClass.NET/Nodes/BaseMatrixNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/BitFieldNode.cs b/ReClass.NET/Nodes/BitFieldNode.cs index 8f302fda..22461c37 100644 --- a/ReClass.NET/Nodes/BitFieldNode.cs +++ b/ReClass.NET/Nodes/BitFieldNode.cs @@ -2,6 +2,7 @@ using System.Diagnostics.Contracts; using System.Drawing; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; using ReClassNET.Util; diff --git a/ReClass.NET/Nodes/BoolNode.cs b/ReClass.NET/Nodes/BoolNode.cs index 076c0d48..89e164dd 100644 --- a/ReClass.NET/Nodes/BoolNode.cs +++ b/ReClass.NET/Nodes/BoolNode.cs @@ -1,5 +1,6 @@ using System.Drawing; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.UI; namespace ReClassNET.Nodes diff --git a/ReClass.NET/Nodes/DoubleNode.cs b/ReClass.NET/Nodes/DoubleNode.cs index c7de5fee..58df6e15 100644 --- a/ReClass.NET/Nodes/DoubleNode.cs +++ b/ReClass.NET/Nodes/DoubleNode.cs @@ -1,5 +1,6 @@ using System.Drawing; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/Nodes/FloatNode.cs b/ReClass.NET/Nodes/FloatNode.cs index 4b51c51f..b02ebaff 100644 --- a/ReClass.NET/Nodes/FloatNode.cs +++ b/ReClass.NET/Nodes/FloatNode.cs @@ -1,5 +1,6 @@ using System.Drawing; using ReClassNET.Controls; +using ReClassNET.Extensions; using ReClassNET.Memory; using ReClassNET.UI; diff --git a/ReClass.NET/ReClass.NET.csproj b/ReClass.NET/ReClass.NET.csproj index 1914f3cf..0c990cc2 100644 --- a/ReClass.NET/ReClass.NET.csproj +++ b/ReClass.NET/ReClass.NET.csproj @@ -174,6 +174,7 @@ + From 96b36cf7a97d41863b6d75098f681615884d55f7 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 29 Nov 2020 22:04:55 +0100 Subject: [PATCH 760/777] Fixed context menu not working with Mono. (fixes #181) --- ReClass.NET/Forms/LogForm.Designer.cs | 2 +- ReClass.NET/Forms/ProcessInfoForm.Designer.cs | 7 ++++--- ReClass.NET/Forms/ProcessInfoForm.cs | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Forms/LogForm.Designer.cs b/ReClass.NET/Forms/LogForm.Designer.cs index 5bd2d132..384b0974 100644 --- a/ReClass.NET/Forms/LogForm.Designer.cs +++ b/ReClass.NET/Forms/LogForm.Designer.cs @@ -86,7 +86,7 @@ private void InitializeComponent() this.entriesDataGridView.Name = "entriesDataGridView"; this.entriesDataGridView.ReadOnly = true; this.entriesDataGridView.RowHeadersVisible = false; - this.entriesDataGridView.RowTemplate.ContextMenuStrip = this.contextMenuStrip; + this.entriesDataGridView.ContextMenuStrip = this.contextMenuStrip; this.entriesDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.entriesDataGridView.Size = new System.Drawing.Size(563, 188); this.entriesDataGridView.TabIndex = 1; diff --git a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs index 8be2cb73..90fa7959 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.Designer.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.Designer.cs @@ -43,7 +43,7 @@ private void InitializeComponent() this.protectionColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.typeColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.moduleColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.bannerBox1 = new BannerBox(); + this.bannerBox1 = new ReClassNET.Controls.BannerBox(); this.tabControl = new System.Windows.Forms.TabControl(); this.modulesTabPage = new System.Windows.Forms.TabPage(); this.modulesDataGridView = new System.Windows.Forms.DataGridView(); @@ -71,6 +71,7 @@ private void InitializeComponent() this.dumpToolStripMenuItem}); this.contextMenuStrip.Name = "contextMenuStrip"; this.contextMenuStrip.Size = new System.Drawing.Size(203, 98); + this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening); // // setCurrentClassAddressToolStripMenuItem // @@ -115,13 +116,13 @@ private void InitializeComponent() this.protectionColumn, this.typeColumn, this.moduleColumn}); + this.sectionsDataGridView.ContextMenuStrip = this.contextMenuStrip; this.sectionsDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; this.sectionsDataGridView.Location = new System.Drawing.Point(3, 3); this.sectionsDataGridView.MultiSelect = false; this.sectionsDataGridView.Name = "sectionsDataGridView"; this.sectionsDataGridView.ReadOnly = true; this.sectionsDataGridView.RowHeadersVisible = false; - this.sectionsDataGridView.RowTemplate.ContextMenuStrip = this.contextMenuStrip; this.sectionsDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.sectionsDataGridView.Size = new System.Drawing.Size(796, 386); this.sectionsDataGridView.TabIndex = 0; @@ -229,13 +230,13 @@ private void InitializeComponent() this.moduleAddressDataGridViewTextBoxColumn, this.moduleSizeDataGridViewTextBoxColumn, this.modulePathDataGridViewTextBoxColumn}); + this.modulesDataGridView.ContextMenuStrip = this.contextMenuStrip; this.modulesDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; this.modulesDataGridView.Location = new System.Drawing.Point(3, 3); this.modulesDataGridView.MultiSelect = false; this.modulesDataGridView.Name = "modulesDataGridView"; this.modulesDataGridView.ReadOnly = true; this.modulesDataGridView.RowHeadersVisible = false; - this.modulesDataGridView.RowTemplate.ContextMenuStrip = this.contextMenuStrip; this.modulesDataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.modulesDataGridView.Size = new System.Drawing.Size(796, 386); this.modulesDataGridView.TabIndex = 1; diff --git a/ReClass.NET/Forms/ProcessInfoForm.cs b/ReClass.NET/Forms/ProcessInfoForm.cs index e347270b..fc56d3eb 100644 --- a/ReClass.NET/Forms/ProcessInfoForm.cs +++ b/ReClass.NET/Forms/ProcessInfoForm.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Data; using System.Diagnostics.Contracts; using System.Drawing; @@ -129,6 +130,13 @@ private void SelectRow_CellMouseDown(object sender, DataGridViewCellMouseEventAr } } + private void contextMenuStrip_Opening(object sender, CancelEventArgs e) + { + var sourceControl = (sender as ContextMenuStrip)?.SourceControl; + + e.Cancel = sourceControl == null || (sourceControl == modulesDataGridView && GetSelectedModule() == null) || (sourceControl == sectionsDataGridView && GetSelectedSection() == null); + } + private void setCurrentClassAddressToolStripMenuItem_Click(object sender, EventArgs e) { LinkedWindowFeatures.SetCurrentClassAddress(GetSelectedAddress(sender)); From ede1e75b297ed3fb5bb3e815f90621913eebe916 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 13 May 2021 21:33:02 +0200 Subject: [PATCH 761/777] Updated to diStorm 3.5.2 --- .../Dependencies/distorm/include/distorm.h | 93 +- .../Dependencies/distorm/include/mnemonics.h | 472 +- NativeCore/Dependencies/distorm/src/config.h | 7 +- NativeCore/Dependencies/distorm/src/decoder.c | 786 ++- NativeCore/Dependencies/distorm/src/decoder.h | 18 +- NativeCore/Dependencies/distorm/src/distorm.c | 450 +- .../Dependencies/distorm/src/instructions.c | 126 +- .../Dependencies/distorm/src/instructions.h | 304 +- NativeCore/Dependencies/distorm/src/insts.c | 5253 +++++++++-------- NativeCore/Dependencies/distorm/src/insts.h | 2 +- .../Dependencies/distorm/src/mnemonics.c | 465 +- .../Dependencies/distorm/src/operands.c | 1109 ++-- .../Dependencies/distorm/src/operands.h | 9 +- NativeCore/Dependencies/distorm/src/prefix.c | 387 +- NativeCore/Dependencies/distorm/src/prefix.h | 37 +- .../Dependencies/distorm/src/textdefs.c | 174 +- .../Dependencies/distorm/src/textdefs.h | 13 +- NativeCore/Dependencies/distorm/src/wstring.h | 31 +- NativeCore/Dependencies/distorm/src/x86defs.h | 2 +- NativeCore/Unix/Makefile | 10 +- NativeCore/Unix/NativeCore.Unix.vcxproj | 1 - .../Unix/NativeCore.Unix.vcxproj.filters | 6 - NativeCore/Windows/NativeCore.vcxproj | 1 - NativeCore/Windows/NativeCore.vcxproj.filters | 3 - 24 files changed, 4882 insertions(+), 4877 deletions(-) diff --git a/NativeCore/Dependencies/distorm/include/distorm.h b/NativeCore/Dependencies/distorm/include/distorm.h index d99bbc39..2e09c4a6 100644 --- a/NativeCore/Dependencies/distorm/include/distorm.h +++ b/NativeCore/Dependencies/distorm/include/distorm.h @@ -1,4 +1,4 @@ -/* diStorm 3.4.0 */ +/* diStorm 3.5.2 */ /* distorm.h @@ -6,7 +6,7 @@ distorm.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -33,29 +33,27 @@ This library is licensed under the BSD license. See the file COPYING. #undef SUPPORT_64BIT_OFFSET #endif -/* If your compiler doesn't support stdint.h, define your own 64 bits type. */ -#ifdef SUPPORT_64BIT_OFFSET - #ifdef _MSC_VER - #define OFFSET_INTEGER unsigned __int64 - #else - #include - #define OFFSET_INTEGER uint64_t - #endif +#ifndef _MSC_VER +#include #else - /* 32 bit offsets are used. */ - #define OFFSET_INTEGER unsigned long +/* Since MSVC < 2010 isn't shipped with stdint.h, + * here are those from MSVC 2017, which also match + * those in tinycc/libc. */ +typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; #endif -#ifdef _MSC_VER -/* Since MSVC isn't shipped with stdint.h, we will have our own: */ -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef signed __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef signed __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef signed __int8 int8_t; -typedef unsigned __int8 uint8_t; +#ifdef SUPPORT_64BIT_OFFSET +#define OFFSET_INTEGER uint64_t +#else +/* 32 bit offsets are used. */ +#define OFFSET_INTEGER uint32_t #endif /* Support C++ compilers */ @@ -67,10 +65,10 @@ typedef unsigned __int8 uint8_t; /* *** Helper Macros *** */ /* Get the ISC of the instruction, used with the definitions below. */ -#define META_GET_ISC(meta) (((meta) >> 3) & 0x1f) -#define META_SET_ISC(di, isc) (((di)->meta) |= ((isc) << 3)) +#define META_GET_ISC(meta) (((meta) >> 8) & 0x1f) +#define META_SET_ISC(di, isc) (((di)->meta) |= ((isc) << 8)) /* Get the flow control flags of the instruction, see 'features for decompose' below. */ -#define META_GET_FC(meta) ((meta) & 0x7) +#define META_GET_FC(meta) ((meta) & 0xf) /* Get the target address of a branching instruction. O_PC operand type. */ #define INSTRUCTION_GET_TARGET(di) ((_OffsetType)(((di)->addr + (di)->imm.addr + (di)->size))) @@ -91,7 +89,7 @@ typedef unsigned __int8 uint8_t; #define FLAG_GET_OPSIZE(flags) (((flags) >> 8) & 3) #define FLAG_GET_ADDRSIZE(flags) (((flags) >> 10) & 3) /* To get the LOCK/REPNZ/REP prefixes. */ -#define FLAG_GET_PREFIX(flags) ((flags) & 7) +#define FLAG_GET_PREFIX(flags) (((unsigned int)((int16_t)flags)) & 7) /* Indicates whether the instruction is privileged. */ #define FLAG_GET_PRIVILEGED(flags) (((flags) & FLAG_PRIVILEGED_INSTRUCTION) != 0) @@ -99,10 +97,10 @@ typedef unsigned __int8 uint8_t; * Macros to extract segment registers from 'segment': */ #define SEGMENT_DEFAULT 0x80 -#define SEGMENT_SET(di, seg) ((di->segment) |= seg) #define SEGMENT_GET(segment) (((segment) == R_NONE) ? R_NONE : ((segment) & 0x7f)) -#define SEGMENT_IS_DEFAULT(segment) (((segment) & SEGMENT_DEFAULT) == SEGMENT_DEFAULT) - +#define SEGMENT_GET_UNSAFE(segment) ((segment) & 0x7f) +#define SEGMENT_IS_DEFAULT(segment) (((int8_t)segment) < -1) /* Quick check it's a negative number that isn't -1, so it's (0x80 | SEGREG). */ +#define SEGMENT_IS_DEFAULT_OR_NONE(segment) (((uint8_t)(segment)) > 0x80) /* Decodes modes of the disassembler, 16 bits or 32 bits or 64 bits for AMD64, x86-64. */ typedef enum { Decode16Bits = 0, Decode32Bits = 1, Decode64Bits = 2 } _DecodeType; @@ -110,7 +108,8 @@ typedef enum { Decode16Bits = 0, Decode32Bits = 1, Decode64Bits = 2 } _DecodeTyp typedef OFFSET_INTEGER _OffsetType; typedef struct { - _OffsetType codeOffset, nextOffset; /* nextOffset is OUT only. */ + _OffsetType codeOffset, addrMask; + _OffsetType nextOffset; /* nextOffset is OUT only. */ const uint8_t* code; int codeLen; /* Using signed integer makes it easier to detect an underflow. */ _DecodeType dt; @@ -243,6 +242,8 @@ typedef struct { uint16_t opcode; /* Up to four operands per instruction, ignored if ops[n].type == O_NONE. */ _Operand ops[OPERANDS_NO]; + /* Number of valid ops entries. */ + uint8_t opsNo; /* Size of the whole instruction in bytes. */ uint8_t size; /* Segment information of memory indirection, default segment, or overriden one, can be -1. Use SEGMENT macros. */ @@ -251,8 +252,8 @@ typedef struct { uint8_t base, scale; uint8_t dispSize; /* Meta defines the instruction set class, and the flow control flags. Use META macros. */ - uint8_t meta; - /* The CPU flags that the instruction operates upon. */ + uint16_t meta; + /* The CPU flags that the instruction operates upon, set only with DF_FILL_EFLAGS enabled, otherwise 0. */ uint16_t modifiedFlagsMask, testedFlagsMask, undefinedFlagsMask; } _DInst; @@ -271,11 +272,11 @@ typedef struct { * This structure holds all information the disassembler generates per instruction. */ typedef struct { + _OffsetType offset; /* Start offset of the decoded instruction. */ + unsigned int size; /* Size of decoded instruction in bytes. */ _WString mnemonic; /* Mnemonic of decoded instruction, prefixed if required by REP, LOCK etc. */ _WString operands; /* Operands of the decoded instruction, up to 3 operands, comma-seperated. */ _WString instructionHex; /* Hex dump - little endian, including prefixes. */ - unsigned int size; /* Size of decoded instruction in bytes. */ - _OffsetType offset; /* Start offset of the decoded instruction. */ } _DecodedInst; #endif /* DISTORM_LIGHT */ @@ -285,7 +286,7 @@ typedef struct { #define RM_CX 2 /* CL, CH, CX, ECX, RCX */ #define RM_DX 4 /* DL, DH, DX, EDX, RDX */ #define RM_BX 8 /* BL, BH, BX, EBX, RBX */ -#define RM_SP 0x10 /* SPL, SP, ESP, RSP */ +#define RM_SP 0x10 /* SPL, SP, ESP, RSP */ #define RM_BP 0x20 /* BPL, BP, EBP, RBP */ #define RM_SI 0x40 /* SIL, SI, ESI, RSI */ #define RM_DI 0x80 /* DIL, DI, EDI, RDI */ @@ -303,6 +304,7 @@ typedef struct { #define RM_R13 0x80000 /* R13B, R13W, R13D, R13 */ #define RM_R14 0x100000 /* R14B, R14W, R14D, R14 */ #define RM_R15 0x200000 /* R15B, R15W, R15D, R15 */ +#define RM_SEG 0x400000 /* CS, SS, DS, ES, FS, GS */ /* RIP should be checked using the 'flags' field and FLAG_RIP_RELATIVE. * Segments should be checked using the segment macros. @@ -384,8 +386,21 @@ typedef struct { #define DF_STOP_ON_INT 0x100 /* The decoder will stop and return to the caller when any of the 'CMOVxx' instruction was decoded. */ #define DF_STOP_ON_CMOV 0x200 +/* The decoder will stop and return to the caller when it encounters the HLT instruction. */ +#define DF_STOP_ON_HLT 0x400 +/* The decoder will stop and return to the caller when it encounters a privileged instruction. */ +#define DF_STOP_ON_PRIVILEGED 0x800 +/* The decoder will stop and return to the caller when an instruction couldn't be decoded. */ +#define DF_STOP_ON_UNDECODEABLE 0x1000 +/* The decoder will not synchronize to the next byte after the previosuly decoded instruction, instead it will start decoding at the next byte. */ +#define DF_SINGLE_BYTE_STEP 0x2000 +/* The decoder will fill in the eflags fields for the decoded instruction. */ +#define DF_FILL_EFLAGS 0x4000 +/* The decoder will use the addrMask in CodeInfo structure instead of DF_MAXIMUM_ADDR16/32. */ +#define DF_USE_ADDR_MASK 0x8000 + /* The decoder will stop and return to the caller when any flow control instruction was decoded. */ -#define DF_STOP_ON_FLOW_CONTROL (DF_STOP_ON_CALL | DF_STOP_ON_RET | DF_STOP_ON_SYS | DF_STOP_ON_UNC_BRANCH | DF_STOP_ON_CND_BRANCH | DF_STOP_ON_INT | DF_STOP_ON_CMOV) +#define DF_STOP_ON_FLOW_CONTROL (DF_STOP_ON_CALL | DF_STOP_ON_RET | DF_STOP_ON_SYS | DF_STOP_ON_UNC_BRANCH | DF_STOP_ON_CND_BRANCH | DF_STOP_ON_INT | DF_STOP_ON_CMOV | DF_STOP_ON_HLT) /* Indicates the instruction is not a flow-control instruction. */ #define FC_NONE 0 @@ -406,9 +421,11 @@ typedef struct { #define FC_INT 6 /* Indicates the instruction is one of: CMOVxx. */ #define FC_CMOV 7 +/* Indicates the instruction is HLT. */ +#define FC_HLT 8 /* Return code of the decoding function. */ -typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR, DECRES_FILTERED } _DecodeResult; +typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR } _DecodeResult; /* Define the following interface functions only for outer projects. */ #if !(defined(DISTORM_STATIC) || defined(DISTORM_DYNAMIC)) @@ -431,7 +448,7 @@ typedef enum { DECRES_NONE, DECRES_SUCCESS, DECRES_MEMORYERR, DECRES_INPUTERR, D * Notes: 1)The minimal size of maxInstructions is 15. * 2)You will have to synchronize the offset,code and length by yourself if you pass code fragments and not a complete code block! */ - + /* distorm_decompose * See more documentation online at the GitHub project's wiki. * diff --git a/NativeCore/Dependencies/distorm/include/mnemonics.h b/NativeCore/Dependencies/distorm/include/mnemonics.h index 32d71be8..3a784cca 100644 --- a/NativeCore/Dependencies/distorm/include/mnemonics.h +++ b/NativeCore/Dependencies/distorm/include/mnemonics.h @@ -4,7 +4,7 @@ mnemonics.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -41,245 +41,245 @@ extern const _WRegister _REGISTERS[]; #define GET_MNEMONIC_NAME(m) ((_WMnemonic*)&_MNEMONICS[(m)])->p typedef enum { - I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3132, - I_ADDPS = 3125, I_ADDSD = 3146, I_ADDSS = 3139, I_ADDSUBPD = 6416, I_ADDSUBPS = 6426, - I_AESDEC = 9231, I_AESDECLAST = 9248, I_AESENC = 9189, I_AESENCLAST = 9206, - I_AESIMC = 9172, I_AESKEYGENASSIST = 9817, I_AND = 41, I_ANDNPD = 3043, I_ANDNPS = 3035, - I_ANDPD = 3012, I_ANDPS = 3005, I_ARPL = 111, I_BLENDPD = 9394, I_BLENDPS = 9375, - I_BLENDVPD = 7641, I_BLENDVPS = 7631, I_BOUND = 104, I_BSF = 4368, I_BSR = 4380, + I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3144, + I_ADDPS = 3137, I_ADDSD = 3158, I_ADDSS = 3151, I_ADDSUBPD = 6428, I_ADDSUBPS = 6438, + I_AESDEC = 9243, I_AESDECLAST = 9260, I_AESENC = 9201, I_AESENCLAST = 9218, + I_AESIMC = 9184, I_AESKEYGENASSIST = 9829, I_AND = 41, I_ANDNPD = 3055, I_ANDNPS = 3047, + I_ANDPD = 3024, I_ANDPS = 3017, I_ARPL = 111, I_BLENDPD = 9406, I_BLENDPS = 9387, + I_BLENDVPD = 7653, I_BLENDVPS = 7643, I_BOUND = 104, I_BSF = 4380, I_BSR = 4392, I_BSWAP = 960, I_BT = 872, I_BTC = 934, I_BTR = 912, I_BTS = 887, I_CALL = 456, - I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLC = 492, I_CLD = 512, - I_CLFLUSH = 4351, I_CLGI = 1855, I_CLI = 502, I_CLTS = 541, I_CMC = 487, I_CMOVA = 694, - I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, I_CMOVGE = 738, - I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, I_CMOVNS = 708, - I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, I_CMOVZ = 671, - I_CMP = 71, I_CMPEQPD = 4471, I_CMPEQPS = 4392, I_CMPEQSD = 4629, I_CMPEQSS = 4550, - I_CMPLEPD = 4489, I_CMPLEPS = 4410, I_CMPLESD = 4647, I_CMPLESS = 4568, I_CMPLTPD = 4480, - I_CMPLTPS = 4401, I_CMPLTSD = 4638, I_CMPLTSS = 4559, I_CMPNEQPD = 4510, I_CMPNEQPS = 4431, - I_CMPNEQSD = 4668, I_CMPNEQSS = 4589, I_CMPNLEPD = 4530, I_CMPNLEPS = 4451, - I_CMPNLESD = 4688, I_CMPNLESS = 4609, I_CMPNLTPD = 4520, I_CMPNLTPS = 4441, - I_CMPNLTSD = 4678, I_CMPNLTSS = 4599, I_CMPORDPD = 4540, I_CMPORDPS = 4461, - I_CMPORDSD = 4698, I_CMPORDSS = 4619, I_CMPS = 301, I_CMPUNORDPD = 4498, I_CMPUNORDPS = 4419, - I_CMPUNORDSD = 4656, I_CMPUNORDSS = 4577, I_CMPXCHG = 898, I_CMPXCHG16B = 6395, - I_CMPXCHG8B = 6384, I_COMISD = 2801, I_COMISS = 2793, I_CPUID = 865, I_CQO = 255, - I_CRC32 = 9280, I_CVTDQ2PD = 6809, I_CVTDQ2PS = 3329, I_CVTPD2DQ = 6819, I_CVTPD2PI = 2703, - I_CVTPD2PS = 3255, I_CVTPH2PS = 4183, I_CVTPI2PD = 2517, I_CVTPI2PS = 2507, - I_CVTPS2DQ = 3339, I_CVTPS2PD = 3245, I_CVTPS2PH = 4193, I_CVTPS2PI = 2693, - I_CVTSD2SI = 2723, I_CVTSD2SS = 3275, I_CVTSI2SD = 2537, I_CVTSI2SS = 2527, - I_CVTSS2SD = 3265, I_CVTSS2SI = 2713, I_CVTTPD2DQ = 6798, I_CVTTPD2PI = 2636, - I_CVTTPS2DQ = 3349, I_CVTTPS2PI = 2625, I_CVTTSD2SI = 2658, I_CVTTSS2SI = 2647, - I_CWD = 245, I_CWDE = 233, I_DAA = 46, I_DAS = 56, I_DEC = 86, I_DIV = 1646, - I_DIVPD = 3521, I_DIVPS = 3514, I_DIVSD = 3535, I_DIVSS = 3528, I_DPPD = 9637, - I_DPPS = 9624, I_EMMS = 4122, I_ENTER = 340, I_EXTRACTPS = 9502, I_EXTRQ = 4158, - I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, I_FADDP = 1549, I_FBLD = 1601, - I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7311, I_FCMOVB = 1376, I_FCMOVBE = 1392, - I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, I_FCMOVNE = 1454, I_FCMOVNU = 1473, - I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, I_FCOMIP = 1623, I_FCOMP = 1041, - I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, I_FDIV = 1061, I_FDIVP = 1594, - I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, I_FEMMS = 574, I_FENI = 1482, - I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, I_FICOMP = 1338, I_FIDIV = 1361, - I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, I_FINCSTP = 1247, I_FINIT = 7326, - I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, I_FISUB = 1346, I_FISUBR = 1353, - I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, I_FLDENV = 1090, I_FLDL2E = 1155, - I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, I_FLDPI = 1163, I_FLDZ = 1186, - I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7303, I_FNINIT = 7318, I_FNOP = 1111, - I_FNSAVE = 7333, I_FNSTCW = 7288, I_FNSTENV = 7271, I_FNSTSW = 7348, I_FPATAN = 1213, - I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, I_FRNDINT = 1288, I_FRSTOR = 1519, - I_FSAVE = 7341, I_FSCALE = 1297, I_FSETPM = 1496, I_FSIN = 1305, I_FSINCOS = 1279, - I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7296, I_FSTENV = 7280, I_FSTP = 1084, - I_FSTSW = 7356, I_FSUB = 1048, I_FSUBP = 1579, I_FSUBR = 1054, I_FSUBRP = 1571, - I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, I_FUCOMIP = 1614, I_FUCOMP = 1541, - I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, I_FXRSTOR = 9914, I_FXRSTOR64 = 9923, - I_FXSAVE = 9886, I_FXSAVE64 = 9894, I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, - I_GETSEC = 633, I_HADDPD = 4203, I_HADDPS = 4211, I_HLT = 482, I_HSUBPD = 4237, - I_HSUBPS = 4245, I_IDIV = 1651, I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, - I_INSERTPS = 9569, I_INSERTQ = 4165, I_INT = 367, I_INT_3 = 360, I_INT1 = 476, - I_INTO = 372, I_INVD = 555, I_INVEPT = 8306, I_INVLPG = 1727, I_INVLPGA = 1869, - I_INVPCID = 8323, I_INVVPID = 8314, I_IRET = 378, I_JA = 166, I_JAE = 147, - I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, I_JG = 202, I_JGE = 192, - I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, I_JNO = 138, I_JNP = 183, - I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, I_JRCXZ = 440, I_JS = 170, - I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7016, I_LDMXCSR = 9944, I_LDS = 335, - I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4287, I_LFS = 917, I_LGDT = 1703, - I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, I_LODS = 313, I_LOOP = 421, - I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, I_LTR = 1674, I_LZCNT = 4385, - I_MASKMOVDQU = 7141, I_MASKMOVQ = 7131, I_MAXPD = 3581, I_MAXPS = 3574, I_MAXSD = 3595, - I_MAXSS = 3588, I_MFENCE = 4313, I_MINPD = 3461, I_MINPS = 3454, I_MINSD = 3475, - I_MINSS = 3468, I_MONITOR = 1771, I_MOV = 218, I_MOVAPD = 2481, I_MOVAPS = 2473, - I_MOVBE = 9273, I_MOVD = 3942, I_MOVDDUP = 2208, I_MOVDQ2Q = 6544, I_MOVDQA = 3968, - I_MOVDQU = 3976, I_MOVHLPS = 2173, I_MOVHPD = 2367, I_MOVHPS = 2359, I_MOVLHPS = 2350, - I_MOVLPD = 2190, I_MOVLPS = 2182, I_MOVMSKPD = 2837, I_MOVMSKPS = 2827, I_MOVNTDQ = 6871, - I_MOVNTDQA = 7917, I_MOVNTI = 952, I_MOVNTPD = 2578, I_MOVNTPS = 2569, I_MOVNTQ = 6863, - I_MOVNTSD = 2596, I_MOVNTSS = 2587, I_MOVQ = 3948, I_MOVQ2DQ = 6535, I_MOVS = 295, - I_MOVSD = 2132, I_MOVSHDUP = 2375, I_MOVSLDUP = 2198, I_MOVSS = 2125, I_MOVSX = 939, - I_MOVSXD = 10027, I_MOVUPD = 2117, I_MOVUPS = 2109, I_MOVZX = 927, I_MPSADBW = 9650, - I_MUL = 1641, I_MULPD = 3192, I_MULPS = 3185, I_MULSD = 3206, I_MULSS = 3199, - I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, I_NOT = 1631, I_OR = 27, I_ORPD = 3075, - I_ORPS = 3069, I_OUT = 451, I_OUTS = 128, I_PABSB = 7710, I_PABSD = 7740, I_PABSW = 7725, - I_PACKSSDW = 3871, I_PACKSSWB = 3703, I_PACKUSDW = 7938, I_PACKUSWB = 3781, - I_PADDB = 7226, I_PADDD = 7256, I_PADDQ = 6503, I_PADDSB = 6952, I_PADDSW = 6969, - I_PADDUSB = 6642, I_PADDUSW = 6661, I_PADDW = 7241, I_PALIGNR = 9432, I_PAND = 6629, - I_PANDN = 6687, I_PAUSE = 10035, I_PAVGB = 6702, I_PAVGUSB = 2100, I_PAVGW = 6747, - I_PBLENDVB = 7621, I_PBLENDW = 9413, I_PCLMULQDQ = 9669, I_PCMPEQB = 4065, - I_PCMPEQD = 4103, I_PCMPEQQ = 7898, I_PCMPEQW = 4084, I_PCMPESTRI = 9748, - I_PCMPESTRM = 9725, I_PCMPGTB = 3724, I_PCMPGTD = 3762, I_PCMPGTQ = 8109, - I_PCMPGTW = 3743, I_PCMPISTRI = 9794, I_PCMPISTRM = 9771, I_PEXTRB = 9451, - I_PEXTRD = 9468, I_PEXTRQ = 9476, I_PEXTRW = 6333, I_PF2ID = 1936, I_PF2IW = 1929, - I_PFACC = 2050, I_PFADD = 1999, I_PFCMPEQ = 2057, I_PFCMPGE = 1960, I_PFCMPGT = 2006, - I_PFMAX = 2015, I_PFMIN = 1969, I_PFMUL = 2066, I_PFNACC = 1943, I_PFPNACC = 1951, - I_PFRCP = 1976, I_PFRCPIT1 = 2022, I_PFRCPIT2 = 2073, I_PFRSQIT1 = 2032, I_PFRSQRT = 1983, - I_PFSUB = 1992, I_PFSUBR = 2042, I_PHADDD = 7397, I_PHADDSW = 7414, I_PHADDW = 7380, - I_PHMINPOSUW = 8281, I_PHSUBD = 7473, I_PHSUBSW = 7490, I_PHSUBW = 7456, I_PI2FD = 1922, - I_PI2FW = 1915, I_PINSRB = 9552, I_PINSRD = 9590, I_PINSRQ = 9598, I_PINSRW = 6316, - I_PMADDUBSW = 7433, I_PMADDWD = 7095, I_PMAXSB = 8196, I_PMAXSD = 8213, I_PMAXSW = 6986, - I_PMAXUB = 6670, I_PMAXUD = 8247, I_PMAXUW = 8230, I_PMINSB = 8128, I_PMINSD = 8145, - I_PMINSW = 6924, I_PMINUB = 6612, I_PMINUD = 8179, I_PMINUW = 8162, I_PMOVMSKB = 6553, - I_PMOVSXBD = 7776, I_PMOVSXBQ = 7797, I_PMOVSXBW = 7755, I_PMOVSXDQ = 7860, - I_PMOVSXWD = 7818, I_PMOVSXWQ = 7839, I_PMOVZXBD = 8004, I_PMOVZXBQ = 8025, - I_PMOVZXBW = 7983, I_PMOVZXDQ = 8088, I_PMOVZXWD = 8046, I_PMOVZXWQ = 8067, - I_PMULDQ = 7881, I_PMULHRSW = 7560, I_PMULHRW = 2083, I_PMULHUW = 6762, I_PMULHW = 6781, - I_PMULLD = 8264, I_PMULLW = 6518, I_PMULUDQ = 7076, I_POP = 22, I_POPA = 98, - I_POPCNT = 4360, I_POPF = 277, I_POR = 6941, I_PREFETCH = 1894, I_PREFETCHNTA = 2424, - I_PREFETCHT0 = 2437, I_PREFETCHT1 = 2449, I_PREFETCHT2 = 2461, I_PREFETCHW = 1904, - I_PSADBW = 7114, I_PSHUFB = 7363, I_PSHUFD = 4010, I_PSHUFHW = 4018, I_PSHUFLW = 4027, - I_PSHUFW = 4002, I_PSIGNB = 7509, I_PSIGND = 7543, I_PSIGNW = 7526, I_PSLLD = 7046, - I_PSLLDQ = 9869, I_PSLLQ = 7061, I_PSLLW = 7031, I_PSRAD = 6732, I_PSRAW = 6717, - I_PSRLD = 6473, I_PSRLDQ = 9852, I_PSRLQ = 6488, I_PSRLW = 6458, I_PSUBB = 7166, - I_PSUBD = 7196, I_PSUBQ = 7211, I_PSUBSB = 6890, I_PSUBSW = 6907, I_PSUBUSB = 6574, - I_PSUBUSW = 6593, I_PSUBW = 7181, I_PSWAPD = 2092, I_PTEST = 7651, I_PUNPCKHBW = 3802, - I_PUNPCKHDQ = 3848, I_PUNPCKHQDQ = 3917, I_PUNPCKHWD = 3825, I_PUNPCKLBW = 3634, - I_PUNPCKLDQ = 3680, I_PUNPCKLQDQ = 3892, I_PUNPCKLWD = 3657, I_PUSH = 16, - I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7003, I_RCL = 977, I_RCPPS = 2975, I_RCPSS = 2982, - I_RCR = 982, I_RDFSBASE = 9904, I_RDGSBASE = 9934, I_RDMSR = 600, I_RDPMC = 607, - I_RDRAND = 10048, I_RDTSC = 593, I_RDTSCP = 1886, I_RET = 325, I_RETF = 354, - I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9318, I_ROUNDPS = 9299, I_ROUNDSD = 9356, - I_ROUNDSS = 9337, I_RSM = 882, I_RSQRTPS = 2937, I_RSQRTSS = 2946, I_SAHF = 283, + I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLAC = 1787, I_CLC = 492, + I_CLD = 512, I_CLFLUSH = 4363, I_CLGI = 1867, I_CLI = 502, I_CLTS = 541, I_CMC = 487, + I_CMOVA = 694, I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, + I_CMOVGE = 738, I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, + I_CMOVNS = 708, I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, + I_CMOVZ = 671, I_CMP = 71, I_CMPEQPD = 4483, I_CMPEQPS = 4404, I_CMPEQSD = 4641, + I_CMPEQSS = 4562, I_CMPLEPD = 4501, I_CMPLEPS = 4422, I_CMPLESD = 4659, I_CMPLESS = 4580, + I_CMPLTPD = 4492, I_CMPLTPS = 4413, I_CMPLTSD = 4650, I_CMPLTSS = 4571, I_CMPNEQPD = 4522, + I_CMPNEQPS = 4443, I_CMPNEQSD = 4680, I_CMPNEQSS = 4601, I_CMPNLEPD = 4542, + I_CMPNLEPS = 4463, I_CMPNLESD = 4700, I_CMPNLESS = 4621, I_CMPNLTPD = 4532, + I_CMPNLTPS = 4453, I_CMPNLTSD = 4690, I_CMPNLTSS = 4611, I_CMPORDPD = 4552, + I_CMPORDPS = 4473, I_CMPORDSD = 4710, I_CMPORDSS = 4631, I_CMPS = 301, I_CMPUNORDPD = 4510, + I_CMPUNORDPS = 4431, I_CMPUNORDSD = 4668, I_CMPUNORDSS = 4589, I_CMPXCHG = 898, + I_CMPXCHG16B = 6407, I_CMPXCHG8B = 6396, I_COMISD = 2813, I_COMISS = 2805, + I_CPUID = 865, I_CQO = 255, I_CRC32 = 9292, I_CVTDQ2PD = 6821, I_CVTDQ2PS = 3341, + I_CVTPD2DQ = 6831, I_CVTPD2PI = 2715, I_CVTPD2PS = 3267, I_CVTPH2PS = 4195, + I_CVTPI2PD = 2529, I_CVTPI2PS = 2519, I_CVTPS2DQ = 3351, I_CVTPS2PD = 3257, + I_CVTPS2PH = 4205, I_CVTPS2PI = 2705, I_CVTSD2SI = 2735, I_CVTSD2SS = 3287, + I_CVTSI2SD = 2549, I_CVTSI2SS = 2539, I_CVTSS2SD = 3277, I_CVTSS2SI = 2725, + I_CVTTPD2DQ = 6810, I_CVTTPD2PI = 2648, I_CVTTPS2DQ = 3361, I_CVTTPS2PI = 2637, + I_CVTTSD2SI = 2670, I_CVTTSS2SI = 2659, I_CWD = 245, I_CWDE = 233, I_DAA = 46, + I_DAS = 56, I_DEC = 86, I_DIV = 1646, I_DIVPD = 3533, I_DIVPS = 3526, I_DIVSD = 3547, + I_DIVSS = 3540, I_DPPD = 9649, I_DPPS = 9636, I_EMMS = 4134, I_ENTER = 340, + I_EXTRACTPS = 9514, I_EXTRQ = 4170, I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, + I_FADDP = 1549, I_FBLD = 1601, I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7323, + I_FCMOVB = 1376, I_FCMOVBE = 1392, I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, + I_FCMOVNE = 1454, I_FCMOVNU = 1473, I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, + I_FCOMIP = 1623, I_FCOMP = 1041, I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, + I_FDIV = 1061, I_FDIVP = 1594, I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, + I_FEMMS = 574, I_FENI = 1482, I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, + I_FICOMP = 1338, I_FIDIV = 1361, I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, + I_FINCSTP = 1247, I_FINIT = 7338, I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, + I_FISUB = 1346, I_FISUBR = 1353, I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, + I_FLDENV = 1090, I_FLDL2E = 1155, I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, + I_FLDPI = 1163, I_FLDZ = 1186, I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7315, + I_FNINIT = 7330, I_FNOP = 1111, I_FNSAVE = 7345, I_FNSTCW = 7300, I_FNSTENV = 7283, + I_FNSTSW = 7360, I_FPATAN = 1213, I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, + I_FRNDINT = 1288, I_FRSTOR = 1519, I_FSAVE = 7353, I_FSCALE = 1297, I_FSETPM = 1496, + I_FSIN = 1305, I_FSINCOS = 1279, I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7308, + I_FSTENV = 7292, I_FSTP = 1084, I_FSTSW = 7368, I_FSUB = 1048, I_FSUBP = 1579, + I_FSUBR = 1054, I_FSUBRP = 1571, I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, + I_FUCOMIP = 1614, I_FUCOMP = 1541, I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, + I_FXRSTOR = 9926, I_FXRSTOR64 = 9935, I_FXSAVE = 9898, I_FXSAVE64 = 9906, + I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, I_GETSEC = 633, I_HADDPD = 4215, + I_HADDPS = 4223, I_HLT = 482, I_HSUBPD = 4249, I_HSUBPS = 4257, I_IDIV = 1651, + I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, I_INSERTPS = 9581, I_INSERTQ = 4177, + I_INT = 367, I_INT_3 = 360, I_INT1 = 476, I_INTO = 372, I_INVD = 555, I_INVEPT = 8318, + I_INVLPG = 1727, I_INVLPGA = 1881, I_INVPCID = 8335, I_INVVPID = 8326, I_IRET = 378, + I_JA = 166, I_JAE = 147, I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, + I_JG = 202, I_JGE = 192, I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, + I_JNO = 138, I_JNP = 183, I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, + I_JRCXZ = 440, I_JS = 170, I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7028, + I_LDMXCSR = 9956, I_LDS = 335, I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4299, + I_LFS = 917, I_LGDT = 1703, I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, + I_LODS = 313, I_LOOP = 421, I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, + I_LTR = 1674, I_LZCNT = 4397, I_MASKMOVDQU = 7153, I_MASKMOVQ = 7143, I_MAXPD = 3593, + I_MAXPS = 3586, I_MAXSD = 3607, I_MAXSS = 3600, I_MFENCE = 4325, I_MINPD = 3473, + I_MINPS = 3466, I_MINSD = 3487, I_MINSS = 3480, I_MONITOR = 1771, I_MOV = 218, + I_MOVAPD = 2493, I_MOVAPS = 2485, I_MOVBE = 9285, I_MOVD = 3954, I_MOVDDUP = 2220, + I_MOVDQ2Q = 6556, I_MOVDQA = 3980, I_MOVDQU = 3988, I_MOVHLPS = 2185, I_MOVHPD = 2379, + I_MOVHPS = 2371, I_MOVLHPS = 2362, I_MOVLPD = 2202, I_MOVLPS = 2194, I_MOVMSKPD = 2849, + I_MOVMSKPS = 2839, I_MOVNTDQ = 6883, I_MOVNTDQA = 7929, I_MOVNTI = 952, I_MOVNTPD = 2590, + I_MOVNTPS = 2581, I_MOVNTQ = 6875, I_MOVNTSD = 2608, I_MOVNTSS = 2599, I_MOVQ = 3960, + I_MOVQ2DQ = 6547, I_MOVS = 295, I_MOVSD = 2144, I_MOVSHDUP = 2387, I_MOVSLDUP = 2210, + I_MOVSS = 2137, I_MOVSX = 939, I_MOVSXD = 10039, I_MOVUPD = 2129, I_MOVUPS = 2121, + I_MOVZX = 927, I_MPSADBW = 9662, I_MUL = 1641, I_MULPD = 3204, I_MULPS = 3197, + I_MULSD = 3218, I_MULSS = 3211, I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, + I_NOT = 1631, I_OR = 27, I_ORPD = 3087, I_ORPS = 3081, I_OUT = 451, I_OUTS = 128, + I_PABSB = 7722, I_PABSD = 7752, I_PABSW = 7737, I_PACKSSDW = 3883, I_PACKSSWB = 3715, + I_PACKUSDW = 7950, I_PACKUSWB = 3793, I_PADDB = 7238, I_PADDD = 7268, I_PADDQ = 6515, + I_PADDSB = 6964, I_PADDSW = 6981, I_PADDUSB = 6654, I_PADDUSW = 6673, I_PADDW = 7253, + I_PALIGNR = 9444, I_PAND = 6641, I_PANDN = 6699, I_PAUSE = 10047, I_PAVGB = 6714, + I_PAVGUSB = 2112, I_PAVGW = 6759, I_PBLENDVB = 7633, I_PBLENDW = 9425, I_PCLMULQDQ = 9681, + I_PCMPEQB = 4077, I_PCMPEQD = 4115, I_PCMPEQQ = 7910, I_PCMPEQW = 4096, I_PCMPESTRI = 9760, + I_PCMPESTRM = 9737, I_PCMPGTB = 3736, I_PCMPGTD = 3774, I_PCMPGTQ = 8121, + I_PCMPGTW = 3755, I_PCMPISTRI = 9806, I_PCMPISTRM = 9783, I_PEXTRB = 9463, + I_PEXTRD = 9480, I_PEXTRQ = 9488, I_PEXTRW = 6345, I_PF2ID = 1948, I_PF2IW = 1941, + I_PFACC = 2062, I_PFADD = 2011, I_PFCMPEQ = 2069, I_PFCMPGE = 1972, I_PFCMPGT = 2018, + I_PFMAX = 2027, I_PFMIN = 1981, I_PFMUL = 2078, I_PFNACC = 1955, I_PFPNACC = 1963, + I_PFRCP = 1988, I_PFRCPIT1 = 2034, I_PFRCPIT2 = 2085, I_PFRSQIT1 = 2044, I_PFRSQRT = 1995, + I_PFSUB = 2004, I_PFSUBR = 2054, I_PHADDD = 7409, I_PHADDSW = 7426, I_PHADDW = 7392, + I_PHMINPOSUW = 8293, I_PHSUBD = 7485, I_PHSUBSW = 7502, I_PHSUBW = 7468, I_PI2FD = 1934, + I_PI2FW = 1927, I_PINSRB = 9564, I_PINSRD = 9602, I_PINSRQ = 9610, I_PINSRW = 6328, + I_PMADDUBSW = 7445, I_PMADDWD = 7107, I_PMAXSB = 8208, I_PMAXSD = 8225, I_PMAXSW = 6998, + I_PMAXUB = 6682, I_PMAXUD = 8259, I_PMAXUW = 8242, I_PMINSB = 8140, I_PMINSD = 8157, + I_PMINSW = 6936, I_PMINUB = 6624, I_PMINUD = 8191, I_PMINUW = 8174, I_PMOVMSKB = 6565, + I_PMOVSXBD = 7788, I_PMOVSXBQ = 7809, I_PMOVSXBW = 7767, I_PMOVSXDQ = 7872, + I_PMOVSXWD = 7830, I_PMOVSXWQ = 7851, I_PMOVZXBD = 8016, I_PMOVZXBQ = 8037, + I_PMOVZXBW = 7995, I_PMOVZXDQ = 8100, I_PMOVZXWD = 8058, I_PMOVZXWQ = 8079, + I_PMULDQ = 7893, I_PMULHRSW = 7572, I_PMULHRW = 2095, I_PMULHUW = 6774, I_PMULHW = 6793, + I_PMULLD = 8276, I_PMULLW = 6530, I_PMULUDQ = 7088, I_POP = 22, I_POPA = 98, + I_POPCNT = 4372, I_POPF = 277, I_POR = 6953, I_PREFETCH = 1906, I_PREFETCHNTA = 2436, + I_PREFETCHT0 = 2449, I_PREFETCHT1 = 2461, I_PREFETCHT2 = 2473, I_PREFETCHW = 1916, + I_PSADBW = 7126, I_PSHUFB = 7375, I_PSHUFD = 4022, I_PSHUFHW = 4030, I_PSHUFLW = 4039, + I_PSHUFW = 4014, I_PSIGNB = 7521, I_PSIGND = 7555, I_PSIGNW = 7538, I_PSLLD = 7058, + I_PSLLDQ = 9881, I_PSLLQ = 7073, I_PSLLW = 7043, I_PSRAD = 6744, I_PSRAW = 6729, + I_PSRLD = 6485, I_PSRLDQ = 9864, I_PSRLQ = 6500, I_PSRLW = 6470, I_PSUBB = 7178, + I_PSUBD = 7208, I_PSUBQ = 7223, I_PSUBSB = 6902, I_PSUBSW = 6919, I_PSUBUSB = 6586, + I_PSUBUSW = 6605, I_PSUBW = 7193, I_PSWAPD = 2104, I_PTEST = 7663, I_PUNPCKHBW = 3814, + I_PUNPCKHDQ = 3860, I_PUNPCKHQDQ = 3929, I_PUNPCKHWD = 3837, I_PUNPCKLBW = 3646, + I_PUNPCKLDQ = 3692, I_PUNPCKLQDQ = 3904, I_PUNPCKLWD = 3669, I_PUSH = 16, + I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7015, I_RCL = 977, I_RCPPS = 2987, I_RCPSS = 2994, + I_RCR = 982, I_RDFSBASE = 9916, I_RDGSBASE = 9946, I_RDMSR = 600, I_RDPMC = 607, + I_RDRAND = 10060, I_RDTSC = 593, I_RDTSCP = 1898, I_RET = 325, I_RETF = 354, + I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9330, I_ROUNDPS = 9311, I_ROUNDSD = 9368, + I_ROUNDSS = 9349, I_RSM = 882, I_RSQRTPS = 2949, I_RSQRTSS = 2958, I_SAHF = 283, I_SAL = 997, I_SALC = 394, I_SAR = 1002, I_SBB = 36, I_SCAS = 319, I_SETA = 807, I_SETAE = 780, I_SETB = 774, I_SETBE = 800, I_SETG = 859, I_SETGE = 845, I_SETL = 839, I_SETLE = 852, I_SETNO = 767, I_SETNP = 832, I_SETNS = 819, I_SETNZ = 793, - I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4343, I_SGDT = 1691, - I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6358, I_SHUFPS = 6350, - I_SIDT = 1697, I_SKINIT = 1861, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2877, - I_SQRTPS = 2869, I_SQRTSD = 2893, I_SQRTSS = 2885, I_STC = 497, I_STD = 517, - I_STGI = 1849, I_STI = 507, I_STMXCSR = 9973, I_STOS = 307, I_STR = 1663, I_SUB = 51, - I_SUBPD = 3401, I_SUBPS = 3394, I_SUBSD = 3415, I_SUBSS = 3408, I_SWAPGS = 1878, - I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, I_TEST = 206, - I_TZCNT = 4373, I_UCOMISD = 2764, I_UCOMISS = 2755, I_UD2 = 569, I_UNPCKHPD = 2318, - I_UNPCKHPS = 2308, I_UNPCKLPD = 2276, I_UNPCKLPS = 2266, I_VADDPD = 3161, - I_VADDPS = 3153, I_VADDSD = 3177, I_VADDSS = 3169, I_VADDSUBPD = 6436, I_VADDSUBPS = 6447, - I_VAESDEC = 9239, I_VAESDECLAST = 9260, I_VAESENC = 9197, I_VAESENCLAST = 9218, - I_VAESIMC = 9180, I_VAESKEYGENASSIST = 9834, I_VANDNPD = 3060, I_VANDNPS = 3051, - I_VANDPD = 3027, I_VANDPS = 3019, I_VBLENDPD = 9403, I_VBLENDPS = 9384, I_VBLENDVPD = 9703, - I_VBLENDVPS = 9692, I_VBROADCASTF128 = 7694, I_VBROADCASTSD = 7680, I_VBROADCASTSS = 7666, - I_VCMPEQPD = 5110, I_VCMPEQPS = 4708, I_VCMPEQSD = 5914, I_VCMPEQSS = 5512, - I_VCMPEQ_OSPD = 5291, I_VCMPEQ_OSPS = 4889, I_VCMPEQ_OSSD = 6095, I_VCMPEQ_OSSS = 5693, - I_VCMPEQ_UQPD = 5197, I_VCMPEQ_UQPS = 4795, I_VCMPEQ_UQSD = 6001, I_VCMPEQ_UQSS = 5599, - I_VCMPEQ_USPD = 5400, I_VCMPEQ_USPS = 4998, I_VCMPEQ_USSD = 6204, I_VCMPEQ_USSS = 5802, - I_VCMPFALSEPD = 5232, I_VCMPFALSEPS = 4830, I_VCMPFALSESD = 6036, I_VCMPFALSESS = 5634, - I_VCMPFALSE_OSPD = 5441, I_VCMPFALSE_OSPS = 5039, I_VCMPFALSE_OSSD = 6245, - I_VCMPFALSE_OSSS = 5843, I_VCMPGEPD = 5259, I_VCMPGEPS = 4857, I_VCMPGESD = 6063, - I_VCMPGESS = 5661, I_VCMPGE_OQPD = 5471, I_VCMPGE_OQPS = 5069, I_VCMPGE_OQSD = 6275, - I_VCMPGE_OQSS = 5873, I_VCMPGTPD = 5269, I_VCMPGTPS = 4867, I_VCMPGTSD = 6073, - I_VCMPGTSS = 5671, I_VCMPGT_OQPD = 5484, I_VCMPGT_OQPS = 5082, I_VCMPGT_OQSD = 6288, - I_VCMPGT_OQSS = 5886, I_VCMPLEPD = 5130, I_VCMPLEPS = 4728, I_VCMPLESD = 5934, - I_VCMPLESS = 5532, I_VCMPLE_OQPD = 5317, I_VCMPLE_OQPS = 4915, I_VCMPLE_OQSD = 6121, - I_VCMPLE_OQSS = 5719, I_VCMPLTPD = 5120, I_VCMPLTPS = 4718, I_VCMPLTSD = 5924, - I_VCMPLTSS = 5522, I_VCMPLT_OQPD = 5304, I_VCMPLT_OQPS = 4902, I_VCMPLT_OQSD = 6108, - I_VCMPLT_OQSS = 5706, I_VCMPNEQPD = 5153, I_VCMPNEQPS = 4751, I_VCMPNEQSD = 5957, - I_VCMPNEQSS = 5555, I_VCMPNEQ_OQPD = 5245, I_VCMPNEQ_OQPS = 4843, I_VCMPNEQ_OQSD = 6049, - I_VCMPNEQ_OQSS = 5647, I_VCMPNEQ_OSPD = 5457, I_VCMPNEQ_OSPS = 5055, I_VCMPNEQ_OSSD = 6261, - I_VCMPNEQ_OSSS = 5859, I_VCMPNEQ_USPD = 5345, I_VCMPNEQ_USPS = 4943, I_VCMPNEQ_USSD = 6149, - I_VCMPNEQ_USSS = 5747, I_VCMPNGEPD = 5210, I_VCMPNGEPS = 4808, I_VCMPNGESD = 6014, - I_VCMPNGESS = 5612, I_VCMPNGE_UQPD = 5413, I_VCMPNGE_UQPS = 5011, I_VCMPNGE_UQSD = 6217, - I_VCMPNGE_UQSS = 5815, I_VCMPNGTPD = 5221, I_VCMPNGTPS = 4819, I_VCMPNGTSD = 6025, - I_VCMPNGTSS = 5623, I_VCMPNGT_UQPD = 5427, I_VCMPNGT_UQPS = 5025, I_VCMPNGT_UQSD = 6231, - I_VCMPNGT_UQSS = 5829, I_VCMPNLEPD = 5175, I_VCMPNLEPS = 4773, I_VCMPNLESD = 5979, - I_VCMPNLESS = 5577, I_VCMPNLE_UQPD = 5373, I_VCMPNLE_UQPS = 4971, I_VCMPNLE_UQSD = 6177, - I_VCMPNLE_UQSS = 5775, I_VCMPNLTPD = 5164, I_VCMPNLTPS = 4762, I_VCMPNLTSD = 5968, - I_VCMPNLTSS = 5566, I_VCMPNLT_UQPD = 5359, I_VCMPNLT_UQPS = 4957, I_VCMPNLT_UQSD = 6163, - I_VCMPNLT_UQSS = 5761, I_VCMPORDPD = 5186, I_VCMPORDPS = 4784, I_VCMPORDSD = 5990, - I_VCMPORDSS = 5588, I_VCMPORD_SPD = 5387, I_VCMPORD_SPS = 4985, I_VCMPORD_SSD = 6191, - I_VCMPORD_SSS = 5789, I_VCMPTRUEPD = 5279, I_VCMPTRUEPS = 4877, I_VCMPTRUESD = 6083, - I_VCMPTRUESS = 5681, I_VCMPTRUE_USPD = 5497, I_VCMPTRUE_USPS = 5095, I_VCMPTRUE_USSD = 6301, - I_VCMPTRUE_USSS = 5899, I_VCMPUNORDPD = 5140, I_VCMPUNORDPS = 4738, I_VCMPUNORDSD = 5944, - I_VCMPUNORDSS = 5542, I_VCMPUNORD_SPD = 5330, I_VCMPUNORD_SPS = 4928, I_VCMPUNORD_SSD = 6134, - I_VCMPUNORD_SSS = 5732, I_VCOMISD = 2818, I_VCOMISS = 2809, I_VCVTDQ2PD = 6841, - I_VCVTDQ2PS = 3360, I_VCVTPD2DQ = 6852, I_VCVTPD2PS = 3296, I_VCVTPS2DQ = 3371, - I_VCVTPS2PD = 3285, I_VCVTSD2SI = 2744, I_VCVTSD2SS = 3318, I_VCVTSI2SD = 2558, - I_VCVTSI2SS = 2547, I_VCVTSS2SD = 3307, I_VCVTSS2SI = 2733, I_VCVTTPD2DQ = 6829, - I_VCVTTPS2DQ = 3382, I_VCVTTSD2SI = 2681, I_VCVTTSS2SI = 2669, I_VDIVPD = 3550, - I_VDIVPS = 3542, I_VDIVSD = 3566, I_VDIVSS = 3558, I_VDPPD = 9643, I_VDPPS = 9630, - I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9538, I_VEXTRACTPS = 9513, - I_VFMADD132PD = 8409, I_VFMADD132PS = 8396, I_VFMADD132SD = 8435, I_VFMADD132SS = 8422, - I_VFMADD213PD = 8689, I_VFMADD213PS = 8676, I_VFMADD213SD = 8715, I_VFMADD213SS = 8702, - I_VFMADD231PD = 8969, I_VFMADD231PS = 8956, I_VFMADD231SD = 8995, I_VFMADD231SS = 8982, - I_VFMADDSUB132PD = 8348, I_VFMADDSUB132PS = 8332, I_VFMADDSUB213PD = 8628, - I_VFMADDSUB213PS = 8612, I_VFMADDSUB231PD = 8908, I_VFMADDSUB231PS = 8892, - I_VFMSUB132PD = 8461, I_VFMSUB132PS = 8448, I_VFMSUB132SD = 8487, I_VFMSUB132SS = 8474, - I_VFMSUB213PD = 8741, I_VFMSUB213PS = 8728, I_VFMSUB213SD = 8767, I_VFMSUB213SS = 8754, - I_VFMSUB231PD = 9021, I_VFMSUB231PS = 9008, I_VFMSUB231SD = 9047, I_VFMSUB231SS = 9034, - I_VFMSUBADD132PD = 8380, I_VFMSUBADD132PS = 8364, I_VFMSUBADD213PD = 8660, - I_VFMSUBADD213PS = 8644, I_VFMSUBADD231PD = 8940, I_VFMSUBADD231PS = 8924, - I_VFNMADD132PD = 8514, I_VFNMADD132PS = 8500, I_VFNMADD132SD = 8542, I_VFNMADD132SS = 8528, - I_VFNMADD213PD = 8794, I_VFNMADD213PS = 8780, I_VFNMADD213SD = 8822, I_VFNMADD213SS = 8808, - I_VFNMADD231PD = 9074, I_VFNMADD231PS = 9060, I_VFNMADD231SD = 9102, I_VFNMADD231SS = 9088, - I_VFNMSUB132PD = 8570, I_VFNMSUB132PS = 8556, I_VFNMSUB132SD = 8598, I_VFNMSUB132SS = 8584, - I_VFNMSUB213PD = 8850, I_VFNMSUB213PS = 8836, I_VFNMSUB213SD = 8878, I_VFNMSUB213SS = 8864, - I_VFNMSUB231PD = 9130, I_VFNMSUB231PS = 9116, I_VFNMSUB231SD = 9158, I_VFNMSUB231SS = 9144, - I_VHADDPD = 4219, I_VHADDPS = 4228, I_VHSUBPD = 4253, I_VHSUBPS = 4262, I_VINSERTF128 = 9525, - I_VINSERTPS = 9579, I_VLDDQU = 7023, I_VLDMXCSR = 9963, I_VMASKMOVDQU = 7153, - I_VMASKMOVPD = 7971, I_VMASKMOVPS = 7959, I_VMAXPD = 3610, I_VMAXPS = 3602, - I_VMAXSD = 3626, I_VMAXSS = 3618, I_VMCALL = 1735, I_VMCLEAR = 10011, I_VMFUNC = 1803, - I_VMINPD = 3490, I_VMINPS = 3482, I_VMINSD = 3506, I_VMINSS = 3498, I_VMLAUNCH = 1743, - I_VMLOAD = 1833, I_VMMCALL = 1824, I_VMOVAPD = 2498, I_VMOVAPS = 2489, I_VMOVD = 3954, - I_VMOVDDUP = 2256, I_VMOVDQA = 3984, I_VMOVDQU = 3993, I_VMOVHLPS = 2217, - I_VMOVHPD = 2404, I_VMOVHPS = 2395, I_VMOVLHPS = 2385, I_VMOVLPD = 2236, I_VMOVLPS = 2227, - I_VMOVMSKPD = 2858, I_VMOVMSKPS = 2847, I_VMOVNTDQ = 6880, I_VMOVNTDQA = 7927, - I_VMOVNTPD = 2615, I_VMOVNTPS = 2605, I_VMOVQ = 3961, I_VMOVSD = 2165, I_VMOVSHDUP = 2413, - I_VMOVSLDUP = 2245, I_VMOVSS = 2157, I_VMOVUPD = 2148, I_VMOVUPS = 2139, I_VMPSADBW = 9659, - I_VMPTRLD = 10002, I_VMPTRST = 6407, I_VMREAD = 4150, I_VMRESUME = 1753, I_VMRUN = 1817, - I_VMSAVE = 1841, I_VMULPD = 3221, I_VMULPS = 3213, I_VMULSD = 3237, I_VMULSS = 3229, - I_VMWRITE = 4174, I_VMXOFF = 1763, I_VMXON = 10020, I_VORPD = 3088, I_VORPS = 3081, - I_VPABSB = 7717, I_VPABSD = 7747, I_VPABSW = 7732, I_VPACKSSDW = 3881, I_VPACKSSWB = 3713, - I_VPACKUSDW = 7948, I_VPACKUSWB = 3791, I_VPADDB = 7233, I_VPADDD = 7263, - I_VPADDQ = 6510, I_VPADDSB = 6960, I_VPADDSW = 6977, I_VPADDUSW = 6651, I_VPADDW = 7248, - I_VPALIGNR = 9441, I_VPAND = 6635, I_VPANDN = 6694, I_VPAVGB = 6709, I_VPAVGW = 6754, - I_VPBLENDVB = 9714, I_VPBLENDW = 9422, I_VPCLMULQDQ = 9680, I_VPCMPEQB = 4074, - I_VPCMPEQD = 4112, I_VPCMPEQQ = 7907, I_VPCMPEQW = 4093, I_VPCMPESTRI = 9759, - I_VPCMPESTRM = 9736, I_VPCMPGTB = 3733, I_VPCMPGTD = 3771, I_VPCMPGTQ = 8118, - I_VPCMPGTW = 3752, I_VPCMPISTRI = 9805, I_VPCMPISTRM = 9782, I_VPERM2F128 = 9287, - I_VPERMILPD = 7592, I_VPERMILPS = 7581, I_VPEXTRB = 9459, I_VPEXTRD = 9484, - I_VPEXTRQ = 9493, I_VPEXTRW = 6341, I_VPHADDD = 7405, I_VPHADDSW = 7423, I_VPHADDW = 7388, - I_VPHMINPOSUW = 8293, I_VPHSUBD = 7481, I_VPHSUBSW = 7499, I_VPHSUBW = 7464, - I_VPINSRB = 9560, I_VPINSRD = 9606, I_VPINSRQ = 9615, I_VPINSRW = 6324, I_VPMADDUBSW = 7444, - I_VPMADDWD = 7104, I_VPMAXSB = 8204, I_VPMAXSD = 8221, I_VPMAXSW = 6994, I_VPMAXUB = 6678, - I_VPMAXUD = 8255, I_VPMAXUW = 8238, I_VPMINSB = 8136, I_VPMINSD = 8153, I_VPMINSW = 6932, - I_VPMINUB = 6620, I_VPMINUD = 8187, I_VPMINUW = 8170, I_VPMOVMSKB = 6563, - I_VPMOVSXBD = 7786, I_VPMOVSXBQ = 7807, I_VPMOVSXBW = 7765, I_VPMOVSXDQ = 7870, - I_VPMOVSXWD = 7828, I_VPMOVSXWQ = 7849, I_VPMOVZXBD = 8014, I_VPMOVZXBQ = 8035, - I_VPMOVZXBW = 7993, I_VPMOVZXDQ = 8098, I_VPMOVZXWD = 8056, I_VPMOVZXWQ = 8077, - I_VPMULDQ = 7889, I_VPMULHRSW = 7570, I_VPMULHUW = 6771, I_VPMULHW = 6789, - I_VPMULLD = 8272, I_VPMULLW = 6526, I_VPMULUDQ = 7085, I_VPOR = 6946, I_VPSADBW = 7122, - I_VPSHUFB = 7371, I_VPSHUFD = 4036, I_VPSHUFHW = 4045, I_VPSHUFLW = 4055, - I_VPSIGNB = 7517, I_VPSIGND = 7551, I_VPSIGNW = 7534, I_VPSLLD = 7053, I_VPSLLDQ = 9877, - I_VPSLLQ = 7068, I_VPSLLW = 7038, I_VPSRAD = 6739, I_VPSRAW = 6724, I_VPSRLD = 6480, - I_VPSRLDQ = 9860, I_VPSRLQ = 6495, I_VPSRLW = 6465, I_VPSUBB = 7173, I_VPSUBD = 7203, - I_VPSUBQ = 7218, I_VPSUBSB = 6898, I_VPSUBSW = 6915, I_VPSUBUSB = 6583, I_VPSUBUSW = 6602, - I_VPSUBW = 7188, I_VPTEST = 7658, I_VPUNPCKHBW = 3813, I_VPUNPCKHDQ = 3859, - I_VPUNPCKHQDQ = 3929, I_VPUNPCKHWD = 3836, I_VPUNPCKLBW = 3645, I_VPUNPCKLDQ = 3691, - I_VPUNPCKLQDQ = 3904, I_VPUNPCKLWD = 3668, I_VPXOR = 7009, I_VRCPPS = 2989, - I_VRCPSS = 2997, I_VROUNDPD = 9327, I_VROUNDPS = 9308, I_VROUNDSD = 9365, - I_VROUNDSS = 9346, I_VRSQRTPS = 2955, I_VRSQRTSS = 2965, I_VSHUFPD = 6375, - I_VSHUFPS = 6366, I_VSQRTPD = 2910, I_VSQRTPS = 2901, I_VSQRTSD = 2928, I_VSQRTSS = 2919, - I_VSTMXCSR = 9992, I_VSUBPD = 3430, I_VSUBPS = 3422, I_VSUBSD = 3446, I_VSUBSS = 3438, - I_VTESTPD = 7612, I_VTESTPS = 7603, I_VUCOMISD = 2783, I_VUCOMISS = 2773, - I_VUNPCKHPD = 2339, I_VUNPCKHPS = 2328, I_VUNPCKLPD = 2297, I_VUNPCKLPS = 2286, - I_VXORPD = 3117, I_VXORPS = 3109, I_VZEROALL = 4140, I_VZEROUPPER = 4128, - I_WAIT = 10042, I_WBINVD = 561, I_WRFSBASE = 9953, I_WRGSBASE = 9982, I_WRMSR = 586, - I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1811, - I_XGETBV = 1787, I_XLAT = 400, I_XOR = 61, I_XORPD = 3102, I_XORPS = 3095, - I_XRSTOR = 4295, I_XRSTOR64 = 4303, I_XSAVE = 4271, I_XSAVE64 = 4278, I_XSAVEOPT = 4321, - I_XSAVEOPT64 = 4331, I_XSETBV = 1795, I__3DNOW = 10056 + I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4355, I_SGDT = 1691, + I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6370, I_SHUFPS = 6362, + I_SIDT = 1697, I_SKINIT = 1873, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2889, + I_SQRTPS = 2881, I_SQRTSD = 2905, I_SQRTSS = 2897, I_STAC = 1793, I_STC = 497, + I_STD = 517, I_STGI = 1861, I_STI = 507, I_STMXCSR = 9985, I_STOS = 307, I_STR = 1663, + I_SUB = 51, I_SUBPD = 3413, I_SUBPS = 3406, I_SUBSD = 3427, I_SUBSS = 3420, + I_SWAPGS = 1890, I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, + I_TEST = 206, I_TZCNT = 4385, I_UCOMISD = 2776, I_UCOMISS = 2767, I_UD2 = 569, + I_UNPCKHPD = 2330, I_UNPCKHPS = 2320, I_UNPCKLPD = 2288, I_UNPCKLPS = 2278, + I_VADDPD = 3173, I_VADDPS = 3165, I_VADDSD = 3189, I_VADDSS = 3181, I_VADDSUBPD = 6448, + I_VADDSUBPS = 6459, I_VAESDEC = 9251, I_VAESDECLAST = 9272, I_VAESENC = 9209, + I_VAESENCLAST = 9230, I_VAESIMC = 9192, I_VAESKEYGENASSIST = 9846, I_VANDNPD = 3072, + I_VANDNPS = 3063, I_VANDPD = 3039, I_VANDPS = 3031, I_VBLENDPD = 9415, I_VBLENDPS = 9396, + I_VBLENDVPD = 9715, I_VBLENDVPS = 9704, I_VBROADCASTF128 = 7706, I_VBROADCASTSD = 7692, + I_VBROADCASTSS = 7678, I_VCMPEQPD = 5122, I_VCMPEQPS = 4720, I_VCMPEQSD = 5926, + I_VCMPEQSS = 5524, I_VCMPEQ_OSPD = 5303, I_VCMPEQ_OSPS = 4901, I_VCMPEQ_OSSD = 6107, + I_VCMPEQ_OSSS = 5705, I_VCMPEQ_UQPD = 5209, I_VCMPEQ_UQPS = 4807, I_VCMPEQ_UQSD = 6013, + I_VCMPEQ_UQSS = 5611, I_VCMPEQ_USPD = 5412, I_VCMPEQ_USPS = 5010, I_VCMPEQ_USSD = 6216, + I_VCMPEQ_USSS = 5814, I_VCMPFALSEPD = 5244, I_VCMPFALSEPS = 4842, I_VCMPFALSESD = 6048, + I_VCMPFALSESS = 5646, I_VCMPFALSE_OSPD = 5453, I_VCMPFALSE_OSPS = 5051, I_VCMPFALSE_OSSD = 6257, + I_VCMPFALSE_OSSS = 5855, I_VCMPGEPD = 5271, I_VCMPGEPS = 4869, I_VCMPGESD = 6075, + I_VCMPGESS = 5673, I_VCMPGE_OQPD = 5483, I_VCMPGE_OQPS = 5081, I_VCMPGE_OQSD = 6287, + I_VCMPGE_OQSS = 5885, I_VCMPGTPD = 5281, I_VCMPGTPS = 4879, I_VCMPGTSD = 6085, + I_VCMPGTSS = 5683, I_VCMPGT_OQPD = 5496, I_VCMPGT_OQPS = 5094, I_VCMPGT_OQSD = 6300, + I_VCMPGT_OQSS = 5898, I_VCMPLEPD = 5142, I_VCMPLEPS = 4740, I_VCMPLESD = 5946, + I_VCMPLESS = 5544, I_VCMPLE_OQPD = 5329, I_VCMPLE_OQPS = 4927, I_VCMPLE_OQSD = 6133, + I_VCMPLE_OQSS = 5731, I_VCMPLTPD = 5132, I_VCMPLTPS = 4730, I_VCMPLTSD = 5936, + I_VCMPLTSS = 5534, I_VCMPLT_OQPD = 5316, I_VCMPLT_OQPS = 4914, I_VCMPLT_OQSD = 6120, + I_VCMPLT_OQSS = 5718, I_VCMPNEQPD = 5165, I_VCMPNEQPS = 4763, I_VCMPNEQSD = 5969, + I_VCMPNEQSS = 5567, I_VCMPNEQ_OQPD = 5257, I_VCMPNEQ_OQPS = 4855, I_VCMPNEQ_OQSD = 6061, + I_VCMPNEQ_OQSS = 5659, I_VCMPNEQ_OSPD = 5469, I_VCMPNEQ_OSPS = 5067, I_VCMPNEQ_OSSD = 6273, + I_VCMPNEQ_OSSS = 5871, I_VCMPNEQ_USPD = 5357, I_VCMPNEQ_USPS = 4955, I_VCMPNEQ_USSD = 6161, + I_VCMPNEQ_USSS = 5759, I_VCMPNGEPD = 5222, I_VCMPNGEPS = 4820, I_VCMPNGESD = 6026, + I_VCMPNGESS = 5624, I_VCMPNGE_UQPD = 5425, I_VCMPNGE_UQPS = 5023, I_VCMPNGE_UQSD = 6229, + I_VCMPNGE_UQSS = 5827, I_VCMPNGTPD = 5233, I_VCMPNGTPS = 4831, I_VCMPNGTSD = 6037, + I_VCMPNGTSS = 5635, I_VCMPNGT_UQPD = 5439, I_VCMPNGT_UQPS = 5037, I_VCMPNGT_UQSD = 6243, + I_VCMPNGT_UQSS = 5841, I_VCMPNLEPD = 5187, I_VCMPNLEPS = 4785, I_VCMPNLESD = 5991, + I_VCMPNLESS = 5589, I_VCMPNLE_UQPD = 5385, I_VCMPNLE_UQPS = 4983, I_VCMPNLE_UQSD = 6189, + I_VCMPNLE_UQSS = 5787, I_VCMPNLTPD = 5176, I_VCMPNLTPS = 4774, I_VCMPNLTSD = 5980, + I_VCMPNLTSS = 5578, I_VCMPNLT_UQPD = 5371, I_VCMPNLT_UQPS = 4969, I_VCMPNLT_UQSD = 6175, + I_VCMPNLT_UQSS = 5773, I_VCMPORDPD = 5198, I_VCMPORDPS = 4796, I_VCMPORDSD = 6002, + I_VCMPORDSS = 5600, I_VCMPORD_SPD = 5399, I_VCMPORD_SPS = 4997, I_VCMPORD_SSD = 6203, + I_VCMPORD_SSS = 5801, I_VCMPTRUEPD = 5291, I_VCMPTRUEPS = 4889, I_VCMPTRUESD = 6095, + I_VCMPTRUESS = 5693, I_VCMPTRUE_USPD = 5509, I_VCMPTRUE_USPS = 5107, I_VCMPTRUE_USSD = 6313, + I_VCMPTRUE_USSS = 5911, I_VCMPUNORDPD = 5152, I_VCMPUNORDPS = 4750, I_VCMPUNORDSD = 5956, + I_VCMPUNORDSS = 5554, I_VCMPUNORD_SPD = 5342, I_VCMPUNORD_SPS = 4940, I_VCMPUNORD_SSD = 6146, + I_VCMPUNORD_SSS = 5744, I_VCOMISD = 2830, I_VCOMISS = 2821, I_VCVTDQ2PD = 6853, + I_VCVTDQ2PS = 3372, I_VCVTPD2DQ = 6864, I_VCVTPD2PS = 3308, I_VCVTPS2DQ = 3383, + I_VCVTPS2PD = 3297, I_VCVTSD2SI = 2756, I_VCVTSD2SS = 3330, I_VCVTSI2SD = 2570, + I_VCVTSI2SS = 2559, I_VCVTSS2SD = 3319, I_VCVTSS2SI = 2745, I_VCVTTPD2DQ = 6841, + I_VCVTTPS2DQ = 3394, I_VCVTTSD2SI = 2693, I_VCVTTSS2SI = 2681, I_VDIVPD = 3562, + I_VDIVPS = 3554, I_VDIVSD = 3578, I_VDIVSS = 3570, I_VDPPD = 9655, I_VDPPS = 9642, + I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9550, I_VEXTRACTPS = 9525, + I_VFMADD132PD = 8421, I_VFMADD132PS = 8408, I_VFMADD132SD = 8447, I_VFMADD132SS = 8434, + I_VFMADD213PD = 8701, I_VFMADD213PS = 8688, I_VFMADD213SD = 8727, I_VFMADD213SS = 8714, + I_VFMADD231PD = 8981, I_VFMADD231PS = 8968, I_VFMADD231SD = 9007, I_VFMADD231SS = 8994, + I_VFMADDSUB132PD = 8360, I_VFMADDSUB132PS = 8344, I_VFMADDSUB213PD = 8640, + I_VFMADDSUB213PS = 8624, I_VFMADDSUB231PD = 8920, I_VFMADDSUB231PS = 8904, + I_VFMSUB132PD = 8473, I_VFMSUB132PS = 8460, I_VFMSUB132SD = 8499, I_VFMSUB132SS = 8486, + I_VFMSUB213PD = 8753, I_VFMSUB213PS = 8740, I_VFMSUB213SD = 8779, I_VFMSUB213SS = 8766, + I_VFMSUB231PD = 9033, I_VFMSUB231PS = 9020, I_VFMSUB231SD = 9059, I_VFMSUB231SS = 9046, + I_VFMSUBADD132PD = 8392, I_VFMSUBADD132PS = 8376, I_VFMSUBADD213PD = 8672, + I_VFMSUBADD213PS = 8656, I_VFMSUBADD231PD = 8952, I_VFMSUBADD231PS = 8936, + I_VFNMADD132PD = 8526, I_VFNMADD132PS = 8512, I_VFNMADD132SD = 8554, I_VFNMADD132SS = 8540, + I_VFNMADD213PD = 8806, I_VFNMADD213PS = 8792, I_VFNMADD213SD = 8834, I_VFNMADD213SS = 8820, + I_VFNMADD231PD = 9086, I_VFNMADD231PS = 9072, I_VFNMADD231SD = 9114, I_VFNMADD231SS = 9100, + I_VFNMSUB132PD = 8582, I_VFNMSUB132PS = 8568, I_VFNMSUB132SD = 8610, I_VFNMSUB132SS = 8596, + I_VFNMSUB213PD = 8862, I_VFNMSUB213PS = 8848, I_VFNMSUB213SD = 8890, I_VFNMSUB213SS = 8876, + I_VFNMSUB231PD = 9142, I_VFNMSUB231PS = 9128, I_VFNMSUB231SD = 9170, I_VFNMSUB231SS = 9156, + I_VHADDPD = 4231, I_VHADDPS = 4240, I_VHSUBPD = 4265, I_VHSUBPS = 4274, I_VINSERTF128 = 9537, + I_VINSERTPS = 9591, I_VLDDQU = 7035, I_VLDMXCSR = 9975, I_VMASKMOVDQU = 7165, + I_VMASKMOVPD = 7983, I_VMASKMOVPS = 7971, I_VMAXPD = 3622, I_VMAXPS = 3614, + I_VMAXSD = 3638, I_VMAXSS = 3630, I_VMCALL = 1735, I_VMCLEAR = 10023, I_VMFUNC = 1815, + I_VMINPD = 3502, I_VMINPS = 3494, I_VMINSD = 3518, I_VMINSS = 3510, I_VMLAUNCH = 1743, + I_VMLOAD = 1845, I_VMMCALL = 1836, I_VMOVAPD = 2510, I_VMOVAPS = 2501, I_VMOVD = 3966, + I_VMOVDDUP = 2268, I_VMOVDQA = 3996, I_VMOVDQU = 4005, I_VMOVHLPS = 2229, + I_VMOVHPD = 2416, I_VMOVHPS = 2407, I_VMOVLHPS = 2397, I_VMOVLPD = 2248, I_VMOVLPS = 2239, + I_VMOVMSKPD = 2870, I_VMOVMSKPS = 2859, I_VMOVNTDQ = 6892, I_VMOVNTDQA = 7939, + I_VMOVNTPD = 2627, I_VMOVNTPS = 2617, I_VMOVQ = 3973, I_VMOVSD = 2177, I_VMOVSHDUP = 2425, + I_VMOVSLDUP = 2257, I_VMOVSS = 2169, I_VMOVUPD = 2160, I_VMOVUPS = 2151, I_VMPSADBW = 9671, + I_VMPTRLD = 10014, I_VMPTRST = 6419, I_VMREAD = 4162, I_VMRESUME = 1753, I_VMRUN = 1829, + I_VMSAVE = 1853, I_VMULPD = 3233, I_VMULPS = 3225, I_VMULSD = 3249, I_VMULSS = 3241, + I_VMWRITE = 4186, I_VMXOFF = 1763, I_VMXON = 10032, I_VORPD = 3100, I_VORPS = 3093, + I_VPABSB = 7729, I_VPABSD = 7759, I_VPABSW = 7744, I_VPACKSSDW = 3893, I_VPACKSSWB = 3725, + I_VPACKUSDW = 7960, I_VPACKUSWB = 3803, I_VPADDB = 7245, I_VPADDD = 7275, + I_VPADDQ = 6522, I_VPADDSB = 6972, I_VPADDSW = 6989, I_VPADDUSW = 6663, I_VPADDW = 7260, + I_VPALIGNR = 9453, I_VPAND = 6647, I_VPANDN = 6706, I_VPAVGB = 6721, I_VPAVGW = 6766, + I_VPBLENDVB = 9726, I_VPBLENDW = 9434, I_VPCLMULQDQ = 9692, I_VPCMPEQB = 4086, + I_VPCMPEQD = 4124, I_VPCMPEQQ = 7919, I_VPCMPEQW = 4105, I_VPCMPESTRI = 9771, + I_VPCMPESTRM = 9748, I_VPCMPGTB = 3745, I_VPCMPGTD = 3783, I_VPCMPGTQ = 8130, + I_VPCMPGTW = 3764, I_VPCMPISTRI = 9817, I_VPCMPISTRM = 9794, I_VPERM2F128 = 9299, + I_VPERMILPD = 7604, I_VPERMILPS = 7593, I_VPEXTRB = 9471, I_VPEXTRD = 9496, + I_VPEXTRQ = 9505, I_VPEXTRW = 6353, I_VPHADDD = 7417, I_VPHADDSW = 7435, I_VPHADDW = 7400, + I_VPHMINPOSUW = 8305, I_VPHSUBD = 7493, I_VPHSUBSW = 7511, I_VPHSUBW = 7476, + I_VPINSRB = 9572, I_VPINSRD = 9618, I_VPINSRQ = 9627, I_VPINSRW = 6336, I_VPMADDUBSW = 7456, + I_VPMADDWD = 7116, I_VPMAXSB = 8216, I_VPMAXSD = 8233, I_VPMAXSW = 7006, I_VPMAXUB = 6690, + I_VPMAXUD = 8267, I_VPMAXUW = 8250, I_VPMINSB = 8148, I_VPMINSD = 8165, I_VPMINSW = 6944, + I_VPMINUB = 6632, I_VPMINUD = 8199, I_VPMINUW = 8182, I_VPMOVMSKB = 6575, + I_VPMOVSXBD = 7798, I_VPMOVSXBQ = 7819, I_VPMOVSXBW = 7777, I_VPMOVSXDQ = 7882, + I_VPMOVSXWD = 7840, I_VPMOVSXWQ = 7861, I_VPMOVZXBD = 8026, I_VPMOVZXBQ = 8047, + I_VPMOVZXBW = 8005, I_VPMOVZXDQ = 8110, I_VPMOVZXWD = 8068, I_VPMOVZXWQ = 8089, + I_VPMULDQ = 7901, I_VPMULHRSW = 7582, I_VPMULHUW = 6783, I_VPMULHW = 6801, + I_VPMULLD = 8284, I_VPMULLW = 6538, I_VPMULUDQ = 7097, I_VPOR = 6958, I_VPSADBW = 7134, + I_VPSHUFB = 7383, I_VPSHUFD = 4048, I_VPSHUFHW = 4057, I_VPSHUFLW = 4067, + I_VPSIGNB = 7529, I_VPSIGND = 7563, I_VPSIGNW = 7546, I_VPSLLD = 7065, I_VPSLLDQ = 9889, + I_VPSLLQ = 7080, I_VPSLLW = 7050, I_VPSRAD = 6751, I_VPSRAW = 6736, I_VPSRLD = 6492, + I_VPSRLDQ = 9872, I_VPSRLQ = 6507, I_VPSRLW = 6477, I_VPSUBB = 7185, I_VPSUBD = 7215, + I_VPSUBQ = 7230, I_VPSUBSB = 6910, I_VPSUBSW = 6927, I_VPSUBUSB = 6595, I_VPSUBUSW = 6614, + I_VPSUBW = 7200, I_VPTEST = 7670, I_VPUNPCKHBW = 3825, I_VPUNPCKHDQ = 3871, + I_VPUNPCKHQDQ = 3941, I_VPUNPCKHWD = 3848, I_VPUNPCKLBW = 3657, I_VPUNPCKLDQ = 3703, + I_VPUNPCKLQDQ = 3916, I_VPUNPCKLWD = 3680, I_VPXOR = 7021, I_VRCPPS = 3001, + I_VRCPSS = 3009, I_VROUNDPD = 9339, I_VROUNDPS = 9320, I_VROUNDSD = 9377, + I_VROUNDSS = 9358, I_VRSQRTPS = 2967, I_VRSQRTSS = 2977, I_VSHUFPD = 6387, + I_VSHUFPS = 6378, I_VSQRTPD = 2922, I_VSQRTPS = 2913, I_VSQRTSD = 2940, I_VSQRTSS = 2931, + I_VSTMXCSR = 10004, I_VSUBPD = 3442, I_VSUBPS = 3434, I_VSUBSD = 3458, I_VSUBSS = 3450, + I_VTESTPD = 7624, I_VTESTPS = 7615, I_VUCOMISD = 2795, I_VUCOMISS = 2785, + I_VUNPCKHPD = 2351, I_VUNPCKHPS = 2340, I_VUNPCKLPD = 2309, I_VUNPCKLPS = 2298, + I_VXORPD = 3129, I_VXORPS = 3121, I_VZEROALL = 4152, I_VZEROUPPER = 4140, + I_WAIT = 10054, I_WBINVD = 561, I_WRFSBASE = 9965, I_WRGSBASE = 9994, I_WRMSR = 586, + I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1823, + I_XGETBV = 1799, I_XLAT = 400, I_XOR = 61, I_XORPD = 3114, I_XORPS = 3107, + I_XRSTOR = 4307, I_XRSTOR64 = 4315, I_XSAVE = 4283, I_XSAVE64 = 4290, I_XSAVEOPT = 4333, + I_XSAVEOPT64 = 4343, I_XSETBV = 1807, I__3DNOW = 10068 } _InstructionType; typedef enum { diff --git a/NativeCore/Dependencies/distorm/src/config.h b/NativeCore/Dependencies/distorm/src/config.h index 3fdaf44a..e78dba36 100644 --- a/NativeCore/Dependencies/distorm/src/config.h +++ b/NativeCore/Dependencies/distorm/src/config.h @@ -4,7 +4,7 @@ config.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -13,7 +13,7 @@ This library is licensed under the BSD license. See the file COPYING. #define CONFIG_H /* diStorm version number. */ -#define __DISTORMV__ 0x030400 +#define __DISTORMV__ 0x030502 #include /* memset, memcpy - can be easily self implemented for libc independency. */ @@ -57,6 +57,7 @@ This library is licensed under the BSD license. See the file COPYING. #define _DLLEXPORT_ #define _FASTCALL_ +/* Keep inline as static (arrrrg) as it would break linux on some flavors otherwise. */ #define _INLINE_ static /* GCC ignores this directive... */ /*#define _FASTCALL_ __attribute__((__fastcall__))*/ @@ -94,7 +95,7 @@ This library is licensed under the BSD license. See the file COPYING. #define _DLLEXPORT_ #define _FASTCALL_ -#define _INLINE_ +#define _INLINE_ static /* End of __TINYC__ */ diff --git a/NativeCore/Dependencies/distorm/src/decoder.c b/NativeCore/Dependencies/distorm/src/decoder.c index 188996df..29adcd43 100644 --- a/NativeCore/Dependencies/distorm/src/decoder.c +++ b/NativeCore/Dependencies/distorm/src/decoder.c @@ -4,7 +4,7 @@ decoder.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -24,30 +24,34 @@ This library is licensed under the BSD license. See the file COPYING. static _DecodeType decode_get_effective_addr_size(_DecodeType dt, _iflags decodedPrefixes) { /* - * This table is to map from the current decoding mode to an effective address size: + * Map from the current decoding mode to an effective address size: * Decode16 -> Decode32 * Decode32 -> Decode16 * Decode64 -> Decode32 */ - static _DecodeType AddrSizeTable[] = {Decode32Bits, Decode16Bits, Decode32Bits}; /* Switch to non default mode if prefix exists, only for ADDRESS SIZE. */ - if (decodedPrefixes & INST_PRE_ADDR_SIZE) dt = AddrSizeTable[dt]; + if (decodedPrefixes & INST_PRE_ADDR_SIZE) { + if (dt == Decode32Bits) return Decode16Bits; + return Decode32Bits; + } return dt; } static _DecodeType decode_get_effective_op_size(_DecodeType dt, _iflags decodedPrefixes, unsigned int rex, _iflags instFlags) { /* - * This table is to map from the current decoding mode to an effective operand size: + * Map from the current decoding mode to an effective operand size: * Decode16 -> Decode32 * Decode32 -> Decode16 * Decode64 -> Decode16 * Not that in 64bits it's a bit more complicated, because of REX and promoted instructions. */ - static _DecodeType OpSizeTable[] = {Decode32Bits, Decode16Bits, Decode16Bits}; - if (decodedPrefixes & INST_PRE_OP_SIZE) return OpSizeTable[dt]; + if (decodedPrefixes & INST_PRE_OP_SIZE) { + if (dt == Decode16Bits) return Decode32Bits; + return Decode16Bits; + } if (dt == Decode64Bits) { /* @@ -60,83 +64,71 @@ static _DecodeType decode_get_effective_op_size(_DecodeType dt, _iflags decodedP /* Automatically promoted instructions have only INST_64BITS SET! */ if (((instFlags & (INST_64BITS | INST_PRE_REX)) == INST_64BITS) || /* Other instructions in 64 bits can be promoted only with a REX prefix. */ - ((decodedPrefixes & INST_PRE_REX) && (rex & PREFIX_EX_W))) dt = Decode64Bits; - else dt = Decode32Bits; /* Default. */ + ((decodedPrefixes & INST_PRE_REX) && (rex & PREFIX_EX_W))) return Decode64Bits; + return Decode32Bits; /* Default. */ } + return dt; } -/* A helper macro to convert from diStorm's CPU flags to EFLAGS. */ +/* + * A helper macro to convert from diStorm's CPU flags to EFLAGS. + * Copy eflags from compact version (8 bits) to eflags compatible (16 bits). + * From D_COMPACT_IF to D_IF, bit index 1 to 9. + * From D_COMPACT_DF to D_DF, bit index 3 to 10. + * From D_COMPACT_OF to D_OF, bit index 5 to 11. + */ #define CONVERT_FLAGS_TO_EFLAGS(dst, src, field) dst->field = ((src->field & D_COMPACT_SAME_FLAGS) | \ - ((src->field & D_COMPACT_IF) ? D_IF : 0) | \ - ((src->field & D_COMPACT_DF) ? D_DF : 0) | \ - ((src->field & D_COMPACT_OF) ? D_OF : 0)); + ((src->field & D_COMPACT_IF) << (9 - 1)) | \ + ((src->field & D_COMPACT_DF) << (10 - 3)) | \ + ((src->field & D_COMPACT_OF) << (11 - 5))); -static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, _DInst* di) +/* If DECRES_SUCCESS is returned, CI is in sync, otherwise it loses sync. */ +/* Important note: CI is keeping track only for code and codeLen, in case of a failure caller has to restart on their own. */ +static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, const uint8_t* startCode, _DInst* di) { - /* Remember whether the instruction is privileged. */ - uint16_t privilegedFlag = 0; - - /* The ModR/M byte of the current instruction. */ - unsigned int modrm = 0; - - /* The REX/VEX prefix byte value. */ - unsigned int vrex = ps->vrex; - - /* - * Backup original input, so we can use it later if a problem occurs - * (like not enough data for decoding, invalid opcode, etc). - */ - const uint8_t* startCode = ci->code; - /* Holds the info about the current found instruction. */ - _InstInfo* ii = NULL; - _InstInfo iip; /* Privileged instruction cache. */ - _InstSharedInfo* isi = NULL; - - /* Used only for special CMP instructions which have pseudo opcodes suffix. */ - unsigned char cmpType = 0; - - /* - * Indicates whether it is right to LOCK the instruction by decoding its first operand. - * Only then you know if it's ok to output the LOCK prefix's text... - * Used for first operand only. - */ - int lockable = FALSE; + _InstInfo* ii; + _InstSharedInfo* isi; /* Calculate (and cache) effective-operand-size and effective-address-size only once. */ _DecodeType effOpSz, effAdrSz; _iflags instFlags; - ii = inst_lookup(ci, ps); + /* The ModR/M byte of the current instruction. */ + unsigned int modrm = 0; + int isPrefixed = 0; + + ii = inst_lookup(ci, ps, &isPrefixed); if (ii == NULL) goto _Undecodable; + isi = &InstSharedInfoTable[ii->sharedIndex]; instFlags = FlagsTable[isi->flagsIndex]; - privilegedFlag = ii->opcodeId & OPCODE_ID_PRIVILEGED; - if (privilegedFlag) { + /* Cache the effective operand-size and address-size. */ + if (isPrefixed) { + /* - * Copy the privileged instruction info so we can remove the privileged bit - * from the opcodeId field. This makes sure we're not modifying the tables - * in case we lookup this privileged instruction later. - */ - iip = *ii; - iip.opcodeId &= ~OPCODE_ID_PRIVILEGED; - ii = &iip; - } + * If both REX and OpSize are available we will have to disable the OpSize, because REX has precedence. + * However, only if REX.W is set! + * We had to wait with this test, since the operand size may be a mandatory prefix, + * and we know it only after fetching opcode. + */ + if ((ps->decodedPrefixes & INST_PRE_OP_SIZE) && + (ps->prefixExtType == PET_REX) && + (ps->vrex & PREFIX_EX_W) && + (!ps->isOpSizeMandatory)) { + ps->decodedPrefixes &= ~INST_PRE_OP_SIZE; + prefixes_ignore(ps, PFXIDX_OP_SIZE); + } - /* - * If both REX and OpSize are available we will have to disable the OpSize, because REX has precedence. - * However, only if REX.W is set ! - * We had to wait with this test, since the operand size may be a mandatory prefix, - * and we know it only after prefetching. - */ - if ((ps->prefixExtType == PET_REX) && - (ps->decodedPrefixes & INST_PRE_OP_SIZE) && - (!ps->isOpSizeMandatory) && - (vrex & PREFIX_EX_W)) { - ps->decodedPrefixes &= ~INST_PRE_OP_SIZE; - prefixes_ignore(ps, PFXIDX_OP_SIZE); + effAdrSz = decode_get_effective_addr_size(ci->dt, ps->decodedPrefixes); + effOpSz = decode_get_effective_op_size(ci->dt, ps->decodedPrefixes, ps->vrex, instFlags); + } + else + { + effAdrSz = ci->dt; /* Default is current decoding type since there's no prefix. */ + effOpSz = decode_get_effective_op_size(ci->dt, 0, 0, instFlags); } /* @@ -153,161 +145,188 @@ static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, _DInst* di) * Though, don't drop an instruction which is also supported in 16 and 32 bits. */ - /* ! ! ! DISABLED UNTIL FURTHER NOTICE ! ! ! Decode16Bits CAN NOW DECODE 32 BITS INSTRUCTIONS ! ! !*/ - /* if (ii && (dt == Decode16Bits) && (instFlags & INST_32BITS) && (~instFlags & INST_16BITS)) ii = NULL; */ + /* ! ! ! DISABLED UNTIL FURTHER NOTICE ! ! ! Decode16Bits CAN NOW DECODE 32 BITS INSTRUCTIONS ! ! !*/ + /* if (ii && (dt == Decode16Bits) && (instFlags & INST_32BITS) && (~instFlags & INST_16BITS)) ii = NULL; */ - /* Drop instructions which are invalid in 64 bits. */ - if ((ci->dt == Decode64Bits) && (instFlags & INST_INVALID_64BITS)) goto _Undecodable; - - /* If it's only a 64 bits instruction drop it in other decoding modes. */ - if ((ci->dt != Decode64Bits) && (instFlags & INST_64BITS_FETCH)) goto _Undecodable; + memset(di, 0, sizeof(_DInst)); if (instFlags & INST_MODRM_REQUIRED) { /* If the ModRM byte is not part of the opcode, skip the last byte code, so code points now to ModRM. */ - if (~instFlags & INST_MODRM_INCLUDED) { + if (!(instFlags & INST_MODRM_INCLUDED)) { ci->code++; if (--ci->codeLen < 0) goto _Undecodable; } modrm = *ci->code; - - /* Some instructions enforce that reg=000, so validate that. (Specifically EXTRQ). */ - if ((instFlags & INST_FORCE_REG0) && (((modrm >> 3) & 7) != 0)) goto _Undecodable; - /* Some instructions enforce that mod=11, so validate that. */ - if ((instFlags & INST_MODRR_REQUIRED) && (modrm < INST_DIVIDED_MODRM)) goto _Undecodable; } ci->code++; /* Skip the last byte we just read (either last opcode's byte code or a ModRM). */ - /* Cache the effective operand-size and address-size. */ - effOpSz = decode_get_effective_op_size(ci->dt, ps->decodedPrefixes, vrex, instFlags); - effAdrSz = decode_get_effective_addr_size(ci->dt, ps->decodedPrefixes); - - memset(di, 0, sizeof(_DInst)); - di->base = R_NONE; + di->addr = ci->codeOffset & ci->addrMask; + di->opcode = ii->opcodeId; + di->flags = isi->meta & META_INST_PRIVILEGED; /* - * Try to extract the next operand only if the latter exists. - * For example, if there is not first operand, no reason to try to extract second operand... - * I decided that a for-break is better for readability in this specific case than goto. - * Note: do-while with a constant 0 makes the compiler warning about it. + * Store the address size inside the flags. + * This is necessary for the caller to know the size of rSP when using PUSHA for example. */ - for (;;) { - if (isi->d != OT_NONE) { - if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->d, ONT_1, modrm, ps, effOpSz, effAdrSz, &lockable)) goto _Undecodable; - } else break; + di->base = R_NONE; + di->segment = R_NONE; + + FLAG_SET_ADDRSIZE(di, effAdrSz); + + /* Try to extract the next operand only if the latter exists. */ + if (isi->d != OT_NONE) { + unsigned int opsNo = 1; + _Operand* op = &di->ops[0]; + if (instFlags & (INST_MODRR_REQUIRED | INST_FORCE_REG0)) { + /* Some instructions enforce that mod=11, so validate that. */ + if ((modrm < INST_DIVIDED_MODRM) && (instFlags & INST_MODRR_REQUIRED)) goto _Undecodable; + /* Some instructions enforce that reg=000, so validate that. (Specifically EXTRQ). */ + if ((instFlags & INST_FORCE_REG0) && (((modrm >> 3) & 7) != 0)) goto _Undecodable; + } + if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->d, modrm, ps, effOpSz, effAdrSz, op++)) goto _Undecodable; if (isi->s != OT_NONE) { - if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->s, ONT_2, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; - } else break; - - /* Use third operand, only if the flags says this InstInfo requires it. */ - if (instFlags & INST_USE_OP3) { - if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op3, ONT_3, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; - } else break; - - /* Support for a fourth operand is added for (i.e:) INSERTQ instruction. */ - if (instFlags & INST_USE_OP4) { - if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op4, ONT_4, modrm, ps, effOpSz, effAdrSz, NULL)) goto _Undecodable; + if (!operands_extract(ci, di, ii, instFlags, (_OpType)isi->s, modrm, ps, effOpSz, effAdrSz, op++)) goto _Undecodable; + opsNo++; + /* Use third operand, only if the flags says this InstInfo requires it. */ + if (instFlags & INST_USE_OP3) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op3, modrm, ps, effOpSz, effAdrSz, op++)) goto _Undecodable; + opsNo++; + /* Support for a fourth operand is added for (e.g:) INSERTQ instruction. */ + if (instFlags & INST_USE_OP4) { + if (!operands_extract(ci, di, ii, instFlags, (_OpType)((_InstInfoEx*)ii)->op4, modrm, ps, effOpSz, effAdrSz, op++)) goto _Undecodable; + opsNo++; + } + } } - break; - } /* Continue here after all operands were extracted. */ - - /* If it were a 3DNow! instruction, we will have to find the instruction itself now that we got its operands extracted. */ - if (instFlags & INST_3DNOW_FETCH) { - ii = inst_lookup_3dnow(ci); - if (ii == NULL) goto _Undecodable; - isi = &InstSharedInfoTable[ii->sharedIndex]; - instFlags = FlagsTable[isi->flagsIndex]; + + /* Copy DST_WR flag. */ + di->flags |= (instFlags & INST_DST_WR) >> (31 - 6); /* Copy bit from INST_DST_WR (bit 31) to FLAG_DST_WR (bit 6). */ + /* operands_extract may touched it for FPU operands, so add on top. */ + di->opsNo += (uint8_t)opsNo; } - /* Check whether pseudo opcode is needed, only for CMP instructions: */ - if (instFlags & INST_PSEUDO_OPCODE) { - if (--ci->codeLen < 0) goto _Undecodable; - cmpType = *ci->code; - ci->code++; - if (instFlags & INST_PRE_VEX) { - /* AVX Comparison type must be between 0 to 32, otherwise Reserved. */ - if (cmpType >= INST_VCMP_MAX_RANGE) goto _Undecodable; - } else { - /* SSE Comparison type must be between 0 to 8, otherwise Reserved. */ - if (cmpType >= INST_CMP_MAX_RANGE) goto _Undecodable; + if (instFlags & (INST_3DNOW_FETCH | + INST_PSEUDO_OPCODE | + INST_NATIVE | + INST_PRE_REPNZ | + INST_PRE_REP | + INST_PRE_ADDR_SIZE | + INST_INVALID_64BITS | + INST_64BITS_FETCH)) { /* 8 for 1! */ + + /* If it's a native instruction copy OpSize Prefix. */ + if (ps && instFlags & INST_NATIVE) ps->usedPrefixes |= (ps->decodedPrefixes & INST_PRE_OP_SIZE); + + if (ci->dt != Decode64Bits) { + /* If it's only a 64 bits instruction drop it in other decoding modes. */ + if (instFlags & INST_64BITS_FETCH) goto _Undecodable; + } + else { + /* Drop instructions which are invalid in 64 bits. */ + if (instFlags & INST_INVALID_64BITS) goto _Undecodable; } - } - /* - * There's a limit of 15 bytes on instruction length. The only way to violate - * this limit is by putting redundant prefixes before an instruction. - * start points to first prefix if any, otherwise it points to instruction first byte. - */ - if ((ci->code - ps->start) > INST_MAXIMUM_SIZE) goto _Undecodable; /* Drop instruction. */ + /* If it were a 3DNow! instruction, we will have to find the instruction itself now that we got its operands extracted. */ + if (instFlags & INST_3DNOW_FETCH) { + ii = inst_lookup_3dnow(ci); + if (ii == NULL) goto _Undecodable; + isi = &InstSharedInfoTable[ii->sharedIndex]; + instFlags = FlagsTable[isi->flagsIndex]; + di->opcode = ii->opcodeId; + } - /* - * If we reached here the instruction was fully decoded, we located the instruction in the DB and extracted operands. - * Use the correct mnemonic according to the DT. - * If we are in 32 bits decoding mode it doesn't necessarily mean we will choose mnemonic2, alas, - * it means that if there is a mnemonic2, it will be used. - */ + /* Check whether pseudo opcode is needed, only for CMP instructions: */ + if (instFlags & INST_PSEUDO_OPCODE) { + /* Used only for special CMP instructions which have pseudo opcodes suffix. */ + unsigned int cmpType; - /* Start with prefix LOCK. */ - if ((lockable == TRUE) && (instFlags & INST_PRE_LOCK)) { - ps->usedPrefixes |= INST_PRE_LOCK; - di->flags |= FLAG_LOCK; - } else if ((instFlags & INST_PRE_REPNZ) && (ps->decodedPrefixes & INST_PRE_REPNZ)) { - ps->usedPrefixes |= INST_PRE_REPNZ; - di->flags |= FLAG_REPNZ; - } else if ((instFlags & INST_PRE_REP) && (ps->decodedPrefixes & INST_PRE_REP)) { - ps->usedPrefixes |= INST_PRE_REP; - di->flags |= FLAG_REP; - } + if (--ci->codeLen < 0) goto _Undecodable; + cmpType = *ci->code; + ci->code++; - /* If it's JeCXZ the ADDR_SIZE prefix affects them. */ - if ((instFlags & (INST_PRE_ADDR_SIZE | INST_USE_EXMNEMONIC)) == (INST_PRE_ADDR_SIZE | INST_USE_EXMNEMONIC)) { - ps->usedPrefixes |= INST_PRE_ADDR_SIZE; - if (effAdrSz == Decode16Bits) di->opcode = ii->opcodeId; - else if (effAdrSz == Decode32Bits) di->opcode = ((_InstInfoEx*)ii)->opcodeId2; - /* Ignore REX.W in 64bits, JECXZ is promoted. */ - else /* Decode64Bits */ di->opcode = ((_InstInfoEx*)ii)->opcodeId3; - } + /* + * The opcodeId is the offset to the FIRST pseudo compare mnemonic, + * we will have to fix it so it offsets into the corrected mnemonic. + * Therefore, we use another table to fix the offset. + */ + if (instFlags & INST_PRE_VEX) { + /* AVX Comparison type must be between 0 to 32, otherwise Reserved. */ + if (cmpType >= INST_VCMP_MAX_RANGE) goto _Undecodable; + + /* Use the AVX pseudo compare mnemonics table. */ + di->opcode = ii->opcodeId + VCmpMnemonicOffsets[cmpType]; + } + else { + /* SSE Comparison type must be between 0 to 8, otherwise Reserved. */ + if (cmpType >= INST_CMP_MAX_RANGE) goto _Undecodable; + di->opcode = ii->opcodeId + CmpMnemonicOffsets[cmpType]; + } + + goto _SkipOpcoding; + } + + /* Start with prefix REP/N/Z. */ + if (isPrefixed && (instFlags & (INST_PRE_REPNZ | INST_PRE_REP))) { + if ((instFlags & INST_PRE_REPNZ) && (ps->decodedPrefixes & INST_PRE_REPNZ)) { + ps->usedPrefixes |= INST_PRE_REPNZ; + di->flags |= FLAG_REPNZ; + } + else if ((instFlags & INST_PRE_REP) && (ps->decodedPrefixes & INST_PRE_REP)) { + ps->usedPrefixes |= INST_PRE_REP; + di->flags |= FLAG_REP; + } + } + + if (instFlags & INST_PRE_ADDR_SIZE) { + /* If it's JeCXZ the ADDR_SIZE prefix affects them. */ + if (instFlags & INST_USE_EXMNEMONIC) { + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + if (effAdrSz == Decode16Bits) di->opcode = ii->opcodeId; + else if (effAdrSz == Decode32Bits) di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + /* Ignore REX.W in 64bits, JECXZ is promoted. */ + else /* Decode64Bits */ di->opcode = ((_InstInfoEx*)ii)->opcodeId3; + } + + /* LOOPxx instructions are also native instruction, but they are special case ones, ADDR_SIZE prefix affects them. */ + else if (instFlags & INST_NATIVE) { + di->opcode = ii->opcodeId; - /* LOOPxx instructions are also native instruction, but they are special case ones, ADDR_SIZE prefix affects them. */ - else if ((instFlags & (INST_PRE_ADDR_SIZE | INST_NATIVE)) == (INST_PRE_ADDR_SIZE | INST_NATIVE)) { - di->opcode = ii->opcodeId; + /* If LOOPxx gets here from 64bits, it must be Decode32Bits because Address Size prefix is set. */ + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + } - /* If LOOPxx gets here from 64bits, it must be Decode32Bits because Address Size prefix is set. */ - ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + goto _SkipOpcoding; + } } + /* + * If we reached here the instruction was fully decoded, we located the instruction in the DB and extracted operands. + * Use the correct mnemonic according to the DT. + * If we are in 32 bits decoding mode it doesn't necessarily mean we will choose mnemonic2, alas, + * it means that if there is a mnemonic2, it will be used. * Note: * If the instruction is prefixed by operand size we will format it in the non-default decoding mode! * So there might be a situation that an instruction of 32 bit gets formatted in 16 bits decoding mode. * Both ways should end up with a correct and expected formatting of the text. - */ - else if (effOpSz == Decode16Bits) { /* Decode16Bits */ - - /* Set operand size. */ - FLAG_SET_OPSIZE(di, Decode16Bits); - - /* - * If it's a special instruction which has two mnemonics, then use the 16 bits one + update usedPrefixes. - * Note: use 16 bits mnemonic if that instruction supports 32 bit or 64 bit explicitly. - */ - if ((instFlags & INST_USE_EXMNEMONIC) && ((instFlags & (INST_32BITS | INST_64BITS)) == 0)) ps->usedPrefixes |= INST_PRE_OP_SIZE; - di->opcode = ii->opcodeId; - } else if (effOpSz == Decode32Bits) { /* Decode32Bits */ + */ + if (effOpSz == Decode32Bits) { /* Decode32Bits */ /* Set operand size. */ FLAG_SET_OPSIZE(di, Decode32Bits); /* Give a chance for special mnemonic instruction in 32 bits decoding. */ if (instFlags & INST_USE_EXMNEMONIC) { - ps->usedPrefixes |= INST_PRE_OP_SIZE; /* Is it a special instruction which has another mnemonic for mod=11 ? */ if (instFlags & INST_MNEMONIC_MODRM_BASED) { - if (modrm >= INST_DIVIDED_MODRM) di->opcode = ii->opcodeId; - else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; - } else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; - } else di->opcode = ii->opcodeId; - } else { /* Decode64Bits, note that some instructions might be decoded in Decode32Bits above. */ + if (modrm < INST_DIVIDED_MODRM) di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + } + else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + ps->usedPrefixes |= INST_PRE_OP_SIZE; + } + } + else if (effOpSz == Decode64Bits) { /* Decode64Bits, note that some instructions might be decoded in Decode32Bits above. */ /* Set operand size. */ FLAG_SET_OPSIZE(di, Decode64Bits); @@ -318,85 +337,84 @@ static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, _DInst* di) * because they must not use REX (otherwise it will get to the wrong instruction which share same opcode). * See XRSTOR and XSAVEOPT. */ - if ((instFlags & INST_MNEMONIC_MODRM_BASED) && (modrm >= INST_DIVIDED_MODRM)) goto _Undecodable; + if ((modrm >= INST_DIVIDED_MODRM) && (instFlags & INST_MNEMONIC_MODRM_BASED)) goto _Undecodable; /* Use third mnemonic, for 64 bits. */ - if ((instFlags & INST_USE_EXMNEMONIC2) && (vrex & PREFIX_EX_W)) { + if ((instFlags & INST_USE_EXMNEMONIC2) && (ps->vrex & PREFIX_EX_W)) { ps->usedPrefixes |= INST_PRE_REX; di->opcode = ((_InstInfoEx*)ii)->opcodeId3; - } else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; /* Use second mnemonic. */ - } else di->opcode = ii->opcodeId; + } + else di->opcode = ((_InstInfoEx*)ii)->opcodeId2; /* Use second mnemonic. */ + } } + else { /* Decode16Bits */ - /* If it's a native instruction use OpSize Prefix. */ - if ((instFlags & INST_NATIVE) && (ps->decodedPrefixes & INST_PRE_OP_SIZE)) ps->usedPrefixes |= INST_PRE_OP_SIZE; - - /* Check VEX mnemonics: */ - if ((instFlags & INST_PRE_VEX) && - (((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXW_BASED) && (vrex & PREFIX_EX_W)) || - ((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXL_BASED) && (vrex & PREFIX_EX_L)))) { - di->opcode = ((_InstInfoEx*)ii)->opcodeId2; - } + /* Set operand size. */ + FLAG_SET_OPSIZE(di, Decode16Bits); - /* Or is it a special CMP instruction which needs a pseudo opcode suffix ? */ - if (instFlags & INST_PSEUDO_OPCODE) { /* - * The opcodeId is the offset to the FIRST pseudo compare mnemonic, - * we will have to fix it so it offsets into the corrected mnemonic. - * Therefore, we use another table to fix the offset. + * If it's a special instruction which has two mnemonics, then use the 16 bits one + update usedPrefixes. + * Note: use 16 bits mnemonic if that instruction supports 32 bit or 64 bit explicitly. */ - if (instFlags & INST_PRE_VEX) { - /* Use the AVX pseudo compare mnemonics table. */ - di->opcode = ii->opcodeId + VCmpMnemonicOffsets[cmpType]; - } else { - /* Use the SSE pseudo compare mnemonics table. */ - di->opcode = ii->opcodeId + CmpMnemonicOffsets[cmpType]; - } + if ((instFlags & (INST_USE_EXMNEMONIC | INST_32BITS | INST_64BITS)) == INST_USE_EXMNEMONIC) ps->usedPrefixes |= INST_PRE_OP_SIZE; } - /* - * Store the address size inside the flags. - * This is necessary for the caller to know the size of rSP when using PUSHA for example. - */ - FLAG_SET_ADDRSIZE(di, effAdrSz); +_SkipOpcoding: - /* Copy DST_WR flag. */ - if (instFlags & INST_DST_WR) di->flags |= FLAG_DST_WR; + /* Check VEX mnemonics: */ + if (isPrefixed && (instFlags & INST_PRE_VEX) && + (((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXW_BASED) && (ps->vrex & PREFIX_EX_W)) || + ((((_InstInfoEx*)ii)->flagsEx & INST_MNEMONIC_VEXL_BASED) && (ps->vrex & PREFIX_EX_L)))) { + di->opcode = ((_InstInfoEx*)ii)->opcodeId2; + } - /* Set the unused prefixes mask. */ - di->unusedPrefixesMask = prefixes_set_unused_mask(ps); + /* Instruction's size should include prefixes too if exist. */ + di->size = (uint8_t)(ci->code - startCode); + /* + * There's a limit of 15 bytes on instruction length. The only way to violate + * this limit is by putting redundant prefixes before an instruction. + * start points to first prefix if any, otherwise it points to instruction first byte. + */ + if (di->size > INST_MAXIMUM_SIZE) goto _Undecodable; - /* Fix privileged. Assumes the privilegedFlag is 0x8000 only. */ - di->flags |= privilegedFlag; + /* Set the unused prefixes mask, if any prefixes (not) used at all. */ + if (isPrefixed) di->unusedPrefixesMask = prefixes_set_unused_mask(ps); /* Copy instruction meta. */ di->meta = isi->meta; - if (di->segment == 0) di->segment = R_NONE; - /* Take into account the O_MEM base register for the mask. */ - if (di->base != R_NONE) di->usedRegistersMask |= _REGISTERTORCLASS[di->base]; - - /* Copy CPU affected flags. */ - CONVERT_FLAGS_TO_EFLAGS(di, isi, modifiedFlagsMask); - CONVERT_FLAGS_TO_EFLAGS(di, isi, testedFlagsMask); - CONVERT_FLAGS_TO_EFLAGS(di, isi, undefinedFlagsMask); + if (ci->features & DF_FILL_EFLAGS) { + /* Copy CPU affected flags. */ + if (isi->testedFlagsMask) CONVERT_FLAGS_TO_EFLAGS(di, isi, testedFlagsMask); + if (isi->modifiedFlagsMask) CONVERT_FLAGS_TO_EFLAGS(di, isi, modifiedFlagsMask); + if (isi->undefinedFlagsMask) CONVERT_FLAGS_TO_EFLAGS(di, isi, undefinedFlagsMask); + } - /* Calculate the size of the instruction we've just decoded. */ - di->size = (uint8_t)((ci->code - startCode) & 0xff); + /* + * Instruction can still be invalid if it's total length is over 15 bytes with prefixes. + * Up to the caller to check that. + */ return DECRES_SUCCESS; -_Undecodable: /* If the instruction couldn't be decoded for some reason, drop the first byte. */ - memset(di, 0, sizeof(_DInst)); - di->base = R_NONE; - - di->size = 1; - /* Clean prefixes just in case... */ - ps->usedPrefixes = 0; - - /* Special case for WAIT instruction: If it's dropped, you have to return a valid instruction! */ +_Undecodable: /* If the instruction couldn't be decoded for some reason, fail. */ + /* Special case for WAIT instruction: If it's dropped as a prefix, we have to return a valid instruction! */ if (*startCode == INST_WAIT_INDEX) { + int delta; + memset(di, 0, sizeof(_DInst)); + di->addr = ci->codeOffset & ci->addrMask; + di->imm.byte = INST_WAIT_INDEX; + di->segment = R_NONE; + di->base = R_NONE; + di->size = 1; di->opcode = I_WAIT; META_SET_ISC(di, ISC_INTEGER); + + /* Fix ci because WAIT could be a prefix that failed, and ci->code is now out of sync. */ + delta = (int)(ci->code - startCode); /* How many bytes we read so far. */ + ci->codeLen += delta - 1; + ci->code = startCode + 1; + /* codeOffset is fixed outside. */ + return DECRES_SUCCESS; } @@ -414,32 +432,36 @@ static _DecodeResult decode_inst(_CodeInfo* ci, _PrefixState* ps, _DInst* di) */ _DecodeResult decode_internal(_CodeInfo* _ci, int supportOldIntr, _DInst result[], unsigned int maxResultCount, unsigned int* usedInstructionsCount) { + _CodeInfo ci = *_ci; /* A working copy, we don't touch user's _ci except OUT params. */ _PrefixState ps; - unsigned int prefixSize; - _CodeInfo ci; - unsigned int features; - unsigned int mfc; + /* Bookkeep these from ci below, as it makes things way simpler. */ + const uint8_t* code; + int codeLen; + _OffsetType codeOffset; - _OffsetType codeOffset = _ci->codeOffset; - const uint8_t* code = _ci->code; - int codeLen = _ci->codeLen; - - /* - * This is used for printing only, it is the real offset of where the whole instruction begins. - * We need this variable in addition to codeOffset, because prefixes might change the real offset an instruction begins at. - * So we keep track of both. - */ - _OffsetType startInstOffset = 0; - - const uint8_t* p; + _DecodeResult ret = DECRES_SUCCESS; /* Current working decoded instruction in results. */ - unsigned int nextPos = 0; - _DInst *pdi = NULL; + _DInst* pdi = (_DInst*)&result[0]; /* There's always a room for at least one slot, checked earlier. */ + _DInst* maxResultAddr; - _OffsetType addrMask = (_OffsetType)-1; + unsigned int features = ci.features; - _DecodeResult decodeResult; + unsigned int diStructSize; + /* Use next entry. */ +#ifndef DISTORM_LIGHT + if (supportOldIntr) { + diStructSize = sizeof(_DecodedInst); + maxResultAddr = (_DInst*)((size_t)&result[0] + (maxResultCount * sizeof(_DecodedInst))); + } + else +#endif /* DISTORM_LIGHT */ + { + diStructSize = sizeof(_DInst); + maxResultAddr = &result[maxResultCount]; + } + + ci.addrMask = (_OffsetType)-1; #ifdef DISTORM_LIGHT supportOldIntr; /* Unreferenced. */ @@ -449,202 +471,104 @@ _DecodeResult decode_internal(_CodeInfo* _ci, int supportOldIntr, _DInst result[ * Otherwise, we use the textual interface which needs full addresses for formatting bytes output. * So distorm_format will truncate later. */ - if (_ci->features & DF_MAXIMUM_ADDR32) addrMask = 0xffffffff; - else if (_ci->features & DF_MAXIMUM_ADDR16) addrMask = 0xffff; + if (features & DF_MAXIMUM_ADDR32) ci.addrMask = 0xffffffff; + else if (features & DF_MAXIMUM_ADDR16) ci.addrMask = 0xffff; #endif - /* No entries are used yet. */ - *usedInstructionsCount = 0; - ci.dt = _ci->dt; - _ci->nextOffset = codeOffset; + ps.count = 1; /* Force zero'ing ps below. */ /* Decode instructions as long as we have what to decode/enough room in entries. */ - while (codeLen > 0) { - - /* startInstOffset holds the displayed offset of current instruction. */ - startInstOffset = codeOffset; + while (ci.codeLen > 0) { + code = ci.code; + codeLen = ci.codeLen; + codeOffset = ci.codeOffset; - memset(&ps, 0, (size_t)((char*)&ps.pfxIndexer[0] - (char*)&ps)); - memset(ps.pfxIndexer, PFXIDX_NONE, sizeof(int) * PFXIDX_MAX); - ps.start = code; - ps.last = code; - prefixSize = 0; + if (ps.count) memset(&ps, 0, sizeof(ps)); - if (prefixes_is_valid(*code, ci.dt)) { - prefixes_decode(code, codeLen, &ps, ci.dt); - /* Count prefixes, start points to first prefix. */ - prefixSize = (unsigned int)(ps.last - ps.start); - /* - * It might be that we will just notice that we ran out of bytes, or only prefixes - * so we will have to drop everything and halt. - * Also take into consideration of flow control instruction filter. - */ - codeLen -= prefixSize; - if ((codeLen == 0) || (prefixSize == INST_MAXIMUM_SIZE)) { - if (~_ci->features & DF_RETURN_FC_ONLY) { - /* Make sure there is enough room. */ - if (nextPos + (ps.last - code) > maxResultCount) return DECRES_MEMORYERR; - - for (p = code; p < ps.last; p++, startInstOffset++) { - /* Use next entry. */ -#ifndef DISTORM_LIGHT - if (supportOldIntr) { - pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); - } - else -#endif /* DISTORM_LIGHT */ - { - pdi = &result[nextPos]; - } - nextPos++; - memset(pdi, 0, sizeof(_DInst)); - - pdi->flags = FLAG_NOT_DECODABLE; - pdi->imm.byte = *p; - pdi->size = 1; - pdi->addr = startInstOffset & addrMask; - } - *usedInstructionsCount = nextPos; /* Include them all. */ - } - if (codeLen == 0) break; /* Bye bye, out of bytes. */ - } - code += prefixSize; - codeOffset += prefixSize; + /**** INSTRUCTION DECODING NEXT: ****/ - /* If we got only prefixes continue to next instruction. */ - if (prefixSize == INST_MAXIMUM_SIZE) continue; + /* Make sure we didn't run out of output entries. */ + if (pdi >= maxResultAddr) { + ret = DECRES_MEMORYERR; + break; } - /* - * Now we decode the instruction and only then we do further prefixes handling. - * This is because the instruction could not be decoded at all, or an instruction requires - * a mandatory prefix, or some of the prefixes were useless, etc... + ret = decode_inst(&ci, &ps, code, pdi); + /* decode_inst keeps track (only if successful!) for code and codeLen but ignores codeOffset, fix it here. */ + ci.codeOffset += pdi->size; - * Even if there were a mandatory prefix, we already took into account its size as a normal prefix. - * so prefixSize includes that, and the returned size in pdi is simply the size of the real(=without prefixes) instruction. - */ - if (ci.dt == Decode64Bits) { - if (ps.decodedPrefixes & INST_PRE_REX) { - /* REX prefix must precede first byte of instruction. */ - if (ps.rexPos != (code - 1)) { - ps.decodedPrefixes &= ~INST_PRE_REX; - ps.prefixExtType = PET_NONE; - prefixes_ignore(&ps, PFXIDX_REX); - } - /* - * We will disable operand size prefix, - * if it exists only after decoding the instruction, since it might be a mandatory prefix. - * This will be done after calling inst_lookup in decode_inst. - */ - } - /* In 64 bits, segment overrides of CS, DS, ES and SS are ignored. So don't take'em into account. */ - if (ps.decodedPrefixes & INST_PRE_SEGOVRD_MASK32) { - ps.decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK32; - prefixes_ignore(&ps, PFXIDX_SEG); - } - } + if (ret == DECRES_SUCCESS) { - /* Make sure there is at least one more entry to use, for the upcoming instruction. */ - if (nextPos + 1 > maxResultCount) return DECRES_MEMORYERR; -#ifndef DISTORM_LIGHT - if (supportOldIntr) { - pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); - } - else -#endif /* DISTORM_LIGHT */ - { - pdi = &result[nextPos]; - } - nextPos++; + if (features & (DF_SINGLE_BYTE_STEP | DF_RETURN_FC_ONLY | DF_STOP_ON_PRIVILEGED | DF_STOP_ON_FLOW_CONTROL)) { - /* - * The reason we copy these two again is because we have to keep track on the input ourselves. - * There might be a case when an instruction is invalid, and then it will be counted as one byte only. - * But that instruction already read a byte or two from the stream and only then returned the error. - * Thus, we end up unsynchronized on the stream. - * This way, we are totally safe, because we keep track after the call to decode_inst, using the returned size. - */ - ci.code = code; - ci.codeLen = codeLen; - /* Nobody uses codeOffset in the decoder itself, so spare it. */ - - decodeResult = decode_inst(&ci, &ps, pdi); - - /* See if we need to filter this instruction. */ - if ((_ci->features & DF_RETURN_FC_ONLY) && (META_GET_FC(pdi->meta) == FC_NONE)) decodeResult = DECRES_FILTERED; - - /* Set address to the beginning of the instruction. */ - pdi->addr = startInstOffset & addrMask; - /* pdi->disp &= addrMask; */ - - if ((decodeResult == DECRES_INPUTERR) && (ps.decodedPrefixes & INST_PRE_VEX)) { - if (ps.prefixExtType == PET_VEX3BYTES) { - prefixSize -= 2; - codeLen += 2; - } else if (ps.prefixExtType == PET_VEX2BYTES) { - prefixSize -= 1; - codeLen += 1; - } - ps.last = ps.start + prefixSize - 1; - code = ps.last + 1; - codeOffset = startInstOffset + prefixSize; - } else { - /* Advance to next instruction. */ - codeLen -= pdi->size; - codeOffset += pdi->size; - code += pdi->size; - - /* Instruction's size should include prefixes. */ - pdi->size += (uint8_t)prefixSize; - } + /* Sync codeinfo, remember that currently it points to beginning of the instruction and prefixes if any. */ + if (features & DF_SINGLE_BYTE_STEP) { + ci.code = code + 1; + ci.codeLen = codeLen - 1; + ci.codeOffset = codeOffset + 1; + } - /* Drop all prefixes and the instruction itself, because the instruction wasn't successfully decoded. */ - if ((decodeResult == DECRES_INPUTERR) && (~_ci->features & DF_RETURN_FC_ONLY)) { - nextPos--; /* Undo last result. */ - if ((prefixSize + 1) > 0) { /* 1 for the first instruction's byte. */ - if ((nextPos + prefixSize + 1) > maxResultCount) return DECRES_MEMORYERR; + /* See if we need to filter this instruction. */ + if ((features & DF_RETURN_FC_ONLY) && (META_GET_FC(pdi->meta) == FC_NONE)) { + continue; + } - for (p = ps.start; p < ps.last + 1; p++, startInstOffset++) { - /* Use next entry. */ -#ifndef DISTORM_LIGHT - if (supportOldIntr) { - pdi = (_DInst*)((char*)result + nextPos * sizeof(_DecodedInst)); - } - else -#endif /* DISTORM_LIGHT */ - { - pdi = &result[nextPos]; + /* Check whether we need to stop on any feature. */ + if ((features & DF_STOP_ON_PRIVILEGED) && (FLAG_GET_PRIVILEGED(pdi->flags))) { + pdi = (_DInst*)((char*)pdi + diStructSize); + break; /* ret = DECRES_SUCCESS; */ + } + + if (features & DF_STOP_ON_FLOW_CONTROL) { + unsigned int mfc = META_GET_FC(pdi->meta); + if (mfc && (((features & DF_STOP_ON_CALL) && (mfc == FC_CALL)) || + ((features & DF_STOP_ON_RET) && (mfc == FC_RET)) || + ((features & DF_STOP_ON_SYS) && (mfc == FC_SYS)) || + ((features & DF_STOP_ON_UNC_BRANCH) && (mfc == FC_UNC_BRANCH)) || + ((features & DF_STOP_ON_CND_BRANCH) && (mfc == FC_CND_BRANCH)) || + ((features & DF_STOP_ON_INT) && (mfc == FC_INT)) || + ((features & DF_STOP_ON_CMOV) && (mfc == FC_CMOV)) || + ((features & DF_STOP_ON_HLT) && (mfc == FC_HLT)))) { + pdi = (_DInst*)((char*)pdi + diStructSize); + break; /* ret = DECRES_SUCCESS; */ } - nextPos++; + } + } - memset(pdi, 0, sizeof(_DInst)); - pdi->flags = FLAG_NOT_DECODABLE; - pdi->imm.byte = *p; - pdi->size = 1; - pdi->addr = startInstOffset & addrMask; + /* Allocate at least one more entry to use, for the next instruction. */ + pdi = (_DInst*)((char*)pdi + diStructSize); + } + else { /* ret == DECRES_INPUTERR */ + + /* Handle failure of decoding last instruction. */ + if ((!(features & DF_RETURN_FC_ONLY))) { + memset(pdi, 0, sizeof(_DInst)); + pdi->flags = FLAG_NOT_DECODABLE; + pdi->imm.byte = *code; + pdi->size = 1; + pdi->addr = codeOffset & ci.addrMask; + pdi = (_DInst*)((char*)pdi + diStructSize); + + /* If an instruction wasn't decoded then stop on undecodeable if set. */ + if (features & DF_STOP_ON_UNDECODEABLE) { + ret = DECRES_SUCCESS; + break; } } - } else if (decodeResult == DECRES_FILTERED) nextPos--; /* Return it to pool, since it was filtered. */ - - /* Alright, the caller can read, at least, up to this one. */ - *usedInstructionsCount = nextPos; - /* Fix next offset. */ - _ci->nextOffset = codeOffset; - - /* Check whether we need to stop on any flow control instruction. */ - features = _ci->features; - mfc = META_GET_FC(pdi->meta); - if ((decodeResult == DECRES_SUCCESS) && (features & DF_STOP_ON_FLOW_CONTROL)) { - if (((features & DF_STOP_ON_CALL) && (mfc == FC_CALL)) || - ((features & DF_STOP_ON_RET) && (mfc == FC_RET)) || - ((features & DF_STOP_ON_SYS) && (mfc == FC_SYS)) || - ((features & DF_STOP_ON_UNC_BRANCH) && (mfc == FC_UNC_BRANCH)) || - ((features & DF_STOP_ON_CND_BRANCH) && (mfc == FC_CND_BRANCH)) || - ((features & DF_STOP_ON_INT) && (mfc == FC_INT)) || - ((features & DF_STOP_ON_CMOV) && (mfc == FC_CMOV))) - return DECRES_SUCCESS; + + /* Skip a single byte in case of a failure and retry instruction. */ + ci.code = code + 1; + ci.codeLen = codeLen - 1; + ci.codeOffset = codeOffset + 1; + + /* Reset return value. */ + ret = DECRES_SUCCESS; } } - return DECRES_SUCCESS; + /* Set OUT params. */ + *usedInstructionsCount = (unsigned int)(((size_t)pdi - (size_t)result) / (size_t)diStructSize); + _ci->nextOffset = ci.codeOffset; + + return ret; } diff --git a/NativeCore/Dependencies/distorm/src/decoder.h b/NativeCore/Dependencies/distorm/src/decoder.h index 2f9961a5..c40cb646 100644 --- a/NativeCore/Dependencies/distorm/src/decoder.h +++ b/NativeCore/Dependencies/distorm/src/decoder.h @@ -4,20 +4,8 @@ decoder.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2011 Gil Dabah - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see +Copyright (C) 2003-2021 Gil Dabah +This library is licensed under the BSD license. See the file COPYING. */ @@ -28,6 +16,6 @@ along with this program. If not, see typedef unsigned int _iflags; -_DecodeResult decode_internal(_CodeInfo* ci, int supportOldIntr, _DInst result[], unsigned int maxResultCount, unsigned int* usedInstructionsCount); +_DecodeResult decode_internal(_CodeInfo* _ci, int supportOldIntr, _DInst result[], unsigned int maxResultCount, unsigned int* usedInstructionsCount); #endif /* DECODER_H */ diff --git a/NativeCore/Dependencies/distorm/src/distorm.c b/NativeCore/Dependencies/distorm/src/distorm.c index 12f360fd..e54c28bb 100644 --- a/NativeCore/Dependencies/distorm/src/distorm.c +++ b/NativeCore/Dependencies/distorm/src/distorm.c @@ -5,7 +5,7 @@ diStorm3 C Library Interface diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -29,31 +29,24 @@ This library is licensed under the BSD license. See the file COPYING. return DECRES_SUCCESS; } - /* DECRES_SUCCESS still may indicate we may have something in the result, so zero it first thing. */ - *usedInstructionsCount = 0; - if ((ci == NULL) || (ci->codeLen < 0) || - ((ci->dt != Decode16Bits) && (ci->dt != Decode32Bits) && (ci->dt != Decode64Bits)) || + ((unsigned)ci->dt > (unsigned)Decode64Bits) || (ci->code == NULL) || (result == NULL) || + (maxInstructions == 0) || ((ci->features & (DF_MAXIMUM_ADDR16 | DF_MAXIMUM_ADDR32)) == (DF_MAXIMUM_ADDR16 | DF_MAXIMUM_ADDR32))) { return DECRES_INPUTERR; } - /* Assume length=0 is success. */ - if (ci->codeLen == 0) { - return DECRES_SUCCESS; - } - return decode_internal(ci, FALSE, result, maxInstructions, usedInstructionsCount); } #ifndef DISTORM_LIGHT /* Helper function to concatenate an explicit size when it's unknown from the operands. */ -static void distorm_format_size(_WString* str, const _DInst* di, int opNum) +static void distorm_format_size(unsigned char** str, const _DInst* di, int opNum) { int isSizingRequired = 0; /* @@ -64,7 +57,7 @@ static void distorm_format_size(_WString* str, const _DInst* di, int opNum) * * If given operand number is higher than 2, then output the size anyways. */ - isSizingRequired = ((opNum >= 2) || ((di->ops[0].type != O_REG) && (di->ops[1].type != O_REG))); + isSizingRequired = ((opNum >= 2) || ((opNum == 0) && (di->ops[0].type != O_REG) && (di->ops[1].type != O_REG))); /* Still not sure? Try some special instructions. */ if (!isSizingRequired) { @@ -74,6 +67,7 @@ static void distorm_format_size(_WString* str, const _DInst* di, int opNum) * MOVZX, MOVSX, MOVSXD. * ROL, ROR, RCL, RCR, SHL, SHR, SAL, SAR. * SHLD, SHRD. + * CVTSI2SS is also an exception. */ switch (di->opcode) { @@ -92,6 +86,7 @@ static void distorm_format_size(_WString* str, const _DInst* di, int opNum) case I_SAR: case I_SHLD: case I_SHRD: + case I_CVTSI2SS: isSizingRequired = 1; break; default: /* Instruction doesn't require sizing. */ break; @@ -100,244 +95,262 @@ static void distorm_format_size(_WString* str, const _DInst* di, int opNum) if (isSizingRequired) { - switch (di->ops[opNum].size) + /*case 0: break; OT_MEM's unknown size. */ + switch (di->ops[opNum].size / 8) { - case 0: break; /* OT_MEM's unknown size. */ - case 8: strcat_WSN(str, "byte "); break; - case 16: strcat_WSN(str, "word "); break; - case 32: strcat_WSN(str, "dword "); break; - case 64: strcat_WSN(str, "qword "); break; - case 80: strcat_WSN(str, "tbyte "); break; - case 128: strcat_WSN(str, "dqword "); break; - case 256: strcat_WSN(str, "yword "); break; - default: /* Big oh uh if it gets here. */ break; + case 1: strcat_WS(*str, "BYTE ", 8, 5); break; + case 2: strcat_WS(*str, "WORD ", 8, 5); break; + case 4: strcat_WS(*str, "DWORD ", 8, 6); break; + case 8: strcat_WS(*str, "QWORD ", 8, 6); break; + case 10: strcat_WS(*str, "TBYTE ", 8, 6); break; + case 16: strcat_WS(*str, "DQWORD ", 8, 7); break; + case 32: strcat_WS(*str, "YWORD ", 8, 6); break; } } } -static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t addrMask) +static void distorm_format_signed_disp(unsigned char** str, const _DInst* di, uint64_t addrMask) { int64_t tmpDisp64; if (di->dispSize) { - chrcat_WS(str, ((int64_t)di->disp < 0) ? MINUS_DISP_CHR : PLUS_DISP_CHR); - if ((int64_t)di->disp < 0) tmpDisp64 = -(int64_t)di->disp; - else tmpDisp64 = di->disp; - tmpDisp64 &= addrMask; - str_code_hqw(str, (uint8_t*)&tmpDisp64); + if (((int64_t)di->disp < 0)) { + chrcat_WS(*str, MINUS_DISP_CHR); + tmpDisp64 = -(int64_t)di->disp; + tmpDisp64 &= addrMask; /* Verify only for neg numbers. */ + } + else { + chrcat_WS(*str, PLUS_DISP_CHR); + tmpDisp64 = di->disp; + } + str_int(str, tmpDisp64); } } +static uint8_t prefixTable[6][8] = { "", "LOCK ", "REPNZ ", "REPNZ ", "REP ", "REPZ " }; +static unsigned int prefixSizesTable[6] = { 0, 5, 6, 6, 4, 5 }; +static uint8_t suffixTable[10] = { 0, 'B', 'W', 0, 'D', 0, 0, 0, 'Q' }; + +/* WARNING: This function is written carefully to be able to work with same input and output buffer in-place! */ #ifdef SUPPORT_64BIT_OFFSET _DLLEXPORT_ void distorm_format64(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result) #else _DLLEXPORT_ void distorm_format32(const _CodeInfo* ci, const _DInst* di, _DecodedInst* result) #endif { - _WString* str; - unsigned int i, isDefault; + unsigned char* str; int64_t tmpDisp64; uint64_t addrMask = (uint64_t)-1; - uint8_t segment; const _WMnemonic* mnemonic; + int suffixSize = -1; + unsigned int i; /* Set address mask, when default is for 64bits addresses. */ - if (ci->features & DF_MAXIMUM_ADDR32) addrMask = 0xffffffff; - else if (ci->features & DF_MAXIMUM_ADDR16) addrMask = 0xffff; - - /* Copy other fields. */ - result->size = di->size; - result->offset = di->addr; - - if (di->flags == FLAG_NOT_DECODABLE) { - str = &result->mnemonic; - result->offset &= addrMask; - strclear_WS(&result->operands); - strcpy_WSN(str, "DB "); - str_code_hb(str, di->imm.byte); - strclear_WS(&result->instructionHex); - str_hex_b(&result->instructionHex, di->imm.byte); - return; /* Skip to next instruction. */ + if (ci->features & DF_USE_ADDR_MASK) addrMask = ci->addrMask; + else { + if (ci->features & DF_MAXIMUM_ADDR32) addrMask = 0xffffffff; + else if (ci->features & DF_MAXIMUM_ADDR16) addrMask = 0xffff; } - str = &result->instructionHex; - strclear_WS(str); /* Gotta have full address for (di->addr - ci->codeOffset) to work in all modes. */ - for (i = 0; i < di->size; i++) - str_hex_b(str, ci->code[(unsigned int)(di->addr - ci->codeOffset + i)]); - - /* Truncate address now. */ - result->offset &= addrMask; - - str = &result->mnemonic; - switch (FLAG_GET_PREFIX(di->flags)) - { - case FLAG_LOCK: - strcpy_WSN(str, "lock "); - break; - case FLAG_REP: - /* REP prefix for CMPS and SCAS is really a REPZ. */ - if ((di->opcode == I_CMPS) || (di->opcode == I_SCAS)) strcpy_WSN(str, "repz "); - else strcpy_WSN(str, "rep "); - break; - case FLAG_REPNZ: - strcpy_WSN(str, "repnz "); - break; - default: - /* Init mnemonic string, cause next touch is concatenation. */ - strclear_WS(str); - break; + str_hex(&result->instructionHex, (const uint8_t*)&ci->code[(unsigned int)(di->addr - ci->codeOffset)], di->size); + + if ((int)((int16_t)di->flags) == -1) { + /* In-place considerations: DI is RESULT. Deref fields first. */ + unsigned int size = di->size; + unsigned int byte = di->imm.byte; + _OffsetType offset = di->addr & addrMask; + + result->offset = offset; + result->size = size; + str = (unsigned char*)&result->mnemonic.p; + strcat_WS(str, "DB ", 4, 3); + str_int(&str, byte); + strfinalize_WS(result->mnemonic, str); + *(uint64_t*)&result->operands = 0; /* Clears length and the string at once. */ + return; /* Skip to next instruction. */ } - mnemonic = (const _WMnemonic*)&_MNEMONICS[di->opcode]; - memcpy((int8_t*)&str->p[str->length], mnemonic->p, mnemonic->length + 1); - str->length += mnemonic->length; - - /* Format operands: */ - str = &result->operands; - strclear_WS(str); - - /* Special treatment for String instructions. */ - if ((META_GET_ISC(di->meta) == ISC_INTEGER) && - ((di->opcode == I_MOVS) || - (di->opcode == I_CMPS) || - (di->opcode == I_STOS) || - (di->opcode == I_LODS) || - (di->opcode == I_SCAS))) - { + str = (unsigned char*)&result->operands.p; + + /* Special treatment for String (movs, cmps, stos, lods, scas) instructions. */ + if ((di->opcode >= I_MOVS) && (di->opcode <= I_SCAS)) { /* * No operands are needed if the address size is the default one, * and no segment is overridden, so add the suffix letter, * to indicate size of operation and continue to next instruction. */ - if ((FLAG_GET_ADDRSIZE(di->flags) == ci->dt) && (SEGMENT_IS_DEFAULT(di->segment))) { - str = &result->mnemonic; - switch (di->ops[0].size) - { - case 8: chrcat_WS(str, 'B'); break; - case 16: chrcat_WS(str, 'W'); break; - case 32: chrcat_WS(str, 'D'); break; - case 64: chrcat_WS(str, 'Q'); break; - } - return; + if ((SEGMENT_IS_DEFAULT_OR_NONE(di->segment)) && (FLAG_GET_ADDRSIZE(di->flags) == ci->dt)) { + suffixSize = di->ops[0].size / 8; + goto skipOperands; } + suffixSize = 0; /* Marks it's a string instruction. */ } - for (i = 0; ((i < OPERANDS_NO) && (di->ops[i].type != O_NONE)); i++) { - if (i > 0) strcat_WSN(str, ", "); - switch (di->ops[i].type) - { - case O_REG: - strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); - break; - case O_IMM: - /* If the instruction is 'push', show explicit size (except byte imm). */ - if ((di->opcode == I_PUSH) && (di->ops[i].size != 8)) distorm_format_size(str, di, i); - /* Special fix for negative sign extended immediates. */ - if ((di->flags & FLAG_IMM_SIGNED) && (di->ops[i].size == 8)) { - if (di->imm.sbyte < 0) { - chrcat_WS(str, MINUS_DISP_CHR); - str_code_hb(str, -di->imm.sbyte); - break; + for (i = 0; i < di->opsNo; i++) { + unsigned int type = di->ops[i].type; + if (i > 0) strcat_WS(str, ", ", 2, 2); + if (type == O_REG) { + strcat_WSR(&str, &_REGISTERS[di->ops[i].index]); + } + else if (type == O_IMM) { + /* If the instruction is 'push', show explicit size (except byte imm). */ + if ((di->opcode == I_PUSH) && (di->ops[i].size != 8)) distorm_format_size(&str, di, i); + /* Special fix for negative sign extended immediates. */ + if ((di->flags & FLAG_IMM_SIGNED) && (di->ops[i].size == 8) && (di->imm.sbyte < 0)) { + chrcat_WS(str, MINUS_DISP_CHR); + tmpDisp64 = -di->imm.sbyte; + str_int(&str, tmpDisp64); + } + else { + /* Notice signedness and size of the immediate. */ + if (di->ops[i].size == 0x20) str_int(&str, di->imm.dword); + else str_int(&str, di->imm.qword); + } + } + else if (type == O_PC) { +#ifdef SUPPORT_64BIT_OFFSET + str_int(&str, (di->size + di->imm.sqword + di->addr) & addrMask); +#else + tmpDisp64 = ((_OffsetType)di->imm.sdword + di->addr + di->size) & (uint32_t)addrMask; + str_int(&str, tmpDisp64); +#endif + } + else if (type == O_DISP) { + distorm_format_size(&str, di, i); + chrcat_WS(str, OPEN_CHR); + if (!SEGMENT_IS_DEFAULT_OR_NONE(di->segment)) { + strcat_WSR(&str, &_REGISTERS[SEGMENT_GET_UNSAFE(di->segment)]); + chrcat_WS(str, SEG_OFF_CHR); + } + tmpDisp64 = di->disp & addrMask; + str_int(&str, tmpDisp64); + chrcat_WS(str, CLOSE_CHR); + } + else if (type == O_SMEM) { + int isDefault; + int segment; + distorm_format_size(&str, di, i); + chrcat_WS(str, OPEN_CHR); + + segment = SEGMENT_GET(di->segment); + isDefault = SEGMENT_IS_DEFAULT(di->segment); + + /* + * This is where we need to take special care for String instructions. + * If we got here, it means we need to explicitly show their operands. + * The problem with CMPS and MOVS is that they have two(!) memory operands. + * So we have to complement(!) them ourselves, since the isntruction structure supplies only the segment that can be overridden. + * And make the rest of the String operations explicit. + * We ignore default ES/DS in 64 bits. + * ["MOVS"], [OPT.REGI_EDI, OPT.REGI_ESI] -- DS can be overridden. + * ["CMPS"], [OPT.REGI_ESI, OPT.REGI_EDI] -- DS can be overriden. + * + * suffixSize == 0 was set above for string opcode already. + */ + if (suffixSize == 0) { + if (((di->opcode == I_MOVS) && (i == 0)) || ((di->opcode == I_CMPS) && (i == 1))) { + if (ci->dt != Decode64Bits) { + segment = R_ES; + isDefault = FALSE; } + else isDefault = TRUE; } - if (di->ops[i].size == 64) str_code_hqw(str, (uint8_t*)&di->imm.qword); - else str_code_hdw(str, di->imm.dword); - break; - case O_IMM1: - str_code_hdw(str, di->imm.ex.i1); - break; - case O_IMM2: - str_code_hdw(str, di->imm.ex.i2); - break; - case O_DISP: - distorm_format_size(str, di, i); - chrcat_WS(str, OPEN_CHR); - if ((SEGMENT_GET(di->segment) != R_NONE) && !SEGMENT_IS_DEFAULT(di->segment)) { - strcat_WS(str, (const _WString*)&_REGISTERS[SEGMENT_GET(di->segment)]); - chrcat_WS(str, SEG_OFF_CHR); - } - tmpDisp64 = di->disp & addrMask; - str_code_hqw(str, (uint8_t*)&tmpDisp64); - chrcat_WS(str, CLOSE_CHR); - break; - case O_SMEM: - distorm_format_size(str, di, i); - chrcat_WS(str, OPEN_CHR); - - /* - * This is where we need to take special care for String instructions. - * If we got here, it means we need to explicitly show their operands. - * The problem with CMPS and MOVS is that they have two(!) memory operands. - * So we have to complete it ourselves, since the structure supplies only the segment that can be overridden. - * And make the rest of the String operations explicit. - */ - segment = SEGMENT_GET(di->segment); - isDefault = SEGMENT_IS_DEFAULT(di->segment); - switch (di->opcode) - { - case I_MOVS: - isDefault = FALSE; - if (i == 0) segment = R_ES; - break; - case I_CMPS: + else if (isDefault && ((di->opcode == I_MOVS) || (di->opcode == I_CMPS))) { + if (ci->dt != Decode64Bits) { + segment = R_DS; isDefault = FALSE; - if (i == 1) segment = R_ES; - break; - case I_INS: - case I_LODS: - case I_STOS: - case I_SCAS: isDefault = FALSE; break; - } - if (!isDefault && (segment != R_NONE)) { - strcat_WS(str, (const _WString*)&_REGISTERS[segment]); - chrcat_WS(str, SEG_OFF_CHR); + } } + } + if (!isDefault && (segment != R_NONE)) { + strcat_WSR(&str, &_REGISTERS[segment]); + chrcat_WS(str, SEG_OFF_CHR); + } - strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); - - distorm_format_signed_disp(str, di, addrMask); - chrcat_WS(str, CLOSE_CHR); - break; - case O_MEM: - distorm_format_size(str, di, i); - chrcat_WS(str, OPEN_CHR); - if ((SEGMENT_GET(di->segment) != R_NONE) && !SEGMENT_IS_DEFAULT(di->segment)) { - strcat_WS(str, (const _WString*)&_REGISTERS[SEGMENT_GET(di->segment)]); - chrcat_WS(str, SEG_OFF_CHR); - } - if (di->base != R_NONE) { - strcat_WS(str, (const _WString*)&_REGISTERS[di->base]); - chrcat_WS(str, PLUS_DISP_CHR); - } - strcat_WS(str, (const _WString*)&_REGISTERS[di->ops[i].index]); - if (di->scale != 0) { - chrcat_WS(str, '*'); - if (di->scale == 2) chrcat_WS(str, '2'); - else if (di->scale == 4) chrcat_WS(str, '4'); - else /* if (di->scale == 8) */ chrcat_WS(str, '8'); - } + strcat_WSR(&str, &_REGISTERS[di->ops[i].index]); - distorm_format_signed_disp(str, di, addrMask); - chrcat_WS(str, CLOSE_CHR); - break; - case O_PC: -#ifdef SUPPORT_64BIT_OFFSET - str_off64(str, (di->imm.sqword + di->addr + di->size) & addrMask); -#else - str_code_hdw(str, ((_OffsetType)di->imm.sdword + di->addr + di->size) & (uint32_t)addrMask); -#endif - break; - case O_PTR: - str_code_hdw(str, di->imm.ptr.seg); + distorm_format_signed_disp(&str, di, addrMask); + chrcat_WS(str, CLOSE_CHR); + } + else if (type == O_MEM) { + distorm_format_size(&str, di, i); + chrcat_WS(str, OPEN_CHR); + if (!SEGMENT_IS_DEFAULT_OR_NONE(di->segment)) { + strcat_WSR(&str, &_REGISTERS[SEGMENT_GET_UNSAFE(di->segment)]); chrcat_WS(str, SEG_OFF_CHR); - str_code_hdw(str, di->imm.ptr.off); - break; + } + if (di->base != R_NONE) { + strcat_WSR(&str, &_REGISTERS[di->base]); + chrcat_WS(str, PLUS_DISP_CHR); + } + strcat_WSR(&str, &_REGISTERS[di->ops[i].index]); + if (di->scale != 0) { + switch (di->scale) + { + case 2: strcat_WS(str, "*2", 2, 2); break; + case 4: strcat_WS(str, "*4", 2, 2); break; + case 8: strcat_WS(str, "*8", 2, 2); break; + } + } + distorm_format_signed_disp(&str, di, addrMask); + chrcat_WS(str, CLOSE_CHR); + } + else if (type == O_PTR) { + str_int(&str, di->imm.ptr.seg); + chrcat_WS(str, SEG_OFF_CHR); + str_int(&str, di->imm.ptr.off); + } + else if (type == O_IMM1) { + str_int(&str, di->imm.ex.i1); + } + else if (type == O_IMM2) { + str_int(&str, di->imm.ex.i2); } } +skipOperands: + + /* Finalize the operands string. */ + strfinalize_WS(result->operands, str); + + /* Not used anymore. if (di->flags & FLAG_HINT_TAKEN) strcat_WSN(str, " ;TAKEN"); else if (di->flags & FLAG_HINT_NOT_TAKEN) strcat_WSN(str, " ;NOT TAKEN"); + */ + { + /* In-place considerations: DI is RESULT. Deref fields first. */ + unsigned int opcode = di->opcode; + unsigned int prefix = FLAG_GET_PREFIX(di->flags); + unsigned int size = di->size; + _OffsetType offset = di->addr & addrMask; + str = (unsigned char*)&result->mnemonic.p; + mnemonic = (const _WMnemonic*)&_MNEMONICS[opcode]; + + if (prefix) { + /* REP prefix for CMPS and SCAS is really a REPZ. */ + prefix += (opcode == I_CMPS); + prefix += (opcode == I_SCAS); + memcpy(str, &prefixTable[prefix][0], 8); + str += prefixSizesTable[prefix]; + } + + /* + * Always copy 16 bytes from the mnemonic, we have a sentinel padding so we can read past. + * This helps the compiler to remove the call to memcpy and therefore makes this copying much faster. + * The longest instruction is exactly 16 chars long, so we null terminate the string below. + */ + memcpy((int8_t*)str, mnemonic->p, 16); + str += mnemonic->length; + + if (suffixSize > 0) { + *str++ = suffixTable[suffixSize]; + } + strfinalize_WS(result->mnemonic, str); + + result->offset = offset; + result->size = size; + } } #ifdef SUPPORT_64BIT_OFFSET @@ -347,9 +360,8 @@ static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t #endif { _DecodeResult res; - _DInst di; _CodeInfo ci; - unsigned int instsCount = 0, i; + unsigned int i, instsCount; *usedInstructionsCount = 0; @@ -358,19 +370,15 @@ static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t return DECRES_INPUTERR; } - if ((dt != Decode16Bits) && (dt != Decode32Bits) && (dt != Decode64Bits)) { + if ((unsigned)dt > (unsigned)Decode64Bits) { return DECRES_INPUTERR; } - if (code == NULL || result == NULL) { + /* Make sure there's at least one instruction in the result buffer. */ + if ((code == NULL) || (result == NULL) || (maxInstructions == 0)) { return DECRES_INPUTERR; } - /* Assume length=0 is success. */ - if (codeLen == 0) { - return DECRES_SUCCESS; - } - /* * We have to format the result into text. But the interal decoder works with the new structure of _DInst. * Therefore, we will pass the result array(!) from the caller and the interal decoder will fill it in with _DInst's. @@ -384,24 +392,22 @@ static void distorm_format_signed_disp(_WString* str, const _DInst* di, uint64_t ci.code = code; ci.codeLen = codeLen; ci.dt = dt; - ci.features = DF_NONE; - if (dt == Decode16Bits) ci.features = DF_MAXIMUM_ADDR16; - else if (dt == Decode32Bits) ci.features = DF_MAXIMUM_ADDR32; + ci.features = DF_USE_ADDR_MASK; + if (dt == Decode16Bits) ci.addrMask = 0xffff; + else if (dt == Decode32Bits) ci.addrMask = 0xffffffff; + else ci.addrMask = (_OffsetType)-1; - res = decode_internal(&ci, TRUE, (_DInst*)result, maxInstructions, &instsCount); + res = decode_internal(&ci, TRUE, (_DInst*)result, maxInstructions, usedInstructionsCount); + instsCount = *usedInstructionsCount; for (i = 0; i < instsCount; i++) { - if ((*usedInstructionsCount + i) >= maxInstructions) return DECRES_MEMORYERR; - - /* Copy the current decomposed result to a temp structure, so we can override the result with text. */ - memcpy(&di, (char*)result + (i * sizeof(_DecodedInst)), sizeof(_DInst)); + /* distorm_format is optimized and can work with same input/output buffer in-place. */ #ifdef SUPPORT_64BIT_OFFSET - distorm_format64(&ci, &di, &result[i]); + distorm_format64(&ci, (_DInst*)&result[i], &result[i]); #else - distorm_format32(&ci, &di, &result[i]); + distorm_format32(&ci, (_DInst*)&result[i], &result[i]); #endif } - *usedInstructionsCount = instsCount; return res; } diff --git a/NativeCore/Dependencies/distorm/src/instructions.c b/NativeCore/Dependencies/distorm/src/instructions.c index 9107b6b0..ff1c43cd 100644 --- a/NativeCore/Dependencies/distorm/src/instructions.c +++ b/NativeCore/Dependencies/distorm/src/instructions.c @@ -4,7 +4,7 @@ instructions.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -168,14 +168,15 @@ static _InstInfo* inst_lookup_prefixed(_InstNode in, _PrefixState* ps) * try to get the instruction and only then check for the operand size prefix. */ - /* If both REPNZ and REP are together, it's illegal for sure. */ + /* If both REPNZ and REP are together, it's illegal for sure. */ if ((ps->decodedPrefixes & INST_PRE_REPS) == INST_PRE_REPS) return NULL; /* Now we know it's either REPNZ+OPSIZE or REP+OPSIZE, so examine the instruction. */ if (ps->decodedPrefixes & INST_PRE_REPNZ) { index = 3; ps->decodedPrefixes &= ~INST_PRE_REPNZ; - } else if (ps->decodedPrefixes & INST_PRE_REP) { + } + else if (ps->decodedPrefixes & INST_PRE_REP) { index = 2; ps->decodedPrefixes &= ~INST_PRE_REP; } @@ -238,7 +239,8 @@ static _InstInfo* inst_vex_lookup(_CodeInfo* ci, _PrefixState* ps) pp = vex & 3; /* Implied leading 0x0f byte by default for 2 bytes VEX prefix. */ start = 1; - } else { /* PET_VEX3BYTES */ + } + else { /* PET_VEX3BYTES */ start = vex & 0x1f; vex2 = *(ps->vexPos + 1); ps->vexV = v = (~vex2 >> 3) & 0xf; @@ -297,7 +299,8 @@ static _InstInfo* inst_vex_lookup(_CodeInfo* ci, _PrefixState* ps) if (instType == INT_LIST_GROUP) { in = InstructionsTree[instIndex + ((*ci->code >> 3) & 7)]; /* Continue below to check prefixed table. */ - } else if (instType == INT_LIST_FULL) { + } + else if (instType == INT_LIST_FULL) { in = InstructionsTree[instIndex + *ci->code]; /* Continue below to check prefixed table. */ } @@ -316,30 +319,40 @@ static _InstInfo* inst_vex_lookup(_CodeInfo* ci, _PrefixState* ps) return NULL; } -_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) +_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps, int* isPrefixed) { - unsigned int tmpIndex0 = 0, tmpIndex1 = 0, tmpIndex2 = 0, rex = ps->vrex; - int instType = 0; - _InstNode in = 0; + unsigned int tmpIndex0, tmpIndex1, tmpIndex2; + int instType; + _InstNode in; _InstInfo* ii = NULL; int isWaitIncluded = FALSE; - /* See whether we have to handle a VEX prefixed instruction. */ - if (ps->decodedPrefixes & INST_PRE_VEX) { - ii = inst_vex_lookup(ci, ps); - if (ii != NULL) { - /* Make sure that VEX.L exists when forced. */ - if ((((_InstInfoEx*)ii)->flagsEx & INST_FORCE_VEXL) && (~ps->vrex & PREFIX_EX_L)) return NULL; - /* If the instruction doesn't use VEX.vvvv it must be zero. */ - if ((((_InstInfoEx*)ii)->flagsEx & INST_VEX_V_UNUSED) && ps->vexV) return NULL; + /* Always safe to read first byte codeLen > 0. */ + tmpIndex0 = *ci->code; + + if (prefixes_is_valid((unsigned char)tmpIndex0, ci->dt)) { + *isPrefixed = TRUE; + prefixes_decode(ci, ps); + if (ci->codeLen < 1) return NULL; /* No more bytes for opcode, halt. */ + tmpIndex0 = *ci->code; /* Reload. */ + + /* If there are too many prefixes, it will be checked later in decode_inst. */ + + /* See whether we have to handle a VEX prefixed instruction. */ + if (ps->decodedPrefixes & INST_PRE_VEX) { + ii = inst_vex_lookup(ci, ps); + if (ii != NULL) { + /* Make sure that VEX.L exists when forced. */ + if ((((_InstInfoEx*)ii)->flagsEx & INST_FORCE_VEXL) && (~ps->vrex & PREFIX_EX_L)) return NULL; + /* If the instruction doesn't use VEX.vvvv it must be zero. */ + if ((((_InstInfoEx*)ii)->flagsEx & INST_VEX_V_UNUSED) && ps->vexV) return NULL; + } + return ii; } - return ii; } - /* Read first byte. */ + /* Account first byte, we know it's safe to read. */ ci->codeLen -= 1; - if (ci->codeLen < 0) return NULL; - tmpIndex0 = *ci->code; /* Check for special 0x9b, WAIT instruction, which can be part of some instructions(x87). */ if (tmpIndex0 == INST_WAIT_INDEX) { @@ -359,27 +372,14 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) /* Walk first byte in InstructionsTree root. */ in = InstructionsTree[tmpIndex0]; - if (in == INT_NOTEXISTS) return NULL; + if ((uint32_t)in == INT_NOTEXISTS) return NULL; instType = INST_NODE_TYPE(in); /* Single byte instruction (OCST_1BYTE). */ if ((instType < INT_INFOS) && (!isWaitIncluded)) { /* Some single byte instructions need extra treatment. */ - switch (tmpIndex0) - { - case INST_ARPL_INDEX: - /* - * ARPL/MOVSXD share the same opcode, and both have different operands and mnemonics, of course. - * Practically, I couldn't come up with a comfortable way to merge the operands' types of ARPL/MOVSXD. - * And since the DB can't be patched dynamically, because the DB has to be multi-threaded compliant, - * I have no choice but to check for ARPL/MOVSXD right here - "right about now, the funk soul brother, check it out now, the funk soul brother...", fatboy slim - */ - if (ci->dt == Decode64Bits) { - return &II_MOVSXD; - } /* else ARPL will be returned because its defined in the DB already. */ - break; - - case INST_NOP_INDEX: /* Nopnopnop */ + if (instType == INT_INFO_TREAT) { + if (tmpIndex0 == INST_NOP_INDEX) { /* Nopnopnop */ /* Check for Pause, since it's prefixed with 0xf3, which is not a real mandatory prefix. */ if (ps->decodedPrefixes & INST_PRE_REP) { /* Flag this prefix as used. */ @@ -395,20 +395,33 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) * 90 XCHG EAX, EAX is a true NOP (and not high dword of RAX = 0 although it should be a 32 bits operation). * Note that if the REX.B is used, then the register is not RAX anymore but R8, which means it's not a NOP. */ - if (rex & PREFIX_EX_W) ps->usedPrefixes |= INST_PRE_REX; - if ((ci->dt != Decode64Bits) || (~rex & PREFIX_EX_B)) return &II_NOP; - break; - - case INST_LEA_INDEX: + if (ps->vrex & PREFIX_EX_W) ps->usedPrefixes |= INST_PRE_REX; + if ((ci->dt != Decode64Bits) || (~ps->vrex & PREFIX_EX_B)) return &II_NOP; + } + else if (tmpIndex0 == INST_LEA_INDEX) { /* Ignore segment override prefixes for LEA instruction. */ ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; /* Update unused mask for ignoring segment prefix. */ prefixes_ignore(ps, PFXIDX_SEG); - break; + } + else if (tmpIndex0 == INST_ARPL_INDEX) { + /* + * ARPL/MOVSXD share the same opcode, and both have different operands and mnemonics, of course. + * Practically, I couldn't come up with a comfortable way to merge the operands' types of ARPL/MOVSXD. + * And since the DB can't be patched dynamically, because the DB has to be multi-threaded compliant, + * I have no choice but to check for ARPL/MOVSXD right here - "right about now, the funk soul brother, check it out now, the funk soul brother...", fatboy slim + */ + if (ci->dt == Decode64Bits) { + return &II_MOVSXD; + } /* else ARPL will be returned because its defined in the DB already. */ + } } - - /* Return the 1 byte instruction we found. */ - return instType == INT_INFO ? &InstInfos[INST_NODE_INDEX(in)] : (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)]; + /* + * Return the 1 byte instruction we found. + * We can have three node types here: infoex, info_treat and info. + * The latter two are really the same basic structure. + */ + return instType == INT_INFOEX ? (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in)] : &InstInfos[INST_NODE_INDEX(in)]; } /* Read second byte, still doesn't mean all of its bits are used (I.E: ModRM). */ @@ -416,7 +429,7 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) ci->codeLen -= 1; if (ci->codeLen < 0) return NULL; tmpIndex1 = *ci->code; - + /* Try single byte instruction + reg bits (OCST_13BYTES). */ if ((instType == INT_LIST_GROUP) && (!isWaitIncluded)) return inst_get_info(in, (tmpIndex1 >> 3) & 7); @@ -442,13 +455,14 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) if (tmpIndex1 < INST_DIVIDED_MODRM) { /* An instruction which requires a ModR/M byte. Thus it's 1.3 bytes long instruction. */ tmpIndex1 = (tmpIndex1 >> 3) & 7; /* Isolate the 3 REG/OPCODE bits. */ - } else { /* Normal 2 bytes instruction. */ - /* - * Divided instructions can't be in the range of 0x8-0xc0. - * That's because 0-8 are used for 3 bits group. - * And 0xc0-0xff are used for not-divided instruction. - * So the in between range is omitted, thus saving some more place in the tables. - */ + } + else { /* Normal 2 bytes instruction. */ + /* + * Divided instructions can't be in the range of 0x8-0xc0. + * That's because 0-8 are used for 3 bits group. + * And 0xc0-0xff are used for not-divided instruction. + * So the in between range is omitted, thus saving some more place in the tables. + */ tmpIndex1 -= INST_DIVIDED_MODRM - 8; } @@ -525,7 +539,7 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) * hence we don't override 'in', cause we might still need it. */ instType = INST_NODE_TYPE(in2); - + if (instType == INT_INFO) ii = &InstInfos[INST_NODE_INDEX(in2)]; else if (instType == INT_INFOEX) ii = (_InstInfo*)&InstInfosEx[INST_NODE_INDEX(in2)]; @@ -535,7 +549,7 @@ _InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps) * or it was an official 2.3 (because its index was less than 0xc0) - * Then it means the instruction should be using the REG bits, otherwise give a chance to range 0xc0-0xff. */ - /* If we found an instruction only by its REG bits, AND it is not divided, then return it. */ + /* If we found an instruction only by its REG bits, AND it is not divided, then return it. */ if ((ii != NULL) && (INST_INFO_FLAGS(ii) & INST_NOT_DIVIDED)) return ii; /* Otherwise, if the range is above 0xc0, try the special divided range (range 0x8-0xc0 is omitted). */ if (tmpIndex2 >= INST_DIVIDED_MODRM) return inst_get_info(in, tmpIndex2 - INST_DIVIDED_MODRM + 8); diff --git a/NativeCore/Dependencies/distorm/src/instructions.h b/NativeCore/Dependencies/distorm/src/instructions.h index f6c2c53b..4902c99a 100644 --- a/NativeCore/Dependencies/distorm/src/instructions.h +++ b/NativeCore/Dependencies/distorm/src/instructions.h @@ -4,7 +4,7 @@ instructions.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -22,6 +22,7 @@ This library is licensed under the BSD license. See the file COPYING. * actually, it depends on the decoding mode, unless there's an operand/address size prefix. * For example, the code: 33 c0 could be decoded/executed as XOR AX, AX or XOR EAX, EAX. */ + typedef enum OpType { /* No operand is set */ OT_NONE = 0, @@ -38,18 +39,6 @@ typedef enum OpType { /* Read a signed extended byte(8 bits) immediate */ OT_SEIMM8, - /* - * Special immediates for instructions which have more than one immediate, - * which is an exception from standard instruction format. - * As to version v1.0: ENTER, INSERTQ, EXTRQ are the only problematic ones. - */ - /* 16 bits immediate using the first imm-slot */ - OT_IMM16_1, - /* 8 bits immediate using the first imm-slot */ - OT_IMM8_1, - /* 8 bits immediate using the second imm-slot */ - OT_IMM8_2, - /* Use a 8bit register */ OT_REG8, /* Use a 16bit register */ @@ -63,71 +52,7 @@ typedef enum OpType { * VMX instructions are promoted automatically without a REX prefix. */ OT_REG32_64, - /* Used only by MOV CR/DR(n). Promoted with REX onlly. */ - OT_FREG32_64_RM, - - /* Use or read (indirection) a 8bit register or immediate byte */ - OT_RM8, - /* Some instructions force 16 bits (mov sreg, rm16) */ - OT_RM16, - /* Use or read a 16/32/64bit register or immediate word/dword/qword */ - OT_RM_FULL, - /* - * 32 or 64 bits (with REX) operand size indirection memory operand. - * Some instructions are promoted automatically without a REX prefix. - */ - OT_RM32_64, - /* 16 or 32 bits RM. This is used only with MOVZXD instruction in 64bits. */ - OT_RM16_32, - /* Same as OT_RMXX but POINTS to 16 bits [cannot use GENERAL-PURPOSE REG!] */ - OT_FPUM16, - /* Same as OT_RMXX but POINTS to 32 bits (single precision) [cannot use GENERAL-PURPOSE REG!] */ - OT_FPUM32, - /* Same as OT_RMXX but POINTS to 64 bits (double precision) [cannot use GENERAL-PURPOSE REG!] */ - OT_FPUM64, - /* Same as OT_RMXX but POINTS to 80 bits (extended precision) [cannot use GENERAL-PURPOSE REG!] */ - OT_FPUM80, - /* - * Special operand type for SSE4 where the ModR/M might - * be a 32 bits register or 8 bits memory indirection operand. - */ - OT_R32_M8, - /* - * Special ModR/M for PINSRW, which need a 16 bits memory operand or 32 bits register. - * In 16 bits decoding mode R32 becomes R16, operand size cannot affect this. - */ - OT_R32_M16, - /* - * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or - * a 8 bits memory indirection operand. - */ - OT_R32_64_M8, - /* - * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or - * a 16 bits memory indirection operand. - */ - OT_R32_64_M16, - /* - * Special operand type for MOV reg16/32/64/mem16, segReg 8C /r. and SMSW. - * It supports all decoding modes, but if used as a memory indirection it's a 16 bit ModR/M indirection. - */ - OT_RFULL_M16, - - /* Use a control register */ - OT_CREG, - /* Use a debug register */ - OT_DREG, - /* Use a segment register */ - OT_SREG, - /* - * SEG is encoded in the flags of the opcode itself! - * This is used for specific "push SS" where SS is a segment where - * each "push SS" has an absolutely different opcode byte. - * We need this to detect whether an operand size prefix is used. - */ - OT_SEG, - /* Use AL */ OT_ACC8, /* Use AX (FSTSW) */ @@ -137,41 +62,11 @@ typedef enum OpType { /* Use AX/EAX, no REX is possible for RAX, used only with IN/OUT which don't support 64 bit registers */ OT_ACC_FULL_NOT64, - /* - * Read one word (seg), and a word/dword/qword (depends on operand size) from memory. - * JMP FAR [EBX] means EBX point to 16:32 ptr. - */ - OT_MEM16_FULL, - /* Read one word (seg) and a word/dword/qword (depends on operand size), usually SEG:OFF, JMP 1234:1234 */ - OT_PTR16_FULL, - /* Read one word (limit) and a dword/qword (limit) (depends on operand size), used by SGDT, SIDT, LGDT, LIDT. */ - OT_MEM16_3264, - /* Read a byte(8 bits) immediate and calculate it relatively to the current offset of the instruction being decoded */ OT_RELCB, /* Read a word/dword immediate and calculate it relatively to the current offset of the instruction being decoded */ OT_RELC_FULL, - /* Use general memory indirection, with varying sizes: */ - OT_MEM, - /* Used when a memory indirection is required, but if the mod field is 11, this operand will be ignored. */ - OT_MEM_OPT, - OT_MEM32, - /* Memory dereference for MOVNTI, either 32 or 64 bits (with REX). */ - OT_MEM32_64, - OT_MEM64, - OT_MEM128, - /* Used for cmpxchg8b/16b. */ - OT_MEM64_128, - - /* Read an immediate as an absolute address, size is known by instruction, used by MOV (memory offset) only */ - OT_MOFFS8, - OT_MOFFS_FULL, - /* Use an immediate of 1, as for SHR R/M, 1 */ - OT_CONST1, - /* Use CL, as for SHR R/M, CL */ - OT_REGCL, - /* * Instruction-Block for one byte long instructions, used by INC/DEC/PUSH/POP/XCHG, * REG is extracted from the value of opcode @@ -181,6 +76,9 @@ typedef enum OpType { /* Use a 16/32/64bit register */ OT_IB_R_FULL, + /* Read an immediate as an absolute address, size is known by instruction, used by MOV (memory offset) only */ + OT_MOFFS8, + OT_MOFFS_FULL, /* Use [(r)SI] as INDIRECTION, for repeatable instructions */ OT_REGI_ESI, /* Use [(r)DI] as INDIRECTION, for repeatable instructions */ @@ -199,19 +97,164 @@ typedef enum OpType { OT_FPU_SSI, /* ST(0), ST(i) */ OT_FPU_SIS, /* ST(i), ST(0) */ + /* SSE registers: */ + OT_XMM, + /* Extract the SSE register from the RM bits this time (used when the REG bits are used for opcode extension) */ + OT_XMM_RM, + /* Implied XMM0 register as operand, used in SSE4. */ + OT_REGXMM0, + /* Reg32/Reg 64 depends on prefix width only. */ + OT_WREG32_64, + + /* XMM is encoded in VEX.VVVV. */ + OT_VXMM, + /* XMM is encoded in the high nibble of an immediate byte. */ + OT_XMM_IMM, + /* YMM/XMM is dependent on VEX.L. */ + OT_YXMM, + /* YMM/XMM (depends on prefix length) is encoded in the high nibble of an immediate byte. */ + OT_YXMM_IMM, + /* YMM is encoded in reg. */ + OT_YMM, + /* YMM is encoded in VEX.VVVV. */ + OT_VYMM, + /* YMM/XMM is dependent on VEX.L, and encoded in VEX.VVVV. */ + OT_VYXMM, + + /* Use an immediate of 1, as for SHR R/M, 1 */ + OT_CONST1, + /* Use CL, as for SHR R/M, CL */ + OT_REGCL, + + /* Use a control register */ + OT_CREG, + /* Use a debug register */ + OT_DREG, + /* Use a segment register */ + OT_SREG, + /* + * SEG is encoded in the flags of the opcode itself! + * This is used for specific "push SS" where SS is a segment where + * each "push SS" has an absolutely different opcode byte. + * We need this to detect whether an operand size prefix is used. + */ + OT_SEG, + + /* + * Special immediates for instructions which have more than one immediate, + * which is an exception from standard instruction format. + * As to version v1.0: ENTER, INSERTQ, EXTRQ are the only problematic ones. + */ + /* 16 bits immediate using the first imm-slot */ + OT_IMM16_1, + /* 8 bits immediate using the first imm-slot */ + OT_IMM8_1, + /* 8 bits immediate using the second imm-slot */ + OT_IMM8_2, + + /* Read one word (seg) and a word/dword/qword (depends on operand size), usually SEG:OFF, JMP 1234:1234 */ + OT_PTR16_FULL, + + /* Used only by MOV CR/DR(n). Promoted with REX onlly. */ + OT_FREG32_64_RM, + /* MMX registers: */ OT_MM, /* Extract the MMX register from the RM bits this time (used when the REG bits are used for opcode extension) */ OT_MM_RM, + + + /**** MEMORY only operands: ****/ + + /* Use general memory indirection, with varying sizes: */ + OT_MEM, + OT_MEM32, + /* Memory dereference for MOVNTI, either 32 or 64 bits (with REX). */ + OT_MEM32_64, + OT_MEM64, + /* Used for cmpxchg8b/16b. */ + OT_MEM64_128, + OT_MEM128, + /* + * Read one word (seg), and a word/dword/qword (depends on operand size) from memory. + * JMP FAR [EBX] means EBX point to 16:32 ptr. + */ + OT_MEM16_FULL, + /* Read one word (limit) and a dword/qword (limit) (depends on operand size), used by SGDT, SIDT, LGDT, LIDT. */ + OT_MEM16_3264, + /* Used when a memory indirection is required, but if the mod field is 11, this operand will be ignored. */ + OT_MEM_OPT, + + /* Same as OT_RMXX but POINTS to 16 bits [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM16, + /* Same as OT_RMXX but POINTS to 32 bits (single precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM32, + /* Same as OT_RMXX but POINTS to 64 bits (double precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM64, + /* Same as OT_RMXX but POINTS to 80 bits (extended precision) [cannot use GENERAL-PURPOSE REG!] */ + OT_FPUM80, + + /* Mem128/Mem256 is dependent on VEX.L. */ + OT_LMEM128_256, + + + /**** MEMORY & REGISTER only operands: ****/ + + /* Use or read (indirection) a 8bit register or immediate byte */ + OT_RM8, + /* Some instructions force 16 bits (mov sreg, rm16) */ + OT_RM16, + /* ModR/M for 32 bits. */ + OT_RM32, + /* + * Special operand type for MOV reg16/32/64/mem16, segReg 8C /r. and SMSW. + * It supports all decoding modes, but if used as a memory indirection it's a 16 bit ModR/M indirection. + */ + OT_RFULL_M16, + /* Use or read a 16/32/64bit register or immediate word/dword/qword */ + OT_RM_FULL, + + /* RM32/RM64 depends on prefix width only. */ + OT_WRM32_64, + /* + * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or + * a 8 bits memory indirection operand. + */ + OT_R32_64_M8, + /* + * Special type for SSE4, ModR/M might be a 32 bits or 64 bits (with REX) register or + * a 16 bits memory indirection operand. + */ + OT_R32_64_M16, + + /* + * 32 or 64 bits (with REX) operand size indirection memory operand. + * Some instructions are promoted automatically without a REX prefix. + */ + OT_RM32_64, + /* 16 or 32 bits RM. This is used only with MOVZXD instruction in 64bits. */ + OT_RM16_32, + + /* + * Special operand type for SSE4 where the ModR/M might + * be a 32 bits register or 8 bits memory indirection operand. + */ + OT_R32_M8, + /* + * Special ModR/M for PINSRW, which need a 16 bits memory operand or 32 bits register. + * In 16 bits decoding mode R32 becomes R16, operand size cannot affect this. + */ + OT_R32_M16, + /* Reg32/Reg64 (prefix width) or Mem8. */ + OT_REG32_64_M8, + /* Reg32/Reg64 (prefix width) or Mem16. */ + OT_REG32_64_M16, + /* ModR/M points to 32 bits MMX variable */ OT_MM32, /* ModR/M points to 32 bits MMX variable */ OT_MM64, - /* SSE registers: */ - OT_XMM, - /* Extract the SSE register from the RM bits this time (used when the REG bits are used for opcode extension) */ - OT_XMM_RM, /* ModR/M points to 16 bits SSE variable */ OT_XMM16, /* ModR/M points to 32 bits SSE variable */ @@ -220,47 +263,18 @@ typedef enum OpType { OT_XMM64, /* ModR/M points to 128 bits SSE variable */ OT_XMM128, - /* Implied XMM0 register as operand, used in SSE4. */ - OT_REGXMM0, /* AVX operands: */ - - /* ModR/M for 32 bits. */ - OT_RM32, - /* Reg32/Reg64 (prefix width) or Mem8. */ - OT_REG32_64_M8, - /* Reg32/Reg64 (prefix width) or Mem16. */ - OT_REG32_64_M16, - /* Reg32/Reg 64 depends on prefix width only. */ - OT_WREG32_64, - /* RM32/RM64 depends on prefix width only. */ - OT_WRM32_64, /* XMM or Mem32/Mem64 depends on perfix width only. */ OT_WXMM32_64, - /* XMM is encoded in VEX.VVVV. */ - OT_VXMM, - /* XMM is encoded in the high nibble of an immediate byte. */ - OT_XMM_IMM, - /* YMM/XMM is dependent on VEX.L. */ - OT_YXMM, - /* YMM/XMM (depends on prefix length) is encoded in the high nibble of an immediate byte. */ - OT_YXMM_IMM, - /* YMM is encoded in reg. */ - OT_YMM, /* YMM or Mem256. */ OT_YMM256, - /* YMM is encoded in VEX.VVVV. */ - OT_VYMM, - /* YMM/XMM is dependent on VEX.L, and encoded in VEX.VVVV. */ - OT_VYXMM, /* YMM/XMM or Mem64/Mem256 is dependent on VEX.L. */ OT_YXMM64_256, /* YMM/XMM or Mem128/Mem256 is dependent on VEX.L. */ OT_YXMM128_256, /* XMM or Mem64/Mem256 is dependent on VEX.L. */ - OT_LXMM64_128, - /* Mem128/Mem256 is dependent on VEX.L. */ - OT_LMEM128_256 + OT_LXMM64_128 } _OpType; /* Flags for instruction: */ @@ -365,7 +379,7 @@ typedef enum OpType { #define INST_VEX_V_UNUSED (1 << 6) /* Indication that the instruction is privileged (Ring 0), this should be checked on the opcodeId field. */ -#define OPCODE_ID_PRIVILEGED ((uint16_t)0x8000) +#define META_INST_PRIVILEGED ((uint16_t)0x8000) /* * Indicates which operand is being decoded. @@ -399,7 +413,6 @@ typedef enum {ONT_NONE = -1, ONT_1 = 0, ONT_2 = 1, ONT_3 = 2, ONT_4 = 3} _Operan typedef struct { uint8_t flagsIndex; /* An index into FlagsTables */ uint8_t s, d; /* OpType. */ - uint8_t meta; /* Hi 5 bits = Instruction set class | Lo 3 bits = flow control flags. */ /* * The following are CPU flag masks that the instruction changes. * The flags are compacted so 8 bits representation is enough. @@ -408,6 +421,7 @@ typedef struct { uint8_t modifiedFlagsMask; uint8_t testedFlagsMask; uint8_t undefinedFlagsMask; + uint16_t meta; /* High byte = Instruction set class | Low byte = flow control flags. */ } _InstSharedInfo; /* @@ -445,6 +459,7 @@ typedef enum { INT_NOTEXISTS = 0, /* Not exists. */ INT_INFO = 1, /* It's an instruction info. */ INT_INFOEX, + INT_INFO_TREAT, /* Extra intervention is required by inst_lookup. */ INT_LIST_GROUP, INT_LIST_FULL, INT_LIST_DIVIDED, @@ -457,7 +472,8 @@ typedef enum { /* Instruction node is treated as { int index:13; int type:3; } */ typedef uint16_t _InstNode; -_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps); +_InstInfo* inst_lookup(_CodeInfo* ci, _PrefixState* ps, int* isPrefixed); _InstInfo* inst_lookup_3dnow(_CodeInfo* ci); #endif /* INSTRUCTIONS_H */ + diff --git a/NativeCore/Dependencies/distorm/src/insts.c b/NativeCore/Dependencies/distorm/src/insts.c index f7d283e5..7aab70dc 100644 --- a/NativeCore/Dependencies/distorm/src/insts.c +++ b/NativeCore/Dependencies/distorm/src/insts.c @@ -4,7 +4,7 @@ insts.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -15,15 +15,15 @@ This library is licensed under the BSD license. See the file COPYING. /* - * GENERATED BY disOps at Sat Nov 10 19:20:27 2018 + * GENERATED BY disOps at Sat Apr 3 17:52:58 2021 */ -_InstInfo II_MOVSXD = /*II*/ {0x1d4, 10027}; +_InstInfo II_MOVSXD = /*II*/ {0x1d7, 10039}; _InstInfo II_NOP = /*II*/ {0x53, 581}; -_InstInfo II_PAUSE = /*II*/ {0x88, 10035}; -_InstInfo II_WAIT = /*II*/ {0x53, 10042}; -_InstInfo II_RDRAND = /*II*/ {0x1d5, 10048}; -_InstInfo II_3DNOW = /*II*/ {0x1d6, 10056}; +_InstInfo II_PAUSE = /*II*/ {0x91, 10047}; +_InstInfo II_WAIT = /*II*/ {0x53, 10054}; +_InstInfo II_RDRAND = /*II*/ {0x1d8, 10060}; +_InstInfo II_3DNOW = /*II*/ {0x1d9, 10068}; _iflags FlagsTable[101] = { 0x80000011, @@ -60,7 +60,6 @@ _iflags FlagsTable[101] = { 0x4014000, 0x8, 0x81000009, -0x9, 0x80000009, 0x1000808, 0x81000808, @@ -94,6 +93,7 @@ _iflags FlagsTable[101] = { 0x80090009, 0x200b0009, 0x20020009, +0x9, 0x80100009, 0x21100009, 0x87000009, @@ -134,7 +134,7 @@ _InstNode Table_0F_0F = 1440; _InstNode Table_0F_38 = 1896; _InstNode Table_0F_3A = 2152; -_InstInfo InstInfos[1246] = { +_InstInfo InstInfos[1248] = { /*II_00*/ {0x0, 11}, /*II_01*/ {0x1, 11}, /*II_02*/ {0x2, 11}, @@ -232,10 +232,10 @@ _InstInfo InstInfos[1246] = { /*II_63*/ {0x32, 111}, /*II_68*/ {0x33, 16}, /*II_6A*/ {0x35, 16}, - /*II_6C*/ {0x36, 32891}, - /*II_6D*/ {0x37, 32891}, - /*II_6E*/ {0x38, 32896}, - /*II_6F*/ {0x39, 32896}, + /*II_6C*/ {0x36, 123}, + /*II_6D*/ {0x37, 123}, + /*II_6E*/ {0x38, 128}, + /*II_6F*/ {0x39, 128}, /*II_70*/ {0x3a, 134}, /*II_71*/ {0x3a, 138}, /*II_72*/ {0x3b, 143}, @@ -319,7 +319,7 @@ _InstInfo InstInfos[1246] = { /*II_CC*/ {0x6d, 360}, /*II_CD*/ {0x6e, 367}, /*II_CE*/ {0x6f, 372}, - /*II_CF*/ {0x70, 33146}, + /*II_CF*/ {0x70, 378}, /*II_D4*/ {0x71, 384}, /*II_D5*/ {0x71, 389}, /*II_D6*/ {0x72, 394}, @@ -327,1060 +327,1062 @@ _InstInfo InstInfos[1246] = { /*II_E0*/ {0x74, 406}, /*II_E1*/ {0x74, 414}, /*II_E2*/ {0x75, 421}, - /*II_E4*/ {0x77, 33215}, - /*II_E5*/ {0x78, 33215}, - /*II_E6*/ {0x79, 33219}, - /*II_E7*/ {0x7a, 33219}, + /*II_E4*/ {0x77, 447}, + /*II_E5*/ {0x78, 447}, + /*II_E6*/ {0x79, 451}, + /*II_E7*/ {0x7a, 451}, /*II_E8*/ {0x7b, 456}, /*II_E9*/ {0x7c, 462}, /*II_EA*/ {0x7d, 467}, /*II_EB*/ {0x7e, 462}, - /*II_EC*/ {0x7f, 33215}, - /*II_ED*/ {0x80, 33215}, - /*II_EE*/ {0x81, 33219}, - /*II_EF*/ {0x82, 33219}, + /*II_EC*/ {0x7f, 447}, + /*II_ED*/ {0x80, 447}, + /*II_EE*/ {0x81, 451}, + /*II_EF*/ {0x82, 451}, /*II_F1*/ {0x6d, 476}, - /*II_F4*/ {0x53, 33250}, - /*II_F5*/ {0x83, 487}, - /*II_F8*/ {0x83, 492}, - /*II_F9*/ {0x83, 497}, - /*II_FA*/ {0x84, 33270}, - /*II_FB*/ {0x84, 33275}, - /*II_FC*/ {0x85, 512}, - /*II_FD*/ {0x85, 517}, - /*II_0F_02*/ {0x86, 522}, - /*II_0F_03*/ {0x86, 527}, - /*II_0F_05*/ {0x87, 532}, - /*II_0F_06*/ {0x88, 33309}, - /*II_0F_07*/ {0x87, 547}, - /*II_0F_08*/ {0x88, 33323}, - /*II_0F_09*/ {0x88, 33329}, - /*II_0F_0B*/ {0x89, 569}, - /*II_0F_0E*/ {0x8a, 574}, - /*II_0F_1F*/ {0x8b, 581}, - /*II_0F_20*/ {0x8c, 32986}, - /*II_0F_21*/ {0x8d, 32986}, - /*II_0F_22*/ {0x8e, 32986}, - /*II_0F_23*/ {0x8f, 32986}, - /*II_0F_30*/ {0x88, 33354}, - /*II_0F_31*/ {0x88, 33361}, - /*II_0F_32*/ {0x88, 33368}, - /*II_0F_33*/ {0x88, 33375}, - /*II_0F_34*/ {0x87, 614}, - /*II_0F_35*/ {0x87, 624}, - /*II_0F_37*/ {0x90, 633}, - /*II_0F_40*/ {0x91, 641}, - /*II_0F_41*/ {0x91, 648}, - /*II_0F_42*/ {0x92, 656}, - /*II_0F_43*/ {0x92, 663}, - /*II_0F_44*/ {0x93, 671}, - /*II_0F_45*/ {0x93, 678}, - /*II_0F_46*/ {0x94, 686}, - /*II_0F_47*/ {0x94, 694}, - /*II_0F_48*/ {0x95, 701}, - /*II_0F_49*/ {0x95, 708}, - /*II_0F_4A*/ {0x96, 716}, - /*II_0F_4B*/ {0x96, 723}, - /*II_0F_4C*/ {0x97, 731}, - /*II_0F_4D*/ {0x97, 738}, - /*II_0F_4E*/ {0x98, 746}, - /*II_0F_4F*/ {0x98, 754}, - /*II_0F_80*/ {0x99, 134}, - /*II_0F_81*/ {0x99, 138}, - /*II_0F_82*/ {0x9a, 143}, - /*II_0F_83*/ {0x9a, 147}, - /*II_0F_84*/ {0x9b, 152}, - /*II_0F_85*/ {0x9b, 156}, - /*II_0F_86*/ {0x9c, 161}, - /*II_0F_87*/ {0x9c, 166}, - /*II_0F_88*/ {0x9d, 170}, - /*II_0F_89*/ {0x9d, 174}, - /*II_0F_8A*/ {0x9e, 179}, - /*II_0F_8B*/ {0x9e, 183}, - /*II_0F_8C*/ {0x9f, 188}, - /*II_0F_8D*/ {0x9f, 192}, - /*II_0F_8E*/ {0xa0, 197}, - /*II_0F_8F*/ {0xa0, 202}, - /*II_0F_90*/ {0xa1, 761}, - /*II_0F_91*/ {0xa1, 767}, - /*II_0F_92*/ {0xa2, 774}, - /*II_0F_93*/ {0xa2, 780}, - /*II_0F_94*/ {0xa3, 787}, - /*II_0F_95*/ {0xa3, 793}, - /*II_0F_96*/ {0xa4, 800}, - /*II_0F_97*/ {0xa4, 807}, - /*II_0F_98*/ {0xa5, 813}, - /*II_0F_99*/ {0xa5, 819}, - /*II_0F_9A*/ {0xa6, 826}, - /*II_0F_9B*/ {0xa6, 832}, - /*II_0F_9C*/ {0xa7, 839}, - /*II_0F_9D*/ {0xa7, 845}, - /*II_0F_9E*/ {0xa8, 852}, - /*II_0F_9F*/ {0xa8, 859}, - /*II_0F_A0*/ {0xa9, 16}, - /*II_0F_A1*/ {0xaa, 22}, - /*II_0F_A2*/ {0x88, 865}, - /*II_0F_A3*/ {0xab, 872}, - /*II_0F_A8*/ {0xad, 16}, - /*II_0F_A9*/ {0xae, 22}, - /*II_0F_AA*/ {0xaf, 882}, - /*II_0F_AB*/ {0xb0, 887}, - /*II_0F_AF*/ {0xb1, 117}, - /*II_0F_B0*/ {0xb2, 898}, - /*II_0F_B1*/ {0xb3, 898}, - /*II_0F_B2*/ {0xb4, 907}, - /*II_0F_B3*/ {0xb0, 912}, - /*II_0F_B4*/ {0xb4, 917}, - /*II_0F_B5*/ {0xb4, 922}, - /*II_0F_B6*/ {0xb5, 927}, - /*II_0F_B7*/ {0xb6, 927}, - /*II_0F_B9*/ {0x89, 569}, - /*II_0F_BB*/ {0xb0, 934}, - /*II_0F_BE*/ {0xb5, 939}, - /*II_0F_BF*/ {0xb6, 939}, - /*II_0F_C0*/ {0xb2, 946}, - /*II_0F_C1*/ {0xb3, 946}, - /*II_0F_C3*/ {0xb7, 952}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_0F_C8*/ {0xb8, 960}, - /*II_80_00*/ {0xb9, 11}, - /*II_80_01*/ {0xba, 27}, - /*II_80_02*/ {0xbb, 31}, - /*II_80_03*/ {0xbb, 36}, - /*II_80_04*/ {0xbc, 41}, - /*II_80_05*/ {0xb9, 51}, - /*II_80_06*/ {0xbd, 61}, - /*II_80_07*/ {0xbe, 71}, - /*II_81_00*/ {0xbf, 11}, - /*II_81_01*/ {0xc0, 27}, - /*II_81_02*/ {0xc1, 31}, - /*II_81_03*/ {0xc1, 36}, - /*II_81_04*/ {0xc2, 41}, - /*II_81_05*/ {0xbf, 51}, - /*II_81_06*/ {0xc3, 61}, - /*II_81_07*/ {0xc4, 71}, - /*II_82_00*/ {0xc5, 11}, - /*II_82_01*/ {0xc6, 27}, - /*II_82_02*/ {0xc7, 31}, - /*II_82_03*/ {0xc7, 36}, - /*II_82_04*/ {0xc8, 41}, - /*II_82_05*/ {0xc5, 51}, - /*II_82_06*/ {0xc9, 61}, - /*II_82_07*/ {0xca, 71}, - /*II_83_00*/ {0xcb, 11}, - /*II_83_01*/ {0xcc, 27}, - /*II_83_02*/ {0xcd, 31}, - /*II_83_03*/ {0xcd, 36}, - /*II_83_04*/ {0xce, 41}, - /*II_83_05*/ {0xcb, 51}, - /*II_83_06*/ {0xcf, 61}, - /*II_83_07*/ {0xd0, 71}, - /*II_8F_00*/ {0xd1, 22}, - /*II_C0_00*/ {0xd2, 967}, - /*II_C0_01*/ {0xd2, 972}, - /*II_C0_02*/ {0xd3, 977}, - /*II_C0_03*/ {0xd3, 982}, - /*II_C0_04*/ {0xd4, 987}, - /*II_C0_05*/ {0xd4, 992}, - /*II_C0_06*/ {0xd4, 997}, - /*II_C0_07*/ {0xd4, 1002}, - /*II_C1_00*/ {0xd5, 967}, - /*II_C1_01*/ {0xd5, 972}, - /*II_C1_02*/ {0xd6, 977}, - /*II_C1_03*/ {0xd6, 982}, - /*II_C1_04*/ {0xd7, 987}, - /*II_C1_05*/ {0xd7, 992}, - /*II_C1_06*/ {0xd7, 997}, - /*II_C1_07*/ {0xd7, 1002}, - /*II_C6_00*/ {0xd8, 218}, - /*II_C6_F8*/ {0xd9, 1007}, - /*II_C7_00*/ {0xda, 218}, - /*II_C7_F8*/ {0xdb, 1015}, - /*II_D0_00*/ {0xdc, 967}, - /*II_D0_01*/ {0xdc, 972}, - /*II_D0_02*/ {0xdd, 977}, - /*II_D0_03*/ {0xdd, 982}, - /*II_D0_04*/ {0xde, 987}, - /*II_D0_05*/ {0xde, 992}, - /*II_D0_06*/ {0xde, 997}, - /*II_D0_07*/ {0xde, 1002}, - /*II_D1_00*/ {0xdf, 967}, - /*II_D1_01*/ {0xdf, 972}, - /*II_D1_02*/ {0xe0, 977}, - /*II_D1_03*/ {0xe0, 982}, - /*II_D1_04*/ {0xe1, 987}, - /*II_D1_05*/ {0xe1, 992}, - /*II_D1_06*/ {0xe1, 997}, - /*II_D1_07*/ {0xe1, 1002}, - /*II_D2_00*/ {0xe2, 967}, - /*II_D2_01*/ {0xe2, 972}, - /*II_D2_02*/ {0xe3, 977}, - /*II_D2_03*/ {0xe3, 982}, - /*II_D2_04*/ {0xe4, 987}, - /*II_D2_05*/ {0xe4, 992}, - /*II_D2_06*/ {0xe4, 997}, - /*II_D2_07*/ {0xe4, 1002}, - /*II_D3_00*/ {0xe5, 967}, - /*II_D3_01*/ {0xe5, 972}, - /*II_D3_02*/ {0xe6, 977}, - /*II_D3_03*/ {0xe6, 982}, - /*II_D3_04*/ {0xe7, 987}, - /*II_D3_05*/ {0xe7, 992}, - /*II_D3_06*/ {0xe7, 997}, - /*II_D3_07*/ {0xe7, 1002}, - /*II_D8_00*/ {0xe8, 1023}, - /*II_D8_01*/ {0xe8, 1029}, - /*II_D8_02*/ {0xe8, 1035}, - /*II_D8_03*/ {0xe8, 1041}, - /*II_D8_04*/ {0xe8, 1048}, - /*II_D8_05*/ {0xe8, 1054}, - /*II_D8_06*/ {0xe8, 1061}, - /*II_D8_07*/ {0xe8, 1067}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C0*/ {0xe9, 1023}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_C8*/ {0xe9, 1029}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D0*/ {0xea, 1035}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D9*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_D8*/ {0xea, 1041}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E0*/ {0xe9, 1048}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_E8*/ {0xe9, 1054}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F0*/ {0xe9, 1061}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D8_F8*/ {0xe9, 1067}, - /*II_D9_00*/ {0xe8, 1074}, - /*II_D9_02*/ {0xec, 1079}, - /*II_D9_03*/ {0xec, 1084}, - /*II_D9_04*/ {0xed, 1090}, - /*II_D9_05*/ {0xee, 1098}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C0*/ {0xea, 1074}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C9*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_C8*/ {0xea, 1105}, - /*II_D9_D0*/ {0xeb, 1111}, - /*II_D9_E0*/ {0xeb, 1117}, - /*II_D9_E1*/ {0xeb, 1123}, - /*II_D9_E4*/ {0xeb, 1129}, - /*II_D9_E5*/ {0xeb, 1135}, - /*II_D9_E8*/ {0xeb, 1141}, - /*II_D9_E9*/ {0xeb, 1147}, - /*II_D9_EA*/ {0xeb, 1155}, - /*II_D9_EB*/ {0xeb, 1163}, - /*II_D9_EC*/ {0xeb, 1170}, - /*II_D9_ED*/ {0xeb, 1178}, - /*II_D9_EE*/ {0xeb, 1186}, - /*II_D9_F0*/ {0xeb, 1192}, - /*II_D9_F1*/ {0xeb, 1199}, - /*II_D9_F2*/ {0xeb, 1206}, - /*II_D9_F3*/ {0xeb, 1213}, - /*II_D9_F4*/ {0xeb, 1221}, - /*II_D9_F5*/ {0xeb, 1230}, - /*II_D9_F6*/ {0xeb, 1238}, - /*II_D9_F7*/ {0xeb, 1247}, - /*II_D9_F8*/ {0xeb, 1256}, - /*II_D9_F9*/ {0xeb, 1263}, - /*II_D9_FA*/ {0xeb, 1272}, - /*II_D9_FB*/ {0xeb, 1279}, - /*II_D9_FC*/ {0xeb, 1288}, - /*II_D9_FD*/ {0xeb, 1297}, - /*II_D9_FE*/ {0xeb, 1305}, - /*II_D9_FF*/ {0xeb, 1311}, - /*II_DA_00*/ {0xe8, 1317}, - /*II_DA_01*/ {0xe8, 1324}, - /*II_DA_02*/ {0xe8, 1331}, - /*II_DA_03*/ {0xe8, 1338}, - /*II_DA_04*/ {0xe8, 1346}, - /*II_DA_05*/ {0xe8, 1353}, - /*II_DA_06*/ {0xe8, 1361}, - /*II_DA_07*/ {0xe8, 1368}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C0*/ {0xef, 1376}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_C8*/ {0xf0, 1384}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D0*/ {0xf1, 1392}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_D8*/ {0xf2, 1401}, - /*II_DA_E9*/ {0xeb, 1409}, - /*II_DB_00*/ {0xe8, 1418}, - /*II_DB_01*/ {0xf3, 1424}, - /*II_DB_02*/ {0xec, 1432}, - /*II_DB_03*/ {0xec, 1438}, - /*II_DB_05*/ {0xf4, 1074}, - /*II_DB_07*/ {0xf5, 1084}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C0*/ {0xef, 1445}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_C8*/ {0xf0, 1454}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D0*/ {0xf1, 1463}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_D8*/ {0xf2, 1473}, - /*II_DB_E0*/ {0xeb, 1482}, - /*II_DB_E1*/ {0xeb, 1488}, - /*II_DB_E4*/ {0xeb, 1496}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_E8*/ {0xf6, 1504}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DB_F0*/ {0xf7, 1512}, - /*II_DC_00*/ {0xf8, 1023}, - /*II_DC_01*/ {0xf8, 1029}, - /*II_DC_02*/ {0xf8, 1035}, - /*II_DC_03*/ {0xf8, 1041}, - /*II_DC_04*/ {0xf8, 1048}, - /*II_DC_05*/ {0xf8, 1054}, - /*II_DC_06*/ {0xf8, 1061}, - /*II_DC_07*/ {0xf8, 1067}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C0*/ {0xf9, 1023}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_C8*/ {0xf9, 1029}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E0*/ {0xf9, 1054}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_E8*/ {0xf9, 1048}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F0*/ {0xf9, 1067}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DC_F8*/ {0xf9, 1061}, - /*II_DD_00*/ {0xf8, 1074}, - /*II_DD_01*/ {0xfa, 1424}, - /*II_DD_02*/ {0xfb, 1079}, - /*II_DD_03*/ {0xfb, 1084}, - /*II_DD_04*/ {0xed, 1519}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_C0*/ {0xea, 1527}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D0*/ {0xea, 1079}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_D8*/ {0xea, 1084}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E1*/ {0xeb, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E0*/ {0xf9, 1534}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E9*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DD_E8*/ {0xea, 1541}, - /*II_DE_00*/ {0xee, 1317}, - /*II_DE_01*/ {0xee, 1324}, - /*II_DE_02*/ {0xee, 1331}, - /*II_DE_03*/ {0xee, 1338}, - /*II_DE_04*/ {0xee, 1346}, - /*II_DE_05*/ {0xee, 1353}, - /*II_DE_06*/ {0xee, 1361}, - /*II_DE_07*/ {0xee, 1368}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C1*/ {0xeb, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C0*/ {0xf9, 1549}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C9*/ {0xeb, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_C8*/ {0xf9, 1556}, - /*II_DE_D9*/ {0xeb, 1563}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E1*/ {0xeb, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E0*/ {0xf9, 1571}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E9*/ {0xeb, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_E8*/ {0xf9, 1579}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F1*/ {0xeb, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F0*/ {0xf9, 1586}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F9*/ {0xeb, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DE_F8*/ {0xf9, 1594}, - /*II_DF_00*/ {0xee, 1418}, - /*II_DF_01*/ {0xfc, 1424}, - /*II_DF_02*/ {0xfd, 1432}, - /*II_DF_03*/ {0xfd, 1438}, - /*II_DF_04*/ {0xf4, 1601}, - /*II_DF_05*/ {0xf8, 1418}, - /*II_DF_06*/ {0xf5, 1607}, - /*II_DF_07*/ {0xfb, 1438}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_E8*/ {0xf6, 1614}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_DF_F0*/ {0xf6, 1623}, - /*II_F6_00*/ {0xfe, 206}, - /*II_F6_02*/ {0xff, 1631}, - /*II_F6_03*/ {0x100, 1636}, - /*II_F6_04*/ {0x101, 1641}, - /*II_F6_05*/ {0x101, 117}, - /*II_F6_06*/ {0x102, 1646}, - /*II_F6_07*/ {0x102, 1651}, - /*II_F7_00*/ {0x103, 206}, - /*II_F7_02*/ {0x104, 1631}, - /*II_F7_03*/ {0x105, 1636}, - /*II_F7_04*/ {0x106, 1641}, - /*II_F7_05*/ {0x106, 117}, - /*II_F7_06*/ {0x107, 1646}, - /*II_F7_07*/ {0x107, 1651}, - /*II_FE_00*/ {0x108, 81}, - /*II_FE_01*/ {0x108, 86}, - /*II_FF_00*/ {0x109, 81}, - /*II_FF_01*/ {0x109, 86}, - /*II_FF_02*/ {0x10a, 456}, - /*II_FF_03*/ {0x10b, 260}, - /*II_FF_04*/ {0x10c, 462}, - /*II_FF_05*/ {0x10d, 467}, - /*II_FF_06*/ {0x10e, 16}, - /*II_0F_00_00*/ {0x10f, 1657}, - /*II_0F_00_01*/ {0x110, 1663}, - /*II_0F_00_02*/ {0x110, 34436}, - /*II_0F_00_03*/ {0x111, 34442}, - /*II_0F_00_04*/ {0x112, 1679}, - /*II_0F_00_05*/ {0x112, 1685}, - /*II_0F_01_00*/ {0x113, 1691}, - /*II_0F_01_01*/ {0x113, 1697}, - /*II_0F_01_02*/ {0x113, 34471}, - /*II_0F_01_03*/ {0x113, 34477}, - /*II_0F_01_04*/ {0x114, 1715}, - /*II_0F_01_06*/ {0x115, 34489}, - /*II_0F_01_07*/ {0x116, 34495}, - /*II_0F_01_C1*/ {0x117, 1735}, - /*II_0F_01_C2*/ {0x117, 1743}, - /*II_0F_01_C3*/ {0x117, 1753}, - /*II_0F_01_C4*/ {0x117, 1763}, - /*II_0F_01_C8*/ {0x118, 1771}, - /*II_0F_01_C9*/ {0x118, 1780}, - /*II_0F_01_D0*/ {0x88, 1787}, - /*II_0F_01_D1*/ {0x88, 1795}, - /*II_0F_01_D4*/ {0x117, 1803}, - /*II_0F_01_D5*/ {0x119, 1811}, - /*II_0F_01_D8*/ {0x11a, 1817}, - /*II_0F_01_D9*/ {0x11b, 1824}, - /*II_0F_01_DA*/ {0x11c, 1833}, - /*II_0F_01_DB*/ {0x11c, 1841}, - /*II_0F_01_DC*/ {0x11b, 1849}, - /*II_0F_01_DD*/ {0x11b, 1855}, - /*II_0F_01_DE*/ {0x11c, 1861}, - /*II_0F_01_DF*/ {0x11d, 1869}, - /*II_0F_01_F8*/ {0x11e, 1878}, - /*II_0F_01_F9*/ {0x11e, 1886}, - /*II_0F_0D_00*/ {0x11f, 1894}, - /*II_0F_0D_01*/ {0x11f, 1904}, - /*II_0F_0F_0C*/ {0x120, 1915}, - /*II_0F_0F_0D*/ {0x121, 1922}, - /*II_0F_0F_1C*/ {0x120, 1929}, - /*II_0F_0F_1D*/ {0x121, 1936}, - /*II_0F_0F_8A*/ {0x120, 1943}, - /*II_0F_0F_8E*/ {0x120, 1951}, - /*II_0F_0F_90*/ {0x121, 1960}, - /*II_0F_0F_94*/ {0x121, 1969}, - /*II_0F_0F_96*/ {0x121, 1976}, - /*II_0F_0F_97*/ {0x121, 1983}, - /*II_0F_0F_9A*/ {0x121, 1992}, - /*II_0F_0F_9E*/ {0x121, 1999}, - /*II_0F_0F_A0*/ {0x121, 2006}, - /*II_0F_0F_A4*/ {0x121, 2015}, - /*II_0F_0F_A6*/ {0x121, 2022}, - /*II_0F_0F_A7*/ {0x121, 2032}, - /*II_0F_0F_AA*/ {0x121, 2042}, - /*II_0F_0F_AE*/ {0x121, 2050}, - /*II_0F_0F_B0*/ {0x121, 2057}, - /*II_0F_0F_B4*/ {0x121, 2066}, - /*II_0F_0F_B6*/ {0x121, 2073}, - /*II_0F_0F_B7*/ {0x121, 2083}, - /*II_0F_0F_BB*/ {0x120, 2092}, - /*II_0F_0F_BF*/ {0x121, 2100}, - /*II_0F_10*/ {0x122, 2109}, - /*II_66_0F_10*/ {0x123, 2117}, - /*II_F3_0F_10*/ {0x124, 2125}, - /*II_F2_0F_10*/ {0x125, 2132}, - /*II_0F_11*/ {0x12a, 2109}, - /*II_66_0F_11*/ {0x12b, 2117}, - /*II_F3_0F_11*/ {0x12c, 2125}, - /*II_F2_0F_11*/ {0x12d, 2132}, - /*II_66_0F_12*/ {0x132, 2190}, - /*II_F3_0F_12*/ {0x133, 2198}, - /*II_F2_0F_12*/ {0x133, 2208}, - /*II_0F_13*/ {0x137, 2182}, - /*II_66_0F_13*/ {0x138, 2190}, - /*II_0F_14*/ {0x13a, 2266}, - /*II_66_0F_14*/ {0x13b, 2276}, - /*II_0F_15*/ {0x13a, 2308}, - /*II_66_0F_15*/ {0x13b, 2318}, - /*II_66_0F_16*/ {0x132, 2367}, - /*II_F3_0F_16*/ {0x13d, 2375}, - /*II_0F_17*/ {0x137, 2359}, - /*II_66_0F_17*/ {0x138, 2367}, - /*II_0F_18_00*/ {0x13e, 2424}, - /*II_0F_18_01*/ {0x13e, 2437}, - /*II_0F_18_02*/ {0x13e, 2449}, - /*II_0F_18_03*/ {0x13e, 2461}, - /*II_0F_28*/ {0x122, 2473}, - /*II_66_0F_28*/ {0x123, 2481}, - /*II_0F_29*/ {0x12a, 2473}, - /*II_66_0F_29*/ {0x12b, 2481}, - /*II_0F_2A*/ {0x13f, 2507}, - /*II_66_0F_2A*/ {0x140, 2517}, - /*II_F3_0F_2A*/ {0x141, 2527}, - /*II_F2_0F_2A*/ {0x142, 2537}, - /*II_0F_2B*/ {0x143, 2569}, - /*II_66_0F_2B*/ {0x144, 2578}, - /*II_F3_0F_2B*/ {0x145, 2587}, - /*II_F2_0F_2B*/ {0x146, 2596}, - /*II_0F_2C*/ {0x148, 2625}, - /*II_66_0F_2C*/ {0x149, 2636}, - /*II_F3_0F_2C*/ {0x14a, 2647}, - /*II_F2_0F_2C*/ {0x14b, 2658}, - /*II_0F_2D*/ {0x148, 2693}, - /*II_66_0F_2D*/ {0x13b, 2703}, - /*II_F3_0F_2D*/ {0x14a, 2713}, - /*II_F2_0F_2D*/ {0x14b, 2723}, - /*II_0F_2E*/ {0x14d, 2755}, - /*II_66_0F_2E*/ {0x14e, 2764}, - /*II_0F_2F*/ {0x14d, 2793}, - /*II_66_0F_2F*/ {0x14e, 2801}, - /*II_0F_50*/ {0x151, 2827}, - /*II_66_0F_50*/ {0x152, 2837}, - /*II_0F_51*/ {0x13a, 2869}, - /*II_66_0F_51*/ {0x13b, 2877}, - /*II_F3_0F_51*/ {0x154, 2885}, - /*II_F2_0F_51*/ {0x14e, 2893}, - /*II_0F_52*/ {0x13a, 2937}, - /*II_F3_0F_52*/ {0x154, 2946}, - /*II_0F_53*/ {0x13a, 2975}, - /*II_F3_0F_53*/ {0x154, 2982}, - /*II_0F_54*/ {0x13a, 3005}, - /*II_66_0F_54*/ {0x13b, 3012}, - /*II_0F_55*/ {0x13a, 3035}, - /*II_66_0F_55*/ {0x13b, 3043}, - /*II_0F_56*/ {0x13a, 3069}, - /*II_66_0F_56*/ {0x13b, 3075}, - /*II_0F_57*/ {0x13a, 3095}, - /*II_66_0F_57*/ {0x13b, 3102}, - /*II_0F_58*/ {0x13a, 3125}, - /*II_66_0F_58*/ {0x13b, 3132}, - /*II_F3_0F_58*/ {0x154, 3139}, - /*II_F2_0F_58*/ {0x14e, 3146}, - /*II_0F_59*/ {0x13a, 3185}, - /*II_66_0F_59*/ {0x13b, 3192}, - /*II_F3_0F_59*/ {0x154, 3199}, - /*II_F2_0F_59*/ {0x14e, 3206}, - /*II_0F_5A*/ {0x14e, 3245}, - /*II_66_0F_5A*/ {0x13b, 3255}, - /*II_F3_0F_5A*/ {0x155, 3265}, - /*II_F2_0F_5A*/ {0x14e, 3275}, - /*II_0F_5B*/ {0x13b, 3329}, - /*II_66_0F_5B*/ {0x13b, 3339}, - /*II_F3_0F_5B*/ {0x13b, 3349}, - /*II_0F_5C*/ {0x13a, 3394}, - /*II_66_0F_5C*/ {0x13b, 3401}, - /*II_F3_0F_5C*/ {0x154, 3408}, - /*II_F2_0F_5C*/ {0x14e, 3415}, - /*II_0F_5D*/ {0x13a, 3454}, - /*II_66_0F_5D*/ {0x13b, 3461}, - /*II_F3_0F_5D*/ {0x154, 3468}, - /*II_F2_0F_5D*/ {0x14e, 3475}, - /*II_0F_5E*/ {0x13a, 3514}, - /*II_66_0F_5E*/ {0x13b, 3521}, - /*II_F3_0F_5E*/ {0x154, 3528}, - /*II_F2_0F_5E*/ {0x14e, 3535}, - /*II_0F_5F*/ {0x13a, 3574}, - /*II_66_0F_5F*/ {0x13b, 3581}, - /*II_F3_0F_5F*/ {0x154, 3588}, - /*II_F2_0F_5F*/ {0x14e, 3595}, - /*II_0F_60*/ {0x158, 3634}, - /*II_66_0F_60*/ {0x13b, 3634}, - /*II_0F_61*/ {0x158, 3657}, - /*II_66_0F_61*/ {0x13b, 3657}, - /*II_0F_62*/ {0x158, 3680}, - /*II_66_0F_62*/ {0x13b, 3680}, - /*II_0F_63*/ {0x159, 3703}, - /*II_66_0F_63*/ {0x13b, 3703}, - /*II_0F_64*/ {0x159, 3724}, - /*II_66_0F_64*/ {0x13b, 3724}, - /*II_0F_65*/ {0x159, 3743}, - /*II_66_0F_65*/ {0x13b, 3743}, - /*II_0F_66*/ {0x159, 3762}, - /*II_66_0F_66*/ {0x13b, 3762}, - /*II_0F_67*/ {0x159, 3781}, - /*II_66_0F_67*/ {0x13b, 3781}, - /*II_0F_68*/ {0x159, 3802}, - /*II_66_0F_68*/ {0x13b, 3802}, - /*II_0F_69*/ {0x159, 3825}, - /*II_66_0F_69*/ {0x13b, 3825}, - /*II_0F_6A*/ {0x159, 3848}, - /*II_66_0F_6A*/ {0x13b, 3848}, - /*II_0F_6B*/ {0x159, 3871}, - /*II_66_0F_6B*/ {0x13b, 3871}, - /*II_66_0F_6C*/ {0x13b, 3892}, - /*II_66_0F_6D*/ {0x13b, 3917}, - /*II_0F_6F*/ {0x15d, 3948}, - /*II_66_0F_6F*/ {0x123, 3968}, - /*II_F3_0F_6F*/ {0x123, 3976}, - /*II_0F_74*/ {0x159, 4065}, - /*II_66_0F_74*/ {0x13b, 4065}, - /*II_0F_75*/ {0x159, 4084}, - /*II_66_0F_75*/ {0x13b, 4084}, - /*II_0F_76*/ {0x159, 4103}, - /*II_66_0F_76*/ {0x13b, 4103}, - /*II_0F_77*/ {0x161, 4122}, - /*II_0F_78*/ {0x163, 4150}, - /*II_0F_79*/ {0x166, 4174}, - /*II_66_0F_79*/ {0x167, 4158}, - /*II_F2_0F_79*/ {0x168, 4165}, - /*II_0F_7A_30*/ {0x169, 4183}, - /*II_0F_7A_31*/ {0x16a, 4193}, - /*II_66_0F_7C*/ {0x16b, 4203}, - /*II_F2_0F_7C*/ {0x16b, 4211}, - /*II_66_0F_7D*/ {0x16b, 4237}, - /*II_F2_0F_7D*/ {0x16b, 4245}, - /*II_F3_0F_7E*/ {0x125, 3948}, - /*II_0F_7F*/ {0x16f, 3948}, - /*II_66_0F_7F*/ {0x12b, 3968}, - /*II_F3_0F_7F*/ {0x12b, 3976}, - /*II_F3_0F_B8*/ {0x173, 4360}, - /*II_0F_BA_04*/ {0x174, 872}, - /*II_0F_BA_05*/ {0x175, 887}, - /*II_0F_BA_06*/ {0x175, 912}, - /*II_0F_BA_07*/ {0x175, 934}, - /*II_0F_BC*/ {0x176, 4368}, - /*II_F3_0F_BC*/ {0x177, 4373}, - /*II_0F_BD*/ {0x176, 4380}, - /*II_F3_0F_BD*/ {0x178, 4385}, - /*II_0F_C7_07*/ {0x188, 6407}, - /*II_66_0F_D0*/ {0x16b, 6416}, - /*II_F2_0F_D0*/ {0x16b, 6426}, - /*II_0F_D1*/ {0x159, 6458}, - /*II_66_0F_D1*/ {0x13b, 6458}, - /*II_0F_D2*/ {0x159, 6473}, - /*II_66_0F_D2*/ {0x13b, 6473}, - /*II_0F_D3*/ {0x159, 6488}, - /*II_66_0F_D3*/ {0x13b, 6488}, - /*II_0F_D4*/ {0x14e, 6503}, - /*II_66_0F_D4*/ {0x13b, 6503}, - /*II_0F_D5*/ {0x159, 6518}, - /*II_66_0F_D5*/ {0x13b, 6518}, - /*II_66_0F_D6*/ {0x12d, 3948}, - /*II_F3_0F_D6*/ {0x189, 6535}, - /*II_F2_0F_D6*/ {0x18a, 6544}, - /*II_0F_D7*/ {0x18c, 6553}, - /*II_66_0F_D7*/ {0x18d, 6553}, - /*II_0F_D8*/ {0x159, 6574}, - /*II_66_0F_D8*/ {0x13b, 6574}, - /*II_0F_D9*/ {0x159, 6593}, - /*II_66_0F_D9*/ {0x13b, 6593}, - /*II_0F_DA*/ {0x18f, 6612}, - /*II_66_0F_DA*/ {0x13b, 6612}, - /*II_0F_DB*/ {0x159, 6629}, - /*II_66_0F_DB*/ {0x13b, 6629}, - /*II_0F_DC*/ {0x159, 6642}, - /*II_66_0F_DC*/ {0x13b, 6642}, - /*II_0F_DD*/ {0x159, 6661}, - /*II_66_0F_DD*/ {0x13b, 6661}, - /*II_0F_DE*/ {0x18f, 6670}, - /*II_66_0F_DE*/ {0x13b, 6670}, - /*II_0F_DF*/ {0x159, 6687}, - /*II_66_0F_DF*/ {0x13b, 6687}, - /*II_0F_E0*/ {0x18f, 6702}, - /*II_66_0F_E0*/ {0x13b, 6702}, - /*II_0F_E1*/ {0x159, 6717}, - /*II_66_0F_E1*/ {0x13b, 6717}, - /*II_0F_E2*/ {0x159, 6732}, - /*II_66_0F_E2*/ {0x13b, 6732}, - /*II_0F_E3*/ {0x18f, 6747}, - /*II_66_0F_E3*/ {0x13b, 6747}, - /*II_0F_E4*/ {0x18f, 6762}, - /*II_66_0F_E4*/ {0x13b, 6762}, - /*II_0F_E5*/ {0x159, 6781}, - /*II_66_0F_E5*/ {0x13b, 6781}, - /*II_66_0F_E6*/ {0x13b, 6798}, - /*II_F3_0F_E6*/ {0x14e, 6809}, - /*II_F2_0F_E6*/ {0x13b, 6819}, - /*II_0F_E7*/ {0x190, 6863}, - /*II_66_0F_E7*/ {0x144, 6871}, - /*II_0F_E8*/ {0x159, 6890}, - /*II_66_0F_E8*/ {0x13b, 6890}, - /*II_0F_E9*/ {0x159, 6907}, - /*II_66_0F_E9*/ {0x13b, 6907}, - /*II_0F_EA*/ {0x18f, 6924}, - /*II_66_0F_EA*/ {0x13b, 6924}, - /*II_0F_EB*/ {0x159, 6941}, - /*II_66_0F_EB*/ {0x13b, 6941}, - /*II_0F_EC*/ {0x159, 6952}, - /*II_66_0F_EC*/ {0x13b, 6952}, - /*II_0F_ED*/ {0x159, 6969}, - /*II_66_0F_ED*/ {0x13b, 6969}, - /*II_0F_EE*/ {0x18f, 6986}, - /*II_66_0F_EE*/ {0x13b, 6986}, - /*II_0F_EF*/ {0x159, 7003}, - /*II_66_0F_EF*/ {0x13b, 7003}, - /*II_F2_0F_F0*/ {0x191, 7016}, - /*II_0F_F1*/ {0x159, 7031}, - /*II_66_0F_F1*/ {0x13b, 7031}, - /*II_0F_F2*/ {0x159, 7046}, - /*II_66_0F_F2*/ {0x13b, 7046}, - /*II_0F_F3*/ {0x159, 7061}, - /*II_66_0F_F3*/ {0x13b, 7061}, - /*II_0F_F4*/ {0x193, 7076}, - /*II_66_0F_F4*/ {0x13b, 7076}, - /*II_0F_F5*/ {0x159, 7095}, - /*II_66_0F_F5*/ {0x13b, 7095}, - /*II_0F_F6*/ {0x18f, 7114}, - /*II_66_0F_F6*/ {0x13b, 7114}, - /*II_0F_F7*/ {0x194, 7131}, - /*II_66_0F_F7*/ {0x195, 7141}, - /*II_0F_F8*/ {0x159, 7166}, - /*II_66_0F_F8*/ {0x13b, 7166}, - /*II_0F_F9*/ {0x159, 7181}, - /*II_66_0F_F9*/ {0x13b, 7181}, - /*II_0F_FA*/ {0x159, 7196}, - /*II_66_0F_FA*/ {0x13b, 7196}, - /*II_0F_FB*/ {0x193, 7211}, - /*II_66_0F_FB*/ {0x13b, 7211}, - /*II_0F_FC*/ {0x159, 7226}, - /*II_66_0F_FC*/ {0x13b, 7226}, - /*II_0F_FD*/ {0x159, 7241}, - /*II_66_0F_FD*/ {0x13b, 7241}, - /*II_0F_FE*/ {0x159, 7256}, - /*II_66_0F_FE*/ {0x13b, 7256}, - /*II_D9_06*/ {0x197, 7271}, - /*II_9B_D9_06*/ {0x198, 7280}, - /*II_D9_07*/ {0xfd, 7288}, - /*II_9B_D9_07*/ {0x199, 7296}, - /*II_DB_E2*/ {0xeb, 7303}, - /*II_9B_DB_E2*/ {0x19a, 7311}, - /*II_DB_E3*/ {0xeb, 7318}, - /*II_9B_DB_E3*/ {0x19a, 7326}, - /*II_DD_06*/ {0x197, 7333}, - /*II_9B_DD_06*/ {0x198, 7341}, - /*II_DD_07*/ {0xfd, 7348}, - /*II_9B_DD_07*/ {0x199, 7356}, - /*II_DF_E0*/ {0x19b, 7348}, - /*II_9B_DF_E0*/ {0x19c, 7356}, - /*II_0F_38_00*/ {0x19d, 7363}, - /*II_66_0F_38_00*/ {0x19e, 7363}, - /*II_0F_38_01*/ {0x19d, 7380}, - /*II_66_0F_38_01*/ {0x19e, 7380}, - /*II_0F_38_02*/ {0x19d, 7397}, - /*II_66_0F_38_02*/ {0x19e, 7397}, - /*II_0F_38_03*/ {0x19d, 7414}, - /*II_66_0F_38_03*/ {0x19e, 7414}, - /*II_0F_38_04*/ {0x19d, 7433}, - /*II_66_0F_38_04*/ {0x19e, 7433}, - /*II_0F_38_05*/ {0x19d, 7456}, - /*II_66_0F_38_05*/ {0x19e, 7456}, - /*II_0F_38_06*/ {0x19d, 7473}, - /*II_66_0F_38_06*/ {0x19e, 7473}, - /*II_0F_38_07*/ {0x19d, 7490}, - /*II_66_0F_38_07*/ {0x19e, 7490}, - /*II_0F_38_08*/ {0x19d, 7509}, - /*II_66_0F_38_08*/ {0x19e, 7509}, - /*II_0F_38_09*/ {0x19d, 7526}, - /*II_66_0F_38_09*/ {0x19e, 7526}, - /*II_0F_38_0A*/ {0x19d, 7543}, - /*II_66_0F_38_0A*/ {0x19e, 7543}, - /*II_0F_38_0B*/ {0x19d, 7560}, - /*II_66_0F_38_0B*/ {0x19e, 7560}, - /*II_66_0F_38_17*/ {0x1a0, 7651}, - /*II_0F_38_1C*/ {0x19d, 7710}, - /*II_66_0F_38_1C*/ {0x19e, 7710}, - /*II_0F_38_1D*/ {0x19d, 7725}, - /*II_66_0F_38_1D*/ {0x19e, 7725}, - /*II_0F_38_1E*/ {0x19d, 7740}, - /*II_66_0F_38_1E*/ {0x19e, 7740}, - /*II_66_0F_38_20*/ {0x1a5, 7755}, - /*II_66_0F_38_21*/ {0x1a6, 7776}, - /*II_66_0F_38_22*/ {0x1a7, 7797}, - /*II_66_0F_38_23*/ {0x1a5, 7818}, - /*II_66_0F_38_24*/ {0x1a6, 7839}, - /*II_66_0F_38_25*/ {0x1a5, 7860}, - /*II_66_0F_38_28*/ {0x1a9, 7881}, - /*II_66_0F_38_29*/ {0x1a9, 7898}, - /*II_66_0F_38_2A*/ {0x1aa, 7917}, - /*II_66_0F_38_2B*/ {0x1a9, 7938}, - /*II_66_0F_38_30*/ {0x1a5, 7983}, - /*II_66_0F_38_31*/ {0x1a6, 8004}, - /*II_66_0F_38_32*/ {0x1a7, 8025}, - /*II_66_0F_38_33*/ {0x1a5, 8046}, - /*II_66_0F_38_34*/ {0x1a6, 8067}, - /*II_66_0F_38_35*/ {0x1a5, 8088}, - /*II_66_0F_38_37*/ {0x1a0, 8109}, - /*II_66_0F_38_38*/ {0x1a9, 8128}, - /*II_66_0F_38_39*/ {0x1a9, 8145}, - /*II_66_0F_38_3A*/ {0x1a9, 8162}, - /*II_66_0F_38_3B*/ {0x1a9, 8179}, - /*II_66_0F_38_3C*/ {0x1a9, 8196}, - /*II_66_0F_38_3D*/ {0x1a9, 8213}, - /*II_66_0F_38_3E*/ {0x1a9, 8230}, - /*II_66_0F_38_3F*/ {0x1a9, 8247}, - /*II_66_0F_38_40*/ {0x1a9, 8264}, - /*II_66_0F_38_41*/ {0x1a9, 8281}, - /*II_66_0F_38_80*/ {0x1ad, 8306}, - /*II_66_0F_38_81*/ {0x1ad, 8314}, - /*II_66_0F_38_82*/ {0x1ad, 8323}, - /*II_66_0F_38_DB*/ {0x1b0, 9172}, - /*II_66_0F_38_DC*/ {0x1b0, 9189}, - /*II_66_0F_38_DD*/ {0x1b0, 9206}, - /*II_66_0F_38_DE*/ {0x1b0, 9231}, - /*II_66_0F_38_DF*/ {0x1b0, 9248}, - /*II_0F_38_F0*/ {0x1b3, 9273}, - /*II_F2_0F_38_F0*/ {0x1b4, 9280}, - /*II_0F_38_F1*/ {0x1b5, 9273}, - /*II_F2_0F_38_F1*/ {0x1b6, 9280}, - /*II_0F_71_02*/ {0x1cd, 6458}, - /*II_66_0F_71_02*/ {0x1ce, 6458}, - /*II_0F_71_04*/ {0x1cd, 6717}, - /*II_66_0F_71_04*/ {0x1ce, 6717}, - /*II_0F_71_06*/ {0x1cd, 7031}, - /*II_66_0F_71_06*/ {0x1ce, 7031}, - /*II_0F_72_02*/ {0x1cd, 6473}, - /*II_66_0F_72_02*/ {0x1ce, 6473}, - /*II_0F_72_04*/ {0x1cd, 6732}, - /*II_66_0F_72_04*/ {0x1ce, 6732}, - /*II_0F_72_06*/ {0x1cd, 7046}, - /*II_66_0F_72_06*/ {0x1ce, 7046}, - /*II_0F_73_02*/ {0x1cd, 6488}, - /*II_66_0F_73_02*/ {0x1ce, 6488}, - /*II_66_0F_73_03*/ {0x1ce, 9852}, - /*II_0F_73_06*/ {0x1cd, 7061}, - /*II_66_0F_73_06*/ {0x1ce, 7061}, - /*II_66_0F_73_07*/ {0x1ce, 9869}, - /*II_F3_0F_AE_00*/ {0x1d0, 9904}, - /*II_F3_0F_AE_01*/ {0x1d0, 9934}, - /*II_0F_AE_02*/ {0x1d1, 9944}, - /*II_F3_0F_AE_02*/ {0x1d0, 9953}, - /*II_0F_AE_03*/ {0x1d1, 9973}, - /*II_F3_0F_AE_03*/ {0x1d0, 9982}, - /*II_0F_C7_06*/ {0x1d3, 10002}, - /*II_66_0F_C7_06*/ {0x188, 10011}, - /*II_F3_0F_C7_06*/ {0x188, 10020} + /*II_F4*/ {0x83, 482}, + /*II_F5*/ {0x84, 487}, + /*II_F8*/ {0x84, 492}, + /*II_F9*/ {0x84, 497}, + /*II_FA*/ {0x85, 502}, + /*II_FB*/ {0x85, 507}, + /*II_FC*/ {0x86, 512}, + /*II_FD*/ {0x86, 517}, + /*II_0F_02*/ {0x87, 522}, + /*II_0F_03*/ {0x87, 527}, + /*II_0F_05*/ {0x88, 532}, + /*II_0F_06*/ {0x89, 541}, + /*II_0F_07*/ {0x88, 547}, + /*II_0F_08*/ {0x89, 555}, + /*II_0F_09*/ {0x89, 561}, + /*II_0F_0B*/ {0x8a, 569}, + /*II_0F_0E*/ {0x8b, 574}, + /*II_0F_1F*/ {0x8c, 581}, + /*II_0F_20*/ {0x8d, 218}, + /*II_0F_21*/ {0x8e, 218}, + /*II_0F_22*/ {0x8f, 218}, + /*II_0F_23*/ {0x90, 218}, + /*II_0F_30*/ {0x89, 586}, + /*II_0F_31*/ {0x89, 593}, + /*II_0F_32*/ {0x89, 600}, + /*II_0F_33*/ {0x89, 607}, + /*II_0F_34*/ {0x88, 614}, + /*II_0F_35*/ {0x88, 624}, + /*II_0F_37*/ {0x91, 633}, + /*II_0F_40*/ {0x92, 641}, + /*II_0F_41*/ {0x92, 648}, + /*II_0F_42*/ {0x93, 656}, + /*II_0F_43*/ {0x93, 663}, + /*II_0F_44*/ {0x94, 671}, + /*II_0F_45*/ {0x94, 678}, + /*II_0F_46*/ {0x95, 686}, + /*II_0F_47*/ {0x95, 694}, + /*II_0F_48*/ {0x96, 701}, + /*II_0F_49*/ {0x96, 708}, + /*II_0F_4A*/ {0x97, 716}, + /*II_0F_4B*/ {0x97, 723}, + /*II_0F_4C*/ {0x98, 731}, + /*II_0F_4D*/ {0x98, 738}, + /*II_0F_4E*/ {0x99, 746}, + /*II_0F_4F*/ {0x99, 754}, + /*II_0F_80*/ {0x9a, 134}, + /*II_0F_81*/ {0x9a, 138}, + /*II_0F_82*/ {0x9b, 143}, + /*II_0F_83*/ {0x9b, 147}, + /*II_0F_84*/ {0x9c, 152}, + /*II_0F_85*/ {0x9c, 156}, + /*II_0F_86*/ {0x9d, 161}, + /*II_0F_87*/ {0x9d, 166}, + /*II_0F_88*/ {0x9e, 170}, + /*II_0F_89*/ {0x9e, 174}, + /*II_0F_8A*/ {0x9f, 179}, + /*II_0F_8B*/ {0x9f, 183}, + /*II_0F_8C*/ {0xa0, 188}, + /*II_0F_8D*/ {0xa0, 192}, + /*II_0F_8E*/ {0xa1, 197}, + /*II_0F_8F*/ {0xa1, 202}, + /*II_0F_90*/ {0xa2, 761}, + /*II_0F_91*/ {0xa2, 767}, + /*II_0F_92*/ {0xa3, 774}, + /*II_0F_93*/ {0xa3, 780}, + /*II_0F_94*/ {0xa4, 787}, + /*II_0F_95*/ {0xa4, 793}, + /*II_0F_96*/ {0xa5, 800}, + /*II_0F_97*/ {0xa5, 807}, + /*II_0F_98*/ {0xa6, 813}, + /*II_0F_99*/ {0xa6, 819}, + /*II_0F_9A*/ {0xa7, 826}, + /*II_0F_9B*/ {0xa7, 832}, + /*II_0F_9C*/ {0xa8, 839}, + /*II_0F_9D*/ {0xa8, 845}, + /*II_0F_9E*/ {0xa9, 852}, + /*II_0F_9F*/ {0xa9, 859}, + /*II_0F_A0*/ {0xaa, 16}, + /*II_0F_A1*/ {0xab, 22}, + /*II_0F_A2*/ {0x91, 865}, + /*II_0F_A3*/ {0xac, 872}, + /*II_0F_A8*/ {0xae, 16}, + /*II_0F_A9*/ {0xaf, 22}, + /*II_0F_AA*/ {0xb0, 882}, + /*II_0F_AB*/ {0xb1, 887}, + /*II_0F_AF*/ {0xb2, 117}, + /*II_0F_B0*/ {0xb3, 898}, + /*II_0F_B1*/ {0xb4, 898}, + /*II_0F_B2*/ {0xb5, 907}, + /*II_0F_B3*/ {0xb1, 912}, + /*II_0F_B4*/ {0xb5, 917}, + /*II_0F_B5*/ {0xb5, 922}, + /*II_0F_B6*/ {0xb6, 927}, + /*II_0F_B7*/ {0xb7, 927}, + /*II_0F_B9*/ {0x8a, 569}, + /*II_0F_BB*/ {0xb1, 934}, + /*II_0F_BE*/ {0xb6, 939}, + /*II_0F_BF*/ {0xb7, 939}, + /*II_0F_C0*/ {0xb3, 946}, + /*II_0F_C1*/ {0xb4, 946}, + /*II_0F_C3*/ {0xb8, 952}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_C8*/ {0xb9, 960}, + /*II_80_00*/ {0xba, 11}, + /*II_80_01*/ {0xbb, 27}, + /*II_80_02*/ {0xbc, 31}, + /*II_80_03*/ {0xbc, 36}, + /*II_80_04*/ {0xbd, 41}, + /*II_80_05*/ {0xba, 51}, + /*II_80_06*/ {0xbe, 61}, + /*II_80_07*/ {0xbf, 71}, + /*II_81_00*/ {0xc0, 11}, + /*II_81_01*/ {0xc1, 27}, + /*II_81_02*/ {0xc2, 31}, + /*II_81_03*/ {0xc2, 36}, + /*II_81_04*/ {0xc3, 41}, + /*II_81_05*/ {0xc0, 51}, + /*II_81_06*/ {0xc4, 61}, + /*II_81_07*/ {0xc5, 71}, + /*II_82_00*/ {0xc6, 11}, + /*II_82_01*/ {0xc7, 27}, + /*II_82_02*/ {0xc8, 31}, + /*II_82_03*/ {0xc8, 36}, + /*II_82_04*/ {0xc9, 41}, + /*II_82_05*/ {0xc6, 51}, + /*II_82_06*/ {0xca, 61}, + /*II_82_07*/ {0xcb, 71}, + /*II_83_00*/ {0xcc, 11}, + /*II_83_01*/ {0xcd, 27}, + /*II_83_02*/ {0xce, 31}, + /*II_83_03*/ {0xce, 36}, + /*II_83_04*/ {0xcf, 41}, + /*II_83_05*/ {0xcc, 51}, + /*II_83_06*/ {0xd0, 61}, + /*II_83_07*/ {0xd1, 71}, + /*II_8F_00*/ {0xd2, 22}, + /*II_C0_00*/ {0xd3, 967}, + /*II_C0_01*/ {0xd3, 972}, + /*II_C0_02*/ {0xd4, 977}, + /*II_C0_03*/ {0xd4, 982}, + /*II_C0_04*/ {0xd5, 987}, + /*II_C0_05*/ {0xd5, 992}, + /*II_C0_06*/ {0xd5, 997}, + /*II_C0_07*/ {0xd5, 1002}, + /*II_C1_00*/ {0xd6, 967}, + /*II_C1_01*/ {0xd6, 972}, + /*II_C1_02*/ {0xd7, 977}, + /*II_C1_03*/ {0xd7, 982}, + /*II_C1_04*/ {0xd8, 987}, + /*II_C1_05*/ {0xd8, 992}, + /*II_C1_06*/ {0xd8, 997}, + /*II_C1_07*/ {0xd8, 1002}, + /*II_C6_00*/ {0xd9, 218}, + /*II_C6_F8*/ {0xda, 1007}, + /*II_C7_00*/ {0xdb, 218}, + /*II_C7_F8*/ {0xdc, 1015}, + /*II_D0_00*/ {0xdd, 967}, + /*II_D0_01*/ {0xdd, 972}, + /*II_D0_02*/ {0xde, 977}, + /*II_D0_03*/ {0xde, 982}, + /*II_D0_04*/ {0xdf, 987}, + /*II_D0_05*/ {0xdf, 992}, + /*II_D0_06*/ {0xdf, 997}, + /*II_D0_07*/ {0xdf, 1002}, + /*II_D1_00*/ {0xe0, 967}, + /*II_D1_01*/ {0xe0, 972}, + /*II_D1_02*/ {0xe1, 977}, + /*II_D1_03*/ {0xe1, 982}, + /*II_D1_04*/ {0xe2, 987}, + /*II_D1_05*/ {0xe2, 992}, + /*II_D1_06*/ {0xe2, 997}, + /*II_D1_07*/ {0xe2, 1002}, + /*II_D2_00*/ {0xe3, 967}, + /*II_D2_01*/ {0xe3, 972}, + /*II_D2_02*/ {0xe4, 977}, + /*II_D2_03*/ {0xe4, 982}, + /*II_D2_04*/ {0xe5, 987}, + /*II_D2_05*/ {0xe5, 992}, + /*II_D2_06*/ {0xe5, 997}, + /*II_D2_07*/ {0xe5, 1002}, + /*II_D3_00*/ {0xe6, 967}, + /*II_D3_01*/ {0xe6, 972}, + /*II_D3_02*/ {0xe7, 977}, + /*II_D3_03*/ {0xe7, 982}, + /*II_D3_04*/ {0xe8, 987}, + /*II_D3_05*/ {0xe8, 992}, + /*II_D3_06*/ {0xe8, 997}, + /*II_D3_07*/ {0xe8, 1002}, + /*II_D8_00*/ {0xe9, 1023}, + /*II_D8_01*/ {0xe9, 1029}, + /*II_D8_02*/ {0xe9, 1035}, + /*II_D8_03*/ {0xe9, 1041}, + /*II_D8_04*/ {0xe9, 1048}, + /*II_D8_05*/ {0xe9, 1054}, + /*II_D8_06*/ {0xe9, 1061}, + /*II_D8_07*/ {0xe9, 1067}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C0*/ {0xea, 1023}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_C8*/ {0xea, 1029}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D0*/ {0xeb, 1035}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D9*/ {0xec, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_D8*/ {0xeb, 1041}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E0*/ {0xea, 1048}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_E8*/ {0xea, 1054}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F0*/ {0xea, 1061}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D8_F8*/ {0xea, 1067}, + /*II_D9_00*/ {0xe9, 1074}, + /*II_D9_02*/ {0xed, 1079}, + /*II_D9_03*/ {0xed, 1084}, + /*II_D9_04*/ {0xee, 1090}, + /*II_D9_05*/ {0xef, 1098}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C0*/ {0xeb, 1074}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C9*/ {0xec, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_C8*/ {0xeb, 1105}, + /*II_D9_D0*/ {0xec, 1111}, + /*II_D9_E0*/ {0xec, 1117}, + /*II_D9_E1*/ {0xec, 1123}, + /*II_D9_E4*/ {0xec, 1129}, + /*II_D9_E5*/ {0xec, 1135}, + /*II_D9_E8*/ {0xec, 1141}, + /*II_D9_E9*/ {0xec, 1147}, + /*II_D9_EA*/ {0xec, 1155}, + /*II_D9_EB*/ {0xec, 1163}, + /*II_D9_EC*/ {0xec, 1170}, + /*II_D9_ED*/ {0xec, 1178}, + /*II_D9_EE*/ {0xec, 1186}, + /*II_D9_F0*/ {0xec, 1192}, + /*II_D9_F1*/ {0xec, 1199}, + /*II_D9_F2*/ {0xec, 1206}, + /*II_D9_F3*/ {0xec, 1213}, + /*II_D9_F4*/ {0xec, 1221}, + /*II_D9_F5*/ {0xec, 1230}, + /*II_D9_F6*/ {0xec, 1238}, + /*II_D9_F7*/ {0xec, 1247}, + /*II_D9_F8*/ {0xec, 1256}, + /*II_D9_F9*/ {0xec, 1263}, + /*II_D9_FA*/ {0xec, 1272}, + /*II_D9_FB*/ {0xec, 1279}, + /*II_D9_FC*/ {0xec, 1288}, + /*II_D9_FD*/ {0xec, 1297}, + /*II_D9_FE*/ {0xec, 1305}, + /*II_D9_FF*/ {0xec, 1311}, + /*II_DA_00*/ {0xe9, 1317}, + /*II_DA_01*/ {0xe9, 1324}, + /*II_DA_02*/ {0xe9, 1331}, + /*II_DA_03*/ {0xe9, 1338}, + /*II_DA_04*/ {0xe9, 1346}, + /*II_DA_05*/ {0xe9, 1353}, + /*II_DA_06*/ {0xe9, 1361}, + /*II_DA_07*/ {0xe9, 1368}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C0*/ {0xf0, 1376}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_C8*/ {0xf1, 1384}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D0*/ {0xf2, 1392}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_D8*/ {0xf3, 1401}, + /*II_DA_E9*/ {0xec, 1409}, + /*II_DB_00*/ {0xe9, 1418}, + /*II_DB_01*/ {0xf4, 1424}, + /*II_DB_02*/ {0xed, 1432}, + /*II_DB_03*/ {0xed, 1438}, + /*II_DB_05*/ {0xf5, 1074}, + /*II_DB_07*/ {0xf6, 1084}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C0*/ {0xf0, 1445}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_C8*/ {0xf1, 1454}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D0*/ {0xf2, 1463}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_D8*/ {0xf3, 1473}, + /*II_DB_E0*/ {0xec, 1482}, + /*II_DB_E1*/ {0xec, 1488}, + /*II_DB_E4*/ {0xec, 1496}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_E8*/ {0xf7, 1504}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DB_F0*/ {0xf8, 1512}, + /*II_DC_00*/ {0xf9, 1023}, + /*II_DC_01*/ {0xf9, 1029}, + /*II_DC_02*/ {0xf9, 1035}, + /*II_DC_03*/ {0xf9, 1041}, + /*II_DC_04*/ {0xf9, 1048}, + /*II_DC_05*/ {0xf9, 1054}, + /*II_DC_06*/ {0xf9, 1061}, + /*II_DC_07*/ {0xf9, 1067}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C0*/ {0xfa, 1023}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_C8*/ {0xfa, 1029}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E0*/ {0xfa, 1054}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_E8*/ {0xfa, 1048}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F0*/ {0xfa, 1067}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DC_F8*/ {0xfa, 1061}, + /*II_DD_00*/ {0xf9, 1074}, + /*II_DD_01*/ {0xfb, 1424}, + /*II_DD_02*/ {0xfc, 1079}, + /*II_DD_03*/ {0xfc, 1084}, + /*II_DD_04*/ {0xee, 1519}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_C0*/ {0xeb, 1527}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D0*/ {0xeb, 1079}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_D8*/ {0xeb, 1084}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E1*/ {0xec, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E0*/ {0xfa, 1534}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E9*/ {0xec, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DD_E8*/ {0xeb, 1541}, + /*II_DE_00*/ {0xef, 1317}, + /*II_DE_01*/ {0xef, 1324}, + /*II_DE_02*/ {0xef, 1331}, + /*II_DE_03*/ {0xef, 1338}, + /*II_DE_04*/ {0xef, 1346}, + /*II_DE_05*/ {0xef, 1353}, + /*II_DE_06*/ {0xef, 1361}, + /*II_DE_07*/ {0xef, 1368}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C1*/ {0xec, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C0*/ {0xfa, 1549}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C9*/ {0xec, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_C8*/ {0xfa, 1556}, + /*II_DE_D9*/ {0xec, 1563}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E1*/ {0xec, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E0*/ {0xfa, 1571}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E9*/ {0xec, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_E8*/ {0xfa, 1579}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F1*/ {0xec, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F0*/ {0xfa, 1586}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F9*/ {0xec, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DE_F8*/ {0xfa, 1594}, + /*II_DF_00*/ {0xef, 1418}, + /*II_DF_01*/ {0xfd, 1424}, + /*II_DF_02*/ {0xfe, 1432}, + /*II_DF_03*/ {0xfe, 1438}, + /*II_DF_04*/ {0xf5, 1601}, + /*II_DF_05*/ {0xf9, 1418}, + /*II_DF_06*/ {0xf6, 1607}, + /*II_DF_07*/ {0xfc, 1438}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_E8*/ {0xf7, 1614}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_DF_F0*/ {0xf7, 1623}, + /*II_F6_00*/ {0xff, 206}, + /*II_F6_02*/ {0x100, 1631}, + /*II_F6_03*/ {0x101, 1636}, + /*II_F6_04*/ {0x102, 1641}, + /*II_F6_05*/ {0x102, 117}, + /*II_F6_06*/ {0x103, 1646}, + /*II_F6_07*/ {0x103, 1651}, + /*II_F7_00*/ {0x104, 206}, + /*II_F7_02*/ {0x105, 1631}, + /*II_F7_03*/ {0x106, 1636}, + /*II_F7_04*/ {0x107, 1641}, + /*II_F7_05*/ {0x107, 117}, + /*II_F7_06*/ {0x108, 1646}, + /*II_F7_07*/ {0x108, 1651}, + /*II_FE_00*/ {0x109, 81}, + /*II_FE_01*/ {0x109, 86}, + /*II_FF_00*/ {0x10a, 81}, + /*II_FF_01*/ {0x10a, 86}, + /*II_FF_02*/ {0x10b, 456}, + /*II_FF_03*/ {0x10c, 260}, + /*II_FF_04*/ {0x10d, 462}, + /*II_FF_05*/ {0x10e, 467}, + /*II_FF_06*/ {0x10f, 16}, + /*II_0F_00_00*/ {0x110, 1657}, + /*II_0F_00_01*/ {0x111, 1663}, + /*II_0F_00_02*/ {0x112, 1668}, + /*II_0F_00_03*/ {0x113, 1674}, + /*II_0F_00_04*/ {0x114, 1679}, + /*II_0F_00_05*/ {0x114, 1685}, + /*II_0F_01_00*/ {0x115, 1691}, + /*II_0F_01_01*/ {0x115, 1697}, + /*II_0F_01_02*/ {0x116, 1703}, + /*II_0F_01_03*/ {0x116, 1709}, + /*II_0F_01_04*/ {0x117, 1715}, + /*II_0F_01_06*/ {0x118, 1721}, + /*II_0F_01_07*/ {0x119, 1727}, + /*II_0F_01_C1*/ {0x11a, 1735}, + /*II_0F_01_C2*/ {0x11a, 1743}, + /*II_0F_01_C3*/ {0x11a, 1753}, + /*II_0F_01_C4*/ {0x11a, 1763}, + /*II_0F_01_C8*/ {0x11b, 1771}, + /*II_0F_01_C9*/ {0x11b, 1780}, + /*II_0F_01_CA*/ {0x11b, 1787}, + /*II_0F_01_CB*/ {0x11b, 1793}, + /*II_0F_01_D0*/ {0x91, 1799}, + /*II_0F_01_D1*/ {0x91, 1807}, + /*II_0F_01_D4*/ {0x11a, 1815}, + /*II_0F_01_D5*/ {0x11c, 1823}, + /*II_0F_01_D8*/ {0x11d, 1829}, + /*II_0F_01_D9*/ {0x11e, 1836}, + /*II_0F_01_DA*/ {0x11f, 1845}, + /*II_0F_01_DB*/ {0x11f, 1853}, + /*II_0F_01_DC*/ {0x11e, 1861}, + /*II_0F_01_DD*/ {0x11e, 1867}, + /*II_0F_01_DE*/ {0x11f, 1873}, + /*II_0F_01_DF*/ {0x120, 1881}, + /*II_0F_01_F8*/ {0x121, 1890}, + /*II_0F_01_F9*/ {0x121, 1898}, + /*II_0F_0D_00*/ {0x122, 1906}, + /*II_0F_0D_01*/ {0x122, 1916}, + /*II_0F_0F_0C*/ {0x123, 1927}, + /*II_0F_0F_0D*/ {0x124, 1934}, + /*II_0F_0F_1C*/ {0x123, 1941}, + /*II_0F_0F_1D*/ {0x124, 1948}, + /*II_0F_0F_8A*/ {0x123, 1955}, + /*II_0F_0F_8E*/ {0x123, 1963}, + /*II_0F_0F_90*/ {0x124, 1972}, + /*II_0F_0F_94*/ {0x124, 1981}, + /*II_0F_0F_96*/ {0x124, 1988}, + /*II_0F_0F_97*/ {0x124, 1995}, + /*II_0F_0F_9A*/ {0x124, 2004}, + /*II_0F_0F_9E*/ {0x124, 2011}, + /*II_0F_0F_A0*/ {0x124, 2018}, + /*II_0F_0F_A4*/ {0x124, 2027}, + /*II_0F_0F_A6*/ {0x124, 2034}, + /*II_0F_0F_A7*/ {0x124, 2044}, + /*II_0F_0F_AA*/ {0x124, 2054}, + /*II_0F_0F_AE*/ {0x124, 2062}, + /*II_0F_0F_B0*/ {0x124, 2069}, + /*II_0F_0F_B4*/ {0x124, 2078}, + /*II_0F_0F_B6*/ {0x124, 2085}, + /*II_0F_0F_B7*/ {0x124, 2095}, + /*II_0F_0F_BB*/ {0x123, 2104}, + /*II_0F_0F_BF*/ {0x124, 2112}, + /*II_0F_10*/ {0x125, 2121}, + /*II_66_0F_10*/ {0x126, 2129}, + /*II_F3_0F_10*/ {0x127, 2137}, + /*II_F2_0F_10*/ {0x128, 2144}, + /*II_0F_11*/ {0x12d, 2121}, + /*II_66_0F_11*/ {0x12e, 2129}, + /*II_F3_0F_11*/ {0x12f, 2137}, + /*II_F2_0F_11*/ {0x130, 2144}, + /*II_66_0F_12*/ {0x135, 2202}, + /*II_F3_0F_12*/ {0x136, 2210}, + /*II_F2_0F_12*/ {0x136, 2220}, + /*II_0F_13*/ {0x13a, 2194}, + /*II_66_0F_13*/ {0x13b, 2202}, + /*II_0F_14*/ {0x13d, 2278}, + /*II_66_0F_14*/ {0x13e, 2288}, + /*II_0F_15*/ {0x13d, 2320}, + /*II_66_0F_15*/ {0x13e, 2330}, + /*II_66_0F_16*/ {0x135, 2379}, + /*II_F3_0F_16*/ {0x140, 2387}, + /*II_0F_17*/ {0x13a, 2371}, + /*II_66_0F_17*/ {0x13b, 2379}, + /*II_0F_18_00*/ {0x141, 2436}, + /*II_0F_18_01*/ {0x141, 2449}, + /*II_0F_18_02*/ {0x141, 2461}, + /*II_0F_18_03*/ {0x141, 2473}, + /*II_0F_28*/ {0x125, 2485}, + /*II_66_0F_28*/ {0x126, 2493}, + /*II_0F_29*/ {0x12d, 2485}, + /*II_66_0F_29*/ {0x12e, 2493}, + /*II_0F_2A*/ {0x142, 2519}, + /*II_66_0F_2A*/ {0x143, 2529}, + /*II_F3_0F_2A*/ {0x144, 2539}, + /*II_F2_0F_2A*/ {0x145, 2549}, + /*II_0F_2B*/ {0x146, 2581}, + /*II_66_0F_2B*/ {0x147, 2590}, + /*II_F3_0F_2B*/ {0x148, 2599}, + /*II_F2_0F_2B*/ {0x149, 2608}, + /*II_0F_2C*/ {0x14b, 2637}, + /*II_66_0F_2C*/ {0x14c, 2648}, + /*II_F3_0F_2C*/ {0x14d, 2659}, + /*II_F2_0F_2C*/ {0x14e, 2670}, + /*II_0F_2D*/ {0x14b, 2705}, + /*II_66_0F_2D*/ {0x13e, 2715}, + /*II_F3_0F_2D*/ {0x14d, 2725}, + /*II_F2_0F_2D*/ {0x14e, 2735}, + /*II_0F_2E*/ {0x150, 2767}, + /*II_66_0F_2E*/ {0x151, 2776}, + /*II_0F_2F*/ {0x150, 2805}, + /*II_66_0F_2F*/ {0x151, 2813}, + /*II_0F_50*/ {0x154, 2839}, + /*II_66_0F_50*/ {0x155, 2849}, + /*II_0F_51*/ {0x13d, 2881}, + /*II_66_0F_51*/ {0x13e, 2889}, + /*II_F3_0F_51*/ {0x157, 2897}, + /*II_F2_0F_51*/ {0x151, 2905}, + /*II_0F_52*/ {0x13d, 2949}, + /*II_F3_0F_52*/ {0x157, 2958}, + /*II_0F_53*/ {0x13d, 2987}, + /*II_F3_0F_53*/ {0x157, 2994}, + /*II_0F_54*/ {0x13d, 3017}, + /*II_66_0F_54*/ {0x13e, 3024}, + /*II_0F_55*/ {0x13d, 3047}, + /*II_66_0F_55*/ {0x13e, 3055}, + /*II_0F_56*/ {0x13d, 3081}, + /*II_66_0F_56*/ {0x13e, 3087}, + /*II_0F_57*/ {0x13d, 3107}, + /*II_66_0F_57*/ {0x13e, 3114}, + /*II_0F_58*/ {0x13d, 3137}, + /*II_66_0F_58*/ {0x13e, 3144}, + /*II_F3_0F_58*/ {0x157, 3151}, + /*II_F2_0F_58*/ {0x151, 3158}, + /*II_0F_59*/ {0x13d, 3197}, + /*II_66_0F_59*/ {0x13e, 3204}, + /*II_F3_0F_59*/ {0x157, 3211}, + /*II_F2_0F_59*/ {0x151, 3218}, + /*II_0F_5A*/ {0x151, 3257}, + /*II_66_0F_5A*/ {0x13e, 3267}, + /*II_F3_0F_5A*/ {0x158, 3277}, + /*II_F2_0F_5A*/ {0x151, 3287}, + /*II_0F_5B*/ {0x13e, 3341}, + /*II_66_0F_5B*/ {0x13e, 3351}, + /*II_F3_0F_5B*/ {0x13e, 3361}, + /*II_0F_5C*/ {0x13d, 3406}, + /*II_66_0F_5C*/ {0x13e, 3413}, + /*II_F3_0F_5C*/ {0x157, 3420}, + /*II_F2_0F_5C*/ {0x151, 3427}, + /*II_0F_5D*/ {0x13d, 3466}, + /*II_66_0F_5D*/ {0x13e, 3473}, + /*II_F3_0F_5D*/ {0x157, 3480}, + /*II_F2_0F_5D*/ {0x151, 3487}, + /*II_0F_5E*/ {0x13d, 3526}, + /*II_66_0F_5E*/ {0x13e, 3533}, + /*II_F3_0F_5E*/ {0x157, 3540}, + /*II_F2_0F_5E*/ {0x151, 3547}, + /*II_0F_5F*/ {0x13d, 3586}, + /*II_66_0F_5F*/ {0x13e, 3593}, + /*II_F3_0F_5F*/ {0x157, 3600}, + /*II_F2_0F_5F*/ {0x151, 3607}, + /*II_0F_60*/ {0x15b, 3646}, + /*II_66_0F_60*/ {0x13e, 3646}, + /*II_0F_61*/ {0x15b, 3669}, + /*II_66_0F_61*/ {0x13e, 3669}, + /*II_0F_62*/ {0x15b, 3692}, + /*II_66_0F_62*/ {0x13e, 3692}, + /*II_0F_63*/ {0x15c, 3715}, + /*II_66_0F_63*/ {0x13e, 3715}, + /*II_0F_64*/ {0x15c, 3736}, + /*II_66_0F_64*/ {0x13e, 3736}, + /*II_0F_65*/ {0x15c, 3755}, + /*II_66_0F_65*/ {0x13e, 3755}, + /*II_0F_66*/ {0x15c, 3774}, + /*II_66_0F_66*/ {0x13e, 3774}, + /*II_0F_67*/ {0x15c, 3793}, + /*II_66_0F_67*/ {0x13e, 3793}, + /*II_0F_68*/ {0x15c, 3814}, + /*II_66_0F_68*/ {0x13e, 3814}, + /*II_0F_69*/ {0x15c, 3837}, + /*II_66_0F_69*/ {0x13e, 3837}, + /*II_0F_6A*/ {0x15c, 3860}, + /*II_66_0F_6A*/ {0x13e, 3860}, + /*II_0F_6B*/ {0x15c, 3883}, + /*II_66_0F_6B*/ {0x13e, 3883}, + /*II_66_0F_6C*/ {0x13e, 3904}, + /*II_66_0F_6D*/ {0x13e, 3929}, + /*II_0F_6F*/ {0x160, 3960}, + /*II_66_0F_6F*/ {0x126, 3980}, + /*II_F3_0F_6F*/ {0x126, 3988}, + /*II_0F_74*/ {0x15c, 4077}, + /*II_66_0F_74*/ {0x13e, 4077}, + /*II_0F_75*/ {0x15c, 4096}, + /*II_66_0F_75*/ {0x13e, 4096}, + /*II_0F_76*/ {0x15c, 4115}, + /*II_66_0F_76*/ {0x13e, 4115}, + /*II_0F_77*/ {0x164, 4134}, + /*II_0F_78*/ {0x166, 4162}, + /*II_0F_79*/ {0x169, 4186}, + /*II_66_0F_79*/ {0x16a, 4170}, + /*II_F2_0F_79*/ {0x16b, 4177}, + /*II_0F_7A_30*/ {0x16c, 4195}, + /*II_0F_7A_31*/ {0x16d, 4205}, + /*II_66_0F_7C*/ {0x16e, 4215}, + /*II_F2_0F_7C*/ {0x16e, 4223}, + /*II_66_0F_7D*/ {0x16e, 4249}, + /*II_F2_0F_7D*/ {0x16e, 4257}, + /*II_F3_0F_7E*/ {0x128, 3960}, + /*II_0F_7F*/ {0x172, 3960}, + /*II_66_0F_7F*/ {0x12e, 3980}, + /*II_F3_0F_7F*/ {0x12e, 3988}, + /*II_F3_0F_B8*/ {0x176, 4372}, + /*II_0F_BA_04*/ {0x177, 872}, + /*II_0F_BA_05*/ {0x178, 887}, + /*II_0F_BA_06*/ {0x178, 912}, + /*II_0F_BA_07*/ {0x178, 934}, + /*II_0F_BC*/ {0x179, 4380}, + /*II_F3_0F_BC*/ {0x17a, 4385}, + /*II_0F_BD*/ {0x179, 4392}, + /*II_F3_0F_BD*/ {0x17b, 4397}, + /*II_0F_C7_07*/ {0x18b, 6419}, + /*II_66_0F_D0*/ {0x16e, 6428}, + /*II_F2_0F_D0*/ {0x16e, 6438}, + /*II_0F_D1*/ {0x15c, 6470}, + /*II_66_0F_D1*/ {0x13e, 6470}, + /*II_0F_D2*/ {0x15c, 6485}, + /*II_66_0F_D2*/ {0x13e, 6485}, + /*II_0F_D3*/ {0x15c, 6500}, + /*II_66_0F_D3*/ {0x13e, 6500}, + /*II_0F_D4*/ {0x151, 6515}, + /*II_66_0F_D4*/ {0x13e, 6515}, + /*II_0F_D5*/ {0x15c, 6530}, + /*II_66_0F_D5*/ {0x13e, 6530}, + /*II_66_0F_D6*/ {0x130, 3960}, + /*II_F3_0F_D6*/ {0x18c, 6547}, + /*II_F2_0F_D6*/ {0x18d, 6556}, + /*II_0F_D7*/ {0x18f, 6565}, + /*II_66_0F_D7*/ {0x190, 6565}, + /*II_0F_D8*/ {0x15c, 6586}, + /*II_66_0F_D8*/ {0x13e, 6586}, + /*II_0F_D9*/ {0x15c, 6605}, + /*II_66_0F_D9*/ {0x13e, 6605}, + /*II_0F_DA*/ {0x192, 6624}, + /*II_66_0F_DA*/ {0x13e, 6624}, + /*II_0F_DB*/ {0x15c, 6641}, + /*II_66_0F_DB*/ {0x13e, 6641}, + /*II_0F_DC*/ {0x15c, 6654}, + /*II_66_0F_DC*/ {0x13e, 6654}, + /*II_0F_DD*/ {0x15c, 6673}, + /*II_66_0F_DD*/ {0x13e, 6673}, + /*II_0F_DE*/ {0x192, 6682}, + /*II_66_0F_DE*/ {0x13e, 6682}, + /*II_0F_DF*/ {0x15c, 6699}, + /*II_66_0F_DF*/ {0x13e, 6699}, + /*II_0F_E0*/ {0x192, 6714}, + /*II_66_0F_E0*/ {0x13e, 6714}, + /*II_0F_E1*/ {0x15c, 6729}, + /*II_66_0F_E1*/ {0x13e, 6729}, + /*II_0F_E2*/ {0x15c, 6744}, + /*II_66_0F_E2*/ {0x13e, 6744}, + /*II_0F_E3*/ {0x192, 6759}, + /*II_66_0F_E3*/ {0x13e, 6759}, + /*II_0F_E4*/ {0x192, 6774}, + /*II_66_0F_E4*/ {0x13e, 6774}, + /*II_0F_E5*/ {0x15c, 6793}, + /*II_66_0F_E5*/ {0x13e, 6793}, + /*II_66_0F_E6*/ {0x13e, 6810}, + /*II_F3_0F_E6*/ {0x151, 6821}, + /*II_F2_0F_E6*/ {0x13e, 6831}, + /*II_0F_E7*/ {0x193, 6875}, + /*II_66_0F_E7*/ {0x147, 6883}, + /*II_0F_E8*/ {0x15c, 6902}, + /*II_66_0F_E8*/ {0x13e, 6902}, + /*II_0F_E9*/ {0x15c, 6919}, + /*II_66_0F_E9*/ {0x13e, 6919}, + /*II_0F_EA*/ {0x192, 6936}, + /*II_66_0F_EA*/ {0x13e, 6936}, + /*II_0F_EB*/ {0x15c, 6953}, + /*II_66_0F_EB*/ {0x13e, 6953}, + /*II_0F_EC*/ {0x15c, 6964}, + /*II_66_0F_EC*/ {0x13e, 6964}, + /*II_0F_ED*/ {0x15c, 6981}, + /*II_66_0F_ED*/ {0x13e, 6981}, + /*II_0F_EE*/ {0x192, 6998}, + /*II_66_0F_EE*/ {0x13e, 6998}, + /*II_0F_EF*/ {0x15c, 7015}, + /*II_66_0F_EF*/ {0x13e, 7015}, + /*II_F2_0F_F0*/ {0x194, 7028}, + /*II_0F_F1*/ {0x15c, 7043}, + /*II_66_0F_F1*/ {0x13e, 7043}, + /*II_0F_F2*/ {0x15c, 7058}, + /*II_66_0F_F2*/ {0x13e, 7058}, + /*II_0F_F3*/ {0x15c, 7073}, + /*II_66_0F_F3*/ {0x13e, 7073}, + /*II_0F_F4*/ {0x196, 7088}, + /*II_66_0F_F4*/ {0x13e, 7088}, + /*II_0F_F5*/ {0x15c, 7107}, + /*II_66_0F_F5*/ {0x13e, 7107}, + /*II_0F_F6*/ {0x192, 7126}, + /*II_66_0F_F6*/ {0x13e, 7126}, + /*II_0F_F7*/ {0x197, 7143}, + /*II_66_0F_F7*/ {0x198, 7153}, + /*II_0F_F8*/ {0x15c, 7178}, + /*II_66_0F_F8*/ {0x13e, 7178}, + /*II_0F_F9*/ {0x15c, 7193}, + /*II_66_0F_F9*/ {0x13e, 7193}, + /*II_0F_FA*/ {0x15c, 7208}, + /*II_66_0F_FA*/ {0x13e, 7208}, + /*II_0F_FB*/ {0x196, 7223}, + /*II_66_0F_FB*/ {0x13e, 7223}, + /*II_0F_FC*/ {0x15c, 7238}, + /*II_66_0F_FC*/ {0x13e, 7238}, + /*II_0F_FD*/ {0x15c, 7253}, + /*II_66_0F_FD*/ {0x13e, 7253}, + /*II_0F_FE*/ {0x15c, 7268}, + /*II_66_0F_FE*/ {0x13e, 7268}, + /*II_D9_06*/ {0x19a, 7283}, + /*II_9B_D9_06*/ {0x19b, 7292}, + /*II_D9_07*/ {0xfe, 7300}, + /*II_9B_D9_07*/ {0x19c, 7308}, + /*II_DB_E2*/ {0xec, 7315}, + /*II_9B_DB_E2*/ {0x19d, 7323}, + /*II_DB_E3*/ {0xec, 7330}, + /*II_9B_DB_E3*/ {0x19d, 7338}, + /*II_DD_06*/ {0x19a, 7345}, + /*II_9B_DD_06*/ {0x19b, 7353}, + /*II_DD_07*/ {0xfe, 7360}, + /*II_9B_DD_07*/ {0x19c, 7368}, + /*II_DF_E0*/ {0x19e, 7360}, + /*II_9B_DF_E0*/ {0x19f, 7368}, + /*II_0F_38_00*/ {0x1a0, 7375}, + /*II_66_0F_38_00*/ {0x1a1, 7375}, + /*II_0F_38_01*/ {0x1a0, 7392}, + /*II_66_0F_38_01*/ {0x1a1, 7392}, + /*II_0F_38_02*/ {0x1a0, 7409}, + /*II_66_0F_38_02*/ {0x1a1, 7409}, + /*II_0F_38_03*/ {0x1a0, 7426}, + /*II_66_0F_38_03*/ {0x1a1, 7426}, + /*II_0F_38_04*/ {0x1a0, 7445}, + /*II_66_0F_38_04*/ {0x1a1, 7445}, + /*II_0F_38_05*/ {0x1a0, 7468}, + /*II_66_0F_38_05*/ {0x1a1, 7468}, + /*II_0F_38_06*/ {0x1a0, 7485}, + /*II_66_0F_38_06*/ {0x1a1, 7485}, + /*II_0F_38_07*/ {0x1a0, 7502}, + /*II_66_0F_38_07*/ {0x1a1, 7502}, + /*II_0F_38_08*/ {0x1a0, 7521}, + /*II_66_0F_38_08*/ {0x1a1, 7521}, + /*II_0F_38_09*/ {0x1a0, 7538}, + /*II_66_0F_38_09*/ {0x1a1, 7538}, + /*II_0F_38_0A*/ {0x1a0, 7555}, + /*II_66_0F_38_0A*/ {0x1a1, 7555}, + /*II_0F_38_0B*/ {0x1a0, 7572}, + /*II_66_0F_38_0B*/ {0x1a1, 7572}, + /*II_66_0F_38_17*/ {0x1a3, 7663}, + /*II_0F_38_1C*/ {0x1a0, 7722}, + /*II_66_0F_38_1C*/ {0x1a1, 7722}, + /*II_0F_38_1D*/ {0x1a0, 7737}, + /*II_66_0F_38_1D*/ {0x1a1, 7737}, + /*II_0F_38_1E*/ {0x1a0, 7752}, + /*II_66_0F_38_1E*/ {0x1a1, 7752}, + /*II_66_0F_38_20*/ {0x1a8, 7767}, + /*II_66_0F_38_21*/ {0x1a9, 7788}, + /*II_66_0F_38_22*/ {0x1aa, 7809}, + /*II_66_0F_38_23*/ {0x1a8, 7830}, + /*II_66_0F_38_24*/ {0x1a9, 7851}, + /*II_66_0F_38_25*/ {0x1a8, 7872}, + /*II_66_0F_38_28*/ {0x1ac, 7893}, + /*II_66_0F_38_29*/ {0x1ac, 7910}, + /*II_66_0F_38_2A*/ {0x1ad, 7929}, + /*II_66_0F_38_2B*/ {0x1ac, 7950}, + /*II_66_0F_38_30*/ {0x1a8, 7995}, + /*II_66_0F_38_31*/ {0x1a9, 8016}, + /*II_66_0F_38_32*/ {0x1aa, 8037}, + /*II_66_0F_38_33*/ {0x1a8, 8058}, + /*II_66_0F_38_34*/ {0x1a9, 8079}, + /*II_66_0F_38_35*/ {0x1a8, 8100}, + /*II_66_0F_38_37*/ {0x1a3, 8121}, + /*II_66_0F_38_38*/ {0x1ac, 8140}, + /*II_66_0F_38_39*/ {0x1ac, 8157}, + /*II_66_0F_38_3A*/ {0x1ac, 8174}, + /*II_66_0F_38_3B*/ {0x1ac, 8191}, + /*II_66_0F_38_3C*/ {0x1ac, 8208}, + /*II_66_0F_38_3D*/ {0x1ac, 8225}, + /*II_66_0F_38_3E*/ {0x1ac, 8242}, + /*II_66_0F_38_3F*/ {0x1ac, 8259}, + /*II_66_0F_38_40*/ {0x1ac, 8276}, + /*II_66_0F_38_41*/ {0x1ac, 8293}, + /*II_66_0F_38_80*/ {0x1b0, 8318}, + /*II_66_0F_38_81*/ {0x1b0, 8326}, + /*II_66_0F_38_82*/ {0x1b0, 8335}, + /*II_66_0F_38_DB*/ {0x1b3, 9184}, + /*II_66_0F_38_DC*/ {0x1b3, 9201}, + /*II_66_0F_38_DD*/ {0x1b3, 9218}, + /*II_66_0F_38_DE*/ {0x1b3, 9243}, + /*II_66_0F_38_DF*/ {0x1b3, 9260}, + /*II_0F_38_F0*/ {0x1b6, 9285}, + /*II_F2_0F_38_F0*/ {0x1b7, 9292}, + /*II_0F_38_F1*/ {0x1b8, 9285}, + /*II_F2_0F_38_F1*/ {0x1b9, 9292}, + /*II_0F_71_02*/ {0x1d0, 6470}, + /*II_66_0F_71_02*/ {0x1d1, 6470}, + /*II_0F_71_04*/ {0x1d0, 6729}, + /*II_66_0F_71_04*/ {0x1d1, 6729}, + /*II_0F_71_06*/ {0x1d0, 7043}, + /*II_66_0F_71_06*/ {0x1d1, 7043}, + /*II_0F_72_02*/ {0x1d0, 6485}, + /*II_66_0F_72_02*/ {0x1d1, 6485}, + /*II_0F_72_04*/ {0x1d0, 6744}, + /*II_66_0F_72_04*/ {0x1d1, 6744}, + /*II_0F_72_06*/ {0x1d0, 7058}, + /*II_66_0F_72_06*/ {0x1d1, 7058}, + /*II_0F_73_02*/ {0x1d0, 6500}, + /*II_66_0F_73_02*/ {0x1d1, 6500}, + /*II_66_0F_73_03*/ {0x1d1, 9864}, + /*II_0F_73_06*/ {0x1d0, 7073}, + /*II_66_0F_73_06*/ {0x1d1, 7073}, + /*II_66_0F_73_07*/ {0x1d1, 9881}, + /*II_F3_0F_AE_00*/ {0x1d3, 9916}, + /*II_F3_0F_AE_01*/ {0x1d3, 9946}, + /*II_0F_AE_02*/ {0x1d4, 9956}, + /*II_F3_0F_AE_02*/ {0x1d3, 9965}, + /*II_0F_AE_03*/ {0x1d4, 9985}, + /*II_F3_0F_AE_03*/ {0x1d3, 9994}, + /*II_0F_C7_06*/ {0x1d6, 10014}, + /*II_66_0F_C7_06*/ {0x18b, 10023}, + /*II_F3_0F_C7_06*/ {0x18b, 10032} }; _InstInfoEx InstInfosEx[381] = { @@ -1389,382 +1391,382 @@ _InstInfoEx InstInfosEx[381] = { /*II_98*/ {{0x4e, 228}, 0x0, 0, 0, 233, 239}, /*II_99*/ {{0x4e, 245}, 0x0, 0, 0, 250, 255}, /*II_E3*/ {{0x76, 427}, 0x0, 0, 0, 433, 440}, - /*II_0F_A4*/ {{0xac, 876}, 0x0, 1, 0, 0, 0}, - /*II_0F_A5*/ {{0xac, 876}, 0x0, 52, 0, 0, 0}, - /*II_0F_AC*/ {{0xac, 892}, 0x0, 1, 0, 0, 0}, - /*II_0F_AD*/ {{0xac, 892}, 0x0, 52, 0, 0, 0}, - /*II_V_0F_10*/ {{0x126, 2139}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_10*/ {{0x126, 2148}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_10*/ {{0x127, 2157}, 0x20, 69, 0, 0, 0}, - /*II_V_F2_0F_10*/ {{0x127, 2165}, 0x20, 69, 0, 0, 0}, - /*II_VRR_F3_0F_10*/ {{0x128, 2157}, 0x60, 0, 0, 0, 0}, - /*II_VRR_F2_0F_10*/ {{0x129, 2165}, 0x60, 0, 0, 0, 0}, - /*II_V_0F_11*/ {{0x12e, 2139}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_11*/ {{0x12e, 2148}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_11*/ {{0x127, 2157}, 0x20, 69, 0, 0, 0}, - /*II_V_F2_0F_11*/ {{0x127, 2165}, 0x20, 69, 0, 0, 0}, - /*II_VRR_F3_0F_11*/ {{0x12f, 2157}, 0x60, 0, 0, 0, 0}, - /*II_VRR_F2_0F_11*/ {{0x130, 2165}, 0x60, 0, 0, 0, 0}, - /*II_0F_12*/ {{0x131, 2173}, 0x0, 0, 0, 2182, 0}, - /*II_V_0F_12*/ {{0x134, 2217}, 0x0, 72, 0, 2227, 0}, - /*II_V_66_0F_12*/ {{0x135, 2236}, 0x0, 46, 0, 0, 0}, - /*II_V_F3_0F_12*/ {{0x126, 2245}, 0x41, 0, 0, 0, 0}, - /*II_V_F2_0F_12*/ {{0x136, 2256}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_13*/ {{0x139, 2227}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_13*/ {{0x139, 2236}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_14*/ {{0x13c, 2286}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_14*/ {{0x13c, 2297}, 0x1, 90, 0, 0, 0}, - /*II_V_0F_15*/ {{0x13c, 2328}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_15*/ {{0x13c, 2339}, 0x1, 90, 0, 0, 0}, - /*II_0F_16*/ {{0x131, 2350}, 0x0, 0, 0, 2359, 0}, - /*II_V_0F_16*/ {{0x134, 2385}, 0x0, 72, 0, 2395, 0}, - /*II_V_66_0F_16*/ {{0x135, 2404}, 0x0, 46, 0, 0, 0}, - /*II_V_F3_0F_16*/ {{0x126, 2413}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_17*/ {{0x139, 2395}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_17*/ {{0x139, 2404}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_28*/ {{0x126, 2489}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_28*/ {{0x126, 2498}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_29*/ {{0x12e, 2489}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_29*/ {{0x12e, 2498}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_2A*/ {{0x135, 2547}, 0x2, 79, 0, 0, 0}, - /*II_V_F2_0F_2A*/ {{0x135, 2558}, 0x2, 79, 0, 0, 0}, - /*II_V_0F_2B*/ {{0x147, 2605}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_2B*/ {{0x147, 2615}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_2C*/ {{0x14c, 2669}, 0x42, 0, 0, 0, 0}, - /*II_V_F2_0F_2C*/ {{0x14c, 2681}, 0x42, 0, 0, 0, 0}, - /*II_V_F3_0F_2D*/ {{0x14c, 2733}, 0x42, 0, 0, 0, 0}, - /*II_V_F2_0F_2D*/ {{0x14c, 2744}, 0x42, 0, 0, 0, 0}, - /*II_V_0F_2E*/ {{0x14f, 2773}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_2E*/ {{0x150, 2783}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_2F*/ {{0x14f, 2809}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_2F*/ {{0x150, 2818}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_50*/ {{0x153, 2847}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_50*/ {{0x153, 2858}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_51*/ {{0x126, 2901}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_51*/ {{0x126, 2910}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_51*/ {{0x135, 2919}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_51*/ {{0x135, 2928}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_52*/ {{0x126, 2955}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_52*/ {{0x135, 2965}, 0x0, 71, 0, 0, 0}, - /*II_V_0F_53*/ {{0x126, 2989}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_53*/ {{0x135, 2997}, 0x0, 71, 0, 0, 0}, - /*II_V_0F_54*/ {{0x13c, 3019}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_54*/ {{0x13c, 3027}, 0x1, 90, 0, 0, 0}, - /*II_V_0F_55*/ {{0x13c, 3051}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_55*/ {{0x13c, 3060}, 0x1, 90, 0, 0, 0}, - /*II_V_0F_56*/ {{0x13c, 3081}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_56*/ {{0x13c, 3088}, 0x1, 90, 0, 0, 0}, - /*II_V_0F_57*/ {{0x13c, 3109}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_57*/ {{0x13c, 3117}, 0x1, 90, 0, 0, 0}, - /*II_V_0F_58*/ {{0x13c, 3153}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_58*/ {{0x13c, 3161}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_58*/ {{0x135, 3169}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_58*/ {{0x135, 3177}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_59*/ {{0x13c, 3213}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_59*/ {{0x13c, 3221}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_59*/ {{0x135, 3229}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_59*/ {{0x135, 3237}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_5A*/ {{0x156, 3285}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_5A*/ {{0x157, 3296}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_5A*/ {{0x135, 3307}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_5A*/ {{0x135, 3318}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_5B*/ {{0x126, 3360}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_5B*/ {{0x126, 3371}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_5B*/ {{0x126, 3382}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_5C*/ {{0x13c, 3422}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_5C*/ {{0x13c, 3430}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_5C*/ {{0x135, 3438}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_5C*/ {{0x135, 3446}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_5D*/ {{0x13c, 3482}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_5D*/ {{0x13c, 3490}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_5D*/ {{0x135, 3498}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_5D*/ {{0x135, 3506}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_5E*/ {{0x13c, 3542}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_5E*/ {{0x13c, 3550}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_5E*/ {{0x135, 3558}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_5E*/ {{0x135, 3566}, 0x0, 72, 0, 0, 0}, - /*II_V_0F_5F*/ {{0x13c, 3602}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_5F*/ {{0x13c, 3610}, 0x1, 90, 0, 0, 0}, - /*II_V_F3_0F_5F*/ {{0x135, 3618}, 0x0, 71, 0, 0, 0}, - /*II_V_F2_0F_5F*/ {{0x135, 3626}, 0x0, 72, 0, 0, 0}, - /*II_V_66_0F_60*/ {{0x135, 3645}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_61*/ {{0x135, 3668}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_62*/ {{0x135, 3691}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_63*/ {{0x135, 3713}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_64*/ {{0x135, 3733}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_65*/ {{0x135, 3752}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_66*/ {{0x135, 3771}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_67*/ {{0x135, 3791}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_68*/ {{0x135, 3813}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_69*/ {{0x135, 3836}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_6A*/ {{0x135, 3859}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_6B*/ {{0x135, 3881}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_6C*/ {{0x135, 3904}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_6D*/ {{0x135, 3929}, 0x0, 73, 0, 0, 0}, - /*II_0F_6E*/ {{0x15a, 3942}, 0x0, 0, 0, 0, 3948}, - /*II_66_0F_6E*/ {{0x15b, 3942}, 0x0, 0, 0, 0, 3948}, - /*II_V_66_0F_6E*/ {{0x15c, 3954}, 0x46, 0, 0, 3961, 0}, - /*II_V_66_0F_6F*/ {{0x126, 3984}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_6F*/ {{0x126, 3993}, 0x41, 0, 0, 0, 0}, - /*II_0F_70*/ {{0x15e, 4002}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_70*/ {{0x15f, 4010}, 0x0, 1, 0, 0, 0}, - /*II_F3_0F_70*/ {{0x15f, 4018}, 0x0, 1, 0, 0, 0}, - /*II_F2_0F_70*/ {{0x15f, 4027}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_70*/ {{0x160, 4036}, 0x40, 1, 0, 0, 0}, - /*II_V_F3_0F_70*/ {{0x160, 4045}, 0x40, 1, 0, 0, 0}, - /*II_V_F2_0F_70*/ {{0x160, 4055}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_74*/ {{0x135, 4074}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_75*/ {{0x135, 4093}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_76*/ {{0x135, 4112}, 0x0, 73, 0, 0, 0}, - /*II_V_0F_77*/ {{0x162, 4128}, 0x49, 0, 0, 4140, 0}, - /*II_66_0F_78*/ {{0x164, 4158}, 0x0, 8, 0, 0, 0}, - /*II_F2_0F_78*/ {{0x165, 4165}, 0x0, 7, 8, 0, 0}, - /*II_V_66_0F_7C*/ {{0x13c, 4219}, 0x1, 90, 0, 0, 0}, - /*II_V_F2_0F_7C*/ {{0x13c, 4228}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_7D*/ {{0x13c, 4253}, 0x1, 90, 0, 0, 0}, - /*II_V_F2_0F_7D*/ {{0x13c, 4262}, 0x1, 90, 0, 0, 0}, - /*II_0F_7E*/ {{0x16c, 3942}, 0x0, 0, 0, 0, 3948}, - /*II_66_0F_7E*/ {{0x16d, 3942}, 0x0, 0, 0, 0, 3948}, - /*II_V_66_0F_7E*/ {{0x16e, 3954}, 0x46, 0, 0, 3961, 0}, - /*II_V_F3_0F_7E*/ {{0x150, 3961}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_7F*/ {{0x12e, 3984}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_7F*/ {{0x12e, 3993}, 0x41, 0, 0, 0, 0}, - /*II_0F_AE_04*/ {{0x170, 4271}, 0x0, 0, 0, 0, 4278}, - /*II_0F_AE_05*/ {{0x171, 4287}, 0x0, 0, 0, 4295, 4303}, - /*II_0F_AE_06*/ {{0x171, 4313}, 0x0, 0, 0, 4321, 4331}, - /*II_0F_AE_07*/ {{0x172, 4343}, 0x0, 0, 0, 4351, 0}, - /*II_0F_C2*/ {{0x179, 4392}, 0x0, 0, 0, 4401, 4410}, - /*II_66_0F_C2*/ {{0x17a, 4471}, 0x0, 0, 0, 4480, 4489}, - /*II_F3_0F_C2*/ {{0x17b, 4550}, 0x0, 0, 0, 4559, 4568}, - /*II_F2_0F_C2*/ {{0x17c, 4629}, 0x0, 0, 0, 4638, 4647}, - /*II_V_0F_C2*/ {{0x17d, 4708}, 0x1, 90, 0, 4718, 4728}, - /*II_V_66_0F_C2*/ {{0x17d, 5110}, 0x1, 90, 0, 5120, 5130}, - /*II_V_F3_0F_C2*/ {{0x17e, 5512}, 0x0, 71, 0, 5522, 5532}, - /*II_V_F2_0F_C2*/ {{0x17e, 5914}, 0x0, 72, 0, 5924, 5934}, - /*II_0F_C4*/ {{0x17f, 6316}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C4*/ {{0x180, 6316}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_C4*/ {{0x181, 6324}, 0x0, 25, 1, 0, 0}, - /*II_0F_C5*/ {{0x182, 6333}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C5*/ {{0x183, 6333}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_C5*/ {{0x184, 6341}, 0x40, 1, 0, 0, 0}, - /*II_0F_C6*/ {{0x185, 6350}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C6*/ {{0x15f, 6358}, 0x0, 1, 0, 0, 0}, - /*II_V_0F_C6*/ {{0x186, 6366}, 0x1, 90, 1, 0, 0}, - /*II_V_66_0F_C6*/ {{0x186, 6375}, 0x1, 90, 1, 0, 0}, - /*II_0F_C7_01*/ {{0x187, 6384}, 0x0, 0, 0, 0, 6395}, - /*II_V_66_0F_D0*/ {{0x13c, 6436}, 0x1, 90, 0, 0, 0}, - /*II_V_F2_0F_D0*/ {{0x13c, 6447}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_D1*/ {{0x135, 6465}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D2*/ {{0x135, 6480}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D3*/ {{0x135, 6495}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D4*/ {{0x135, 6510}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D5*/ {{0x135, 6526}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D6*/ {{0x18b, 3961}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_D7*/ {{0x18e, 6563}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_D8*/ {{0x135, 6583}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_D9*/ {{0x135, 6602}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DA*/ {{0x135, 6620}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DB*/ {{0x135, 6635}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DC*/ {{0x135, 6651}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DD*/ {{0x135, 6651}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DE*/ {{0x135, 6678}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_DF*/ {{0x135, 6694}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E0*/ {{0x135, 6709}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E1*/ {{0x135, 6724}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E2*/ {{0x135, 6739}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E3*/ {{0x135, 6754}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E4*/ {{0x135, 6771}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E5*/ {{0x135, 6789}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E6*/ {{0x157, 6829}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_E6*/ {{0x156, 6841}, 0x41, 0, 0, 0, 0}, - /*II_V_F2_0F_E6*/ {{0x157, 6852}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_E7*/ {{0x147, 6880}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_E8*/ {{0x135, 6898}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_E9*/ {{0x135, 6915}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_EA*/ {{0x135, 6932}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_EB*/ {{0x135, 6946}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_EC*/ {{0x135, 6960}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_ED*/ {{0x135, 6977}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_EE*/ {{0x135, 6994}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_EF*/ {{0x135, 7009}, 0x0, 73, 0, 0, 0}, - /*II_V_F2_0F_F0*/ {{0x192, 7023}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_F1*/ {{0x135, 7038}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F2*/ {{0x135, 7053}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F3*/ {{0x135, 7068}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F4*/ {{0x135, 7085}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F5*/ {{0x135, 7104}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F6*/ {{0x135, 7122}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F7*/ {{0x196, 7153}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_F8*/ {{0x135, 7173}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_F9*/ {{0x135, 7188}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_FA*/ {{0x135, 7203}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_FB*/ {{0x135, 7218}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_FC*/ {{0x135, 7233}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_FD*/ {{0x135, 7248}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_FE*/ {{0x135, 7263}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_00*/ {{0x135, 7371}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_01*/ {{0x135, 7388}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_02*/ {{0x135, 7405}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_03*/ {{0x135, 7423}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_04*/ {{0x135, 7444}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_05*/ {{0x135, 7464}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_06*/ {{0x135, 7481}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_07*/ {{0x135, 7499}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_08*/ {{0x135, 7517}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_09*/ {{0x135, 7534}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_0A*/ {{0x135, 7551}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_0B*/ {{0x135, 7570}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_0C*/ {{0x13c, 7581}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_38_0D*/ {{0x13c, 7592}, 0x1, 90, 0, 0, 0}, - /*II_V_66_0F_38_0E*/ {{0x126, 7603}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_0F*/ {{0x126, 7612}, 0x41, 0, 0, 0, 0}, - /*II_66_0F_38_10*/ {{0x19f, 7621}, 0x0, 74, 0, 0, 0}, - /*II_66_0F_38_14*/ {{0x19f, 7631}, 0x0, 74, 0, 0, 0}, - /*II_66_0F_38_15*/ {{0x19f, 7641}, 0x0, 74, 0, 0, 0}, - /*II_V_66_0F_38_17*/ {{0x126, 7658}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_18*/ {{0x1a1, 7666}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_19*/ {{0x1a2, 7680}, 0x50, 0, 0, 0, 0}, - /*II_V_66_0F_38_1A*/ {{0x1a3, 7694}, 0x50, 0, 0, 0, 0}, - /*II_V_66_0F_38_1C*/ {{0x1a4, 7717}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_1D*/ {{0x1a4, 7732}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_1E*/ {{0x1a4, 7747}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_20*/ {{0x150, 7765}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_21*/ {{0x14f, 7786}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_22*/ {{0x1a8, 7807}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_23*/ {{0x150, 7828}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_24*/ {{0x14f, 7849}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_25*/ {{0x150, 7870}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_28*/ {{0x135, 7889}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_29*/ {{0x135, 7907}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_2A*/ {{0x1ab, 7927}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_2B*/ {{0x135, 7948}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_2C*/ {{0x13c, 7959}, 0x1, 92, 0, 0, 0}, - /*II_V_66_0F_38_2D*/ {{0x13c, 7971}, 0x1, 92, 0, 0, 0}, - /*II_V_66_0F_38_2E*/ {{0x1ac, 7959}, 0x1, 83, 0, 0, 0}, - /*II_V_66_0F_38_2F*/ {{0x1ac, 7971}, 0x1, 83, 0, 0, 0}, - /*II_V_66_0F_38_30*/ {{0x150, 7993}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_31*/ {{0x14f, 8014}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_32*/ {{0x1a8, 8035}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_33*/ {{0x150, 8056}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_34*/ {{0x14f, 8077}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_35*/ {{0x150, 8098}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_37*/ {{0x135, 8118}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_38*/ {{0x135, 8136}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_39*/ {{0x135, 8153}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3A*/ {{0x135, 8170}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3B*/ {{0x135, 8187}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3C*/ {{0x135, 8204}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3D*/ {{0x135, 8221}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3E*/ {{0x135, 8238}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_3F*/ {{0x135, 8255}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_40*/ {{0x135, 8272}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_41*/ {{0x1a4, 8293}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_96*/ {{0x1ae, 8332}, 0x7, 90, 0, 8348, 0}, - /*II_V_66_0F_38_97*/ {{0x1ae, 8364}, 0x7, 90, 0, 8380, 0}, - /*II_V_66_0F_38_98*/ {{0x1ae, 8396}, 0x7, 90, 0, 8409, 0}, - /*II_V_66_0F_38_99*/ {{0x1af, 8422}, 0x6, 80, 0, 8435, 0}, - /*II_V_66_0F_38_9A*/ {{0x1ae, 8448}, 0x7, 90, 0, 8461, 0}, - /*II_V_66_0F_38_9B*/ {{0x1af, 8474}, 0x6, 80, 0, 8487, 0}, - /*II_V_66_0F_38_9C*/ {{0x1ae, 8500}, 0x7, 90, 0, 8514, 0}, - /*II_V_66_0F_38_9D*/ {{0x1af, 8528}, 0x6, 80, 0, 8542, 0}, - /*II_V_66_0F_38_9E*/ {{0x1ae, 8556}, 0x7, 90, 0, 8570, 0}, - /*II_V_66_0F_38_9F*/ {{0x1af, 8584}, 0x6, 80, 0, 8598, 0}, - /*II_V_66_0F_38_A6*/ {{0x1ae, 8612}, 0x7, 90, 0, 8628, 0}, - /*II_V_66_0F_38_A7*/ {{0x1ae, 8644}, 0x7, 90, 0, 8660, 0}, - /*II_V_66_0F_38_A8*/ {{0x1ae, 8676}, 0x7, 90, 0, 8689, 0}, - /*II_V_66_0F_38_A9*/ {{0x1af, 8702}, 0x6, 80, 0, 8715, 0}, - /*II_V_66_0F_38_AA*/ {{0x1ae, 8728}, 0x7, 90, 0, 8741, 0}, - /*II_V_66_0F_38_AB*/ {{0x1af, 8754}, 0x6, 80, 0, 8767, 0}, - /*II_V_66_0F_38_AC*/ {{0x1ae, 8780}, 0x7, 90, 0, 8794, 0}, - /*II_V_66_0F_38_AD*/ {{0x1af, 8808}, 0x6, 80, 0, 8822, 0}, - /*II_V_66_0F_38_AE*/ {{0x1ae, 8836}, 0x7, 90, 0, 8850, 0}, - /*II_V_66_0F_38_AF*/ {{0x1af, 8864}, 0x6, 80, 0, 8878, 0}, - /*II_V_66_0F_38_B6*/ {{0x1ae, 8892}, 0x7, 90, 0, 8908, 0}, - /*II_V_66_0F_38_B7*/ {{0x1ae, 8924}, 0x7, 90, 0, 8940, 0}, - /*II_V_66_0F_38_B8*/ {{0x1ae, 8956}, 0x7, 90, 0, 8969, 0}, - /*II_V_66_0F_38_B9*/ {{0x1af, 8982}, 0x6, 80, 0, 8995, 0}, - /*II_V_66_0F_38_BA*/ {{0x1ae, 9008}, 0x7, 90, 0, 9021, 0}, - /*II_V_66_0F_38_BB*/ {{0x1af, 9034}, 0x6, 80, 0, 9047, 0}, - /*II_V_66_0F_38_BC*/ {{0x1ae, 9060}, 0x7, 90, 0, 9074, 0}, - /*II_V_66_0F_38_BD*/ {{0x1af, 9088}, 0x6, 80, 0, 9102, 0}, - /*II_V_66_0F_38_BE*/ {{0x1ae, 9116}, 0x7, 90, 0, 9130, 0}, - /*II_V_66_0F_38_BF*/ {{0x1af, 9144}, 0x6, 80, 0, 9158, 0}, - /*II_V_66_0F_38_DB*/ {{0x1b1, 9180}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_DC*/ {{0x1b2, 9197}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_DD*/ {{0x1b2, 9218}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_DE*/ {{0x1b2, 9239}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_38_DF*/ {{0x1b2, 9260}, 0x0, 73, 0, 0, 0}, - /*II_V_66_0F_3A_04*/ {{0x1b7, 7581}, 0x41, 1, 0, 0, 0}, - /*II_V_66_0F_3A_05*/ {{0x1b7, 7592}, 0x41, 1, 0, 0, 0}, - /*II_V_66_0F_3A_06*/ {{0x1b8, 9287}, 0x10, 86, 1, 0, 0}, - /*II_66_0F_3A_08*/ {{0x19f, 9299}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_08*/ {{0x1b7, 9308}, 0x41, 1, 0, 0, 0}, - /*II_66_0F_3A_09*/ {{0x19f, 9318}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_09*/ {{0x1b7, 9327}, 0x41, 1, 0, 0, 0}, - /*II_66_0F_3A_0A*/ {{0x1b9, 9337}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0A*/ {{0x181, 9346}, 0x0, 71, 1, 0, 0}, - /*II_66_0F_3A_0B*/ {{0x1ba, 9356}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0B*/ {{0x181, 9365}, 0x0, 72, 1, 0, 0}, - /*II_66_0F_3A_0C*/ {{0x19f, 9375}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0C*/ {{0x186, 9384}, 0x1, 90, 1, 0, 0}, - /*II_66_0F_3A_0D*/ {{0x19f, 9394}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0D*/ {{0x186, 9403}, 0x1, 90, 1, 0, 0}, - /*II_66_0F_3A_0E*/ {{0x19f, 9413}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0E*/ {{0x181, 9422}, 0x0, 73, 1, 0, 0}, - /*II_0F_3A_0F*/ {{0x1bb, 9432}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_3A_0F*/ {{0x1bc, 9432}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0F*/ {{0x181, 9441}, 0x0, 73, 1, 0, 0}, - /*II_66_0F_3A_14*/ {{0x1bd, 9451}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_14*/ {{0x1be, 9459}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_15*/ {{0x1bf, 6333}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_15*/ {{0x1c0, 6341}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_16*/ {{0x1c1, 9468}, 0x0, 1, 0, 0, 9476}, - /*II_V_66_0F_3A_16*/ {{0x1c2, 9484}, 0x46, 1, 0, 9493, 0}, - /*II_66_0F_3A_17*/ {{0x1c3, 9502}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_17*/ {{0x1c4, 9513}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_3A_18*/ {{0x1b8, 9525}, 0x10, 73, 1, 0, 0}, - /*II_V_66_0F_3A_19*/ {{0x1c5, 9538}, 0x50, 1, 0, 0, 0}, - /*II_66_0F_3A_20*/ {{0x1c6, 9552}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_20*/ {{0x181, 9560}, 0x0, 76, 1, 0, 0}, - /*II_66_0F_3A_21*/ {{0x1b9, 9569}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_21*/ {{0x181, 9579}, 0x0, 71, 1, 0, 0}, - /*II_66_0F_3A_22*/ {{0x1c7, 9590}, 0x0, 1, 0, 0, 9598}, - /*II_V_66_0F_3A_22*/ {{0x181, 9606}, 0x6, 79, 1, 9615, 0}, - /*II_66_0F_3A_40*/ {{0x19f, 9624}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_40*/ {{0x186, 9630}, 0x1, 90, 1, 0, 0}, - /*II_66_0F_3A_41*/ {{0x19f, 9637}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_41*/ {{0x181, 9643}, 0x0, 73, 1, 0, 0}, - /*II_66_0F_3A_42*/ {{0x19f, 9650}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_42*/ {{0x181, 9659}, 0x0, 73, 1, 0, 0}, - /*II_66_0F_3A_44*/ {{0x1c8, 9669}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_44*/ {{0x1c9, 9680}, 0x0, 73, 1, 0, 0}, - /*II_V_66_0F_3A_4A*/ {{0x186, 9692}, 0x1, 90, 84, 0, 0}, - /*II_V_66_0F_3A_4B*/ {{0x186, 9703}, 0x1, 90, 84, 0, 0}, - /*II_V_66_0F_3A_4C*/ {{0x181, 9714}, 0x0, 73, 82, 0, 0}, - /*II_66_0F_3A_60*/ {{0x1ca, 9725}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_60*/ {{0x160, 9736}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_61*/ {{0x1ca, 9748}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_61*/ {{0x160, 9759}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_62*/ {{0x1ca, 9771}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_62*/ {{0x160, 9782}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_63*/ {{0x1ca, 9794}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_63*/ {{0x160, 9805}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_DF*/ {{0x1cb, 9817}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_DF*/ {{0x1cc, 9834}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_71_02*/ {{0x1cf, 6465}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_71_04*/ {{0x1cf, 6724}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_71_06*/ {{0x1cf, 7038}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_02*/ {{0x1cf, 6480}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_04*/ {{0x1cf, 6739}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_06*/ {{0x1cf, 7053}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_02*/ {{0x1cf, 6495}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_03*/ {{0x1cf, 9860}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_06*/ {{0x1cf, 7068}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_07*/ {{0x1cf, 9877}, 0x0, 1, 0, 0, 0}, - /*II_0F_AE_00*/ {{0x170, 9886}, 0x0, 0, 0, 0, 9894}, - /*II_0F_AE_01*/ {{0x170, 9914}, 0x0, 0, 0, 0, 9923}, - /*II_V_0F_AE_02*/ {{0x1d2, 9963}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_AE_03*/ {{0x1d2, 9992}, 0x40, 0, 0, 0, 0} + /*II_0F_A4*/ {{0xad, 876}, 0x0, 1, 0, 0, 0}, + /*II_0F_A5*/ {{0xad, 876}, 0x0, 42, 0, 0, 0}, + /*II_0F_AC*/ {{0xad, 892}, 0x0, 1, 0, 0, 0}, + /*II_0F_AD*/ {{0xad, 892}, 0x0, 42, 0, 0, 0}, + /*II_V_0F_10*/ {{0x129, 2151}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_10*/ {{0x129, 2160}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_10*/ {{0x12a, 2169}, 0x20, 31, 0, 0, 0}, + /*II_V_F2_0F_10*/ {{0x12a, 2177}, 0x20, 31, 0, 0, 0}, + /*II_VRR_F3_0F_10*/ {{0x12b, 2169}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_10*/ {{0x12c, 2177}, 0x60, 0, 0, 0, 0}, + /*II_V_0F_11*/ {{0x131, 2151}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_11*/ {{0x131, 2160}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_11*/ {{0x12a, 2169}, 0x20, 31, 0, 0, 0}, + /*II_V_F2_0F_11*/ {{0x12a, 2177}, 0x20, 31, 0, 0, 0}, + /*II_VRR_F3_0F_11*/ {{0x132, 2169}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_11*/ {{0x133, 2177}, 0x60, 0, 0, 0, 0}, + /*II_0F_12*/ {{0x134, 2185}, 0x0, 0, 0, 2194, 0}, + /*II_V_0F_12*/ {{0x137, 2229}, 0x0, 86, 0, 2239, 0}, + /*II_V_66_0F_12*/ {{0x138, 2248}, 0x0, 57, 0, 0, 0}, + /*II_V_F3_0F_12*/ {{0x129, 2257}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_12*/ {{0x139, 2268}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_13*/ {{0x13c, 2239}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_13*/ {{0x13c, 2248}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_14*/ {{0x13f, 2298}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_14*/ {{0x13f, 2309}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_15*/ {{0x13f, 2340}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_15*/ {{0x13f, 2351}, 0x1, 91, 0, 0, 0}, + /*II_0F_16*/ {{0x134, 2362}, 0x0, 0, 0, 2371, 0}, + /*II_V_0F_16*/ {{0x137, 2397}, 0x0, 86, 0, 2407, 0}, + /*II_V_66_0F_16*/ {{0x138, 2416}, 0x0, 57, 0, 0, 0}, + /*II_V_F3_0F_16*/ {{0x129, 2425}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_17*/ {{0x13c, 2407}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_17*/ {{0x13c, 2416}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_28*/ {{0x129, 2501}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_28*/ {{0x129, 2510}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_29*/ {{0x131, 2501}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_29*/ {{0x131, 2510}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2A*/ {{0x138, 2559}, 0x2, 73, 0, 0, 0}, + /*II_V_F2_0F_2A*/ {{0x138, 2570}, 0x2, 73, 0, 0, 0}, + /*II_V_0F_2B*/ {{0x14a, 2617}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_2B*/ {{0x14a, 2627}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2C*/ {{0x14f, 2681}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2C*/ {{0x14f, 2693}, 0x42, 0, 0, 0, 0}, + /*II_V_F3_0F_2D*/ {{0x14f, 2745}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2D*/ {{0x14f, 2756}, 0x42, 0, 0, 0, 0}, + /*II_V_0F_2E*/ {{0x152, 2785}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2E*/ {{0x153, 2795}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_2F*/ {{0x152, 2821}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2F*/ {{0x153, 2830}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_50*/ {{0x156, 2859}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_50*/ {{0x156, 2870}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_51*/ {{0x129, 2913}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_51*/ {{0x129, 2922}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_51*/ {{0x138, 2931}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_51*/ {{0x138, 2940}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_52*/ {{0x129, 2967}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_52*/ {{0x138, 2977}, 0x0, 85, 0, 0, 0}, + /*II_V_0F_53*/ {{0x129, 3001}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_53*/ {{0x138, 3009}, 0x0, 85, 0, 0, 0}, + /*II_V_0F_54*/ {{0x13f, 3031}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_54*/ {{0x13f, 3039}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_55*/ {{0x13f, 3063}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_55*/ {{0x13f, 3072}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_56*/ {{0x13f, 3093}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_56*/ {{0x13f, 3100}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_57*/ {{0x13f, 3121}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_57*/ {{0x13f, 3129}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_58*/ {{0x13f, 3165}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_58*/ {{0x13f, 3173}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_58*/ {{0x138, 3181}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_58*/ {{0x138, 3189}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_59*/ {{0x13f, 3225}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_59*/ {{0x13f, 3233}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_59*/ {{0x138, 3241}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_59*/ {{0x138, 3249}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5A*/ {{0x159, 3297}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5A*/ {{0x15a, 3308}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5A*/ {{0x138, 3319}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5A*/ {{0x138, 3330}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5B*/ {{0x129, 3372}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5B*/ {{0x129, 3383}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5B*/ {{0x129, 3394}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_5C*/ {{0x13f, 3434}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5C*/ {{0x13f, 3442}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5C*/ {{0x138, 3450}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5C*/ {{0x138, 3458}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5D*/ {{0x13f, 3494}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5D*/ {{0x13f, 3502}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5D*/ {{0x138, 3510}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5D*/ {{0x138, 3518}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5E*/ {{0x13f, 3554}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5E*/ {{0x13f, 3562}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5E*/ {{0x138, 3570}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5E*/ {{0x138, 3578}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5F*/ {{0x13f, 3614}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5F*/ {{0x13f, 3622}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5F*/ {{0x138, 3630}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5F*/ {{0x138, 3638}, 0x0, 86, 0, 0, 0}, + /*II_V_66_0F_60*/ {{0x138, 3657}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_61*/ {{0x138, 3680}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_62*/ {{0x138, 3703}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_63*/ {{0x138, 3725}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_64*/ {{0x138, 3745}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_65*/ {{0x138, 3764}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_66*/ {{0x138, 3783}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_67*/ {{0x138, 3803}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_68*/ {{0x138, 3825}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_69*/ {{0x138, 3848}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6A*/ {{0x138, 3871}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6B*/ {{0x138, 3893}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6C*/ {{0x138, 3916}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6D*/ {{0x138, 3941}, 0x0, 87, 0, 0, 0}, + /*II_0F_6E*/ {{0x15d, 3954}, 0x0, 0, 0, 0, 3960}, + /*II_66_0F_6E*/ {{0x15e, 3954}, 0x0, 0, 0, 0, 3960}, + /*II_V_66_0F_6E*/ {{0x15f, 3966}, 0x46, 0, 0, 3973, 0}, + /*II_V_66_0F_6F*/ {{0x129, 3996}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_6F*/ {{0x129, 4005}, 0x41, 0, 0, 0, 0}, + /*II_0F_70*/ {{0x161, 4014}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_70*/ {{0x162, 4022}, 0x0, 1, 0, 0, 0}, + /*II_F3_0F_70*/ {{0x162, 4030}, 0x0, 1, 0, 0, 0}, + /*II_F2_0F_70*/ {{0x162, 4039}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_70*/ {{0x163, 4048}, 0x40, 1, 0, 0, 0}, + /*II_V_F3_0F_70*/ {{0x163, 4057}, 0x40, 1, 0, 0, 0}, + /*II_V_F2_0F_70*/ {{0x163, 4067}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_74*/ {{0x138, 4086}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_75*/ {{0x138, 4105}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_76*/ {{0x138, 4124}, 0x0, 87, 0, 0, 0}, + /*II_V_0F_77*/ {{0x165, 4140}, 0x49, 0, 0, 4152, 0}, + /*II_66_0F_78*/ {{0x167, 4170}, 0x0, 49, 0, 0, 0}, + /*II_F2_0F_78*/ {{0x168, 4177}, 0x0, 48, 49, 0, 0}, + /*II_V_66_0F_7C*/ {{0x13f, 4231}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_7C*/ {{0x13f, 4240}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_7D*/ {{0x13f, 4265}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_7D*/ {{0x13f, 4274}, 0x1, 91, 0, 0, 0}, + /*II_0F_7E*/ {{0x16f, 3954}, 0x0, 0, 0, 0, 3960}, + /*II_66_0F_7E*/ {{0x170, 3954}, 0x0, 0, 0, 0, 3960}, + /*II_V_66_0F_7E*/ {{0x171, 3966}, 0x46, 0, 0, 3973, 0}, + /*II_V_F3_0F_7E*/ {{0x153, 3973}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_7F*/ {{0x131, 3996}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_7F*/ {{0x131, 4005}, 0x41, 0, 0, 0, 0}, + /*II_0F_AE_04*/ {{0x173, 4283}, 0x0, 0, 0, 0, 4290}, + /*II_0F_AE_05*/ {{0x174, 4299}, 0x0, 0, 0, 4307, 4315}, + /*II_0F_AE_06*/ {{0x174, 4325}, 0x0, 0, 0, 4333, 4343}, + /*II_0F_AE_07*/ {{0x175, 4355}, 0x0, 0, 0, 4363, 0}, + /*II_0F_C2*/ {{0x17c, 4404}, 0x0, 0, 0, 4413, 4422}, + /*II_66_0F_C2*/ {{0x17d, 4483}, 0x0, 0, 0, 4492, 4501}, + /*II_F3_0F_C2*/ {{0x17e, 4562}, 0x0, 0, 0, 4571, 4580}, + /*II_F2_0F_C2*/ {{0x17f, 4641}, 0x0, 0, 0, 4650, 4659}, + /*II_V_0F_C2*/ {{0x180, 4720}, 0x1, 91, 0, 4730, 4740}, + /*II_V_66_0F_C2*/ {{0x180, 5122}, 0x1, 91, 0, 5132, 5142}, + /*II_V_F3_0F_C2*/ {{0x181, 5524}, 0x0, 85, 0, 5534, 5544}, + /*II_V_F2_0F_C2*/ {{0x181, 5926}, 0x0, 86, 0, 5936, 5946}, + /*II_0F_C4*/ {{0x182, 6328}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C4*/ {{0x183, 6328}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C4*/ {{0x184, 6336}, 0x0, 79, 1, 0, 0}, + /*II_0F_C5*/ {{0x185, 6345}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C5*/ {{0x186, 6345}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C5*/ {{0x187, 6353}, 0x40, 1, 0, 0, 0}, + /*II_0F_C6*/ {{0x188, 6362}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C6*/ {{0x162, 6370}, 0x0, 1, 0, 0, 0}, + /*II_V_0F_C6*/ {{0x189, 6378}, 0x1, 91, 1, 0, 0}, + /*II_V_66_0F_C6*/ {{0x189, 6387}, 0x1, 91, 1, 0, 0}, + /*II_0F_C7_01*/ {{0x18a, 6396}, 0x0, 0, 0, 0, 6407}, + /*II_V_66_0F_D0*/ {{0x13f, 6448}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_D0*/ {{0x13f, 6459}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_D1*/ {{0x138, 6477}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D2*/ {{0x138, 6492}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D3*/ {{0x138, 6507}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D4*/ {{0x138, 6522}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D5*/ {{0x138, 6538}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D6*/ {{0x18e, 3973}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D7*/ {{0x191, 6575}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D8*/ {{0x138, 6595}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D9*/ {{0x138, 6614}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DA*/ {{0x138, 6632}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DB*/ {{0x138, 6647}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DC*/ {{0x138, 6663}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DD*/ {{0x138, 6663}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DE*/ {{0x138, 6690}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DF*/ {{0x138, 6706}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E0*/ {{0x138, 6721}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E1*/ {{0x138, 6736}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E2*/ {{0x138, 6751}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E3*/ {{0x138, 6766}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E4*/ {{0x138, 6783}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E5*/ {{0x138, 6801}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E6*/ {{0x15a, 6841}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_E6*/ {{0x159, 6853}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_E6*/ {{0x15a, 6864}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E7*/ {{0x14a, 6892}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E8*/ {{0x138, 6910}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E9*/ {{0x138, 6927}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EA*/ {{0x138, 6944}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EB*/ {{0x138, 6958}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EC*/ {{0x138, 6972}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_ED*/ {{0x138, 6989}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EE*/ {{0x138, 7006}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EF*/ {{0x138, 7021}, 0x0, 87, 0, 0, 0}, + /*II_V_F2_0F_F0*/ {{0x195, 7035}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_F1*/ {{0x138, 7050}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F2*/ {{0x138, 7065}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F3*/ {{0x138, 7080}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F4*/ {{0x138, 7097}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F5*/ {{0x138, 7116}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F6*/ {{0x138, 7134}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F7*/ {{0x199, 7165}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_F8*/ {{0x138, 7185}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F9*/ {{0x138, 7200}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FA*/ {{0x138, 7215}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FB*/ {{0x138, 7230}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FC*/ {{0x138, 7245}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FD*/ {{0x138, 7260}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FE*/ {{0x138, 7275}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_00*/ {{0x138, 7383}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_01*/ {{0x138, 7400}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_02*/ {{0x138, 7417}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_03*/ {{0x138, 7435}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_04*/ {{0x138, 7456}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_05*/ {{0x138, 7476}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_06*/ {{0x138, 7493}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_07*/ {{0x138, 7511}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_08*/ {{0x138, 7529}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_09*/ {{0x138, 7546}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0A*/ {{0x138, 7563}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0B*/ {{0x138, 7582}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0C*/ {{0x13f, 7593}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_38_0D*/ {{0x13f, 7604}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_38_0E*/ {{0x129, 7615}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_0F*/ {{0x129, 7624}, 0x41, 0, 0, 0, 0}, + /*II_66_0F_38_10*/ {{0x1a2, 7633}, 0x0, 32, 0, 0, 0}, + /*II_66_0F_38_14*/ {{0x1a2, 7643}, 0x0, 32, 0, 0, 0}, + /*II_66_0F_38_15*/ {{0x1a2, 7653}, 0x0, 32, 0, 0, 0}, + /*II_V_66_0F_38_17*/ {{0x129, 7670}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_18*/ {{0x1a4, 7678}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_19*/ {{0x1a5, 7692}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1A*/ {{0x1a6, 7706}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1C*/ {{0x1a7, 7729}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1D*/ {{0x1a7, 7744}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1E*/ {{0x1a7, 7759}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_20*/ {{0x153, 7777}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_21*/ {{0x152, 7798}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_22*/ {{0x1ab, 7819}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_23*/ {{0x153, 7840}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_24*/ {{0x152, 7861}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_25*/ {{0x153, 7882}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_28*/ {{0x138, 7901}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_29*/ {{0x138, 7919}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_2A*/ {{0x1ae, 7939}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_2B*/ {{0x138, 7960}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_2C*/ {{0x13f, 7971}, 0x1, 67, 0, 0, 0}, + /*II_V_66_0F_38_2D*/ {{0x13f, 7983}, 0x1, 67, 0, 0, 0}, + /*II_V_66_0F_38_2E*/ {{0x1af, 7971}, 0x1, 36, 0, 0, 0}, + /*II_V_66_0F_38_2F*/ {{0x1af, 7983}, 0x1, 36, 0, 0, 0}, + /*II_V_66_0F_38_30*/ {{0x153, 8005}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_31*/ {{0x152, 8026}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_32*/ {{0x1ab, 8047}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_33*/ {{0x153, 8068}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_34*/ {{0x152, 8089}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_35*/ {{0x153, 8110}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_37*/ {{0x138, 8130}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_38*/ {{0x138, 8148}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_39*/ {{0x138, 8165}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3A*/ {{0x138, 8182}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3B*/ {{0x138, 8199}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3C*/ {{0x138, 8216}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3D*/ {{0x138, 8233}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3E*/ {{0x138, 8250}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3F*/ {{0x138, 8267}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_40*/ {{0x138, 8284}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_41*/ {{0x1a7, 8305}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_96*/ {{0x1b1, 8344}, 0x7, 91, 0, 8360, 0}, + /*II_V_66_0F_38_97*/ {{0x1b1, 8376}, 0x7, 91, 0, 8392, 0}, + /*II_V_66_0F_38_98*/ {{0x1b1, 8408}, 0x7, 91, 0, 8421, 0}, + /*II_V_66_0F_38_99*/ {{0x1b2, 8434}, 0x6, 88, 0, 8447, 0}, + /*II_V_66_0F_38_9A*/ {{0x1b1, 8460}, 0x7, 91, 0, 8473, 0}, + /*II_V_66_0F_38_9B*/ {{0x1b2, 8486}, 0x6, 88, 0, 8499, 0}, + /*II_V_66_0F_38_9C*/ {{0x1b1, 8512}, 0x7, 91, 0, 8526, 0}, + /*II_V_66_0F_38_9D*/ {{0x1b2, 8540}, 0x6, 88, 0, 8554, 0}, + /*II_V_66_0F_38_9E*/ {{0x1b1, 8568}, 0x7, 91, 0, 8582, 0}, + /*II_V_66_0F_38_9F*/ {{0x1b2, 8596}, 0x6, 88, 0, 8610, 0}, + /*II_V_66_0F_38_A6*/ {{0x1b1, 8624}, 0x7, 91, 0, 8640, 0}, + /*II_V_66_0F_38_A7*/ {{0x1b1, 8656}, 0x7, 91, 0, 8672, 0}, + /*II_V_66_0F_38_A8*/ {{0x1b1, 8688}, 0x7, 91, 0, 8701, 0}, + /*II_V_66_0F_38_A9*/ {{0x1b2, 8714}, 0x6, 88, 0, 8727, 0}, + /*II_V_66_0F_38_AA*/ {{0x1b1, 8740}, 0x7, 91, 0, 8753, 0}, + /*II_V_66_0F_38_AB*/ {{0x1b2, 8766}, 0x6, 88, 0, 8779, 0}, + /*II_V_66_0F_38_AC*/ {{0x1b1, 8792}, 0x7, 91, 0, 8806, 0}, + /*II_V_66_0F_38_AD*/ {{0x1b2, 8820}, 0x6, 88, 0, 8834, 0}, + /*II_V_66_0F_38_AE*/ {{0x1b1, 8848}, 0x7, 91, 0, 8862, 0}, + /*II_V_66_0F_38_AF*/ {{0x1b2, 8876}, 0x6, 88, 0, 8890, 0}, + /*II_V_66_0F_38_B6*/ {{0x1b1, 8904}, 0x7, 91, 0, 8920, 0}, + /*II_V_66_0F_38_B7*/ {{0x1b1, 8936}, 0x7, 91, 0, 8952, 0}, + /*II_V_66_0F_38_B8*/ {{0x1b1, 8968}, 0x7, 91, 0, 8981, 0}, + /*II_V_66_0F_38_B9*/ {{0x1b2, 8994}, 0x6, 88, 0, 9007, 0}, + /*II_V_66_0F_38_BA*/ {{0x1b1, 9020}, 0x7, 91, 0, 9033, 0}, + /*II_V_66_0F_38_BB*/ {{0x1b2, 9046}, 0x6, 88, 0, 9059, 0}, + /*II_V_66_0F_38_BC*/ {{0x1b1, 9072}, 0x7, 91, 0, 9086, 0}, + /*II_V_66_0F_38_BD*/ {{0x1b2, 9100}, 0x6, 88, 0, 9114, 0}, + /*II_V_66_0F_38_BE*/ {{0x1b1, 9128}, 0x7, 91, 0, 9142, 0}, + /*II_V_66_0F_38_BF*/ {{0x1b2, 9156}, 0x6, 88, 0, 9170, 0}, + /*II_V_66_0F_38_DB*/ {{0x1b4, 9192}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_DC*/ {{0x1b5, 9209}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DD*/ {{0x1b5, 9230}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DE*/ {{0x1b5, 9251}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DF*/ {{0x1b5, 9272}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_3A_04*/ {{0x1ba, 7593}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_05*/ {{0x1ba, 7604}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_06*/ {{0x1bb, 9299}, 0x10, 89, 1, 0, 0}, + /*II_66_0F_3A_08*/ {{0x1a2, 9311}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_08*/ {{0x1ba, 9320}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_09*/ {{0x1a2, 9330}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_09*/ {{0x1ba, 9339}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_0A*/ {{0x1bc, 9349}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0A*/ {{0x184, 9358}, 0x0, 85, 1, 0, 0}, + /*II_66_0F_3A_0B*/ {{0x1bd, 9368}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0B*/ {{0x184, 9377}, 0x0, 86, 1, 0, 0}, + /*II_66_0F_3A_0C*/ {{0x1a2, 9387}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0C*/ {{0x189, 9396}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_0D*/ {{0x1a2, 9406}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0D*/ {{0x189, 9415}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_0E*/ {{0x1a2, 9425}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0E*/ {{0x184, 9434}, 0x0, 87, 1, 0, 0}, + /*II_0F_3A_0F*/ {{0x1be, 9444}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_3A_0F*/ {{0x1bf, 9444}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0F*/ {{0x184, 9453}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_14*/ {{0x1c0, 9463}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_14*/ {{0x1c1, 9471}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_15*/ {{0x1c2, 6345}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_15*/ {{0x1c3, 6353}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_16*/ {{0x1c4, 9480}, 0x0, 1, 0, 0, 9488}, + /*II_V_66_0F_3A_16*/ {{0x1c5, 9496}, 0x46, 1, 0, 9505, 0}, + /*II_66_0F_3A_17*/ {{0x1c6, 9514}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_17*/ {{0x1c7, 9525}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_3A_18*/ {{0x1bb, 9537}, 0x10, 87, 1, 0, 0}, + /*II_V_66_0F_3A_19*/ {{0x1c8, 9550}, 0x50, 1, 0, 0, 0}, + /*II_66_0F_3A_20*/ {{0x1c9, 9564}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_20*/ {{0x184, 9572}, 0x0, 80, 1, 0, 0}, + /*II_66_0F_3A_21*/ {{0x1bc, 9581}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_21*/ {{0x184, 9591}, 0x0, 85, 1, 0, 0}, + /*II_66_0F_3A_22*/ {{0x1ca, 9602}, 0x0, 1, 0, 0, 9610}, + /*II_V_66_0F_3A_22*/ {{0x184, 9618}, 0x6, 73, 1, 9627, 0}, + /*II_66_0F_3A_40*/ {{0x1a2, 9636}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_40*/ {{0x189, 9642}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_41*/ {{0x1a2, 9649}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_41*/ {{0x184, 9655}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_42*/ {{0x1a2, 9662}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_42*/ {{0x184, 9671}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_44*/ {{0x1cb, 9681}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_44*/ {{0x1cc, 9692}, 0x0, 87, 1, 0, 0}, + /*II_V_66_0F_3A_4A*/ {{0x189, 9704}, 0x1, 91, 37, 0, 0}, + /*II_V_66_0F_3A_4B*/ {{0x189, 9715}, 0x1, 91, 37, 0, 0}, + /*II_V_66_0F_3A_4C*/ {{0x184, 9726}, 0x0, 87, 35, 0, 0}, + /*II_66_0F_3A_60*/ {{0x1cd, 9737}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_60*/ {{0x163, 9748}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_61*/ {{0x1cd, 9760}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_61*/ {{0x163, 9771}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_62*/ {{0x1cd, 9783}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_62*/ {{0x163, 9794}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_63*/ {{0x1cd, 9806}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_63*/ {{0x163, 9817}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_DF*/ {{0x1ce, 9829}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_DF*/ {{0x1cf, 9846}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_71_02*/ {{0x1d2, 6477}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_04*/ {{0x1d2, 6736}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_06*/ {{0x1d2, 7050}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_02*/ {{0x1d2, 6492}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_04*/ {{0x1d2, 6751}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_06*/ {{0x1d2, 7065}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_02*/ {{0x1d2, 6507}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_03*/ {{0x1d2, 9872}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_06*/ {{0x1d2, 7080}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_07*/ {{0x1d2, 9889}, 0x0, 1, 0, 0, 0}, + /*II_0F_AE_00*/ {{0x173, 9898}, 0x0, 0, 0, 0, 9906}, + /*II_0F_AE_01*/ {{0x173, 9926}, 0x0, 0, 0, 0, 9935}, + /*II_V_0F_AE_02*/ {{0x1d5, 9975}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_AE_03*/ {{0x1d5, 10004}, 0x40, 0, 0, 0, 0} }; _InstNode InstructionsTree[5688] = { @@ -1783,7 +1785,7 @@ _InstNode InstructionsTree[5688] = { /* c - _0C */ 0x200c, /* d - _0D */ 0x200d, /* e - _0E */ 0x200e, -/* f - _0F */ 0x8100, +/* f - _0F */ 0xa100, /* 10 - _10 */ 0x200f, /* 11 - _11 */ 0x2010, /* 12 - _12 */ 0x2011, @@ -1867,7 +1869,7 @@ _InstNode InstructionsTree[5688] = { /* 60 - _60 */ 0x205b, /* 61 - _61 */ 0x205c, /* 62 - _62 */ 0x205d, -/* 63 - _63 */ 0x205e, +/* 63 - _63 */ 0x605e, /* 64 - */ 0, /* 65 - */ 0, /* 66 - */ 0, @@ -1896,10 +1898,10 @@ _InstNode InstructionsTree[5688] = { /* 7d - _7D */ 0x2072, /* 7e - _7E */ 0x2073, /* 7f - _7F */ 0x2074, -/* 80 - _80 */ 0x6200, -/* 81 - _81 */ 0x6208, -/* 82 - _82 */ 0x6210, -/* 83 - _83 */ 0x6218, +/* 80 - _80 */ 0x8200, +/* 81 - _81 */ 0x8208, +/* 82 - _82 */ 0x8210, +/* 83 - _83 */ 0x8218, /* 84 - _84 */ 0x2075, /* 85 - _85 */ 0x2076, /* 86 - _86 */ 0x2077, @@ -1909,10 +1911,10 @@ _InstNode InstructionsTree[5688] = { /* 8a - _8A */ 0x207b, /* 8b - _8B */ 0x207c, /* 8c - _8C */ 0x207d, -/* 8d - _8D */ 0x207e, +/* 8d - _8D */ 0x607e, /* 8e - _8E */ 0x207f, -/* 8f - _8F */ 0x6220, -/* 90 - _90 */ 0x2080, +/* 8f - _8F */ 0x8220, +/* 90 - _90 */ 0x6080, /* 91 - _91 */ 0x2081, /* 92 - _92 */ 0x2082, /* 93 - _93 */ 0x2083, @@ -1960,14 +1962,14 @@ _InstNode InstructionsTree[5688] = { /* bd - _B8 */ 0x20aa, /* be - _B8 */ 0x20ab, /* bf - _B8 */ 0x20ac, -/* c0 - _C0 */ 0x6228, -/* c1 - _C1 */ 0x6230, +/* c0 - _C0 */ 0x8228, +/* c1 - _C1 */ 0x8230, /* c2 - _C2 */ 0x20ad, /* c3 - _C3 */ 0x20ae, /* c4 - _C4 */ 0x20af, /* c5 - _C5 */ 0x20b0, -/* c6 - _C6 */ 0xa238, -/* c7 - _C7 */ 0xa280, +/* c6 - _C6 */ 0xc238, +/* c7 - _C7 */ 0xc280, /* c8 - _C8 */ 0x20b1, /* c9 - _C9 */ 0x20b2, /* ca - _CA */ 0x20b3, @@ -1976,22 +1978,22 @@ _InstNode InstructionsTree[5688] = { /* cd - _CD */ 0x20b6, /* ce - _CE */ 0x20b7, /* cf - _CF */ 0x20b8, -/* d0 - _D0 */ 0x62c8, -/* d1 - _D1 */ 0x62d0, -/* d2 - _D2 */ 0x62d8, -/* d3 - _D3 */ 0x62e0, +/* d0 - _D0 */ 0x82c8, +/* d1 - _D1 */ 0x82d0, +/* d2 - _D2 */ 0x82d8, +/* d3 - _D3 */ 0x82e0, /* d4 - _D4 */ 0x20b9, /* d5 - _D5 */ 0x20ba, /* d6 - _D6 */ 0x20bb, /* d7 - _D7 */ 0x20bc, -/* d8 - _D8 */ 0xa2e8, -/* d9 - _D9 */ 0xa330, -/* da - _DA */ 0xa378, -/* db - _DB */ 0xa3c0, -/* dc - _DC */ 0xa408, -/* dd - _DD */ 0xa450, -/* de - _DE */ 0xa498, -/* df - _DF */ 0xa4e0, +/* d8 - _D8 */ 0xc2e8, +/* d9 - _D9 */ 0xc330, +/* da - _DA */ 0xc378, +/* db - _DB */ 0xc3c0, +/* dc - _DC */ 0xc408, +/* dd - _DD */ 0xc450, +/* de - _DE */ 0xc498, +/* df - _DF */ 0xc4e0, /* e0 - _E0 */ 0x20bd, /* e1 - _E1 */ 0x20be, /* e2 - _E2 */ 0x20bf, @@ -2014,18 +2016,18 @@ _InstNode InstructionsTree[5688] = { /* f3 - */ 0, /* f4 - _F4 */ 0x20cd, /* f5 - _F5 */ 0x20ce, -/* f6 - _F6 */ 0x6528, -/* f7 - _F7 */ 0x6530, +/* f6 - _F6 */ 0x8528, +/* f7 - _F7 */ 0x8530, /* f8 - _F8 */ 0x20cf, /* f9 - _F9 */ 0x20d0, /* fa - _FA */ 0x20d1, /* fb - _FB */ 0x20d2, /* fc - _FC */ 0x20d3, /* fd - _FD */ 0x20d4, -/* fe - _FE */ 0x6538, -/* ff - _FF */ 0x6540, -/* 100 - _0F_00 */ 0x6548, -/* 101 - _0F_01 */ 0xa550, +/* fe - _FE */ 0x8538, +/* ff - _FF */ 0x8540, +/* 100 - _0F_00 */ 0x8548, +/* 101 - _0F_01 */ 0xc550, /* 102 - _0F_02 */ 0x20d5, /* 103 - _0F_03 */ 0x20d6, /* 104 - */ 0, @@ -2037,18 +2039,18 @@ _InstNode InstructionsTree[5688] = { /* 10a - */ 0, /* 10b - _0F_0B */ 0x20dc, /* 10c - */ 0, -/* 10d - _0F_0D */ 0x6598, +/* 10d - _0F_0D */ 0x8598, /* 10e - _0F_0E */ 0x20dd, -/* 10f - _0F_0F */ 0x85a0, -/* 110 - _0F_10 */ 0xc6a0, -/* 111 - _0F_11 */ 0xc6ac, -/* 112 - _0F_12 */ 0xc6b8, -/* 113 - _0F_13 */ 0xc6c4, -/* 114 - _0F_14 */ 0xc6d0, -/* 115 - _0F_15 */ 0xc6dc, -/* 116 - _0F_16 */ 0xc6e8, -/* 117 - _0F_17 */ 0xc6f4, -/* 118 - _0F_18 */ 0x6700, +/* 10f - _0F_0F */ 0xa5a0, +/* 110 - _0F_10 */ 0xe6a0, +/* 111 - _0F_11 */ 0xe6ac, +/* 112 - _0F_12 */ 0xe6b8, +/* 113 - _0F_13 */ 0xe6c4, +/* 114 - _0F_14 */ 0xe6d0, +/* 115 - _0F_15 */ 0xe6dc, +/* 116 - _0F_16 */ 0xe6e8, +/* 117 - _0F_17 */ 0xe6f4, +/* 118 - _0F_18 */ 0x8700, /* 119 - */ 0, /* 11a - */ 0, /* 11b - */ 0, @@ -2064,14 +2066,14 @@ _InstNode InstructionsTree[5688] = { /* 125 - */ 0, /* 126 - */ 0, /* 127 - */ 0, -/* 128 - _0F_28 */ 0xc708, -/* 129 - _0F_29 */ 0xc714, -/* 12a - _0F_2A */ 0xc720, -/* 12b - _0F_2B */ 0xc72c, -/* 12c - _0F_2C */ 0xc738, -/* 12d - _0F_2D */ 0xc744, -/* 12e - _0F_2E */ 0xc750, -/* 12f - _0F_2F */ 0xc75c, +/* 128 - _0F_28 */ 0xe708, +/* 129 - _0F_29 */ 0xe714, +/* 12a - _0F_2A */ 0xe720, +/* 12b - _0F_2B */ 0xe72c, +/* 12c - _0F_2C */ 0xe738, +/* 12d - _0F_2D */ 0xe744, +/* 12e - _0F_2E */ 0xe750, +/* 12f - _0F_2F */ 0xe75c, /* 130 - _0F_30 */ 0x20e3, /* 131 - _0F_31 */ 0x20e4, /* 132 - _0F_32 */ 0x20e5, @@ -2080,9 +2082,9 @@ _InstNode InstructionsTree[5688] = { /* 135 - _0F_35 */ 0x20e8, /* 136 - */ 0, /* 137 - _0F_37 */ 0x20e9, -/* 138 - _0F_38 */ 0x8768, +/* 138 - _0F_38 */ 0xa768, /* 139 - */ 0, -/* 13a - _0F_3A */ 0x8868, +/* 13a - _0F_3A */ 0xa868, /* 13b - */ 0, /* 13c - */ 0, /* 13d - */ 0, @@ -2104,54 +2106,54 @@ _InstNode InstructionsTree[5688] = { /* 14d - _0F_4D */ 0x20f7, /* 14e - _0F_4E */ 0x20f8, /* 14f - _0F_4F */ 0x20f9, -/* 150 - _0F_50 */ 0xc968, -/* 151 - _0F_51 */ 0xc974, -/* 152 - _0F_52 */ 0xc980, -/* 153 - _0F_53 */ 0xc98c, -/* 154 - _0F_54 */ 0xc998, -/* 155 - _0F_55 */ 0xc9a4, -/* 156 - _0F_56 */ 0xc9b0, -/* 157 - _0F_57 */ 0xc9bc, -/* 158 - _0F_58 */ 0xc9c8, -/* 159 - _0F_59 */ 0xc9d4, -/* 15a - _0F_5A */ 0xc9e0, -/* 15b - _0F_5B */ 0xc9ec, -/* 15c - _0F_5C */ 0xc9f8, -/* 15d - _0F_5D */ 0xca04, -/* 15e - _0F_5E */ 0xca10, -/* 15f - _0F_5F */ 0xca1c, -/* 160 - _0F_60 */ 0xca28, -/* 161 - _0F_61 */ 0xca34, -/* 162 - _0F_62 */ 0xca40, -/* 163 - _0F_63 */ 0xca4c, -/* 164 - _0F_64 */ 0xca58, -/* 165 - _0F_65 */ 0xca64, -/* 166 - _0F_66 */ 0xca70, -/* 167 - _0F_67 */ 0xca7c, -/* 168 - _0F_68 */ 0xca88, -/* 169 - _0F_69 */ 0xca94, -/* 16a - _0F_6A */ 0xcaa0, -/* 16b - _0F_6B */ 0xcaac, -/* 16c - _0F_6C */ 0xcab8, -/* 16d - _0F_6D */ 0xcac4, -/* 16e - _0F_6E */ 0xcad0, -/* 16f - _0F_6F */ 0xcadc, -/* 170 - _0F_70 */ 0xcae8, -/* 171 - _0F_71 */ 0x6af4, -/* 172 - _0F_72 */ 0x6afc, -/* 173 - _0F_73 */ 0x6b04, -/* 174 - _0F_74 */ 0xcb0c, -/* 175 - _0F_75 */ 0xcb18, -/* 176 - _0F_76 */ 0xcb24, -/* 177 - _0F_77 */ 0xcb30, -/* 178 - _0F_78 */ 0xcb3c, -/* 179 - _0F_79 */ 0xcb48, -/* 17a - _0F_7A */ 0x8b54, +/* 150 - _0F_50 */ 0xe968, +/* 151 - _0F_51 */ 0xe974, +/* 152 - _0F_52 */ 0xe980, +/* 153 - _0F_53 */ 0xe98c, +/* 154 - _0F_54 */ 0xe998, +/* 155 - _0F_55 */ 0xe9a4, +/* 156 - _0F_56 */ 0xe9b0, +/* 157 - _0F_57 */ 0xe9bc, +/* 158 - _0F_58 */ 0xe9c8, +/* 159 - _0F_59 */ 0xe9d4, +/* 15a - _0F_5A */ 0xe9e0, +/* 15b - _0F_5B */ 0xe9ec, +/* 15c - _0F_5C */ 0xe9f8, +/* 15d - _0F_5D */ 0xea04, +/* 15e - _0F_5E */ 0xea10, +/* 15f - _0F_5F */ 0xea1c, +/* 160 - _0F_60 */ 0xea28, +/* 161 - _0F_61 */ 0xea34, +/* 162 - _0F_62 */ 0xea40, +/* 163 - _0F_63 */ 0xea4c, +/* 164 - _0F_64 */ 0xea58, +/* 165 - _0F_65 */ 0xea64, +/* 166 - _0F_66 */ 0xea70, +/* 167 - _0F_67 */ 0xea7c, +/* 168 - _0F_68 */ 0xea88, +/* 169 - _0F_69 */ 0xea94, +/* 16a - _0F_6A */ 0xeaa0, +/* 16b - _0F_6B */ 0xeaac, +/* 16c - _0F_6C */ 0xeab8, +/* 16d - _0F_6D */ 0xeac4, +/* 16e - _0F_6E */ 0xead0, +/* 16f - _0F_6F */ 0xeadc, +/* 170 - _0F_70 */ 0xeae8, +/* 171 - _0F_71 */ 0x8af4, +/* 172 - _0F_72 */ 0x8afc, +/* 173 - _0F_73 */ 0x8b04, +/* 174 - _0F_74 */ 0xeb0c, +/* 175 - _0F_75 */ 0xeb18, +/* 176 - _0F_76 */ 0xeb24, +/* 177 - _0F_77 */ 0xeb30, +/* 178 - _0F_78 */ 0xeb3c, +/* 179 - _0F_79 */ 0xeb48, +/* 17a - _0F_7A */ 0xab54, /* 17b - */ 0, -/* 17c - _0F_7C */ 0xcc54, -/* 17d - _0F_7D */ 0xcc60, -/* 17e - _0F_7E */ 0xcc6c, -/* 17f - _0F_7F */ 0xcc78, +/* 17c - _0F_7C */ 0xec54, +/* 17d - _0F_7D */ 0xec60, +/* 17e - _0F_7E */ 0xec6c, +/* 17f - _0F_7F */ 0xec78, /* 180 - _0F_80 */ 0x20fa, /* 181 - _0F_81 */ 0x20fb, /* 182 - _0F_82 */ 0x20fc, @@ -2198,7 +2200,7 @@ _InstNode InstructionsTree[5688] = { /* 1ab - _0F_AB */ 0x2121, /* 1ac - _0F_AC */ 0x4007, /* 1ad - _0F_AD */ 0x4008, -/* 1ae - _0F_AE */ 0x6c84, +/* 1ae - _0F_AE */ 0x8c84, /* 1af - _0F_AF */ 0x2122, /* 1b0 - _0F_B0 */ 0x2123, /* 1b1 - _0F_B1 */ 0x2124, @@ -2208,22 +2210,22 @@ _InstNode InstructionsTree[5688] = { /* 1b5 - _0F_B5 */ 0x2128, /* 1b6 - _0F_B6 */ 0x2129, /* 1b7 - _0F_B7 */ 0x212a, -/* 1b8 - _0F_B8 */ 0xcc8c, +/* 1b8 - _0F_B8 */ 0xec8c, /* 1b9 - _0F_B9 */ 0x212b, -/* 1ba - _0F_BA */ 0x6c98, +/* 1ba - _0F_BA */ 0x8c98, /* 1bb - _0F_BB */ 0x212c, -/* 1bc - _0F_BC */ 0xcca0, -/* 1bd - _0F_BD */ 0xccac, +/* 1bc - _0F_BC */ 0xeca0, +/* 1bd - _0F_BD */ 0xecac, /* 1be - _0F_BE */ 0x212d, /* 1bf - _0F_BF */ 0x212e, /* 1c0 - _0F_C0 */ 0x212f, /* 1c1 - _0F_C1 */ 0x2130, -/* 1c2 - _0F_C2 */ 0xccb8, +/* 1c2 - _0F_C2 */ 0xecb8, /* 1c3 - _0F_C3 */ 0x2131, -/* 1c4 - _0F_C4 */ 0xccc4, -/* 1c5 - _0F_C5 */ 0xccd0, -/* 1c6 - _0F_C6 */ 0xccdc, -/* 1c7 - _0F_C7 */ 0x6ce8, +/* 1c4 - _0F_C4 */ 0xecc4, +/* 1c5 - _0F_C5 */ 0xecd0, +/* 1c6 - _0F_C6 */ 0xecdc, +/* 1c7 - _0F_C7 */ 0x8ce8, /* 1c8 - _0F_C8 */ 0x2132, /* 1c9 - _0F_C8 */ 0x2133, /* 1ca - _0F_C8 */ 0x2134, @@ -2232,53 +2234,53 @@ _InstNode InstructionsTree[5688] = { /* 1cd - _0F_C8 */ 0x2137, /* 1ce - _0F_C8 */ 0x2138, /* 1cf - _0F_C8 */ 0x2139, -/* 1d0 - _0F_D0 */ 0xccf0, -/* 1d1 - _0F_D1 */ 0xccfc, -/* 1d2 - _0F_D2 */ 0xcd08, -/* 1d3 - _0F_D3 */ 0xcd14, -/* 1d4 - _0F_D4 */ 0xcd20, -/* 1d5 - _0F_D5 */ 0xcd2c, -/* 1d6 - _0F_D6 */ 0xcd38, -/* 1d7 - _0F_D7 */ 0xcd44, -/* 1d8 - _0F_D8 */ 0xcd50, -/* 1d9 - _0F_D9 */ 0xcd5c, -/* 1da - _0F_DA */ 0xcd68, -/* 1db - _0F_DB */ 0xcd74, -/* 1dc - _0F_DC */ 0xcd80, -/* 1dd - _0F_DD */ 0xcd8c, -/* 1de - _0F_DE */ 0xcd98, -/* 1df - _0F_DF */ 0xcda4, -/* 1e0 - _0F_E0 */ 0xcdb0, -/* 1e1 - _0F_E1 */ 0xcdbc, -/* 1e2 - _0F_E2 */ 0xcdc8, -/* 1e3 - _0F_E3 */ 0xcdd4, -/* 1e4 - _0F_E4 */ 0xcde0, -/* 1e5 - _0F_E5 */ 0xcdec, -/* 1e6 - _0F_E6 */ 0xcdf8, -/* 1e7 - _0F_E7 */ 0xce04, -/* 1e8 - _0F_E8 */ 0xce10, -/* 1e9 - _0F_E9 */ 0xce1c, -/* 1ea - _0F_EA */ 0xce28, -/* 1eb - _0F_EB */ 0xce34, -/* 1ec - _0F_EC */ 0xce40, -/* 1ed - _0F_ED */ 0xce4c, -/* 1ee - _0F_EE */ 0xce58, -/* 1ef - _0F_EF */ 0xce64, -/* 1f0 - _0F_F0 */ 0xce70, -/* 1f1 - _0F_F1 */ 0xce7c, -/* 1f2 - _0F_F2 */ 0xce88, -/* 1f3 - _0F_F3 */ 0xce94, -/* 1f4 - _0F_F4 */ 0xcea0, -/* 1f5 - _0F_F5 */ 0xceac, -/* 1f6 - _0F_F6 */ 0xceb8, -/* 1f7 - _0F_F7 */ 0xcec4, -/* 1f8 - _0F_F8 */ 0xced0, -/* 1f9 - _0F_F9 */ 0xcedc, -/* 1fa - _0F_FA */ 0xcee8, -/* 1fb - _0F_FB */ 0xcef4, -/* 1fc - _0F_FC */ 0xcf00, -/* 1fd - _0F_FD */ 0xcf0c, -/* 1fe - _0F_FE */ 0xcf18, +/* 1d0 - _0F_D0 */ 0xecf0, +/* 1d1 - _0F_D1 */ 0xecfc, +/* 1d2 - _0F_D2 */ 0xed08, +/* 1d3 - _0F_D3 */ 0xed14, +/* 1d4 - _0F_D4 */ 0xed20, +/* 1d5 - _0F_D5 */ 0xed2c, +/* 1d6 - _0F_D6 */ 0xed38, +/* 1d7 - _0F_D7 */ 0xed44, +/* 1d8 - _0F_D8 */ 0xed50, +/* 1d9 - _0F_D9 */ 0xed5c, +/* 1da - _0F_DA */ 0xed68, +/* 1db - _0F_DB */ 0xed74, +/* 1dc - _0F_DC */ 0xed80, +/* 1dd - _0F_DD */ 0xed8c, +/* 1de - _0F_DE */ 0xed98, +/* 1df - _0F_DF */ 0xeda4, +/* 1e0 - _0F_E0 */ 0xedb0, +/* 1e1 - _0F_E1 */ 0xedbc, +/* 1e2 - _0F_E2 */ 0xedc8, +/* 1e3 - _0F_E3 */ 0xedd4, +/* 1e4 - _0F_E4 */ 0xede0, +/* 1e5 - _0F_E5 */ 0xedec, +/* 1e6 - _0F_E6 */ 0xedf8, +/* 1e7 - _0F_E7 */ 0xee04, +/* 1e8 - _0F_E8 */ 0xee10, +/* 1e9 - _0F_E9 */ 0xee1c, +/* 1ea - _0F_EA */ 0xee28, +/* 1eb - _0F_EB */ 0xee34, +/* 1ec - _0F_EC */ 0xee40, +/* 1ed - _0F_ED */ 0xee4c, +/* 1ee - _0F_EE */ 0xee58, +/* 1ef - _0F_EF */ 0xee64, +/* 1f0 - _0F_F0 */ 0xee70, +/* 1f1 - _0F_F1 */ 0xee7c, +/* 1f2 - _0F_F2 */ 0xee88, +/* 1f3 - _0F_F3 */ 0xee94, +/* 1f4 - _0F_F4 */ 0xeea0, +/* 1f5 - _0F_F5 */ 0xeeac, +/* 1f6 - _0F_F6 */ 0xeeb8, +/* 1f7 - _0F_F7 */ 0xeec4, +/* 1f8 - _0F_F8 */ 0xeed0, +/* 1f9 - _0F_F9 */ 0xeedc, +/* 1fa - _0F_FA */ 0xeee8, +/* 1fb - _0F_FB */ 0xeef4, +/* 1fc - _0F_FC */ 0xef00, +/* 1fd - _0F_FD */ 0xef0c, +/* 1fe - _0F_FE */ 0xef18, /* 1ff - */ 0, /* 200 - _80_00 */ 0x213a, /* 201 - _80_01 */ 0x213b, @@ -2590,8 +2592,8 @@ _InstNode InstructionsTree[5688] = { /* 333 - _D9_03 */ 0x21d9, /* 334 - _D9_04 */ 0x21da, /* 335 - _D9_05 */ 0x21db, -/* 336 - _D9_06 */ 0xcf24, -/* 337 - _D9_07 */ 0xcf30, +/* 336 - _D9_06 */ 0xef24, +/* 337 - _D9_07 */ 0xef30, /* 338 - _D9_C0 */ 0x21dc, /* 339 - _D9_C0 */ 0x21dd, /* 33a - _D9_C0 */ 0x21de, @@ -2770,8 +2772,8 @@ _InstNode InstructionsTree[5688] = { /* 3e7 - _DB_D8 */ 0x2256, /* 3e8 - _DB_E0 */ 0x2257, /* 3e9 - _DB_E1 */ 0x2258, -/* 3ea - _DB_E2 */ 0xcf3c, -/* 3eb - _DB_E3 */ 0xcf48, +/* 3ea - _DB_E2 */ 0xef3c, +/* 3eb - _DB_E3 */ 0xef48, /* 3ec - _DB_E4 */ 0x2259, /* 3ed - */ 0, /* 3ee - */ 0, @@ -2878,8 +2880,8 @@ _InstNode InstructionsTree[5688] = { /* 453 - _DD_03 */ 0x22a5, /* 454 - _DD_04 */ 0x22a6, /* 455 - */ 0, -/* 456 - _DD_06 */ 0xcf54, -/* 457 - _DD_07 */ 0xcf60, +/* 456 - _DD_06 */ 0xef54, +/* 457 - _DD_07 */ 0xef60, /* 458 - _DD_C0 */ 0x22a7, /* 459 - _DD_C0 */ 0x22a8, /* 45a - _DD_C0 */ 0x22a9, @@ -3056,7 +3058,7 @@ _InstNode InstructionsTree[5688] = { /* 505 - */ 0, /* 506 - */ 0, /* 507 - */ 0, -/* 508 - _DF_E0 */ 0xcf6c, +/* 508 - _DF_E0 */ 0xef6c, /* 509 - */ 0, /* 50a - */ 0, /* 50b - */ 0, @@ -3146,28 +3148,28 @@ _InstNode InstructionsTree[5688] = { /* 55f - */ 0, /* 560 - _0F_01_C8 */ 0x2348, /* 561 - _0F_01_C9 */ 0x2349, -/* 562 - */ 0, -/* 563 - */ 0, +/* 562 - _0F_01_CA */ 0x234a, +/* 563 - _0F_01_CB */ 0x234b, /* 564 - */ 0, /* 565 - */ 0, /* 566 - */ 0, /* 567 - */ 0, -/* 568 - _0F_01_D0 */ 0x234a, -/* 569 - _0F_01_D1 */ 0x234b, +/* 568 - _0F_01_D0 */ 0x234c, +/* 569 - _0F_01_D1 */ 0x234d, /* 56a - */ 0, /* 56b - */ 0, -/* 56c - _0F_01_D4 */ 0x234c, -/* 56d - _0F_01_D5 */ 0x234d, +/* 56c - _0F_01_D4 */ 0x234e, +/* 56d - _0F_01_D5 */ 0x234f, /* 56e - */ 0, /* 56f - */ 0, -/* 570 - _0F_01_D8 */ 0x234e, -/* 571 - _0F_01_D9 */ 0x234f, -/* 572 - _0F_01_DA */ 0x2350, -/* 573 - _0F_01_DB */ 0x2351, -/* 574 - _0F_01_DC */ 0x2352, -/* 575 - _0F_01_DD */ 0x2353, -/* 576 - _0F_01_DE */ 0x2354, -/* 577 - _0F_01_DF */ 0x2355, +/* 570 - _0F_01_D8 */ 0x2350, +/* 571 - _0F_01_D9 */ 0x2351, +/* 572 - _0F_01_DA */ 0x2352, +/* 573 - _0F_01_DB */ 0x2353, +/* 574 - _0F_01_DC */ 0x2354, +/* 575 - _0F_01_DD */ 0x2355, +/* 576 - _0F_01_DE */ 0x2356, +/* 577 - _0F_01_DF */ 0x2357, /* 578 - */ 0, /* 579 - */ 0, /* 57a - */ 0, @@ -3192,16 +3194,16 @@ _InstNode InstructionsTree[5688] = { /* 58d - */ 0, /* 58e - */ 0, /* 58f - */ 0, -/* 590 - _0F_01_F8 */ 0x2356, -/* 591 - _0F_01_F9 */ 0x2357, +/* 590 - _0F_01_F8 */ 0x2358, +/* 591 - _0F_01_F9 */ 0x2359, /* 592 - */ 0, /* 593 - */ 0, /* 594 - */ 0, /* 595 - */ 0, /* 596 - */ 0, /* 597 - */ 0, -/* 598 - _0F_0D_00 */ 0x2358, -/* 599 - _0F_0D_01 */ 0x2359, +/* 598 - _0F_0D_00 */ 0x235a, +/* 599 - _0F_0D_01 */ 0x235b, /* 59a - */ 0, /* 59b - */ 0, /* 59c - */ 0, @@ -3220,8 +3222,8 @@ _InstNode InstructionsTree[5688] = { /* 5a9 - */ 0, /* 5aa - */ 0, /* 5ab - */ 0, -/* 5ac - _0F_0F_0C */ 0x235a, -/* 5ad - _0F_0F_0D */ 0x235b, +/* 5ac - _0F_0F_0C */ 0x235c, +/* 5ad - _0F_0F_0D */ 0x235d, /* 5ae - */ 0, /* 5af - */ 0, /* 5b0 - */ 0, @@ -3236,8 +3238,8 @@ _InstNode InstructionsTree[5688] = { /* 5b9 - */ 0, /* 5ba - */ 0, /* 5bb - */ 0, -/* 5bc - _0F_0F_1C */ 0x235c, -/* 5bd - _0F_0F_1D */ 0x235d, +/* 5bc - _0F_0F_1C */ 0x235e, +/* 5bd - _0F_0F_1D */ 0x235f, /* 5be - */ 0, /* 5bf - */ 0, /* 5c0 - */ 0, @@ -3346,60 +3348,60 @@ _InstNode InstructionsTree[5688] = { /* 627 - */ 0, /* 628 - */ 0, /* 629 - */ 0, -/* 62a - _0F_0F_8A */ 0x235e, +/* 62a - _0F_0F_8A */ 0x2360, /* 62b - */ 0, /* 62c - */ 0, /* 62d - */ 0, -/* 62e - _0F_0F_8E */ 0x235f, +/* 62e - _0F_0F_8E */ 0x2361, /* 62f - */ 0, -/* 630 - _0F_0F_90 */ 0x2360, +/* 630 - _0F_0F_90 */ 0x2362, /* 631 - */ 0, /* 632 - */ 0, /* 633 - */ 0, -/* 634 - _0F_0F_94 */ 0x2361, +/* 634 - _0F_0F_94 */ 0x2363, /* 635 - */ 0, -/* 636 - _0F_0F_96 */ 0x2362, -/* 637 - _0F_0F_97 */ 0x2363, +/* 636 - _0F_0F_96 */ 0x2364, +/* 637 - _0F_0F_97 */ 0x2365, /* 638 - */ 0, /* 639 - */ 0, -/* 63a - _0F_0F_9A */ 0x2364, +/* 63a - _0F_0F_9A */ 0x2366, /* 63b - */ 0, /* 63c - */ 0, /* 63d - */ 0, -/* 63e - _0F_0F_9E */ 0x2365, +/* 63e - _0F_0F_9E */ 0x2367, /* 63f - */ 0, -/* 640 - _0F_0F_A0 */ 0x2366, +/* 640 - _0F_0F_A0 */ 0x2368, /* 641 - */ 0, /* 642 - */ 0, /* 643 - */ 0, -/* 644 - _0F_0F_A4 */ 0x2367, +/* 644 - _0F_0F_A4 */ 0x2369, /* 645 - */ 0, -/* 646 - _0F_0F_A6 */ 0x2368, -/* 647 - _0F_0F_A7 */ 0x2369, +/* 646 - _0F_0F_A6 */ 0x236a, +/* 647 - _0F_0F_A7 */ 0x236b, /* 648 - */ 0, /* 649 - */ 0, -/* 64a - _0F_0F_AA */ 0x236a, +/* 64a - _0F_0F_AA */ 0x236c, /* 64b - */ 0, /* 64c - */ 0, /* 64d - */ 0, -/* 64e - _0F_0F_AE */ 0x236b, +/* 64e - _0F_0F_AE */ 0x236d, /* 64f - */ 0, -/* 650 - _0F_0F_B0 */ 0x236c, +/* 650 - _0F_0F_B0 */ 0x236e, /* 651 - */ 0, /* 652 - */ 0, /* 653 - */ 0, -/* 654 - _0F_0F_B4 */ 0x236d, +/* 654 - _0F_0F_B4 */ 0x236f, /* 655 - */ 0, -/* 656 - _0F_0F_B6 */ 0x236e, -/* 657 - _0F_0F_B7 */ 0x236f, +/* 656 - _0F_0F_B6 */ 0x2370, +/* 657 - _0F_0F_B7 */ 0x2371, /* 658 - */ 0, /* 659 - */ 0, /* 65a - */ 0, -/* 65b - _0F_0F_BB */ 0x2370, +/* 65b - _0F_0F_BB */ 0x2372, /* 65c - */ 0, /* 65d - */ 0, /* 65e - */ 0, -/* 65f - _0F_0F_BF */ 0x2371, +/* 65f - _0F_0F_BF */ 0x2373, /* 660 - */ 0, /* 661 - */ 0, /* 662 - */ 0, @@ -3464,10 +3466,10 @@ _InstNode InstructionsTree[5688] = { /* 69d - */ 0, /* 69e - */ 0, /* 69f - */ 0, -/* 6a0 - _0F_10 */ 0x2372, -/* 6a1 - _66_0F_10 */ 0x2373, -/* 6a2 - _F3_0F_10 */ 0x2374, -/* 6a3 - _F2_0F_10 */ 0x2375, +/* 6a0 - _0F_10 */ 0x2374, +/* 6a1 - _66_0F_10 */ 0x2375, +/* 6a2 - _F3_0F_10 */ 0x2376, +/* 6a3 - _F2_0F_10 */ 0x2377, /* 6a4 - _V_0F_10 */ 0x4009, /* 6a5 - _V_66_0F_10 */ 0x400a, /* 6a6 - _V_F3_0F_10 */ 0x400b, @@ -3476,10 +3478,10 @@ _InstNode InstructionsTree[5688] = { /* 6a9 - */ 0, /* 6aa - _VRR_F3_0F_10 */ 0x400d, /* 6ab - _VRR_F2_0F_10 */ 0x400e, -/* 6ac - _0F_11 */ 0x2376, -/* 6ad - _66_0F_11 */ 0x2377, -/* 6ae - _F3_0F_11 */ 0x2378, -/* 6af - _F2_0F_11 */ 0x2379, +/* 6ac - _0F_11 */ 0x2378, +/* 6ad - _66_0F_11 */ 0x2379, +/* 6ae - _F3_0F_11 */ 0x237a, +/* 6af - _F2_0F_11 */ 0x237b, /* 6b0 - _V_0F_11 */ 0x400f, /* 6b1 - _V_66_0F_11 */ 0x4010, /* 6b2 - _V_F3_0F_11 */ 0x4011, @@ -3489,9 +3491,9 @@ _InstNode InstructionsTree[5688] = { /* 6b6 - _VRR_F3_0F_11 */ 0x4013, /* 6b7 - _VRR_F2_0F_11 */ 0x4014, /* 6b8 - _0F_12 */ 0x4015, -/* 6b9 - _66_0F_12 */ 0x237a, -/* 6ba - _F3_0F_12 */ 0x237b, -/* 6bb - _F2_0F_12 */ 0x237c, +/* 6b9 - _66_0F_12 */ 0x237c, +/* 6ba - _F3_0F_12 */ 0x237d, +/* 6bb - _F2_0F_12 */ 0x237e, /* 6bc - _V_0F_12 */ 0x4016, /* 6bd - _V_66_0F_12 */ 0x4017, /* 6be - _V_F3_0F_12 */ 0x4018, @@ -3500,8 +3502,8 @@ _InstNode InstructionsTree[5688] = { /* 6c1 - */ 0, /* 6c2 - */ 0, /* 6c3 - */ 0, -/* 6c4 - _0F_13 */ 0x237d, -/* 6c5 - _66_0F_13 */ 0x237e, +/* 6c4 - _0F_13 */ 0x237f, +/* 6c5 - _66_0F_13 */ 0x2380, /* 6c6 - */ 0, /* 6c7 - */ 0, /* 6c8 - _V_0F_13 */ 0x401a, @@ -3512,8 +3514,8 @@ _InstNode InstructionsTree[5688] = { /* 6cd - */ 0, /* 6ce - */ 0, /* 6cf - */ 0, -/* 6d0 - _0F_14 */ 0x237f, -/* 6d1 - _66_0F_14 */ 0x2380, +/* 6d0 - _0F_14 */ 0x2381, +/* 6d1 - _66_0F_14 */ 0x2382, /* 6d2 - */ 0, /* 6d3 - */ 0, /* 6d4 - _V_0F_14 */ 0x401c, @@ -3524,8 +3526,8 @@ _InstNode InstructionsTree[5688] = { /* 6d9 - */ 0, /* 6da - */ 0, /* 6db - */ 0, -/* 6dc - _0F_15 */ 0x2381, -/* 6dd - _66_0F_15 */ 0x2382, +/* 6dc - _0F_15 */ 0x2383, +/* 6dd - _66_0F_15 */ 0x2384, /* 6de - */ 0, /* 6df - */ 0, /* 6e0 - _V_0F_15 */ 0x401e, @@ -3537,8 +3539,8 @@ _InstNode InstructionsTree[5688] = { /* 6e6 - */ 0, /* 6e7 - */ 0, /* 6e8 - _0F_16 */ 0x4020, -/* 6e9 - _66_0F_16 */ 0x2383, -/* 6ea - _F3_0F_16 */ 0x2384, +/* 6e9 - _66_0F_16 */ 0x2385, +/* 6ea - _F3_0F_16 */ 0x2386, /* 6eb - */ 0, /* 6ec - _V_0F_16 */ 0x4021, /* 6ed - _V_66_0F_16 */ 0x4022, @@ -3548,8 +3550,8 @@ _InstNode InstructionsTree[5688] = { /* 6f1 - */ 0, /* 6f2 - */ 0, /* 6f3 - */ 0, -/* 6f4 - _0F_17 */ 0x2385, -/* 6f5 - _66_0F_17 */ 0x2386, +/* 6f4 - _0F_17 */ 0x2387, +/* 6f5 - _66_0F_17 */ 0x2388, /* 6f6 - */ 0, /* 6f7 - */ 0, /* 6f8 - _V_0F_17 */ 0x4024, @@ -3560,16 +3562,16 @@ _InstNode InstructionsTree[5688] = { /* 6fd - */ 0, /* 6fe - */ 0, /* 6ff - */ 0, -/* 700 - _0F_18_00 */ 0x2387, -/* 701 - _0F_18_01 */ 0x2388, -/* 702 - _0F_18_02 */ 0x2389, -/* 703 - _0F_18_03 */ 0x238a, +/* 700 - _0F_18_00 */ 0x2389, +/* 701 - _0F_18_01 */ 0x238a, +/* 702 - _0F_18_02 */ 0x238b, +/* 703 - _0F_18_03 */ 0x238c, /* 704 - */ 0, /* 705 - */ 0, /* 706 - */ 0, /* 707 - */ 0, -/* 708 - _0F_28 */ 0x238b, -/* 709 - _66_0F_28 */ 0x238c, +/* 708 - _0F_28 */ 0x238d, +/* 709 - _66_0F_28 */ 0x238e, /* 70a - */ 0, /* 70b - */ 0, /* 70c - _V_0F_28 */ 0x4026, @@ -3580,8 +3582,8 @@ _InstNode InstructionsTree[5688] = { /* 711 - */ 0, /* 712 - */ 0, /* 713 - */ 0, -/* 714 - _0F_29 */ 0x238d, -/* 715 - _66_0F_29 */ 0x238e, +/* 714 - _0F_29 */ 0x238f, +/* 715 - _66_0F_29 */ 0x2390, /* 716 - */ 0, /* 717 - */ 0, /* 718 - _V_0F_29 */ 0x4028, @@ -3592,10 +3594,10 @@ _InstNode InstructionsTree[5688] = { /* 71d - */ 0, /* 71e - */ 0, /* 71f - */ 0, -/* 720 - _0F_2A */ 0x238f, -/* 721 - _66_0F_2A */ 0x2390, -/* 722 - _F3_0F_2A */ 0x2391, -/* 723 - _F2_0F_2A */ 0x2392, +/* 720 - _0F_2A */ 0x2391, +/* 721 - _66_0F_2A */ 0x2392, +/* 722 - _F3_0F_2A */ 0x2393, +/* 723 - _F2_0F_2A */ 0x2394, /* 724 - */ 0, /* 725 - */ 0, /* 726 - _V_F3_0F_2A */ 0x402a, @@ -3604,10 +3606,10 @@ _InstNode InstructionsTree[5688] = { /* 729 - */ 0, /* 72a - */ 0, /* 72b - */ 0, -/* 72c - _0F_2B */ 0x2393, -/* 72d - _66_0F_2B */ 0x2394, -/* 72e - _F3_0F_2B */ 0x2395, -/* 72f - _F2_0F_2B */ 0x2396, +/* 72c - _0F_2B */ 0x2395, +/* 72d - _66_0F_2B */ 0x2396, +/* 72e - _F3_0F_2B */ 0x2397, +/* 72f - _F2_0F_2B */ 0x2398, /* 730 - _V_0F_2B */ 0x402c, /* 731 - _V_66_0F_2B */ 0x402d, /* 732 - */ 0, @@ -3616,10 +3618,10 @@ _InstNode InstructionsTree[5688] = { /* 735 - */ 0, /* 736 - */ 0, /* 737 - */ 0, -/* 738 - _0F_2C */ 0x2397, -/* 739 - _66_0F_2C */ 0x2398, -/* 73a - _F3_0F_2C */ 0x2399, -/* 73b - _F2_0F_2C */ 0x239a, +/* 738 - _0F_2C */ 0x2399, +/* 739 - _66_0F_2C */ 0x239a, +/* 73a - _F3_0F_2C */ 0x239b, +/* 73b - _F2_0F_2C */ 0x239c, /* 73c - */ 0, /* 73d - */ 0, /* 73e - _V_F3_0F_2C */ 0x402e, @@ -3628,10 +3630,10 @@ _InstNode InstructionsTree[5688] = { /* 741 - */ 0, /* 742 - */ 0, /* 743 - */ 0, -/* 744 - _0F_2D */ 0x239b, -/* 745 - _66_0F_2D */ 0x239c, -/* 746 - _F3_0F_2D */ 0x239d, -/* 747 - _F2_0F_2D */ 0x239e, +/* 744 - _0F_2D */ 0x239d, +/* 745 - _66_0F_2D */ 0x239e, +/* 746 - _F3_0F_2D */ 0x239f, +/* 747 - _F2_0F_2D */ 0x23a0, /* 748 - */ 0, /* 749 - */ 0, /* 74a - _V_F3_0F_2D */ 0x4030, @@ -3640,8 +3642,8 @@ _InstNode InstructionsTree[5688] = { /* 74d - */ 0, /* 74e - */ 0, /* 74f - */ 0, -/* 750 - _0F_2E */ 0x239f, -/* 751 - _66_0F_2E */ 0x23a0, +/* 750 - _0F_2E */ 0x23a1, +/* 751 - _66_0F_2E */ 0x23a2, /* 752 - */ 0, /* 753 - */ 0, /* 754 - _V_0F_2E */ 0x4032, @@ -3652,8 +3654,8 @@ _InstNode InstructionsTree[5688] = { /* 759 - */ 0, /* 75a - */ 0, /* 75b - */ 0, -/* 75c - _0F_2F */ 0x23a1, -/* 75d - _66_0F_2F */ 0x23a2, +/* 75c - _0F_2F */ 0x23a3, +/* 75d - _66_0F_2F */ 0x23a4, /* 75e - */ 0, /* 75f - */ 0, /* 760 - _V_0F_2F */ 0x4034, @@ -3664,72 +3666,72 @@ _InstNode InstructionsTree[5688] = { /* 765 - */ 0, /* 766 - */ 0, /* 767 - */ 0, -/* 768 - _0F_38_00 */ 0xcf78, -/* 769 - _0F_38_01 */ 0xcf84, -/* 76a - _0F_38_02 */ 0xcf90, -/* 76b - _0F_38_03 */ 0xcf9c, -/* 76c - _0F_38_04 */ 0xcfa8, -/* 76d - _0F_38_05 */ 0xcfb4, -/* 76e - _0F_38_06 */ 0xcfc0, -/* 76f - _0F_38_07 */ 0xcfcc, -/* 770 - _0F_38_08 */ 0xcfd8, -/* 771 - _0F_38_09 */ 0xcfe4, -/* 772 - _0F_38_0A */ 0xcff0, -/* 773 - _0F_38_0B */ 0xcffc, -/* 774 - _0F_38_0C */ 0xd008, -/* 775 - _0F_38_0D */ 0xd014, -/* 776 - _0F_38_0E */ 0xd020, -/* 777 - _0F_38_0F */ 0xd02c, -/* 778 - _0F_38_10 */ 0xd038, +/* 768 - _0F_38_00 */ 0xef78, +/* 769 - _0F_38_01 */ 0xef84, +/* 76a - _0F_38_02 */ 0xef90, +/* 76b - _0F_38_03 */ 0xef9c, +/* 76c - _0F_38_04 */ 0xefa8, +/* 76d - _0F_38_05 */ 0xefb4, +/* 76e - _0F_38_06 */ 0xefc0, +/* 76f - _0F_38_07 */ 0xefcc, +/* 770 - _0F_38_08 */ 0xefd8, +/* 771 - _0F_38_09 */ 0xefe4, +/* 772 - _0F_38_0A */ 0xeff0, +/* 773 - _0F_38_0B */ 0xeffc, +/* 774 - _0F_38_0C */ 0xf008, +/* 775 - _0F_38_0D */ 0xf014, +/* 776 - _0F_38_0E */ 0xf020, +/* 777 - _0F_38_0F */ 0xf02c, +/* 778 - _0F_38_10 */ 0xf038, /* 779 - */ 0, /* 77a - */ 0, /* 77b - */ 0, -/* 77c - _0F_38_14 */ 0xd044, -/* 77d - _0F_38_15 */ 0xd050, +/* 77c - _0F_38_14 */ 0xf044, +/* 77d - _0F_38_15 */ 0xf050, /* 77e - */ 0, -/* 77f - _0F_38_17 */ 0xd05c, -/* 780 - _0F_38_18 */ 0xd068, -/* 781 - _0F_38_19 */ 0xd074, -/* 782 - _0F_38_1A */ 0xd080, +/* 77f - _0F_38_17 */ 0xf05c, +/* 780 - _0F_38_18 */ 0xf068, +/* 781 - _0F_38_19 */ 0xf074, +/* 782 - _0F_38_1A */ 0xf080, /* 783 - */ 0, -/* 784 - _0F_38_1C */ 0xd08c, -/* 785 - _0F_38_1D */ 0xd098, -/* 786 - _0F_38_1E */ 0xd0a4, +/* 784 - _0F_38_1C */ 0xf08c, +/* 785 - _0F_38_1D */ 0xf098, +/* 786 - _0F_38_1E */ 0xf0a4, /* 787 - */ 0, -/* 788 - _0F_38_20 */ 0xd0b0, -/* 789 - _0F_38_21 */ 0xd0bc, -/* 78a - _0F_38_22 */ 0xd0c8, -/* 78b - _0F_38_23 */ 0xd0d4, -/* 78c - _0F_38_24 */ 0xd0e0, -/* 78d - _0F_38_25 */ 0xd0ec, +/* 788 - _0F_38_20 */ 0xf0b0, +/* 789 - _0F_38_21 */ 0xf0bc, +/* 78a - _0F_38_22 */ 0xf0c8, +/* 78b - _0F_38_23 */ 0xf0d4, +/* 78c - _0F_38_24 */ 0xf0e0, +/* 78d - _0F_38_25 */ 0xf0ec, /* 78e - */ 0, /* 78f - */ 0, -/* 790 - _0F_38_28 */ 0xd0f8, -/* 791 - _0F_38_29 */ 0xd104, -/* 792 - _0F_38_2A */ 0xd110, -/* 793 - _0F_38_2B */ 0xd11c, -/* 794 - _0F_38_2C */ 0xd128, -/* 795 - _0F_38_2D */ 0xd134, -/* 796 - _0F_38_2E */ 0xd140, -/* 797 - _0F_38_2F */ 0xd14c, -/* 798 - _0F_38_30 */ 0xd158, -/* 799 - _0F_38_31 */ 0xd164, -/* 79a - _0F_38_32 */ 0xd170, -/* 79b - _0F_38_33 */ 0xd17c, -/* 79c - _0F_38_34 */ 0xd188, -/* 79d - _0F_38_35 */ 0xd194, +/* 790 - _0F_38_28 */ 0xf0f8, +/* 791 - _0F_38_29 */ 0xf104, +/* 792 - _0F_38_2A */ 0xf110, +/* 793 - _0F_38_2B */ 0xf11c, +/* 794 - _0F_38_2C */ 0xf128, +/* 795 - _0F_38_2D */ 0xf134, +/* 796 - _0F_38_2E */ 0xf140, +/* 797 - _0F_38_2F */ 0xf14c, +/* 798 - _0F_38_30 */ 0xf158, +/* 799 - _0F_38_31 */ 0xf164, +/* 79a - _0F_38_32 */ 0xf170, +/* 79b - _0F_38_33 */ 0xf17c, +/* 79c - _0F_38_34 */ 0xf188, +/* 79d - _0F_38_35 */ 0xf194, /* 79e - */ 0, -/* 79f - _0F_38_37 */ 0xd1a0, -/* 7a0 - _0F_38_38 */ 0xd1ac, -/* 7a1 - _0F_38_39 */ 0xd1b8, -/* 7a2 - _0F_38_3A */ 0xd1c4, -/* 7a3 - _0F_38_3B */ 0xd1d0, -/* 7a4 - _0F_38_3C */ 0xd1dc, -/* 7a5 - _0F_38_3D */ 0xd1e8, -/* 7a6 - _0F_38_3E */ 0xd1f4, -/* 7a7 - _0F_38_3F */ 0xd200, -/* 7a8 - _0F_38_40 */ 0xd20c, -/* 7a9 - _0F_38_41 */ 0xd218, +/* 79f - _0F_38_37 */ 0xf1a0, +/* 7a0 - _0F_38_38 */ 0xf1ac, +/* 7a1 - _0F_38_39 */ 0xf1b8, +/* 7a2 - _0F_38_3A */ 0xf1c4, +/* 7a3 - _0F_38_3B */ 0xf1d0, +/* 7a4 - _0F_38_3C */ 0xf1dc, +/* 7a5 - _0F_38_3D */ 0xf1e8, +/* 7a6 - _0F_38_3E */ 0xf1f4, +/* 7a7 - _0F_38_3F */ 0xf200, +/* 7a8 - _0F_38_40 */ 0xf20c, +/* 7a9 - _0F_38_41 */ 0xf218, /* 7aa - */ 0, /* 7ab - */ 0, /* 7ac - */ 0, @@ -3792,9 +3794,9 @@ _InstNode InstructionsTree[5688] = { /* 7e5 - */ 0, /* 7e6 - */ 0, /* 7e7 - */ 0, -/* 7e8 - _0F_38_80 */ 0xd224, -/* 7e9 - _0F_38_81 */ 0xd230, -/* 7ea - _0F_38_82 */ 0xd23c, +/* 7e8 - _0F_38_80 */ 0xf224, +/* 7e9 - _0F_38_81 */ 0xf230, +/* 7ea - _0F_38_82 */ 0xf23c, /* 7eb - */ 0, /* 7ec - */ 0, /* 7ed - */ 0, @@ -3814,48 +3816,48 @@ _InstNode InstructionsTree[5688] = { /* 7fb - */ 0, /* 7fc - */ 0, /* 7fd - */ 0, -/* 7fe - _0F_38_96 */ 0xd248, -/* 7ff - _0F_38_97 */ 0xd254, -/* 800 - _0F_38_98 */ 0xd260, -/* 801 - _0F_38_99 */ 0xd26c, -/* 802 - _0F_38_9A */ 0xd278, -/* 803 - _0F_38_9B */ 0xd284, -/* 804 - _0F_38_9C */ 0xd290, -/* 805 - _0F_38_9D */ 0xd29c, -/* 806 - _0F_38_9E */ 0xd2a8, -/* 807 - _0F_38_9F */ 0xd2b4, +/* 7fe - _0F_38_96 */ 0xf248, +/* 7ff - _0F_38_97 */ 0xf254, +/* 800 - _0F_38_98 */ 0xf260, +/* 801 - _0F_38_99 */ 0xf26c, +/* 802 - _0F_38_9A */ 0xf278, +/* 803 - _0F_38_9B */ 0xf284, +/* 804 - _0F_38_9C */ 0xf290, +/* 805 - _0F_38_9D */ 0xf29c, +/* 806 - _0F_38_9E */ 0xf2a8, +/* 807 - _0F_38_9F */ 0xf2b4, /* 808 - */ 0, /* 809 - */ 0, /* 80a - */ 0, /* 80b - */ 0, /* 80c - */ 0, /* 80d - */ 0, -/* 80e - _0F_38_A6 */ 0xd2c0, -/* 80f - _0F_38_A7 */ 0xd2cc, -/* 810 - _0F_38_A8 */ 0xd2d8, -/* 811 - _0F_38_A9 */ 0xd2e4, -/* 812 - _0F_38_AA */ 0xd2f0, -/* 813 - _0F_38_AB */ 0xd2fc, -/* 814 - _0F_38_AC */ 0xd308, -/* 815 - _0F_38_AD */ 0xd314, -/* 816 - _0F_38_AE */ 0xd320, -/* 817 - _0F_38_AF */ 0xd32c, +/* 80e - _0F_38_A6 */ 0xf2c0, +/* 80f - _0F_38_A7 */ 0xf2cc, +/* 810 - _0F_38_A8 */ 0xf2d8, +/* 811 - _0F_38_A9 */ 0xf2e4, +/* 812 - _0F_38_AA */ 0xf2f0, +/* 813 - _0F_38_AB */ 0xf2fc, +/* 814 - _0F_38_AC */ 0xf308, +/* 815 - _0F_38_AD */ 0xf314, +/* 816 - _0F_38_AE */ 0xf320, +/* 817 - _0F_38_AF */ 0xf32c, /* 818 - */ 0, /* 819 - */ 0, /* 81a - */ 0, /* 81b - */ 0, /* 81c - */ 0, /* 81d - */ 0, -/* 81e - _0F_38_B6 */ 0xd338, -/* 81f - _0F_38_B7 */ 0xd344, -/* 820 - _0F_38_B8 */ 0xd350, -/* 821 - _0F_38_B9 */ 0xd35c, -/* 822 - _0F_38_BA */ 0xd368, -/* 823 - _0F_38_BB */ 0xd374, -/* 824 - _0F_38_BC */ 0xd380, -/* 825 - _0F_38_BD */ 0xd38c, -/* 826 - _0F_38_BE */ 0xd398, -/* 827 - _0F_38_BF */ 0xd3a4, +/* 81e - _0F_38_B6 */ 0xf338, +/* 81f - _0F_38_B7 */ 0xf344, +/* 820 - _0F_38_B8 */ 0xf350, +/* 821 - _0F_38_B9 */ 0xf35c, +/* 822 - _0F_38_BA */ 0xf368, +/* 823 - _0F_38_BB */ 0xf374, +/* 824 - _0F_38_BC */ 0xf380, +/* 825 - _0F_38_BD */ 0xf38c, +/* 826 - _0F_38_BE */ 0xf398, +/* 827 - _0F_38_BF */ 0xf3a4, /* 828 - */ 0, /* 829 - */ 0, /* 82a - */ 0, @@ -3883,11 +3885,11 @@ _InstNode InstructionsTree[5688] = { /* 840 - */ 0, /* 841 - */ 0, /* 842 - */ 0, -/* 843 - _0F_38_DB */ 0xd3b0, -/* 844 - _0F_38_DC */ 0xd3bc, -/* 845 - _0F_38_DD */ 0xd3c8, -/* 846 - _0F_38_DE */ 0xd3d4, -/* 847 - _0F_38_DF */ 0xd3e0, +/* 843 - _0F_38_DB */ 0xf3b0, +/* 844 - _0F_38_DC */ 0xf3bc, +/* 845 - _0F_38_DD */ 0xf3c8, +/* 846 - _0F_38_DE */ 0xf3d4, +/* 847 - _0F_38_DF */ 0xf3e0, /* 848 - */ 0, /* 849 - */ 0, /* 84a - */ 0, @@ -3904,8 +3906,8 @@ _InstNode InstructionsTree[5688] = { /* 855 - */ 0, /* 856 - */ 0, /* 857 - */ 0, -/* 858 - _0F_38_F0 */ 0xd3ec, -/* 859 - _0F_38_F1 */ 0xd3f8, +/* 858 - _0F_38_F0 */ 0xf3ec, +/* 859 - _0F_38_F1 */ 0xf3f8, /* 85a - */ 0, /* 85b - */ 0, /* 85c - */ 0, @@ -3924,37 +3926,37 @@ _InstNode InstructionsTree[5688] = { /* 869 - */ 0, /* 86a - */ 0, /* 86b - */ 0, -/* 86c - _0F_3A_04 */ 0xd404, -/* 86d - _0F_3A_05 */ 0xd410, -/* 86e - _0F_3A_06 */ 0xd41c, +/* 86c - _0F_3A_04 */ 0xf404, +/* 86d - _0F_3A_05 */ 0xf410, +/* 86e - _0F_3A_06 */ 0xf41c, /* 86f - */ 0, -/* 870 - _0F_3A_08 */ 0xd428, -/* 871 - _0F_3A_09 */ 0xd434, -/* 872 - _0F_3A_0A */ 0xd440, -/* 873 - _0F_3A_0B */ 0xd44c, -/* 874 - _0F_3A_0C */ 0xd458, -/* 875 - _0F_3A_0D */ 0xd464, -/* 876 - _0F_3A_0E */ 0xd470, -/* 877 - _0F_3A_0F */ 0xd47c, +/* 870 - _0F_3A_08 */ 0xf428, +/* 871 - _0F_3A_09 */ 0xf434, +/* 872 - _0F_3A_0A */ 0xf440, +/* 873 - _0F_3A_0B */ 0xf44c, +/* 874 - _0F_3A_0C */ 0xf458, +/* 875 - _0F_3A_0D */ 0xf464, +/* 876 - _0F_3A_0E */ 0xf470, +/* 877 - _0F_3A_0F */ 0xf47c, /* 878 - */ 0, /* 879 - */ 0, /* 87a - */ 0, /* 87b - */ 0, -/* 87c - _0F_3A_14 */ 0xd488, -/* 87d - _0F_3A_15 */ 0xd494, -/* 87e - _0F_3A_16 */ 0xd4a0, -/* 87f - _0F_3A_17 */ 0xd4ac, -/* 880 - _0F_3A_18 */ 0xd4b8, -/* 881 - _0F_3A_19 */ 0xd4c4, +/* 87c - _0F_3A_14 */ 0xf488, +/* 87d - _0F_3A_15 */ 0xf494, +/* 87e - _0F_3A_16 */ 0xf4a0, +/* 87f - _0F_3A_17 */ 0xf4ac, +/* 880 - _0F_3A_18 */ 0xf4b8, +/* 881 - _0F_3A_19 */ 0xf4c4, /* 882 - */ 0, /* 883 - */ 0, /* 884 - */ 0, /* 885 - */ 0, /* 886 - */ 0, /* 887 - */ 0, -/* 888 - _0F_3A_20 */ 0xd4d0, -/* 889 - _0F_3A_21 */ 0xd4dc, -/* 88a - _0F_3A_22 */ 0xd4e8, +/* 888 - _0F_3A_20 */ 0xf4d0, +/* 889 - _0F_3A_21 */ 0xf4dc, +/* 88a - _0F_3A_22 */ 0xf4e8, /* 88b - */ 0, /* 88c - */ 0, /* 88d - */ 0, @@ -3984,19 +3986,19 @@ _InstNode InstructionsTree[5688] = { /* 8a5 - */ 0, /* 8a6 - */ 0, /* 8a7 - */ 0, -/* 8a8 - _0F_3A_40 */ 0xd4f4, -/* 8a9 - _0F_3A_41 */ 0xd500, -/* 8aa - _0F_3A_42 */ 0xd50c, +/* 8a8 - _0F_3A_40 */ 0xf4f4, +/* 8a9 - _0F_3A_41 */ 0xf500, +/* 8aa - _0F_3A_42 */ 0xf50c, /* 8ab - */ 0, -/* 8ac - _0F_3A_44 */ 0xd518, +/* 8ac - _0F_3A_44 */ 0xf518, /* 8ad - */ 0, /* 8ae - */ 0, /* 8af - */ 0, /* 8b0 - */ 0, /* 8b1 - */ 0, -/* 8b2 - _0F_3A_4A */ 0xd524, -/* 8b3 - _0F_3A_4B */ 0xd530, -/* 8b4 - _0F_3A_4C */ 0xd53c, +/* 8b2 - _0F_3A_4A */ 0xf524, +/* 8b3 - _0F_3A_4B */ 0xf530, +/* 8b4 - _0F_3A_4C */ 0xf53c, /* 8b5 - */ 0, /* 8b6 - */ 0, /* 8b7 - */ 0, @@ -4016,10 +4018,10 @@ _InstNode InstructionsTree[5688] = { /* 8c5 - */ 0, /* 8c6 - */ 0, /* 8c7 - */ 0, -/* 8c8 - _0F_3A_60 */ 0xd548, -/* 8c9 - _0F_3A_61 */ 0xd554, -/* 8ca - _0F_3A_62 */ 0xd560, -/* 8cb - _0F_3A_63 */ 0xd56c, +/* 8c8 - _0F_3A_60 */ 0xf548, +/* 8c9 - _0F_3A_61 */ 0xf554, +/* 8ca - _0F_3A_62 */ 0xf560, +/* 8cb - _0F_3A_63 */ 0xf56c, /* 8cc - */ 0, /* 8cd - */ 0, /* 8ce - */ 0, @@ -4143,7 +4145,7 @@ _InstNode InstructionsTree[5688] = { /* 944 - */ 0, /* 945 - */ 0, /* 946 - */ 0, -/* 947 - _0F_3A_DF */ 0xd578, +/* 947 - _0F_3A_DF */ 0xf578, /* 948 - */ 0, /* 949 - */ 0, /* 94a - */ 0, @@ -4176,8 +4178,8 @@ _InstNode InstructionsTree[5688] = { /* 965 - */ 0, /* 966 - */ 0, /* 967 - */ 0, -/* 968 - _0F_50 */ 0x23a3, -/* 969 - _66_0F_50 */ 0x23a4, +/* 968 - _0F_50 */ 0x23a5, +/* 969 - _66_0F_50 */ 0x23a6, /* 96a - */ 0, /* 96b - */ 0, /* 96c - _V_0F_50 */ 0x4036, @@ -4188,10 +4190,10 @@ _InstNode InstructionsTree[5688] = { /* 971 - */ 0, /* 972 - */ 0, /* 973 - */ 0, -/* 974 - _0F_51 */ 0x23a5, -/* 975 - _66_0F_51 */ 0x23a6, -/* 976 - _F3_0F_51 */ 0x23a7, -/* 977 - _F2_0F_51 */ 0x23a8, +/* 974 - _0F_51 */ 0x23a7, +/* 975 - _66_0F_51 */ 0x23a8, +/* 976 - _F3_0F_51 */ 0x23a9, +/* 977 - _F2_0F_51 */ 0x23aa, /* 978 - _V_0F_51 */ 0x4038, /* 979 - _V_66_0F_51 */ 0x4039, /* 97a - _V_F3_0F_51 */ 0x403a, @@ -4200,9 +4202,9 @@ _InstNode InstructionsTree[5688] = { /* 97d - */ 0, /* 97e - */ 0, /* 97f - */ 0, -/* 980 - _0F_52 */ 0x23a9, +/* 980 - _0F_52 */ 0x23ab, /* 981 - */ 0, -/* 982 - _F3_0F_52 */ 0x23aa, +/* 982 - _F3_0F_52 */ 0x23ac, /* 983 - */ 0, /* 984 - _V_0F_52 */ 0x403c, /* 985 - */ 0, @@ -4212,9 +4214,9 @@ _InstNode InstructionsTree[5688] = { /* 989 - */ 0, /* 98a - */ 0, /* 98b - */ 0, -/* 98c - _0F_53 */ 0x23ab, +/* 98c - _0F_53 */ 0x23ad, /* 98d - */ 0, -/* 98e - _F3_0F_53 */ 0x23ac, +/* 98e - _F3_0F_53 */ 0x23ae, /* 98f - */ 0, /* 990 - _V_0F_53 */ 0x403e, /* 991 - */ 0, @@ -4224,8 +4226,8 @@ _InstNode InstructionsTree[5688] = { /* 995 - */ 0, /* 996 - */ 0, /* 997 - */ 0, -/* 998 - _0F_54 */ 0x23ad, -/* 999 - _66_0F_54 */ 0x23ae, +/* 998 - _0F_54 */ 0x23af, +/* 999 - _66_0F_54 */ 0x23b0, /* 99a - */ 0, /* 99b - */ 0, /* 99c - _V_0F_54 */ 0x4040, @@ -4236,8 +4238,8 @@ _InstNode InstructionsTree[5688] = { /* 9a1 - */ 0, /* 9a2 - */ 0, /* 9a3 - */ 0, -/* 9a4 - _0F_55 */ 0x23af, -/* 9a5 - _66_0F_55 */ 0x23b0, +/* 9a4 - _0F_55 */ 0x23b1, +/* 9a5 - _66_0F_55 */ 0x23b2, /* 9a6 - */ 0, /* 9a7 - */ 0, /* 9a8 - _V_0F_55 */ 0x4042, @@ -4248,8 +4250,8 @@ _InstNode InstructionsTree[5688] = { /* 9ad - */ 0, /* 9ae - */ 0, /* 9af - */ 0, -/* 9b0 - _0F_56 */ 0x23b1, -/* 9b1 - _66_0F_56 */ 0x23b2, +/* 9b0 - _0F_56 */ 0x23b3, +/* 9b1 - _66_0F_56 */ 0x23b4, /* 9b2 - */ 0, /* 9b3 - */ 0, /* 9b4 - _V_0F_56 */ 0x4044, @@ -4260,8 +4262,8 @@ _InstNode InstructionsTree[5688] = { /* 9b9 - */ 0, /* 9ba - */ 0, /* 9bb - */ 0, -/* 9bc - _0F_57 */ 0x23b3, -/* 9bd - _66_0F_57 */ 0x23b4, +/* 9bc - _0F_57 */ 0x23b5, +/* 9bd - _66_0F_57 */ 0x23b6, /* 9be - */ 0, /* 9bf - */ 0, /* 9c0 - _V_0F_57 */ 0x4046, @@ -4272,10 +4274,10 @@ _InstNode InstructionsTree[5688] = { /* 9c5 - */ 0, /* 9c6 - */ 0, /* 9c7 - */ 0, -/* 9c8 - _0F_58 */ 0x23b5, -/* 9c9 - _66_0F_58 */ 0x23b6, -/* 9ca - _F3_0F_58 */ 0x23b7, -/* 9cb - _F2_0F_58 */ 0x23b8, +/* 9c8 - _0F_58 */ 0x23b7, +/* 9c9 - _66_0F_58 */ 0x23b8, +/* 9ca - _F3_0F_58 */ 0x23b9, +/* 9cb - _F2_0F_58 */ 0x23ba, /* 9cc - _V_0F_58 */ 0x4048, /* 9cd - _V_66_0F_58 */ 0x4049, /* 9ce - _V_F3_0F_58 */ 0x404a, @@ -4284,10 +4286,10 @@ _InstNode InstructionsTree[5688] = { /* 9d1 - */ 0, /* 9d2 - */ 0, /* 9d3 - */ 0, -/* 9d4 - _0F_59 */ 0x23b9, -/* 9d5 - _66_0F_59 */ 0x23ba, -/* 9d6 - _F3_0F_59 */ 0x23bb, -/* 9d7 - _F2_0F_59 */ 0x23bc, +/* 9d4 - _0F_59 */ 0x23bb, +/* 9d5 - _66_0F_59 */ 0x23bc, +/* 9d6 - _F3_0F_59 */ 0x23bd, +/* 9d7 - _F2_0F_59 */ 0x23be, /* 9d8 - _V_0F_59 */ 0x404c, /* 9d9 - _V_66_0F_59 */ 0x404d, /* 9da - _V_F3_0F_59 */ 0x404e, @@ -4296,10 +4298,10 @@ _InstNode InstructionsTree[5688] = { /* 9dd - */ 0, /* 9de - */ 0, /* 9df - */ 0, -/* 9e0 - _0F_5A */ 0x23bd, -/* 9e1 - _66_0F_5A */ 0x23be, -/* 9e2 - _F3_0F_5A */ 0x23bf, -/* 9e3 - _F2_0F_5A */ 0x23c0, +/* 9e0 - _0F_5A */ 0x23bf, +/* 9e1 - _66_0F_5A */ 0x23c0, +/* 9e2 - _F3_0F_5A */ 0x23c1, +/* 9e3 - _F2_0F_5A */ 0x23c2, /* 9e4 - _V_0F_5A */ 0x4050, /* 9e5 - _V_66_0F_5A */ 0x4051, /* 9e6 - _V_F3_0F_5A */ 0x4052, @@ -4308,9 +4310,9 @@ _InstNode InstructionsTree[5688] = { /* 9e9 - */ 0, /* 9ea - */ 0, /* 9eb - */ 0, -/* 9ec - _0F_5B */ 0x23c1, -/* 9ed - _66_0F_5B */ 0x23c2, -/* 9ee - _F3_0F_5B */ 0x23c3, +/* 9ec - _0F_5B */ 0x23c3, +/* 9ed - _66_0F_5B */ 0x23c4, +/* 9ee - _F3_0F_5B */ 0x23c5, /* 9ef - */ 0, /* 9f0 - _V_0F_5B */ 0x4054, /* 9f1 - _V_66_0F_5B */ 0x4055, @@ -4320,10 +4322,10 @@ _InstNode InstructionsTree[5688] = { /* 9f5 - */ 0, /* 9f6 - */ 0, /* 9f7 - */ 0, -/* 9f8 - _0F_5C */ 0x23c4, -/* 9f9 - _66_0F_5C */ 0x23c5, -/* 9fa - _F3_0F_5C */ 0x23c6, -/* 9fb - _F2_0F_5C */ 0x23c7, +/* 9f8 - _0F_5C */ 0x23c6, +/* 9f9 - _66_0F_5C */ 0x23c7, +/* 9fa - _F3_0F_5C */ 0x23c8, +/* 9fb - _F2_0F_5C */ 0x23c9, /* 9fc - _V_0F_5C */ 0x4057, /* 9fd - _V_66_0F_5C */ 0x4058, /* 9fe - _V_F3_0F_5C */ 0x4059, @@ -4332,10 +4334,10 @@ _InstNode InstructionsTree[5688] = { /* a01 - */ 0, /* a02 - */ 0, /* a03 - */ 0, -/* a04 - _0F_5D */ 0x23c8, -/* a05 - _66_0F_5D */ 0x23c9, -/* a06 - _F3_0F_5D */ 0x23ca, -/* a07 - _F2_0F_5D */ 0x23cb, +/* a04 - _0F_5D */ 0x23ca, +/* a05 - _66_0F_5D */ 0x23cb, +/* a06 - _F3_0F_5D */ 0x23cc, +/* a07 - _F2_0F_5D */ 0x23cd, /* a08 - _V_0F_5D */ 0x405b, /* a09 - _V_66_0F_5D */ 0x405c, /* a0a - _V_F3_0F_5D */ 0x405d, @@ -4344,10 +4346,10 @@ _InstNode InstructionsTree[5688] = { /* a0d - */ 0, /* a0e - */ 0, /* a0f - */ 0, -/* a10 - _0F_5E */ 0x23cc, -/* a11 - _66_0F_5E */ 0x23cd, -/* a12 - _F3_0F_5E */ 0x23ce, -/* a13 - _F2_0F_5E */ 0x23cf, +/* a10 - _0F_5E */ 0x23ce, +/* a11 - _66_0F_5E */ 0x23cf, +/* a12 - _F3_0F_5E */ 0x23d0, +/* a13 - _F2_0F_5E */ 0x23d1, /* a14 - _V_0F_5E */ 0x405f, /* a15 - _V_66_0F_5E */ 0x4060, /* a16 - _V_F3_0F_5E */ 0x4061, @@ -4356,10 +4358,10 @@ _InstNode InstructionsTree[5688] = { /* a19 - */ 0, /* a1a - */ 0, /* a1b - */ 0, -/* a1c - _0F_5F */ 0x23d0, -/* a1d - _66_0F_5F */ 0x23d1, -/* a1e - _F3_0F_5F */ 0x23d2, -/* a1f - _F2_0F_5F */ 0x23d3, +/* a1c - _0F_5F */ 0x23d2, +/* a1d - _66_0F_5F */ 0x23d3, +/* a1e - _F3_0F_5F */ 0x23d4, +/* a1f - _F2_0F_5F */ 0x23d5, /* a20 - _V_0F_5F */ 0x4063, /* a21 - _V_66_0F_5F */ 0x4064, /* a22 - _V_F3_0F_5F */ 0x4065, @@ -4368,8 +4370,8 @@ _InstNode InstructionsTree[5688] = { /* a25 - */ 0, /* a26 - */ 0, /* a27 - */ 0, -/* a28 - _0F_60 */ 0x23d4, -/* a29 - _66_0F_60 */ 0x23d5, +/* a28 - _0F_60 */ 0x23d6, +/* a29 - _66_0F_60 */ 0x23d7, /* a2a - */ 0, /* a2b - */ 0, /* a2c - */ 0, @@ -4380,8 +4382,8 @@ _InstNode InstructionsTree[5688] = { /* a31 - */ 0, /* a32 - */ 0, /* a33 - */ 0, -/* a34 - _0F_61 */ 0x23d6, -/* a35 - _66_0F_61 */ 0x23d7, +/* a34 - _0F_61 */ 0x23d8, +/* a35 - _66_0F_61 */ 0x23d9, /* a36 - */ 0, /* a37 - */ 0, /* a38 - */ 0, @@ -4392,8 +4394,8 @@ _InstNode InstructionsTree[5688] = { /* a3d - */ 0, /* a3e - */ 0, /* a3f - */ 0, -/* a40 - _0F_62 */ 0x23d8, -/* a41 - _66_0F_62 */ 0x23d9, +/* a40 - _0F_62 */ 0x23da, +/* a41 - _66_0F_62 */ 0x23db, /* a42 - */ 0, /* a43 - */ 0, /* a44 - */ 0, @@ -4404,8 +4406,8 @@ _InstNode InstructionsTree[5688] = { /* a49 - */ 0, /* a4a - */ 0, /* a4b - */ 0, -/* a4c - _0F_63 */ 0x23da, -/* a4d - _66_0F_63 */ 0x23db, +/* a4c - _0F_63 */ 0x23dc, +/* a4d - _66_0F_63 */ 0x23dd, /* a4e - */ 0, /* a4f - */ 0, /* a50 - */ 0, @@ -4416,8 +4418,8 @@ _InstNode InstructionsTree[5688] = { /* a55 - */ 0, /* a56 - */ 0, /* a57 - */ 0, -/* a58 - _0F_64 */ 0x23dc, -/* a59 - _66_0F_64 */ 0x23dd, +/* a58 - _0F_64 */ 0x23de, +/* a59 - _66_0F_64 */ 0x23df, /* a5a - */ 0, /* a5b - */ 0, /* a5c - */ 0, @@ -4428,8 +4430,8 @@ _InstNode InstructionsTree[5688] = { /* a61 - */ 0, /* a62 - */ 0, /* a63 - */ 0, -/* a64 - _0F_65 */ 0x23de, -/* a65 - _66_0F_65 */ 0x23df, +/* a64 - _0F_65 */ 0x23e0, +/* a65 - _66_0F_65 */ 0x23e1, /* a66 - */ 0, /* a67 - */ 0, /* a68 - */ 0, @@ -4440,8 +4442,8 @@ _InstNode InstructionsTree[5688] = { /* a6d - */ 0, /* a6e - */ 0, /* a6f - */ 0, -/* a70 - _0F_66 */ 0x23e0, -/* a71 - _66_0F_66 */ 0x23e1, +/* a70 - _0F_66 */ 0x23e2, +/* a71 - _66_0F_66 */ 0x23e3, /* a72 - */ 0, /* a73 - */ 0, /* a74 - */ 0, @@ -4452,8 +4454,8 @@ _InstNode InstructionsTree[5688] = { /* a79 - */ 0, /* a7a - */ 0, /* a7b - */ 0, -/* a7c - _0F_67 */ 0x23e2, -/* a7d - _66_0F_67 */ 0x23e3, +/* a7c - _0F_67 */ 0x23e4, +/* a7d - _66_0F_67 */ 0x23e5, /* a7e - */ 0, /* a7f - */ 0, /* a80 - */ 0, @@ -4464,8 +4466,8 @@ _InstNode InstructionsTree[5688] = { /* a85 - */ 0, /* a86 - */ 0, /* a87 - */ 0, -/* a88 - _0F_68 */ 0x23e4, -/* a89 - _66_0F_68 */ 0x23e5, +/* a88 - _0F_68 */ 0x23e6, +/* a89 - _66_0F_68 */ 0x23e7, /* a8a - */ 0, /* a8b - */ 0, /* a8c - */ 0, @@ -4476,8 +4478,8 @@ _InstNode InstructionsTree[5688] = { /* a91 - */ 0, /* a92 - */ 0, /* a93 - */ 0, -/* a94 - _0F_69 */ 0x23e6, -/* a95 - _66_0F_69 */ 0x23e7, +/* a94 - _0F_69 */ 0x23e8, +/* a95 - _66_0F_69 */ 0x23e9, /* a96 - */ 0, /* a97 - */ 0, /* a98 - */ 0, @@ -4488,8 +4490,8 @@ _InstNode InstructionsTree[5688] = { /* a9d - */ 0, /* a9e - */ 0, /* a9f - */ 0, -/* aa0 - _0F_6A */ 0x23e8, -/* aa1 - _66_0F_6A */ 0x23e9, +/* aa0 - _0F_6A */ 0x23ea, +/* aa1 - _66_0F_6A */ 0x23eb, /* aa2 - */ 0, /* aa3 - */ 0, /* aa4 - */ 0, @@ -4500,8 +4502,8 @@ _InstNode InstructionsTree[5688] = { /* aa9 - */ 0, /* aaa - */ 0, /* aab - */ 0, -/* aac - _0F_6B */ 0x23ea, -/* aad - _66_0F_6B */ 0x23eb, +/* aac - _0F_6B */ 0x23ec, +/* aad - _66_0F_6B */ 0x23ed, /* aae - */ 0, /* aaf - */ 0, /* ab0 - */ 0, @@ -4513,7 +4515,7 @@ _InstNode InstructionsTree[5688] = { /* ab6 - */ 0, /* ab7 - */ 0, /* ab8 - */ 0, -/* ab9 - _66_0F_6C */ 0x23ec, +/* ab9 - _66_0F_6C */ 0x23ee, /* aba - */ 0, /* abb - */ 0, /* abc - */ 0, @@ -4525,7 +4527,7 @@ _InstNode InstructionsTree[5688] = { /* ac2 - */ 0, /* ac3 - */ 0, /* ac4 - */ 0, -/* ac5 - _66_0F_6D */ 0x23ed, +/* ac5 - _66_0F_6D */ 0x23ef, /* ac6 - */ 0, /* ac7 - */ 0, /* ac8 - */ 0, @@ -4548,9 +4550,9 @@ _InstNode InstructionsTree[5688] = { /* ad9 - */ 0, /* ada - */ 0, /* adb - */ 0, -/* adc - _0F_6F */ 0x23ee, -/* add - _66_0F_6F */ 0x23ef, -/* ade - _F3_0F_6F */ 0x23f0, +/* adc - _0F_6F */ 0x23f0, +/* add - _66_0F_6F */ 0x23f1, +/* ade - _F3_0F_6F */ 0x23f2, /* adf - */ 0, /* ae0 - */ 0, /* ae1 - _V_66_0F_6F */ 0x4078, @@ -4574,30 +4576,30 @@ _InstNode InstructionsTree[5688] = { /* af3 - */ 0, /* af4 - */ 0, /* af5 - */ 0, -/* af6 - _0F_71_02 */ 0xd584, +/* af6 - _0F_71_02 */ 0xf584, /* af7 - */ 0, -/* af8 - _0F_71_04 */ 0xd590, +/* af8 - _0F_71_04 */ 0xf590, /* af9 - */ 0, -/* afa - _0F_71_06 */ 0xd59c, +/* afa - _0F_71_06 */ 0xf59c, /* afb - */ 0, /* afc - */ 0, /* afd - */ 0, -/* afe - _0F_72_02 */ 0xd5a8, +/* afe - _0F_72_02 */ 0xf5a8, /* aff - */ 0, -/* b00 - _0F_72_04 */ 0xd5b4, +/* b00 - _0F_72_04 */ 0xf5b4, /* b01 - */ 0, -/* b02 - _0F_72_06 */ 0xd5c0, +/* b02 - _0F_72_06 */ 0xf5c0, /* b03 - */ 0, /* b04 - */ 0, /* b05 - */ 0, -/* b06 - _0F_73_02 */ 0xd5cc, -/* b07 - _0F_73_03 */ 0xd5d8, +/* b06 - _0F_73_02 */ 0xf5cc, +/* b07 - _0F_73_03 */ 0xf5d8, /* b08 - */ 0, /* b09 - */ 0, -/* b0a - _0F_73_06 */ 0xd5e4, -/* b0b - _0F_73_07 */ 0xd5f0, -/* b0c - _0F_74 */ 0x23f1, -/* b0d - _66_0F_74 */ 0x23f2, +/* b0a - _0F_73_06 */ 0xf5e4, +/* b0b - _0F_73_07 */ 0xf5f0, +/* b0c - _0F_74 */ 0x23f3, +/* b0d - _66_0F_74 */ 0x23f4, /* b0e - */ 0, /* b0f - */ 0, /* b10 - */ 0, @@ -4608,8 +4610,8 @@ _InstNode InstructionsTree[5688] = { /* b15 - */ 0, /* b16 - */ 0, /* b17 - */ 0, -/* b18 - _0F_75 */ 0x23f3, -/* b19 - _66_0F_75 */ 0x23f4, +/* b18 - _0F_75 */ 0x23f5, +/* b19 - _66_0F_75 */ 0x23f6, /* b1a - */ 0, /* b1b - */ 0, /* b1c - */ 0, @@ -4620,8 +4622,8 @@ _InstNode InstructionsTree[5688] = { /* b21 - */ 0, /* b22 - */ 0, /* b23 - */ 0, -/* b24 - _0F_76 */ 0x23f5, -/* b25 - _66_0F_76 */ 0x23f6, +/* b24 - _0F_76 */ 0x23f7, +/* b25 - _66_0F_76 */ 0x23f8, /* b26 - */ 0, /* b27 - */ 0, /* b28 - */ 0, @@ -4632,7 +4634,7 @@ _InstNode InstructionsTree[5688] = { /* b2d - */ 0, /* b2e - */ 0, /* b2f - */ 0, -/* b30 - _0F_77 */ 0x23f7, +/* b30 - _0F_77 */ 0x23f9, /* b31 - */ 0, /* b32 - */ 0, /* b33 - */ 0, @@ -4644,7 +4646,7 @@ _InstNode InstructionsTree[5688] = { /* b39 - */ 0, /* b3a - */ 0, /* b3b - */ 0, -/* b3c - _0F_78 */ 0x23f8, +/* b3c - _0F_78 */ 0x23fa, /* b3d - _66_0F_78 */ 0x4085, /* b3e - */ 0, /* b3f - _F2_0F_78 */ 0x4086, @@ -4656,10 +4658,10 @@ _InstNode InstructionsTree[5688] = { /* b45 - */ 0, /* b46 - */ 0, /* b47 - */ 0, -/* b48 - _0F_79 */ 0x23f9, -/* b49 - _66_0F_79 */ 0x23fa, +/* b48 - _0F_79 */ 0x23fb, +/* b49 - _66_0F_79 */ 0x23fc, /* b4a - */ 0, -/* b4b - _F2_0F_79 */ 0x23fb, +/* b4b - _F2_0F_79 */ 0x23fd, /* b4c - */ 0, /* b4d - */ 0, /* b4e - */ 0, @@ -4716,8 +4718,8 @@ _InstNode InstructionsTree[5688] = { /* b81 - */ 0, /* b82 - */ 0, /* b83 - */ 0, -/* b84 - _0F_7A_30 */ 0x23fc, -/* b85 - _0F_7A_31 */ 0x23fd, +/* b84 - _0F_7A_30 */ 0x23fe, +/* b85 - _0F_7A_31 */ 0x23ff, /* b86 - */ 0, /* b87 - */ 0, /* b88 - */ 0, @@ -4925,9 +4927,9 @@ _InstNode InstructionsTree[5688] = { /* c52 - */ 0, /* c53 - */ 0, /* c54 - */ 0, -/* c55 - _66_0F_7C */ 0x23fe, +/* c55 - _66_0F_7C */ 0x2400, /* c56 - */ 0, -/* c57 - _F2_0F_7C */ 0x23ff, +/* c57 - _F2_0F_7C */ 0x2401, /* c58 - */ 0, /* c59 - _V_66_0F_7C */ 0x4087, /* c5a - */ 0, @@ -4937,9 +4939,9 @@ _InstNode InstructionsTree[5688] = { /* c5e - */ 0, /* c5f - */ 0, /* c60 - */ 0, -/* c61 - _66_0F_7D */ 0x2400, +/* c61 - _66_0F_7D */ 0x2402, /* c62 - */ 0, -/* c63 - _F2_0F_7D */ 0x2401, +/* c63 - _F2_0F_7D */ 0x2403, /* c64 - */ 0, /* c65 - _V_66_0F_7D */ 0x4089, /* c66 - */ 0, @@ -4950,7 +4952,7 @@ _InstNode InstructionsTree[5688] = { /* c6b - */ 0, /* c6c - _0F_7E */ 0x408b, /* c6d - _66_0F_7E */ 0x408c, -/* c6e - _F3_0F_7E */ 0x2402, +/* c6e - _F3_0F_7E */ 0x2404, /* c6f - */ 0, /* c70 - */ 0, /* c71 - _V_66_0F_7E */ 0x408d, @@ -4960,9 +4962,9 @@ _InstNode InstructionsTree[5688] = { /* c75 - */ 0, /* c76 - */ 0, /* c77 - */ 0, -/* c78 - _0F_7F */ 0x2403, -/* c79 - _66_0F_7F */ 0x2404, -/* c7a - _F3_0F_7F */ 0x2405, +/* c78 - _0F_7F */ 0x2405, +/* c79 - _66_0F_7F */ 0x2406, +/* c7a - _F3_0F_7F */ 0x2407, /* c7b - */ 0, /* c7c - */ 0, /* c7d - _V_66_0F_7F */ 0x408f, @@ -4972,17 +4974,17 @@ _InstNode InstructionsTree[5688] = { /* c81 - */ 0, /* c82 - */ 0, /* c83 - */ 0, -/* c84 - _0F_AE_00 */ 0xd5fc, -/* c85 - _0F_AE_01 */ 0xd608, -/* c86 - _0F_AE_02 */ 0xd614, -/* c87 - _0F_AE_03 */ 0xd620, +/* c84 - _0F_AE_00 */ 0xf5fc, +/* c85 - _0F_AE_01 */ 0xf608, +/* c86 - _0F_AE_02 */ 0xf614, +/* c87 - _0F_AE_03 */ 0xf620, /* c88 - _0F_AE_04 */ 0x4091, /* c89 - _0F_AE_05 */ 0x4092, /* c8a - _0F_AE_06 */ 0x4093, /* c8b - _0F_AE_07 */ 0x4094, /* c8c - */ 0, /* c8d - */ 0, -/* c8e - _F3_0F_B8 */ 0x2406, +/* c8e - _F3_0F_B8 */ 0x2408, /* c8f - */ 0, /* c90 - */ 0, /* c91 - */ 0, @@ -4996,13 +4998,13 @@ _InstNode InstructionsTree[5688] = { /* c99 - */ 0, /* c9a - */ 0, /* c9b - */ 0, -/* c9c - _0F_BA_04 */ 0x2407, -/* c9d - _0F_BA_05 */ 0x2408, -/* c9e - _0F_BA_06 */ 0x2409, -/* c9f - _0F_BA_07 */ 0x240a, -/* ca0 - _0F_BC */ 0x240b, +/* c9c - _0F_BA_04 */ 0x2409, +/* c9d - _0F_BA_05 */ 0x240a, +/* c9e - _0F_BA_06 */ 0x240b, +/* c9f - _0F_BA_07 */ 0x240c, +/* ca0 - _0F_BC */ 0x240d, /* ca1 - */ 0, -/* ca2 - _F3_0F_BC */ 0x240c, +/* ca2 - _F3_0F_BC */ 0x240e, /* ca3 - */ 0, /* ca4 - */ 0, /* ca5 - */ 0, @@ -5012,9 +5014,9 @@ _InstNode InstructionsTree[5688] = { /* ca9 - */ 0, /* caa - */ 0, /* cab - */ 0, -/* cac - _0F_BD */ 0x240d, +/* cac - _0F_BD */ 0x240f, /* cad - */ 0, -/* cae - _F3_0F_BD */ 0x240e, +/* cae - _F3_0F_BD */ 0x2410, /* caf - */ 0, /* cb0 - */ 0, /* cb1 - */ 0, @@ -5078,12 +5080,12 @@ _InstNode InstructionsTree[5688] = { /* ceb - */ 0, /* cec - */ 0, /* ced - */ 0, -/* cee - _0F_C7_06 */ 0xd62c, -/* cef - _0F_C7_07 */ 0x240f, +/* cee - _0F_C7_06 */ 0xf62c, +/* cef - _0F_C7_07 */ 0x2411, /* cf0 - */ 0, -/* cf1 - _66_0F_D0 */ 0x2410, +/* cf1 - _66_0F_D0 */ 0x2412, /* cf2 - */ 0, -/* cf3 - _F2_0F_D0 */ 0x2411, +/* cf3 - _F2_0F_D0 */ 0x2413, /* cf4 - */ 0, /* cf5 - _V_66_0F_D0 */ 0x40a8, /* cf6 - */ 0, @@ -5092,8 +5094,8 @@ _InstNode InstructionsTree[5688] = { /* cf9 - */ 0, /* cfa - */ 0, /* cfb - */ 0, -/* cfc - _0F_D1 */ 0x2412, -/* cfd - _66_0F_D1 */ 0x2413, +/* cfc - _0F_D1 */ 0x2414, +/* cfd - _66_0F_D1 */ 0x2415, /* cfe - */ 0, /* cff - */ 0, /* d00 - */ 0, @@ -5104,8 +5106,8 @@ _InstNode InstructionsTree[5688] = { /* d05 - */ 0, /* d06 - */ 0, /* d07 - */ 0, -/* d08 - _0F_D2 */ 0x2414, -/* d09 - _66_0F_D2 */ 0x2415, +/* d08 - _0F_D2 */ 0x2416, +/* d09 - _66_0F_D2 */ 0x2417, /* d0a - */ 0, /* d0b - */ 0, /* d0c - */ 0, @@ -5116,8 +5118,8 @@ _InstNode InstructionsTree[5688] = { /* d11 - */ 0, /* d12 - */ 0, /* d13 - */ 0, -/* d14 - _0F_D3 */ 0x2416, -/* d15 - _66_0F_D3 */ 0x2417, +/* d14 - _0F_D3 */ 0x2418, +/* d15 - _66_0F_D3 */ 0x2419, /* d16 - */ 0, /* d17 - */ 0, /* d18 - */ 0, @@ -5128,8 +5130,8 @@ _InstNode InstructionsTree[5688] = { /* d1d - */ 0, /* d1e - */ 0, /* d1f - */ 0, -/* d20 - _0F_D4 */ 0x2418, -/* d21 - _66_0F_D4 */ 0x2419, +/* d20 - _0F_D4 */ 0x241a, +/* d21 - _66_0F_D4 */ 0x241b, /* d22 - */ 0, /* d23 - */ 0, /* d24 - */ 0, @@ -5140,8 +5142,8 @@ _InstNode InstructionsTree[5688] = { /* d29 - */ 0, /* d2a - */ 0, /* d2b - */ 0, -/* d2c - _0F_D5 */ 0x241a, -/* d2d - _66_0F_D5 */ 0x241b, +/* d2c - _0F_D5 */ 0x241c, +/* d2d - _66_0F_D5 */ 0x241d, /* d2e - */ 0, /* d2f - */ 0, /* d30 - */ 0, @@ -5153,9 +5155,9 @@ _InstNode InstructionsTree[5688] = { /* d36 - */ 0, /* d37 - */ 0, /* d38 - */ 0, -/* d39 - _66_0F_D6 */ 0x241c, -/* d3a - _F3_0F_D6 */ 0x241d, -/* d3b - _F2_0F_D6 */ 0x241e, +/* d39 - _66_0F_D6 */ 0x241e, +/* d3a - _F3_0F_D6 */ 0x241f, +/* d3b - _F2_0F_D6 */ 0x2420, /* d3c - */ 0, /* d3d - _V_66_0F_D6 */ 0x40af, /* d3e - */ 0, @@ -5164,8 +5166,8 @@ _InstNode InstructionsTree[5688] = { /* d41 - */ 0, /* d42 - */ 0, /* d43 - */ 0, -/* d44 - _0F_D7 */ 0x241f, -/* d45 - _66_0F_D7 */ 0x2420, +/* d44 - _0F_D7 */ 0x2421, +/* d45 - _66_0F_D7 */ 0x2422, /* d46 - */ 0, /* d47 - */ 0, /* d48 - */ 0, @@ -5176,8 +5178,8 @@ _InstNode InstructionsTree[5688] = { /* d4d - */ 0, /* d4e - */ 0, /* d4f - */ 0, -/* d50 - _0F_D8 */ 0x2421, -/* d51 - _66_0F_D8 */ 0x2422, +/* d50 - _0F_D8 */ 0x2423, +/* d51 - _66_0F_D8 */ 0x2424, /* d52 - */ 0, /* d53 - */ 0, /* d54 - */ 0, @@ -5188,8 +5190,8 @@ _InstNode InstructionsTree[5688] = { /* d59 - */ 0, /* d5a - */ 0, /* d5b - */ 0, -/* d5c - _0F_D9 */ 0x2423, -/* d5d - _66_0F_D9 */ 0x2424, +/* d5c - _0F_D9 */ 0x2425, +/* d5d - _66_0F_D9 */ 0x2426, /* d5e - */ 0, /* d5f - */ 0, /* d60 - */ 0, @@ -5200,8 +5202,8 @@ _InstNode InstructionsTree[5688] = { /* d65 - */ 0, /* d66 - */ 0, /* d67 - */ 0, -/* d68 - _0F_DA */ 0x2425, -/* d69 - _66_0F_DA */ 0x2426, +/* d68 - _0F_DA */ 0x2427, +/* d69 - _66_0F_DA */ 0x2428, /* d6a - */ 0, /* d6b - */ 0, /* d6c - */ 0, @@ -5212,8 +5214,8 @@ _InstNode InstructionsTree[5688] = { /* d71 - */ 0, /* d72 - */ 0, /* d73 - */ 0, -/* d74 - _0F_DB */ 0x2427, -/* d75 - _66_0F_DB */ 0x2428, +/* d74 - _0F_DB */ 0x2429, +/* d75 - _66_0F_DB */ 0x242a, /* d76 - */ 0, /* d77 - */ 0, /* d78 - */ 0, @@ -5224,8 +5226,8 @@ _InstNode InstructionsTree[5688] = { /* d7d - */ 0, /* d7e - */ 0, /* d7f - */ 0, -/* d80 - _0F_DC */ 0x2429, -/* d81 - _66_0F_DC */ 0x242a, +/* d80 - _0F_DC */ 0x242b, +/* d81 - _66_0F_DC */ 0x242c, /* d82 - */ 0, /* d83 - */ 0, /* d84 - */ 0, @@ -5236,8 +5238,8 @@ _InstNode InstructionsTree[5688] = { /* d89 - */ 0, /* d8a - */ 0, /* d8b - */ 0, -/* d8c - _0F_DD */ 0x242b, -/* d8d - _66_0F_DD */ 0x242c, +/* d8c - _0F_DD */ 0x242d, +/* d8d - _66_0F_DD */ 0x242e, /* d8e - */ 0, /* d8f - */ 0, /* d90 - */ 0, @@ -5248,8 +5250,8 @@ _InstNode InstructionsTree[5688] = { /* d95 - */ 0, /* d96 - */ 0, /* d97 - */ 0, -/* d98 - _0F_DE */ 0x242d, -/* d99 - _66_0F_DE */ 0x242e, +/* d98 - _0F_DE */ 0x242f, +/* d99 - _66_0F_DE */ 0x2430, /* d9a - */ 0, /* d9b - */ 0, /* d9c - */ 0, @@ -5260,8 +5262,8 @@ _InstNode InstructionsTree[5688] = { /* da1 - */ 0, /* da2 - */ 0, /* da3 - */ 0, -/* da4 - _0F_DF */ 0x242f, -/* da5 - _66_0F_DF */ 0x2430, +/* da4 - _0F_DF */ 0x2431, +/* da5 - _66_0F_DF */ 0x2432, /* da6 - */ 0, /* da7 - */ 0, /* da8 - */ 0, @@ -5272,8 +5274,8 @@ _InstNode InstructionsTree[5688] = { /* dad - */ 0, /* dae - */ 0, /* daf - */ 0, -/* db0 - _0F_E0 */ 0x2431, -/* db1 - _66_0F_E0 */ 0x2432, +/* db0 - _0F_E0 */ 0x2433, +/* db1 - _66_0F_E0 */ 0x2434, /* db2 - */ 0, /* db3 - */ 0, /* db4 - */ 0, @@ -5284,8 +5286,8 @@ _InstNode InstructionsTree[5688] = { /* db9 - */ 0, /* dba - */ 0, /* dbb - */ 0, -/* dbc - _0F_E1 */ 0x2433, -/* dbd - _66_0F_E1 */ 0x2434, +/* dbc - _0F_E1 */ 0x2435, +/* dbd - _66_0F_E1 */ 0x2436, /* dbe - */ 0, /* dbf - */ 0, /* dc0 - */ 0, @@ -5296,8 +5298,8 @@ _InstNode InstructionsTree[5688] = { /* dc5 - */ 0, /* dc6 - */ 0, /* dc7 - */ 0, -/* dc8 - _0F_E2 */ 0x2435, -/* dc9 - _66_0F_E2 */ 0x2436, +/* dc8 - _0F_E2 */ 0x2437, +/* dc9 - _66_0F_E2 */ 0x2438, /* dca - */ 0, /* dcb - */ 0, /* dcc - */ 0, @@ -5308,8 +5310,8 @@ _InstNode InstructionsTree[5688] = { /* dd1 - */ 0, /* dd2 - */ 0, /* dd3 - */ 0, -/* dd4 - _0F_E3 */ 0x2437, -/* dd5 - _66_0F_E3 */ 0x2438, +/* dd4 - _0F_E3 */ 0x2439, +/* dd5 - _66_0F_E3 */ 0x243a, /* dd6 - */ 0, /* dd7 - */ 0, /* dd8 - */ 0, @@ -5320,8 +5322,8 @@ _InstNode InstructionsTree[5688] = { /* ddd - */ 0, /* dde - */ 0, /* ddf - */ 0, -/* de0 - _0F_E4 */ 0x2439, -/* de1 - _66_0F_E4 */ 0x243a, +/* de0 - _0F_E4 */ 0x243b, +/* de1 - _66_0F_E4 */ 0x243c, /* de2 - */ 0, /* de3 - */ 0, /* de4 - */ 0, @@ -5332,8 +5334,8 @@ _InstNode InstructionsTree[5688] = { /* de9 - */ 0, /* dea - */ 0, /* deb - */ 0, -/* dec - _0F_E5 */ 0x243b, -/* ded - _66_0F_E5 */ 0x243c, +/* dec - _0F_E5 */ 0x243d, +/* ded - _66_0F_E5 */ 0x243e, /* dee - */ 0, /* def - */ 0, /* df0 - */ 0, @@ -5345,9 +5347,9 @@ _InstNode InstructionsTree[5688] = { /* df6 - */ 0, /* df7 - */ 0, /* df8 - */ 0, -/* df9 - _66_0F_E6 */ 0x243d, -/* dfa - _F3_0F_E6 */ 0x243e, -/* dfb - _F2_0F_E6 */ 0x243f, +/* df9 - _66_0F_E6 */ 0x243f, +/* dfa - _F3_0F_E6 */ 0x2440, +/* dfb - _F2_0F_E6 */ 0x2441, /* dfc - */ 0, /* dfd - _V_66_0F_E6 */ 0x40bf, /* dfe - _V_F3_0F_E6 */ 0x40c0, @@ -5356,8 +5358,8 @@ _InstNode InstructionsTree[5688] = { /* e01 - */ 0, /* e02 - */ 0, /* e03 - */ 0, -/* e04 - _0F_E7 */ 0x2440, -/* e05 - _66_0F_E7 */ 0x2441, +/* e04 - _0F_E7 */ 0x2442, +/* e05 - _66_0F_E7 */ 0x2443, /* e06 - */ 0, /* e07 - */ 0, /* e08 - */ 0, @@ -5368,8 +5370,8 @@ _InstNode InstructionsTree[5688] = { /* e0d - */ 0, /* e0e - */ 0, /* e0f - */ 0, -/* e10 - _0F_E8 */ 0x2442, -/* e11 - _66_0F_E8 */ 0x2443, +/* e10 - _0F_E8 */ 0x2444, +/* e11 - _66_0F_E8 */ 0x2445, /* e12 - */ 0, /* e13 - */ 0, /* e14 - */ 0, @@ -5380,8 +5382,8 @@ _InstNode InstructionsTree[5688] = { /* e19 - */ 0, /* e1a - */ 0, /* e1b - */ 0, -/* e1c - _0F_E9 */ 0x2444, -/* e1d - _66_0F_E9 */ 0x2445, +/* e1c - _0F_E9 */ 0x2446, +/* e1d - _66_0F_E9 */ 0x2447, /* e1e - */ 0, /* e1f - */ 0, /* e20 - */ 0, @@ -5392,8 +5394,8 @@ _InstNode InstructionsTree[5688] = { /* e25 - */ 0, /* e26 - */ 0, /* e27 - */ 0, -/* e28 - _0F_EA */ 0x2446, -/* e29 - _66_0F_EA */ 0x2447, +/* e28 - _0F_EA */ 0x2448, +/* e29 - _66_0F_EA */ 0x2449, /* e2a - */ 0, /* e2b - */ 0, /* e2c - */ 0, @@ -5404,8 +5406,8 @@ _InstNode InstructionsTree[5688] = { /* e31 - */ 0, /* e32 - */ 0, /* e33 - */ 0, -/* e34 - _0F_EB */ 0x2448, -/* e35 - _66_0F_EB */ 0x2449, +/* e34 - _0F_EB */ 0x244a, +/* e35 - _66_0F_EB */ 0x244b, /* e36 - */ 0, /* e37 - */ 0, /* e38 - */ 0, @@ -5416,8 +5418,8 @@ _InstNode InstructionsTree[5688] = { /* e3d - */ 0, /* e3e - */ 0, /* e3f - */ 0, -/* e40 - _0F_EC */ 0x244a, -/* e41 - _66_0F_EC */ 0x244b, +/* e40 - _0F_EC */ 0x244c, +/* e41 - _66_0F_EC */ 0x244d, /* e42 - */ 0, /* e43 - */ 0, /* e44 - */ 0, @@ -5428,8 +5430,8 @@ _InstNode InstructionsTree[5688] = { /* e49 - */ 0, /* e4a - */ 0, /* e4b - */ 0, -/* e4c - _0F_ED */ 0x244c, -/* e4d - _66_0F_ED */ 0x244d, +/* e4c - _0F_ED */ 0x244e, +/* e4d - _66_0F_ED */ 0x244f, /* e4e - */ 0, /* e4f - */ 0, /* e50 - */ 0, @@ -5440,8 +5442,8 @@ _InstNode InstructionsTree[5688] = { /* e55 - */ 0, /* e56 - */ 0, /* e57 - */ 0, -/* e58 - _0F_EE */ 0x244e, -/* e59 - _66_0F_EE */ 0x244f, +/* e58 - _0F_EE */ 0x2450, +/* e59 - _66_0F_EE */ 0x2451, /* e5a - */ 0, /* e5b - */ 0, /* e5c - */ 0, @@ -5452,8 +5454,8 @@ _InstNode InstructionsTree[5688] = { /* e61 - */ 0, /* e62 - */ 0, /* e63 - */ 0, -/* e64 - _0F_EF */ 0x2450, -/* e65 - _66_0F_EF */ 0x2451, +/* e64 - _0F_EF */ 0x2452, +/* e65 - _66_0F_EF */ 0x2453, /* e66 - */ 0, /* e67 - */ 0, /* e68 - */ 0, @@ -5467,7 +5469,7 @@ _InstNode InstructionsTree[5688] = { /* e70 - */ 0, /* e71 - */ 0, /* e72 - */ 0, -/* e73 - _F2_0F_F0 */ 0x2452, +/* e73 - _F2_0F_F0 */ 0x2454, /* e74 - */ 0, /* e75 - */ 0, /* e76 - */ 0, @@ -5476,8 +5478,8 @@ _InstNode InstructionsTree[5688] = { /* e79 - */ 0, /* e7a - */ 0, /* e7b - */ 0, -/* e7c - _0F_F1 */ 0x2453, -/* e7d - _66_0F_F1 */ 0x2454, +/* e7c - _0F_F1 */ 0x2455, +/* e7d - _66_0F_F1 */ 0x2456, /* e7e - */ 0, /* e7f - */ 0, /* e80 - */ 0, @@ -5488,8 +5490,8 @@ _InstNode InstructionsTree[5688] = { /* e85 - */ 0, /* e86 - */ 0, /* e87 - */ 0, -/* e88 - _0F_F2 */ 0x2455, -/* e89 - _66_0F_F2 */ 0x2456, +/* e88 - _0F_F2 */ 0x2457, +/* e89 - _66_0F_F2 */ 0x2458, /* e8a - */ 0, /* e8b - */ 0, /* e8c - */ 0, @@ -5500,8 +5502,8 @@ _InstNode InstructionsTree[5688] = { /* e91 - */ 0, /* e92 - */ 0, /* e93 - */ 0, -/* e94 - _0F_F3 */ 0x2457, -/* e95 - _66_0F_F3 */ 0x2458, +/* e94 - _0F_F3 */ 0x2459, +/* e95 - _66_0F_F3 */ 0x245a, /* e96 - */ 0, /* e97 - */ 0, /* e98 - */ 0, @@ -5512,8 +5514,8 @@ _InstNode InstructionsTree[5688] = { /* e9d - */ 0, /* e9e - */ 0, /* e9f - */ 0, -/* ea0 - _0F_F4 */ 0x2459, -/* ea1 - _66_0F_F4 */ 0x245a, +/* ea0 - _0F_F4 */ 0x245b, +/* ea1 - _66_0F_F4 */ 0x245c, /* ea2 - */ 0, /* ea3 - */ 0, /* ea4 - */ 0, @@ -5524,8 +5526,8 @@ _InstNode InstructionsTree[5688] = { /* ea9 - */ 0, /* eaa - */ 0, /* eab - */ 0, -/* eac - _0F_F5 */ 0x245b, -/* ead - _66_0F_F5 */ 0x245c, +/* eac - _0F_F5 */ 0x245d, +/* ead - _66_0F_F5 */ 0x245e, /* eae - */ 0, /* eaf - */ 0, /* eb0 - */ 0, @@ -5536,8 +5538,8 @@ _InstNode InstructionsTree[5688] = { /* eb5 - */ 0, /* eb6 - */ 0, /* eb7 - */ 0, -/* eb8 - _0F_F6 */ 0x245d, -/* eb9 - _66_0F_F6 */ 0x245e, +/* eb8 - _0F_F6 */ 0x245f, +/* eb9 - _66_0F_F6 */ 0x2460, /* eba - */ 0, /* ebb - */ 0, /* ebc - */ 0, @@ -5548,8 +5550,8 @@ _InstNode InstructionsTree[5688] = { /* ec1 - */ 0, /* ec2 - */ 0, /* ec3 - */ 0, -/* ec4 - _0F_F7 */ 0x245f, -/* ec5 - _66_0F_F7 */ 0x2460, +/* ec4 - _0F_F7 */ 0x2461, +/* ec5 - _66_0F_F7 */ 0x2462, /* ec6 - */ 0, /* ec7 - */ 0, /* ec8 - */ 0, @@ -5560,8 +5562,8 @@ _InstNode InstructionsTree[5688] = { /* ecd - */ 0, /* ece - */ 0, /* ecf - */ 0, -/* ed0 - _0F_F8 */ 0x2461, -/* ed1 - _66_0F_F8 */ 0x2462, +/* ed0 - _0F_F8 */ 0x2463, +/* ed1 - _66_0F_F8 */ 0x2464, /* ed2 - */ 0, /* ed3 - */ 0, /* ed4 - */ 0, @@ -5572,8 +5574,8 @@ _InstNode InstructionsTree[5688] = { /* ed9 - */ 0, /* eda - */ 0, /* edb - */ 0, -/* edc - _0F_F9 */ 0x2463, -/* edd - _66_0F_F9 */ 0x2464, +/* edc - _0F_F9 */ 0x2465, +/* edd - _66_0F_F9 */ 0x2466, /* ede - */ 0, /* edf - */ 0, /* ee0 - */ 0, @@ -5584,8 +5586,8 @@ _InstNode InstructionsTree[5688] = { /* ee5 - */ 0, /* ee6 - */ 0, /* ee7 - */ 0, -/* ee8 - _0F_FA */ 0x2465, -/* ee9 - _66_0F_FA */ 0x2466, +/* ee8 - _0F_FA */ 0x2467, +/* ee9 - _66_0F_FA */ 0x2468, /* eea - */ 0, /* eeb - */ 0, /* eec - */ 0, @@ -5596,8 +5598,8 @@ _InstNode InstructionsTree[5688] = { /* ef1 - */ 0, /* ef2 - */ 0, /* ef3 - */ 0, -/* ef4 - _0F_FB */ 0x2467, -/* ef5 - _66_0F_FB */ 0x2468, +/* ef4 - _0F_FB */ 0x2469, +/* ef5 - _66_0F_FB */ 0x246a, /* ef6 - */ 0, /* ef7 - */ 0, /* ef8 - */ 0, @@ -5608,8 +5610,8 @@ _InstNode InstructionsTree[5688] = { /* efd - */ 0, /* efe - */ 0, /* eff - */ 0, -/* f00 - _0F_FC */ 0x2469, -/* f01 - _66_0F_FC */ 0x246a, +/* f00 - _0F_FC */ 0x246b, +/* f01 - _66_0F_FC */ 0x246c, /* f02 - */ 0, /* f03 - */ 0, /* f04 - */ 0, @@ -5620,8 +5622,8 @@ _InstNode InstructionsTree[5688] = { /* f09 - */ 0, /* f0a - */ 0, /* f0b - */ 0, -/* f0c - _0F_FD */ 0x246b, -/* f0d - _66_0F_FD */ 0x246c, +/* f0c - _0F_FD */ 0x246d, +/* f0d - _66_0F_FD */ 0x246e, /* f0e - */ 0, /* f0f - */ 0, /* f10 - */ 0, @@ -5632,8 +5634,8 @@ _InstNode InstructionsTree[5688] = { /* f15 - */ 0, /* f16 - */ 0, /* f17 - */ 0, -/* f18 - _0F_FE */ 0x246d, -/* f19 - _66_0F_FE */ 0x246e, +/* f18 - _0F_FE */ 0x246f, +/* f19 - _66_0F_FE */ 0x2470, /* f1a - */ 0, /* f1b - */ 0, /* f1c - */ 0, @@ -5644,8 +5646,8 @@ _InstNode InstructionsTree[5688] = { /* f21 - */ 0, /* f22 - */ 0, /* f23 - */ 0, -/* f24 - _D9_06 */ 0x246f, -/* f25 - _9B_D9_06 */ 0x2470, +/* f24 - _D9_06 */ 0x2471, +/* f25 - _9B_D9_06 */ 0x2472, /* f26 - */ 0, /* f27 - */ 0, /* f28 - */ 0, @@ -5656,8 +5658,8 @@ _InstNode InstructionsTree[5688] = { /* f2d - */ 0, /* f2e - */ 0, /* f2f - */ 0, -/* f30 - _D9_07 */ 0x2471, -/* f31 - _9B_D9_07 */ 0x2472, +/* f30 - _D9_07 */ 0x2473, +/* f31 - _9B_D9_07 */ 0x2474, /* f32 - */ 0, /* f33 - */ 0, /* f34 - */ 0, @@ -5668,8 +5670,8 @@ _InstNode InstructionsTree[5688] = { /* f39 - */ 0, /* f3a - */ 0, /* f3b - */ 0, -/* f3c - _DB_E2 */ 0x2473, -/* f3d - _9B_DB_E2 */ 0x2474, +/* f3c - _DB_E2 */ 0x2475, +/* f3d - _9B_DB_E2 */ 0x2476, /* f3e - */ 0, /* f3f - */ 0, /* f40 - */ 0, @@ -5680,8 +5682,8 @@ _InstNode InstructionsTree[5688] = { /* f45 - */ 0, /* f46 - */ 0, /* f47 - */ 0, -/* f48 - _DB_E3 */ 0x2475, -/* f49 - _9B_DB_E3 */ 0x2476, +/* f48 - _DB_E3 */ 0x2477, +/* f49 - _9B_DB_E3 */ 0x2478, /* f4a - */ 0, /* f4b - */ 0, /* f4c - */ 0, @@ -5692,8 +5694,8 @@ _InstNode InstructionsTree[5688] = { /* f51 - */ 0, /* f52 - */ 0, /* f53 - */ 0, -/* f54 - _DD_06 */ 0x2477, -/* f55 - _9B_DD_06 */ 0x2478, +/* f54 - _DD_06 */ 0x2479, +/* f55 - _9B_DD_06 */ 0x247a, /* f56 - */ 0, /* f57 - */ 0, /* f58 - */ 0, @@ -5704,8 +5706,8 @@ _InstNode InstructionsTree[5688] = { /* f5d - */ 0, /* f5e - */ 0, /* f5f - */ 0, -/* f60 - _DD_07 */ 0x2479, -/* f61 - _9B_DD_07 */ 0x247a, +/* f60 - _DD_07 */ 0x247b, +/* f61 - _9B_DD_07 */ 0x247c, /* f62 - */ 0, /* f63 - */ 0, /* f64 - */ 0, @@ -5716,8 +5718,8 @@ _InstNode InstructionsTree[5688] = { /* f69 - */ 0, /* f6a - */ 0, /* f6b - */ 0, -/* f6c - _DF_E0 */ 0x247b, -/* f6d - _9B_DF_E0 */ 0x247c, +/* f6c - _DF_E0 */ 0x247d, +/* f6d - _9B_DF_E0 */ 0x247e, /* f6e - */ 0, /* f6f - */ 0, /* f70 - */ 0, @@ -5728,8 +5730,8 @@ _InstNode InstructionsTree[5688] = { /* f75 - */ 0, /* f76 - */ 0, /* f77 - */ 0, -/* f78 - _0F_38_00 */ 0x247d, -/* f79 - _66_0F_38_00 */ 0x247e, +/* f78 - _0F_38_00 */ 0x247f, +/* f79 - _66_0F_38_00 */ 0x2480, /* f7a - */ 0, /* f7b - */ 0, /* f7c - */ 0, @@ -5740,8 +5742,8 @@ _InstNode InstructionsTree[5688] = { /* f81 - */ 0, /* f82 - */ 0, /* f83 - */ 0, -/* f84 - _0F_38_01 */ 0x247f, -/* f85 - _66_0F_38_01 */ 0x2480, +/* f84 - _0F_38_01 */ 0x2481, +/* f85 - _66_0F_38_01 */ 0x2482, /* f86 - */ 0, /* f87 - */ 0, /* f88 - */ 0, @@ -5752,8 +5754,8 @@ _InstNode InstructionsTree[5688] = { /* f8d - */ 0, /* f8e - */ 0, /* f8f - */ 0, -/* f90 - _0F_38_02 */ 0x2481, -/* f91 - _66_0F_38_02 */ 0x2482, +/* f90 - _0F_38_02 */ 0x2483, +/* f91 - _66_0F_38_02 */ 0x2484, /* f92 - */ 0, /* f93 - */ 0, /* f94 - */ 0, @@ -5764,8 +5766,8 @@ _InstNode InstructionsTree[5688] = { /* f99 - */ 0, /* f9a - */ 0, /* f9b - */ 0, -/* f9c - _0F_38_03 */ 0x2483, -/* f9d - _66_0F_38_03 */ 0x2484, +/* f9c - _0F_38_03 */ 0x2485, +/* f9d - _66_0F_38_03 */ 0x2486, /* f9e - */ 0, /* f9f - */ 0, /* fa0 - */ 0, @@ -5776,8 +5778,8 @@ _InstNode InstructionsTree[5688] = { /* fa5 - */ 0, /* fa6 - */ 0, /* fa7 - */ 0, -/* fa8 - _0F_38_04 */ 0x2485, -/* fa9 - _66_0F_38_04 */ 0x2486, +/* fa8 - _0F_38_04 */ 0x2487, +/* fa9 - _66_0F_38_04 */ 0x2488, /* faa - */ 0, /* fab - */ 0, /* fac - */ 0, @@ -5788,8 +5790,8 @@ _InstNode InstructionsTree[5688] = { /* fb1 - */ 0, /* fb2 - */ 0, /* fb3 - */ 0, -/* fb4 - _0F_38_05 */ 0x2487, -/* fb5 - _66_0F_38_05 */ 0x2488, +/* fb4 - _0F_38_05 */ 0x2489, +/* fb5 - _66_0F_38_05 */ 0x248a, /* fb6 - */ 0, /* fb7 - */ 0, /* fb8 - */ 0, @@ -5800,8 +5802,8 @@ _InstNode InstructionsTree[5688] = { /* fbd - */ 0, /* fbe - */ 0, /* fbf - */ 0, -/* fc0 - _0F_38_06 */ 0x2489, -/* fc1 - _66_0F_38_06 */ 0x248a, +/* fc0 - _0F_38_06 */ 0x248b, +/* fc1 - _66_0F_38_06 */ 0x248c, /* fc2 - */ 0, /* fc3 - */ 0, /* fc4 - */ 0, @@ -5812,8 +5814,8 @@ _InstNode InstructionsTree[5688] = { /* fc9 - */ 0, /* fca - */ 0, /* fcb - */ 0, -/* fcc - _0F_38_07 */ 0x248b, -/* fcd - _66_0F_38_07 */ 0x248c, +/* fcc - _0F_38_07 */ 0x248d, +/* fcd - _66_0F_38_07 */ 0x248e, /* fce - */ 0, /* fcf - */ 0, /* fd0 - */ 0, @@ -5824,8 +5826,8 @@ _InstNode InstructionsTree[5688] = { /* fd5 - */ 0, /* fd6 - */ 0, /* fd7 - */ 0, -/* fd8 - _0F_38_08 */ 0x248d, -/* fd9 - _66_0F_38_08 */ 0x248e, +/* fd8 - _0F_38_08 */ 0x248f, +/* fd9 - _66_0F_38_08 */ 0x2490, /* fda - */ 0, /* fdb - */ 0, /* fdc - */ 0, @@ -5836,8 +5838,8 @@ _InstNode InstructionsTree[5688] = { /* fe1 - */ 0, /* fe2 - */ 0, /* fe3 - */ 0, -/* fe4 - _0F_38_09 */ 0x248f, -/* fe5 - _66_0F_38_09 */ 0x2490, +/* fe4 - _0F_38_09 */ 0x2491, +/* fe5 - _66_0F_38_09 */ 0x2492, /* fe6 - */ 0, /* fe7 - */ 0, /* fe8 - */ 0, @@ -5848,8 +5850,8 @@ _InstNode InstructionsTree[5688] = { /* fed - */ 0, /* fee - */ 0, /* fef - */ 0, -/* ff0 - _0F_38_0A */ 0x2491, -/* ff1 - _66_0F_38_0A */ 0x2492, +/* ff0 - _0F_38_0A */ 0x2493, +/* ff1 - _66_0F_38_0A */ 0x2494, /* ff2 - */ 0, /* ff3 - */ 0, /* ff4 - */ 0, @@ -5860,8 +5862,8 @@ _InstNode InstructionsTree[5688] = { /* ff9 - */ 0, /* ffa - */ 0, /* ffb - */ 0, -/* ffc - _0F_38_0B */ 0x2493, -/* ffd - _66_0F_38_0B */ 0x2494, +/* ffc - _0F_38_0B */ 0x2495, +/* ffd - _66_0F_38_0B */ 0x2496, /* ffe - */ 0, /* fff - */ 0, /* 1000 - */ 0, @@ -5957,7 +5959,7 @@ _InstNode InstructionsTree[5688] = { /* 105a - */ 0, /* 105b - */ 0, /* 105c - */ 0, -/* 105d - _66_0F_38_17 */ 0x2495, +/* 105d - _66_0F_38_17 */ 0x2497, /* 105e - */ 0, /* 105f - */ 0, /* 1060 - */ 0, @@ -6004,8 +6006,8 @@ _InstNode InstructionsTree[5688] = { /* 1089 - */ 0, /* 108a - */ 0, /* 108b - */ 0, -/* 108c - _0F_38_1C */ 0x2496, -/* 108d - _66_0F_38_1C */ 0x2497, +/* 108c - _0F_38_1C */ 0x2498, +/* 108d - _66_0F_38_1C */ 0x2499, /* 108e - */ 0, /* 108f - */ 0, /* 1090 - */ 0, @@ -6016,8 +6018,8 @@ _InstNode InstructionsTree[5688] = { /* 1095 - */ 0, /* 1096 - */ 0, /* 1097 - */ 0, -/* 1098 - _0F_38_1D */ 0x2498, -/* 1099 - _66_0F_38_1D */ 0x2499, +/* 1098 - _0F_38_1D */ 0x249a, +/* 1099 - _66_0F_38_1D */ 0x249b, /* 109a - */ 0, /* 109b - */ 0, /* 109c - */ 0, @@ -6028,8 +6030,8 @@ _InstNode InstructionsTree[5688] = { /* 10a1 - */ 0, /* 10a2 - */ 0, /* 10a3 - */ 0, -/* 10a4 - _0F_38_1E */ 0x249a, -/* 10a5 - _66_0F_38_1E */ 0x249b, +/* 10a4 - _0F_38_1E */ 0x249c, +/* 10a5 - _66_0F_38_1E */ 0x249d, /* 10a6 - */ 0, /* 10a7 - */ 0, /* 10a8 - */ 0, @@ -6041,7 +6043,7 @@ _InstNode InstructionsTree[5688] = { /* 10ae - */ 0, /* 10af - */ 0, /* 10b0 - */ 0, -/* 10b1 - _66_0F_38_20 */ 0x249c, +/* 10b1 - _66_0F_38_20 */ 0x249e, /* 10b2 - */ 0, /* 10b3 - */ 0, /* 10b4 - */ 0, @@ -6053,7 +6055,7 @@ _InstNode InstructionsTree[5688] = { /* 10ba - */ 0, /* 10bb - */ 0, /* 10bc - */ 0, -/* 10bd - _66_0F_38_21 */ 0x249d, +/* 10bd - _66_0F_38_21 */ 0x249f, /* 10be - */ 0, /* 10bf - */ 0, /* 10c0 - */ 0, @@ -6065,7 +6067,7 @@ _InstNode InstructionsTree[5688] = { /* 10c6 - */ 0, /* 10c7 - */ 0, /* 10c8 - */ 0, -/* 10c9 - _66_0F_38_22 */ 0x249e, +/* 10c9 - _66_0F_38_22 */ 0x24a0, /* 10ca - */ 0, /* 10cb - */ 0, /* 10cc - */ 0, @@ -6077,7 +6079,7 @@ _InstNode InstructionsTree[5688] = { /* 10d2 - */ 0, /* 10d3 - */ 0, /* 10d4 - */ 0, -/* 10d5 - _66_0F_38_23 */ 0x249f, +/* 10d5 - _66_0F_38_23 */ 0x24a1, /* 10d6 - */ 0, /* 10d7 - */ 0, /* 10d8 - */ 0, @@ -6089,7 +6091,7 @@ _InstNode InstructionsTree[5688] = { /* 10de - */ 0, /* 10df - */ 0, /* 10e0 - */ 0, -/* 10e1 - _66_0F_38_24 */ 0x24a0, +/* 10e1 - _66_0F_38_24 */ 0x24a2, /* 10e2 - */ 0, /* 10e3 - */ 0, /* 10e4 - */ 0, @@ -6101,7 +6103,7 @@ _InstNode InstructionsTree[5688] = { /* 10ea - */ 0, /* 10eb - */ 0, /* 10ec - */ 0, -/* 10ed - _66_0F_38_25 */ 0x24a1, +/* 10ed - _66_0F_38_25 */ 0x24a3, /* 10ee - */ 0, /* 10ef - */ 0, /* 10f0 - */ 0, @@ -6113,7 +6115,7 @@ _InstNode InstructionsTree[5688] = { /* 10f6 - */ 0, /* 10f7 - */ 0, /* 10f8 - */ 0, -/* 10f9 - _66_0F_38_28 */ 0x24a2, +/* 10f9 - _66_0F_38_28 */ 0x24a4, /* 10fa - */ 0, /* 10fb - */ 0, /* 10fc - */ 0, @@ -6125,7 +6127,7 @@ _InstNode InstructionsTree[5688] = { /* 1102 - */ 0, /* 1103 - */ 0, /* 1104 - */ 0, -/* 1105 - _66_0F_38_29 */ 0x24a3, +/* 1105 - _66_0F_38_29 */ 0x24a5, /* 1106 - */ 0, /* 1107 - */ 0, /* 1108 - */ 0, @@ -6137,7 +6139,7 @@ _InstNode InstructionsTree[5688] = { /* 110e - */ 0, /* 110f - */ 0, /* 1110 - */ 0, -/* 1111 - _66_0F_38_2A */ 0x24a4, +/* 1111 - _66_0F_38_2A */ 0x24a6, /* 1112 - */ 0, /* 1113 - */ 0, /* 1114 - */ 0, @@ -6149,7 +6151,7 @@ _InstNode InstructionsTree[5688] = { /* 111a - */ 0, /* 111b - */ 0, /* 111c - */ 0, -/* 111d - _66_0F_38_2B */ 0x24a5, +/* 111d - _66_0F_38_2B */ 0x24a7, /* 111e - */ 0, /* 111f - */ 0, /* 1120 - */ 0, @@ -6209,7 +6211,7 @@ _InstNode InstructionsTree[5688] = { /* 1156 - */ 0, /* 1157 - */ 0, /* 1158 - */ 0, -/* 1159 - _66_0F_38_30 */ 0x24a6, +/* 1159 - _66_0F_38_30 */ 0x24a8, /* 115a - */ 0, /* 115b - */ 0, /* 115c - */ 0, @@ -6221,7 +6223,7 @@ _InstNode InstructionsTree[5688] = { /* 1162 - */ 0, /* 1163 - */ 0, /* 1164 - */ 0, -/* 1165 - _66_0F_38_31 */ 0x24a7, +/* 1165 - _66_0F_38_31 */ 0x24a9, /* 1166 - */ 0, /* 1167 - */ 0, /* 1168 - */ 0, @@ -6233,7 +6235,7 @@ _InstNode InstructionsTree[5688] = { /* 116e - */ 0, /* 116f - */ 0, /* 1170 - */ 0, -/* 1171 - _66_0F_38_32 */ 0x24a8, +/* 1171 - _66_0F_38_32 */ 0x24aa, /* 1172 - */ 0, /* 1173 - */ 0, /* 1174 - */ 0, @@ -6245,7 +6247,7 @@ _InstNode InstructionsTree[5688] = { /* 117a - */ 0, /* 117b - */ 0, /* 117c - */ 0, -/* 117d - _66_0F_38_33 */ 0x24a9, +/* 117d - _66_0F_38_33 */ 0x24ab, /* 117e - */ 0, /* 117f - */ 0, /* 1180 - */ 0, @@ -6257,7 +6259,7 @@ _InstNode InstructionsTree[5688] = { /* 1186 - */ 0, /* 1187 - */ 0, /* 1188 - */ 0, -/* 1189 - _66_0F_38_34 */ 0x24aa, +/* 1189 - _66_0F_38_34 */ 0x24ac, /* 118a - */ 0, /* 118b - */ 0, /* 118c - */ 0, @@ -6269,7 +6271,7 @@ _InstNode InstructionsTree[5688] = { /* 1192 - */ 0, /* 1193 - */ 0, /* 1194 - */ 0, -/* 1195 - _66_0F_38_35 */ 0x24ab, +/* 1195 - _66_0F_38_35 */ 0x24ad, /* 1196 - */ 0, /* 1197 - */ 0, /* 1198 - */ 0, @@ -6281,7 +6283,7 @@ _InstNode InstructionsTree[5688] = { /* 119e - */ 0, /* 119f - */ 0, /* 11a0 - */ 0, -/* 11a1 - _66_0F_38_37 */ 0x24ac, +/* 11a1 - _66_0F_38_37 */ 0x24ae, /* 11a2 - */ 0, /* 11a3 - */ 0, /* 11a4 - */ 0, @@ -6293,7 +6295,7 @@ _InstNode InstructionsTree[5688] = { /* 11aa - */ 0, /* 11ab - */ 0, /* 11ac - */ 0, -/* 11ad - _66_0F_38_38 */ 0x24ad, +/* 11ad - _66_0F_38_38 */ 0x24af, /* 11ae - */ 0, /* 11af - */ 0, /* 11b0 - */ 0, @@ -6305,7 +6307,7 @@ _InstNode InstructionsTree[5688] = { /* 11b6 - */ 0, /* 11b7 - */ 0, /* 11b8 - */ 0, -/* 11b9 - _66_0F_38_39 */ 0x24ae, +/* 11b9 - _66_0F_38_39 */ 0x24b0, /* 11ba - */ 0, /* 11bb - */ 0, /* 11bc - */ 0, @@ -6317,7 +6319,7 @@ _InstNode InstructionsTree[5688] = { /* 11c2 - */ 0, /* 11c3 - */ 0, /* 11c4 - */ 0, -/* 11c5 - _66_0F_38_3A */ 0x24af, +/* 11c5 - _66_0F_38_3A */ 0x24b1, /* 11c6 - */ 0, /* 11c7 - */ 0, /* 11c8 - */ 0, @@ -6329,7 +6331,7 @@ _InstNode InstructionsTree[5688] = { /* 11ce - */ 0, /* 11cf - */ 0, /* 11d0 - */ 0, -/* 11d1 - _66_0F_38_3B */ 0x24b0, +/* 11d1 - _66_0F_38_3B */ 0x24b2, /* 11d2 - */ 0, /* 11d3 - */ 0, /* 11d4 - */ 0, @@ -6341,7 +6343,7 @@ _InstNode InstructionsTree[5688] = { /* 11da - */ 0, /* 11db - */ 0, /* 11dc - */ 0, -/* 11dd - _66_0F_38_3C */ 0x24b1, +/* 11dd - _66_0F_38_3C */ 0x24b3, /* 11de - */ 0, /* 11df - */ 0, /* 11e0 - */ 0, @@ -6353,7 +6355,7 @@ _InstNode InstructionsTree[5688] = { /* 11e6 - */ 0, /* 11e7 - */ 0, /* 11e8 - */ 0, -/* 11e9 - _66_0F_38_3D */ 0x24b2, +/* 11e9 - _66_0F_38_3D */ 0x24b4, /* 11ea - */ 0, /* 11eb - */ 0, /* 11ec - */ 0, @@ -6365,7 +6367,7 @@ _InstNode InstructionsTree[5688] = { /* 11f2 - */ 0, /* 11f3 - */ 0, /* 11f4 - */ 0, -/* 11f5 - _66_0F_38_3E */ 0x24b3, +/* 11f5 - _66_0F_38_3E */ 0x24b5, /* 11f6 - */ 0, /* 11f7 - */ 0, /* 11f8 - */ 0, @@ -6377,7 +6379,7 @@ _InstNode InstructionsTree[5688] = { /* 11fe - */ 0, /* 11ff - */ 0, /* 1200 - */ 0, -/* 1201 - _66_0F_38_3F */ 0x24b4, +/* 1201 - _66_0F_38_3F */ 0x24b6, /* 1202 - */ 0, /* 1203 - */ 0, /* 1204 - */ 0, @@ -6389,7 +6391,7 @@ _InstNode InstructionsTree[5688] = { /* 120a - */ 0, /* 120b - */ 0, /* 120c - */ 0, -/* 120d - _66_0F_38_40 */ 0x24b5, +/* 120d - _66_0F_38_40 */ 0x24b7, /* 120e - */ 0, /* 120f - */ 0, /* 1210 - */ 0, @@ -6401,7 +6403,7 @@ _InstNode InstructionsTree[5688] = { /* 1216 - */ 0, /* 1217 - */ 0, /* 1218 - */ 0, -/* 1219 - _66_0F_38_41 */ 0x24b6, +/* 1219 - _66_0F_38_41 */ 0x24b8, /* 121a - */ 0, /* 121b - */ 0, /* 121c - */ 0, @@ -6413,7 +6415,7 @@ _InstNode InstructionsTree[5688] = { /* 1222 - */ 0, /* 1223 - */ 0, /* 1224 - */ 0, -/* 1225 - _66_0F_38_80 */ 0x24b7, +/* 1225 - _66_0F_38_80 */ 0x24b9, /* 1226 - */ 0, /* 1227 - */ 0, /* 1228 - */ 0, @@ -6425,7 +6427,7 @@ _InstNode InstructionsTree[5688] = { /* 122e - */ 0, /* 122f - */ 0, /* 1230 - */ 0, -/* 1231 - _66_0F_38_81 */ 0x24b8, +/* 1231 - _66_0F_38_81 */ 0x24ba, /* 1232 - */ 0, /* 1233 - */ 0, /* 1234 - */ 0, @@ -6437,7 +6439,7 @@ _InstNode InstructionsTree[5688] = { /* 123a - */ 0, /* 123b - */ 0, /* 123c - */ 0, -/* 123d - _66_0F_38_82 */ 0x24b9, +/* 123d - _66_0F_38_82 */ 0x24bb, /* 123e - */ 0, /* 123f - */ 0, /* 1240 - */ 0, @@ -6809,7 +6811,7 @@ _InstNode InstructionsTree[5688] = { /* 13ae - */ 0, /* 13af - */ 0, /* 13b0 - */ 0, -/* 13b1 - _66_0F_38_DB */ 0x24ba, +/* 13b1 - _66_0F_38_DB */ 0x24bc, /* 13b2 - */ 0, /* 13b3 - */ 0, /* 13b4 - */ 0, @@ -6821,7 +6823,7 @@ _InstNode InstructionsTree[5688] = { /* 13ba - */ 0, /* 13bb - */ 0, /* 13bc - */ 0, -/* 13bd - _66_0F_38_DC */ 0x24bb, +/* 13bd - _66_0F_38_DC */ 0x24bd, /* 13be - */ 0, /* 13bf - */ 0, /* 13c0 - */ 0, @@ -6833,7 +6835,7 @@ _InstNode InstructionsTree[5688] = { /* 13c6 - */ 0, /* 13c7 - */ 0, /* 13c8 - */ 0, -/* 13c9 - _66_0F_38_DD */ 0x24bc, +/* 13c9 - _66_0F_38_DD */ 0x24be, /* 13ca - */ 0, /* 13cb - */ 0, /* 13cc - */ 0, @@ -6845,7 +6847,7 @@ _InstNode InstructionsTree[5688] = { /* 13d2 - */ 0, /* 13d3 - */ 0, /* 13d4 - */ 0, -/* 13d5 - _66_0F_38_DE */ 0x24bd, +/* 13d5 - _66_0F_38_DE */ 0x24bf, /* 13d6 - */ 0, /* 13d7 - */ 0, /* 13d8 - */ 0, @@ -6857,7 +6859,7 @@ _InstNode InstructionsTree[5688] = { /* 13de - */ 0, /* 13df - */ 0, /* 13e0 - */ 0, -/* 13e1 - _66_0F_38_DF */ 0x24be, +/* 13e1 - _66_0F_38_DF */ 0x24c0, /* 13e2 - */ 0, /* 13e3 - */ 0, /* 13e4 - */ 0, @@ -6868,10 +6870,10 @@ _InstNode InstructionsTree[5688] = { /* 13e9 - */ 0, /* 13ea - */ 0, /* 13eb - */ 0, -/* 13ec - _0F_38_F0 */ 0x24bf, +/* 13ec - _0F_38_F0 */ 0x24c1, /* 13ed - */ 0, /* 13ee - */ 0, -/* 13ef - _F2_0F_38_F0 */ 0x24c0, +/* 13ef - _F2_0F_38_F0 */ 0x24c2, /* 13f0 - */ 0, /* 13f1 - */ 0, /* 13f2 - */ 0, @@ -6880,10 +6882,10 @@ _InstNode InstructionsTree[5688] = { /* 13f5 - */ 0, /* 13f6 - */ 0, /* 13f7 - */ 0, -/* 13f8 - _0F_38_F1 */ 0x24c1, +/* 13f8 - _0F_38_F1 */ 0x24c3, /* 13f9 - */ 0, /* 13fa - */ 0, -/* 13fb - _F2_0F_38_F1 */ 0x24c2, +/* 13fb - _F2_0F_38_F1 */ 0x24c4, /* 13fc - */ 0, /* 13fd - */ 0, /* 13fe - */ 0, @@ -7276,8 +7278,8 @@ _InstNode InstructionsTree[5688] = { /* 1581 - */ 0, /* 1582 - */ 0, /* 1583 - */ 0, -/* 1584 - _0F_71_02 */ 0x24c3, -/* 1585 - _66_0F_71_02 */ 0x24c4, +/* 1584 - _0F_71_02 */ 0x24c5, +/* 1585 - _66_0F_71_02 */ 0x24c6, /* 1586 - */ 0, /* 1587 - */ 0, /* 1588 - */ 0, @@ -7288,8 +7290,8 @@ _InstNode InstructionsTree[5688] = { /* 158d - */ 0, /* 158e - */ 0, /* 158f - */ 0, -/* 1590 - _0F_71_04 */ 0x24c5, -/* 1591 - _66_0F_71_04 */ 0x24c6, +/* 1590 - _0F_71_04 */ 0x24c7, +/* 1591 - _66_0F_71_04 */ 0x24c8, /* 1592 - */ 0, /* 1593 - */ 0, /* 1594 - */ 0, @@ -7300,8 +7302,8 @@ _InstNode InstructionsTree[5688] = { /* 1599 - */ 0, /* 159a - */ 0, /* 159b - */ 0, -/* 159c - _0F_71_06 */ 0x24c7, -/* 159d - _66_0F_71_06 */ 0x24c8, +/* 159c - _0F_71_06 */ 0x24c9, +/* 159d - _66_0F_71_06 */ 0x24ca, /* 159e - */ 0, /* 159f - */ 0, /* 15a0 - */ 0, @@ -7312,8 +7314,8 @@ _InstNode InstructionsTree[5688] = { /* 15a5 - */ 0, /* 15a6 - */ 0, /* 15a7 - */ 0, -/* 15a8 - _0F_72_02 */ 0x24c9, -/* 15a9 - _66_0F_72_02 */ 0x24ca, +/* 15a8 - _0F_72_02 */ 0x24cb, +/* 15a9 - _66_0F_72_02 */ 0x24cc, /* 15aa - */ 0, /* 15ab - */ 0, /* 15ac - */ 0, @@ -7324,8 +7326,8 @@ _InstNode InstructionsTree[5688] = { /* 15b1 - */ 0, /* 15b2 - */ 0, /* 15b3 - */ 0, -/* 15b4 - _0F_72_04 */ 0x24cb, -/* 15b5 - _66_0F_72_04 */ 0x24cc, +/* 15b4 - _0F_72_04 */ 0x24cd, +/* 15b5 - _66_0F_72_04 */ 0x24ce, /* 15b6 - */ 0, /* 15b7 - */ 0, /* 15b8 - */ 0, @@ -7336,8 +7338,8 @@ _InstNode InstructionsTree[5688] = { /* 15bd - */ 0, /* 15be - */ 0, /* 15bf - */ 0, -/* 15c0 - _0F_72_06 */ 0x24cd, -/* 15c1 - _66_0F_72_06 */ 0x24ce, +/* 15c0 - _0F_72_06 */ 0x24cf, +/* 15c1 - _66_0F_72_06 */ 0x24d0, /* 15c2 - */ 0, /* 15c3 - */ 0, /* 15c4 - */ 0, @@ -7348,8 +7350,8 @@ _InstNode InstructionsTree[5688] = { /* 15c9 - */ 0, /* 15ca - */ 0, /* 15cb - */ 0, -/* 15cc - _0F_73_02 */ 0x24cf, -/* 15cd - _66_0F_73_02 */ 0x24d0, +/* 15cc - _0F_73_02 */ 0x24d1, +/* 15cd - _66_0F_73_02 */ 0x24d2, /* 15ce - */ 0, /* 15cf - */ 0, /* 15d0 - */ 0, @@ -7361,7 +7363,7 @@ _InstNode InstructionsTree[5688] = { /* 15d6 - */ 0, /* 15d7 - */ 0, /* 15d8 - */ 0, -/* 15d9 - _66_0F_73_03 */ 0x24d1, +/* 15d9 - _66_0F_73_03 */ 0x24d3, /* 15da - */ 0, /* 15db - */ 0, /* 15dc - */ 0, @@ -7372,8 +7374,8 @@ _InstNode InstructionsTree[5688] = { /* 15e1 - */ 0, /* 15e2 - */ 0, /* 15e3 - */ 0, -/* 15e4 - _0F_73_06 */ 0x24d2, -/* 15e5 - _66_0F_73_06 */ 0x24d3, +/* 15e4 - _0F_73_06 */ 0x24d4, +/* 15e5 - _66_0F_73_06 */ 0x24d5, /* 15e6 - */ 0, /* 15e7 - */ 0, /* 15e8 - */ 0, @@ -7385,7 +7387,7 @@ _InstNode InstructionsTree[5688] = { /* 15ee - */ 0, /* 15ef - */ 0, /* 15f0 - */ 0, -/* 15f1 - _66_0F_73_07 */ 0x24d4, +/* 15f1 - _66_0F_73_07 */ 0x24d6, /* 15f2 - */ 0, /* 15f3 - */ 0, /* 15f4 - */ 0, @@ -7398,7 +7400,7 @@ _InstNode InstructionsTree[5688] = { /* 15fb - */ 0, /* 15fc - _0F_AE_00 */ 0x4179, /* 15fd - */ 0, -/* 15fe - _F3_0F_AE_00 */ 0x24d5, +/* 15fe - _F3_0F_AE_00 */ 0x24d7, /* 15ff - */ 0, /* 1600 - */ 0, /* 1601 - */ 0, @@ -7410,7 +7412,7 @@ _InstNode InstructionsTree[5688] = { /* 1607 - */ 0, /* 1608 - _0F_AE_01 */ 0x417a, /* 1609 - */ 0, -/* 160a - _F3_0F_AE_01 */ 0x24d6, +/* 160a - _F3_0F_AE_01 */ 0x24d8, /* 160b - */ 0, /* 160c - */ 0, /* 160d - */ 0, @@ -7420,9 +7422,9 @@ _InstNode InstructionsTree[5688] = { /* 1611 - */ 0, /* 1612 - */ 0, /* 1613 - */ 0, -/* 1614 - _0F_AE_02 */ 0x24d7, +/* 1614 - _0F_AE_02 */ 0x24d9, /* 1615 - */ 0, -/* 1616 - _F3_0F_AE_02 */ 0x24d8, +/* 1616 - _F3_0F_AE_02 */ 0x24da, /* 1617 - */ 0, /* 1618 - _V_0F_AE_02 */ 0x417b, /* 1619 - */ 0, @@ -7432,9 +7434,9 @@ _InstNode InstructionsTree[5688] = { /* 161d - */ 0, /* 161e - */ 0, /* 161f - */ 0, -/* 1620 - _0F_AE_03 */ 0x24d9, +/* 1620 - _0F_AE_03 */ 0x24db, /* 1621 - */ 0, -/* 1622 - _F3_0F_AE_03 */ 0x24da, +/* 1622 - _F3_0F_AE_03 */ 0x24dc, /* 1623 - */ 0, /* 1624 - _V_0F_AE_03 */ 0x417c, /* 1625 - */ 0, @@ -7444,9 +7446,9 @@ _InstNode InstructionsTree[5688] = { /* 1629 - */ 0, /* 162a - */ 0, /* 162b - */ 0, -/* 162c - _0F_C7_06 */ 0x24db, -/* 162d - _66_0F_C7_06 */ 0x24dc, -/* 162e - _F3_0F_C7_06 */ 0x24dd, +/* 162c - _0F_C7_06 */ 0x24dd, +/* 162d - _66_0F_C7_06 */ 0x24de, +/* 162e - _F3_0F_C7_06 */ 0x24df, /* 162f - */ 0, /* 1630 - */ 0, /* 1631 - */ 0, @@ -7458,478 +7460,481 @@ _InstNode InstructionsTree[5688] = { /* 1637 - */ 0 }; -_InstSharedInfo InstSharedInfoTable[471] = { -{0, 9, 15, 8, 245, 0, 0}, -{0, 11, 17, 8, 245, 0, 0}, -{0, 15, 9, 8, 245, 0, 0}, -{0, 17, 11, 8, 245, 0, 0}, -{1, 1, 33, 8, 245, 0, 0}, -{1, 3, 35, 8, 245, 0, 0}, -{2, 0, 32, 8, 0, 0, 0}, -{3, 0, 32, 8, 0, 0, 0}, -{0, 9, 15, 8, 196, 16, 0}, -{0, 11, 17, 8, 196, 16, 0}, -{0, 15, 9, 8, 196, 16, 0}, -{0, 17, 11, 8, 196, 16, 0}, -{1, 1, 33, 8, 196, 16, 0}, -{1, 3, 35, 8, 196, 16, 0}, -{4, 0, 32, 8, 0, 0, 0}, -{0, 9, 15, 8, 245, 1, 0}, -{0, 11, 17, 8, 245, 1, 0}, -{0, 15, 9, 8, 245, 1, 0}, -{0, 17, 11, 8, 245, 1, 0}, -{1, 1, 33, 8, 245, 1, 0}, -{1, 3, 35, 8, 245, 1, 0}, -{5, 0, 32, 8, 0, 0, 0}, -{6, 0, 32, 8, 0, 0, 0}, -{7, 0, 32, 8, 0, 0, 0}, -{8, 0, 32, 8, 0, 0, 0}, -{0, 9, 15, 8, 229, 0, 16}, -{0, 11, 17, 8, 229, 0, 16}, -{0, 15, 9, 8, 229, 0, 16}, -{0, 17, 11, 8, 229, 0, 16}, -{1, 1, 33, 8, 229, 0, 16}, -{1, 3, 35, 8, 229, 0, 16}, -{9, 0, 0, 8, 213, 17, 32}, -{0, 9, 15, 8, 196, 0, 16}, -{0, 11, 17, 8, 196, 0, 16}, -{0, 15, 9, 8, 196, 0, 16}, -{0, 17, 11, 8, 196, 0, 16}, -{1, 1, 33, 8, 196, 0, 16}, -{1, 3, 35, 8, 196, 0, 16}, -{9, 0, 0, 8, 17, 16, 228}, -{10, 9, 15, 8, 245, 0, 0}, -{10, 11, 17, 8, 245, 0, 0}, -{10, 15, 9, 8, 245, 0, 0}, -{10, 17, 11, 8, 245, 0, 0}, -{11, 1, 33, 8, 245, 0, 0}, -{11, 3, 35, 8, 245, 0, 0}, -{12, 0, 54, 8, 244, 0, 0}, -{13, 0, 54, 8, 0, 0, 0}, -{14, 0, 54, 8, 0, 0, 0}, -{15, 0, 0, 8, 0, 0, 0}, -{16, 42, 11, 8, 0, 0, 0}, -{10, 10, 16, 8, 64, 0, 0}, -{13, 0, 3, 8, 0, 0, 0}, -{17, 17, 11, 8, 33, 0, 212}, -{18, 0, 5, 8, 0, 0, 0}, -{19, 59, 56, 8, 0, 8, 0}, -{20, 59, 56, 8, 0, 8, 0}, -{19, 55, 59, 8, 0, 8, 0}, -{20, 55, 59, 8, 0, 8, 0}, -{13, 0, 40, 13, 0, 32, 0}, -{13, 0, 40, 13, 0, 1, 0}, -{13, 0, 40, 13, 0, 64, 0}, -{13, 0, 40, 13, 0, 65, 0}, -{13, 0, 40, 13, 0, 128, 0}, -{13, 0, 40, 13, 0, 4, 0}, -{13, 0, 40, 13, 0, 160, 0}, -{13, 0, 40, 13, 0, 224, 0}, -{10, 9, 15, 8, 196, 0, 16}, -{10, 11, 17, 8, 196, 0, 16}, -{0, 9, 15, 8, 0, 0, 0}, -{0, 11, 17, 8, 0, 0, 0}, -{21, 9, 15, 8, 0, 0, 0}, -{21, 11, 17, 8, 0, 0, 0}, -{21, 15, 9, 8, 0, 0, 0}, -{21, 17, 11, 8, 0, 0, 0}, -{21, 31, 28, 8, 0, 0, 0}, -{21, 42, 11, 8, 0, 0, 0}, -{21, 28, 31, 8, 0, 0, 0}, -{1, 35, 54, 8, 0, 0, 0}, -{22, 0, 0, 8, 0, 0, 0}, -{9, 0, 38, 9, 0, 0, 0}, -{23, 0, 0, 8, 0, 0, 0}, -{23, 0, 0, 8, 255, 0, 0}, -{11, 0, 0, 8, 213, 0, 0}, -{11, 0, 0, 8, 0, 0, 0}, -{1, 49, 33, 8, 0, 0, 0}, -{1, 50, 35, 8, 0, 0, 0}, -{1, 33, 49, 8, 0, 0, 0}, -{1, 35, 50, 8, 0, 0, 0}, -{24, 55, 56, 8, 0, 8, 0}, -{25, 55, 56, 8, 0, 8, 0}, -{19, 56, 55, 8, 245, 8, 0}, -{26, 56, 55, 8, 245, 8, 0}, -{11, 1, 33, 8, 196, 0, 16}, -{11, 3, 35, 8, 196, 0, 16}, -{19, 33, 56, 8, 0, 8, 0}, -{26, 35, 56, 8, 0, 8, 0}, -{19, 55, 33, 8, 0, 8, 0}, -{26, 55, 35, 8, 0, 8, 0}, -{19, 33, 56, 8, 245, 8, 0}, -{26, 35, 56, 8, 245, 8, 0}, -{1, 1, 53, 8, 0, 0, 0}, -{27, 3, 54, 8, 0, 0, 0}, -{13, 0, 2, 10, 0, 0, 0}, -{13, 0, 0, 10, 0, 0, 0}, -{16, 37, 11, 8, 0, 0, 0}, -{13, 8, 6, 8, 0, 0, 0}, -{13, 0, 0, 8, 0, 0, 0}, -{28, 0, 2, 10, 0, 0, 0}, -{28, 0, 0, 10, 0, 0, 0}, -{11, 0, 0, 14, 0, 0, 0}, -{11, 0, 1, 14, 0, 0, 0}, -{9, 0, 0, 14, 0, 0, 0}, -{28, 0, 0, 10, 255, 0, 0}, -{9, 0, 1, 8, 196, 0, 49}, -{9, 0, 0, 8, 0, 0, 0}, -{29, 0, 57, 8, 0, 0, 0}, -{30, 0, 40, 13, 0, 64, 0}, -{30, 0, 40, 13, 0, 0, 0}, -{31, 0, 40, 13, 0, 0, 0}, -{1, 1, 33, 8, 0, 0, 0}, -{1, 1, 36, 8, 0, 0, 0}, -{11, 33, 1, 8, 0, 0, 0}, -{11, 36, 1, 8, 0, 0, 0}, -{13, 0, 41, 9, 0, 0, 0}, -{13, 0, 41, 12, 0, 0, 0}, -{9, 0, 38, 12, 0, 0, 0}, -{13, 0, 40, 12, 0, 0, 0}, -{1, 59, 33, 8, 0, 0, 0}, -{1, 59, 36, 8, 0, 0, 0}, -{11, 33, 59, 8, 0, 0, 0}, -{11, 36, 59, 8, 0, 0, 0}, -{11, 0, 0, 8, 1, 0, 0}, -{11, 0, 0, 8, 2, 0, 0}, -{11, 0, 0, 8, 8, 0, 0}, -{10, 16, 11, 8, 64, 0, 0}, -{32, 0, 0, 27, 0, 0, 0}, -{32, 0, 0, 8, 0, 0, 0}, -{32, 0, 0, 14, 0, 0, 0}, -{11, 0, 0, 96, 0, 0, 0}, -{10, 0, 17, 8, 0, 0, 0}, -{33, 29, 14, 8, 0, 0, 0}, -{33, 30, 14, 8, 0, 0, 0}, -{33, 14, 29, 8, 0, 0, 0}, -{33, 14, 30, 8, 0, 0, 0}, -{34, 0, 0, 8, 0, 0, 0}, -{35, 17, 11, 31, 0, 32, 0}, -{35, 17, 11, 31, 0, 1, 0}, -{35, 17, 11, 31, 0, 64, 0}, -{35, 17, 11, 31, 0, 65, 0}, -{35, 17, 11, 31, 0, 128, 0}, -{35, 17, 11, 31, 0, 4, 0}, -{35, 17, 11, 31, 0, 160, 0}, -{35, 17, 11, 31, 0, 224, 0}, -{32, 0, 41, 13, 0, 32, 0}, -{32, 0, 41, 13, 0, 1, 0}, -{32, 0, 41, 13, 0, 64, 0}, -{32, 0, 41, 13, 0, 65, 0}, -{32, 0, 41, 13, 0, 128, 0}, -{32, 0, 41, 13, 0, 4, 0}, -{32, 0, 41, 13, 0, 160, 0}, -{32, 0, 41, 13, 0, 224, 0}, -{35, 0, 15, 8, 0, 32, 0}, -{35, 0, 15, 8, 0, 1, 0}, -{35, 0, 15, 8, 0, 64, 0}, -{35, 0, 15, 8, 0, 65, 0}, -{35, 0, 15, 8, 0, 128, 0}, -{35, 0, 15, 8, 0, 4, 0}, -{35, 0, 15, 8, 0, 160, 0}, -{35, 0, 15, 8, 0, 224, 0}, -{36, 0, 32, 8, 0, 0, 0}, -{37, 0, 32, 8, 0, 0, 0}, -{35, 11, 17, 8, 1, 0, 244}, -{38, 11, 17, 8, 197, 0, 48}, -{39, 0, 32, 8, 0, 0, 0}, -{40, 0, 32, 8, 0, 0, 0}, -{32, 0, 0, 8, 255, 0, 0}, -{41, 11, 17, 8, 1, 0, 244}, -{35, 17, 11, 8, 33, 0, 212}, -{41, 9, 15, 8, 245, 0, 0}, -{41, 11, 17, 8, 245, 0, 0}, -{42, 37, 11, 8, 0, 0, 0}, -{35, 15, 11, 8, 0, 0, 0}, -{43, 16, 11, 8, 0, 0, 0}, -{43, 13, 45, 48, 0, 0, 0}, -{44, 0, 54, 8, 0, 0, 0}, -{45, 1, 15, 8, 245, 0, 0}, -{45, 1, 15, 8, 196, 16, 0}, -{45, 1, 15, 8, 245, 1, 0}, -{45, 1, 15, 8, 229, 0, 16}, -{45, 1, 15, 8, 196, 0, 16}, -{46, 1, 15, 8, 245, 0, 0}, -{45, 3, 17, 8, 245, 0, 0}, -{45, 3, 17, 8, 196, 16, 0}, -{45, 3, 17, 8, 245, 1, 0}, -{45, 3, 17, 8, 229, 0, 16}, -{45, 3, 17, 8, 196, 0, 16}, -{46, 3, 17, 8, 245, 0, 0}, -{47, 1, 15, 8, 245, 0, 0}, -{47, 1, 15, 8, 196, 16, 0}, -{47, 1, 15, 8, 245, 1, 0}, -{47, 1, 15, 8, 229, 0, 16}, -{47, 1, 15, 8, 196, 0, 16}, -{48, 1, 15, 8, 245, 0, 0}, -{45, 5, 17, 8, 245, 0, 0}, -{49, 5, 17, 8, 196, 16, 0}, -{45, 5, 17, 8, 245, 1, 0}, -{49, 5, 17, 8, 229, 0, 16}, -{49, 5, 17, 8, 196, 0, 16}, -{46, 5, 17, 8, 245, 0, 0}, -{50, 0, 17, 8, 0, 0, 0}, -{51, 1, 15, 8, 1, 0, 32}, -{51, 1, 15, 8, 1, 1, 32}, -{51, 1, 15, 8, 197, 0, 48}, -{51, 1, 17, 8, 1, 0, 32}, -{51, 1, 17, 8, 1, 1, 32}, -{51, 1, 17, 8, 197, 0, 48}, -{52, 1, 15, 8, 0, 0, 0}, -{53, 0, 1, 24, 0, 0, 0}, -{52, 3, 17, 8, 0, 0, 0}, -{53, 0, 41, 24, 0, 0, 0}, -{51, 51, 15, 8, 33, 0, 0}, -{51, 51, 15, 8, 33, 1, 0}, -{51, 51, 15, 8, 229, 0, 16}, -{51, 51, 17, 8, 33, 0, 0}, -{51, 51, 17, 8, 33, 1, 0}, -{51, 51, 17, 8, 229, 0, 16}, -{51, 52, 15, 8, 1, 0, 32}, -{51, 52, 15, 8, 1, 1, 32}, -{51, 52, 15, 8, 197, 0, 48}, -{51, 52, 17, 8, 1, 0, 32}, -{51, 52, 17, 8, 1, 1, 32}, -{51, 52, 17, 8, 197, 0, 48}, -{46, 0, 21, 16, 0, 0, 0}, -{54, 0, 62, 16, 0, 0, 0}, -{54, 0, 61, 16, 0, 0, 0}, -{54, 0, 0, 16, 0, 0, 0}, -{51, 0, 21, 16, 0, 0, 0}, -{46, 0, 42, 16, 0, 0, 0}, -{46, 0, 20, 16, 0, 0, 0}, -{55, 0, 62, 24, 0, 1, 0}, -{55, 0, 62, 24, 0, 64, 0}, -{55, 0, 62, 24, 0, 65, 0}, -{55, 0, 62, 24, 0, 4, 0}, -{56, 0, 21, 56, 0, 0, 0}, -{46, 0, 23, 16, 0, 0, 0}, -{51, 0, 23, 16, 0, 0, 0}, -{55, 0, 62, 16, 69, 0, 0}, -{55, 0, 62, 24, 69, 0, 0}, -{46, 0, 22, 16, 0, 0, 0}, -{54, 0, 63, 16, 0, 0, 0}, -{56, 0, 22, 56, 0, 0, 0}, -{51, 0, 22, 16, 0, 0, 0}, -{56, 0, 20, 56, 0, 0, 0}, -{51, 0, 20, 16, 0, 0, 0}, -{46, 1, 15, 8, 196, 0, 16}, -{45, 0, 15, 8, 0, 0, 0}, -{45, 0, 15, 8, 245, 0, 0}, -{51, 0, 15, 8, 33, 0, 212}, -{51, 0, 15, 8, 0, 0, 245}, -{46, 3, 17, 8, 196, 0, 16}, -{45, 0, 17, 8, 0, 0, 0}, -{45, 0, 17, 8, 245, 0, 0}, -{51, 0, 17, 8, 33, 0, 212}, -{51, 0, 17, 8, 0, 0, 245}, -{45, 0, 15, 8, 244, 0, 0}, -{45, 0, 17, 8, 244, 0, 0}, -{57, 0, 17, 9, 0, 0, 0}, -{58, 0, 37, 9, 0, 0, 0}, -{57, 0, 17, 12, 0, 0, 0}, -{58, 0, 37, 12, 0, 0, 0}, -{57, 0, 17, 8, 0, 0, 0}, -{46, 0, 17, 8, 0, 0, 0}, -{46, 0, 16, 8, 0, 0, 0}, -{56, 0, 16, 8, 0, 0, 0}, -{46, 0, 16, 8, 64, 0, 0}, -{57, 0, 39, 8, 0, 0, 0}, -{52, 0, 28, 8, 0, 0, 0}, -{59, 0, 16, 8, 0, 0, 0}, -{56, 0, 42, 8, 0, 0, 0}, -{55, 0, 0, 112, 0, 0, 0}, -{55, 0, 0, 8, 0, 0, 0}, -{13, 0, 0, 24, 0, 0, 0}, -{56, 0, 58, 120, 0, 0, 0}, -{55, 0, 0, 120, 0, 0, 0}, -{55, 0, 58, 120, 0, 0, 0}, -{55, 60, 58, 120, 0, 0, 0}, -{60, 0, 0, 8, 0, 0, 0}, -{56, 0, 42, 96, 0, 0, 0}, -{61, 67, 64, 104, 0, 0, 0}, -{61, 67, 64, 96, 0, 0, 0}, -{35, 73, 68, 40, 0, 0, 0}, -{35, 73, 68, 48, 0, 0, 0}, -{35, 71, 68, 40, 0, 0, 0}, -{35, 72, 68, 48, 0, 0, 0}, -{62, 90, 83, 128, 0, 0, 0}, -{63, 81, 68, 128, 0, 0, 0}, -{64, 44, 68, 128, 0, 0, 0}, -{64, 46, 68, 128, 0, 0, 0}, -{35, 68, 73, 40, 0, 0, 0}, -{35, 68, 73, 48, 0, 0, 0}, -{35, 68, 71, 40, 0, 0, 0}, -{35, 68, 72, 48, 0, 0, 0}, -{62, 83, 90, 128, 0, 0, 0}, -{64, 68, 44, 128, 0, 0, 0}, -{64, 68, 46, 128, 0, 0, 0}, -{65, 72, 68, 40, 0, 0, 0}, -{35, 46, 68, 48, 0, 0, 0}, -{35, 72, 68, 56, 0, 0, 0}, -{66, 81, 68, 128, 0, 0, 0}, -{67, 81, 68, 128, 0, 0, 0}, -{62, 89, 83, 128, 0, 0, 0}, -{35, 68, 46, 40, 0, 0, 0}, -{35, 68, 46, 48, 0, 0, 0}, -{62, 68, 46, 128, 0, 0, 0}, -{34, 73, 68, 40, 0, 0, 0}, -{34, 73, 68, 48, 0, 0, 0}, -{67, 88, 83, 128, 0, 0, 0}, -{35, 73, 68, 56, 0, 0, 0}, -{56, 0, 42, 40, 0, 0, 0}, -{34, 67, 68, 40, 0, 0, 0}, -{34, 67, 68, 48, 0, 0, 0}, -{42, 18, 68, 40, 0, 0, 0}, -{42, 18, 68, 48, 0, 0, 0}, -{35, 68, 47, 40, 0, 0, 0}, -{35, 68, 47, 48, 0, 0, 0}, -{35, 68, 44, 88, 0, 0, 0}, -{35, 68, 46, 88, 0, 0, 0}, -{62, 83, 92, 128, 0, 0, 0}, -{34, 72, 64, 40, 0, 0, 0}, -{34, 73, 64, 48, 0, 0, 0}, -{42, 71, 13, 40, 0, 0, 0}, -{42, 72, 13, 48, 0, 0, 0}, -{62, 80, 78, 128, 0, 0, 0}, -{34, 71, 68, 40, 69, 0, 0}, -{34, 72, 68, 48, 0, 0, 0}, -{62, 71, 68, 128, 0, 0, 0}, -{62, 72, 68, 128, 0, 0, 0}, -{68, 69, 12, 40, 0, 0, 0}, -{68, 69, 12, 48, 0, 0, 0}, -{69, 83, 13, 128, 0, 0, 0}, -{34, 71, 68, 40, 0, 0, 0}, -{34, 71, 68, 48, 0, 0, 0}, -{62, 91, 83, 128, 0, 0, 0}, -{62, 90, 68, 128, 0, 0, 0}, -{34, 66, 64, 32, 0, 0, 0}, -{34, 67, 64, 32, 0, 0, 0}, -{70, 18, 64, 32, 0, 0, 0}, -{70, 18, 68, 48, 0, 0, 0}, -{62, 79, 68, 128, 0, 0, 0}, -{35, 67, 64, 32, 0, 0, 0}, -{71, 67, 64, 40, 0, 0, 0}, -{71, 73, 68, 48, 0, 0, 0}, -{67, 73, 68, 128, 0, 0, 0}, -{32, 0, 0, 32, 0, 0, 0}, -{72, 0, 0, 128, 0, 0, 0}, -{73, 13, 18, 112, 0, 0, 0}, -{74, 7, 69, 88, 0, 0, 0}, -{75, 69, 68, 88, 0, 0, 0}, -{73, 18, 13, 112, 0, 0, 0}, -{34, 69, 68, 88, 0, 0, 0}, -{76, 69, 68, 88, 0, 0, 0}, -{32, 72, 68, 112, 0, 0, 0}, -{32, 68, 72, 112, 0, 0, 0}, -{34, 73, 68, 56, 0, 0, 0}, -{70, 64, 18, 32, 0, 0, 0}, -{70, 68, 18, 48, 0, 0, 0}, -{62, 68, 79, 128, 0, 0, 0}, -{35, 64, 67, 32, 0, 0, 0}, -{77, 0, 42, 8, 0, 0, 0}, -{78, 0, 43, 8, 0, 0, 0}, -{79, 0, 43, 8, 0, 0, 0}, -{80, 17, 11, 80, 64, 0, 0}, -{81, 1, 17, 8, 1, 0, 244}, -{49, 1, 17, 8, 1, 0, 244}, -{34, 17, 11, 8, 64, 0, 245}, -{82, 17, 11, 112, 0, 0, 0}, -{83, 17, 11, 8, 65, 0, 180}, -{84, 73, 68, 40, 0, 0, 0}, -{84, 73, 68, 48, 0, 0, 0}, -{84, 71, 68, 40, 0, 0, 0}, -{84, 72, 68, 48, 0, 0, 0}, -{85, 88, 83, 128, 0, 0, 0}, -{85, 81, 68, 128, 0, 0, 0}, -{71, 25, 64, 40, 0, 0, 0}, -{71, 25, 68, 48, 0, 0, 0}, -{86, 81, 68, 128, 0, 0, 0}, -{87, 65, 12, 40, 0, 0, 0}, -{71, 69, 12, 48, 0, 0, 0}, -{88, 68, 13, 128, 0, 0, 0}, -{71, 73, 68, 40, 0, 0, 0}, -{86, 88, 83, 128, 0, 0, 0}, -{89, 0, 48, 8, 64, 0, 0}, -{56, 0, 46, 112, 0, 0, 0}, -{68, 65, 68, 48, 0, 0, 0}, -{68, 69, 64, 48, 0, 0, 0}, -{62, 68, 72, 128, 0, 0, 0}, -{76, 65, 12, 40, 0, 0, 0}, -{76, 69, 12, 48, 0, 0, 0}, -{69, 68, 13, 128, 0, 0, 0}, -{34, 67, 64, 40, 0, 0, 0}, -{35, 64, 46, 40, 0, 0, 0}, -{34, 42, 68, 56, 0, 0, 0}, -{62, 92, 83, 128, 0, 0, 0}, -{34, 67, 64, 48, 0, 0, 0}, -{76, 65, 64, 40, 0, 0, 0}, -{76, 69, 68, 48, 0, 0, 0}, -{90, 69, 68, 128, 0, 0, 0}, -{51, 0, 42, 16, 0, 0, 0}, -{91, 0, 42, 16, 0, 0, 0}, -{91, 0, 20, 16, 0, 0, 0}, -{92, 0, 0, 16, 0, 0, 0}, -{93, 0, 34, 16, 0, 0, 0}, -{94, 0, 34, 16, 0, 0, 0}, -{34, 67, 64, 64, 0, 0, 0}, -{34, 73, 68, 64, 0, 0, 0}, -{71, 73, 68, 72, 0, 0, 0}, -{34, 73, 68, 80, 0, 0, 0}, -{62, 44, 83, 128, 0, 0, 0}, -{62, 46, 85, 128, 0, 0, 0}, -{62, 47, 85, 128, 0, 0, 0}, -{62, 73, 68, 128, 0, 0, 0}, -{34, 72, 68, 72, 0, 0, 0}, -{34, 71, 68, 72, 0, 0, 0}, -{34, 70, 68, 72, 0, 0, 0}, -{62, 70, 68, 128, 0, 0, 0}, -{34, 73, 68, 72, 0, 0, 0}, -{35, 47, 68, 72, 0, 0, 0}, -{62, 47, 68, 128, 0, 0, 0}, -{67, 88, 92, 128, 0, 0, 0}, -{73, 47, 13, 112, 0, 0, 0}, -{67, 88, 83, 136, 0, 0, 0}, -{67, 81, 68, 136, 0, 0, 0}, -{34, 73, 68, 152, 0, 0, 0}, -{62, 73, 68, 152, 0, 0, 0}, -{67, 81, 68, 152, 0, 0, 0}, -{35, 17, 11, 8, 0, 0, 0}, -{35, 15, 13, 80, 0, 0, 0}, -{35, 11, 17, 8, 0, 0, 0}, -{35, 17, 13, 80, 0, 0, 0}, -{67, 90, 83, 128, 0, 0, 0}, -{86, 87, 85, 128, 0, 0, 0}, -{71, 71, 68, 72, 0, 0, 0}, -{71, 72, 68, 72, 0, 0, 0}, -{71, 67, 64, 64, 0, 0, 0}, -{71, 73, 68, 64, 0, 0, 0}, -{71, 68, 26, 72, 0, 0, 0}, -{88, 68, 76, 128, 0, 0, 0}, -{71, 68, 27, 72, 0, 0, 0}, -{88, 68, 77, 128, 0, 0, 0}, -{95, 68, 18, 72, 0, 0, 0}, -{67, 68, 79, 128, 0, 0, 0}, -{71, 68, 18, 72, 0, 0, 0}, -{67, 68, 75, 128, 0, 0, 0}, -{67, 85, 73, 128, 0, 0, 0}, -{71, 24, 68, 72, 0, 0, 0}, -{95, 18, 68, 72, 0, 0, 0}, -{71, 73, 68, 144, 0, 0, 0}, -{86, 81, 68, 144, 0, 0, 0}, -{71, 73, 68, 80, 0, 0, 0}, -{71, 73, 68, 152, 0, 0, 0}, -{67, 73, 68, 152, 0, 0, 0}, -{96, 1, 65, 32, 0, 0, 0}, -{56, 1, 69, 48, 0, 0, 0}, -{97, 69, 81, 128, 0, 0, 0}, -{98, 0, 13, 112, 0, 0, 0}, -{56, 0, 44, 8, 0, 0, 0}, -{64, 0, 44, 128, 0, 0, 0}, -{56, 0, 42, 112, 0, 0, 0}, -{99, 75, 13, 8, 0, 0, 0}, -{98, 0, 17, 8, 0, 0, 0}, -{100, 67, 64, 96, 0, 0, 0} +_InstSharedInfo InstSharedInfoTable[474] = { +{0, 6, 68, 245, 0, 0, 256}, +{0, 8, 72, 245, 0, 0, 256}, +{0, 68, 6, 245, 0, 0, 256}, +{0, 72, 8, 245, 0, 0, 256}, +{1, 1, 11, 245, 0, 0, 256}, +{1, 3, 13, 245, 0, 0, 256}, +{2, 0, 46, 0, 0, 0, 256}, +{3, 0, 46, 0, 0, 0, 256}, +{0, 6, 68, 196, 16, 0, 256}, +{0, 8, 72, 196, 16, 0, 256}, +{0, 68, 6, 196, 16, 0, 256}, +{0, 72, 8, 196, 16, 0, 256}, +{1, 1, 11, 196, 16, 0, 256}, +{1, 3, 13, 196, 16, 0, 256}, +{4, 0, 46, 0, 0, 0, 256}, +{0, 6, 68, 245, 1, 0, 256}, +{0, 8, 72, 245, 1, 0, 256}, +{0, 68, 6, 245, 1, 0, 256}, +{0, 72, 8, 245, 1, 0, 256}, +{1, 1, 11, 245, 1, 0, 256}, +{1, 3, 13, 245, 1, 0, 256}, +{5, 0, 46, 0, 0, 0, 256}, +{6, 0, 46, 0, 0, 0, 256}, +{7, 0, 46, 0, 0, 0, 256}, +{8, 0, 46, 0, 0, 0, 256}, +{0, 6, 68, 229, 0, 16, 256}, +{0, 8, 72, 229, 0, 16, 256}, +{0, 68, 6, 229, 0, 16, 256}, +{0, 72, 8, 229, 0, 16, 256}, +{1, 1, 11, 229, 0, 16, 256}, +{1, 3, 13, 229, 0, 16, 256}, +{9, 0, 0, 213, 17, 32, 256}, +{0, 6, 68, 196, 0, 16, 256}, +{0, 8, 72, 196, 0, 16, 256}, +{0, 68, 6, 196, 0, 16, 256}, +{0, 72, 8, 196, 0, 16, 256}, +{1, 1, 11, 196, 0, 16, 256}, +{1, 3, 13, 196, 0, 16, 256}, +{9, 0, 0, 17, 16, 228, 256}, +{10, 6, 68, 245, 0, 0, 256}, +{10, 8, 72, 245, 0, 0, 256}, +{10, 68, 6, 245, 0, 0, 256}, +{10, 72, 8, 245, 0, 0, 256}, +{11, 1, 11, 245, 0, 0, 256}, +{11, 3, 13, 245, 0, 0, 256}, +{12, 0, 18, 244, 0, 0, 256}, +{13, 0, 18, 0, 0, 0, 256}, +{14, 0, 18, 0, 0, 0, 256}, +{15, 0, 0, 0, 0, 0, 256}, +{16, 54, 8, 0, 0, 0, 256}, +{10, 7, 69, 64, 0, 0, 256}, +{13, 0, 3, 0, 0, 0, 256}, +{17, 72, 8, 33, 0, 212, 256}, +{18, 0, 5, 0, 0, 0, 256}, +{19, 25, 22, 0, 8, 0, 33024}, +{20, 25, 22, 0, 8, 0, 33024}, +{19, 21, 25, 0, 8, 0, 33024}, +{20, 21, 25, 0, 8, 0, 33024}, +{13, 0, 15, 0, 32, 0, 261}, +{13, 0, 15, 0, 1, 0, 261}, +{13, 0, 15, 0, 64, 0, 261}, +{13, 0, 15, 0, 65, 0, 261}, +{13, 0, 15, 0, 128, 0, 261}, +{13, 0, 15, 0, 4, 0, 261}, +{13, 0, 15, 0, 160, 0, 261}, +{13, 0, 15, 0, 224, 0, 261}, +{10, 6, 68, 196, 0, 16, 256}, +{10, 8, 72, 196, 0, 16, 256}, +{0, 6, 68, 0, 0, 0, 256}, +{0, 8, 72, 0, 0, 0, 256}, +{21, 6, 68, 0, 0, 0, 256}, +{21, 8, 72, 0, 0, 0, 256}, +{21, 68, 6, 0, 0, 0, 256}, +{21, 72, 8, 0, 0, 0, 256}, +{21, 45, 71, 0, 0, 0, 256}, +{21, 54, 8, 0, 0, 0, 256}, +{21, 71, 45, 0, 0, 0, 256}, +{1, 13, 18, 0, 0, 0, 256}, +{22, 0, 0, 0, 0, 0, 256}, +{9, 0, 50, 0, 0, 0, 257}, +{23, 0, 0, 0, 0, 0, 256}, +{23, 0, 0, 255, 0, 0, 256}, +{11, 0, 0, 213, 0, 0, 256}, +{11, 0, 0, 0, 0, 0, 256}, +{1, 19, 11, 0, 0, 0, 256}, +{1, 20, 13, 0, 0, 0, 256}, +{1, 11, 19, 0, 0, 0, 256}, +{1, 13, 20, 0, 0, 0, 256}, +{24, 21, 22, 0, 8, 0, 256}, +{25, 21, 22, 0, 8, 0, 256}, +{19, 22, 21, 245, 8, 0, 256}, +{26, 22, 21, 245, 8, 0, 256}, +{11, 1, 11, 196, 0, 16, 256}, +{11, 3, 13, 196, 0, 16, 256}, +{19, 11, 22, 0, 8, 0, 256}, +{26, 13, 22, 0, 8, 0, 256}, +{19, 21, 11, 0, 8, 0, 256}, +{26, 21, 13, 0, 8, 0, 256}, +{19, 11, 22, 245, 8, 0, 256}, +{26, 13, 22, 245, 8, 0, 256}, +{1, 1, 17, 0, 0, 0, 256}, +{27, 3, 18, 0, 0, 0, 256}, +{13, 0, 2, 0, 0, 0, 258}, +{13, 0, 0, 0, 0, 0, 258}, +{16, 60, 8, 0, 0, 0, 256}, +{13, 49, 47, 0, 0, 0, 256}, +{13, 0, 0, 0, 0, 0, 256}, +{28, 0, 2, 0, 0, 0, 258}, +{28, 0, 0, 0, 0, 0, 258}, +{11, 0, 0, 0, 0, 0, 262}, +{11, 0, 1, 0, 0, 0, 262}, +{9, 0, 0, 0, 0, 0, 262}, +{28, 0, 0, 255, 0, 0, 33026}, +{9, 0, 1, 196, 0, 49, 256}, +{9, 0, 0, 0, 0, 0, 256}, +{29, 0, 23, 0, 0, 0, 256}, +{30, 0, 15, 0, 64, 0, 261}, +{30, 0, 15, 0, 0, 0, 261}, +{31, 0, 15, 0, 0, 0, 261}, +{1, 1, 11, 0, 0, 0, 33024}, +{1, 1, 14, 0, 0, 0, 33024}, +{11, 11, 1, 0, 0, 0, 33024}, +{11, 14, 1, 0, 0, 0, 33024}, +{13, 0, 16, 0, 0, 0, 257}, +{13, 0, 16, 0, 0, 0, 260}, +{9, 0, 50, 0, 0, 0, 260}, +{13, 0, 15, 0, 0, 0, 260}, +{1, 25, 11, 0, 0, 0, 33024}, +{1, 25, 14, 0, 0, 0, 33024}, +{11, 11, 25, 0, 0, 0, 33024}, +{11, 14, 25, 0, 0, 0, 33024}, +{11, 0, 0, 0, 0, 0, 33032}, +{11, 0, 0, 1, 0, 0, 256}, +{11, 0, 0, 2, 0, 0, 33024}, +{11, 0, 0, 8, 0, 0, 256}, +{10, 69, 8, 64, 0, 0, 256}, +{32, 0, 0, 0, 0, 0, 771}, +{32, 0, 0, 0, 0, 0, 33024}, +{32, 0, 0, 0, 0, 0, 262}, +{11, 0, 0, 0, 0, 0, 3072}, +{10, 0, 72, 0, 0, 0, 256}, +{33, 43, 51, 0, 0, 0, 33024}, +{33, 44, 51, 0, 0, 0, 33024}, +{33, 51, 43, 0, 0, 0, 33024}, +{33, 51, 44, 0, 0, 0, 33024}, +{32, 0, 0, 0, 0, 0, 256}, +{34, 72, 8, 0, 32, 0, 775}, +{34, 72, 8, 0, 1, 0, 775}, +{34, 72, 8, 0, 64, 0, 775}, +{34, 72, 8, 0, 65, 0, 775}, +{34, 72, 8, 0, 128, 0, 775}, +{34, 72, 8, 0, 4, 0, 775}, +{34, 72, 8, 0, 160, 0, 775}, +{34, 72, 8, 0, 224, 0, 775}, +{32, 0, 16, 0, 32, 0, 261}, +{32, 0, 16, 0, 1, 0, 261}, +{32, 0, 16, 0, 64, 0, 261}, +{32, 0, 16, 0, 65, 0, 261}, +{32, 0, 16, 0, 128, 0, 261}, +{32, 0, 16, 0, 4, 0, 261}, +{32, 0, 16, 0, 160, 0, 261}, +{32, 0, 16, 0, 224, 0, 261}, +{34, 0, 68, 0, 32, 0, 256}, +{34, 0, 68, 0, 1, 0, 256}, +{34, 0, 68, 0, 64, 0, 256}, +{34, 0, 68, 0, 65, 0, 256}, +{34, 0, 68, 0, 128, 0, 256}, +{34, 0, 68, 0, 4, 0, 256}, +{34, 0, 68, 0, 160, 0, 256}, +{34, 0, 68, 0, 224, 0, 256}, +{35, 0, 46, 0, 0, 0, 256}, +{36, 0, 46, 0, 0, 0, 256}, +{34, 8, 72, 1, 0, 244, 256}, +{37, 8, 72, 197, 0, 48, 256}, +{38, 0, 46, 0, 0, 0, 256}, +{39, 0, 46, 0, 0, 0, 256}, +{32, 0, 0, 255, 0, 0, 256}, +{40, 8, 72, 1, 0, 244, 256}, +{34, 72, 8, 33, 0, 212, 256}, +{40, 6, 68, 245, 0, 0, 256}, +{40, 8, 72, 245, 0, 0, 256}, +{41, 60, 8, 0, 0, 0, 256}, +{34, 68, 8, 0, 0, 0, 256}, +{42, 69, 8, 0, 0, 0, 256}, +{42, 10, 56, 0, 0, 0, 1536}, +{43, 0, 18, 0, 0, 0, 256}, +{44, 1, 68, 245, 0, 0, 256}, +{44, 1, 68, 196, 16, 0, 256}, +{44, 1, 68, 245, 1, 0, 256}, +{44, 1, 68, 229, 0, 16, 256}, +{44, 1, 68, 196, 0, 16, 256}, +{45, 1, 68, 245, 0, 0, 256}, +{44, 3, 72, 245, 0, 0, 256}, +{44, 3, 72, 196, 16, 0, 256}, +{44, 3, 72, 245, 1, 0, 256}, +{44, 3, 72, 229, 0, 16, 256}, +{44, 3, 72, 196, 0, 16, 256}, +{45, 3, 72, 245, 0, 0, 256}, +{46, 1, 68, 245, 0, 0, 256}, +{46, 1, 68, 196, 16, 0, 256}, +{46, 1, 68, 245, 1, 0, 256}, +{46, 1, 68, 229, 0, 16, 256}, +{46, 1, 68, 196, 0, 16, 256}, +{47, 1, 68, 245, 0, 0, 256}, +{44, 5, 72, 245, 0, 0, 256}, +{48, 5, 72, 196, 16, 0, 256}, +{44, 5, 72, 245, 1, 0, 256}, +{48, 5, 72, 229, 0, 16, 256}, +{48, 5, 72, 196, 0, 16, 256}, +{45, 5, 72, 245, 0, 0, 256}, +{49, 0, 72, 0, 0, 0, 256}, +{50, 1, 68, 1, 0, 32, 256}, +{50, 1, 68, 1, 1, 32, 256}, +{50, 1, 68, 197, 0, 48, 256}, +{50, 1, 72, 1, 0, 32, 256}, +{50, 1, 72, 1, 1, 32, 256}, +{50, 1, 72, 197, 0, 48, 256}, +{51, 1, 68, 0, 0, 0, 256}, +{52, 0, 1, 0, 0, 0, 768}, +{51, 3, 72, 0, 0, 0, 256}, +{52, 0, 16, 0, 0, 0, 768}, +{50, 41, 68, 33, 0, 0, 256}, +{50, 41, 68, 33, 1, 0, 256}, +{50, 41, 68, 229, 0, 16, 256}, +{50, 41, 72, 33, 0, 0, 256}, +{50, 41, 72, 33, 1, 0, 256}, +{50, 41, 72, 229, 0, 16, 256}, +{50, 42, 68, 1, 0, 32, 256}, +{50, 42, 68, 1, 1, 32, 256}, +{50, 42, 68, 197, 0, 48, 256}, +{50, 42, 72, 1, 0, 32, 256}, +{50, 42, 72, 1, 1, 32, 256}, +{50, 42, 72, 197, 0, 48, 256}, +{45, 0, 64, 0, 0, 0, 512}, +{53, 0, 28, 0, 0, 0, 512}, +{53, 0, 27, 0, 0, 0, 512}, +{53, 0, 0, 0, 0, 0, 512}, +{50, 0, 64, 0, 0, 0, 512}, +{45, 0, 54, 0, 0, 0, 512}, +{45, 0, 63, 0, 0, 0, 512}, +{54, 0, 28, 0, 1, 0, 768}, +{54, 0, 28, 0, 64, 0, 768}, +{54, 0, 28, 0, 65, 0, 768}, +{54, 0, 28, 0, 4, 0, 768}, +{55, 0, 64, 0, 0, 0, 1792}, +{45, 0, 66, 0, 0, 0, 512}, +{50, 0, 66, 0, 0, 0, 512}, +{54, 0, 28, 69, 0, 0, 512}, +{54, 0, 28, 69, 0, 0, 768}, +{45, 0, 65, 0, 0, 0, 512}, +{53, 0, 29, 0, 0, 0, 512}, +{55, 0, 65, 0, 0, 0, 1792}, +{50, 0, 65, 0, 0, 0, 512}, +{55, 0, 63, 0, 0, 0, 1792}, +{50, 0, 63, 0, 0, 0, 512}, +{45, 1, 68, 196, 0, 16, 256}, +{44, 0, 68, 0, 0, 0, 256}, +{44, 0, 68, 245, 0, 0, 256}, +{50, 0, 68, 33, 0, 212, 256}, +{50, 0, 68, 0, 0, 245, 256}, +{45, 3, 72, 196, 0, 16, 256}, +{44, 0, 72, 0, 0, 0, 256}, +{44, 0, 72, 245, 0, 0, 256}, +{50, 0, 72, 33, 0, 212, 256}, +{50, 0, 72, 0, 0, 245, 256}, +{44, 0, 68, 244, 0, 0, 256}, +{44, 0, 72, 244, 0, 0, 256}, +{56, 0, 72, 0, 0, 0, 257}, +{57, 0, 60, 0, 0, 0, 257}, +{56, 0, 72, 0, 0, 0, 260}, +{57, 0, 60, 0, 0, 0, 260}, +{56, 0, 72, 0, 0, 0, 256}, +{45, 0, 72, 0, 0, 0, 256}, +{45, 0, 69, 0, 0, 0, 256}, +{45, 0, 69, 0, 0, 0, 33024}, +{55, 0, 69, 0, 0, 0, 33024}, +{45, 0, 69, 64, 0, 0, 256}, +{56, 0, 61, 0, 0, 0, 256}, +{56, 0, 61, 0, 0, 0, 33024}, +{51, 0, 71, 0, 0, 0, 256}, +{58, 0, 69, 0, 0, 0, 33024}, +{55, 0, 54, 0, 0, 0, 33024}, +{54, 0, 0, 0, 0, 0, 3584}, +{54, 0, 0, 0, 0, 0, 256}, +{13, 0, 0, 0, 0, 0, 768}, +{55, 0, 24, 0, 0, 0, 3840}, +{54, 0, 0, 0, 0, 0, 3840}, +{54, 0, 24, 0, 0, 0, 3840}, +{54, 26, 24, 0, 0, 0, 3840}, +{59, 0, 0, 0, 0, 0, 256}, +{55, 0, 54, 0, 0, 0, 3072}, +{60, 83, 52, 0, 0, 0, 3328}, +{60, 83, 52, 0, 0, 0, 3072}, +{34, 87, 30, 0, 0, 0, 1280}, +{34, 87, 30, 0, 0, 0, 1536}, +{34, 85, 30, 0, 0, 0, 1280}, +{34, 86, 30, 0, 0, 0, 1536}, +{61, 91, 36, 0, 0, 0, 4096}, +{62, 34, 30, 0, 0, 0, 4096}, +{63, 55, 30, 0, 0, 0, 4096}, +{63, 57, 30, 0, 0, 0, 4096}, +{34, 30, 87, 0, 0, 0, 1280}, +{34, 30, 87, 0, 0, 0, 1536}, +{34, 30, 85, 0, 0, 0, 1280}, +{34, 30, 86, 0, 0, 0, 1536}, +{61, 36, 91, 0, 0, 0, 4096}, +{63, 30, 55, 0, 0, 0, 4096}, +{63, 30, 57, 0, 0, 0, 4096}, +{64, 86, 30, 0, 0, 0, 1280}, +{34, 57, 30, 0, 0, 0, 1536}, +{34, 86, 30, 0, 0, 0, 1792}, +{65, 34, 30, 0, 0, 0, 4096}, +{66, 34, 30, 0, 0, 0, 4096}, +{61, 90, 36, 0, 0, 0, 4096}, +{34, 30, 57, 0, 0, 0, 1280}, +{34, 30, 57, 0, 0, 0, 1536}, +{61, 30, 57, 0, 0, 0, 4096}, +{67, 87, 30, 0, 0, 0, 1280}, +{67, 87, 30, 0, 0, 0, 1536}, +{66, 40, 36, 0, 0, 0, 4096}, +{34, 87, 30, 0, 0, 0, 1792}, +{55, 0, 54, 0, 0, 0, 1280}, +{67, 83, 30, 0, 0, 0, 1280}, +{67, 83, 30, 0, 0, 0, 1536}, +{41, 76, 30, 0, 0, 0, 1280}, +{41, 76, 30, 0, 0, 0, 1536}, +{34, 30, 59, 0, 0, 0, 1280}, +{34, 30, 59, 0, 0, 0, 1536}, +{34, 30, 55, 0, 0, 0, 2816}, +{34, 30, 57, 0, 0, 0, 2816}, +{61, 36, 67, 0, 0, 0, 4096}, +{67, 86, 52, 0, 0, 0, 1280}, +{67, 87, 52, 0, 0, 0, 1536}, +{41, 85, 10, 0, 0, 0, 1280}, +{41, 86, 10, 0, 0, 0, 1536}, +{61, 88, 33, 0, 0, 0, 4096}, +{67, 85, 30, 69, 0, 0, 1280}, +{67, 86, 30, 0, 0, 0, 1536}, +{61, 85, 30, 0, 0, 0, 4096}, +{61, 86, 30, 0, 0, 0, 4096}, +{68, 31, 9, 0, 0, 0, 1280}, +{68, 31, 9, 0, 0, 0, 1536}, +{69, 36, 10, 0, 0, 0, 4096}, +{67, 85, 30, 0, 0, 0, 1280}, +{67, 85, 30, 0, 0, 0, 1536}, +{61, 92, 36, 0, 0, 0, 4096}, +{61, 91, 30, 0, 0, 0, 4096}, +{67, 82, 52, 0, 0, 0, 1024}, +{67, 83, 52, 0, 0, 0, 1024}, +{70, 76, 52, 0, 0, 0, 1024}, +{70, 76, 30, 0, 0, 0, 1536}, +{61, 73, 30, 0, 0, 0, 4096}, +{34, 83, 52, 0, 0, 0, 1024}, +{71, 83, 52, 0, 0, 0, 1280}, +{71, 87, 30, 0, 0, 0, 1536}, +{66, 87, 30, 0, 0, 0, 4096}, +{32, 0, 0, 0, 0, 0, 1024}, +{72, 0, 0, 0, 0, 0, 4096}, +{73, 10, 76, 0, 0, 0, 3584}, +{74, 48, 31, 0, 0, 0, 2816}, +{75, 31, 30, 0, 0, 0, 2816}, +{73, 76, 10, 0, 0, 0, 3584}, +{67, 31, 30, 0, 0, 0, 2816}, +{76, 31, 30, 0, 0, 0, 2816}, +{32, 86, 30, 0, 0, 0, 3584}, +{32, 30, 86, 0, 0, 0, 3584}, +{67, 87, 30, 0, 0, 0, 1792}, +{70, 52, 76, 0, 0, 0, 1024}, +{70, 30, 76, 0, 0, 0, 1536}, +{61, 30, 73, 0, 0, 0, 4096}, +{34, 52, 83, 0, 0, 0, 1024}, +{77, 0, 54, 0, 0, 0, 256}, +{78, 0, 62, 0, 0, 0, 256}, +{79, 0, 62, 0, 0, 0, 256}, +{80, 72, 8, 64, 0, 0, 2560}, +{81, 1, 72, 1, 0, 244, 256}, +{48, 1, 72, 1, 0, 244, 256}, +{67, 72, 8, 64, 0, 245, 256}, +{82, 72, 8, 0, 0, 0, 3584}, +{83, 72, 8, 65, 0, 180, 256}, +{84, 87, 30, 0, 0, 0, 1280}, +{84, 87, 30, 0, 0, 0, 1536}, +{84, 85, 30, 0, 0, 0, 1280}, +{84, 86, 30, 0, 0, 0, 1536}, +{85, 40, 36, 0, 0, 0, 4096}, +{85, 34, 30, 0, 0, 0, 4096}, +{71, 79, 52, 0, 0, 0, 1280}, +{71, 79, 30, 0, 0, 0, 1536}, +{86, 34, 30, 0, 0, 0, 4096}, +{87, 53, 9, 0, 0, 0, 1280}, +{71, 31, 9, 0, 0, 0, 1536}, +{88, 30, 10, 0, 0, 0, 4096}, +{71, 87, 30, 0, 0, 0, 1280}, +{86, 40, 36, 0, 0, 0, 4096}, +{89, 0, 58, 64, 0, 0, 256}, +{55, 0, 57, 0, 0, 0, 3584}, +{68, 53, 30, 0, 0, 0, 1536}, +{68, 31, 52, 0, 0, 0, 1536}, +{61, 30, 86, 0, 0, 0, 4096}, +{76, 53, 9, 0, 0, 0, 1280}, +{76, 31, 9, 0, 0, 0, 1536}, +{69, 30, 10, 0, 0, 0, 4096}, +{67, 83, 52, 0, 0, 0, 1280}, +{34, 52, 57, 0, 0, 0, 1280}, +{67, 54, 30, 0, 0, 0, 1792}, +{61, 67, 36, 0, 0, 0, 4096}, +{67, 83, 52, 0, 0, 0, 1536}, +{76, 53, 52, 0, 0, 0, 1280}, +{76, 31, 30, 0, 0, 0, 1536}, +{90, 31, 30, 0, 0, 0, 4096}, +{50, 0, 54, 0, 0, 0, 512}, +{91, 0, 54, 0, 0, 0, 512}, +{91, 0, 63, 0, 0, 0, 512}, +{92, 0, 0, 0, 0, 0, 512}, +{93, 0, 12, 0, 0, 0, 512}, +{94, 0, 12, 0, 0, 0, 512}, +{67, 83, 52, 0, 0, 0, 2048}, +{67, 87, 30, 0, 0, 0, 2048}, +{71, 87, 30, 0, 0, 0, 2304}, +{67, 87, 30, 0, 0, 0, 2560}, +{61, 55, 36, 0, 0, 0, 4096}, +{61, 57, 38, 0, 0, 0, 4096}, +{61, 59, 38, 0, 0, 0, 4096}, +{61, 87, 30, 0, 0, 0, 4096}, +{67, 86, 30, 0, 0, 0, 2304}, +{67, 85, 30, 0, 0, 0, 2304}, +{67, 84, 30, 0, 0, 0, 2304}, +{61, 84, 30, 0, 0, 0, 4096}, +{67, 87, 30, 0, 0, 0, 2304}, +{34, 59, 30, 0, 0, 0, 2304}, +{61, 59, 30, 0, 0, 0, 4096}, +{66, 40, 67, 0, 0, 0, 4096}, +{73, 59, 10, 0, 0, 0, 3584}, +{66, 40, 36, 0, 0, 0, 4352}, +{66, 34, 30, 0, 0, 0, 4352}, +{67, 87, 30, 0, 0, 0, 4864}, +{61, 87, 30, 0, 0, 0, 4864}, +{66, 34, 30, 0, 0, 0, 4864}, +{34, 72, 8, 0, 0, 0, 256}, +{34, 68, 10, 0, 0, 0, 2560}, +{34, 8, 72, 0, 0, 0, 256}, +{34, 72, 10, 0, 0, 0, 2560}, +{66, 91, 36, 0, 0, 0, 4096}, +{86, 39, 38, 0, 0, 0, 4096}, +{71, 85, 30, 0, 0, 0, 2304}, +{71, 86, 30, 0, 0, 0, 2304}, +{71, 83, 52, 0, 0, 0, 2048}, +{71, 87, 30, 0, 0, 0, 2048}, +{71, 30, 74, 0, 0, 0, 2304}, +{88, 30, 80, 0, 0, 0, 4096}, +{71, 30, 75, 0, 0, 0, 2304}, +{88, 30, 81, 0, 0, 0, 4096}, +{95, 30, 76, 0, 0, 0, 2304}, +{66, 30, 73, 0, 0, 0, 4096}, +{71, 30, 76, 0, 0, 0, 2304}, +{66, 30, 70, 0, 0, 0, 4096}, +{66, 38, 87, 0, 0, 0, 4096}, +{71, 78, 30, 0, 0, 0, 2304}, +{95, 76, 30, 0, 0, 0, 2304}, +{71, 87, 30, 0, 0, 0, 4608}, +{86, 34, 30, 0, 0, 0, 4608}, +{71, 87, 30, 0, 0, 0, 2560}, +{71, 87, 30, 0, 0, 0, 4864}, +{66, 87, 30, 0, 0, 0, 4864}, +{96, 1, 53, 0, 0, 0, 1024}, +{55, 1, 31, 0, 0, 0, 1536}, +{97, 31, 34, 0, 0, 0, 4096}, +{98, 0, 10, 0, 0, 0, 3584}, +{55, 0, 55, 0, 0, 0, 256}, +{63, 0, 55, 0, 0, 0, 4096}, +{55, 0, 54, 0, 0, 0, 3584}, +{99, 70, 10, 0, 0, 0, 256}, +{98, 0, 72, 0, 0, 0, 256}, +{100, 83, 52, 0, 0, 0, 3072} }; uint16_t CmpMnemonicOffsets[8] = { diff --git a/NativeCore/Dependencies/distorm/src/insts.h b/NativeCore/Dependencies/distorm/src/insts.h index 77db087b..675ecf96 100644 --- a/NativeCore/Dependencies/distorm/src/insts.h +++ b/NativeCore/Dependencies/distorm/src/insts.h @@ -4,7 +4,7 @@ insts.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Dependencies/distorm/src/mnemonics.c b/NativeCore/Dependencies/distorm/src/mnemonics.c index 7df13601..f306a258 100644 --- a/NativeCore/Dependencies/distorm/src/mnemonics.c +++ b/NativeCore/Dependencies/distorm/src/mnemonics.c @@ -4,7 +4,7 @@ mnemonics.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -75,238 +75,241 @@ const unsigned char _MNEMONICS[] = "\x04" "verw\0" "\x04" "sgdt\0" "\x04" "sidt\0" "\x04" "lgdt\0" "\x04" "lidt\0" \ "\x04" "smsw\0" "\x04" "lmsw\0" "\x06" "invlpg\0" "\x06" "vmcall\0" \ "\x08" "vmlaunch\0" "\x08" "vmresume\0" "\x06" "vmxoff\0" "\x07" "monitor\0" \ -"\x05" "mwait\0" "\x06" "xgetbv\0" "\x06" "xsetbv\0" "\x06" "vmfunc\0" \ -"\x04" "xend\0" "\x05" "vmrun\0" "\x07" "vmmcall\0" "\x06" "vmload\0" \ -"\x06" "vmsave\0" "\x04" "stgi\0" "\x04" "clgi\0" "\x06" "skinit\0" \ -"\x07" "invlpga\0" "\x06" "swapgs\0" "\x06" "rdtscp\0" "\x08" "prefetch\0" \ -"\x09" "prefetchw\0" "\x05" "pi2fw\0" "\x05" "pi2fd\0" "\x05" "pf2iw\0" \ -"\x05" "pf2id\0" "\x06" "pfnacc\0" "\x07" "pfpnacc\0" "\x07" "pfcmpge\0" \ -"\x05" "pfmin\0" "\x05" "pfrcp\0" "\x07" "pfrsqrt\0" "\x05" "pfsub\0" \ -"\x05" "pfadd\0" "\x07" "pfcmpgt\0" "\x05" "pfmax\0" "\x08" "pfrcpit1\0" \ -"\x08" "pfrsqit1\0" "\x06" "pfsubr\0" "\x05" "pfacc\0" "\x07" "pfcmpeq\0" \ -"\x05" "pfmul\0" "\x08" "pfrcpit2\0" "\x07" "pmulhrw\0" "\x06" "pswapd\0" \ -"\x07" "pavgusb\0" "\x06" "movups\0" "\x06" "movupd\0" "\x05" "movss\0" \ -"\x05" "movsd\0" "\x07" "vmovups\0" "\x07" "vmovupd\0" "\x06" "vmovss\0" \ -"\x06" "vmovsd\0" "\x07" "movhlps\0" "\x06" "movlps\0" "\x06" "movlpd\0" \ -"\x08" "movsldup\0" "\x07" "movddup\0" "\x08" "vmovhlps\0" "\x07" "vmovlps\0" \ -"\x07" "vmovlpd\0" "\x09" "vmovsldup\0" "\x08" "vmovddup\0" "\x08" "unpcklps\0" \ -"\x08" "unpcklpd\0" "\x09" "vunpcklps\0" "\x09" "vunpcklpd\0" "\x08" "unpckhps\0" \ -"\x08" "unpckhpd\0" "\x09" "vunpckhps\0" "\x09" "vunpckhpd\0" "\x07" "movlhps\0" \ -"\x06" "movhps\0" "\x06" "movhpd\0" "\x08" "movshdup\0" "\x08" "vmovlhps\0" \ -"\x07" "vmovhps\0" "\x07" "vmovhpd\0" "\x09" "vmovshdup\0" "\x0b" "prefetchnta\0" \ -"\x0a" "prefetcht0\0" "\x0a" "prefetcht1\0" "\x0a" "prefetcht2\0" "\x06" "movaps\0" \ -"\x06" "movapd\0" "\x07" "vmovaps\0" "\x07" "vmovapd\0" "\x08" "cvtpi2ps\0" \ -"\x08" "cvtpi2pd\0" "\x08" "cvtsi2ss\0" "\x08" "cvtsi2sd\0" "\x09" "vcvtsi2ss\0" \ -"\x09" "vcvtsi2sd\0" "\x07" "movntps\0" "\x07" "movntpd\0" "\x07" "movntss\0" \ -"\x07" "movntsd\0" "\x08" "vmovntps\0" "\x08" "vmovntpd\0" "\x09" "cvttps2pi\0" \ -"\x09" "cvttpd2pi\0" "\x09" "cvttss2si\0" "\x09" "cvttsd2si\0" "\x0a" "vcvttss2si\0" \ -"\x0a" "vcvttsd2si\0" "\x08" "cvtps2pi\0" "\x08" "cvtpd2pi\0" "\x08" "cvtss2si\0" \ -"\x08" "cvtsd2si\0" "\x09" "vcvtss2si\0" "\x09" "vcvtsd2si\0" "\x07" "ucomiss\0" \ -"\x07" "ucomisd\0" "\x08" "vucomiss\0" "\x08" "vucomisd\0" "\x06" "comiss\0" \ -"\x06" "comisd\0" "\x07" "vcomiss\0" "\x07" "vcomisd\0" "\x08" "movmskps\0" \ -"\x08" "movmskpd\0" "\x09" "vmovmskps\0" "\x09" "vmovmskpd\0" "\x06" "sqrtps\0" \ -"\x06" "sqrtpd\0" "\x06" "sqrtss\0" "\x06" "sqrtsd\0" "\x07" "vsqrtps\0" \ -"\x07" "vsqrtpd\0" "\x07" "vsqrtss\0" "\x07" "vsqrtsd\0" "\x07" "rsqrtps\0" \ -"\x07" "rsqrtss\0" "\x08" "vrsqrtps\0" "\x08" "vrsqrtss\0" "\x05" "rcpps\0" \ -"\x05" "rcpss\0" "\x06" "vrcpps\0" "\x06" "vrcpss\0" "\x05" "andps\0" \ -"\x05" "andpd\0" "\x06" "vandps\0" "\x06" "vandpd\0" "\x06" "andnps\0" \ -"\x06" "andnpd\0" "\x07" "vandnps\0" "\x07" "vandnpd\0" "\x04" "orps\0" \ -"\x04" "orpd\0" "\x05" "vorps\0" "\x05" "vorpd\0" "\x05" "xorps\0" \ -"\x05" "xorpd\0" "\x06" "vxorps\0" "\x06" "vxorpd\0" "\x05" "addps\0" \ -"\x05" "addpd\0" "\x05" "addss\0" "\x05" "addsd\0" "\x06" "vaddps\0" \ -"\x06" "vaddpd\0" "\x06" "vaddss\0" "\x06" "vaddsd\0" "\x05" "mulps\0" \ -"\x05" "mulpd\0" "\x05" "mulss\0" "\x05" "mulsd\0" "\x06" "vmulps\0" \ -"\x06" "vmulpd\0" "\x06" "vmulss\0" "\x06" "vmulsd\0" "\x08" "cvtps2pd\0" \ -"\x08" "cvtpd2ps\0" "\x08" "cvtss2sd\0" "\x08" "cvtsd2ss\0" "\x09" "vcvtps2pd\0" \ -"\x09" "vcvtpd2ps\0" "\x09" "vcvtss2sd\0" "\x09" "vcvtsd2ss\0" "\x08" "cvtdq2ps\0" \ -"\x08" "cvtps2dq\0" "\x09" "cvttps2dq\0" "\x09" "vcvtdq2ps\0" "\x09" "vcvtps2dq\0" \ -"\x0a" "vcvttps2dq\0" "\x05" "subps\0" "\x05" "subpd\0" "\x05" "subss\0" \ -"\x05" "subsd\0" "\x06" "vsubps\0" "\x06" "vsubpd\0" "\x06" "vsubss\0" \ -"\x06" "vsubsd\0" "\x05" "minps\0" "\x05" "minpd\0" "\x05" "minss\0" \ -"\x05" "minsd\0" "\x06" "vminps\0" "\x06" "vminpd\0" "\x06" "vminss\0" \ -"\x06" "vminsd\0" "\x05" "divps\0" "\x05" "divpd\0" "\x05" "divss\0" \ -"\x05" "divsd\0" "\x06" "vdivps\0" "\x06" "vdivpd\0" "\x06" "vdivss\0" \ -"\x06" "vdivsd\0" "\x05" "maxps\0" "\x05" "maxpd\0" "\x05" "maxss\0" \ -"\x05" "maxsd\0" "\x06" "vmaxps\0" "\x06" "vmaxpd\0" "\x06" "vmaxss\0" \ -"\x06" "vmaxsd\0" "\x09" "punpcklbw\0" "\x0a" "vpunpcklbw\0" "\x09" "punpcklwd\0" \ -"\x0a" "vpunpcklwd\0" "\x09" "punpckldq\0" "\x0a" "vpunpckldq\0" "\x08" "packsswb\0" \ -"\x09" "vpacksswb\0" "\x07" "pcmpgtb\0" "\x08" "vpcmpgtb\0" "\x07" "pcmpgtw\0" \ -"\x08" "vpcmpgtw\0" "\x07" "pcmpgtd\0" "\x08" "vpcmpgtd\0" "\x08" "packuswb\0" \ -"\x09" "vpackuswb\0" "\x09" "punpckhbw\0" "\x0a" "vpunpckhbw\0" "\x09" "punpckhwd\0" \ -"\x0a" "vpunpckhwd\0" "\x09" "punpckhdq\0" "\x0a" "vpunpckhdq\0" "\x08" "packssdw\0" \ -"\x09" "vpackssdw\0" "\x0a" "punpcklqdq\0" "\x0b" "vpunpcklqdq\0" "\x0a" "punpckhqdq\0" \ -"\x0b" "vpunpckhqdq\0" "\x04" "movd\0" "\x04" "movq\0" "\x05" "vmovd\0" \ -"\x05" "vmovq\0" "\x06" "movdqa\0" "\x06" "movdqu\0" "\x07" "vmovdqa\0" \ -"\x07" "vmovdqu\0" "\x06" "pshufw\0" "\x06" "pshufd\0" "\x07" "pshufhw\0" \ -"\x07" "pshuflw\0" "\x07" "vpshufd\0" "\x08" "vpshufhw\0" "\x08" "vpshuflw\0" \ -"\x07" "pcmpeqb\0" "\x08" "vpcmpeqb\0" "\x07" "pcmpeqw\0" "\x08" "vpcmpeqw\0" \ -"\x07" "pcmpeqd\0" "\x08" "vpcmpeqd\0" "\x04" "emms\0" "\x0a" "vzeroupper\0" \ -"\x08" "vzeroall\0" "\x06" "vmread\0" "\x05" "extrq\0" "\x07" "insertq\0" \ -"\x07" "vmwrite\0" "\x08" "cvtph2ps\0" "\x08" "cvtps2ph\0" "\x06" "haddpd\0" \ -"\x06" "haddps\0" "\x07" "vhaddpd\0" "\x07" "vhaddps\0" "\x06" "hsubpd\0" \ -"\x06" "hsubps\0" "\x07" "vhsubpd\0" "\x07" "vhsubps\0" "\x05" "xsave\0" \ -"\x07" "xsave64\0" "\x06" "lfence\0" "\x06" "xrstor\0" "\x08" "xrstor64\0" \ -"\x06" "mfence\0" "\x08" "xsaveopt\0" "\x0a" "xsaveopt64\0" "\x06" "sfence\0" \ -"\x07" "clflush\0" "\x06" "popcnt\0" "\x03" "bsf\0" "\x05" "tzcnt\0" \ -"\x03" "bsr\0" "\x05" "lzcnt\0" "\x07" "cmpeqps\0" "\x07" "cmpltps\0" \ -"\x07" "cmpleps\0" "\x0a" "cmpunordps\0" "\x08" "cmpneqps\0" "\x08" "cmpnltps\0" \ -"\x08" "cmpnleps\0" "\x08" "cmpordps\0" "\x07" "cmpeqpd\0" "\x07" "cmpltpd\0" \ -"\x07" "cmplepd\0" "\x0a" "cmpunordpd\0" "\x08" "cmpneqpd\0" "\x08" "cmpnltpd\0" \ -"\x08" "cmpnlepd\0" "\x08" "cmpordpd\0" "\x07" "cmpeqss\0" "\x07" "cmpltss\0" \ -"\x07" "cmpless\0" "\x0a" "cmpunordss\0" "\x08" "cmpneqss\0" "\x08" "cmpnltss\0" \ -"\x08" "cmpnless\0" "\x08" "cmpordss\0" "\x07" "cmpeqsd\0" "\x07" "cmpltsd\0" \ -"\x07" "cmplesd\0" "\x0a" "cmpunordsd\0" "\x08" "cmpneqsd\0" "\x08" "cmpnltsd\0" \ -"\x08" "cmpnlesd\0" "\x08" "cmpordsd\0" "\x08" "vcmpeqps\0" "\x08" "vcmpltps\0" \ -"\x08" "vcmpleps\0" "\x0b" "vcmpunordps\0" "\x09" "vcmpneqps\0" "\x09" "vcmpnltps\0" \ -"\x09" "vcmpnleps\0" "\x09" "vcmpordps\0" "\x0b" "vcmpeq_uqps\0" "\x09" "vcmpngeps\0" \ -"\x09" "vcmpngtps\0" "\x0b" "vcmpfalseps\0" "\x0c" "vcmpneq_oqps\0" "\x08" "vcmpgeps\0" \ -"\x08" "vcmpgtps\0" "\x0a" "vcmptrueps\0" "\x0b" "vcmpeq_osps\0" "\x0b" "vcmplt_oqps\0" \ -"\x0b" "vcmple_oqps\0" "\x0d" "vcmpunord_sps\0" "\x0c" "vcmpneq_usps\0" \ -"\x0c" "vcmpnlt_uqps\0" "\x0c" "vcmpnle_uqps\0" "\x0b" "vcmpord_sps\0" \ -"\x0b" "vcmpeq_usps\0" "\x0c" "vcmpnge_uqps\0" "\x0c" "vcmpngt_uqps\0" \ -"\x0e" "vcmpfalse_osps\0" "\x0c" "vcmpneq_osps\0" "\x0b" "vcmpge_oqps\0" \ -"\x0b" "vcmpgt_oqps\0" "\x0d" "vcmptrue_usps\0" "\x08" "vcmpeqpd\0" "\x08" "vcmpltpd\0" \ -"\x08" "vcmplepd\0" "\x0b" "vcmpunordpd\0" "\x09" "vcmpneqpd\0" "\x09" "vcmpnltpd\0" \ -"\x09" "vcmpnlepd\0" "\x09" "vcmpordpd\0" "\x0b" "vcmpeq_uqpd\0" "\x09" "vcmpngepd\0" \ -"\x09" "vcmpngtpd\0" "\x0b" "vcmpfalsepd\0" "\x0c" "vcmpneq_oqpd\0" "\x08" "vcmpgepd\0" \ -"\x08" "vcmpgtpd\0" "\x0a" "vcmptruepd\0" "\x0b" "vcmpeq_ospd\0" "\x0b" "vcmplt_oqpd\0" \ -"\x0b" "vcmple_oqpd\0" "\x0d" "vcmpunord_spd\0" "\x0c" "vcmpneq_uspd\0" \ -"\x0c" "vcmpnlt_uqpd\0" "\x0c" "vcmpnle_uqpd\0" "\x0b" "vcmpord_spd\0" \ -"\x0b" "vcmpeq_uspd\0" "\x0c" "vcmpnge_uqpd\0" "\x0c" "vcmpngt_uqpd\0" \ -"\x0e" "vcmpfalse_ospd\0" "\x0c" "vcmpneq_ospd\0" "\x0b" "vcmpge_oqpd\0" \ -"\x0b" "vcmpgt_oqpd\0" "\x0d" "vcmptrue_uspd\0" "\x08" "vcmpeqss\0" "\x08" "vcmpltss\0" \ -"\x08" "vcmpless\0" "\x0b" "vcmpunordss\0" "\x09" "vcmpneqss\0" "\x09" "vcmpnltss\0" \ -"\x09" "vcmpnless\0" "\x09" "vcmpordss\0" "\x0b" "vcmpeq_uqss\0" "\x09" "vcmpngess\0" \ -"\x09" "vcmpngtss\0" "\x0b" "vcmpfalsess\0" "\x0c" "vcmpneq_oqss\0" "\x08" "vcmpgess\0" \ -"\x08" "vcmpgtss\0" "\x0a" "vcmptruess\0" "\x0b" "vcmpeq_osss\0" "\x0b" "vcmplt_oqss\0" \ -"\x0b" "vcmple_oqss\0" "\x0d" "vcmpunord_sss\0" "\x0c" "vcmpneq_usss\0" \ -"\x0c" "vcmpnlt_uqss\0" "\x0c" "vcmpnle_uqss\0" "\x0b" "vcmpord_sss\0" \ -"\x0b" "vcmpeq_usss\0" "\x0c" "vcmpnge_uqss\0" "\x0c" "vcmpngt_uqss\0" \ -"\x0e" "vcmpfalse_osss\0" "\x0c" "vcmpneq_osss\0" "\x0b" "vcmpge_oqss\0" \ -"\x0b" "vcmpgt_oqss\0" "\x0d" "vcmptrue_usss\0" "\x08" "vcmpeqsd\0" "\x08" "vcmpltsd\0" \ -"\x08" "vcmplesd\0" "\x0b" "vcmpunordsd\0" "\x09" "vcmpneqsd\0" "\x09" "vcmpnltsd\0" \ -"\x09" "vcmpnlesd\0" "\x09" "vcmpordsd\0" "\x0b" "vcmpeq_uqsd\0" "\x09" "vcmpngesd\0" \ -"\x09" "vcmpngtsd\0" "\x0b" "vcmpfalsesd\0" "\x0c" "vcmpneq_oqsd\0" "\x08" "vcmpgesd\0" \ -"\x08" "vcmpgtsd\0" "\x0a" "vcmptruesd\0" "\x0b" "vcmpeq_ossd\0" "\x0b" "vcmplt_oqsd\0" \ -"\x0b" "vcmple_oqsd\0" "\x0d" "vcmpunord_ssd\0" "\x0c" "vcmpneq_ussd\0" \ -"\x0c" "vcmpnlt_uqsd\0" "\x0c" "vcmpnle_uqsd\0" "\x0b" "vcmpord_ssd\0" \ -"\x0b" "vcmpeq_ussd\0" "\x0c" "vcmpnge_uqsd\0" "\x0c" "vcmpngt_uqsd\0" \ -"\x0e" "vcmpfalse_ossd\0" "\x0c" "vcmpneq_ossd\0" "\x0b" "vcmpge_oqsd\0" \ -"\x0b" "vcmpgt_oqsd\0" "\x0d" "vcmptrue_ussd\0" "\x06" "pinsrw\0" "\x07" "vpinsrw\0" \ -"\x06" "pextrw\0" "\x07" "vpextrw\0" "\x06" "shufps\0" "\x06" "shufpd\0" \ -"\x07" "vshufps\0" "\x07" "vshufpd\0" "\x09" "cmpxchg8b\0" "\x0a" "cmpxchg16b\0" \ -"\x07" "vmptrst\0" "\x08" "addsubpd\0" "\x08" "addsubps\0" "\x09" "vaddsubpd\0" \ -"\x09" "vaddsubps\0" "\x05" "psrlw\0" "\x06" "vpsrlw\0" "\x05" "psrld\0" \ -"\x06" "vpsrld\0" "\x05" "psrlq\0" "\x06" "vpsrlq\0" "\x05" "paddq\0" \ -"\x06" "vpaddq\0" "\x06" "pmullw\0" "\x07" "vpmullw\0" "\x07" "movq2dq\0" \ -"\x07" "movdq2q\0" "\x08" "pmovmskb\0" "\x09" "vpmovmskb\0" "\x07" "psubusb\0" \ -"\x08" "vpsubusb\0" "\x07" "psubusw\0" "\x08" "vpsubusw\0" "\x06" "pminub\0" \ -"\x07" "vpminub\0" "\x04" "pand\0" "\x05" "vpand\0" "\x07" "paddusb\0" \ -"\x08" "vpaddusw\0" "\x07" "paddusw\0" "\x06" "pmaxub\0" "\x07" "vpmaxub\0" \ -"\x05" "pandn\0" "\x06" "vpandn\0" "\x05" "pavgb\0" "\x06" "vpavgb\0" \ -"\x05" "psraw\0" "\x06" "vpsraw\0" "\x05" "psrad\0" "\x06" "vpsrad\0" \ -"\x05" "pavgw\0" "\x06" "vpavgw\0" "\x07" "pmulhuw\0" "\x08" "vpmulhuw\0" \ -"\x06" "pmulhw\0" "\x07" "vpmulhw\0" "\x09" "cvttpd2dq\0" "\x08" "cvtdq2pd\0" \ -"\x08" "cvtpd2dq\0" "\x0a" "vcvttpd2dq\0" "\x09" "vcvtdq2pd\0" "\x09" "vcvtpd2dq\0" \ -"\x06" "movntq\0" "\x07" "movntdq\0" "\x08" "vmovntdq\0" "\x06" "psubsb\0" \ -"\x07" "vpsubsb\0" "\x06" "psubsw\0" "\x07" "vpsubsw\0" "\x06" "pminsw\0" \ -"\x07" "vpminsw\0" "\x03" "por\0" "\x04" "vpor\0" "\x06" "paddsb\0" \ -"\x07" "vpaddsb\0" "\x06" "paddsw\0" "\x07" "vpaddsw\0" "\x06" "pmaxsw\0" \ -"\x07" "vpmaxsw\0" "\x04" "pxor\0" "\x05" "vpxor\0" "\x05" "lddqu\0" \ -"\x06" "vlddqu\0" "\x05" "psllw\0" "\x06" "vpsllw\0" "\x05" "pslld\0" \ -"\x06" "vpslld\0" "\x05" "psllq\0" "\x06" "vpsllq\0" "\x07" "pmuludq\0" \ -"\x08" "vpmuludq\0" "\x07" "pmaddwd\0" "\x08" "vpmaddwd\0" "\x06" "psadbw\0" \ -"\x07" "vpsadbw\0" "\x08" "maskmovq\0" "\x0a" "maskmovdqu\0" "\x0b" "vmaskmovdqu\0" \ -"\x05" "psubb\0" "\x06" "vpsubb\0" "\x05" "psubw\0" "\x06" "vpsubw\0" \ -"\x05" "psubd\0" "\x06" "vpsubd\0" "\x05" "psubq\0" "\x06" "vpsubq\0" \ -"\x05" "paddb\0" "\x06" "vpaddb\0" "\x05" "paddw\0" "\x06" "vpaddw\0" \ -"\x05" "paddd\0" "\x06" "vpaddd\0" "\x07" "fnstenv\0" "\x06" "fstenv\0" \ -"\x06" "fnstcw\0" "\x05" "fstcw\0" "\x06" "fnclex\0" "\x05" "fclex\0" \ -"\x06" "fninit\0" "\x05" "finit\0" "\x06" "fnsave\0" "\x05" "fsave\0" \ -"\x06" "fnstsw\0" "\x05" "fstsw\0" "\x06" "pshufb\0" "\x07" "vpshufb\0" \ -"\x06" "phaddw\0" "\x07" "vphaddw\0" "\x06" "phaddd\0" "\x07" "vphaddd\0" \ -"\x07" "phaddsw\0" "\x08" "vphaddsw\0" "\x09" "pmaddubsw\0" "\x0a" "vpmaddubsw\0" \ -"\x06" "phsubw\0" "\x07" "vphsubw\0" "\x06" "phsubd\0" "\x07" "vphsubd\0" \ -"\x07" "phsubsw\0" "\x08" "vphsubsw\0" "\x06" "psignb\0" "\x07" "vpsignb\0" \ -"\x06" "psignw\0" "\x07" "vpsignw\0" "\x06" "psignd\0" "\x07" "vpsignd\0" \ -"\x08" "pmulhrsw\0" "\x09" "vpmulhrsw\0" "\x09" "vpermilps\0" "\x09" "vpermilpd\0" \ -"\x07" "vtestps\0" "\x07" "vtestpd\0" "\x08" "pblendvb\0" "\x08" "blendvps\0" \ -"\x08" "blendvpd\0" "\x05" "ptest\0" "\x06" "vptest\0" "\x0c" "vbroadcastss\0" \ -"\x0c" "vbroadcastsd\0" "\x0e" "vbroadcastf128\0" "\x05" "pabsb\0" "\x06" "vpabsb\0" \ -"\x05" "pabsw\0" "\x06" "vpabsw\0" "\x05" "pabsd\0" "\x06" "vpabsd\0" \ -"\x08" "pmovsxbw\0" "\x09" "vpmovsxbw\0" "\x08" "pmovsxbd\0" "\x09" "vpmovsxbd\0" \ -"\x08" "pmovsxbq\0" "\x09" "vpmovsxbq\0" "\x08" "pmovsxwd\0" "\x09" "vpmovsxwd\0" \ -"\x08" "pmovsxwq\0" "\x09" "vpmovsxwq\0" "\x08" "pmovsxdq\0" "\x09" "vpmovsxdq\0" \ -"\x06" "pmuldq\0" "\x07" "vpmuldq\0" "\x07" "pcmpeqq\0" "\x08" "vpcmpeqq\0" \ -"\x08" "movntdqa\0" "\x09" "vmovntdqa\0" "\x08" "packusdw\0" "\x09" "vpackusdw\0" \ -"\x0a" "vmaskmovps\0" "\x0a" "vmaskmovpd\0" "\x08" "pmovzxbw\0" "\x09" "vpmovzxbw\0" \ -"\x08" "pmovzxbd\0" "\x09" "vpmovzxbd\0" "\x08" "pmovzxbq\0" "\x09" "vpmovzxbq\0" \ -"\x08" "pmovzxwd\0" "\x09" "vpmovzxwd\0" "\x08" "pmovzxwq\0" "\x09" "vpmovzxwq\0" \ -"\x08" "pmovzxdq\0" "\x09" "vpmovzxdq\0" "\x07" "pcmpgtq\0" "\x08" "vpcmpgtq\0" \ -"\x06" "pminsb\0" "\x07" "vpminsb\0" "\x06" "pminsd\0" "\x07" "vpminsd\0" \ -"\x06" "pminuw\0" "\x07" "vpminuw\0" "\x06" "pminud\0" "\x07" "vpminud\0" \ -"\x06" "pmaxsb\0" "\x07" "vpmaxsb\0" "\x06" "pmaxsd\0" "\x07" "vpmaxsd\0" \ -"\x06" "pmaxuw\0" "\x07" "vpmaxuw\0" "\x06" "pmaxud\0" "\x07" "vpmaxud\0" \ -"\x06" "pmulld\0" "\x07" "vpmulld\0" "\x0a" "phminposuw\0" "\x0b" "vphminposuw\0" \ -"\x06" "invept\0" "\x07" "invvpid\0" "\x07" "invpcid\0" "\x0e" "vfmaddsub132ps\0" \ -"\x0e" "vfmaddsub132pd\0" "\x0e" "vfmsubadd132ps\0" "\x0e" "vfmsubadd132pd\0" \ -"\x0b" "vfmadd132ps\0" "\x0b" "vfmadd132pd\0" "\x0b" "vfmadd132ss\0" \ -"\x0b" "vfmadd132sd\0" "\x0b" "vfmsub132ps\0" "\x0b" "vfmsub132pd\0" \ -"\x0b" "vfmsub132ss\0" "\x0b" "vfmsub132sd\0" "\x0c" "vfnmadd132ps\0" \ -"\x0c" "vfnmadd132pd\0" "\x0c" "vfnmadd132ss\0" "\x0c" "vfnmadd132sd\0" \ -"\x0c" "vfnmsub132ps\0" "\x0c" "vfnmsub132pd\0" "\x0c" "vfnmsub132ss\0" \ -"\x0c" "vfnmsub132sd\0" "\x0e" "vfmaddsub213ps\0" "\x0e" "vfmaddsub213pd\0" \ -"\x0e" "vfmsubadd213ps\0" "\x0e" "vfmsubadd213pd\0" "\x0b" "vfmadd213ps\0" \ -"\x0b" "vfmadd213pd\0" "\x0b" "vfmadd213ss\0" "\x0b" "vfmadd213sd\0" \ -"\x0b" "vfmsub213ps\0" "\x0b" "vfmsub213pd\0" "\x0b" "vfmsub213ss\0" \ -"\x0b" "vfmsub213sd\0" "\x0c" "vfnmadd213ps\0" "\x0c" "vfnmadd213pd\0" \ -"\x0c" "vfnmadd213ss\0" "\x0c" "vfnmadd213sd\0" "\x0c" "vfnmsub213ps\0" \ -"\x0c" "vfnmsub213pd\0" "\x0c" "vfnmsub213ss\0" "\x0c" "vfnmsub213sd\0" \ -"\x0e" "vfmaddsub231ps\0" "\x0e" "vfmaddsub231pd\0" "\x0e" "vfmsubadd231ps\0" \ -"\x0e" "vfmsubadd231pd\0" "\x0b" "vfmadd231ps\0" "\x0b" "vfmadd231pd\0" \ -"\x0b" "vfmadd231ss\0" "\x0b" "vfmadd231sd\0" "\x0b" "vfmsub231ps\0" \ -"\x0b" "vfmsub231pd\0" "\x0b" "vfmsub231ss\0" "\x0b" "vfmsub231sd\0" \ -"\x0c" "vfnmadd231ps\0" "\x0c" "vfnmadd231pd\0" "\x0c" "vfnmadd231ss\0" \ -"\x0c" "vfnmadd231sd\0" "\x0c" "vfnmsub231ps\0" "\x0c" "vfnmsub231pd\0" \ -"\x0c" "vfnmsub231ss\0" "\x0c" "vfnmsub231sd\0" "\x06" "aesimc\0" "\x07" "vaesimc\0" \ -"\x06" "aesenc\0" "\x07" "vaesenc\0" "\x0a" "aesenclast\0" "\x0b" "vaesenclast\0" \ -"\x06" "aesdec\0" "\x07" "vaesdec\0" "\x0a" "aesdeclast\0" "\x0b" "vaesdeclast\0" \ -"\x05" "movbe\0" "\x05" "crc32\0" "\x0a" "vperm2f128\0" "\x07" "roundps\0" \ -"\x08" "vroundps\0" "\x07" "roundpd\0" "\x08" "vroundpd\0" "\x07" "roundss\0" \ -"\x08" "vroundss\0" "\x07" "roundsd\0" "\x08" "vroundsd\0" "\x07" "blendps\0" \ -"\x08" "vblendps\0" "\x07" "blendpd\0" "\x08" "vblendpd\0" "\x07" "pblendw\0" \ -"\x08" "vpblendw\0" "\x07" "palignr\0" "\x08" "vpalignr\0" "\x06" "pextrb\0" \ -"\x07" "vpextrb\0" "\x06" "pextrd\0" "\x06" "pextrq\0" "\x07" "vpextrd\0" \ -"\x07" "vpextrq\0" "\x09" "extractps\0" "\x0a" "vextractps\0" "\x0b" "vinsertf128\0" \ -"\x0c" "vextractf128\0" "\x06" "pinsrb\0" "\x07" "vpinsrb\0" "\x08" "insertps\0" \ -"\x09" "vinsertps\0" "\x06" "pinsrd\0" "\x06" "pinsrq\0" "\x07" "vpinsrd\0" \ -"\x07" "vpinsrq\0" "\x04" "dpps\0" "\x05" "vdpps\0" "\x04" "dppd\0" \ -"\x05" "vdppd\0" "\x07" "mpsadbw\0" "\x08" "vmpsadbw\0" "\x09" "pclmulqdq\0" \ -"\x0a" "vpclmulqdq\0" "\x09" "vblendvps\0" "\x09" "vblendvpd\0" "\x09" "vpblendvb\0" \ -"\x09" "pcmpestrm\0" "\x0a" "vpcmpestrm\0" "\x09" "pcmpestri\0" "\x0a" "vpcmpestri\0" \ -"\x09" "pcmpistrm\0" "\x0a" "vpcmpistrm\0" "\x09" "pcmpistri\0" "\x0a" "vpcmpistri\0" \ -"\x0f" "aeskeygenassist\0" "\x10" "vaeskeygenassist\0" "\x06" "psrldq\0" \ -"\x07" "vpsrldq\0" "\x06" "pslldq\0" "\x07" "vpslldq\0" "\x06" "fxsave\0" \ -"\x08" "fxsave64\0" "\x08" "rdfsbase\0" "\x07" "fxrstor\0" "\x09" "fxrstor64\0" \ -"\x08" "rdgsbase\0" "\x07" "ldmxcsr\0" "\x08" "wrfsbase\0" "\x08" "vldmxcsr\0" \ -"\x07" "stmxcsr\0" "\x08" "wrgsbase\0" "\x08" "vstmxcsr\0" "\x07" "vmptrld\0" \ -"\x07" "vmclear\0" "\x05" "vmxon\0" "\x06" "movsxd\0" "\x05" "pause\0" \ -"\x04" "wait\0" "\x06" "rdrand\0" "\x06" "_3dnow\0"; +"\x05" "mwait\0" "\x04" "clac\0" "\x04" "stac\0" "\x06" "xgetbv\0" \ +"\x06" "xsetbv\0" "\x06" "vmfunc\0" "\x04" "xend\0" "\x05" "vmrun\0" \ +"\x07" "vmmcall\0" "\x06" "vmload\0" "\x06" "vmsave\0" "\x04" "stgi\0" \ +"\x04" "clgi\0" "\x06" "skinit\0" "\x07" "invlpga\0" "\x06" "swapgs\0" \ +"\x06" "rdtscp\0" "\x08" "prefetch\0" "\x09" "prefetchw\0" "\x05" "pi2fw\0" \ +"\x05" "pi2fd\0" "\x05" "pf2iw\0" "\x05" "pf2id\0" "\x06" "pfnacc\0" \ +"\x07" "pfpnacc\0" "\x07" "pfcmpge\0" "\x05" "pfmin\0" "\x05" "pfrcp\0" \ +"\x07" "pfrsqrt\0" "\x05" "pfsub\0" "\x05" "pfadd\0" "\x07" "pfcmpgt\0" \ +"\x05" "pfmax\0" "\x08" "pfrcpit1\0" "\x08" "pfrsqit1\0" "\x06" "pfsubr\0" \ +"\x05" "pfacc\0" "\x07" "pfcmpeq\0" "\x05" "pfmul\0" "\x08" "pfrcpit2\0" \ +"\x07" "pmulhrw\0" "\x06" "pswapd\0" "\x07" "pavgusb\0" "\x06" "movups\0" \ +"\x06" "movupd\0" "\x05" "movss\0" "\x05" "movsd\0" "\x07" "vmovups\0" \ +"\x07" "vmovupd\0" "\x06" "vmovss\0" "\x06" "vmovsd\0" "\x07" "movhlps\0" \ +"\x06" "movlps\0" "\x06" "movlpd\0" "\x08" "movsldup\0" "\x07" "movddup\0" \ +"\x08" "vmovhlps\0" "\x07" "vmovlps\0" "\x07" "vmovlpd\0" "\x09" "vmovsldup\0" \ +"\x08" "vmovddup\0" "\x08" "unpcklps\0" "\x08" "unpcklpd\0" "\x09" "vunpcklps\0" \ +"\x09" "vunpcklpd\0" "\x08" "unpckhps\0" "\x08" "unpckhpd\0" "\x09" "vunpckhps\0" \ +"\x09" "vunpckhpd\0" "\x07" "movlhps\0" "\x06" "movhps\0" "\x06" "movhpd\0" \ +"\x08" "movshdup\0" "\x08" "vmovlhps\0" "\x07" "vmovhps\0" "\x07" "vmovhpd\0" \ +"\x09" "vmovshdup\0" "\x0b" "prefetchnta\0" "\x0a" "prefetcht0\0" "\x0a" "prefetcht1\0" \ +"\x0a" "prefetcht2\0" "\x06" "movaps\0" "\x06" "movapd\0" "\x07" "vmovaps\0" \ +"\x07" "vmovapd\0" "\x08" "cvtpi2ps\0" "\x08" "cvtpi2pd\0" "\x08" "cvtsi2ss\0" \ +"\x08" "cvtsi2sd\0" "\x09" "vcvtsi2ss\0" "\x09" "vcvtsi2sd\0" "\x07" "movntps\0" \ +"\x07" "movntpd\0" "\x07" "movntss\0" "\x07" "movntsd\0" "\x08" "vmovntps\0" \ +"\x08" "vmovntpd\0" "\x09" "cvttps2pi\0" "\x09" "cvttpd2pi\0" "\x09" "cvttss2si\0" \ +"\x09" "cvttsd2si\0" "\x0a" "vcvttss2si\0" "\x0a" "vcvttsd2si\0" "\x08" "cvtps2pi\0" \ +"\x08" "cvtpd2pi\0" "\x08" "cvtss2si\0" "\x08" "cvtsd2si\0" "\x09" "vcvtss2si\0" \ +"\x09" "vcvtsd2si\0" "\x07" "ucomiss\0" "\x07" "ucomisd\0" "\x08" "vucomiss\0" \ +"\x08" "vucomisd\0" "\x06" "comiss\0" "\x06" "comisd\0" "\x07" "vcomiss\0" \ +"\x07" "vcomisd\0" "\x08" "movmskps\0" "\x08" "movmskpd\0" "\x09" "vmovmskps\0" \ +"\x09" "vmovmskpd\0" "\x06" "sqrtps\0" "\x06" "sqrtpd\0" "\x06" "sqrtss\0" \ +"\x06" "sqrtsd\0" "\x07" "vsqrtps\0" "\x07" "vsqrtpd\0" "\x07" "vsqrtss\0" \ +"\x07" "vsqrtsd\0" "\x07" "rsqrtps\0" "\x07" "rsqrtss\0" "\x08" "vrsqrtps\0" \ +"\x08" "vrsqrtss\0" "\x05" "rcpps\0" "\x05" "rcpss\0" "\x06" "vrcpps\0" \ +"\x06" "vrcpss\0" "\x05" "andps\0" "\x05" "andpd\0" "\x06" "vandps\0" \ +"\x06" "vandpd\0" "\x06" "andnps\0" "\x06" "andnpd\0" "\x07" "vandnps\0" \ +"\x07" "vandnpd\0" "\x04" "orps\0" "\x04" "orpd\0" "\x05" "vorps\0" \ +"\x05" "vorpd\0" "\x05" "xorps\0" "\x05" "xorpd\0" "\x06" "vxorps\0" \ +"\x06" "vxorpd\0" "\x05" "addps\0" "\x05" "addpd\0" "\x05" "addss\0" \ +"\x05" "addsd\0" "\x06" "vaddps\0" "\x06" "vaddpd\0" "\x06" "vaddss\0" \ +"\x06" "vaddsd\0" "\x05" "mulps\0" "\x05" "mulpd\0" "\x05" "mulss\0" \ +"\x05" "mulsd\0" "\x06" "vmulps\0" "\x06" "vmulpd\0" "\x06" "vmulss\0" \ +"\x06" "vmulsd\0" "\x08" "cvtps2pd\0" "\x08" "cvtpd2ps\0" "\x08" "cvtss2sd\0" \ +"\x08" "cvtsd2ss\0" "\x09" "vcvtps2pd\0" "\x09" "vcvtpd2ps\0" "\x09" "vcvtss2sd\0" \ +"\x09" "vcvtsd2ss\0" "\x08" "cvtdq2ps\0" "\x08" "cvtps2dq\0" "\x09" "cvttps2dq\0" \ +"\x09" "vcvtdq2ps\0" "\x09" "vcvtps2dq\0" "\x0a" "vcvttps2dq\0" "\x05" "subps\0" \ +"\x05" "subpd\0" "\x05" "subss\0" "\x05" "subsd\0" "\x06" "vsubps\0" \ +"\x06" "vsubpd\0" "\x06" "vsubss\0" "\x06" "vsubsd\0" "\x05" "minps\0" \ +"\x05" "minpd\0" "\x05" "minss\0" "\x05" "minsd\0" "\x06" "vminps\0" \ +"\x06" "vminpd\0" "\x06" "vminss\0" "\x06" "vminsd\0" "\x05" "divps\0" \ +"\x05" "divpd\0" "\x05" "divss\0" "\x05" "divsd\0" "\x06" "vdivps\0" \ +"\x06" "vdivpd\0" "\x06" "vdivss\0" "\x06" "vdivsd\0" "\x05" "maxps\0" \ +"\x05" "maxpd\0" "\x05" "maxss\0" "\x05" "maxsd\0" "\x06" "vmaxps\0" \ +"\x06" "vmaxpd\0" "\x06" "vmaxss\0" "\x06" "vmaxsd\0" "\x09" "punpcklbw\0" \ +"\x0a" "vpunpcklbw\0" "\x09" "punpcklwd\0" "\x0a" "vpunpcklwd\0" "\x09" "punpckldq\0" \ +"\x0a" "vpunpckldq\0" "\x08" "packsswb\0" "\x09" "vpacksswb\0" "\x07" "pcmpgtb\0" \ +"\x08" "vpcmpgtb\0" "\x07" "pcmpgtw\0" "\x08" "vpcmpgtw\0" "\x07" "pcmpgtd\0" \ +"\x08" "vpcmpgtd\0" "\x08" "packuswb\0" "\x09" "vpackuswb\0" "\x09" "punpckhbw\0" \ +"\x0a" "vpunpckhbw\0" "\x09" "punpckhwd\0" "\x0a" "vpunpckhwd\0" "\x09" "punpckhdq\0" \ +"\x0a" "vpunpckhdq\0" "\x08" "packssdw\0" "\x09" "vpackssdw\0" "\x0a" "punpcklqdq\0" \ +"\x0b" "vpunpcklqdq\0" "\x0a" "punpckhqdq\0" "\x0b" "vpunpckhqdq\0" "\x04" "movd\0" \ +"\x04" "movq\0" "\x05" "vmovd\0" "\x05" "vmovq\0" "\x06" "movdqa\0" \ +"\x06" "movdqu\0" "\x07" "vmovdqa\0" "\x07" "vmovdqu\0" "\x06" "pshufw\0" \ +"\x06" "pshufd\0" "\x07" "pshufhw\0" "\x07" "pshuflw\0" "\x07" "vpshufd\0" \ +"\x08" "vpshufhw\0" "\x08" "vpshuflw\0" "\x07" "pcmpeqb\0" "\x08" "vpcmpeqb\0" \ +"\x07" "pcmpeqw\0" "\x08" "vpcmpeqw\0" "\x07" "pcmpeqd\0" "\x08" "vpcmpeqd\0" \ +"\x04" "emms\0" "\x0a" "vzeroupper\0" "\x08" "vzeroall\0" "\x06" "vmread\0" \ +"\x05" "extrq\0" "\x07" "insertq\0" "\x07" "vmwrite\0" "\x08" "cvtph2ps\0" \ +"\x08" "cvtps2ph\0" "\x06" "haddpd\0" "\x06" "haddps\0" "\x07" "vhaddpd\0" \ +"\x07" "vhaddps\0" "\x06" "hsubpd\0" "\x06" "hsubps\0" "\x07" "vhsubpd\0" \ +"\x07" "vhsubps\0" "\x05" "xsave\0" "\x07" "xsave64\0" "\x06" "lfence\0" \ +"\x06" "xrstor\0" "\x08" "xrstor64\0" "\x06" "mfence\0" "\x08" "xsaveopt\0" \ +"\x0a" "xsaveopt64\0" "\x06" "sfence\0" "\x07" "clflush\0" "\x06" "popcnt\0" \ +"\x03" "bsf\0" "\x05" "tzcnt\0" "\x03" "bsr\0" "\x05" "lzcnt\0" "\x07" "cmpeqps\0" \ +"\x07" "cmpltps\0" "\x07" "cmpleps\0" "\x0a" "cmpunordps\0" "\x08" "cmpneqps\0" \ +"\x08" "cmpnltps\0" "\x08" "cmpnleps\0" "\x08" "cmpordps\0" "\x07" "cmpeqpd\0" \ +"\x07" "cmpltpd\0" "\x07" "cmplepd\0" "\x0a" "cmpunordpd\0" "\x08" "cmpneqpd\0" \ +"\x08" "cmpnltpd\0" "\x08" "cmpnlepd\0" "\x08" "cmpordpd\0" "\x07" "cmpeqss\0" \ +"\x07" "cmpltss\0" "\x07" "cmpless\0" "\x0a" "cmpunordss\0" "\x08" "cmpneqss\0" \ +"\x08" "cmpnltss\0" "\x08" "cmpnless\0" "\x08" "cmpordss\0" "\x07" "cmpeqsd\0" \ +"\x07" "cmpltsd\0" "\x07" "cmplesd\0" "\x0a" "cmpunordsd\0" "\x08" "cmpneqsd\0" \ +"\x08" "cmpnltsd\0" "\x08" "cmpnlesd\0" "\x08" "cmpordsd\0" "\x08" "vcmpeqps\0" \ +"\x08" "vcmpltps\0" "\x08" "vcmpleps\0" "\x0b" "vcmpunordps\0" "\x09" "vcmpneqps\0" \ +"\x09" "vcmpnltps\0" "\x09" "vcmpnleps\0" "\x09" "vcmpordps\0" "\x0b" "vcmpeq_uqps\0" \ +"\x09" "vcmpngeps\0" "\x09" "vcmpngtps\0" "\x0b" "vcmpfalseps\0" "\x0c" "vcmpneq_oqps\0" \ +"\x08" "vcmpgeps\0" "\x08" "vcmpgtps\0" "\x0a" "vcmptrueps\0" "\x0b" "vcmpeq_osps\0" \ +"\x0b" "vcmplt_oqps\0" "\x0b" "vcmple_oqps\0" "\x0d" "vcmpunord_sps\0" \ +"\x0c" "vcmpneq_usps\0" "\x0c" "vcmpnlt_uqps\0" "\x0c" "vcmpnle_uqps\0" \ +"\x0b" "vcmpord_sps\0" "\x0b" "vcmpeq_usps\0" "\x0c" "vcmpnge_uqps\0" \ +"\x0c" "vcmpngt_uqps\0" "\x0e" "vcmpfalse_osps\0" "\x0c" "vcmpneq_osps\0" \ +"\x0b" "vcmpge_oqps\0" "\x0b" "vcmpgt_oqps\0" "\x0d" "vcmptrue_usps\0" \ +"\x08" "vcmpeqpd\0" "\x08" "vcmpltpd\0" "\x08" "vcmplepd\0" "\x0b" "vcmpunordpd\0" \ +"\x09" "vcmpneqpd\0" "\x09" "vcmpnltpd\0" "\x09" "vcmpnlepd\0" "\x09" "vcmpordpd\0" \ +"\x0b" "vcmpeq_uqpd\0" "\x09" "vcmpngepd\0" "\x09" "vcmpngtpd\0" "\x0b" "vcmpfalsepd\0" \ +"\x0c" "vcmpneq_oqpd\0" "\x08" "vcmpgepd\0" "\x08" "vcmpgtpd\0" "\x0a" "vcmptruepd\0" \ +"\x0b" "vcmpeq_ospd\0" "\x0b" "vcmplt_oqpd\0" "\x0b" "vcmple_oqpd\0" \ +"\x0d" "vcmpunord_spd\0" "\x0c" "vcmpneq_uspd\0" "\x0c" "vcmpnlt_uqpd\0" \ +"\x0c" "vcmpnle_uqpd\0" "\x0b" "vcmpord_spd\0" "\x0b" "vcmpeq_uspd\0" \ +"\x0c" "vcmpnge_uqpd\0" "\x0c" "vcmpngt_uqpd\0" "\x0e" "vcmpfalse_ospd\0" \ +"\x0c" "vcmpneq_ospd\0" "\x0b" "vcmpge_oqpd\0" "\x0b" "vcmpgt_oqpd\0" \ +"\x0d" "vcmptrue_uspd\0" "\x08" "vcmpeqss\0" "\x08" "vcmpltss\0" "\x08" "vcmpless\0" \ +"\x0b" "vcmpunordss\0" "\x09" "vcmpneqss\0" "\x09" "vcmpnltss\0" "\x09" "vcmpnless\0" \ +"\x09" "vcmpordss\0" "\x0b" "vcmpeq_uqss\0" "\x09" "vcmpngess\0" "\x09" "vcmpngtss\0" \ +"\x0b" "vcmpfalsess\0" "\x0c" "vcmpneq_oqss\0" "\x08" "vcmpgess\0" "\x08" "vcmpgtss\0" \ +"\x0a" "vcmptruess\0" "\x0b" "vcmpeq_osss\0" "\x0b" "vcmplt_oqss\0" "\x0b" "vcmple_oqss\0" \ +"\x0d" "vcmpunord_sss\0" "\x0c" "vcmpneq_usss\0" "\x0c" "vcmpnlt_uqss\0" \ +"\x0c" "vcmpnle_uqss\0" "\x0b" "vcmpord_sss\0" "\x0b" "vcmpeq_usss\0" \ +"\x0c" "vcmpnge_uqss\0" "\x0c" "vcmpngt_uqss\0" "\x0e" "vcmpfalse_osss\0" \ +"\x0c" "vcmpneq_osss\0" "\x0b" "vcmpge_oqss\0" "\x0b" "vcmpgt_oqss\0" \ +"\x0d" "vcmptrue_usss\0" "\x08" "vcmpeqsd\0" "\x08" "vcmpltsd\0" "\x08" "vcmplesd\0" \ +"\x0b" "vcmpunordsd\0" "\x09" "vcmpneqsd\0" "\x09" "vcmpnltsd\0" "\x09" "vcmpnlesd\0" \ +"\x09" "vcmpordsd\0" "\x0b" "vcmpeq_uqsd\0" "\x09" "vcmpngesd\0" "\x09" "vcmpngtsd\0" \ +"\x0b" "vcmpfalsesd\0" "\x0c" "vcmpneq_oqsd\0" "\x08" "vcmpgesd\0" "\x08" "vcmpgtsd\0" \ +"\x0a" "vcmptruesd\0" "\x0b" "vcmpeq_ossd\0" "\x0b" "vcmplt_oqsd\0" "\x0b" "vcmple_oqsd\0" \ +"\x0d" "vcmpunord_ssd\0" "\x0c" "vcmpneq_ussd\0" "\x0c" "vcmpnlt_uqsd\0" \ +"\x0c" "vcmpnle_uqsd\0" "\x0b" "vcmpord_ssd\0" "\x0b" "vcmpeq_ussd\0" \ +"\x0c" "vcmpnge_uqsd\0" "\x0c" "vcmpngt_uqsd\0" "\x0e" "vcmpfalse_ossd\0" \ +"\x0c" "vcmpneq_ossd\0" "\x0b" "vcmpge_oqsd\0" "\x0b" "vcmpgt_oqsd\0" \ +"\x0d" "vcmptrue_ussd\0" "\x06" "pinsrw\0" "\x07" "vpinsrw\0" "\x06" "pextrw\0" \ +"\x07" "vpextrw\0" "\x06" "shufps\0" "\x06" "shufpd\0" "\x07" "vshufps\0" \ +"\x07" "vshufpd\0" "\x09" "cmpxchg8b\0" "\x0a" "cmpxchg16b\0" "\x07" "vmptrst\0" \ +"\x08" "addsubpd\0" "\x08" "addsubps\0" "\x09" "vaddsubpd\0" "\x09" "vaddsubps\0" \ +"\x05" "psrlw\0" "\x06" "vpsrlw\0" "\x05" "psrld\0" "\x06" "vpsrld\0" \ +"\x05" "psrlq\0" "\x06" "vpsrlq\0" "\x05" "paddq\0" "\x06" "vpaddq\0" \ +"\x06" "pmullw\0" "\x07" "vpmullw\0" "\x07" "movq2dq\0" "\x07" "movdq2q\0" \ +"\x08" "pmovmskb\0" "\x09" "vpmovmskb\0" "\x07" "psubusb\0" "\x08" "vpsubusb\0" \ +"\x07" "psubusw\0" "\x08" "vpsubusw\0" "\x06" "pminub\0" "\x07" "vpminub\0" \ +"\x04" "pand\0" "\x05" "vpand\0" "\x07" "paddusb\0" "\x08" "vpaddusw\0" \ +"\x07" "paddusw\0" "\x06" "pmaxub\0" "\x07" "vpmaxub\0" "\x05" "pandn\0" \ +"\x06" "vpandn\0" "\x05" "pavgb\0" "\x06" "vpavgb\0" "\x05" "psraw\0" \ +"\x06" "vpsraw\0" "\x05" "psrad\0" "\x06" "vpsrad\0" "\x05" "pavgw\0" \ +"\x06" "vpavgw\0" "\x07" "pmulhuw\0" "\x08" "vpmulhuw\0" "\x06" "pmulhw\0" \ +"\x07" "vpmulhw\0" "\x09" "cvttpd2dq\0" "\x08" "cvtdq2pd\0" "\x08" "cvtpd2dq\0" \ +"\x0a" "vcvttpd2dq\0" "\x09" "vcvtdq2pd\0" "\x09" "vcvtpd2dq\0" "\x06" "movntq\0" \ +"\x07" "movntdq\0" "\x08" "vmovntdq\0" "\x06" "psubsb\0" "\x07" "vpsubsb\0" \ +"\x06" "psubsw\0" "\x07" "vpsubsw\0" "\x06" "pminsw\0" "\x07" "vpminsw\0" \ +"\x03" "por\0" "\x04" "vpor\0" "\x06" "paddsb\0" "\x07" "vpaddsb\0" \ +"\x06" "paddsw\0" "\x07" "vpaddsw\0" "\x06" "pmaxsw\0" "\x07" "vpmaxsw\0" \ +"\x04" "pxor\0" "\x05" "vpxor\0" "\x05" "lddqu\0" "\x06" "vlddqu\0" \ +"\x05" "psllw\0" "\x06" "vpsllw\0" "\x05" "pslld\0" "\x06" "vpslld\0" \ +"\x05" "psllq\0" "\x06" "vpsllq\0" "\x07" "pmuludq\0" "\x08" "vpmuludq\0" \ +"\x07" "pmaddwd\0" "\x08" "vpmaddwd\0" "\x06" "psadbw\0" "\x07" "vpsadbw\0" \ +"\x08" "maskmovq\0" "\x0a" "maskmovdqu\0" "\x0b" "vmaskmovdqu\0" "\x05" "psubb\0" \ +"\x06" "vpsubb\0" "\x05" "psubw\0" "\x06" "vpsubw\0" "\x05" "psubd\0" \ +"\x06" "vpsubd\0" "\x05" "psubq\0" "\x06" "vpsubq\0" "\x05" "paddb\0" \ +"\x06" "vpaddb\0" "\x05" "paddw\0" "\x06" "vpaddw\0" "\x05" "paddd\0" \ +"\x06" "vpaddd\0" "\x07" "fnstenv\0" "\x06" "fstenv\0" "\x06" "fnstcw\0" \ +"\x05" "fstcw\0" "\x06" "fnclex\0" "\x05" "fclex\0" "\x06" "fninit\0" \ +"\x05" "finit\0" "\x06" "fnsave\0" "\x05" "fsave\0" "\x06" "fnstsw\0" \ +"\x05" "fstsw\0" "\x06" "pshufb\0" "\x07" "vpshufb\0" "\x06" "phaddw\0" \ +"\x07" "vphaddw\0" "\x06" "phaddd\0" "\x07" "vphaddd\0" "\x07" "phaddsw\0" \ +"\x08" "vphaddsw\0" "\x09" "pmaddubsw\0" "\x0a" "vpmaddubsw\0" "\x06" "phsubw\0" \ +"\x07" "vphsubw\0" "\x06" "phsubd\0" "\x07" "vphsubd\0" "\x07" "phsubsw\0" \ +"\x08" "vphsubsw\0" "\x06" "psignb\0" "\x07" "vpsignb\0" "\x06" "psignw\0" \ +"\x07" "vpsignw\0" "\x06" "psignd\0" "\x07" "vpsignd\0" "\x08" "pmulhrsw\0" \ +"\x09" "vpmulhrsw\0" "\x09" "vpermilps\0" "\x09" "vpermilpd\0" "\x07" "vtestps\0" \ +"\x07" "vtestpd\0" "\x08" "pblendvb\0" "\x08" "blendvps\0" "\x08" "blendvpd\0" \ +"\x05" "ptest\0" "\x06" "vptest\0" "\x0c" "vbroadcastss\0" "\x0c" "vbroadcastsd\0" \ +"\x0e" "vbroadcastf128\0" "\x05" "pabsb\0" "\x06" "vpabsb\0" "\x05" "pabsw\0" \ +"\x06" "vpabsw\0" "\x05" "pabsd\0" "\x06" "vpabsd\0" "\x08" "pmovsxbw\0" \ +"\x09" "vpmovsxbw\0" "\x08" "pmovsxbd\0" "\x09" "vpmovsxbd\0" "\x08" "pmovsxbq\0" \ +"\x09" "vpmovsxbq\0" "\x08" "pmovsxwd\0" "\x09" "vpmovsxwd\0" "\x08" "pmovsxwq\0" \ +"\x09" "vpmovsxwq\0" "\x08" "pmovsxdq\0" "\x09" "vpmovsxdq\0" "\x06" "pmuldq\0" \ +"\x07" "vpmuldq\0" "\x07" "pcmpeqq\0" "\x08" "vpcmpeqq\0" "\x08" "movntdqa\0" \ +"\x09" "vmovntdqa\0" "\x08" "packusdw\0" "\x09" "vpackusdw\0" "\x0a" "vmaskmovps\0" \ +"\x0a" "vmaskmovpd\0" "\x08" "pmovzxbw\0" "\x09" "vpmovzxbw\0" "\x08" "pmovzxbd\0" \ +"\x09" "vpmovzxbd\0" "\x08" "pmovzxbq\0" "\x09" "vpmovzxbq\0" "\x08" "pmovzxwd\0" \ +"\x09" "vpmovzxwd\0" "\x08" "pmovzxwq\0" "\x09" "vpmovzxwq\0" "\x08" "pmovzxdq\0" \ +"\x09" "vpmovzxdq\0" "\x07" "pcmpgtq\0" "\x08" "vpcmpgtq\0" "\x06" "pminsb\0" \ +"\x07" "vpminsb\0" "\x06" "pminsd\0" "\x07" "vpminsd\0" "\x06" "pminuw\0" \ +"\x07" "vpminuw\0" "\x06" "pminud\0" "\x07" "vpminud\0" "\x06" "pmaxsb\0" \ +"\x07" "vpmaxsb\0" "\x06" "pmaxsd\0" "\x07" "vpmaxsd\0" "\x06" "pmaxuw\0" \ +"\x07" "vpmaxuw\0" "\x06" "pmaxud\0" "\x07" "vpmaxud\0" "\x06" "pmulld\0" \ +"\x07" "vpmulld\0" "\x0a" "phminposuw\0" "\x0b" "vphminposuw\0" "\x06" "invept\0" \ +"\x07" "invvpid\0" "\x07" "invpcid\0" "\x0e" "vfmaddsub132ps\0" "\x0e" "vfmaddsub132pd\0" \ +"\x0e" "vfmsubadd132ps\0" "\x0e" "vfmsubadd132pd\0" "\x0b" "vfmadd132ps\0" \ +"\x0b" "vfmadd132pd\0" "\x0b" "vfmadd132ss\0" "\x0b" "vfmadd132sd\0" \ +"\x0b" "vfmsub132ps\0" "\x0b" "vfmsub132pd\0" "\x0b" "vfmsub132ss\0" \ +"\x0b" "vfmsub132sd\0" "\x0c" "vfnmadd132ps\0" "\x0c" "vfnmadd132pd\0" \ +"\x0c" "vfnmadd132ss\0" "\x0c" "vfnmadd132sd\0" "\x0c" "vfnmsub132ps\0" \ +"\x0c" "vfnmsub132pd\0" "\x0c" "vfnmsub132ss\0" "\x0c" "vfnmsub132sd\0" \ +"\x0e" "vfmaddsub213ps\0" "\x0e" "vfmaddsub213pd\0" "\x0e" "vfmsubadd213ps\0" \ +"\x0e" "vfmsubadd213pd\0" "\x0b" "vfmadd213ps\0" "\x0b" "vfmadd213pd\0" \ +"\x0b" "vfmadd213ss\0" "\x0b" "vfmadd213sd\0" "\x0b" "vfmsub213ps\0" \ +"\x0b" "vfmsub213pd\0" "\x0b" "vfmsub213ss\0" "\x0b" "vfmsub213sd\0" \ +"\x0c" "vfnmadd213ps\0" "\x0c" "vfnmadd213pd\0" "\x0c" "vfnmadd213ss\0" \ +"\x0c" "vfnmadd213sd\0" "\x0c" "vfnmsub213ps\0" "\x0c" "vfnmsub213pd\0" \ +"\x0c" "vfnmsub213ss\0" "\x0c" "vfnmsub213sd\0" "\x0e" "vfmaddsub231ps\0" \ +"\x0e" "vfmaddsub231pd\0" "\x0e" "vfmsubadd231ps\0" "\x0e" "vfmsubadd231pd\0" \ +"\x0b" "vfmadd231ps\0" "\x0b" "vfmadd231pd\0" "\x0b" "vfmadd231ss\0" \ +"\x0b" "vfmadd231sd\0" "\x0b" "vfmsub231ps\0" "\x0b" "vfmsub231pd\0" \ +"\x0b" "vfmsub231ss\0" "\x0b" "vfmsub231sd\0" "\x0c" "vfnmadd231ps\0" \ +"\x0c" "vfnmadd231pd\0" "\x0c" "vfnmadd231ss\0" "\x0c" "vfnmadd231sd\0" \ +"\x0c" "vfnmsub231ps\0" "\x0c" "vfnmsub231pd\0" "\x0c" "vfnmsub231ss\0" \ +"\x0c" "vfnmsub231sd\0" "\x06" "aesimc\0" "\x07" "vaesimc\0" "\x06" "aesenc\0" \ +"\x07" "vaesenc\0" "\x0a" "aesenclast\0" "\x0b" "vaesenclast\0" "\x06" "aesdec\0" \ +"\x07" "vaesdec\0" "\x0a" "aesdeclast\0" "\x0b" "vaesdeclast\0" "\x05" "movbe\0" \ +"\x05" "crc32\0" "\x0a" "vperm2f128\0" "\x07" "roundps\0" "\x08" "vroundps\0" \ +"\x07" "roundpd\0" "\x08" "vroundpd\0" "\x07" "roundss\0" "\x08" "vroundss\0" \ +"\x07" "roundsd\0" "\x08" "vroundsd\0" "\x07" "blendps\0" "\x08" "vblendps\0" \ +"\x07" "blendpd\0" "\x08" "vblendpd\0" "\x07" "pblendw\0" "\x08" "vpblendw\0" \ +"\x07" "palignr\0" "\x08" "vpalignr\0" "\x06" "pextrb\0" "\x07" "vpextrb\0" \ +"\x06" "pextrd\0" "\x06" "pextrq\0" "\x07" "vpextrd\0" "\x07" "vpextrq\0" \ +"\x09" "extractps\0" "\x0a" "vextractps\0" "\x0b" "vinsertf128\0" "\x0c" "vextractf128\0" \ +"\x06" "pinsrb\0" "\x07" "vpinsrb\0" "\x08" "insertps\0" "\x09" "vinsertps\0" \ +"\x06" "pinsrd\0" "\x06" "pinsrq\0" "\x07" "vpinsrd\0" "\x07" "vpinsrq\0" \ +"\x04" "dpps\0" "\x05" "vdpps\0" "\x04" "dppd\0" "\x05" "vdppd\0" "\x07" "mpsadbw\0" \ +"\x08" "vmpsadbw\0" "\x09" "pclmulqdq\0" "\x0a" "vpclmulqdq\0" "\x09" "vblendvps\0" \ +"\x09" "vblendvpd\0" "\x09" "vpblendvb\0" "\x09" "pcmpestrm\0" "\x0a" "vpcmpestrm\0" \ +"\x09" "pcmpestri\0" "\x0a" "vpcmpestri\0" "\x09" "pcmpistrm\0" "\x0a" "vpcmpistrm\0" \ +"\x09" "pcmpistri\0" "\x0a" "vpcmpistri\0" "\x0f" "aeskeygenassist\0" \ +"\x10" "vaeskeygenassist\0" "\x06" "psrldq\0" "\x07" "vpsrldq\0" "\x06" "pslldq\0" \ +"\x07" "vpslldq\0" "\x06" "fxsave\0" "\x08" "fxsave64\0" "\x08" "rdfsbase\0" \ +"\x07" "fxrstor\0" "\x09" "fxrstor64\0" "\x08" "rdgsbase\0" "\x07" "ldmxcsr\0" \ +"\x08" "wrfsbase\0" "\x08" "vldmxcsr\0" "\x07" "stmxcsr\0" "\x08" "wrgsbase\0" \ +"\x08" "vstmxcsr\0" "\x07" "vmptrld\0" "\x07" "vmclear\0" "\x05" "vmxon\0" \ +"\x06" "movsxd\0" "\x05" "pause\0" "\x04" "wait\0" "\x06" "rdrand\0" \ +"\x06" "_3dnow\0" \ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; /* Sentinel mnemonic. */ const _WRegister _REGISTERS[] = { - { 3, "rax" }, { 3, "rcx" }, { 3, "rdx" }, { 3, "rbx" }, { 3, "rsp" }, { 3, "rbp" }, { 3, "rsi" }, { 3, "rdi" }, { 2, "r8" }, { 2, "r9" }, { 3, "r10" }, { 3, "r11" }, { 3, "r12" }, { 3, "r13" }, { 3, "r14" }, { 3, "r15" }, - { 3, "eax" }, { 3, "ecx" }, { 3, "edx" }, { 3, "ebx" }, { 3, "esp" }, { 3, "ebp" }, { 3, "esi" }, { 3, "edi" }, { 3, "r8d" }, { 3, "r9d" }, { 4, "r10d" }, { 4, "r11d" }, { 4, "r12d" }, { 4, "r13d" }, { 4, "r14d" }, { 4, "r15d" }, - { 2, "ax" }, { 2, "cx" }, { 2, "dx" }, { 2, "bx" }, { 2, "sp" }, { 2, "bp" }, { 2, "si" }, { 2, "di" }, { 3, "r8w" }, { 3, "r9w" }, { 4, "r10w" }, { 4, "r11w" }, { 4, "r12w" }, { 4, "r13w" }, { 4, "r14w" }, { 4, "r15w" }, - { 2, "al" }, { 2, "cl" }, { 2, "dl" }, { 2, "bl" }, { 2, "ah" }, { 2, "ch" }, { 2, "dh" }, { 2, "bh" }, { 3, "r8b" }, { 3, "r9b" }, { 4, "r10b" }, { 4, "r11b" }, { 4, "r12b" }, { 4, "r13b" }, { 4, "r14b" }, { 4, "r15b" }, - { 3, "spl" }, { 3, "bpl" }, { 3, "sil" }, { 3, "dil" }, - { 2, "es" }, { 2, "cs" }, { 2, "ss" }, { 2, "ds" }, { 2, "fs" }, { 2, "gs" }, - { 3, "rip" }, - { 3, "st0" }, { 3, "st1" }, { 3, "st2" }, { 3, "st3" }, { 3, "st4" }, { 3, "st5" }, { 3, "st6" }, { 3, "st7" }, - { 3, "mm0" }, { 3, "mm1" }, { 3, "mm2" }, { 3, "mm3" }, { 3, "mm4" }, { 3, "mm5" }, { 3, "mm6" }, { 3, "mm7" }, - { 4, "xmm0" }, { 4, "xmm1" }, { 4, "xmm2" }, { 4, "xmm3" }, { 4, "xmm4" }, { 4, "xmm5" }, { 4, "xmm6" }, { 4, "xmm7" }, { 4, "xmm8" }, { 4, "xmm9" }, { 5, "xmm10" }, { 5, "xmm11" }, { 5, "xmm12" }, { 5, "xmm13" }, { 5, "xmm14" }, { 5, "xmm15" }, - { 4, "ymm0" }, { 4, "ymm1" }, { 4, "ymm2" }, { 4, "ymm3" }, { 4, "ymm4" }, { 4, "ymm5" }, { 4, "ymm6" }, { 4, "ymm7" }, { 4, "ymm8" }, { 4, "ymm9" }, { 5, "ymm10" }, { 5, "ymm11" }, { 5, "ymm12" }, { 5, "ymm13" }, { 5, "ymm14" }, { 5, "ymm15" }, - { 3, "cr0" }, { 0, "" }, { 3, "cr2" }, { 3, "cr3" }, { 3, "cr4" }, { 0, "" }, { 0, "" }, { 0, "" }, { 3, "cr8" }, - { 3, "dr0" }, { 3, "dr1" }, { 3, "dr2" }, { 3, "dr3" }, { 0, "" }, { 0, "" }, { 3, "dr6" }, { 3, "dr7" } + {3, "rax"}, {3, "rcx"}, {3, "rdx"}, {3, "rbx"}, {3, "rsp"}, {3, "rbp"}, {3, "rsi"}, {3, "rdi"}, {2, "r8"}, {2, "r9"}, {3, "r10"}, {3, "r11"}, {3, "r12"}, {3, "r13"}, {3, "r14"}, {3, "r15"}, + {3, "eax"}, {3, "ecx"}, {3, "edx"}, {3, "ebx"}, {3, "esp"}, {3, "ebp"}, {3, "esi"}, {3, "edi"}, {3, "r8d"}, {3, "r9d"}, {4, "r10d"}, {4, "r11d"}, {4, "r12d"}, {4, "r13d"}, {4, "r14d"}, {4, "r15d"}, + {2, "ax"}, {2, "cx"}, {2, "dx"}, {2, "bx"}, {2, "sp"}, {2, "bp"}, {2, "si"}, {2, "di"}, {3, "r8w"}, {3, "r9w"}, {4, "r10w"}, {4, "r11w"}, {4, "r12w"}, {4, "r13w"}, {4, "r14w"}, {4, "r15w"}, + {2, "al"}, {2, "cl"}, {2, "dl"}, {2, "bl"}, {2, "ah"}, {2, "ch"}, {2, "dh"}, {2, "bh"}, {3, "r8b"}, {3, "r9b"}, {4, "r10b"}, {4, "r11b"}, {4, "r12b"}, {4, "r13b"}, {4, "r14b"}, {4, "r15b"}, + {3, "spl"}, {3, "bpl"}, {3, "sil"}, {3, "dil"}, + {2, "es"}, {2, "cs"}, {2, "ss"}, {2, "ds"}, {2, "fs"}, {2, "gs"}, + {3, "rip"}, + {3, "st0"}, {3, "st1"}, {3, "st2"}, {3, "st3"}, {3, "st4"}, {3, "st5"}, {3, "st6"}, {3, "st7"}, + {3, "mm0"}, {3, "mm1"}, {3, "mm2"}, {3, "mm3"}, {3, "mm4"}, {3, "mm5"}, {3, "mm6"}, {3, "mm7"}, + {4, "xmm0"}, {4, "xmm1"}, {4, "xmm2"}, {4, "xmm3"}, {4, "xmm4"}, {4, "xmm5"}, {4, "xmm6"}, {4, "xmm7"}, {4, "xmm8"}, {4, "xmm9"}, {5, "xmm10"}, {5, "xmm11"}, {5, "xmm12"}, {5, "xmm13"}, {5, "xmm14"}, {5, "xmm15"}, + {4, "ymm0"}, {4, "ymm1"}, {4, "ymm2"}, {4, "ymm3"}, {4, "ymm4"}, {4, "ymm5"}, {4, "ymm6"}, {4, "ymm7"}, {4, "ymm8"}, {4, "ymm9"}, {5, "ymm10"}, {5, "ymm11"}, {5, "ymm12"}, {5, "ymm13"}, {5, "ymm14"}, {5, "ymm15"}, + {3, "cr0"}, {0, ""}, {3, "cr2"}, {3, "cr3"}, {3, "cr4"}, {0, ""}, {0, ""}, {0, ""}, {3, "cr8"}, + {3, "dr0"}, {3, "dr1"}, {3, "dr2"}, {3, "dr3"}, {0, ""}, {0, ""}, {3, "dr6"}, {3, "dr7"}, + {0, ""} /* There must be an empty last reg, see strcat_WSR. */ }; #endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/operands.c b/NativeCore/Dependencies/distorm/src/operands.c index 506780c4..b5da260b 100644 --- a/NativeCore/Dependencies/distorm/src/operands.c +++ b/NativeCore/Dependencies/distorm/src/operands.c @@ -4,7 +4,7 @@ operands.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -23,7 +23,7 @@ uint32_t _REGISTERTORCLASS[] = /* Based on _RegisterType enumeration! */ RM_AX, RM_CX, RM_DX, RM_BX, RM_SP, RM_BP, RM_SI, RM_DI, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, RM_AX, RM_CX, RM_DX, RM_BX, RM_AX, RM_CX, RM_DX, RM_BX, RM_R8, RM_R9, RM_R10, RM_R11, RM_R12, RM_R13, RM_R14, RM_R15, RM_SP, RM_BP, RM_SI, RM_DI, - 0, 0, 0, 0, 0, 0, + RM_SEG, RM_SEG, RM_SEG, RM_SEG, RM_SEG, RM_SEG, 0, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_FPU, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, RM_MMX, @@ -33,60 +33,96 @@ uint32_t _REGISTERTORCLASS[] = /* Based on _RegisterType enumeration! */ RM_DR, RM_DR, RM_DR, RM_DR, 0, 0, RM_DR, RM_DR }; -typedef enum {OPERAND_SIZE_NONE = 0, OPERAND_SIZE8, OPERAND_SIZE16, OPERAND_SIZE32, OPERAND_SIZE64, OPERAND_SIZE80, OPERAND_SIZE128, OPERAND_SIZE256} _OperandSizeType; -static uint16_t _OPSIZETOINT[] = {0, 8, 16, 32, 64, 80, 128, 256}; - /* A helper function to fix the 8 bits register if REX is used (to support SIL, DIL, etc). */ -static unsigned int _FASTCALL_ operands_fix_8bit_rex_base(unsigned int reg) +_INLINE_ unsigned int _FASTCALL_ operands_fix_8bit_rex_base(unsigned int reg) { if ((reg >= 4) && (reg < 8)) return reg + REGS8_REX_BASE - 4; return reg + REGS8_BASE; } /* A helper function to set operand's type and size. */ -static void _FASTCALL_ operands_set_ts(_Operand* op, _OperandType type, uint16_t size) +_INLINE_ void operands_set_ts(_Operand* op, _OperandType type, uint16_t size) { op->type = type; op->size = size; } /* A helper function to set operand's type, size and index. */ -static void _FASTCALL_ operands_set_tsi(_Operand* op, _OperandType type, uint16_t size, unsigned int index) +_INLINE_ void operands_set_tsi(_DInst* di, _Operand* op, _OperandType type, uint16_t size, unsigned int index) { op->type = type; op->index = (uint8_t)index; op->size = size; + di->usedRegistersMask |= _REGISTERTORCLASS[index]; } /* A helper function to read an unsigned integer from the stream safely. */ -static int _FASTCALL_ read_stream_safe_uint(_CodeInfo* ci, void* result, unsigned int size) +_INLINE_ int read_stream_safe_uint8(_CodeInfo* ci, void* result) { - ci->codeLen -= size; + ci->codeLen -= 1; if (ci->codeLen < 0) return FALSE; - switch (size) - { - case 1: *(uint8_t*)result = *(uint8_t*)ci->code; break; - case 2: *(uint16_t*)result = RUSHORT(ci->code); break; - case 4: *(uint32_t*)result = RULONG(ci->code); break; - case 8: *(uint64_t*)result = RULLONG(ci->code); break; - } - ci->code += size; + *(uint8_t*)result = *(uint8_t*)ci->code; + ci->code += 1; + return TRUE; +} + +/* A helper function to read an unsigned integer from the stream safely. */ +_INLINE_ int read_stream_safe_uint16(_CodeInfo* ci, void* result) +{ + ci->codeLen -= 2; + if (ci->codeLen < 0) return FALSE; + *(uint16_t*)result = RUSHORT(ci->code); + ci->code += 2; + return TRUE; +} + +/* A helper function to read an unsigned integer from the stream safely. */ +_INLINE_ int read_stream_safe_uint32(_CodeInfo* ci, void* result) +{ + ci->codeLen -= 4; + if (ci->codeLen < 0) return FALSE; + *(uint32_t*)result = RULONG(ci->code); + ci->code += 4; + return TRUE; +} + +/* A helper function to read an unsigned integer from the stream safely. */ +_INLINE_ int read_stream_safe_uint64(_CodeInfo* ci, void* result) +{ + ci->codeLen -= 8; + if (ci->codeLen < 0) return FALSE; + *(uint64_t*)result = RULLONG(ci->code); + ci->code += 8; return TRUE; } /* A helper function to read a signed integer from the stream safely. */ -static int _FASTCALL_ read_stream_safe_sint(_CodeInfo* ci, int64_t* result, unsigned int size) +_INLINE_ int read_stream_safe_sint8(_CodeInfo* ci, int64_t* result) { - ci->codeLen -= size; + ci->codeLen -= 1; if (ci->codeLen < 0) return FALSE; - switch (size) - { - case 1: *result = *(int8_t*)ci->code; break; - case 2: *result = RSHORT(ci->code); break; - case 4: *result = RLONG(ci->code); break; - case 8: *result = RLLONG(ci->code); break; - } - ci->code += size; + *result = *(int8_t*)ci->code; + ci->code += 1; + return TRUE; +} + +/* A helper function to read a signed integer from the stream safely. */ +_INLINE_ int read_stream_safe_sint16(_CodeInfo* ci, int64_t* result) +{ + ci->codeLen -= 2; + if (ci->codeLen < 0) return FALSE; + *result = RSHORT(ci->code); + ci->code += 2; + return TRUE; +} + +/* A helper function to read a signed integer from the stream safely. */ +_INLINE_ int read_stream_safe_sint32(_CodeInfo* ci, int64_t* result) +{ + ci->codeLen -= 4; + if (ci->codeLen < 0) return FALSE; + *result = RLONG(ci->code); + ci->code += 4; return TRUE; } @@ -108,23 +144,20 @@ static int _FASTCALL_ read_stream_safe_sint(_CodeInfo* ci, int64_t* result, unsi * NOTE: base could specify None (no base register) if base==5 and mod==0, but then you also need DISP32. * } */ -static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, +static void operands_extract_sib(_DInst* di, _PrefixState* ps, _DecodeType effAdrSz, - unsigned int sib, unsigned int mod) + unsigned int sib, unsigned int mod, _Operand* op) { - unsigned int scale = 0, index = 0, base = 0; + unsigned char scale, index, base; unsigned int vrex = ps->vrex; uint8_t* pIndex = NULL; - _Operand* op = &di->ops[opNum]; - /* * SIB bits: * |7---6-5----3-2---0| * |SCALE| INDEX| BASE| * |------------------| */ - scale = (sib >> 6) & 3; index = (sib >> 3) & 7; base = sib & 7; @@ -154,6 +187,8 @@ static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, if (vrex & PREFIX_EX_B) ps->usedPrefixes |= INST_PRE_REX; *pIndex = effAdrSz == Decode64Bits ? REGS64_BASE : REGS32_BASE; *pIndex += (uint8_t)(base + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0)); + + if (di->base != R_NONE) di->usedRegistersMask |= _REGISTERTORCLASS[di->base]; } else if (mod != 0) { /* * if base == 5 then you have to decode according to MOD. @@ -166,6 +201,8 @@ static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, if (vrex & PREFIX_EX_B) ps->usedPrefixes |= INST_PRE_REX; if (effAdrSz == Decode64Bits) *pIndex = REGS64_BASE + 5 + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0); else *pIndex = REGS32_BASE + 5 + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0); + + if (di->base != R_NONE) di->usedRegistersMask |= _REGISTERTORCLASS[di->base]; } else if (index == 4) { /* 32bits displacement only. */ op->type = O_DISP; @@ -173,6 +210,7 @@ static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, } if (index != 4) { /* In 64 bits decoding mode, if index == R12, it's valid! */ + scale = (sib >> 6) & 3; if (effAdrSz == Decode64Bits) op->index = (uint8_t)(REGS64_BASE + index); else op->index = (uint8_t)(REGS32_BASE + index); di->scale = scale != 0 ? (1 << scale) : 0; @@ -191,70 +229,393 @@ static void operands_extract_sib(_DInst* di, _OperandNumberType opNum, * Some instructions force the use of RM16 or other specific types, so take it into account. */ -static int operands_extract_modrm(_CodeInfo* ci, - _DInst* di, _OpType type, - _OperandNumberType opNum, _PrefixState* ps, - _DecodeType effOpSz, _DecodeType effAdrSz, - int* lockableInstruction, unsigned int mod, unsigned int rm, - _iflags instFlags) +static int operands_extract_modrm(_CodeInfo* ci, _PrefixState* ps, _DInst* di, + _DecodeType effAdrSz, unsigned int mod, unsigned int rm, + _iflags instFlags, _Operand* op) { - unsigned int vrex = ps->vrex, sib = 0, base = 0; - _Operand* op = &di->ops[opNum]; - uint16_t size = 0; + unsigned char sib = 0, base = 0; - if (mod == 3) { - /* - * General-purpose register is handled the same way in 16/32/64 bits decoding modes. - * NOTE!! that we have to override the size of the register, since it was set earlier as Memory and not Register! - */ - op->type = O_REG; - /* Start with original size which was set earlier, some registers have same size of memory and depend on it. */ - size = op->size; - switch(type) + /* Memory indirection decoding ahead:) */ + + ps->usedPrefixes |= INST_PRE_ADDR_SIZE; + if ((instFlags & INST_PRE_LOCK) && (ps->decodedPrefixes & INST_PRE_LOCK)) { + ps->usedPrefixes |= INST_PRE_LOCK; + di->flags |= FLAG_LOCK; + } + + if (effAdrSz != Decode16Bits) { /* Decode32Bits or Decode64Bits! */ + /* Remember that from a 32/64 bits ModR/M byte a SIB byte could follow! */ + if ((rm == 5) && (mod == 0)) { + /* 5 is a special case - only 32 bits displacement, or RIP relative. */ + di->dispSize = 32; + if (!read_stream_safe_sint32(ci, (int64_t*)&di->disp)) return FALSE; + + /* Absolute address: */ + op->type = O_DISP; + + if (ci->dt == Decode64Bits) { + /* In 64 bits decoding mode depsite of the address size, a RIP-relative address it is. */ + op->type = O_SMEM; + op->index = R_RIP; + di->flags |= FLAG_RIP_RELATIVE; + } + + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + } + else { + if (rm == 4) { + /* 4 is a special case - SIB byte + disp8/32 follows! */ + /* Read SIB byte. */ + if (!read_stream_safe_uint8(ci, &sib)) return FALSE; + operands_extract_sib(di, ps, effAdrSz, sib, mod, op); + } + else { + op->type = O_SMEM; + if (ps->vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + + if (effAdrSz == Decode64Bits) op->index = (uint8_t)(REGS64_BASE + rm); + else op->index = (uint8_t)(REGS32_BASE + rm); + } + + if (mod == 1) { + di->dispSize = 8; + if (!read_stream_safe_sint8(ci, (int64_t*)&di->disp)) return FALSE; + } + else if ((mod == 2) || ((sib & 7) == 5)) { /* If there is no BASE, read DISP32! */ + di->dispSize = 32; + if (!read_stream_safe_sint32(ci, (int64_t*)&di->disp)) return FALSE; + } + + /* Get the base register. */ + base = op->index; + if (di->base != R_NONE) base = di->base; + else if (di->scale >= 2) base = 0; /* If it's only an index but got scale, it's still DS. */ + /* Default for EBP/ESP is SS segment. 64 bits mode ignores DS anyway. */ + if ((base == R_EBP) || (base == R_ESP)) prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); + else prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + } + } + else { /* Decode16Bits */ + /* Decoding according to Table 2-1. (16 bits) */ + if ((mod == 0) && (rm == 6)) { + /* 6 is a special case - only 16 bits displacement. */ + op->type = O_DISP; + di->dispSize = 16; + if (!read_stream_safe_sint16(ci, (int64_t*)&di->disp)) return FALSE; + } + else { + /* + * Create the O_MEM for 16 bits indirection that requires 2 registers, E.G: [BS+SI]. + * or create O_SMEM for a single register indirection, E.G: [BP]. + */ + static uint8_t MODS[] = { R_BX, R_BX, R_BP, R_BP, R_SI, R_DI, R_BP, R_BX }; + static uint8_t MODS2[] = { R_SI, R_DI, R_SI, R_DI }; + if (rm < 4) { + op->type = O_MEM; + di->base = MODS[rm]; + di->usedRegistersMask |= _REGISTERTORCLASS[MODS[rm]]; + op->index = MODS2[rm]; + } + else { + op->type = O_SMEM; + op->index = MODS[rm]; + } + + if (mod == 1) { /* 8 bits displacement + indirection */ + di->dispSize = 8; + if (!read_stream_safe_sint8(ci, (int64_t*)&di->disp)) return FALSE; + } + else if (mod == 2) { /* 16 bits displacement + indirection */ + di->dispSize = 16; + if (!read_stream_safe_sint16(ci, (int64_t*)&di->disp)) return FALSE; + } + } + + if ((rm == 2) || (rm == 3) || ((rm == 6) && (mod != 0))) { + /* BP's default segment is SS, so ignore it. */ + prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); + } + else { + /* Ignore default DS segment. */ + prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); + } + } + + return TRUE; +} + + +/* + * This function is reponsible to textually format a required operand according to its type. + * It is vital to understand that there are other operands than what the ModR/M byte specifies. + + * Only by decoding the operands of an instruction which got a LOCK prefix, we could tell whether it may use the LOCK prefix. + * According to Intel, LOCK prefix must precede some specific instructions AND in their memory destination operand form (which means first operand). + * LOCK INC EAX, would generate an exception, but LOCK INC [EAX] is alright. + * Also LOCK ADD BX, [BP] would generate an exception. + + * Return code: + * TRUE - continue parsing the instruction and its operands, everything went right 'till now. + * FALSE - not enough bytes, or invalid operands. + */ + +int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, + _iflags instFlags, _OpType type, + unsigned int modrm, _PrefixState* ps, _DecodeType effOpSz, + _DecodeType effAdrSz, _Operand* op) +{ + int ret = 0; + unsigned int mod, reg, rm; + unsigned int size = 0; + + /* + * ModRM bits: + * |7-6-5--------3-2-0| + * |MOD|REG/OPCODE|RM | + * |------------------| + */ + /* mod = (modrm >> 6) & 3; */ /* Mode(register-indirection, disp8+reg+indirection, disp16+reg+indirection, general-purpose register) */ + /* reg = (modrm >> 3) & 7; */ /* Register(could be part of the opcode itself or general-purpose register) */ + /* rm = modrm & 7; */ /* Specifies which general-purpose register or disp+reg to use. */ + + /* -- Memory Indirection Operands (that cannot be a general purpose register) -- */ + if ((type >= OT_MEM) && (type <= OT_LMEM128_256)) { + /* All of the above types can't use a general-purpose register (a MOD of 3)!. */ + mod = (modrm >> 6) & 3; + + if (mod == 3) { + if (type == OT_MEM_OPT) { + /* Since the MEM is optional, only when mod != 3, then return true as if the operand was alright. */ + return TRUE; + } + return FALSE; + } + + switch (type) { - case OT_RFULL_M16: - case OT_RM_FULL: + case OT_MEM64_128: /* Used only by CMPXCHG8/16B. */ + if (effOpSz == Decode64Bits) { + ps->usedPrefixes |= INST_PRE_REX; + size = 128; + } + else size = 64; + break; + case OT_MEM32: size = 32; break; + case OT_MEM32_64: + /* Used by MOVNTI. Default size is 32bits, 64bits with REX. */ + if (effOpSz == Decode64Bits) { + ps->usedPrefixes |= INST_PRE_REX; + size = 64; + } + else size = 32; + break; + case OT_MEM64: size = 64; break; + case OT_MEM128: size = 128; break; + case OT_MEM16_FULL: /* The size indicates about the second item of the pair. */ switch (effOpSz) { case Decode16Bits: ps->usedPrefixes |= INST_PRE_OP_SIZE; - if (vrex & PREFIX_EX_B) { - ps->usedPrefixes |= INST_PRE_REX; - rm += EX_GPR_BASE; - } size = 16; - rm += REGS16_BASE; break; case Decode32Bits: ps->usedPrefixes |= INST_PRE_OP_SIZE; - if (vrex & PREFIX_EX_B) { - ps->usedPrefixes |= INST_PRE_REX; - rm += EX_GPR_BASE; - } size = 32; - rm += REGS32_BASE; break; case Decode64Bits: - /* A fix for SMSW RAX which use the REX prefix. */ - if (type == OT_RFULL_M16) ps->usedPrefixes |= INST_PRE_REX; - /* CALL NEAR/PUSH/POP defaults to 64 bits. --> INST_64BITS, REX isn't required, thus ignored anyways. */ - if (instFlags & INST_PRE_REX) ps->usedPrefixes |= INST_PRE_REX; - /* Include REX if used for REX.B. */ - if (vrex & PREFIX_EX_B) { - ps->usedPrefixes |= INST_PRE_REX; - rm += EX_GPR_BASE; - } + /* Mark usage of REX only if it was required. */ + if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) ps->usedPrefixes |= INST_PRE_REX; size = 64; - rm += REGS64_BASE; break; } break; + case OT_MEM16_3264: /* The size indicates about the second item of the pair. */ + if (ci->dt == Decode64Bits) size = 64; + else size = 32; + break; + case OT_FPUM16: size = 16; break; + case OT_FPUM32: size = 32; break; + case OT_FPUM64: size = 64; break; + case OT_FPUM80: size = 80; break; + case OT_LMEM128_256: + if (ps->vrex & PREFIX_EX_L) size = 256; + else size = 128; + break; + case OT_MEM_OPT: /* Here we know it's not optional. */ + case OT_MEM: size = 0; /* Size is unknown, but still handled. */ break; + default: return FALSE; + } + rm = modrm & 7; + ret = operands_extract_modrm(ci, ps, di, effAdrSz, mod, rm, instFlags, op); + op->size = (uint16_t)size; + if ((op->type == O_SMEM) || (op->type == O_MEM)) { + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + } + return ret; + } + + /* -- Memory Indirection Operands (that can be a register) -- */ + if ((type >= OT_RM8) && (type <= OT_LXMM64_128)) { + mod = (modrm >> 6) & 3; + if (mod != 3) { + switch (type) + { + case OT_RM_FULL: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* PUSH/JMP/CALL are automatically promoted to 64 bits! */ + if (effOpSz == Decode32Bits) { + size = 32; + break; + } + else if (effOpSz == Decode64Bits) { + /* Mark usage of REX only if it was required. */ + if ((instFlags & INST_64BITS) == 0) ps->usedPrefixes |= INST_PRE_REX; + size = 64; + break; + } + /* FALL THROUGH BECAUSE dt==Decoded16Bits @-<----*/ + case OT_RM16: + /* If we got here not from OT_RM16, then the prefix was used. */ + if (type != OT_RM16) ps->usedPrefixes |= INST_PRE_OP_SIZE; + size = 16; + break; + case OT_RM32_64: + /* The default size is 32, which can be 64 with a REX only. */ + if (effOpSz == Decode64Bits) { + size = 64; + /* Mark REX prefix as used if non-promoted instruction. */ + if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) { + ps->usedPrefixes |= INST_PRE_REX; + } + } + else size = 32; + break; + case OT_RM16_32: + /* Ignore REX, it's either 32 or 16 bits RM. */ + if (ps->decodedPrefixes & INST_PRE_OP_SIZE) { + ps->usedPrefixes |= INST_PRE_OP_SIZE; + /* Assume: We are in 64bits when we have this operand used. */ + size = 16; + } + else size = 32; + break; + case OT_WXMM32_64: + case OT_WRM32_64: + if (ps->vrex & PREFIX_EX_W) size = 64; + else size = 32; + break; + case OT_YXMM64_256: + if (ps->vrex & PREFIX_EX_L) size = 256; + else size = 64; + break; + case OT_YXMM128_256: + if (ps->vrex & PREFIX_EX_L) size = 256; + else size = 128; + break; + case OT_LXMM64_128: + if (ps->vrex & PREFIX_EX_L) size = 128; + else size = 64; + break; + case OT_RFULL_M16: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + size = 16; + break; + + case OT_RM8: + case OT_R32_M8: + case OT_R32_64_M8: + case OT_REG32_64_M8: + size = 8; + break; + + case OT_XMM16: + case OT_R32_M16: + case OT_R32_64_M16: + case OT_REG32_64_M16: + size = 16; + break; + + case OT_RM32: + case OT_MM32: + case OT_XMM32: + size = 32; + break; + + case OT_MM64: + case OT_XMM64: + size = 64; + break; + + case OT_XMM128: size = 128; break; + case OT_YMM256: size = 256; break; + default: return FALSE; + } + /* Fill size of memory dereference for operand. */ + rm = modrm & 7; + ret = operands_extract_modrm(ci, ps, di, effAdrSz, mod, rm, instFlags, op); + op->size = (uint16_t)size; + if ((op->type == O_SMEM) || (op->type == O_MEM)) { + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + } + return ret; + } + else { + /* + * General-purpose register is handled the same way in 16/32/64 bits decoding modes. + * NOTE!! that we have to override the size of the register, since it was set earlier as Memory and not Register! + */ + rm = modrm & 7; + size = 0; + switch (type) + { + case OT_RFULL_M16: + case OT_RM_FULL: + switch (effOpSz) + { + case Decode16Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (ps->vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 16; + rm += REGS16_BASE; + break; + case Decode32Bits: + ps->usedPrefixes |= INST_PRE_OP_SIZE; + if (ps->vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 32; + rm += REGS32_BASE; + break; + case Decode64Bits: + /* A fix for SMSW RAX which use the REX prefix. */ + if (type == OT_RFULL_M16) ps->usedPrefixes |= INST_PRE_REX; + /* CALL NEAR/PUSH/POP defaults to 64 bits. --> INST_64BITS, REX isn't required, thus ignored anyways. */ + if (instFlags & INST_PRE_REX) ps->usedPrefixes |= INST_PRE_REX; + /* Mark usage of REX only if it was required. */ + if ((instFlags & INST_64BITS) == 0) ps->usedPrefixes |= INST_PRE_REX; + /* Include REX if used for REX.B. */ + if (ps->vrex & PREFIX_EX_B) { + ps->usedPrefixes |= INST_PRE_REX; + rm += EX_GPR_BASE; + } + size = 64; + rm += REGS64_BASE; + break; + } + break; case OT_R32_64_M8: - /* FALL THROUGH, decode 32 or 64 bits register. */ + /* FALL THROUGH, decode 32 or 64 bits register. */ case OT_R32_64_M16: - /* FALL THROUGH, decode 32 or 64 bits register. */ + /* FALL THROUGH, decode 32 or 64 bits register. */ case OT_RM32_64: /* Take care specifically in MOVNTI/MOVD/CVT's instructions, making it _REG64 with REX or if they are promoted. */ - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } @@ -265,17 +626,18 @@ static int operands_extract_modrm(_CodeInfo* ci, break; } /* Give a chance to REX.W. Because if it was a promoted instruction we don't care about REX.W anyways. */ - if (vrex & PREFIX_EX_W) { + if (ps->vrex & PREFIX_EX_W) { ps->usedPrefixes |= INST_PRE_REX; size = 64; rm += REGS64_BASE; - } else { + } + else { size = 32; rm += REGS32_BASE; } - break; + break; case OT_RM16_32: /* Used only with MOVZXD instruction to support 16 bits operand. */ - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } @@ -284,412 +646,113 @@ static int operands_extract_modrm(_CodeInfo* ci, ps->usedPrefixes |= INST_PRE_OP_SIZE; size = 16; rm += REGS16_BASE; - } else { + } + else { size = 32; rm += REGS32_BASE; } - break; + break; case OT_RM16: - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } rm += REGS16_BASE; - break; + size = 16; + break; case OT_RM8: if (ps->prefixExtType == PET_REX) { ps->usedPrefixes |= INST_PRE_REX; - rm = operands_fix_8bit_rex_base(rm + ((vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0)); - } else rm += REGS8_BASE; - break; + rm = operands_fix_8bit_rex_base(rm + ((ps->vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0)); + } + else rm += REGS8_BASE; + size = 8; + break; case OT_MM32: case OT_MM64: /* MMX doesn't support extended registers. */ size = 64; rm += MMXREGS_BASE; - break; + break; case OT_XMM16: case OT_XMM32: case OT_XMM64: case OT_XMM128: - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } size = 128; rm += SSEREGS_BASE; - break; + break; case OT_RM32: case OT_R32_M8: case OT_R32_M16: - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } size = 32; rm += REGS32_BASE; - break; + break; case OT_YMM256: - if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_B) rm += EX_GPR_BASE; rm += AVXREGS_BASE; - break; + size = 256; + break; case OT_YXMM64_256: case OT_YXMM128_256: - if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; - if (vrex & PREFIX_EX_L) { + if (ps->vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_L) { size = 256; rm += AVXREGS_BASE; - } else { + } + else { size = 128; rm += SSEREGS_BASE; } - break; + break; case OT_WXMM32_64: case OT_LXMM64_128: - if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_B) rm += EX_GPR_BASE; size = 128; rm += SSEREGS_BASE; - break; + break; case OT_WRM32_64: case OT_REG32_64_M8: case OT_REG32_64_M16: - if (vrex & PREFIX_EX_B) rm += EX_GPR_BASE; - if (vrex & PREFIX_EX_W) { + if (ps->vrex & PREFIX_EX_B) rm += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_W) { size = 64; rm += REGS64_BASE; - } else { + } + else { size = 32; rm += REGS32_BASE; } - break; - - default: return FALSE; - } - op->size = size; - op->index = (uint8_t)rm; - return TRUE; - } - - /* Memory indirection decoding ahead:) */ - - ps->usedPrefixes |= INST_PRE_ADDR_SIZE; - if (lockableInstruction && (ps->decodedPrefixes & INST_PRE_LOCK)) *lockableInstruction = TRUE; - - if (effAdrSz == Decode16Bits) { - /* Decoding according to Table 2-1. (16 bits) */ - if ((mod == 0) && (rm == 6)) { - /* 6 is a special case - only 16 bits displacement. */ - op->type = O_DISP; - di->dispSize = 16; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int16_t))) return FALSE; - } else { - /* - * Create the O_MEM for 16 bits indirection that requires 2 registers, E.G: [BS+SI]. - * or create O_SMEM for a single register indirection, E.G: [BP]. - */ - static uint8_t MODS[] = {R_BX, R_BX, R_BP, R_BP, R_SI, R_DI, R_BP, R_BX}; - static uint8_t MODS2[] = {R_SI, R_DI, R_SI, R_DI}; - if (rm < 4) { - op->type = O_MEM; - di->base = MODS[rm]; - op->index = MODS2[rm]; - } else { - op->type = O_SMEM; - op->index = MODS[rm]; - } - - if (mod == 1) { /* 8 bits displacement + indirection */ - di->dispSize = 8; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int8_t))) return FALSE; - } else if (mod == 2) { /* 16 bits displacement + indirection */ - di->dispSize = 16; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int16_t))) return FALSE; - } - } - - if ((rm == 2) || (rm == 3) || ((rm == 6) && (mod != 0))) { - /* BP's default segment is SS, so ignore it. */ - prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); - } else { - /* Ignore default DS segment. */ - prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); - } - } else { /* Decode32Bits or Decode64Bits! */ - /* Remember that from a 32/64 bits ModR/M byte a SIB byte could follow! */ - if ((mod == 0) && (rm == 5)) { - - /* 5 is a special case - only 32 bits displacement, or RIP relative. */ - di->dispSize = 32; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int32_t))) return FALSE; - - if (ci->dt == Decode64Bits) { - /* In 64 bits decoding mode depsite of the address size, a RIP-relative address it is. */ - op->type = O_SMEM; - op->index = R_RIP; - di->flags |= FLAG_RIP_RELATIVE; - } else { - /* Absolute address: */ - op->type = O_DISP; - } - } else { - if (rm == 4) { - /* 4 is a special case - SIB byte + disp8/32 follows! */ - /* Read SIB byte. */ - if (!read_stream_safe_uint(ci, &sib, sizeof(int8_t))) return FALSE; - operands_extract_sib(di, opNum, ps, effAdrSz, sib, mod); - } else { - op->type = O_SMEM; - if (vrex & PREFIX_EX_B) { - ps->usedPrefixes |= INST_PRE_REX; - rm += EX_GPR_BASE; - } - - if (effAdrSz == Decode64Bits) op->index = (uint8_t)(REGS64_BASE + rm); - else op->index = (uint8_t)(REGS32_BASE + rm); - } - - if (mod == 1) { - di->dispSize = 8; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int8_t))) return FALSE; - } else if ((mod == 2) || ((sib & 7) == 5)) { /* If there is no BASE, read DISP32! */ - di->dispSize = 32; - if (!read_stream_safe_sint(ci, (int64_t*)&di->disp, sizeof(int32_t))) return FALSE; - } - } - - /* Get the base register. */ - base = op->index; - if (di->base != R_NONE) base = di->base; - else if (di->scale >= 2) base = 0; /* If it's only an index but got scale, it's still DS. */ - /* Default for EBP/ESP is SS segment. 64 bits mode ignores DS anyway. */ - if ((base == R_EBP) || (base == R_ESP)) prefixes_use_segment(INST_PRE_SS, ps, ci->dt, di); - else prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); - } - - return TRUE; -} - - -/* - * This function is reponsible to textually format a required operand according to its type. - * It is vital to understand that there are other operands than what the ModR/M byte specifies. - - * Only by decoding the operands of an instruction which got a LOCK prefix, we could tell whether it may use the LOCK prefix. - * According to Intel, LOCK prefix must precede some specific instructions AND in their memory destination operand form (which means first operand). - * LOCK INC EAX, would generate an exception, but LOCK INC [EAX] is alright. - * Also LOCK ADD BX, [BP] would generate an exception. - - * Return code: - * TRUE - continue parsing the instruction and its operands, everything went right 'till now. - * FALSE - not enough bytes, or invalid operands. - */ - -int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, - _iflags instFlags, _OpType type, _OperandNumberType opNum, - unsigned int modrm, _PrefixState* ps, _DecodeType effOpSz, - _DecodeType effAdrSz, int* lockableInstruction) -{ - int ret = 0; - unsigned int mod = 0, reg = 0, rm = 0, vexV = ps->vexV; - unsigned int vrex = ps->vrex, typeHandled = TRUE; - _Operand* op = &di->ops[opNum]; - - /* Used to indicate the size of the MEMORY INDIRECTION only. */ - _OperandSizeType opSize = OPERAND_SIZE_NONE; - - /* - * ModRM bits: - * |7-6-5--------3-2-0| - * |MOD|REG/OPCODE|RM | - * |------------------| - */ - mod = (modrm >> 6) & 3; /* Mode(register-indirection, disp8+reg+indirection, disp16+reg+indirection, general-purpose register) */ - reg = (modrm >> 3) & 7; /* Register(could be part of the opcode itself or general-purpose register) */ - rm = modrm & 7; /* Specifies which general-purpose register or disp+reg to use. */ - - /* -- Memory Indirection Operands (that cannot be a general purpose register) -- */ - switch (type) - { - case OT_MEM64_128: /* Used only by CMPXCHG8/16B. */ - /* Make a specific check when the type is OT_MEM64_128 since the lockable CMPXCHG8B uses this one... */ - if (lockableInstruction && (ps->decodedPrefixes & INST_PRE_LOCK)) *lockableInstruction = TRUE; - if (effOpSz == Decode64Bits) { - ps->usedPrefixes |= INST_PRE_REX; - opSize = OPERAND_SIZE128; - } else opSize = OPERAND_SIZE64; - break; - case OT_MEM32: opSize = OPERAND_SIZE32; break; - case OT_MEM32_64: - /* Used by MOVNTI. Default size is 32bits, 64bits with REX. */ - if (effOpSz == Decode64Bits) { - ps->usedPrefixes |= INST_PRE_REX; - opSize = OPERAND_SIZE64; - } else opSize = OPERAND_SIZE32; - break; - case OT_MEM64: opSize = OPERAND_SIZE64; break; - case OT_MEM128: opSize = OPERAND_SIZE128; break; - case OT_MEM16_FULL: /* The size indicates about the second item of the pair. */ - switch (effOpSz) - { - case Decode16Bits: - ps->usedPrefixes |= INST_PRE_OP_SIZE; - opSize = OPERAND_SIZE16; - break; - case Decode32Bits: - ps->usedPrefixes |= INST_PRE_OP_SIZE; - opSize = OPERAND_SIZE32; - break; - case Decode64Bits: - /* Mark usage of REX only if it was required. */ - if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) ps->usedPrefixes |= INST_PRE_REX; - opSize = OPERAND_SIZE64; break; - } - break; - case OT_MEM16_3264: /* The size indicates about the second item of the pair. */ - if (ci->dt == Decode64Bits) opSize = OPERAND_SIZE64; - else opSize = OPERAND_SIZE32; - break; - case OT_MEM_OPT: - /* Since the MEM is optional, only when mod != 3, then return true as if the operand was alright. */ - if (mod == 0x3) return TRUE; - break; - case OT_FPUM16: opSize = OPERAND_SIZE16; break; - case OT_FPUM32: opSize = OPERAND_SIZE32; break; - case OT_FPUM64: opSize = OPERAND_SIZE64; break; - case OT_FPUM80: opSize = OPERAND_SIZE80; break; - case OT_LMEM128_256: - if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; - else opSize = OPERAND_SIZE128; - break; - case OT_MEM: /* Size is unknown, but still handled. */ break; - default: typeHandled = FALSE; break; - } - if (typeHandled) { - /* All of the above types can't use a general-purpose register (a MOD of 3)!. */ - if (mod == 0x3) { - if (lockableInstruction) *lockableInstruction = FALSE; - return FALSE; - } - op->size = _OPSIZETOINT[opSize]; - ret = operands_extract_modrm(ci, di, type, opNum, ps, effOpSz, effAdrSz, lockableInstruction, mod, rm, instFlags); - if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { - di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; - } - return ret; - } - /* -- Memory Indirection Operands (that can be a register) -- */ - typeHandled = TRUE; - switch (type) - { - case OT_RM_FULL: - ps->usedPrefixes |= INST_PRE_OP_SIZE; - /* PUSH/JMP/CALL are automatically promoted to 64 bits! */ - if (effOpSz == Decode32Bits) { - opSize = OPERAND_SIZE32; - break; - } else if (effOpSz == Decode64Bits) { - /* Mark usage of REX only if it was required. */ - if ((instFlags & INST_64BITS) == 0) ps->usedPrefixes |= INST_PRE_REX; - opSize = OPERAND_SIZE64; - break; + default: return FALSE; } - /* FALL THROUGH BECAUSE dt==Decoded16Bits @-<----*/ - case OT_RM16: - /* If we got here not from OT_RM16, then the prefix was used. */ - if (type != OT_RM16) ps->usedPrefixes |= INST_PRE_OP_SIZE; - opSize = OPERAND_SIZE16; - break; - case OT_RM32_64: - /* The default size is 32, which can be 64 with a REX only. */ - if (effOpSz == Decode64Bits) { - opSize = OPERAND_SIZE64; - /* Mark REX prefix as used if non-promoted instruction. */ - if ((instFlags & (INST_64BITS | INST_PRE_REX)) == (INST_64BITS | INST_PRE_REX)) { - ps->usedPrefixes |= INST_PRE_REX; - } - } else opSize = OPERAND_SIZE32; - break; - case OT_RM16_32: - /* Ignore REX, it's either 32 or 16 bits RM. */ - if (ps->decodedPrefixes & INST_PRE_OP_SIZE) { - ps->usedPrefixes |= INST_PRE_OP_SIZE; - /* Assume: We are in 64bits when we have this operand used. */ - opSize = OPERAND_SIZE16; - } else opSize = OPERAND_SIZE32; - break; - case OT_WXMM32_64: - case OT_WRM32_64: - if (vrex & PREFIX_EX_W) opSize = OPERAND_SIZE64; - else opSize = OPERAND_SIZE32; - break; - case OT_YXMM64_256: - if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; - else opSize = OPERAND_SIZE64; - break; - case OT_YXMM128_256: - if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE256; - else opSize = OPERAND_SIZE128; - break; - case OT_LXMM64_128: - if (vrex & PREFIX_EX_L) opSize = OPERAND_SIZE128; - else opSize = OPERAND_SIZE64; - break; - case OT_RFULL_M16: - ps->usedPrefixes |= INST_PRE_OP_SIZE; - opSize = OPERAND_SIZE16; - break; - - case OT_RM8: - case OT_R32_M8: - case OT_R32_64_M8: - case OT_REG32_64_M8: - opSize = OPERAND_SIZE8; - break; - - case OT_XMM16: - case OT_R32_M16: - case OT_R32_64_M16: - case OT_REG32_64_M16: - opSize = OPERAND_SIZE16; - break; - - case OT_RM32: - case OT_MM32: - case OT_XMM32: - opSize = OPERAND_SIZE32; - break; - - case OT_MM64: - case OT_XMM64: - opSize = OPERAND_SIZE64; - break; - - case OT_XMM128: opSize = OPERAND_SIZE128; break; - case OT_YMM256: opSize = OPERAND_SIZE256; break; - default: typeHandled = FALSE; break; - } - if (typeHandled) { - /* Fill size of memory dereference for operand. */ - op->size = _OPSIZETOINT[opSize]; - ret = operands_extract_modrm(ci, di, type, opNum, ps, effOpSz, effAdrSz, lockableInstruction, mod, rm, instFlags); - if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { - di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; + op->size = (uint16_t)size; + op->index = (uint8_t)rm; + op->type = O_REG; + di->usedRegistersMask |= _REGISTERTORCLASS[rm]; + return TRUE; } - return ret; } - /* Simple operand type (no ModRM byte). */ + /* Simple operand type (ModRM reg). */ + reg = (modrm >> 3) & 7; switch (type) { case OT_IMM8: operands_set_ts(op, O_IMM, 8); - if (!read_stream_safe_uint(ci, &di->imm.byte, sizeof(int8_t))) return FALSE; + if (!read_stream_safe_uint8(ci, &di->imm.byte)) return FALSE; break; case OT_IMM_FULL: /* 16, 32 or 64, depends on prefixes. */ if (effOpSz == Decode16Bits) { @@ -697,7 +760,7 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, /* FALL THROUGH */ case OT_IMM16: /* Force 16 bits imm. */ operands_set_ts(op, O_IMM, 16); - if (!read_stream_safe_uint(ci, &di->imm.word, sizeof(int16_t))) return FALSE; + if (!read_stream_safe_uint16(ci, &di->imm.word)) return FALSE; break; /* * Extension: MOV imm64, requires REX. @@ -709,7 +772,7 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, ps->usedPrefixes |= INST_PRE_REX; operands_set_ts(op, O_IMM, 64); - if (!read_stream_safe_uint(ci, &di->imm.qword, sizeof(int64_t))) return FALSE; + if (!read_stream_safe_uint64(ci, &di->imm.qword)) return FALSE; break; } else ps->usedPrefixes |= INST_PRE_OP_SIZE; /* FALL THROUGH BECAUSE dt==Decoded32Bits @-<----*/ @@ -723,10 +786,10 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, op->size = 32; /* Use this as an indicator that it should be signed extended. */ di->flags |= FLAG_IMM_SIGNED; - if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int32_t))) return FALSE; + if (!read_stream_safe_sint32(ci, &di->imm.sqword)) return FALSE; } else { op->size = 32; - if (!read_stream_safe_uint(ci, &di->imm.dword, sizeof(int32_t))) return FALSE; + if (!read_stream_safe_uint32(ci, &di->imm.dword)) return FALSE; } break; case OT_SEIMM8: /* Sign extended immediate. */ @@ -752,19 +815,19 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, } } else op->size = 8; di->flags |= FLAG_IMM_SIGNED; - if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int8_t))) return FALSE; + if (!read_stream_safe_sint8(ci, &di->imm.sqword)) return FALSE; break; case OT_IMM16_1: operands_set_ts(op, O_IMM1, 16); - if (!read_stream_safe_uint(ci, &di->imm.ex.i1, sizeof(int16_t))) return FALSE; + if (!read_stream_safe_uint16(ci, &di->imm.ex.i1)) return FALSE; break; case OT_IMM8_1: operands_set_ts(op, O_IMM1, 8); - if (!read_stream_safe_uint(ci, &di->imm.ex.i1, sizeof(int8_t))) return FALSE; + if (!read_stream_safe_uint8(ci, &di->imm.ex.i1)) return FALSE; break; case OT_IMM8_2: operands_set_ts(op, O_IMM2, 8); - if (!read_stream_safe_uint(ci, &di->imm.ex.i2, sizeof(int8_t))) return FALSE; + if (!read_stream_safe_uint8(ci, &di->imm.ex.i2)) return FALSE; break; case OT_REG8: operands_set_ts(op, O_REG, 8); @@ -774,99 +837,102 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, * This is a PASSIVE behavior changer of REX prefix, it affects operands even if its value is 0x40 ! */ ps->usedPrefixes |= INST_PRE_REX; - op->index = (uint8_t)operands_fix_8bit_rex_base(reg + ((vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); + op->index = (uint8_t)operands_fix_8bit_rex_base(reg + ((ps->vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); } else op->index = (uint8_t)(REGS8_BASE + reg); + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; break; case OT_REG16: - operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + operands_set_tsi(di, op, O_REG, 16, REGS16_BASE + reg); break; case OT_REG_FULL: switch (effOpSz) { case Decode16Bits: ps->usedPrefixes |= INST_PRE_OP_SIZE; - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } - operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + operands_set_tsi(di, op, O_REG, 16, REGS16_BASE + reg); break; case Decode32Bits: - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } else ps->usedPrefixes |= INST_PRE_OP_SIZE; - operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + reg); break; case Decode64Bits: /* rex must be presented. */ ps->usedPrefixes |= INST_PRE_REX; - operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg + ((vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); + operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + reg + ((ps->vrex & PREFIX_EX_R) ? EX_GPR_BASE : 0)); break; } break; case OT_REG32: - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } - operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + reg); break; case OT_REG32_64: /* Handle CVT's, MOVxX and MOVNTI instructions which could be extended to 64 bits registers with REX. */ - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } /* Is it a promoted instruction? (only INST_64BITS is set and REX isn't required.) */ if ((ci->dt == Decode64Bits) && ((instFlags & (INST_64BITS | INST_PRE_REX)) == INST_64BITS)) { - operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + reg); break; } /* Give a chance to REX.W. Because if it was a promoted instruction we don't care about REX.W anyways. */ - if (vrex & PREFIX_EX_W) { + if (ps->vrex & PREFIX_EX_W) { ps->usedPrefixes |= INST_PRE_REX; - operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); - } else operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + reg); + } else operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + reg); break; case OT_FREG32_64_RM: /* Force decoding mode. Used for MOV CR(n)/DR(n) which defaults to 64 bits operand size in 64 bits. */ - if (vrex & PREFIX_EX_B) { + rm = modrm & 7; + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } - if (ci->dt == Decode64Bits) operands_set_tsi(op, O_REG, 64, REGS64_BASE + rm); - else operands_set_tsi(op, O_REG, 32, REGS32_BASE + rm); + if (ci->dt == Decode64Bits) operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + rm); + else operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + rm); break; case OT_MM: /* MMX register */ - operands_set_tsi(op, O_REG, 64, MMXREGS_BASE + reg); + operands_set_tsi(di, op, O_REG, 64, MMXREGS_BASE + reg); break; case OT_MM_RM: /* MMX register, this time from the RM field */ - operands_set_tsi(op, O_REG, 64, MMXREGS_BASE + rm); + rm = modrm & 7; + operands_set_tsi(di, op, O_REG, 64, MMXREGS_BASE + rm); break; case OT_REGXMM0: /* Implicit XMM0 operand. */ - reg = 0; - vrex = 0; - /* FALL THROUGH */ + operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + 0); + break; case OT_XMM: /* SSE register */ - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } - operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + reg); break; case OT_XMM_RM: /* SSE register, this time from the RM field */ - if (vrex & PREFIX_EX_B) { + rm = modrm & 7; + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; rm += EX_GPR_BASE; } - operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + rm); + operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + rm); break; case OT_CREG: /* * Don't parse if the reg exceeds the bounds of the array. * Most of the CR's are not implemented, so if there's no matching string, the operand is invalid. */ - if (vrex & PREFIX_EX_R) { + if (ps->vrex & PREFIX_EX_R) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } else if ((ci->dt == Decode32Bits) && (ps->decodedPrefixes & INST_PRE_LOCK)) { @@ -884,24 +950,25 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, if (ci->dt == Decode64Bits) op->size = 64; else op->size = 32; op->index = (uint8_t)(CREGS_BASE + reg); + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; break; case OT_DREG: /* * In 64 bits there are 16 debug registers. * but accessing any of dr8-15 which aren't implemented will cause an #ud. */ - if ((reg == 4) || (reg == 5) || (vrex & PREFIX_EX_R)) return FALSE; + if ((reg == 4) || (reg == 5) || (ps->vrex & PREFIX_EX_R)) return FALSE; op->type = O_REG; if (ci->dt == Decode64Bits) op->size = 64; else op->size = 32; op->index = (uint8_t)(DREGS_BASE + reg); + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; break; case OT_SREG: /* Works with REG16 only! */ - /* If lockableInstruction pointer is non-null we know it's the first operand. */ - if (lockableInstruction && (reg == 1)) return FALSE; /* Can't MOV CS, . */ + if ((&di->ops[0] == op) && (reg == 1)) return FALSE; /* Can't MOV CS, . */ /*Don't parse if the reg exceeds the bounds of the array. */ - if (reg <= SEG_REGS_MAX - 1) operands_set_tsi(op, O_REG, 16, SREGS_BASE + reg); + if (reg <= SEG_REGS_MAX - 1) operands_set_tsi(di, op, O_REG, 16, SREGS_BASE + reg); else return FALSE; break; case OT_SEG: @@ -922,29 +989,31 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, case INST_PRE_FS: op->index = R_FS; break; case INST_PRE_GS: op->index = R_GS; break; } + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; break; case OT_ACC8: - operands_set_tsi(op, O_REG, 8, R_AL); + operands_set_tsi(di, op, O_REG, 8, R_AL); break; case OT_ACC16: - operands_set_tsi(op, O_REG, 16, R_AX); + operands_set_tsi(di, op, O_REG, 16, R_AX); break; - case OT_ACC_FULL_NOT64: /* No REX.W support for IN/OUT. */ - vrex &= ~PREFIX_EX_W; + case OT_ACC_FULL_NOT64: + /* No REX.W support for IN/OUT. */ + /* FALL THROUGH */ case OT_ACC_FULL: if (effOpSz == Decode16Bits) { ps->usedPrefixes |= INST_PRE_OP_SIZE; - operands_set_tsi(op, O_REG, 16, R_AX); - } else if (effOpSz == Decode32Bits) { + operands_set_tsi(di, op, O_REG, 16, R_AX); + } else if ((effOpSz == Decode32Bits) || (type == OT_ACC_FULL_NOT64)) { ps->usedPrefixes |= INST_PRE_OP_SIZE; - operands_set_tsi(op, O_REG, 32, R_EAX); + operands_set_tsi(di, op, O_REG, 32, R_EAX); } else { /* Decode64Bits */ /* Only non-promoted instructions need REX in order to decode in 64 bits. */ /* MEM-OFFSET MOV's are NOT automatically promoted to 64 bits. */ - if (~instFlags & INST_64BITS) { + if (!(instFlags & INST_64BITS)) { ps->usedPrefixes |= INST_PRE_REX; } - operands_set_tsi(op, O_REG, 64, R_RAX); + operands_set_tsi(di, op, O_REG, 64, R_RAX); } break; case OT_PTR16_FULL: @@ -976,17 +1045,17 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, if (type == OT_RELCB) { operands_set_ts(op, O_PC, 8); - if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int8_t))) return FALSE; + if (!read_stream_safe_sint8(ci, &di->imm.sqword)) return FALSE; } else { /* OT_RELC_FULL */ /* Yep, operand size prefix affects relc also. */ ps->usedPrefixes |= INST_PRE_OP_SIZE; if (effOpSz == Decode16Bits) { operands_set_ts(op, O_PC, 16); - if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int16_t))) return FALSE; + if (!read_stream_safe_sint16(ci, &di->imm.sqword)) return FALSE; } else { /* Decode32Bits or Decode64Bits = for now they are the same */ operands_set_ts(op, O_PC, 32); - if (!read_stream_safe_sint(ci, &di->imm.sqword, sizeof(int32_t))) return FALSE; + if (!read_stream_safe_sint32(ci, &di->imm.sqword)) return FALSE; } } @@ -1026,15 +1095,15 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, ps->usedPrefixes |= INST_PRE_ADDR_SIZE; di->dispSize = 16; - if (!read_stream_safe_uint(ci, &di->disp, sizeof(int16_t))) return FALSE; + if (!read_stream_safe_uint16(ci, &di->disp)) return FALSE; } else if (effAdrSz == Decode32Bits) { ps->usedPrefixes |= INST_PRE_ADDR_SIZE; di->dispSize = 32; - if (!read_stream_safe_uint(ci, &di->disp, sizeof(int32_t))) return FALSE; + if (!read_stream_safe_uint32(ci, &di->disp)) return FALSE; } else { /* Decode64Bits */ di->dispSize = 64; - if (!read_stream_safe_uint(ci, &di->disp, sizeof(int64_t))) return FALSE; + if (!read_stream_safe_uint64(ci, &di->disp)) return FALSE; } break; case OT_CONST1: @@ -1042,20 +1111,22 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, di->imm.byte = 1; break; case OT_REGCL: - operands_set_tsi(op, O_REG, 8, R_CL); + operands_set_tsi(di, op, O_REG, 8, R_CL); break; case OT_FPU_SI: /* Low 3 bits specify the REG, similar to the MODR/M byte reg. */ - operands_set_tsi(op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + operands_set_tsi(di, op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); break; case OT_FPU_SSI: - operands_set_tsi(op, O_REG, 32, R_ST0); - operands_set_tsi(op + 1, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + operands_set_tsi(di, op, O_REG, 32, R_ST0); + operands_set_tsi(di, op + 1, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + di->opsNo++; break; case OT_FPU_SIS: - operands_set_tsi(op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); - operands_set_tsi(op + 1, O_REG, 32, R_ST0); + operands_set_tsi(di, op, O_REG, 32, FPUREGS_BASE + (*(ci->code-1) & 7)); + operands_set_tsi(di, op + 1, O_REG, 32, R_ST0); + di->opsNo++; break; /* @@ -1070,13 +1141,15 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, /* Low 3 bits specify the REG, similar to the MODR/M byte reg. */ operands_set_ts(op, O_REG, 8); reg = *(ci->code-1) & 7; - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; op->index = (uint8_t)operands_fix_8bit_rex_base(reg + EX_GPR_BASE); } else if (ps->prefixExtType == PET_REX) { ps->usedPrefixes |= INST_PRE_REX; op->index = (uint8_t)operands_fix_8bit_rex_base(reg); } else op->index = (uint8_t)(REGS8_BASE + reg); + + di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; break; case OT_IB_R_FULL: reg = *(ci->code-1) & 7; @@ -1084,18 +1157,18 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, { case Decode16Bits: ps->usedPrefixes |= INST_PRE_OP_SIZE; - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } - operands_set_tsi(op, O_REG, 16, REGS16_BASE + reg); + operands_set_tsi(di, op, O_REG, 16, REGS16_BASE + reg); break; case Decode32Bits: - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } else ps->usedPrefixes |= INST_PRE_OP_SIZE; - operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + reg); break; case Decode64Bits: /* @@ -1104,15 +1177,15 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, * MOV imm64 / BSWAP requires REX.W to be 64 bits --> INST_64BITS | INST_PRE_REX */ if ((instFlags & INST_64BITS) && ((instFlags & INST_PRE_REX) == 0)) { - if (vrex & PREFIX_EX_B) { + if (ps->vrex & PREFIX_EX_B) { ps->usedPrefixes |= INST_PRE_REX; reg += EX_GPR_BASE; } } else { ps->usedPrefixes |= INST_PRE_REX; - reg += (vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0; + reg += (ps->vrex & PREFIX_EX_B) ? EX_GPR_BASE : 0; } - operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); + operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + reg); break; } break; @@ -1161,12 +1234,14 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, * Clear segment in case OT_REGI_EDI was parsed earlier, * DS can be overridden and therefore has precedence. */ - di->segment = 0; + di->segment = R_NONE; prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); if (effAdrSz == Decode16Bits) op->index = R_SI; else if (effAdrSz == Decode32Bits) op->index = R_ESI; else op->index = R_RSI; + + di->usedRegistersMask |= _REGISTERTORCLASS[R_RSI]; /* Maps to RM_SI. */ break; case OT_REGI_EDI: ps->usedPrefixes |= INST_PRE_ADDR_SIZE; @@ -1185,22 +1260,24 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, } else op->size = 8; /* Note: The [rDI] operand can't be prefixed by a segment override, therefore we don't set usedPrefixes. */ - if ((opNum == ONT_1) && (ci->dt != Decode64Bits)) di->segment = R_ES | SEGMENT_DEFAULT; /* No ES in 64 bits mode. */ + if ((di->segment == R_NONE) && (ci->dt != Decode64Bits)) di->segment = R_ES | SEGMENT_DEFAULT; /* No ES in 64 bits mode. */ if (effAdrSz == Decode16Bits) op->index = R_DI; else if (effAdrSz == Decode32Bits) op->index = R_EDI; else op->index = R_RDI; + + di->usedRegistersMask |= _REGISTERTORCLASS[R_RDI]; /* Maps to RM_DI. */ break; /* Used for In/Out instructions varying forms. */ case OT_REGDX: /* Simple single IN/OUT instruction. */ - operands_set_tsi(op, O_REG, 16, R_DX); + operands_set_tsi(di, op, O_REG, 16, R_DX); break; - /* Used for INVLPGA instruction. */ + /* Used for INVLPGA instruction. */ case OT_REGECX: - operands_set_tsi(op, O_REG, 32, R_ECX); + operands_set_tsi(di, op, O_REG, 32, R_ECX); break; case OT_REGI_EBXAL: /* XLAT BYTE [rBX + AL] */ @@ -1209,7 +1286,7 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, prefixes_use_segment(INST_PRE_DS, ps, ci->dt, di); /* Size of deref is always 8 for xlat. */ - operands_set_tsi(op, O_MEM, 8, R_AL); + operands_set_tsi(di, op, O_MEM, 8, R_AL); if (effAdrSz == Decode16Bits) di->base = R_BX; else if (effAdrSz == Decode32Bits) di->base = R_EBX; @@ -1217,6 +1294,8 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, ps->usedPrefixes |= INST_PRE_REX; di->base = R_RBX; } + + di->usedRegistersMask |= _REGISTERTORCLASS[di->base]; break; case OT_REGI_EAX: /* @@ -1224,17 +1303,18 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, * Since this is a memory indirection, the default address size in 64bits decoding mode is 64. */ - if (effAdrSz == Decode64Bits) operands_set_tsi(op, O_SMEM, 64, R_RAX); + if (effAdrSz == Decode64Bits) operands_set_tsi(di, op, O_SMEM, 64, R_RAX); else if (effAdrSz == Decode32Bits) { ps->usedPrefixes |= INST_PRE_ADDR_SIZE; - operands_set_tsi(op, O_SMEM, 32, R_EAX); - } else { + operands_set_tsi(di, op, O_SMEM, 32, R_EAX); + } + else { ps->usedPrefixes |= INST_PRE_ADDR_SIZE; - operands_set_tsi(op, O_SMEM, 16, R_AX); + operands_set_tsi(di, op, O_SMEM, 16, R_AX); } break; case OT_VXMM: - operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + vexV); + operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + ps->vexV); break; case OT_XMM_IMM: ci->codeLen -= sizeof(int8_t); @@ -1242,14 +1322,14 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, if (ci->dt == Decode32Bits) reg = (*ci->code >> 4) & 0x7; else reg = (*ci->code >> 4) & 0xf; - operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + reg); ci->code += sizeof(int8_t); break; case OT_YXMM: - if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; - if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); - else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + if (ps->vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(di, op, O_REG, 256, AVXREGS_BASE + reg); + else operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + reg); break; case OT_YXMM_IMM: ci->codeLen -= sizeof(int8_t); @@ -1258,33 +1338,28 @@ int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, if (ci->dt == Decode32Bits) reg = (*ci->code >> 4) & 0x7; else reg = (*ci->code >> 4) & 0xf; - if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); - else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + reg); + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(di, op, O_REG, 256, AVXREGS_BASE + reg); + else operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + reg); ci->code += sizeof(int8_t); break; case OT_YMM: - if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; - operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + reg); + if (ps->vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + operands_set_tsi(di, op, O_REG, 256, AVXREGS_BASE + reg); break; case OT_VYMM: - operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + vexV); + operands_set_tsi(di, op, O_REG, 256, AVXREGS_BASE + ps->vexV); break; case OT_VYXMM: - if (ps->vrex & PREFIX_EX_L) operands_set_tsi(op, O_REG, 256, AVXREGS_BASE + vexV); - else operands_set_tsi(op, O_REG, 128, SSEREGS_BASE + vexV); + if (ps->vrex & PREFIX_EX_L) operands_set_tsi(di, op, O_REG, 256, AVXREGS_BASE + ps->vexV); + else operands_set_tsi(di, op, O_REG, 128, SSEREGS_BASE + ps->vexV); break; case OT_WREG32_64: - if (vrex & PREFIX_EX_R) reg += EX_GPR_BASE; - if (ps->vrex & PREFIX_EX_W) operands_set_tsi(op, O_REG, 64, REGS64_BASE + reg); - else operands_set_tsi(op, O_REG, 32, REGS32_BASE + reg); + if (ps->vrex & PREFIX_EX_R) reg += EX_GPR_BASE; + if (ps->vrex & PREFIX_EX_W) operands_set_tsi(di, op, O_REG, 64, REGS64_BASE + reg); + else operands_set_tsi(di, op, O_REG, 32, REGS32_BASE + reg); break; default: return FALSE; } - - if ((op->type == O_REG) || (op->type == O_SMEM) || (op->type == O_MEM)) { - di->usedRegistersMask |= _REGISTERTORCLASS[op->index]; - } - return TRUE; } diff --git a/NativeCore/Dependencies/distorm/src/operands.h b/NativeCore/Dependencies/distorm/src/operands.h index 2d916474..c4e48224 100644 --- a/NativeCore/Dependencies/distorm/src/operands.h +++ b/NativeCore/Dependencies/distorm/src/operands.h @@ -4,7 +4,7 @@ operands.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -17,12 +17,9 @@ This library is licensed under the BSD license. See the file COPYING. #include "prefix.h" #include "instructions.h" - -extern uint32_t _REGISTERTORCLASS[]; - int operands_extract(_CodeInfo* ci, _DInst* di, _InstInfo* ii, - _iflags instFlags, _OpType type, _OperandNumberType opNum, + _iflags instFlags, _OpType type, unsigned int modrm, _PrefixState* ps, _DecodeType effOpSz, - _DecodeType effAdrSz, int* lockableInstruction); + _DecodeType effAdrSz, _Operand* op); #endif /* OPERANDS_H */ diff --git a/NativeCore/Dependencies/distorm/src/prefix.c b/NativeCore/Dependencies/distorm/src/prefix.c index b1c26954..40b0ac2b 100644 --- a/NativeCore/Dependencies/distorm/src/prefix.c +++ b/NativeCore/Dependencies/distorm/src/prefix.c @@ -4,7 +4,7 @@ prefix.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -22,53 +22,43 @@ This library is licensed under the BSD license. See the file COPYING. * That's why I have to detect such cases and drop those excess prefixes. */ -int prefixes_is_valid(unsigned int ch, _DecodeType dt) -{ - switch (ch) { - /* for i in xrange(0x40, 0x50): print "case 0x%2x:" % i */ - case 0x40: /* REX: */ - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4a: - case 0x4b: - case 0x4c: - case 0x4d: - case 0x4e: - case 0x4f: return (dt == Decode64Bits); - case PREFIX_LOCK: return TRUE; - case PREFIX_REPNZ: return TRUE; - case PREFIX_REP: return TRUE; - case PREFIX_CS: return TRUE; - case PREFIX_SS: return TRUE; - case PREFIX_DS: return TRUE; - case PREFIX_ES: return TRUE; - case PREFIX_FS: return TRUE; - case PREFIX_GS: return TRUE; - case PREFIX_OP_SIZE: return TRUE; - case PREFIX_ADDR_SIZE: return TRUE; - /* The VEXs might be false positives, the decode_perfixes will determine for sure. */ - case PREFIX_VEX2b: /* VEX is supported for all modes, because 16 bits Pmode is included. */ - case PREFIX_VEX3b: return TRUE; - } - return FALSE; -} -/* Ignore a specific prefix type. */ -void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi) -{ - /* - * If that type of prefix appeared already, set the bit of that *former* prefix. - * Anyway, set the new index of that prefix type to the current index, so next time we know its position. - */ - if (ps->pfxIndexer[pi] != PFXIDX_NONE) ps->unusedPrefixesMask |= (1 << ps->pfxIndexer[pi]); -} +int PrefixTables[256 * 2] = { + /* Decode 16/32 Bits */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* ES (0x26) CS (0x2e) */ + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* DS (0x3e) SS (0x36) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* FS(0x64) GS(0x65) OP_SIZE(0x66) ADDR_SIZE(0x67) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* VEX2b (0xc5) VEX3b (0xc4) */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* LOCK (0xf0) REPNZ (0xf2) REP (0xf3) */ + /* Decode64Bits */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* REX: 0x40 - 0x4f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; /* Ignore all prefix. */ void prefixes_ignore_all(_PrefixState* ps) @@ -93,6 +83,7 @@ uint16_t prefixes_set_unused_mask(_PrefixState* ps) * So now we know which bits we need to set exactly in the mask. */ _iflags unusedPrefixesDiff = ps->decodedPrefixes ^ ps->usedPrefixes; + uint16_t unusedPrefixesMask = ps->unusedPrefixesMask; /* Examine unused prefixes by type: */ /* @@ -102,14 +93,16 @@ uint16_t prefixes_set_unused_mask(_PrefixState* ps) * It's not a big problem, because the prefixes_ignore func will ignore it anyway, * since it wasn't seen earlier. But it's important to know this. */ - if (unusedPrefixesDiff & INST_PRE_REX) prefixes_ignore(ps, PFXIDX_REX); - if (unusedPrefixesDiff & INST_PRE_SEGOVRD_MASK) prefixes_ignore(ps, PFXIDX_SEG); - if (unusedPrefixesDiff & INST_PRE_LOKREP_MASK) prefixes_ignore(ps, PFXIDX_LOREP); - if (unusedPrefixesDiff & INST_PRE_OP_SIZE) prefixes_ignore(ps, PFXIDX_OP_SIZE); - if (unusedPrefixesDiff & INST_PRE_ADDR_SIZE) prefixes_ignore(ps, PFXIDX_ADRS); - /* If a VEX instruction was found, its prefix is considered as used, therefore no point for checking for it. */ - - return ps->unusedPrefixesMask; + if (unusedPrefixesDiff) { + if (unusedPrefixesDiff & INST_PRE_REX) unusedPrefixesMask |= ps->pfxIndexer[PFXIDX_REX]; + if (unusedPrefixesDiff & INST_PRE_SEGOVRD_MASK) unusedPrefixesMask |= ps->pfxIndexer[PFXIDX_SEG]; + if (unusedPrefixesDiff & INST_PRE_LOKREP_MASK) unusedPrefixesMask |= ps->pfxIndexer[PFXIDX_LOREP]; + if (unusedPrefixesDiff & INST_PRE_OP_SIZE) unusedPrefixesMask |= ps->pfxIndexer[PFXIDX_OP_SIZE]; + if (unusedPrefixesDiff & INST_PRE_ADDR_SIZE) unusedPrefixesMask |= ps->pfxIndexer[PFXIDX_ADRS]; + /* If a VEX instruction was found, its prefix is considered as used, therefore no point for checking for it. */ + } + + return unusedPrefixesMask; } /* @@ -118,9 +111,10 @@ uint16_t prefixes_set_unused_mask(_PrefixState* ps) */ _INLINE_ void prefixes_track_unused(_PrefixState* ps, int index, _PrefixIndexer pi) { + /* Mark the previously used prefix (if exists) in the unused mask. */ prefixes_ignore(ps, pi); /* Book-keep the current index for this type. */ - ps->pfxIndexer[pi] = index; + ps->pfxIndexer[pi] = 1 << index; } /* @@ -129,11 +123,12 @@ _INLINE_ void prefixes_track_unused(_PrefixState* ps, int index, _PrefixIndexer * The tiny complexity is that we want to know when a prefix was superfluous and mark any copy of it as unused. * Note that the last prefix of its type will be considered as used, and all the others (of same type) before it as unused. */ -void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _DecodeType dt) +void prefixes_decode(_CodeInfo* ci, _PrefixState* ps) { - int index, done; - uint8_t vex; - + const uint8_t* rexPos = NULL; + const uint8_t* start = ci->code; + uint8_t byte, vex; + unsigned int index; /* * First thing to do, scan for prefixes, there are six types of prefixes. * There may be up to six prefixes before a single instruction, not the same type, no special order, @@ -145,9 +140,9 @@ void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _Decode * We attach all prefixes to the next instruction, there might be two or more occurrences from the same prefix. * Also, since VEX can be allowed only once we will test it separately. */ - for (index = 0, done = FALSE; - (codeLen > 0) && (code - ps->start < INST_MAXIMUM_SIZE); - code++, codeLen--, index++) { + for (index = 0; + (ci->codeLen > 0) && (index < INST_MAXIMUM_SIZE); + ci->code++, ci->codeLen--, index++) { /* NOTE: AMD treat lock/rep as two different groups... But I am based on Intel. @@ -175,102 +170,90 @@ void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _Decode */ /* Examine what type of prefix we got. */ - switch (*code) + byte = *ci->code; + switch (byte) { - /* REX type, 64 bits decoding mode only: */ - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4a: - case 0x4b: - case 0x4c: - case 0x4d: - case 0x4e: - case 0x4f: - if (dt == Decode64Bits) { - ps->decodedPrefixes |= INST_PRE_REX; - ps->vrex = *code & 0xf; /* Keep only BXRW. */ - ps->rexPos = code; - ps->prefixExtType = PET_REX; - prefixes_track_unused(ps, index, PFXIDX_REX); - } else done = TRUE; /* If we are not in 64 bits mode, it's an instruction, then halt. */ - break; - + case PREFIX_OP_SIZE: {/* Op Size type: */ + ps->decodedPrefixes |= INST_PRE_OP_SIZE; + prefixes_track_unused(ps, index, PFXIDX_OP_SIZE); + } break; + /* Look for both common arch prefixes. */ + case PREFIX_LOCK: { /* LOCK and REPx type: */ - case PREFIX_LOCK: - ps->decodedPrefixes |= INST_PRE_LOCK; - prefixes_track_unused(ps, index, PFXIDX_LOREP); - break; - case PREFIX_REPNZ: - ps->decodedPrefixes |= INST_PRE_REPNZ; - prefixes_track_unused(ps, index, PFXIDX_LOREP); - break; - case PREFIX_REP: - ps->decodedPrefixes |= INST_PRE_REP; - prefixes_track_unused(ps, index, PFXIDX_LOREP); - break; - + ps->decodedPrefixes |= INST_PRE_LOCK; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + } break; + case PREFIX_REPNZ: { + ps->decodedPrefixes |= INST_PRE_REPNZ; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + } break; + case PREFIX_REP: { + ps->decodedPrefixes |= INST_PRE_REP; + prefixes_track_unused(ps, index, PFXIDX_LOREP); + } break; + case PREFIX_CS: { /* Seg Overide type: */ - case PREFIX_CS: - ps->decodedPrefixes |= INST_PRE_CS; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - case PREFIX_SS: - ps->decodedPrefixes |= INST_PRE_SS; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - case PREFIX_DS: - ps->decodedPrefixes |= INST_PRE_DS; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - case PREFIX_ES: - ps->decodedPrefixes |= INST_PRE_ES; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - case PREFIX_FS: - ps->decodedPrefixes |= INST_PRE_FS; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - case PREFIX_GS: - ps->decodedPrefixes |= INST_PRE_GS; - prefixes_track_unused(ps, index, PFXIDX_SEG); - break; - - /* Op Size type: */ - case PREFIX_OP_SIZE: - ps->decodedPrefixes |= INST_PRE_OP_SIZE; - prefixes_track_unused(ps, index, PFXIDX_OP_SIZE); - break; - + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_CS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_SS: { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_SS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_DS: { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_DS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_ES: { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_ES; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_FS: { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_FS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_GS: { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK; + ps->decodedPrefixes |= INST_PRE_GS; + prefixes_track_unused(ps, index, PFXIDX_SEG); + } break; + case PREFIX_ADDR_SIZE: { /* Addr Size type: */ - case PREFIX_ADDR_SIZE: - ps->decodedPrefixes |= INST_PRE_ADDR_SIZE; - prefixes_track_unused(ps, index, PFXIDX_ADRS); - break; - - /* Non-prefix byte now, so break 2. */ - default: done = TRUE; break; + ps->decodedPrefixes |= INST_PRE_ADDR_SIZE; + prefixes_track_unused(ps, index, PFXIDX_ADRS); + } break; + default: + if (ci->dt == Decode64Bits) { + /* REX type, 64 bits decoding mode only: */ + if ((byte & 0xf0) == 0x40) { + ps->decodedPrefixes |= INST_PRE_REX; + rexPos = ci->code; + ps->vrex = byte & 0xf; /* Keep only BXRW. */ + ps->prefixExtType = PET_REX; + prefixes_track_unused(ps, index, PFXIDX_REX); + continue; + } + } + goto _Break2; } - if (done) break; } +_Break2: /* 2 Bytes VEX: */ - if ((codeLen >= 2) && - (*code == PREFIX_VEX2b) && - ((code - ps->start) <= INST_MAXIMUM_SIZE - 2)) { + if ((ci->codeLen >= 2) && + (*ci->code == PREFIX_VEX2b) && + ((ci->code - start) <= INST_MAXIMUM_SIZE - 2)) { /* * In 32 bits the second byte has to be in the special range of Mod=11. * Otherwise it might be a normal LDS instruction. */ - if ((dt == Decode64Bits) || (*(code + 1) >= INST_DIVIDED_MODRM)) { - ps->vexPos = code + 1; + if ((ci->dt == Decode64Bits) || (*(ci->code + 1) >= INST_DIVIDED_MODRM)) { + ps->vexPos = ci->code + 1; ps->decodedPrefixes |= INST_PRE_VEX; ps->prefixExtType = PET_VEX2BYTES; @@ -283,25 +266,26 @@ void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _Decode /* -- Convert from VEX prefix to VREX flags -- */ vex = *ps->vexPos; - if (~vex & 0x80 && dt == Decode64Bits) ps->vrex |= PREFIX_EX_R; /* Convert VEX.R. */ + if (!(vex & 0x80) && (ci->dt == Decode64Bits)) ps->vrex |= PREFIX_EX_R; /* Convert VEX.R. */ if (vex & 4) ps->vrex |= PREFIX_EX_L; /* Convert VEX.L. */ - code += 2; + ci->code += 2; + ci->codeLen -= 2; } } /* 3 Bytes VEX: */ - if ((codeLen >= 3) && - (*code == PREFIX_VEX3b) && - ((code - ps->start) <= INST_MAXIMUM_SIZE - 3) && - (~ps->decodedPrefixes & INST_PRE_VEX)) { + if ((ci->codeLen >= 3) && + (*ci->code == PREFIX_VEX3b) && + ((ci->code - start) <= INST_MAXIMUM_SIZE - 3) && + (!(ps->decodedPrefixes & INST_PRE_VEX))) { /* * In 32 bits the second byte has to be in the special range of Mod=11. * Otherwise it might be a normal LES instruction. * And we don't care now about the 3rd byte. */ - if ((dt == Decode64Bits) || (*(code + 1) >= INST_DIVIDED_MODRM)) { - ps->vexPos = code + 1; + if ((ci->dt == Decode64Bits) || (*(ci->code + 1) >= INST_DIVIDED_MODRM)) { + ps->vexPos = ci->code + 1; ps->decodedPrefixes |= INST_PRE_VEX; ps->prefixExtType = PET_VEX3BYTES; @@ -320,49 +304,78 @@ void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _Decode if (vex & 0x80) ps->vrex |= PREFIX_EX_W; /* Convert VEX.W. */ /* Clear some flags if the mode isn't 64 bits. */ - if (dt != Decode64Bits) ps->vrex &= ~(PREFIX_EX_B | PREFIX_EX_X | PREFIX_EX_R | PREFIX_EX_W); + if (ci->dt != Decode64Bits) ps->vrex &= ~(PREFIX_EX_B | PREFIX_EX_X | PREFIX_EX_R | PREFIX_EX_W); - code += 3; + ci->code += 3; + ci->codeLen -= 3; } } - /* - * Save last byte scanned address, so the decoder could keep on scanning from this point and on and on and on. - * In addition the decoder is able to know that the last byte could lead to MMX/SSE instructions (preceding REX if exists). - */ - ps->last = code; /* ps->last points to an opcode byte. */ + if (ci->dt == Decode64Bits) { + if (ps->decodedPrefixes & INST_PRE_REX) { + /* REX prefix must precede first byte of instruction. */ + if (rexPos != (ci->code - 1)) { + ps->decodedPrefixes &= ~INST_PRE_REX; + if (ps->prefixExtType == PET_REX) ps->prefixExtType = PET_NONE; /* It might be a VEX by now, keep it that way. */ + prefixes_ignore(ps, PFXIDX_REX); + } + /* + * We will disable operand size prefix, + * if it exists only after decoding the instruction, since it might be a mandatory prefix. + * This will be done after calling inst_lookup in decode_inst. + */ + } + /* In 64 bits, segment overrides of CS, DS, ES and SS are ignored. So don't take'em into account. */ + if (ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK32) { + ps->decodedPrefixes &= ~INST_PRE_SEGOVRD_MASK32; + prefixes_ignore(ps, PFXIDX_SEG); + } + } + + /* Store number of prefixes scanned. */ + ps->count = (uint8_t)(ci->code - start); } /* - * For every memory-indirection operand we want to set its corresponding default segment. - * If the segment is being overrided, we need to see whether we use it or not. - * We will use it only if it's not the default one already. + * For every memory-indirection operand we want to set a used segment. + * If the segment is being overrided with a prefix, we will need to check if it's a default. + * Defaults don't use their prefix, e.g "mov [rsp]" can ignore a given SS: prefix, + * but still set the used segment as SS. + * This function is called only with SS and DS as defaults. + * If there's a segment prefix used, it will override the default one. + * And If the prefix is a default seg in 64 bits, it will be ignored. */ void prefixes_use_segment(_iflags defaultSeg, _PrefixState* ps, _DecodeType dt, _DInst* di) { - _iflags flags = 0; - if (dt == Decode64Bits) flags = ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK64; - else flags = ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK; - - if ((flags == 0) || (flags == defaultSeg)) { - flags = defaultSeg; - di->segment |= SEGMENT_DEFAULT; - } else if (flags != defaultSeg) { - /* Use it only if it's non-default segment. */ - ps->usedPrefixes |= flags; - } + /* Extract given segment prefix from the decoded prefixes. */ + _iflags flags; - /* ASSERT: R_XX must be below 128. */ - switch (flags) - { - case INST_PRE_ES: di->segment |= R_ES; break; - case INST_PRE_CS: di->segment |= R_CS; break; - case INST_PRE_SS: di->segment |= R_SS; break; - case INST_PRE_DS: di->segment |= R_DS; break; - case INST_PRE_FS: di->segment |= R_FS; break; - case INST_PRE_GS: di->segment |= R_GS; break; + if (dt == Decode64Bits) { + if (ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK64) { /* Either GS or FS. */ + di->segment = ps->decodedPrefixes & INST_PRE_GS ? R_GS : R_FS; + } + + return; } - /* If it's one of the CS,SS,DS,ES and the mode is 64 bits, set segment it to none, since it's ignored. */ - if ((dt == Decode64Bits) && (flags & INST_PRE_SEGOVRD_MASK32)) di->segment = R_NONE; + flags = ps->decodedPrefixes & INST_PRE_SEGOVRD_MASK; + + /* Use the given prefix only if it's not the default. */ + if (flags && (flags != defaultSeg)) { + ps->usedPrefixes |= flags; + + switch (flags >> 7) /* INST_PRE_CS is 1 << 7. And the rest of the prefixes follow as bit fields. */ + { + case 1: di->segment = R_CS; break; + case 2: di->segment = R_SS; break; + case 4: di->segment = R_DS; break; + case 8: di->segment = R_ES; break; + case 0x10: di->segment = R_FS; break; + case 0x20: di->segment = R_GS; break; + } + } + else { + if (defaultSeg == INST_PRE_SS) di->segment = SEGMENT_DEFAULT | R_SS; + else di->segment = SEGMENT_DEFAULT | R_DS; + } } diff --git a/NativeCore/Dependencies/distorm/src/prefix.h b/NativeCore/Dependencies/distorm/src/prefix.h index f205e697..bc9b6e7d 100644 --- a/NativeCore/Dependencies/distorm/src/prefix.h +++ b/NativeCore/Dependencies/distorm/src/prefix.h @@ -4,7 +4,7 @@ prefix.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -31,20 +31,19 @@ typedef enum {PFXIDX_NONE = -1, PFXIDX_REX, PFXIDX_LOREP, PFXIDX_SEG, PFXIDX_OP_ */ typedef struct { _iflags decodedPrefixes, usedPrefixes; - const uint8_t *start, *last, *vexPos, *rexPos; - _PrefixExtType prefixExtType; + /* Number of prefixes scanned for current instruction, including VEX! */ + unsigned int count; uint16_t unusedPrefixesMask; + /* Holds the offset to the prefix byte by its type. */ + uint16_t pfxIndexer[PFXIDX_MAX]; + _PrefixExtType prefixExtType; /* Indicates whether the operand size prefix (0x66) was used as a mandatory prefix. */ int isOpSizeMandatory; /* If VEX prefix is used, store the VEX.vvvv field. */ unsigned int vexV; /* The fields B/X/R/W/L of REX and VEX are stored together in this byte. */ unsigned int vrex; - - /* !! Make sure pfxIndexer is LAST! Otherwise memset won't work well with it. !! */ - - /* Holds the offset to the prefix byte by its type. */ - int pfxIndexer[PFXIDX_MAX]; + const uint8_t* vexPos; } _PrefixState; /* @@ -54,11 +53,27 @@ typedef struct { */ #define MAX_PREFIXES (5) -int prefixes_is_valid(unsigned int ch, _DecodeType dt); -void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi); +extern int PrefixTables[256 * 2]; + +_INLINE_ int prefixes_is_valid(unsigned char ch, _DecodeType dt) +{ + /* The predicate selects (branchlessly) second half table for 64 bits otherwise selects first half. */ + return PrefixTables[ch + ((dt >> 1) << 8)]; +} + +/* Ignore a specific prefix type. */ +_INLINE_ void prefixes_ignore(_PrefixState* ps, _PrefixIndexer pi) +{ + /* + * If that type of prefix appeared already, set the bit of that *former* prefix. + * Anyway, set the new index of that prefix type to the current index, so next time we know its position. + */ + ps->unusedPrefixesMask |= ps->pfxIndexer[pi]; +} + void prefixes_ignore_all(_PrefixState* ps); uint16_t prefixes_set_unused_mask(_PrefixState* ps); -void prefixes_decode(const uint8_t* code, int codeLen, _PrefixState* ps, _DecodeType dt); +void prefixes_decode(_CodeInfo* ci, _PrefixState* ps); void prefixes_use_segment(_iflags defaultSeg, _PrefixState* ps, _DecodeType dt, _DInst* di); #endif /* PREFIX_H */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.c b/NativeCore/Dependencies/distorm/src/textdefs.c index 48419d91..cf56a8f6 100644 --- a/NativeCore/Dependencies/distorm/src/textdefs.c +++ b/NativeCore/Dependencies/distorm/src/textdefs.c @@ -4,7 +4,7 @@ textdefs.c diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -13,116 +13,84 @@ This library is licensed under the BSD license. See the file COPYING. #ifndef DISTORM_LIGHT -static uint8_t Nibble2ChrTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; +static uint8_t Nibble2ChrTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; #define NIBBLE_TO_CHR Nibble2ChrTable[t] -void _FASTCALL_ str_hex_b(_WString* s, unsigned int x) +void str_hex(_WString* s, const uint8_t* buf, unsigned int len) { - /* - * def prebuilt(): - * s = "" - * for i in xrange(256): - * if ((i % 0x10) == 0): - * s += "\r\n" - * s += "\"%02X\", " % (i) - * return s - */ - static int8_t TextBTable[256][3] = { - "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", - "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", - "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", - "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", - "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", - "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", - "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", - "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", - "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", - "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", - "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", - "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", - "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", - "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", - "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", - "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" - }; - - /* - * Fixed length of 3 including null terminate character. - */ - memcpy(&s->p[s->length], TextBTable[x & 255], 3); - s->length += 2; + /* 256 * 2 : 2 chars per byte value. */ + static const char* TextBTable = + "000102030405060708090a0b0c0d0e0f" \ + "101112131415161718191a1b1c1d1e1f" \ + "202122232425262728292a2b2c2d2e2f" \ + "303132333435363738393a3b3c3d3e3f" \ + "404142434445464748494a4b4c4d4e4f" \ + "505152535455565758595a5b5c5d5e5f" \ + "606162636465666768696a6b6c6d6e6f" \ + "707172737475767778797a7b7c7d7e7f" \ + "808182838485868788898a8b8c8d8e8f" \ + "909192939495969798999a9b9c9d9e9f" \ + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" \ + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" \ + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" \ + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" \ + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" \ + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + + unsigned int i = 0; + /* Length is at least 1, enter loop. */ + s->length = len * 2; + s->p[len * 2] = 0; + do { + RSHORT(&s->p[i]) = RSHORT(&TextBTable[(*buf) * 2]); + buf++; + i += 2; + } while (i < len * 2); } -void _FASTCALL_ str_code_hb(_WString* s, unsigned int x) -{ - static int8_t TextHBTable[256][5] = { - /* - * def prebuilt(): - * s = "" - * for i in xrange(256): - * if ((i % 0x10) == 0): - * s += "\r\n" - * s += "\"0x%X\", " % (i) - * return s - */ - "0x0", "0x1", "0x2", "0x3", "0x4", "0x5", "0x6", "0x7", "0x8", "0x9", "0xA", "0xB", "0xC", "0xD", "0xE", "0xF", - "0x10", "0x11", "0x12", "0x13", "0x14", "0x15", "0x16", "0x17", "0x18", "0x19", "0x1A", "0x1B", "0x1C", "0x1D", "0x1E", "0x1F", - "0x20", "0x21", "0x22", "0x23", "0x24", "0x25", "0x26", "0x27", "0x28", "0x29", "0x2A", "0x2B", "0x2C", "0x2D", "0x2E", "0x2F", - "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "0x39", "0x3A", "0x3B", "0x3C", "0x3D", "0x3E", "0x3F", - "0x40", "0x41", "0x42", "0x43", "0x44", "0x45", "0x46", "0x47", "0x48", "0x49", "0x4A", "0x4B", "0x4C", "0x4D", "0x4E", "0x4F", - "0x50", "0x51", "0x52", "0x53", "0x54", "0x55", "0x56", "0x57", "0x58", "0x59", "0x5A", "0x5B", "0x5C", "0x5D", "0x5E", "0x5F", - "0x60", "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", "0x67", "0x68", "0x69", "0x6A", "0x6B", "0x6C", "0x6D", "0x6E", "0x6F", - "0x70", "0x71", "0x72", "0x73", "0x74", "0x75", "0x76", "0x77", "0x78", "0x79", "0x7A", "0x7B", "0x7C", "0x7D", "0x7E", "0x7F", - "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", "0x8A", "0x8B", "0x8C", "0x8D", "0x8E", "0x8F", - "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", "0x98", "0x99", "0x9A", "0x9B", "0x9C", "0x9D", "0x9E", "0x9F", - "0xA0", "0xA1", "0xA2", "0xA3", "0xA4", "0xA5", "0xA6", "0xA7", "0xA8", "0xA9", "0xAA", "0xAB", "0xAC", "0xAD", "0xAE", "0xAF", - "0xB0", "0xB1", "0xB2", "0xB3", "0xB4", "0xB5", "0xB6", "0xB7", "0xB8", "0xB9", "0xBA", "0xBB", "0xBC", "0xBD", "0xBE", "0xBF", - "0xC0", "0xC1", "0xC2", "0xC3", "0xC4", "0xC5", "0xC6", "0xC7", "0xC8", "0xC9", "0xCA", "0xCB", "0xCC", "0xCD", "0xCE", "0xCF", - "0xD0", "0xD1", "0xD2", "0xD3", "0xD4", "0xD5", "0xD6", "0xD7", "0xD8", "0xD9", "0xDA", "0xDB", "0xDC", "0xDD", "0xDE", "0xDF", - "0xE0", "0xE1", "0xE2", "0xE3", "0xE4", "0xE5", "0xE6", "0xE7", "0xE8", "0xE9", "0xEA", "0xEB", "0xEC", "0xED", "0xEE", "0xEF", - "0xF0", "0xF1", "0xF2", "0xF3", "0xF4", "0xF5", "0xF6", "0xF7", "0xF8", "0xF9", "0xFA", "0xFB", "0xFC", "0xFD", "0xFE", "0xFF" - }; - - if (x < 0x10) { /* < 0x10 has a fixed length of 4 including null terminate. */ - memcpy(&s->p[s->length], TextHBTable[x & 255], 4); - s->length += 3; - } else { /* >= 0x10 has a fixed length of 5 including null terminate. */ - memcpy(&s->p[s->length], TextHBTable[x & 255], 5); - s->length += 4; - } -} +#ifdef SUPPORT_64BIT_OFFSET -void _FASTCALL_ str_code_hdw(_WString* s, uint32_t x) +void str_int_impl(unsigned char** s, uint64_t x) { int8_t* buf; - int i = 0, shift = 0; - unsigned int t = 0; + int shift = 0; + OFFSET_INTEGER t = x; - buf = (int8_t*)&s->p[s->length]; + buf = (int8_t*)*s; - buf[0] = '0'; - buf[1] = 'x'; - buf += 2; + *buf++ = '0'; + *buf++ = 'x'; - for (shift = 28; shift != 0; shift -= 4) { - t = (x >> shift) & 0xf; - if (i | t) buf[i++] = NIBBLE_TO_CHR; + if (x == 0) { + *buf = '0'; + *s += 3; + return; } - t = x & 0xf; - buf[i++] = NIBBLE_TO_CHR; - s->length += i + 2; - buf[i] = '\0'; + do { + t >>= 4; + shift += 4; + } while (t); + + do { + shift -= 4; + t = (x >> shift) & 0xf; + *buf++ = NIBBLE_TO_CHR; + } while (shift > 0); + + *s = (unsigned char*)buf; } -void _FASTCALL_ str_code_hqw(_WString* s, uint8_t src[8]) +#else + +void str_int_impl(unsigned char** s, uint8_t src[8]) { int8_t* buf; int i = 0, shift = 0; uint32_t x = RULONG(&src[sizeof(int32_t)]); int t; - buf = (int8_t*)&s->p[s->length]; + buf = (int8_t*)*s; buf[0] = '0'; buf[1] = 'x'; buf += 2; @@ -140,33 +108,9 @@ void _FASTCALL_ str_code_hqw(_WString* s, uint8_t src[8]) t = x & 0xf; buf[i++] = NIBBLE_TO_CHR; - s->length += i + 2; - buf[i] = '\0'; + *s += (size_t)(i + 2); } -#ifdef SUPPORT_64BIT_OFFSET -void _FASTCALL_ str_off64(_WString* s, OFFSET_INTEGER x) -{ - int8_t* buf; - int i = 0, shift = 0; - OFFSET_INTEGER t = 0; - - buf = (int8_t*)&s->p[s->length]; - - buf[0] = '0'; - buf[1] = 'x'; - buf += 2; - - for (shift = 60; shift != 0; shift -= 4) { - t = (x >> shift) & 0xf; - if (i | t) buf[i++] = NIBBLE_TO_CHR; - } - t = x & 0xf; - buf[i++] = NIBBLE_TO_CHR; - - s->length += i + 2; - buf[i] = '\0'; -} #endif /* SUPPORT_64BIT_OFFSET */ #endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/textdefs.h b/NativeCore/Dependencies/distorm/src/textdefs.h index a923626f..27170bb3 100644 --- a/NativeCore/Dependencies/distorm/src/textdefs.h +++ b/NativeCore/Dependencies/distorm/src/textdefs.h @@ -4,7 +4,7 @@ textdefs.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -43,13 +43,14 @@ Naming Convention: * all numbers are in HEX. */ -void _FASTCALL_ str_hex_b(_WString* s, unsigned int x); -void _FASTCALL_ str_code_hb(_WString* s, unsigned int x); -void _FASTCALL_ str_code_hdw(_WString* s, uint32_t x); -void _FASTCALL_ str_code_hqw(_WString* s, uint8_t src[8]); +void str_hex(_WString* s, const uint8_t* buf, unsigned int len); #ifdef SUPPORT_64BIT_OFFSET -void _FASTCALL_ str_off64(_WString* s, OFFSET_INTEGER x); +#define str_int(s, x) str_int_impl((s), (x)) +void str_int_impl(unsigned char** s, uint64_t x); +#else +#define str_int(s, x) str_int_impl((s), (uint8_t*)&(x)) +void str_int_impl(unsigned char** s, uint8_t src[8]); #endif #endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/wstring.h b/NativeCore/Dependencies/distorm/src/wstring.h index 6b3a2a3f..6303f90d 100644 --- a/NativeCore/Dependencies/distorm/src/wstring.h +++ b/NativeCore/Dependencies/distorm/src/wstring.h @@ -4,7 +4,7 @@ wstring.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ @@ -13,22 +13,25 @@ This library is licensed under the BSD license. See the file COPYING. #define WSTRING_H #include "config.h" +#include "../include/mnemonics.h" #ifndef DISTORM_LIGHT -void strclear_WS(_WString* s); -void chrcat_WS(_WString* s, uint8_t ch); -void strcpylen_WS(_WString* s, const int8_t* buf, unsigned int len); -void strcatlen_WS(_WString* s, const int8_t* buf, unsigned int len); -void strcat_WS(_WString* s, const _WString* s2); - -/* -* Warning, this macro should be used only when the compiler knows the size of string in advance! -* This macro is used in order to spare the call to strlen when the strings are known already. -* Note: sizeof includes NULL terminated character. -*/ -#define strcat_WSN(s, t) strcatlen_WS((s), ((const int8_t*)t), sizeof((t))-1) -#define strcpy_WSN(s, t) strcpylen_WS((s), ((const int8_t*)t), sizeof((t))-1) +_INLINE_ void strcat_WSR(unsigned char** str, const _WRegister* reg) +{ + /* + * Longest register name is YMM15 - 5 characters, + * Copy 8 so compiler can do a QWORD move. + * We copy nul termination and fix the length, so it's okay to copy more to the output buffer. + * There's a sentinel register to make sure we don't read past the end of the registers table. + */ + memcpy((int8_t*)*str, (const int8_t*)reg->p, 8); + *str += reg->length; +} + +#define strfinalize_WS(s, end) do { *end = 0; s.length = (unsigned int)((size_t)end - (size_t)s.p); } while (0) +#define chrcat_WS(s, ch) do { *s = ch; s += 1; } while (0) +#define strcat_WS(s, buf, copylen, advancelen) do { memcpy((int8_t*)s, buf, copylen); s += advancelen; } while(0) #endif /* DISTORM_LIGHT */ diff --git a/NativeCore/Dependencies/distorm/src/x86defs.h b/NativeCore/Dependencies/distorm/src/x86defs.h index ca3a3adf..8b7b5414 100644 --- a/NativeCore/Dependencies/distorm/src/x86defs.h +++ b/NativeCore/Dependencies/distorm/src/x86defs.h @@ -4,7 +4,7 @@ x86defs.h diStorm3 - Powerful disassembler for X86/AMD64 http://ragestorm.net/distorm/ distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah +Copyright (C) 2003-2021 Gil Dabah This library is licensed under the BSD license. See the file COPYING. */ diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index 1a99feff..12c8b33b 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -35,9 +35,9 @@ OBJDIR_RELEASE = obj/release DEP_RELEASE = OUT_RELEASE = build/release/NativeCore.so -OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/DistormHelper.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/decoder.o $(OBJDIR_DEBUG)/distorm.o $(OBJDIR_DEBUG)/instructions.o $(OBJDIR_DEBUG)/insts.o $(OBJDIR_DEBUG)/mnemonics.o $(OBJDIR_DEBUG)/operands.o $(OBJDIR_DEBUG)/prefix.o $(OBJDIR_DEBUG)/textdefs.o $(OBJDIR_DEBUG)/wstring.o +OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/DistormHelper.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/decoder.o $(OBJDIR_DEBUG)/distorm.o $(OBJDIR_DEBUG)/instructions.o $(OBJDIR_DEBUG)/insts.o $(OBJDIR_DEBUG)/mnemonics.o $(OBJDIR_DEBUG)/operands.o $(OBJDIR_DEBUG)/prefix.o $(OBJDIR_DEBUG)/textdefs.o -OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/DistormHelper.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/decoder.o $(OBJDIR_RELEASE)/distorm.o $(OBJDIR_RELEASE)/instructions.o $(OBJDIR_RELEASE)/insts.o $(OBJDIR_RELEASE)/mnemonics.o $(OBJDIR_RELEASE)/operands.o $(OBJDIR_RELEASE)/prefix.o $(OBJDIR_RELEASE)/textdefs.o $(OBJDIR_RELEASE)/wstring.o +OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/DistormHelper.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/decoder.o $(OBJDIR_RELEASE)/distorm.o $(OBJDIR_RELEASE)/instructions.o $(OBJDIR_RELEASE)/insts.o $(OBJDIR_RELEASE)/mnemonics.o $(OBJDIR_RELEASE)/operands.o $(OBJDIR_RELEASE)/prefix.o $(OBJDIR_RELEASE)/textdefs.o all: debug release @@ -114,9 +114,6 @@ $(OBJDIR_DEBUG)/prefix.o: ../Dependencies/distorm/src/prefix.c $(OBJDIR_DEBUG)/textdefs.o: ../Dependencies/distorm/src/textdefs.c $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_DEBUG)/textdefs.o -$(OBJDIR_DEBUG)/wstring.o: ../Dependencies/distorm/src/wstring.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/wstring.c -o $(OBJDIR_DEBUG)/wstring.o - clean_debug: rm -f $(OBJ_DEBUG) $(OUT_DEBUG) rm -rf build/debug @@ -193,9 +190,6 @@ $(OBJDIR_RELEASE)/prefix.o: ../Dependencies/distorm/src/prefix.c $(OBJDIR_RELEASE)/textdefs.o: ../Dependencies/distorm/src/textdefs.c $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_RELEASE)/textdefs.o -$(OBJDIR_RELEASE)/wstring.o: ../Dependencies/distorm/src/wstring.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/wstring.c -o $(OBJDIR_RELEASE)/wstring.o - clean_release: rm -f $(OBJ_RELEASE) $(OUT_RELEASE) rm -rf build/release diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index 539434ad..c1f08598 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -84,7 +84,6 @@ - diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters index bbefa0a1..3076be6b 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj.filters +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj.filters @@ -72,9 +72,6 @@ Dependencies\distorm - - Dependencies\distorm - Shared @@ -115,9 +112,6 @@ Dependencies\distorm - - Dependencies\distorm - Dependencies\distorm diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 520adc23..565980de 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -178,7 +178,6 @@ - diff --git a/NativeCore/Windows/NativeCore.vcxproj.filters b/NativeCore/Windows/NativeCore.vcxproj.filters index a8eb2be9..eb42b939 100644 --- a/NativeCore/Windows/NativeCore.vcxproj.filters +++ b/NativeCore/Windows/NativeCore.vcxproj.filters @@ -58,9 +58,6 @@ Dependencies\distorm - - Dependencies\distorm - Shared From d95a424ffdd1d0b8183e4f1c3f4f18968393040b Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Thu, 13 May 2021 21:34:09 +0200 Subject: [PATCH 762/777] Handle not decodable instructions. --- NativeCore/Shared/DistormHelper.cpp | 121 +++++++++++++--------------- 1 file changed, 54 insertions(+), 67 deletions(-) diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index dbc08ad8..9d8d9e85 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -58,99 +58,87 @@ bool AreOperandsStatic(const _DInst &instruction, const int prefixLength) return true; } -int GetStaticInstructionBytes(const _DInst &instruction, const uint8_t *data) +_CodeInfo CreateCodeInfo(const uint8_t* address, int length, const _OffsetType virtualAddress) { _CodeInfo info = {}; - info.codeOffset = reinterpret_cast<_OffsetType>(data); - info.code = data; - info.codeLen = instruction.size; + info.codeOffset = virtualAddress; + info.code = address; + info.codeLen = length; info.features = DF_NONE; + #ifdef RECLASSNET32 info.dt = Decode32Bits; #else info.dt = Decode64Bits; #endif - _PrefixState ps = {}; - memset(ps.pfxIndexer, PFXIDX_NONE, sizeof(int) * PFXIDX_MAX); - ps.start = data; - ps.last = data; - - prefixes_decode(data, info.codeLen, &ps, info.dt); + return info; +} - info.codeOffset = reinterpret_cast<_OffsetType>(ps.last); - info.code = ps.last; - const auto prefixLength = static_cast(ps.start - ps.last); - info.codeLen -= prefixLength; +int GetStaticInstructionBytes(const _DInst &instruction, const uint8_t *data) +{ + auto info = CreateCodeInfo(data, instruction.size, reinterpret_cast<_OffsetType>(data)); - inst_lookup(&info, &ps); + _PrefixState ps = {}; + int isPrefixed; + inst_lookup(&info, &ps, &isPrefixed); - if (AreOperandsStatic(instruction, prefixLength)) + if (AreOperandsStatic(instruction, ps.count)) { return instruction.size; } - return instruction.size - info.codeLen; + return instruction.size - info.codeLen - ps.count; } -_CodeInfo CreateCodeInfo(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress) -{ - _CodeInfo info = {}; - info.codeOffset = reinterpret_cast<_OffsetType>(virtualAddress); - info.code = reinterpret_cast(address); - info.codeLen = static_cast(length); - info.features = DF_NONE; - -#ifdef RECLASSNET32 - info.dt = Decode32Bits; -#else - info.dt = Decode64Bits; -#endif - - return info; -} - -void FillInstructionData(const RC_Pointer address, const _DInst& instruction, const _DecodedInst& instructionInfo, const bool determineStaticInstructionBytes, InstructionData* data) +void FillInstructionData(const _CodeInfo& info, const RC_Pointer address, const _DInst& instruction, const bool determineStaticInstructionBytes, InstructionData* data) { data->Address = reinterpret_cast(instruction.addr); - data->Length = instructionInfo.size; - std::memcpy(data->Data, address, instructionInfo.size); - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.mnemonic.p), - data->Instruction, - instructionInfo.mnemonic.length - ); - if (instructionInfo.operands.length != 0) - { - data->Instruction[instructionInfo.mnemonic.length] = ' '; - - MultiByteToUnicode( - reinterpret_cast(instructionInfo.operands.p), - 0, - data->Instruction, - instructionInfo.mnemonic.length + 1, - std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) - ); - } + data->Length = instruction.size; + std::memcpy(data->Data, address, instruction.size); + data->StaticInstructionBytes = -1; - if (determineStaticInstructionBytes) + if (instruction.flags == FLAG_NOT_DECODABLE) { - data->StaticInstructionBytes = GetStaticInstructionBytes( - instruction, - reinterpret_cast(address) - ); + std::memcpy(data->Instruction, L"???", sizeof(RC_UnicodeChar) * 3); } else { - data->StaticInstructionBytes = -1; + _DecodedInst instructionInfo = {}; + distorm_format(&info, &instruction, &instructionInfo); + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.mnemonic.p), + data->Instruction, + instructionInfo.mnemonic.length + ); + if (instructionInfo.operands.length != 0) + { + data->Instruction[instructionInfo.mnemonic.length] = ' '; + + MultiByteToUnicode( + reinterpret_cast(instructionInfo.operands.p), + 0, + data->Instruction, + instructionInfo.mnemonic.length + 1, + std::min(64 - 1 - instructionInfo.mnemonic.length, instructionInfo.operands.length) + ); + } + + if (determineStaticInstructionBytes) + { + data->StaticInstructionBytes = GetStaticInstructionBytes( + instruction, + reinterpret_cast(address) + ); + } } } bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, const RC_Pointer virtualAddress, const bool determineStaticInstructionBytes, EnumerateInstructionCallback callback) { - auto info = CreateCodeInfo(address, length, virtualAddress); + auto info = CreateCodeInfo(static_cast(address), static_cast(length), reinterpret_cast<_OffsetType>(virtualAddress)); const unsigned MaxInstructions = 50; @@ -169,18 +157,17 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, for (auto i = 0u; i < count; ++i) { - _DecodedInst instructionInfo = {}; - distorm_format(&info, &decodedInstructions[i], &instructionInfo); + const auto& instruction = decodedInstructions[i]; InstructionData data = {}; - FillInstructionData(instructionAddress, decodedInstructions[i], instructionInfo, determineStaticInstructionBytes, &data); + FillInstructionData(info, instructionAddress, instruction, determineStaticInstructionBytes, &data); if (callback(&data) == false) { return true; } - instructionAddress += decodedInstructions[i].size; + instructionAddress += instruction.size; } if (res == DECRES_SUCCESS || count == 0) @@ -188,7 +175,7 @@ bool DisassembleInstructionsImpl(const RC_Pointer address, const RC_Size length, return true; } - const auto offset = static_cast(decodedInstructions[count - 1].addr - info.codeOffset); + const auto offset = static_cast(decodedInstructions[count - 1].addr + decodedInstructions[count - 1].size - info.codeOffset); info.codeOffset += offset; info.code += offset; From 0ee8a4cd6a00e2664f2ef3250a81089c32d69392 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 18 Jun 2021 08:18:39 +0200 Subject: [PATCH 763/777] Fixed button anchor. (fixes #200) --- ReClass.NET/Forms/ScannerForm.Designer.cs | 67 ++++++++++++----------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/ReClass.NET/Forms/ScannerForm.Designer.cs b/ReClass.NET/Forms/ScannerForm.Designer.cs index 58d867ea..d6fd02ac 100644 --- a/ReClass.NET/Forms/ScannerForm.Designer.cs +++ b/ReClass.NET/Forms/ScannerForm.Designer.cs @@ -31,14 +31,14 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - this.bannerBox = new BannerBox(); + this.bannerBox = new ReClassNET.Controls.BannerBox(); this.filterGroupBox = new System.Windows.Forms.GroupBox(); this.valueTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanValueTypeComboBox(); this.label3 = new System.Windows.Forms.Label(); this.compareTypeComboBox = new ReClassNET.Forms.ScannerForm.ScanCompareTypeComboBox(); this.label1 = new System.Windows.Forms.Label(); this.isHexCheckBox = new System.Windows.Forms.CheckBox(); - this.dualValueBox = new DualValueBox(); + this.dualValueBox = new ReClassNET.Controls.DualValueBox(); this.scanOptionsGroupBox = new System.Windows.Forms.GroupBox(); this.fastScanAlignmentTextBox = new System.Windows.Forms.TextBox(); this.fastScanCheckBox = new System.Windows.Forms.CheckBox(); @@ -67,7 +67,7 @@ private void InitializeComponent() this.scanProgressBar = new System.Windows.Forms.ProgressBar(); this.resultCountLabel = new System.Windows.Forms.Label(); this.updateValuesTimer = new System.Windows.Forms.Timer(this.components); - this.resultMemoryRecordList = new MemoryRecordList(); + this.resultMemoryRecordList = new ReClassNET.Controls.MemoryRecordList(); this.resultListContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.addSelectedResultsToAddressListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeSelectedRecordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -84,7 +84,7 @@ private void InitializeComponent() this.findOutWhatWritesToThisAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.copyAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addressListMemoryRecordList = new MemoryRecordList(); + this.addressListMemoryRecordList = new ReClassNET.Controls.MemoryRecordList(); this.toolStripPanel = new System.Windows.Forms.ToolStripPanel(); this.menuToolStrip = new System.Windows.Forms.ToolStrip(); this.openAddressFileToolStripButton = new System.Windows.Forms.ToolStripButton(); @@ -93,9 +93,9 @@ private void InitializeComponent() this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.clearAddressListToolStripButton = new System.Windows.Forms.ToolStripButton(); this.infoToolTip = new System.Windows.Forms.ToolTip(this.components); - this.undoIconButton = new IconButton(); - this.showInputCorrelatorIconButton = new IconButton(); - this.cancelScanIconButton = new IconButton(); + this.undoIconButton = new ReClassNET.Controls.IconButton(); + this.showInputCorrelatorIconButton = new ReClassNET.Controls.IconButton(); + this.cancelScanIconButton = new ReClassNET.Controls.IconButton(); ((System.ComponentModel.ISupportInitialize)(this.bannerBox)).BeginInit(); this.filterGroupBox.SuspendLayout(); this.scanOptionsGroupBox.SuspendLayout(); @@ -503,8 +503,8 @@ private void InitializeComponent() // // resultMemoryRecordList // - this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.resultMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.resultMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; this.resultMemoryRecordList.Location = new System.Drawing.Point(11, 80); this.resultMemoryRecordList.Name = "resultMemoryRecordList"; @@ -515,22 +515,22 @@ private void InitializeComponent() this.resultMemoryRecordList.ShowValueTypeColumn = false; this.resultMemoryRecordList.Size = new System.Drawing.Size(268, 314); this.resultMemoryRecordList.TabIndex = 16; - this.resultMemoryRecordList.RecordDoubleClick += new MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); + this.resultMemoryRecordList.RecordDoubleClick += new ReClassNET.Controls.MemorySearchResultControlResultDoubleClickEventHandler(this.memorySearchResultControl_ResultDoubleClick); // // resultListContextMenuStrip // this.resultListContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addSelectedResultsToAddressListToolStripMenuItem, - this.removeSelectedRecordsToolStripMenuItem, - this.changeToolStripMenuItem, - this.toolStripSeparator2, - this.setCurrentClassAddressToolStripMenuItem, - this.createClassAtAddressToolStripMenuItem, - this.toolStripSeparator3, - this.findOutWhatAccessesThisAddressToolStripMenuItem, - this.findOutWhatWritesToThisAddressToolStripMenuItem, - this.toolStripSeparator4, - this.copyAddressToolStripMenuItem}); + this.addSelectedResultsToAddressListToolStripMenuItem, + this.removeSelectedRecordsToolStripMenuItem, + this.changeToolStripMenuItem, + this.toolStripSeparator2, + this.setCurrentClassAddressToolStripMenuItem, + this.createClassAtAddressToolStripMenuItem, + this.toolStripSeparator3, + this.findOutWhatAccessesThisAddressToolStripMenuItem, + this.findOutWhatWritesToThisAddressToolStripMenuItem, + this.toolStripSeparator4, + this.copyAddressToolStripMenuItem}); this.resultListContextMenuStrip.Name = "resultListContextMenuStrip"; this.resultListContextMenuStrip.Size = new System.Drawing.Size(270, 198); this.resultListContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.resultListContextMenuStrip_Opening); @@ -554,10 +554,10 @@ private void InitializeComponent() // changeToolStripMenuItem // this.changeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.descriptionToolStripMenuItem, - this.addressToolStripMenuItem, - this.valueTypeToolStripMenuItem, - this.valueToolStripMenuItem}); + this.descriptionToolStripMenuItem, + this.addressToolStripMenuItem, + this.valueTypeToolStripMenuItem, + this.valueToolStripMenuItem}); this.changeToolStripMenuItem.Enabled = false; this.changeToolStripMenuItem.Image = global::ReClassNET.Properties.Resources.B16x16_Textfield_Rename; this.changeToolStripMenuItem.Name = "changeToolStripMenuItem"; @@ -645,9 +645,9 @@ private void InitializeComponent() // // addressListMemoryRecordList // - this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.addressListMemoryRecordList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.addressListMemoryRecordList.ContextMenuStrip = this.resultListContextMenuStrip; this.addressListMemoryRecordList.Location = new System.Drawing.Point(11, 425); this.addressListMemoryRecordList.Name = "addressListMemoryRecordList"; @@ -674,11 +674,11 @@ private void InitializeComponent() this.menuToolStrip.Dock = System.Windows.Forms.DockStyle.None; this.menuToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.menuToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.openAddressFileToolStripButton, - this.saveAddressFileToolStripButton, - this.saveAddressFileAsToolStripButton, - this.toolStripSeparator1, - this.clearAddressListToolStripButton}); + this.openAddressFileToolStripButton, + this.saveAddressFileToolStripButton, + this.saveAddressFileAsToolStripButton, + this.toolStripSeparator1, + this.clearAddressListToolStripButton}); this.menuToolStrip.Location = new System.Drawing.Point(0, 0); this.menuToolStrip.Name = "menuToolStrip"; this.menuToolStrip.Size = new System.Drawing.Size(101, 25); @@ -759,6 +759,7 @@ private void InitializeComponent() // // cancelScanIconButton // + this.cancelScanIconButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.cancelScanIconButton.Image = global::ReClassNET.Properties.Resources.B16x16_Button_Delete; this.cancelScanIconButton.Location = new System.Drawing.Point(517, 54); this.cancelScanIconButton.Name = "cancelScanIconButton"; From 378ad2994201197732572fb5064d39ce6605c3e0 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 12 Sep 2021 10:45:31 +0200 Subject: [PATCH 764/777] Fixed writing two bytes instead of one. --- ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs b/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs index c587a2d1..d39dace9 100644 --- a/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs +++ b/ReClass.NET/Extensions/IRemoteMemoryWriterExtension.cs @@ -6,9 +6,9 @@ namespace ReClassNET.Extensions { public static class IRemoteMemoryWriterExtension { - public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, sbyte value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, sbyte value) => writer.WriteRemoteMemory(address, new[] { (byte)value }); - public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, byte value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); + public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, byte value) => writer.WriteRemoteMemory(address, new[] { value }); public static void WriteRemoteMemory(this IRemoteMemoryWriter writer, IntPtr address, short value) => writer.WriteRemoteMemory(address, writer.BitConverter.GetBytes(value)); From e4d420d3355098fee4b2a7b8ebbf0dc02a3da281 Mon Sep 17 00:00:00 2001 From: ko1N Date: Fri, 8 Oct 2021 11:03:14 +0200 Subject: [PATCH 765/777] Fixed a crash where using the 'Insert Bytes' menu on the topmost class would throw an Exception --- ReClass.NET/Nodes/BaseContainerNode.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index 6926111f..d7c53571 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -243,8 +243,9 @@ public void AddBytes(int size) public void InsertBytes(BaseNode position, int size) { + int index = FindNodeIndex(position); List dummy = null; - InsertBytes(FindNodeIndex(position), size, ref dummy); + InsertBytes(index >= 0 ? index : 0, size, ref dummy); } /// Inserts bytes at the specified position. From 22d6f30d37c9f62c8e040b069b71e118e532e807 Mon Sep 17 00:00:00 2001 From: ko1N Date: Fri, 8 Oct 2021 14:20:04 +0200 Subject: [PATCH 766/777] Disabled 'Insert Bytes' menu when selecting a class --- ReClass.NET/Forms/MainForm.cs | 9 +++++---- ReClass.NET/Nodes/BaseContainerNode.cs | 3 +-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index e9a18b38..010eea25 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -495,7 +495,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs }; addBytesToolStripMenuItem.Enabled = parentNode != null || nodeIsClass; - insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null; + insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null && !nodeIsClass; changeTypeToolStripMenuItem.Enabled = count > 0 && !nodeIsClass; @@ -829,11 +829,12 @@ private void memoryViewControl_SelectionChanged(object sender, EventArgs e) var node = selectedNodes.FirstOrDefault()?.Node; var parentContainer = node?.GetParentContainer(); + var nodeIsClass = node is ClassNode; - addBytesToolStripDropDownButton.Enabled = parentContainer != null || node is ClassNode; - insertBytesToolStripDropDownButton.Enabled = selectedNodes.Count == 1 && parentContainer != null; + addBytesToolStripDropDownButton.Enabled = parentContainer != null || nodeIsClass; + insertBytesToolStripDropDownButton.Enabled = selectedNodes.Count == 1 && parentContainer != null && !nodeIsClass; - var enabled = selectedNodes.Count > 0 && !(node is ClassNode); + var enabled = selectedNodes.Count > 0 && !nodeIsClass; toolStrip.Items.OfType().ForEach(b => b.Enabled = enabled); } diff --git a/ReClass.NET/Nodes/BaseContainerNode.cs b/ReClass.NET/Nodes/BaseContainerNode.cs index d7c53571..6926111f 100644 --- a/ReClass.NET/Nodes/BaseContainerNode.cs +++ b/ReClass.NET/Nodes/BaseContainerNode.cs @@ -243,9 +243,8 @@ public void AddBytes(int size) public void InsertBytes(BaseNode position, int size) { - int index = FindNodeIndex(position); List dummy = null; - InsertBytes(index >= 0 ? index : 0, size, ref dummy); + InsertBytes(FindNodeIndex(position), size, ref dummy); } /// Inserts bytes at the specified position. From f4dc7614054a138a4a21712442ba7b8f61951038 Mon Sep 17 00:00:00 2001 From: ko1N Date: Thu, 31 Mar 2022 14:53:00 +0200 Subject: [PATCH 767/777] Fixed compilation on gcc 11 and fixed new import paths for dlopen/dlsym/dlcose (#220) --- NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp | 2 +- ReClass.NET/Native/NativeMethods.Unix.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp index a3ef6d8b..e983ee77 100644 --- a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp @@ -50,7 +50,7 @@ extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, RC_UnicodeChar Path[PATH_MAXIMUM_LENGTH] = {}; }; - std::ifstream input(static_cast(std::stringstream() << "/proc/" << reinterpret_cast(handle) << "/maps").str()); + std::ifstream input((std::stringstream() << "/proc/" << reinterpret_cast(handle) << "/maps").str()); std::unordered_map modules; diff --git a/ReClass.NET/Native/NativeMethods.Unix.cs b/ReClass.NET/Native/NativeMethods.Unix.cs index 50be47b3..c1b2e6c4 100644 --- a/ReClass.NET/Native/NativeMethods.Unix.cs +++ b/ReClass.NET/Native/NativeMethods.Unix.cs @@ -10,13 +10,13 @@ internal class NativeMethodsUnix : INativeMethods private const int RTLD_NOW = 2; - [DllImport("libdl.so")] + [DllImport("__Internal")] private static extern IntPtr dlopen(string fileName, int flags); - [DllImport("libdl.so")] + [DllImport("__Internal")] private static extern IntPtr dlsym(IntPtr handle, string symbol); - [DllImport("libdl.so")] + [DllImport("__Internal")] private static extern int dlclose(IntPtr handle); #endregion From 18d6a63e32b05df6a18e15cc20bcd3dffa4b7d96 Mon Sep 17 00:00:00 2001 From: Mstik Date: Tue, 31 May 2022 20:06:33 -1200 Subject: [PATCH 768/777] Filter By PID --- NativeCore/Windows/NativeCore.vcxproj | 8 ++++---- ReClass.NET/Forms/ProcessBrowserForm.cs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 565980de..5715bcb4 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -28,26 +28,26 @@ DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte diff --git a/ReClass.NET/Forms/ProcessBrowserForm.cs b/ReClass.NET/Forms/ProcessBrowserForm.cs index 9478a06f..d4ed7cb3 100644 --- a/ReClass.NET/Forms/ProcessBrowserForm.cs +++ b/ReClass.NET/Forms/ProcessBrowserForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Data; using System.Drawing; using System.Linq; @@ -131,7 +131,7 @@ private void ApplyFilter() var filter = filterTextBox.Text; if (!string.IsNullOrEmpty(filter)) { - filter = $"name like '%{filter}%' or path like '%{filter}%'"; + filter = $"name like '%{filter}%' or path like '%{filter}%' or CONVERT(id, System.String) like '%{filter}%'"; } ((DataTable)processDataGridView.DataSource).DefaultView.RowFilter = filter; } From 45696a717258efbf82872306168950a0055f5c1d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 8 Aug 2022 21:09:52 +0200 Subject: [PATCH 769/777] Use inner nodes for hierarchy calculation. --- ReClass.NET/CodeGenerator/CppCodeGenerator.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs index 4cefbf8f..b6495aab 100644 --- a/ReClass.NET/CodeGenerator/CppCodeGenerator.cs +++ b/ReClass.NET/CodeGenerator/CppCodeGenerator.cs @@ -192,6 +192,9 @@ IEnumerable GetReversedClassHierarchy(ClassNode node) } var classNodes = node.Nodes + .OfType() + .SelectMany(c => c.Nodes) + .Concat(node.Nodes) .OfType() .Where(w => !w.IsNodePresentInChain()) // Pointers are forward declared .Select(w => w.ResolveMostInnerNode() as ClassNode) From fde15991a5fe7b6a309053ca2b71f557b820c260 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Wed, 10 Aug 2022 09:24:58 +0200 Subject: [PATCH 770/777] Limit index when changing size. --- ReClass.NET/Nodes/BaseWrapperArrayNode.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs index 52d5d948..ee042751 100644 --- a/ReClass.NET/Nodes/BaseWrapperArrayNode.cs +++ b/ReClass.NET/Nodes/BaseWrapperArrayNode.cs @@ -116,6 +116,11 @@ public override void Update(HotSpot spot) { Count = value; + if (CurrentIndex >= value) + { + CurrentIndex = value - 1; + } + GetParentContainer()?.ChildHasChanged(this); } } From 28d69d8c8967417ca6db1043ff43788966d182c1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 25 Sep 2022 17:59:54 +0200 Subject: [PATCH 771/777] Fix tab escaping. --- ReClass.NET/Util/Rtf/RtfBuilder.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index 4015722d..76bd7b95 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -247,22 +247,22 @@ private static string EscapeString(string value) { if (value.IndexOfAny(slashable) >= 0) { - value = value.Replace("\\", "\\\\").Replace("{", @"\{").Replace("}", @"\}"); + value = value.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}"); } - if (value.Any(c => c > 255)) + if (value.Any(c => c > 255 || c == '\t')) { var sb = new StringBuilder(); foreach (var c in value) { - if (c <= 255) + if (c == '\t') { - sb.Append(c); + sb.Append(@"\tab"); } - else if (c == '\t') + else if (c <= 255) { - sb.Append(@"\tab"); + sb.Append(c); } else { From e1289162e22aa99c55a0d75fdb8bd2e095f8c488 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 25 Sep 2022 20:12:45 +0200 Subject: [PATCH 772/777] Use WSL to compile linux native core library. --- NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp | 5 +++-- NativeCore/Unix/NativeCore.Unix.vcxproj | 4 ++++ README.md | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp index e983ee77..079cba54 100644 --- a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp @@ -50,12 +50,13 @@ extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, RC_UnicodeChar Path[PATH_MAXIMUM_LENGTH] = {}; }; - std::ifstream input((std::stringstream() << "/proc/" << reinterpret_cast(handle) << "/maps").str()); + auto path = std::stringstream(); + path << "/proc/" << reinterpret_cast(handle) << "/maps"; std::unordered_map modules; std::string line; - while (std::getline(input, line)) + while (std::getline(std::ifstream(path.str()), line)) { std::stringstream ss(line); diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index c1f08598..9ce274fd 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -33,18 +33,22 @@ true DynamicLibrary + WSL2_1_0 false DynamicLibrary + WSL2_1_0 true DynamicLibrary + WSL2_1_0 false DynamicLibrary + WSL2_1_0 diff --git a/README.md b/README.md index 6a83bf03..6f424ced 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ Just download the [latest version](https://github.com/ReClassNET/ReClass.NET/rel If you want to compile ReClass.NET just fork the repository and open the ReClass.NET.sln file with Visual Studio 2019. Compile the project and copy the dependencies to the output folder. +To compile the linux native core library, you need WSL [installed and configured](https://learn.microsoft.com/en-us/cpp/build/walkthrough-build-debug-wsl2). If you do not need linux support, simply unload the project in the Solution Explorer. + ## Videos [Youtube Playlist](https://www.youtube.com/playlist?list=PLO246BmtoITanq3ygMCL8_w0eov4D8hjk) From eea41dab4e092a5af2f3c2960d44ecc0da789dd1 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 25 Sep 2022 20:18:49 +0200 Subject: [PATCH 773/777] Bump distorm to 3.5.3. --- NativeCore/Dependencies/distorm/COPYING.txt | 2 +- .../Dependencies/distorm/include/distorm.h | 2 +- .../Dependencies/distorm/include/mnemonics.h | 476 +-- NativeCore/Dependencies/distorm/src/config.h | 2 +- NativeCore/Dependencies/distorm/src/insts.c | 2764 ++++++++--------- .../Dependencies/distorm/src/mnemonics.c | 52 +- NativeCore/Dependencies/distorm/src/wstring.c | 47 - 7 files changed, 1649 insertions(+), 1696 deletions(-) delete mode 100644 NativeCore/Dependencies/distorm/src/wstring.c diff --git a/NativeCore/Dependencies/distorm/COPYING.txt b/NativeCore/Dependencies/distorm/COPYING.txt index 4f365ddc..9046eba5 100644 --- a/NativeCore/Dependencies/distorm/COPYING.txt +++ b/NativeCore/Dependencies/distorm/COPYING.txt @@ -1,6 +1,6 @@ :[diStorm3}: The ultimate disassembler library. -Copyright (c) 2003-2016, Gil Dabah +Copyright (c) 2003-2021, Gil Dabah All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/NativeCore/Dependencies/distorm/include/distorm.h b/NativeCore/Dependencies/distorm/include/distorm.h index 2e09c4a6..b0467bae 100644 --- a/NativeCore/Dependencies/distorm/include/distorm.h +++ b/NativeCore/Dependencies/distorm/include/distorm.h @@ -1,4 +1,4 @@ -/* diStorm 3.5.2 */ +/* diStorm 3.5.3 */ /* distorm.h diff --git a/NativeCore/Dependencies/distorm/include/mnemonics.h b/NativeCore/Dependencies/distorm/include/mnemonics.h index 3a784cca..3f982705 100644 --- a/NativeCore/Dependencies/distorm/include/mnemonics.h +++ b/NativeCore/Dependencies/distorm/include/mnemonics.h @@ -41,245 +41,245 @@ extern const _WRegister _REGISTERS[]; #define GET_MNEMONIC_NAME(m) ((_WMnemonic*)&_MNEMONICS[(m)])->p typedef enum { - I_UNDEFINED = 0, I_AAA = 66, I_AAD = 389, I_AAM = 384, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3144, - I_ADDPS = 3137, I_ADDSD = 3158, I_ADDSS = 3151, I_ADDSUBPD = 6428, I_ADDSUBPS = 6438, - I_AESDEC = 9243, I_AESDECLAST = 9260, I_AESENC = 9201, I_AESENCLAST = 9218, - I_AESIMC = 9184, I_AESKEYGENASSIST = 9829, I_AND = 41, I_ANDNPD = 3055, I_ANDNPS = 3047, - I_ANDPD = 3024, I_ANDPS = 3017, I_ARPL = 111, I_BLENDPD = 9406, I_BLENDPS = 9387, - I_BLENDVPD = 7653, I_BLENDVPS = 7643, I_BOUND = 104, I_BSF = 4380, I_BSR = 4392, - I_BSWAP = 960, I_BT = 872, I_BTC = 934, I_BTR = 912, I_BTS = 887, I_CALL = 456, - I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLAC = 1787, I_CLC = 492, - I_CLD = 512, I_CLFLUSH = 4363, I_CLGI = 1867, I_CLI = 502, I_CLTS = 541, I_CMC = 487, - I_CMOVA = 694, I_CMOVAE = 663, I_CMOVB = 656, I_CMOVBE = 686, I_CMOVG = 754, - I_CMOVGE = 738, I_CMOVL = 731, I_CMOVLE = 746, I_CMOVNO = 648, I_CMOVNP = 723, - I_CMOVNS = 708, I_CMOVNZ = 678, I_CMOVO = 641, I_CMOVP = 716, I_CMOVS = 701, - I_CMOVZ = 671, I_CMP = 71, I_CMPEQPD = 4483, I_CMPEQPS = 4404, I_CMPEQSD = 4641, - I_CMPEQSS = 4562, I_CMPLEPD = 4501, I_CMPLEPS = 4422, I_CMPLESD = 4659, I_CMPLESS = 4580, - I_CMPLTPD = 4492, I_CMPLTPS = 4413, I_CMPLTSD = 4650, I_CMPLTSS = 4571, I_CMPNEQPD = 4522, - I_CMPNEQPS = 4443, I_CMPNEQSD = 4680, I_CMPNEQSS = 4601, I_CMPNLEPD = 4542, - I_CMPNLEPS = 4463, I_CMPNLESD = 4700, I_CMPNLESS = 4621, I_CMPNLTPD = 4532, - I_CMPNLTPS = 4453, I_CMPNLTSD = 4690, I_CMPNLTSS = 4611, I_CMPORDPD = 4552, - I_CMPORDPS = 4473, I_CMPORDSD = 4710, I_CMPORDSS = 4631, I_CMPS = 301, I_CMPUNORDPD = 4510, - I_CMPUNORDPS = 4431, I_CMPUNORDSD = 4668, I_CMPUNORDSS = 4589, I_CMPXCHG = 898, - I_CMPXCHG16B = 6407, I_CMPXCHG8B = 6396, I_COMISD = 2813, I_COMISS = 2805, - I_CPUID = 865, I_CQO = 255, I_CRC32 = 9292, I_CVTDQ2PD = 6821, I_CVTDQ2PS = 3341, - I_CVTPD2DQ = 6831, I_CVTPD2PI = 2715, I_CVTPD2PS = 3267, I_CVTPH2PS = 4195, - I_CVTPI2PD = 2529, I_CVTPI2PS = 2519, I_CVTPS2DQ = 3351, I_CVTPS2PD = 3257, - I_CVTPS2PH = 4205, I_CVTPS2PI = 2705, I_CVTSD2SI = 2735, I_CVTSD2SS = 3287, - I_CVTSI2SD = 2549, I_CVTSI2SS = 2539, I_CVTSS2SD = 3277, I_CVTSS2SI = 2725, - I_CVTTPD2DQ = 6810, I_CVTTPD2PI = 2648, I_CVTTPS2DQ = 3361, I_CVTTPS2PI = 2637, - I_CVTTSD2SI = 2670, I_CVTTSS2SI = 2659, I_CWD = 245, I_CWDE = 233, I_DAA = 46, - I_DAS = 56, I_DEC = 86, I_DIV = 1646, I_DIVPD = 3533, I_DIVPS = 3526, I_DIVSD = 3547, - I_DIVSS = 3540, I_DPPD = 9649, I_DPPS = 9636, I_EMMS = 4134, I_ENTER = 340, - I_EXTRACTPS = 9514, I_EXTRQ = 4170, I_F2XM1 = 1192, I_FABS = 1123, I_FADD = 1023, - I_FADDP = 1549, I_FBLD = 1601, I_FBSTP = 1607, I_FCHS = 1117, I_FCLEX = 7323, - I_FCMOVB = 1376, I_FCMOVBE = 1392, I_FCMOVE = 1384, I_FCMOVNB = 1445, I_FCMOVNBE = 1463, - I_FCMOVNE = 1454, I_FCMOVNU = 1473, I_FCMOVU = 1401, I_FCOM = 1035, I_FCOMI = 1512, - I_FCOMIP = 1623, I_FCOMP = 1041, I_FCOMPP = 1563, I_FCOS = 1311, I_FDECSTP = 1238, - I_FDIV = 1061, I_FDIVP = 1594, I_FDIVR = 1067, I_FDIVRP = 1586, I_FEDISI = 1488, - I_FEMMS = 574, I_FENI = 1482, I_FFREE = 1527, I_FIADD = 1317, I_FICOM = 1331, - I_FICOMP = 1338, I_FIDIV = 1361, I_FIDIVR = 1368, I_FILD = 1418, I_FIMUL = 1324, - I_FINCSTP = 1247, I_FINIT = 7338, I_FIST = 1432, I_FISTP = 1438, I_FISTTP = 1424, - I_FISUB = 1346, I_FISUBR = 1353, I_FLD = 1074, I_FLD1 = 1141, I_FLDCW = 1098, - I_FLDENV = 1090, I_FLDL2E = 1155, I_FLDL2T = 1147, I_FLDLG2 = 1170, I_FLDLN2 = 1178, - I_FLDPI = 1163, I_FLDZ = 1186, I_FMUL = 1029, I_FMULP = 1556, I_FNCLEX = 7315, - I_FNINIT = 7330, I_FNOP = 1111, I_FNSAVE = 7345, I_FNSTCW = 7300, I_FNSTENV = 7283, - I_FNSTSW = 7360, I_FPATAN = 1213, I_FPREM = 1256, I_FPREM1 = 1230, I_FPTAN = 1206, - I_FRNDINT = 1288, I_FRSTOR = 1519, I_FSAVE = 7353, I_FSCALE = 1297, I_FSETPM = 1496, - I_FSIN = 1305, I_FSINCOS = 1279, I_FSQRT = 1272, I_FST = 1079, I_FSTCW = 7308, - I_FSTENV = 7292, I_FSTP = 1084, I_FSTSW = 7368, I_FSUB = 1048, I_FSUBP = 1579, - I_FSUBR = 1054, I_FSUBRP = 1571, I_FTST = 1129, I_FUCOM = 1534, I_FUCOMI = 1504, - I_FUCOMIP = 1614, I_FUCOMP = 1541, I_FUCOMPP = 1409, I_FXAM = 1135, I_FXCH = 1105, - I_FXRSTOR = 9926, I_FXRSTOR64 = 9935, I_FXSAVE = 9898, I_FXSAVE64 = 9906, - I_FXTRACT = 1221, I_FYL2X = 1199, I_FYL2XP1 = 1263, I_GETSEC = 633, I_HADDPD = 4215, - I_HADDPS = 4223, I_HLT = 482, I_HSUBPD = 4249, I_HSUBPS = 4257, I_IDIV = 1651, - I_IMUL = 117, I_IN = 447, I_INC = 81, I_INS = 123, I_INSERTPS = 9581, I_INSERTQ = 4177, - I_INT = 367, I_INT_3 = 360, I_INT1 = 476, I_INTO = 372, I_INVD = 555, I_INVEPT = 8318, - I_INVLPG = 1727, I_INVLPGA = 1881, I_INVPCID = 8335, I_INVVPID = 8326, I_IRET = 378, - I_JA = 166, I_JAE = 147, I_JB = 143, I_JBE = 161, I_JCXZ = 427, I_JECXZ = 433, - I_JG = 202, I_JGE = 192, I_JL = 188, I_JLE = 197, I_JMP = 462, I_JMP_FAR = 467, + I_UNDEFINED = 0, I_AAA = 66, I_AAD = 388, I_AAM = 383, I_AAS = 76, I_ADC = 31, I_ADD = 11, I_ADDPD = 3143, + I_ADDPS = 3136, I_ADDSD = 3157, I_ADDSS = 3150, I_ADDSUBPD = 6427, I_ADDSUBPS = 6437, + I_AESDEC = 9242, I_AESDECLAST = 9259, I_AESENC = 9200, I_AESENCLAST = 9217, + I_AESIMC = 9183, I_AESKEYGENASSIST = 9828, I_AND = 41, I_ANDNPD = 3054, I_ANDNPS = 3046, + I_ANDPD = 3023, I_ANDPS = 3016, I_ARPL = 111, I_BLENDPD = 9405, I_BLENDPS = 9386, + I_BLENDVPD = 7652, I_BLENDVPS = 7642, I_BOUND = 104, I_BSF = 4379, I_BSR = 4391, + I_BSWAP = 959, I_BT = 871, I_BTC = 933, I_BTR = 911, I_BTS = 886, I_CALL = 455, + I_CALL_FAR = 260, I_CBW = 228, I_CDQ = 250, I_CDQE = 239, I_CLAC = 1786, I_CLC = 491, + I_CLD = 511, I_CLFLUSH = 4362, I_CLGI = 1866, I_CLI = 501, I_CLTS = 540, I_CMC = 486, + I_CMOVA = 693, I_CMOVAE = 662, I_CMOVB = 655, I_CMOVBE = 685, I_CMOVG = 753, + I_CMOVGE = 737, I_CMOVL = 730, I_CMOVLE = 745, I_CMOVNO = 647, I_CMOVNP = 722, + I_CMOVNS = 707, I_CMOVNZ = 677, I_CMOVO = 640, I_CMOVP = 715, I_CMOVS = 700, + I_CMOVZ = 670, I_CMP = 71, I_CMPEQPD = 4482, I_CMPEQPS = 4403, I_CMPEQSD = 4640, + I_CMPEQSS = 4561, I_CMPLEPD = 4500, I_CMPLEPS = 4421, I_CMPLESD = 4658, I_CMPLESS = 4579, + I_CMPLTPD = 4491, I_CMPLTPS = 4412, I_CMPLTSD = 4649, I_CMPLTSS = 4570, I_CMPNEQPD = 4521, + I_CMPNEQPS = 4442, I_CMPNEQSD = 4679, I_CMPNEQSS = 4600, I_CMPNLEPD = 4541, + I_CMPNLEPS = 4462, I_CMPNLESD = 4699, I_CMPNLESS = 4620, I_CMPNLTPD = 4531, + I_CMPNLTPS = 4452, I_CMPNLTSD = 4689, I_CMPNLTSS = 4610, I_CMPORDPD = 4551, + I_CMPORDPS = 4472, I_CMPORDSD = 4709, I_CMPORDSS = 4630, I_CMPS = 301, I_CMPUNORDPD = 4509, + I_CMPUNORDPS = 4430, I_CMPUNORDSD = 4667, I_CMPUNORDSS = 4588, I_CMPXCHG = 897, + I_CMPXCHG16B = 6406, I_CMPXCHG8B = 6395, I_COMISD = 2812, I_COMISS = 2804, + I_CPUID = 864, I_CQO = 255, I_CRC32 = 9291, I_CVTDQ2PD = 6820, I_CVTDQ2PS = 3340, + I_CVTPD2DQ = 6830, I_CVTPD2PI = 2714, I_CVTPD2PS = 3266, I_CVTPH2PS = 4194, + I_CVTPI2PD = 2528, I_CVTPI2PS = 2518, I_CVTPS2DQ = 3350, I_CVTPS2PD = 3256, + I_CVTPS2PH = 4204, I_CVTPS2PI = 2704, I_CVTSD2SI = 2734, I_CVTSD2SS = 3286, + I_CVTSI2SD = 2548, I_CVTSI2SS = 2538, I_CVTSS2SD = 3276, I_CVTSS2SI = 2724, + I_CVTTPD2DQ = 6809, I_CVTTPD2PI = 2647, I_CVTTPS2DQ = 3360, I_CVTTPS2PI = 2636, + I_CVTTSD2SI = 2669, I_CVTTSS2SI = 2658, I_CWD = 245, I_CWDE = 233, I_DAA = 46, + I_DAS = 56, I_DEC = 86, I_DIV = 1645, I_DIVPD = 3532, I_DIVPS = 3525, I_DIVSD = 3546, + I_DIVSS = 3539, I_DPPD = 9648, I_DPPS = 9635, I_EMMS = 4133, I_ENTER = 340, + I_EXTRACTPS = 9513, I_EXTRQ = 4169, I_F2XM1 = 1191, I_FABS = 1122, I_FADD = 1022, + I_FADDP = 1548, I_FBLD = 1600, I_FBSTP = 1606, I_FCHS = 1116, I_FCLEX = 7322, + I_FCMOVB = 1375, I_FCMOVBE = 1391, I_FCMOVE = 1383, I_FCMOVNB = 1444, I_FCMOVNBE = 1462, + I_FCMOVNE = 1453, I_FCMOVNU = 1472, I_FCMOVU = 1400, I_FCOM = 1034, I_FCOMI = 1511, + I_FCOMIP = 1622, I_FCOMP = 1040, I_FCOMPP = 1562, I_FCOS = 1310, I_FDECSTP = 1237, + I_FDIV = 1060, I_FDIVP = 1593, I_FDIVR = 1066, I_FDIVRP = 1585, I_FEDISI = 1487, + I_FEMMS = 573, I_FENI = 1481, I_FFREE = 1526, I_FIADD = 1316, I_FICOM = 1330, + I_FICOMP = 1337, I_FIDIV = 1360, I_FIDIVR = 1367, I_FILD = 1417, I_FIMUL = 1323, + I_FINCSTP = 1246, I_FINIT = 7337, I_FIST = 1431, I_FISTP = 1437, I_FISTTP = 1423, + I_FISUB = 1345, I_FISUBR = 1352, I_FLD = 1073, I_FLD1 = 1140, I_FLDCW = 1097, + I_FLDENV = 1089, I_FLDL2E = 1154, I_FLDL2T = 1146, I_FLDLG2 = 1169, I_FLDLN2 = 1177, + I_FLDPI = 1162, I_FLDZ = 1185, I_FMUL = 1028, I_FMULP = 1555, I_FNCLEX = 7314, + I_FNINIT = 7329, I_FNOP = 1110, I_FNSAVE = 7344, I_FNSTCW = 7299, I_FNSTENV = 7282, + I_FNSTSW = 7359, I_FPATAN = 1212, I_FPREM = 1255, I_FPREM1 = 1229, I_FPTAN = 1205, + I_FRNDINT = 1287, I_FRSTOR = 1518, I_FSAVE = 7352, I_FSCALE = 1296, I_FSETPM = 1495, + I_FSIN = 1304, I_FSINCOS = 1278, I_FSQRT = 1271, I_FST = 1078, I_FSTCW = 7307, + I_FSTENV = 7291, I_FSTP = 1083, I_FSTSW = 7367, I_FSUB = 1047, I_FSUBP = 1578, + I_FSUBR = 1053, I_FSUBRP = 1570, I_FTST = 1128, I_FUCOM = 1533, I_FUCOMI = 1503, + I_FUCOMIP = 1613, I_FUCOMP = 1540, I_FUCOMPP = 1408, I_FXAM = 1134, I_FXCH = 1104, + I_FXRSTOR = 9925, I_FXRSTOR64 = 9934, I_FXSAVE = 9897, I_FXSAVE64 = 9905, + I_FXTRACT = 1220, I_FYL2X = 1198, I_FYL2XP1 = 1262, I_GETSEC = 632, I_HADDPD = 4214, + I_HADDPS = 4222, I_HLT = 481, I_HSUBPD = 4248, I_HSUBPS = 4256, I_IDIV = 1650, + I_IMUL = 117, I_IN = 446, I_INC = 81, I_INS = 123, I_INSERTPS = 9580, I_INSERTQ = 4176, + I_INT = 366, I_INT1 = 475, I_INT3 = 360, I_INTO = 371, I_INVD = 554, I_INVEPT = 8317, + I_INVLPG = 1726, I_INVLPGA = 1880, I_INVPCID = 8334, I_INVVPID = 8325, I_IRET = 377, + I_JA = 166, I_JAE = 147, I_JB = 143, I_JBE = 161, I_JCXZ = 426, I_JECXZ = 432, + I_JG = 202, I_JGE = 192, I_JL = 188, I_JLE = 197, I_JMP = 461, I_JMP_FAR = 466, I_JNO = 138, I_JNP = 183, I_JNS = 174, I_JNZ = 156, I_JO = 134, I_JP = 179, - I_JRCXZ = 440, I_JS = 170, I_JZ = 152, I_LAHF = 289, I_LAR = 522, I_LDDQU = 7028, - I_LDMXCSR = 9956, I_LDS = 335, I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4299, - I_LFS = 917, I_LGDT = 1703, I_LGS = 922, I_LIDT = 1709, I_LLDT = 1668, I_LMSW = 1721, - I_LODS = 313, I_LOOP = 421, I_LOOPNZ = 406, I_LOOPZ = 414, I_LSL = 527, I_LSS = 907, - I_LTR = 1674, I_LZCNT = 4397, I_MASKMOVDQU = 7153, I_MASKMOVQ = 7143, I_MAXPD = 3593, - I_MAXPS = 3586, I_MAXSD = 3607, I_MAXSS = 3600, I_MFENCE = 4325, I_MINPD = 3473, - I_MINPS = 3466, I_MINSD = 3487, I_MINSS = 3480, I_MONITOR = 1771, I_MOV = 218, - I_MOVAPD = 2493, I_MOVAPS = 2485, I_MOVBE = 9285, I_MOVD = 3954, I_MOVDDUP = 2220, - I_MOVDQ2Q = 6556, I_MOVDQA = 3980, I_MOVDQU = 3988, I_MOVHLPS = 2185, I_MOVHPD = 2379, - I_MOVHPS = 2371, I_MOVLHPS = 2362, I_MOVLPD = 2202, I_MOVLPS = 2194, I_MOVMSKPD = 2849, - I_MOVMSKPS = 2839, I_MOVNTDQ = 6883, I_MOVNTDQA = 7929, I_MOVNTI = 952, I_MOVNTPD = 2590, - I_MOVNTPS = 2581, I_MOVNTQ = 6875, I_MOVNTSD = 2608, I_MOVNTSS = 2599, I_MOVQ = 3960, - I_MOVQ2DQ = 6547, I_MOVS = 295, I_MOVSD = 2144, I_MOVSHDUP = 2387, I_MOVSLDUP = 2210, - I_MOVSS = 2137, I_MOVSX = 939, I_MOVSXD = 10039, I_MOVUPD = 2129, I_MOVUPS = 2121, - I_MOVZX = 927, I_MPSADBW = 9662, I_MUL = 1641, I_MULPD = 3204, I_MULPS = 3197, - I_MULSD = 3218, I_MULSS = 3211, I_MWAIT = 1780, I_NEG = 1636, I_NOP = 581, - I_NOT = 1631, I_OR = 27, I_ORPD = 3087, I_ORPS = 3081, I_OUT = 451, I_OUTS = 128, - I_PABSB = 7722, I_PABSD = 7752, I_PABSW = 7737, I_PACKSSDW = 3883, I_PACKSSWB = 3715, - I_PACKUSDW = 7950, I_PACKUSWB = 3793, I_PADDB = 7238, I_PADDD = 7268, I_PADDQ = 6515, - I_PADDSB = 6964, I_PADDSW = 6981, I_PADDUSB = 6654, I_PADDUSW = 6673, I_PADDW = 7253, - I_PALIGNR = 9444, I_PAND = 6641, I_PANDN = 6699, I_PAUSE = 10047, I_PAVGB = 6714, - I_PAVGUSB = 2112, I_PAVGW = 6759, I_PBLENDVB = 7633, I_PBLENDW = 9425, I_PCLMULQDQ = 9681, - I_PCMPEQB = 4077, I_PCMPEQD = 4115, I_PCMPEQQ = 7910, I_PCMPEQW = 4096, I_PCMPESTRI = 9760, - I_PCMPESTRM = 9737, I_PCMPGTB = 3736, I_PCMPGTD = 3774, I_PCMPGTQ = 8121, - I_PCMPGTW = 3755, I_PCMPISTRI = 9806, I_PCMPISTRM = 9783, I_PEXTRB = 9463, - I_PEXTRD = 9480, I_PEXTRQ = 9488, I_PEXTRW = 6345, I_PF2ID = 1948, I_PF2IW = 1941, - I_PFACC = 2062, I_PFADD = 2011, I_PFCMPEQ = 2069, I_PFCMPGE = 1972, I_PFCMPGT = 2018, - I_PFMAX = 2027, I_PFMIN = 1981, I_PFMUL = 2078, I_PFNACC = 1955, I_PFPNACC = 1963, - I_PFRCP = 1988, I_PFRCPIT1 = 2034, I_PFRCPIT2 = 2085, I_PFRSQIT1 = 2044, I_PFRSQRT = 1995, - I_PFSUB = 2004, I_PFSUBR = 2054, I_PHADDD = 7409, I_PHADDSW = 7426, I_PHADDW = 7392, - I_PHMINPOSUW = 8293, I_PHSUBD = 7485, I_PHSUBSW = 7502, I_PHSUBW = 7468, I_PI2FD = 1934, - I_PI2FW = 1927, I_PINSRB = 9564, I_PINSRD = 9602, I_PINSRQ = 9610, I_PINSRW = 6328, - I_PMADDUBSW = 7445, I_PMADDWD = 7107, I_PMAXSB = 8208, I_PMAXSD = 8225, I_PMAXSW = 6998, - I_PMAXUB = 6682, I_PMAXUD = 8259, I_PMAXUW = 8242, I_PMINSB = 8140, I_PMINSD = 8157, - I_PMINSW = 6936, I_PMINUB = 6624, I_PMINUD = 8191, I_PMINUW = 8174, I_PMOVMSKB = 6565, - I_PMOVSXBD = 7788, I_PMOVSXBQ = 7809, I_PMOVSXBW = 7767, I_PMOVSXDQ = 7872, - I_PMOVSXWD = 7830, I_PMOVSXWQ = 7851, I_PMOVZXBD = 8016, I_PMOVZXBQ = 8037, - I_PMOVZXBW = 7995, I_PMOVZXDQ = 8100, I_PMOVZXWD = 8058, I_PMOVZXWQ = 8079, - I_PMULDQ = 7893, I_PMULHRSW = 7572, I_PMULHRW = 2095, I_PMULHUW = 6774, I_PMULHW = 6793, - I_PMULLD = 8276, I_PMULLW = 6530, I_PMULUDQ = 7088, I_POP = 22, I_POPA = 98, - I_POPCNT = 4372, I_POPF = 277, I_POR = 6953, I_PREFETCH = 1906, I_PREFETCHNTA = 2436, - I_PREFETCHT0 = 2449, I_PREFETCHT1 = 2461, I_PREFETCHT2 = 2473, I_PREFETCHW = 1916, - I_PSADBW = 7126, I_PSHUFB = 7375, I_PSHUFD = 4022, I_PSHUFHW = 4030, I_PSHUFLW = 4039, - I_PSHUFW = 4014, I_PSIGNB = 7521, I_PSIGND = 7555, I_PSIGNW = 7538, I_PSLLD = 7058, - I_PSLLDQ = 9881, I_PSLLQ = 7073, I_PSLLW = 7043, I_PSRAD = 6744, I_PSRAW = 6729, - I_PSRLD = 6485, I_PSRLDQ = 9864, I_PSRLQ = 6500, I_PSRLW = 6470, I_PSUBB = 7178, - I_PSUBD = 7208, I_PSUBQ = 7223, I_PSUBSB = 6902, I_PSUBSW = 6919, I_PSUBUSB = 6586, - I_PSUBUSW = 6605, I_PSUBW = 7193, I_PSWAPD = 2104, I_PTEST = 7663, I_PUNPCKHBW = 3814, - I_PUNPCKHDQ = 3860, I_PUNPCKHQDQ = 3929, I_PUNPCKHWD = 3837, I_PUNPCKLBW = 3646, - I_PUNPCKLDQ = 3692, I_PUNPCKLQDQ = 3904, I_PUNPCKLWD = 3669, I_PUSH = 16, - I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7015, I_RCL = 977, I_RCPPS = 2987, I_RCPSS = 2994, - I_RCR = 982, I_RDFSBASE = 9916, I_RDGSBASE = 9946, I_RDMSR = 600, I_RDPMC = 607, - I_RDRAND = 10060, I_RDTSC = 593, I_RDTSCP = 1898, I_RET = 325, I_RETF = 354, - I_ROL = 967, I_ROR = 972, I_ROUNDPD = 9330, I_ROUNDPS = 9311, I_ROUNDSD = 9368, - I_ROUNDSS = 9349, I_RSM = 882, I_RSQRTPS = 2949, I_RSQRTSS = 2958, I_SAHF = 283, - I_SAL = 997, I_SALC = 394, I_SAR = 1002, I_SBB = 36, I_SCAS = 319, I_SETA = 807, - I_SETAE = 780, I_SETB = 774, I_SETBE = 800, I_SETG = 859, I_SETGE = 845, I_SETL = 839, - I_SETLE = 852, I_SETNO = 767, I_SETNP = 832, I_SETNS = 819, I_SETNZ = 793, - I_SETO = 761, I_SETP = 826, I_SETS = 813, I_SETZ = 787, I_SFENCE = 4355, I_SGDT = 1691, - I_SHL = 987, I_SHLD = 876, I_SHR = 992, I_SHRD = 892, I_SHUFPD = 6370, I_SHUFPS = 6362, - I_SIDT = 1697, I_SKINIT = 1873, I_SLDT = 1657, I_SMSW = 1715, I_SQRTPD = 2889, - I_SQRTPS = 2881, I_SQRTSD = 2905, I_SQRTSS = 2897, I_STAC = 1793, I_STC = 497, - I_STD = 517, I_STGI = 1861, I_STI = 507, I_STMXCSR = 9985, I_STOS = 307, I_STR = 1663, - I_SUB = 51, I_SUBPD = 3413, I_SUBPS = 3406, I_SUBSD = 3427, I_SUBSS = 3420, - I_SWAPGS = 1890, I_SYSCALL = 532, I_SYSENTER = 614, I_SYSEXIT = 624, I_SYSRET = 547, - I_TEST = 206, I_TZCNT = 4385, I_UCOMISD = 2776, I_UCOMISS = 2767, I_UD2 = 569, - I_UNPCKHPD = 2330, I_UNPCKHPS = 2320, I_UNPCKLPD = 2288, I_UNPCKLPS = 2278, - I_VADDPD = 3173, I_VADDPS = 3165, I_VADDSD = 3189, I_VADDSS = 3181, I_VADDSUBPD = 6448, - I_VADDSUBPS = 6459, I_VAESDEC = 9251, I_VAESDECLAST = 9272, I_VAESENC = 9209, - I_VAESENCLAST = 9230, I_VAESIMC = 9192, I_VAESKEYGENASSIST = 9846, I_VANDNPD = 3072, - I_VANDNPS = 3063, I_VANDPD = 3039, I_VANDPS = 3031, I_VBLENDPD = 9415, I_VBLENDPS = 9396, - I_VBLENDVPD = 9715, I_VBLENDVPS = 9704, I_VBROADCASTF128 = 7706, I_VBROADCASTSD = 7692, - I_VBROADCASTSS = 7678, I_VCMPEQPD = 5122, I_VCMPEQPS = 4720, I_VCMPEQSD = 5926, - I_VCMPEQSS = 5524, I_VCMPEQ_OSPD = 5303, I_VCMPEQ_OSPS = 4901, I_VCMPEQ_OSSD = 6107, - I_VCMPEQ_OSSS = 5705, I_VCMPEQ_UQPD = 5209, I_VCMPEQ_UQPS = 4807, I_VCMPEQ_UQSD = 6013, - I_VCMPEQ_UQSS = 5611, I_VCMPEQ_USPD = 5412, I_VCMPEQ_USPS = 5010, I_VCMPEQ_USSD = 6216, - I_VCMPEQ_USSS = 5814, I_VCMPFALSEPD = 5244, I_VCMPFALSEPS = 4842, I_VCMPFALSESD = 6048, - I_VCMPFALSESS = 5646, I_VCMPFALSE_OSPD = 5453, I_VCMPFALSE_OSPS = 5051, I_VCMPFALSE_OSSD = 6257, - I_VCMPFALSE_OSSS = 5855, I_VCMPGEPD = 5271, I_VCMPGEPS = 4869, I_VCMPGESD = 6075, - I_VCMPGESS = 5673, I_VCMPGE_OQPD = 5483, I_VCMPGE_OQPS = 5081, I_VCMPGE_OQSD = 6287, - I_VCMPGE_OQSS = 5885, I_VCMPGTPD = 5281, I_VCMPGTPS = 4879, I_VCMPGTSD = 6085, - I_VCMPGTSS = 5683, I_VCMPGT_OQPD = 5496, I_VCMPGT_OQPS = 5094, I_VCMPGT_OQSD = 6300, - I_VCMPGT_OQSS = 5898, I_VCMPLEPD = 5142, I_VCMPLEPS = 4740, I_VCMPLESD = 5946, - I_VCMPLESS = 5544, I_VCMPLE_OQPD = 5329, I_VCMPLE_OQPS = 4927, I_VCMPLE_OQSD = 6133, - I_VCMPLE_OQSS = 5731, I_VCMPLTPD = 5132, I_VCMPLTPS = 4730, I_VCMPLTSD = 5936, - I_VCMPLTSS = 5534, I_VCMPLT_OQPD = 5316, I_VCMPLT_OQPS = 4914, I_VCMPLT_OQSD = 6120, - I_VCMPLT_OQSS = 5718, I_VCMPNEQPD = 5165, I_VCMPNEQPS = 4763, I_VCMPNEQSD = 5969, - I_VCMPNEQSS = 5567, I_VCMPNEQ_OQPD = 5257, I_VCMPNEQ_OQPS = 4855, I_VCMPNEQ_OQSD = 6061, - I_VCMPNEQ_OQSS = 5659, I_VCMPNEQ_OSPD = 5469, I_VCMPNEQ_OSPS = 5067, I_VCMPNEQ_OSSD = 6273, - I_VCMPNEQ_OSSS = 5871, I_VCMPNEQ_USPD = 5357, I_VCMPNEQ_USPS = 4955, I_VCMPNEQ_USSD = 6161, - I_VCMPNEQ_USSS = 5759, I_VCMPNGEPD = 5222, I_VCMPNGEPS = 4820, I_VCMPNGESD = 6026, - I_VCMPNGESS = 5624, I_VCMPNGE_UQPD = 5425, I_VCMPNGE_UQPS = 5023, I_VCMPNGE_UQSD = 6229, - I_VCMPNGE_UQSS = 5827, I_VCMPNGTPD = 5233, I_VCMPNGTPS = 4831, I_VCMPNGTSD = 6037, - I_VCMPNGTSS = 5635, I_VCMPNGT_UQPD = 5439, I_VCMPNGT_UQPS = 5037, I_VCMPNGT_UQSD = 6243, - I_VCMPNGT_UQSS = 5841, I_VCMPNLEPD = 5187, I_VCMPNLEPS = 4785, I_VCMPNLESD = 5991, - I_VCMPNLESS = 5589, I_VCMPNLE_UQPD = 5385, I_VCMPNLE_UQPS = 4983, I_VCMPNLE_UQSD = 6189, - I_VCMPNLE_UQSS = 5787, I_VCMPNLTPD = 5176, I_VCMPNLTPS = 4774, I_VCMPNLTSD = 5980, - I_VCMPNLTSS = 5578, I_VCMPNLT_UQPD = 5371, I_VCMPNLT_UQPS = 4969, I_VCMPNLT_UQSD = 6175, - I_VCMPNLT_UQSS = 5773, I_VCMPORDPD = 5198, I_VCMPORDPS = 4796, I_VCMPORDSD = 6002, - I_VCMPORDSS = 5600, I_VCMPORD_SPD = 5399, I_VCMPORD_SPS = 4997, I_VCMPORD_SSD = 6203, - I_VCMPORD_SSS = 5801, I_VCMPTRUEPD = 5291, I_VCMPTRUEPS = 4889, I_VCMPTRUESD = 6095, - I_VCMPTRUESS = 5693, I_VCMPTRUE_USPD = 5509, I_VCMPTRUE_USPS = 5107, I_VCMPTRUE_USSD = 6313, - I_VCMPTRUE_USSS = 5911, I_VCMPUNORDPD = 5152, I_VCMPUNORDPS = 4750, I_VCMPUNORDSD = 5956, - I_VCMPUNORDSS = 5554, I_VCMPUNORD_SPD = 5342, I_VCMPUNORD_SPS = 4940, I_VCMPUNORD_SSD = 6146, - I_VCMPUNORD_SSS = 5744, I_VCOMISD = 2830, I_VCOMISS = 2821, I_VCVTDQ2PD = 6853, - I_VCVTDQ2PS = 3372, I_VCVTPD2DQ = 6864, I_VCVTPD2PS = 3308, I_VCVTPS2DQ = 3383, - I_VCVTPS2PD = 3297, I_VCVTSD2SI = 2756, I_VCVTSD2SS = 3330, I_VCVTSI2SD = 2570, - I_VCVTSI2SS = 2559, I_VCVTSS2SD = 3319, I_VCVTSS2SI = 2745, I_VCVTTPD2DQ = 6841, - I_VCVTTPS2DQ = 3394, I_VCVTTSD2SI = 2693, I_VCVTTSS2SI = 2681, I_VDIVPD = 3562, - I_VDIVPS = 3554, I_VDIVSD = 3578, I_VDIVSS = 3570, I_VDPPD = 9655, I_VDPPS = 9642, - I_VERR = 1679, I_VERW = 1685, I_VEXTRACTF128 = 9550, I_VEXTRACTPS = 9525, - I_VFMADD132PD = 8421, I_VFMADD132PS = 8408, I_VFMADD132SD = 8447, I_VFMADD132SS = 8434, - I_VFMADD213PD = 8701, I_VFMADD213PS = 8688, I_VFMADD213SD = 8727, I_VFMADD213SS = 8714, - I_VFMADD231PD = 8981, I_VFMADD231PS = 8968, I_VFMADD231SD = 9007, I_VFMADD231SS = 8994, - I_VFMADDSUB132PD = 8360, I_VFMADDSUB132PS = 8344, I_VFMADDSUB213PD = 8640, - I_VFMADDSUB213PS = 8624, I_VFMADDSUB231PD = 8920, I_VFMADDSUB231PS = 8904, - I_VFMSUB132PD = 8473, I_VFMSUB132PS = 8460, I_VFMSUB132SD = 8499, I_VFMSUB132SS = 8486, - I_VFMSUB213PD = 8753, I_VFMSUB213PS = 8740, I_VFMSUB213SD = 8779, I_VFMSUB213SS = 8766, - I_VFMSUB231PD = 9033, I_VFMSUB231PS = 9020, I_VFMSUB231SD = 9059, I_VFMSUB231SS = 9046, - I_VFMSUBADD132PD = 8392, I_VFMSUBADD132PS = 8376, I_VFMSUBADD213PD = 8672, - I_VFMSUBADD213PS = 8656, I_VFMSUBADD231PD = 8952, I_VFMSUBADD231PS = 8936, - I_VFNMADD132PD = 8526, I_VFNMADD132PS = 8512, I_VFNMADD132SD = 8554, I_VFNMADD132SS = 8540, - I_VFNMADD213PD = 8806, I_VFNMADD213PS = 8792, I_VFNMADD213SD = 8834, I_VFNMADD213SS = 8820, - I_VFNMADD231PD = 9086, I_VFNMADD231PS = 9072, I_VFNMADD231SD = 9114, I_VFNMADD231SS = 9100, - I_VFNMSUB132PD = 8582, I_VFNMSUB132PS = 8568, I_VFNMSUB132SD = 8610, I_VFNMSUB132SS = 8596, - I_VFNMSUB213PD = 8862, I_VFNMSUB213PS = 8848, I_VFNMSUB213SD = 8890, I_VFNMSUB213SS = 8876, - I_VFNMSUB231PD = 9142, I_VFNMSUB231PS = 9128, I_VFNMSUB231SD = 9170, I_VFNMSUB231SS = 9156, - I_VHADDPD = 4231, I_VHADDPS = 4240, I_VHSUBPD = 4265, I_VHSUBPS = 4274, I_VINSERTF128 = 9537, - I_VINSERTPS = 9591, I_VLDDQU = 7035, I_VLDMXCSR = 9975, I_VMASKMOVDQU = 7165, - I_VMASKMOVPD = 7983, I_VMASKMOVPS = 7971, I_VMAXPD = 3622, I_VMAXPS = 3614, - I_VMAXSD = 3638, I_VMAXSS = 3630, I_VMCALL = 1735, I_VMCLEAR = 10023, I_VMFUNC = 1815, - I_VMINPD = 3502, I_VMINPS = 3494, I_VMINSD = 3518, I_VMINSS = 3510, I_VMLAUNCH = 1743, - I_VMLOAD = 1845, I_VMMCALL = 1836, I_VMOVAPD = 2510, I_VMOVAPS = 2501, I_VMOVD = 3966, - I_VMOVDDUP = 2268, I_VMOVDQA = 3996, I_VMOVDQU = 4005, I_VMOVHLPS = 2229, - I_VMOVHPD = 2416, I_VMOVHPS = 2407, I_VMOVLHPS = 2397, I_VMOVLPD = 2248, I_VMOVLPS = 2239, - I_VMOVMSKPD = 2870, I_VMOVMSKPS = 2859, I_VMOVNTDQ = 6892, I_VMOVNTDQA = 7939, - I_VMOVNTPD = 2627, I_VMOVNTPS = 2617, I_VMOVQ = 3973, I_VMOVSD = 2177, I_VMOVSHDUP = 2425, - I_VMOVSLDUP = 2257, I_VMOVSS = 2169, I_VMOVUPD = 2160, I_VMOVUPS = 2151, I_VMPSADBW = 9671, - I_VMPTRLD = 10014, I_VMPTRST = 6419, I_VMREAD = 4162, I_VMRESUME = 1753, I_VMRUN = 1829, - I_VMSAVE = 1853, I_VMULPD = 3233, I_VMULPS = 3225, I_VMULSD = 3249, I_VMULSS = 3241, - I_VMWRITE = 4186, I_VMXOFF = 1763, I_VMXON = 10032, I_VORPD = 3100, I_VORPS = 3093, - I_VPABSB = 7729, I_VPABSD = 7759, I_VPABSW = 7744, I_VPACKSSDW = 3893, I_VPACKSSWB = 3725, - I_VPACKUSDW = 7960, I_VPACKUSWB = 3803, I_VPADDB = 7245, I_VPADDD = 7275, - I_VPADDQ = 6522, I_VPADDSB = 6972, I_VPADDSW = 6989, I_VPADDUSW = 6663, I_VPADDW = 7260, - I_VPALIGNR = 9453, I_VPAND = 6647, I_VPANDN = 6706, I_VPAVGB = 6721, I_VPAVGW = 6766, - I_VPBLENDVB = 9726, I_VPBLENDW = 9434, I_VPCLMULQDQ = 9692, I_VPCMPEQB = 4086, - I_VPCMPEQD = 4124, I_VPCMPEQQ = 7919, I_VPCMPEQW = 4105, I_VPCMPESTRI = 9771, - I_VPCMPESTRM = 9748, I_VPCMPGTB = 3745, I_VPCMPGTD = 3783, I_VPCMPGTQ = 8130, - I_VPCMPGTW = 3764, I_VPCMPISTRI = 9817, I_VPCMPISTRM = 9794, I_VPERM2F128 = 9299, - I_VPERMILPD = 7604, I_VPERMILPS = 7593, I_VPEXTRB = 9471, I_VPEXTRD = 9496, - I_VPEXTRQ = 9505, I_VPEXTRW = 6353, I_VPHADDD = 7417, I_VPHADDSW = 7435, I_VPHADDW = 7400, - I_VPHMINPOSUW = 8305, I_VPHSUBD = 7493, I_VPHSUBSW = 7511, I_VPHSUBW = 7476, - I_VPINSRB = 9572, I_VPINSRD = 9618, I_VPINSRQ = 9627, I_VPINSRW = 6336, I_VPMADDUBSW = 7456, - I_VPMADDWD = 7116, I_VPMAXSB = 8216, I_VPMAXSD = 8233, I_VPMAXSW = 7006, I_VPMAXUB = 6690, - I_VPMAXUD = 8267, I_VPMAXUW = 8250, I_VPMINSB = 8148, I_VPMINSD = 8165, I_VPMINSW = 6944, - I_VPMINUB = 6632, I_VPMINUD = 8199, I_VPMINUW = 8182, I_VPMOVMSKB = 6575, - I_VPMOVSXBD = 7798, I_VPMOVSXBQ = 7819, I_VPMOVSXBW = 7777, I_VPMOVSXDQ = 7882, - I_VPMOVSXWD = 7840, I_VPMOVSXWQ = 7861, I_VPMOVZXBD = 8026, I_VPMOVZXBQ = 8047, - I_VPMOVZXBW = 8005, I_VPMOVZXDQ = 8110, I_VPMOVZXWD = 8068, I_VPMOVZXWQ = 8089, - I_VPMULDQ = 7901, I_VPMULHRSW = 7582, I_VPMULHUW = 6783, I_VPMULHW = 6801, - I_VPMULLD = 8284, I_VPMULLW = 6538, I_VPMULUDQ = 7097, I_VPOR = 6958, I_VPSADBW = 7134, - I_VPSHUFB = 7383, I_VPSHUFD = 4048, I_VPSHUFHW = 4057, I_VPSHUFLW = 4067, - I_VPSIGNB = 7529, I_VPSIGND = 7563, I_VPSIGNW = 7546, I_VPSLLD = 7065, I_VPSLLDQ = 9889, - I_VPSLLQ = 7080, I_VPSLLW = 7050, I_VPSRAD = 6751, I_VPSRAW = 6736, I_VPSRLD = 6492, - I_VPSRLDQ = 9872, I_VPSRLQ = 6507, I_VPSRLW = 6477, I_VPSUBB = 7185, I_VPSUBD = 7215, - I_VPSUBQ = 7230, I_VPSUBSB = 6910, I_VPSUBSW = 6927, I_VPSUBUSB = 6595, I_VPSUBUSW = 6614, - I_VPSUBW = 7200, I_VPTEST = 7670, I_VPUNPCKHBW = 3825, I_VPUNPCKHDQ = 3871, - I_VPUNPCKHQDQ = 3941, I_VPUNPCKHWD = 3848, I_VPUNPCKLBW = 3657, I_VPUNPCKLDQ = 3703, - I_VPUNPCKLQDQ = 3916, I_VPUNPCKLWD = 3680, I_VPXOR = 7021, I_VRCPPS = 3001, - I_VRCPSS = 3009, I_VROUNDPD = 9339, I_VROUNDPS = 9320, I_VROUNDSD = 9377, - I_VROUNDSS = 9358, I_VRSQRTPS = 2967, I_VRSQRTSS = 2977, I_VSHUFPD = 6387, - I_VSHUFPS = 6378, I_VSQRTPD = 2922, I_VSQRTPS = 2913, I_VSQRTSD = 2940, I_VSQRTSS = 2931, - I_VSTMXCSR = 10004, I_VSUBPD = 3442, I_VSUBPS = 3434, I_VSUBSD = 3458, I_VSUBSS = 3450, - I_VTESTPD = 7624, I_VTESTPS = 7615, I_VUCOMISD = 2795, I_VUCOMISS = 2785, - I_VUNPCKHPD = 2351, I_VUNPCKHPS = 2340, I_VUNPCKLPD = 2309, I_VUNPCKLPS = 2298, - I_VXORPD = 3129, I_VXORPS = 3121, I_VZEROALL = 4152, I_VZEROUPPER = 4140, - I_WAIT = 10054, I_WBINVD = 561, I_WRFSBASE = 9965, I_WRGSBASE = 9994, I_WRMSR = 586, - I_XABORT = 1007, I_XADD = 946, I_XBEGIN = 1015, I_XCHG = 212, I_XEND = 1823, - I_XGETBV = 1799, I_XLAT = 400, I_XOR = 61, I_XORPD = 3114, I_XORPS = 3107, - I_XRSTOR = 4307, I_XRSTOR64 = 4315, I_XSAVE = 4283, I_XSAVE64 = 4290, I_XSAVEOPT = 4333, - I_XSAVEOPT64 = 4343, I_XSETBV = 1807, I__3DNOW = 10068 + I_JRCXZ = 439, I_JS = 170, I_JZ = 152, I_LAHF = 289, I_LAR = 521, I_LDDQU = 7027, + I_LDMXCSR = 9955, I_LDS = 335, I_LEA = 223, I_LEAVE = 347, I_LES = 330, I_LFENCE = 4298, + I_LFS = 916, I_LGDT = 1702, I_LGS = 921, I_LIDT = 1708, I_LLDT = 1667, I_LMSW = 1720, + I_LODS = 313, I_LOOP = 420, I_LOOPNZ = 405, I_LOOPZ = 413, I_LSL = 526, I_LSS = 906, + I_LTR = 1673, I_LZCNT = 4396, I_MASKMOVDQU = 7152, I_MASKMOVQ = 7142, I_MAXPD = 3592, + I_MAXPS = 3585, I_MAXSD = 3606, I_MAXSS = 3599, I_MFENCE = 4324, I_MINPD = 3472, + I_MINPS = 3465, I_MINSD = 3486, I_MINSS = 3479, I_MONITOR = 1770, I_MOV = 218, + I_MOVAPD = 2492, I_MOVAPS = 2484, I_MOVBE = 9284, I_MOVD = 3953, I_MOVDDUP = 2219, + I_MOVDQ2Q = 6555, I_MOVDQA = 3979, I_MOVDQU = 3987, I_MOVHLPS = 2184, I_MOVHPD = 2378, + I_MOVHPS = 2370, I_MOVLHPS = 2361, I_MOVLPD = 2201, I_MOVLPS = 2193, I_MOVMSKPD = 2848, + I_MOVMSKPS = 2838, I_MOVNTDQ = 6882, I_MOVNTDQA = 7928, I_MOVNTI = 951, I_MOVNTPD = 2589, + I_MOVNTPS = 2580, I_MOVNTQ = 6874, I_MOVNTSD = 2607, I_MOVNTSS = 2598, I_MOVQ = 3959, + I_MOVQ2DQ = 6546, I_MOVS = 295, I_MOVSD = 2143, I_MOVSHDUP = 2386, I_MOVSLDUP = 2209, + I_MOVSS = 2136, I_MOVSX = 938, I_MOVSXD = 10038, I_MOVUPD = 2128, I_MOVUPS = 2120, + I_MOVZX = 926, I_MPSADBW = 9661, I_MUL = 1640, I_MULPD = 3203, I_MULPS = 3196, + I_MULSD = 3217, I_MULSS = 3210, I_MWAIT = 1779, I_NEG = 1635, I_NOP = 580, + I_NOT = 1630, I_OR = 27, I_ORPD = 3086, I_ORPS = 3080, I_OUT = 450, I_OUTS = 128, + I_PABSB = 7721, I_PABSD = 7751, I_PABSW = 7736, I_PACKSSDW = 3882, I_PACKSSWB = 3714, + I_PACKUSDW = 7949, I_PACKUSWB = 3792, I_PADDB = 7237, I_PADDD = 7267, I_PADDQ = 6514, + I_PADDSB = 6963, I_PADDSW = 6980, I_PADDUSB = 6653, I_PADDUSW = 6672, I_PADDW = 7252, + I_PALIGNR = 9443, I_PAND = 6640, I_PANDN = 6698, I_PAUSE = 10046, I_PAVGB = 6713, + I_PAVGUSB = 2111, I_PAVGW = 6758, I_PBLENDVB = 7632, I_PBLENDW = 9424, I_PCLMULQDQ = 9680, + I_PCMPEQB = 4076, I_PCMPEQD = 4114, I_PCMPEQQ = 7909, I_PCMPEQW = 4095, I_PCMPESTRI = 9759, + I_PCMPESTRM = 9736, I_PCMPGTB = 3735, I_PCMPGTD = 3773, I_PCMPGTQ = 8120, + I_PCMPGTW = 3754, I_PCMPISTRI = 9805, I_PCMPISTRM = 9782, I_PEXTRB = 9462, + I_PEXTRD = 9479, I_PEXTRQ = 9487, I_PEXTRW = 6344, I_PF2ID = 1947, I_PF2IW = 1940, + I_PFACC = 2061, I_PFADD = 2010, I_PFCMPEQ = 2068, I_PFCMPGE = 1971, I_PFCMPGT = 2017, + I_PFMAX = 2026, I_PFMIN = 1980, I_PFMUL = 2077, I_PFNACC = 1954, I_PFPNACC = 1962, + I_PFRCP = 1987, I_PFRCPIT1 = 2033, I_PFRCPIT2 = 2084, I_PFRSQIT1 = 2043, I_PFRSQRT = 1994, + I_PFSUB = 2003, I_PFSUBR = 2053, I_PHADDD = 7408, I_PHADDSW = 7425, I_PHADDW = 7391, + I_PHMINPOSUW = 8292, I_PHSUBD = 7484, I_PHSUBSW = 7501, I_PHSUBW = 7467, I_PI2FD = 1933, + I_PI2FW = 1926, I_PINSRB = 9563, I_PINSRD = 9601, I_PINSRQ = 9609, I_PINSRW = 6327, + I_PMADDUBSW = 7444, I_PMADDWD = 7106, I_PMAXSB = 8207, I_PMAXSD = 8224, I_PMAXSW = 6997, + I_PMAXUB = 6681, I_PMAXUD = 8258, I_PMAXUW = 8241, I_PMINSB = 8139, I_PMINSD = 8156, + I_PMINSW = 6935, I_PMINUB = 6623, I_PMINUD = 8190, I_PMINUW = 8173, I_PMOVMSKB = 6564, + I_PMOVSXBD = 7787, I_PMOVSXBQ = 7808, I_PMOVSXBW = 7766, I_PMOVSXDQ = 7871, + I_PMOVSXWD = 7829, I_PMOVSXWQ = 7850, I_PMOVZXBD = 8015, I_PMOVZXBQ = 8036, + I_PMOVZXBW = 7994, I_PMOVZXDQ = 8099, I_PMOVZXWD = 8057, I_PMOVZXWQ = 8078, + I_PMULDQ = 7892, I_PMULHRSW = 7571, I_PMULHRW = 2094, I_PMULHUW = 6773, I_PMULHW = 6792, + I_PMULLD = 8275, I_PMULLW = 6529, I_PMULUDQ = 7087, I_POP = 22, I_POPA = 98, + I_POPCNT = 4371, I_POPF = 277, I_POR = 6952, I_PREFETCH = 1905, I_PREFETCHNTA = 2435, + I_PREFETCHT0 = 2448, I_PREFETCHT1 = 2460, I_PREFETCHT2 = 2472, I_PREFETCHW = 1915, + I_PSADBW = 7125, I_PSHUFB = 7374, I_PSHUFD = 4021, I_PSHUFHW = 4029, I_PSHUFLW = 4038, + I_PSHUFW = 4013, I_PSIGNB = 7520, I_PSIGND = 7554, I_PSIGNW = 7537, I_PSLLD = 7057, + I_PSLLDQ = 9880, I_PSLLQ = 7072, I_PSLLW = 7042, I_PSRAD = 6743, I_PSRAW = 6728, + I_PSRLD = 6484, I_PSRLDQ = 9863, I_PSRLQ = 6499, I_PSRLW = 6469, I_PSUBB = 7177, + I_PSUBD = 7207, I_PSUBQ = 7222, I_PSUBSB = 6901, I_PSUBSW = 6918, I_PSUBUSB = 6585, + I_PSUBUSW = 6604, I_PSUBW = 7192, I_PSWAPD = 2103, I_PTEST = 7662, I_PUNPCKHBW = 3813, + I_PUNPCKHDQ = 3859, I_PUNPCKHQDQ = 3928, I_PUNPCKHWD = 3836, I_PUNPCKLBW = 3645, + I_PUNPCKLDQ = 3691, I_PUNPCKLQDQ = 3903, I_PUNPCKLWD = 3668, I_PUSH = 16, + I_PUSHA = 91, I_PUSHF = 270, I_PXOR = 7014, I_RCL = 976, I_RCPPS = 2986, I_RCPSS = 2993, + I_RCR = 981, I_RDFSBASE = 9915, I_RDGSBASE = 9945, I_RDMSR = 599, I_RDPMC = 606, + I_RDRAND = 10059, I_RDTSC = 592, I_RDTSCP = 1897, I_RET = 325, I_RETF = 354, + I_ROL = 966, I_ROR = 971, I_ROUNDPD = 9329, I_ROUNDPS = 9310, I_ROUNDSD = 9367, + I_ROUNDSS = 9348, I_RSM = 881, I_RSQRTPS = 2948, I_RSQRTSS = 2957, I_SAHF = 283, + I_SAL = 996, I_SALC = 393, I_SAR = 1001, I_SBB = 36, I_SCAS = 319, I_SETA = 806, + I_SETAE = 779, I_SETB = 773, I_SETBE = 799, I_SETG = 858, I_SETGE = 844, I_SETL = 838, + I_SETLE = 851, I_SETNO = 766, I_SETNP = 831, I_SETNS = 818, I_SETNZ = 792, + I_SETO = 760, I_SETP = 825, I_SETS = 812, I_SETZ = 786, I_SFENCE = 4354, I_SGDT = 1690, + I_SHL = 986, I_SHLD = 875, I_SHR = 991, I_SHRD = 891, I_SHUFPD = 6369, I_SHUFPS = 6361, + I_SIDT = 1696, I_SKINIT = 1872, I_SLDT = 1656, I_SMSW = 1714, I_SQRTPD = 2888, + I_SQRTPS = 2880, I_SQRTSD = 2904, I_SQRTSS = 2896, I_STAC = 1792, I_STC = 496, + I_STD = 516, I_STGI = 1860, I_STI = 506, I_STMXCSR = 9984, I_STOS = 307, I_STR = 1662, + I_SUB = 51, I_SUBPD = 3412, I_SUBPS = 3405, I_SUBSD = 3426, I_SUBSS = 3419, + I_SWAPGS = 1889, I_SYSCALL = 531, I_SYSENTER = 613, I_SYSEXIT = 623, I_SYSRET = 546, + I_TEST = 206, I_TZCNT = 4384, I_UCOMISD = 2775, I_UCOMISS = 2766, I_UD2 = 568, + I_UNPCKHPD = 2329, I_UNPCKHPS = 2319, I_UNPCKLPD = 2287, I_UNPCKLPS = 2277, + I_VADDPD = 3172, I_VADDPS = 3164, I_VADDSD = 3188, I_VADDSS = 3180, I_VADDSUBPD = 6447, + I_VADDSUBPS = 6458, I_VAESDEC = 9250, I_VAESDECLAST = 9271, I_VAESENC = 9208, + I_VAESENCLAST = 9229, I_VAESIMC = 9191, I_VAESKEYGENASSIST = 9845, I_VANDNPD = 3071, + I_VANDNPS = 3062, I_VANDPD = 3038, I_VANDPS = 3030, I_VBLENDPD = 9414, I_VBLENDPS = 9395, + I_VBLENDVPD = 9714, I_VBLENDVPS = 9703, I_VBROADCASTF128 = 7705, I_VBROADCASTSD = 7691, + I_VBROADCASTSS = 7677, I_VCMPEQPD = 5121, I_VCMPEQPS = 4719, I_VCMPEQSD = 5925, + I_VCMPEQSS = 5523, I_VCMPEQ_OSPD = 5302, I_VCMPEQ_OSPS = 4900, I_VCMPEQ_OSSD = 6106, + I_VCMPEQ_OSSS = 5704, I_VCMPEQ_UQPD = 5208, I_VCMPEQ_UQPS = 4806, I_VCMPEQ_UQSD = 6012, + I_VCMPEQ_UQSS = 5610, I_VCMPEQ_USPD = 5411, I_VCMPEQ_USPS = 5009, I_VCMPEQ_USSD = 6215, + I_VCMPEQ_USSS = 5813, I_VCMPFALSEPD = 5243, I_VCMPFALSEPS = 4841, I_VCMPFALSESD = 6047, + I_VCMPFALSESS = 5645, I_VCMPFALSE_OSPD = 5452, I_VCMPFALSE_OSPS = 5050, I_VCMPFALSE_OSSD = 6256, + I_VCMPFALSE_OSSS = 5854, I_VCMPGEPD = 5270, I_VCMPGEPS = 4868, I_VCMPGESD = 6074, + I_VCMPGESS = 5672, I_VCMPGE_OQPD = 5482, I_VCMPGE_OQPS = 5080, I_VCMPGE_OQSD = 6286, + I_VCMPGE_OQSS = 5884, I_VCMPGTPD = 5280, I_VCMPGTPS = 4878, I_VCMPGTSD = 6084, + I_VCMPGTSS = 5682, I_VCMPGT_OQPD = 5495, I_VCMPGT_OQPS = 5093, I_VCMPGT_OQSD = 6299, + I_VCMPGT_OQSS = 5897, I_VCMPLEPD = 5141, I_VCMPLEPS = 4739, I_VCMPLESD = 5945, + I_VCMPLESS = 5543, I_VCMPLE_OQPD = 5328, I_VCMPLE_OQPS = 4926, I_VCMPLE_OQSD = 6132, + I_VCMPLE_OQSS = 5730, I_VCMPLTPD = 5131, I_VCMPLTPS = 4729, I_VCMPLTSD = 5935, + I_VCMPLTSS = 5533, I_VCMPLT_OQPD = 5315, I_VCMPLT_OQPS = 4913, I_VCMPLT_OQSD = 6119, + I_VCMPLT_OQSS = 5717, I_VCMPNEQPD = 5164, I_VCMPNEQPS = 4762, I_VCMPNEQSD = 5968, + I_VCMPNEQSS = 5566, I_VCMPNEQ_OQPD = 5256, I_VCMPNEQ_OQPS = 4854, I_VCMPNEQ_OQSD = 6060, + I_VCMPNEQ_OQSS = 5658, I_VCMPNEQ_OSPD = 5468, I_VCMPNEQ_OSPS = 5066, I_VCMPNEQ_OSSD = 6272, + I_VCMPNEQ_OSSS = 5870, I_VCMPNEQ_USPD = 5356, I_VCMPNEQ_USPS = 4954, I_VCMPNEQ_USSD = 6160, + I_VCMPNEQ_USSS = 5758, I_VCMPNGEPD = 5221, I_VCMPNGEPS = 4819, I_VCMPNGESD = 6025, + I_VCMPNGESS = 5623, I_VCMPNGE_UQPD = 5424, I_VCMPNGE_UQPS = 5022, I_VCMPNGE_UQSD = 6228, + I_VCMPNGE_UQSS = 5826, I_VCMPNGTPD = 5232, I_VCMPNGTPS = 4830, I_VCMPNGTSD = 6036, + I_VCMPNGTSS = 5634, I_VCMPNGT_UQPD = 5438, I_VCMPNGT_UQPS = 5036, I_VCMPNGT_UQSD = 6242, + I_VCMPNGT_UQSS = 5840, I_VCMPNLEPD = 5186, I_VCMPNLEPS = 4784, I_VCMPNLESD = 5990, + I_VCMPNLESS = 5588, I_VCMPNLE_UQPD = 5384, I_VCMPNLE_UQPS = 4982, I_VCMPNLE_UQSD = 6188, + I_VCMPNLE_UQSS = 5786, I_VCMPNLTPD = 5175, I_VCMPNLTPS = 4773, I_VCMPNLTSD = 5979, + I_VCMPNLTSS = 5577, I_VCMPNLT_UQPD = 5370, I_VCMPNLT_UQPS = 4968, I_VCMPNLT_UQSD = 6174, + I_VCMPNLT_UQSS = 5772, I_VCMPORDPD = 5197, I_VCMPORDPS = 4795, I_VCMPORDSD = 6001, + I_VCMPORDSS = 5599, I_VCMPORD_SPD = 5398, I_VCMPORD_SPS = 4996, I_VCMPORD_SSD = 6202, + I_VCMPORD_SSS = 5800, I_VCMPTRUEPD = 5290, I_VCMPTRUEPS = 4888, I_VCMPTRUESD = 6094, + I_VCMPTRUESS = 5692, I_VCMPTRUE_USPD = 5508, I_VCMPTRUE_USPS = 5106, I_VCMPTRUE_USSD = 6312, + I_VCMPTRUE_USSS = 5910, I_VCMPUNORDPD = 5151, I_VCMPUNORDPS = 4749, I_VCMPUNORDSD = 5955, + I_VCMPUNORDSS = 5553, I_VCMPUNORD_SPD = 5341, I_VCMPUNORD_SPS = 4939, I_VCMPUNORD_SSD = 6145, + I_VCMPUNORD_SSS = 5743, I_VCOMISD = 2829, I_VCOMISS = 2820, I_VCVTDQ2PD = 6852, + I_VCVTDQ2PS = 3371, I_VCVTPD2DQ = 6863, I_VCVTPD2PS = 3307, I_VCVTPS2DQ = 3382, + I_VCVTPS2PD = 3296, I_VCVTSD2SI = 2755, I_VCVTSD2SS = 3329, I_VCVTSI2SD = 2569, + I_VCVTSI2SS = 2558, I_VCVTSS2SD = 3318, I_VCVTSS2SI = 2744, I_VCVTTPD2DQ = 6840, + I_VCVTTPS2DQ = 3393, I_VCVTTSD2SI = 2692, I_VCVTTSS2SI = 2680, I_VDIVPD = 3561, + I_VDIVPS = 3553, I_VDIVSD = 3577, I_VDIVSS = 3569, I_VDPPD = 9654, I_VDPPS = 9641, + I_VERR = 1678, I_VERW = 1684, I_VEXTRACTF128 = 9549, I_VEXTRACTPS = 9524, + I_VFMADD132PD = 8420, I_VFMADD132PS = 8407, I_VFMADD132SD = 8446, I_VFMADD132SS = 8433, + I_VFMADD213PD = 8700, I_VFMADD213PS = 8687, I_VFMADD213SD = 8726, I_VFMADD213SS = 8713, + I_VFMADD231PD = 8980, I_VFMADD231PS = 8967, I_VFMADD231SD = 9006, I_VFMADD231SS = 8993, + I_VFMADDSUB132PD = 8359, I_VFMADDSUB132PS = 8343, I_VFMADDSUB213PD = 8639, + I_VFMADDSUB213PS = 8623, I_VFMADDSUB231PD = 8919, I_VFMADDSUB231PS = 8903, + I_VFMSUB132PD = 8472, I_VFMSUB132PS = 8459, I_VFMSUB132SD = 8498, I_VFMSUB132SS = 8485, + I_VFMSUB213PD = 8752, I_VFMSUB213PS = 8739, I_VFMSUB213SD = 8778, I_VFMSUB213SS = 8765, + I_VFMSUB231PD = 9032, I_VFMSUB231PS = 9019, I_VFMSUB231SD = 9058, I_VFMSUB231SS = 9045, + I_VFMSUBADD132PD = 8391, I_VFMSUBADD132PS = 8375, I_VFMSUBADD213PD = 8671, + I_VFMSUBADD213PS = 8655, I_VFMSUBADD231PD = 8951, I_VFMSUBADD231PS = 8935, + I_VFNMADD132PD = 8525, I_VFNMADD132PS = 8511, I_VFNMADD132SD = 8553, I_VFNMADD132SS = 8539, + I_VFNMADD213PD = 8805, I_VFNMADD213PS = 8791, I_VFNMADD213SD = 8833, I_VFNMADD213SS = 8819, + I_VFNMADD231PD = 9085, I_VFNMADD231PS = 9071, I_VFNMADD231SD = 9113, I_VFNMADD231SS = 9099, + I_VFNMSUB132PD = 8581, I_VFNMSUB132PS = 8567, I_VFNMSUB132SD = 8609, I_VFNMSUB132SS = 8595, + I_VFNMSUB213PD = 8861, I_VFNMSUB213PS = 8847, I_VFNMSUB213SD = 8889, I_VFNMSUB213SS = 8875, + I_VFNMSUB231PD = 9141, I_VFNMSUB231PS = 9127, I_VFNMSUB231SD = 9169, I_VFNMSUB231SS = 9155, + I_VHADDPD = 4230, I_VHADDPS = 4239, I_VHSUBPD = 4264, I_VHSUBPS = 4273, I_VINSERTF128 = 9536, + I_VINSERTPS = 9590, I_VLDDQU = 7034, I_VLDMXCSR = 9974, I_VMASKMOVDQU = 7164, + I_VMASKMOVPD = 7982, I_VMASKMOVPS = 7970, I_VMAXPD = 3621, I_VMAXPS = 3613, + I_VMAXSD = 3637, I_VMAXSS = 3629, I_VMCALL = 1734, I_VMCLEAR = 10022, I_VMFUNC = 1814, + I_VMINPD = 3501, I_VMINPS = 3493, I_VMINSD = 3517, I_VMINSS = 3509, I_VMLAUNCH = 1742, + I_VMLOAD = 1844, I_VMMCALL = 1835, I_VMOVAPD = 2509, I_VMOVAPS = 2500, I_VMOVD = 3965, + I_VMOVDDUP = 2267, I_VMOVDQA = 3995, I_VMOVDQU = 4004, I_VMOVHLPS = 2228, + I_VMOVHPD = 2415, I_VMOVHPS = 2406, I_VMOVLHPS = 2396, I_VMOVLPD = 2247, I_VMOVLPS = 2238, + I_VMOVMSKPD = 2869, I_VMOVMSKPS = 2858, I_VMOVNTDQ = 6891, I_VMOVNTDQA = 7938, + I_VMOVNTPD = 2626, I_VMOVNTPS = 2616, I_VMOVQ = 3972, I_VMOVSD = 2176, I_VMOVSHDUP = 2424, + I_VMOVSLDUP = 2256, I_VMOVSS = 2168, I_VMOVUPD = 2159, I_VMOVUPS = 2150, I_VMPSADBW = 9670, + I_VMPTRLD = 10013, I_VMPTRST = 6418, I_VMREAD = 4161, I_VMRESUME = 1752, I_VMRUN = 1828, + I_VMSAVE = 1852, I_VMULPD = 3232, I_VMULPS = 3224, I_VMULSD = 3248, I_VMULSS = 3240, + I_VMWRITE = 4185, I_VMXOFF = 1762, I_VMXON = 10031, I_VORPD = 3099, I_VORPS = 3092, + I_VPABSB = 7728, I_VPABSD = 7758, I_VPABSW = 7743, I_VPACKSSDW = 3892, I_VPACKSSWB = 3724, + I_VPACKUSDW = 7959, I_VPACKUSWB = 3802, I_VPADDB = 7244, I_VPADDD = 7274, + I_VPADDQ = 6521, I_VPADDSB = 6971, I_VPADDSW = 6988, I_VPADDUSW = 6662, I_VPADDW = 7259, + I_VPALIGNR = 9452, I_VPAND = 6646, I_VPANDN = 6705, I_VPAVGB = 6720, I_VPAVGW = 6765, + I_VPBLENDVB = 9725, I_VPBLENDW = 9433, I_VPCLMULQDQ = 9691, I_VPCMPEQB = 4085, + I_VPCMPEQD = 4123, I_VPCMPEQQ = 7918, I_VPCMPEQW = 4104, I_VPCMPESTRI = 9770, + I_VPCMPESTRM = 9747, I_VPCMPGTB = 3744, I_VPCMPGTD = 3782, I_VPCMPGTQ = 8129, + I_VPCMPGTW = 3763, I_VPCMPISTRI = 9816, I_VPCMPISTRM = 9793, I_VPERM2F128 = 9298, + I_VPERMILPD = 7603, I_VPERMILPS = 7592, I_VPEXTRB = 9470, I_VPEXTRD = 9495, + I_VPEXTRQ = 9504, I_VPEXTRW = 6352, I_VPHADDD = 7416, I_VPHADDSW = 7434, I_VPHADDW = 7399, + I_VPHMINPOSUW = 8304, I_VPHSUBD = 7492, I_VPHSUBSW = 7510, I_VPHSUBW = 7475, + I_VPINSRB = 9571, I_VPINSRD = 9617, I_VPINSRQ = 9626, I_VPINSRW = 6335, I_VPMADDUBSW = 7455, + I_VPMADDWD = 7115, I_VPMAXSB = 8215, I_VPMAXSD = 8232, I_VPMAXSW = 7005, I_VPMAXUB = 6689, + I_VPMAXUD = 8266, I_VPMAXUW = 8249, I_VPMINSB = 8147, I_VPMINSD = 8164, I_VPMINSW = 6943, + I_VPMINUB = 6631, I_VPMINUD = 8198, I_VPMINUW = 8181, I_VPMOVMSKB = 6574, + I_VPMOVSXBD = 7797, I_VPMOVSXBQ = 7818, I_VPMOVSXBW = 7776, I_VPMOVSXDQ = 7881, + I_VPMOVSXWD = 7839, I_VPMOVSXWQ = 7860, I_VPMOVZXBD = 8025, I_VPMOVZXBQ = 8046, + I_VPMOVZXBW = 8004, I_VPMOVZXDQ = 8109, I_VPMOVZXWD = 8067, I_VPMOVZXWQ = 8088, + I_VPMULDQ = 7900, I_VPMULHRSW = 7581, I_VPMULHUW = 6782, I_VPMULHW = 6800, + I_VPMULLD = 8283, I_VPMULLW = 6537, I_VPMULUDQ = 7096, I_VPOR = 6957, I_VPSADBW = 7133, + I_VPSHUFB = 7382, I_VPSHUFD = 4047, I_VPSHUFHW = 4056, I_VPSHUFLW = 4066, + I_VPSIGNB = 7528, I_VPSIGND = 7562, I_VPSIGNW = 7545, I_VPSLLD = 7064, I_VPSLLDQ = 9888, + I_VPSLLQ = 7079, I_VPSLLW = 7049, I_VPSRAD = 6750, I_VPSRAW = 6735, I_VPSRLD = 6491, + I_VPSRLDQ = 9871, I_VPSRLQ = 6506, I_VPSRLW = 6476, I_VPSUBB = 7184, I_VPSUBD = 7214, + I_VPSUBQ = 7229, I_VPSUBSB = 6909, I_VPSUBSW = 6926, I_VPSUBUSB = 6594, I_VPSUBUSW = 6613, + I_VPSUBW = 7199, I_VPTEST = 7669, I_VPUNPCKHBW = 3824, I_VPUNPCKHDQ = 3870, + I_VPUNPCKHQDQ = 3940, I_VPUNPCKHWD = 3847, I_VPUNPCKLBW = 3656, I_VPUNPCKLDQ = 3702, + I_VPUNPCKLQDQ = 3915, I_VPUNPCKLWD = 3679, I_VPXOR = 7020, I_VRCPPS = 3000, + I_VRCPSS = 3008, I_VROUNDPD = 9338, I_VROUNDPS = 9319, I_VROUNDSD = 9376, + I_VROUNDSS = 9357, I_VRSQRTPS = 2966, I_VRSQRTSS = 2976, I_VSHUFPD = 6386, + I_VSHUFPS = 6377, I_VSQRTPD = 2921, I_VSQRTPS = 2912, I_VSQRTSD = 2939, I_VSQRTSS = 2930, + I_VSTMXCSR = 10003, I_VSUBPD = 3441, I_VSUBPS = 3433, I_VSUBSD = 3457, I_VSUBSS = 3449, + I_VTESTPD = 7623, I_VTESTPS = 7614, I_VUCOMISD = 2794, I_VUCOMISS = 2784, + I_VUNPCKHPD = 2350, I_VUNPCKHPS = 2339, I_VUNPCKLPD = 2308, I_VUNPCKLPS = 2297, + I_VXORPD = 3128, I_VXORPS = 3120, I_VZEROALL = 4151, I_VZEROUPPER = 4139, + I_WAIT = 10053, I_WBINVD = 560, I_WRFSBASE = 9964, I_WRGSBASE = 9993, I_WRMSR = 585, + I_XABORT = 1006, I_XADD = 945, I_XBEGIN = 1014, I_XCHG = 212, I_XEND = 1822, + I_XGETBV = 1798, I_XLAT = 399, I_XOR = 61, I_XORPD = 3113, I_XORPS = 3106, + I_XRSTOR = 4306, I_XRSTOR64 = 4314, I_XSAVE = 4282, I_XSAVE64 = 4289, I_XSAVEOPT = 4332, + I_XSAVEOPT64 = 4342, I_XSETBV = 1806, I__3DNOW = 10067 } _InstructionType; typedef enum { diff --git a/NativeCore/Dependencies/distorm/src/config.h b/NativeCore/Dependencies/distorm/src/config.h index e78dba36..6febad67 100644 --- a/NativeCore/Dependencies/distorm/src/config.h +++ b/NativeCore/Dependencies/distorm/src/config.h @@ -13,7 +13,7 @@ This library is licensed under the BSD license. See the file COPYING. #define CONFIG_H /* diStorm version number. */ -#define __DISTORMV__ 0x030502 +#define __DISTORMV__ 0x030503 #include /* memset, memcpy - can be easily self implemented for libc independency. */ diff --git a/NativeCore/Dependencies/distorm/src/insts.c b/NativeCore/Dependencies/distorm/src/insts.c index 7aab70dc..688558c1 100644 --- a/NativeCore/Dependencies/distorm/src/insts.c +++ b/NativeCore/Dependencies/distorm/src/insts.c @@ -15,15 +15,15 @@ This library is licensed under the BSD license. See the file COPYING. /* - * GENERATED BY disOps at Sat Apr 3 17:52:58 2021 + * GENERATED BY disOps at Fri Dec 17 10:22:38 2021 */ -_InstInfo II_MOVSXD = /*II*/ {0x1d7, 10039}; -_InstInfo II_NOP = /*II*/ {0x53, 581}; -_InstInfo II_PAUSE = /*II*/ {0x91, 10047}; -_InstInfo II_WAIT = /*II*/ {0x53, 10054}; -_InstInfo II_RDRAND = /*II*/ {0x1d8, 10060}; -_InstInfo II_3DNOW = /*II*/ {0x1d9, 10068}; +_InstInfo II_MOVSXD = /*II*/ {0x1d7, 10038}; +_InstInfo II_NOP = /*II*/ {0x53, 580}; +_InstInfo II_PAUSE = /*II*/ {0x91, 10046}; +_InstInfo II_WAIT = /*II*/ {0x53, 10053}; +_InstInfo II_RDRAND = /*II*/ {0x1d8, 10059}; +_InstInfo II_3DNOW = /*II*/ {0x1d9, 10067}; _iflags FlagsTable[101] = { 0x80000011, @@ -316,75 +316,75 @@ _InstInfo InstInfos[1248] = { /*II_C9*/ {0x6a, 347}, /*II_CA*/ {0x6b, 354}, /*II_CB*/ {0x6c, 354}, - /*II_CC*/ {0x6d, 360}, - /*II_CD*/ {0x6e, 367}, - /*II_CE*/ {0x6f, 372}, - /*II_CF*/ {0x70, 378}, - /*II_D4*/ {0x71, 384}, - /*II_D5*/ {0x71, 389}, - /*II_D6*/ {0x72, 394}, - /*II_D7*/ {0x73, 400}, - /*II_E0*/ {0x74, 406}, - /*II_E1*/ {0x74, 414}, - /*II_E2*/ {0x75, 421}, - /*II_E4*/ {0x77, 447}, - /*II_E5*/ {0x78, 447}, - /*II_E6*/ {0x79, 451}, - /*II_E7*/ {0x7a, 451}, - /*II_E8*/ {0x7b, 456}, - /*II_E9*/ {0x7c, 462}, - /*II_EA*/ {0x7d, 467}, - /*II_EB*/ {0x7e, 462}, - /*II_EC*/ {0x7f, 447}, - /*II_ED*/ {0x80, 447}, - /*II_EE*/ {0x81, 451}, - /*II_EF*/ {0x82, 451}, - /*II_F1*/ {0x6d, 476}, - /*II_F4*/ {0x83, 482}, - /*II_F5*/ {0x84, 487}, - /*II_F8*/ {0x84, 492}, - /*II_F9*/ {0x84, 497}, - /*II_FA*/ {0x85, 502}, - /*II_FB*/ {0x85, 507}, - /*II_FC*/ {0x86, 512}, - /*II_FD*/ {0x86, 517}, - /*II_0F_02*/ {0x87, 522}, - /*II_0F_03*/ {0x87, 527}, - /*II_0F_05*/ {0x88, 532}, - /*II_0F_06*/ {0x89, 541}, - /*II_0F_07*/ {0x88, 547}, - /*II_0F_08*/ {0x89, 555}, - /*II_0F_09*/ {0x89, 561}, - /*II_0F_0B*/ {0x8a, 569}, - /*II_0F_0E*/ {0x8b, 574}, - /*II_0F_1F*/ {0x8c, 581}, + /*II_CC*/ {0x53, 360}, + /*II_CD*/ {0x6d, 366}, + /*II_CE*/ {0x6e, 371}, + /*II_CF*/ {0x6f, 377}, + /*II_D4*/ {0x70, 383}, + /*II_D5*/ {0x70, 388}, + /*II_D6*/ {0x71, 393}, + /*II_D7*/ {0x72, 399}, + /*II_E0*/ {0x73, 405}, + /*II_E1*/ {0x73, 413}, + /*II_E2*/ {0x74, 420}, + /*II_E4*/ {0x76, 446}, + /*II_E5*/ {0x77, 446}, + /*II_E6*/ {0x78, 450}, + /*II_E7*/ {0x79, 450}, + /*II_E8*/ {0x7a, 455}, + /*II_E9*/ {0x7b, 461}, + /*II_EA*/ {0x7c, 466}, + /*II_EB*/ {0x7d, 461}, + /*II_EC*/ {0x7e, 446}, + /*II_ED*/ {0x7f, 446}, + /*II_EE*/ {0x80, 450}, + /*II_EF*/ {0x81, 450}, + /*II_F1*/ {0x82, 475}, + /*II_F4*/ {0x83, 481}, + /*II_F5*/ {0x84, 486}, + /*II_F8*/ {0x84, 491}, + /*II_F9*/ {0x84, 496}, + /*II_FA*/ {0x85, 501}, + /*II_FB*/ {0x85, 506}, + /*II_FC*/ {0x86, 511}, + /*II_FD*/ {0x86, 516}, + /*II_0F_02*/ {0x87, 521}, + /*II_0F_03*/ {0x87, 526}, + /*II_0F_05*/ {0x88, 531}, + /*II_0F_06*/ {0x89, 540}, + /*II_0F_07*/ {0x88, 546}, + /*II_0F_08*/ {0x89, 554}, + /*II_0F_09*/ {0x89, 560}, + /*II_0F_0B*/ {0x8a, 568}, + /*II_0F_0E*/ {0x8b, 573}, + /*II_0F_1F*/ {0x8c, 580}, /*II_0F_20*/ {0x8d, 218}, /*II_0F_21*/ {0x8e, 218}, /*II_0F_22*/ {0x8f, 218}, /*II_0F_23*/ {0x90, 218}, - /*II_0F_30*/ {0x89, 586}, - /*II_0F_31*/ {0x89, 593}, - /*II_0F_32*/ {0x89, 600}, - /*II_0F_33*/ {0x89, 607}, - /*II_0F_34*/ {0x88, 614}, - /*II_0F_35*/ {0x88, 624}, - /*II_0F_37*/ {0x91, 633}, - /*II_0F_40*/ {0x92, 641}, - /*II_0F_41*/ {0x92, 648}, - /*II_0F_42*/ {0x93, 656}, - /*II_0F_43*/ {0x93, 663}, - /*II_0F_44*/ {0x94, 671}, - /*II_0F_45*/ {0x94, 678}, - /*II_0F_46*/ {0x95, 686}, - /*II_0F_47*/ {0x95, 694}, - /*II_0F_48*/ {0x96, 701}, - /*II_0F_49*/ {0x96, 708}, - /*II_0F_4A*/ {0x97, 716}, - /*II_0F_4B*/ {0x97, 723}, - /*II_0F_4C*/ {0x98, 731}, - /*II_0F_4D*/ {0x98, 738}, - /*II_0F_4E*/ {0x99, 746}, - /*II_0F_4F*/ {0x99, 754}, + /*II_0F_30*/ {0x89, 585}, + /*II_0F_31*/ {0x89, 592}, + /*II_0F_32*/ {0x89, 599}, + /*II_0F_33*/ {0x89, 606}, + /*II_0F_34*/ {0x88, 613}, + /*II_0F_35*/ {0x88, 623}, + /*II_0F_37*/ {0x91, 632}, + /*II_0F_40*/ {0x92, 640}, + /*II_0F_41*/ {0x92, 647}, + /*II_0F_42*/ {0x93, 655}, + /*II_0F_43*/ {0x93, 662}, + /*II_0F_44*/ {0x94, 670}, + /*II_0F_45*/ {0x94, 677}, + /*II_0F_46*/ {0x95, 685}, + /*II_0F_47*/ {0x95, 693}, + /*II_0F_48*/ {0x96, 700}, + /*II_0F_49*/ {0x96, 707}, + /*II_0F_4A*/ {0x97, 715}, + /*II_0F_4B*/ {0x97, 722}, + /*II_0F_4C*/ {0x98, 730}, + /*II_0F_4D*/ {0x98, 737}, + /*II_0F_4E*/ {0x99, 745}, + /*II_0F_4F*/ {0x99, 753}, /*II_0F_80*/ {0x9a, 134}, /*II_0F_81*/ {0x9a, 138}, /*II_0F_82*/ {0x9b, 143}, @@ -401,54 +401,54 @@ _InstInfo InstInfos[1248] = { /*II_0F_8D*/ {0xa0, 192}, /*II_0F_8E*/ {0xa1, 197}, /*II_0F_8F*/ {0xa1, 202}, - /*II_0F_90*/ {0xa2, 761}, - /*II_0F_91*/ {0xa2, 767}, - /*II_0F_92*/ {0xa3, 774}, - /*II_0F_93*/ {0xa3, 780}, - /*II_0F_94*/ {0xa4, 787}, - /*II_0F_95*/ {0xa4, 793}, - /*II_0F_96*/ {0xa5, 800}, - /*II_0F_97*/ {0xa5, 807}, - /*II_0F_98*/ {0xa6, 813}, - /*II_0F_99*/ {0xa6, 819}, - /*II_0F_9A*/ {0xa7, 826}, - /*II_0F_9B*/ {0xa7, 832}, - /*II_0F_9C*/ {0xa8, 839}, - /*II_0F_9D*/ {0xa8, 845}, - /*II_0F_9E*/ {0xa9, 852}, - /*II_0F_9F*/ {0xa9, 859}, + /*II_0F_90*/ {0xa2, 760}, + /*II_0F_91*/ {0xa2, 766}, + /*II_0F_92*/ {0xa3, 773}, + /*II_0F_93*/ {0xa3, 779}, + /*II_0F_94*/ {0xa4, 786}, + /*II_0F_95*/ {0xa4, 792}, + /*II_0F_96*/ {0xa5, 799}, + /*II_0F_97*/ {0xa5, 806}, + /*II_0F_98*/ {0xa6, 812}, + /*II_0F_99*/ {0xa6, 818}, + /*II_0F_9A*/ {0xa7, 825}, + /*II_0F_9B*/ {0xa7, 831}, + /*II_0F_9C*/ {0xa8, 838}, + /*II_0F_9D*/ {0xa8, 844}, + /*II_0F_9E*/ {0xa9, 851}, + /*II_0F_9F*/ {0xa9, 858}, /*II_0F_A0*/ {0xaa, 16}, /*II_0F_A1*/ {0xab, 22}, - /*II_0F_A2*/ {0x91, 865}, - /*II_0F_A3*/ {0xac, 872}, + /*II_0F_A2*/ {0x91, 864}, + /*II_0F_A3*/ {0xac, 871}, /*II_0F_A8*/ {0xae, 16}, /*II_0F_A9*/ {0xaf, 22}, - /*II_0F_AA*/ {0xb0, 882}, - /*II_0F_AB*/ {0xb1, 887}, + /*II_0F_AA*/ {0xb0, 881}, + /*II_0F_AB*/ {0xb1, 886}, /*II_0F_AF*/ {0xb2, 117}, - /*II_0F_B0*/ {0xb3, 898}, - /*II_0F_B1*/ {0xb4, 898}, - /*II_0F_B2*/ {0xb5, 907}, - /*II_0F_B3*/ {0xb1, 912}, - /*II_0F_B4*/ {0xb5, 917}, - /*II_0F_B5*/ {0xb5, 922}, - /*II_0F_B6*/ {0xb6, 927}, - /*II_0F_B7*/ {0xb7, 927}, - /*II_0F_B9*/ {0x8a, 569}, - /*II_0F_BB*/ {0xb1, 934}, - /*II_0F_BE*/ {0xb6, 939}, - /*II_0F_BF*/ {0xb7, 939}, - /*II_0F_C0*/ {0xb3, 946}, - /*II_0F_C1*/ {0xb4, 946}, - /*II_0F_C3*/ {0xb8, 952}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, - /*II_0F_C8*/ {0xb9, 960}, + /*II_0F_B0*/ {0xb3, 897}, + /*II_0F_B1*/ {0xb4, 897}, + /*II_0F_B2*/ {0xb5, 906}, + /*II_0F_B3*/ {0xb1, 911}, + /*II_0F_B4*/ {0xb5, 916}, + /*II_0F_B5*/ {0xb5, 921}, + /*II_0F_B6*/ {0xb6, 926}, + /*II_0F_B7*/ {0xb7, 926}, + /*II_0F_B9*/ {0x8a, 568}, + /*II_0F_BB*/ {0xb1, 933}, + /*II_0F_BE*/ {0xb6, 938}, + /*II_0F_BF*/ {0xb7, 938}, + /*II_0F_C0*/ {0xb3, 945}, + /*II_0F_C1*/ {0xb4, 945}, + /*II_0F_C3*/ {0xb8, 951}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, + /*II_0F_C8*/ {0xb9, 959}, /*II_80_00*/ {0xba, 11}, /*II_80_01*/ {0xbb, 27}, /*II_80_02*/ {0xbc, 31}, @@ -482,907 +482,907 @@ _InstInfo InstInfos[1248] = { /*II_83_06*/ {0xd0, 61}, /*II_83_07*/ {0xd1, 71}, /*II_8F_00*/ {0xd2, 22}, - /*II_C0_00*/ {0xd3, 967}, - /*II_C0_01*/ {0xd3, 972}, - /*II_C0_02*/ {0xd4, 977}, - /*II_C0_03*/ {0xd4, 982}, - /*II_C0_04*/ {0xd5, 987}, - /*II_C0_05*/ {0xd5, 992}, - /*II_C0_06*/ {0xd5, 997}, - /*II_C0_07*/ {0xd5, 1002}, - /*II_C1_00*/ {0xd6, 967}, - /*II_C1_01*/ {0xd6, 972}, - /*II_C1_02*/ {0xd7, 977}, - /*II_C1_03*/ {0xd7, 982}, - /*II_C1_04*/ {0xd8, 987}, - /*II_C1_05*/ {0xd8, 992}, - /*II_C1_06*/ {0xd8, 997}, - /*II_C1_07*/ {0xd8, 1002}, + /*II_C0_00*/ {0xd3, 966}, + /*II_C0_01*/ {0xd3, 971}, + /*II_C0_02*/ {0xd4, 976}, + /*II_C0_03*/ {0xd4, 981}, + /*II_C0_04*/ {0xd5, 986}, + /*II_C0_05*/ {0xd5, 991}, + /*II_C0_06*/ {0xd5, 996}, + /*II_C0_07*/ {0xd5, 1001}, + /*II_C1_00*/ {0xd6, 966}, + /*II_C1_01*/ {0xd6, 971}, + /*II_C1_02*/ {0xd7, 976}, + /*II_C1_03*/ {0xd7, 981}, + /*II_C1_04*/ {0xd8, 986}, + /*II_C1_05*/ {0xd8, 991}, + /*II_C1_06*/ {0xd8, 996}, + /*II_C1_07*/ {0xd8, 1001}, /*II_C6_00*/ {0xd9, 218}, - /*II_C6_F8*/ {0xda, 1007}, + /*II_C6_F8*/ {0xda, 1006}, /*II_C7_00*/ {0xdb, 218}, - /*II_C7_F8*/ {0xdc, 1015}, - /*II_D0_00*/ {0xdd, 967}, - /*II_D0_01*/ {0xdd, 972}, - /*II_D0_02*/ {0xde, 977}, - /*II_D0_03*/ {0xde, 982}, - /*II_D0_04*/ {0xdf, 987}, - /*II_D0_05*/ {0xdf, 992}, - /*II_D0_06*/ {0xdf, 997}, - /*II_D0_07*/ {0xdf, 1002}, - /*II_D1_00*/ {0xe0, 967}, - /*II_D1_01*/ {0xe0, 972}, - /*II_D1_02*/ {0xe1, 977}, - /*II_D1_03*/ {0xe1, 982}, - /*II_D1_04*/ {0xe2, 987}, - /*II_D1_05*/ {0xe2, 992}, - /*II_D1_06*/ {0xe2, 997}, - /*II_D1_07*/ {0xe2, 1002}, - /*II_D2_00*/ {0xe3, 967}, - /*II_D2_01*/ {0xe3, 972}, - /*II_D2_02*/ {0xe4, 977}, - /*II_D2_03*/ {0xe4, 982}, - /*II_D2_04*/ {0xe5, 987}, - /*II_D2_05*/ {0xe5, 992}, - /*II_D2_06*/ {0xe5, 997}, - /*II_D2_07*/ {0xe5, 1002}, - /*II_D3_00*/ {0xe6, 967}, - /*II_D3_01*/ {0xe6, 972}, - /*II_D3_02*/ {0xe7, 977}, - /*II_D3_03*/ {0xe7, 982}, - /*II_D3_04*/ {0xe8, 987}, - /*II_D3_05*/ {0xe8, 992}, - /*II_D3_06*/ {0xe8, 997}, - /*II_D3_07*/ {0xe8, 1002}, - /*II_D8_00*/ {0xe9, 1023}, - /*II_D8_01*/ {0xe9, 1029}, - /*II_D8_02*/ {0xe9, 1035}, - /*II_D8_03*/ {0xe9, 1041}, - /*II_D8_04*/ {0xe9, 1048}, - /*II_D8_05*/ {0xe9, 1054}, - /*II_D8_06*/ {0xe9, 1061}, - /*II_D8_07*/ {0xe9, 1067}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C0*/ {0xea, 1023}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_C8*/ {0xea, 1029}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D0*/ {0xeb, 1035}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D9*/ {0xec, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_D8*/ {0xeb, 1041}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E0*/ {0xea, 1048}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_E8*/ {0xea, 1054}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F0*/ {0xea, 1061}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D8_F8*/ {0xea, 1067}, - /*II_D9_00*/ {0xe9, 1074}, - /*II_D9_02*/ {0xed, 1079}, - /*II_D9_03*/ {0xed, 1084}, - /*II_D9_04*/ {0xee, 1090}, - /*II_D9_05*/ {0xef, 1098}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C0*/ {0xeb, 1074}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C9*/ {0xec, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_C8*/ {0xeb, 1105}, - /*II_D9_D0*/ {0xec, 1111}, - /*II_D9_E0*/ {0xec, 1117}, - /*II_D9_E1*/ {0xec, 1123}, - /*II_D9_E4*/ {0xec, 1129}, - /*II_D9_E5*/ {0xec, 1135}, - /*II_D9_E8*/ {0xec, 1141}, - /*II_D9_E9*/ {0xec, 1147}, - /*II_D9_EA*/ {0xec, 1155}, - /*II_D9_EB*/ {0xec, 1163}, - /*II_D9_EC*/ {0xec, 1170}, - /*II_D9_ED*/ {0xec, 1178}, - /*II_D9_EE*/ {0xec, 1186}, - /*II_D9_F0*/ {0xec, 1192}, - /*II_D9_F1*/ {0xec, 1199}, - /*II_D9_F2*/ {0xec, 1206}, - /*II_D9_F3*/ {0xec, 1213}, - /*II_D9_F4*/ {0xec, 1221}, - /*II_D9_F5*/ {0xec, 1230}, - /*II_D9_F6*/ {0xec, 1238}, - /*II_D9_F7*/ {0xec, 1247}, - /*II_D9_F8*/ {0xec, 1256}, - /*II_D9_F9*/ {0xec, 1263}, - /*II_D9_FA*/ {0xec, 1272}, - /*II_D9_FB*/ {0xec, 1279}, - /*II_D9_FC*/ {0xec, 1288}, - /*II_D9_FD*/ {0xec, 1297}, - /*II_D9_FE*/ {0xec, 1305}, - /*II_D9_FF*/ {0xec, 1311}, - /*II_DA_00*/ {0xe9, 1317}, - /*II_DA_01*/ {0xe9, 1324}, - /*II_DA_02*/ {0xe9, 1331}, - /*II_DA_03*/ {0xe9, 1338}, - /*II_DA_04*/ {0xe9, 1346}, - /*II_DA_05*/ {0xe9, 1353}, - /*II_DA_06*/ {0xe9, 1361}, - /*II_DA_07*/ {0xe9, 1368}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C0*/ {0xf0, 1376}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_C8*/ {0xf1, 1384}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D0*/ {0xf2, 1392}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_D8*/ {0xf3, 1401}, - /*II_DA_E9*/ {0xec, 1409}, - /*II_DB_00*/ {0xe9, 1418}, - /*II_DB_01*/ {0xf4, 1424}, - /*II_DB_02*/ {0xed, 1432}, - /*II_DB_03*/ {0xed, 1438}, - /*II_DB_05*/ {0xf5, 1074}, - /*II_DB_07*/ {0xf6, 1084}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C0*/ {0xf0, 1445}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_C8*/ {0xf1, 1454}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D0*/ {0xf2, 1463}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_D8*/ {0xf3, 1473}, - /*II_DB_E0*/ {0xec, 1482}, - /*II_DB_E1*/ {0xec, 1488}, - /*II_DB_E4*/ {0xec, 1496}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_E8*/ {0xf7, 1504}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DB_F0*/ {0xf8, 1512}, - /*II_DC_00*/ {0xf9, 1023}, - /*II_DC_01*/ {0xf9, 1029}, - /*II_DC_02*/ {0xf9, 1035}, - /*II_DC_03*/ {0xf9, 1041}, - /*II_DC_04*/ {0xf9, 1048}, - /*II_DC_05*/ {0xf9, 1054}, - /*II_DC_06*/ {0xf9, 1061}, - /*II_DC_07*/ {0xf9, 1067}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C0*/ {0xfa, 1023}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_C8*/ {0xfa, 1029}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E0*/ {0xfa, 1054}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_E8*/ {0xfa, 1048}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F0*/ {0xfa, 1067}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DC_F8*/ {0xfa, 1061}, - /*II_DD_00*/ {0xf9, 1074}, - /*II_DD_01*/ {0xfb, 1424}, - /*II_DD_02*/ {0xfc, 1079}, - /*II_DD_03*/ {0xfc, 1084}, - /*II_DD_04*/ {0xee, 1519}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_C0*/ {0xeb, 1527}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D0*/ {0xeb, 1079}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_D8*/ {0xeb, 1084}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E1*/ {0xec, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E0*/ {0xfa, 1534}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E9*/ {0xec, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DD_E8*/ {0xeb, 1541}, - /*II_DE_00*/ {0xef, 1317}, - /*II_DE_01*/ {0xef, 1324}, - /*II_DE_02*/ {0xef, 1331}, - /*II_DE_03*/ {0xef, 1338}, - /*II_DE_04*/ {0xef, 1346}, - /*II_DE_05*/ {0xef, 1353}, - /*II_DE_06*/ {0xef, 1361}, - /*II_DE_07*/ {0xef, 1368}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C1*/ {0xec, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C0*/ {0xfa, 1549}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C9*/ {0xec, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_C8*/ {0xfa, 1556}, - /*II_DE_D9*/ {0xec, 1563}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E1*/ {0xec, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E0*/ {0xfa, 1571}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E9*/ {0xec, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_E8*/ {0xfa, 1579}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F1*/ {0xec, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F0*/ {0xfa, 1586}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F9*/ {0xec, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DE_F8*/ {0xfa, 1594}, - /*II_DF_00*/ {0xef, 1418}, - /*II_DF_01*/ {0xfd, 1424}, - /*II_DF_02*/ {0xfe, 1432}, - /*II_DF_03*/ {0xfe, 1438}, - /*II_DF_04*/ {0xf5, 1601}, - /*II_DF_05*/ {0xf9, 1418}, - /*II_DF_06*/ {0xf6, 1607}, - /*II_DF_07*/ {0xfc, 1438}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_E8*/ {0xf7, 1614}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, - /*II_DF_F0*/ {0xf7, 1623}, + /*II_C7_F8*/ {0xdc, 1014}, + /*II_D0_00*/ {0xdd, 966}, + /*II_D0_01*/ {0xdd, 971}, + /*II_D0_02*/ {0xde, 976}, + /*II_D0_03*/ {0xde, 981}, + /*II_D0_04*/ {0xdf, 986}, + /*II_D0_05*/ {0xdf, 991}, + /*II_D0_06*/ {0xdf, 996}, + /*II_D0_07*/ {0xdf, 1001}, + /*II_D1_00*/ {0xe0, 966}, + /*II_D1_01*/ {0xe0, 971}, + /*II_D1_02*/ {0xe1, 976}, + /*II_D1_03*/ {0xe1, 981}, + /*II_D1_04*/ {0xe2, 986}, + /*II_D1_05*/ {0xe2, 991}, + /*II_D1_06*/ {0xe2, 996}, + /*II_D1_07*/ {0xe2, 1001}, + /*II_D2_00*/ {0xe3, 966}, + /*II_D2_01*/ {0xe3, 971}, + /*II_D2_02*/ {0xe4, 976}, + /*II_D2_03*/ {0xe4, 981}, + /*II_D2_04*/ {0xe5, 986}, + /*II_D2_05*/ {0xe5, 991}, + /*II_D2_06*/ {0xe5, 996}, + /*II_D2_07*/ {0xe5, 1001}, + /*II_D3_00*/ {0xe6, 966}, + /*II_D3_01*/ {0xe6, 971}, + /*II_D3_02*/ {0xe7, 976}, + /*II_D3_03*/ {0xe7, 981}, + /*II_D3_04*/ {0xe8, 986}, + /*II_D3_05*/ {0xe8, 991}, + /*II_D3_06*/ {0xe8, 996}, + /*II_D3_07*/ {0xe8, 1001}, + /*II_D8_00*/ {0xe9, 1022}, + /*II_D8_01*/ {0xe9, 1028}, + /*II_D8_02*/ {0xe9, 1034}, + /*II_D8_03*/ {0xe9, 1040}, + /*II_D8_04*/ {0xe9, 1047}, + /*II_D8_05*/ {0xe9, 1053}, + /*II_D8_06*/ {0xe9, 1060}, + /*II_D8_07*/ {0xe9, 1066}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C0*/ {0xea, 1022}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_C8*/ {0xea, 1028}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D0*/ {0xeb, 1034}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D9*/ {0xec, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_D8*/ {0xeb, 1040}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E0*/ {0xea, 1047}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_E8*/ {0xea, 1053}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F0*/ {0xea, 1060}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D8_F8*/ {0xea, 1066}, + /*II_D9_00*/ {0xe9, 1073}, + /*II_D9_02*/ {0xed, 1078}, + /*II_D9_03*/ {0xed, 1083}, + /*II_D9_04*/ {0xee, 1089}, + /*II_D9_05*/ {0xef, 1097}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C0*/ {0xeb, 1073}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C9*/ {0xec, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_C8*/ {0xeb, 1104}, + /*II_D9_D0*/ {0xec, 1110}, + /*II_D9_E0*/ {0xec, 1116}, + /*II_D9_E1*/ {0xec, 1122}, + /*II_D9_E4*/ {0xec, 1128}, + /*II_D9_E5*/ {0xec, 1134}, + /*II_D9_E8*/ {0xec, 1140}, + /*II_D9_E9*/ {0xec, 1146}, + /*II_D9_EA*/ {0xec, 1154}, + /*II_D9_EB*/ {0xec, 1162}, + /*II_D9_EC*/ {0xec, 1169}, + /*II_D9_ED*/ {0xec, 1177}, + /*II_D9_EE*/ {0xec, 1185}, + /*II_D9_F0*/ {0xec, 1191}, + /*II_D9_F1*/ {0xec, 1198}, + /*II_D9_F2*/ {0xec, 1205}, + /*II_D9_F3*/ {0xec, 1212}, + /*II_D9_F4*/ {0xec, 1220}, + /*II_D9_F5*/ {0xec, 1229}, + /*II_D9_F6*/ {0xec, 1237}, + /*II_D9_F7*/ {0xec, 1246}, + /*II_D9_F8*/ {0xec, 1255}, + /*II_D9_F9*/ {0xec, 1262}, + /*II_D9_FA*/ {0xec, 1271}, + /*II_D9_FB*/ {0xec, 1278}, + /*II_D9_FC*/ {0xec, 1287}, + /*II_D9_FD*/ {0xec, 1296}, + /*II_D9_FE*/ {0xec, 1304}, + /*II_D9_FF*/ {0xec, 1310}, + /*II_DA_00*/ {0xe9, 1316}, + /*II_DA_01*/ {0xe9, 1323}, + /*II_DA_02*/ {0xe9, 1330}, + /*II_DA_03*/ {0xe9, 1337}, + /*II_DA_04*/ {0xe9, 1345}, + /*II_DA_05*/ {0xe9, 1352}, + /*II_DA_06*/ {0xe9, 1360}, + /*II_DA_07*/ {0xe9, 1367}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C0*/ {0xf0, 1375}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_C8*/ {0xf1, 1383}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D0*/ {0xf2, 1391}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_D8*/ {0xf3, 1400}, + /*II_DA_E9*/ {0xec, 1408}, + /*II_DB_00*/ {0xe9, 1417}, + /*II_DB_01*/ {0xf4, 1423}, + /*II_DB_02*/ {0xed, 1431}, + /*II_DB_03*/ {0xed, 1437}, + /*II_DB_05*/ {0xf5, 1073}, + /*II_DB_07*/ {0xf6, 1083}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C0*/ {0xf0, 1444}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_C8*/ {0xf1, 1453}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D0*/ {0xf2, 1462}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_D8*/ {0xf3, 1472}, + /*II_DB_E0*/ {0xec, 1481}, + /*II_DB_E1*/ {0xec, 1487}, + /*II_DB_E4*/ {0xec, 1495}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_E8*/ {0xf7, 1503}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DB_F0*/ {0xf8, 1511}, + /*II_DC_00*/ {0xf9, 1022}, + /*II_DC_01*/ {0xf9, 1028}, + /*II_DC_02*/ {0xf9, 1034}, + /*II_DC_03*/ {0xf9, 1040}, + /*II_DC_04*/ {0xf9, 1047}, + /*II_DC_05*/ {0xf9, 1053}, + /*II_DC_06*/ {0xf9, 1060}, + /*II_DC_07*/ {0xf9, 1066}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C0*/ {0xfa, 1022}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_C8*/ {0xfa, 1028}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E0*/ {0xfa, 1053}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_E8*/ {0xfa, 1047}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F0*/ {0xfa, 1066}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DC_F8*/ {0xfa, 1060}, + /*II_DD_00*/ {0xf9, 1073}, + /*II_DD_01*/ {0xfb, 1423}, + /*II_DD_02*/ {0xfc, 1078}, + /*II_DD_03*/ {0xfc, 1083}, + /*II_DD_04*/ {0xee, 1518}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_C0*/ {0xeb, 1526}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D0*/ {0xeb, 1078}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_D8*/ {0xeb, 1083}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E1*/ {0xec, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E0*/ {0xfa, 1533}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E9*/ {0xec, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DD_E8*/ {0xeb, 1540}, + /*II_DE_00*/ {0xef, 1316}, + /*II_DE_01*/ {0xef, 1323}, + /*II_DE_02*/ {0xef, 1330}, + /*II_DE_03*/ {0xef, 1337}, + /*II_DE_04*/ {0xef, 1345}, + /*II_DE_05*/ {0xef, 1352}, + /*II_DE_06*/ {0xef, 1360}, + /*II_DE_07*/ {0xef, 1367}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C1*/ {0xec, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C0*/ {0xfa, 1548}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C9*/ {0xec, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_C8*/ {0xfa, 1555}, + /*II_DE_D9*/ {0xec, 1562}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E1*/ {0xec, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E0*/ {0xfa, 1570}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E9*/ {0xec, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_E8*/ {0xfa, 1578}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F1*/ {0xec, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F0*/ {0xfa, 1585}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F9*/ {0xec, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DE_F8*/ {0xfa, 1593}, + /*II_DF_00*/ {0xef, 1417}, + /*II_DF_01*/ {0xfd, 1423}, + /*II_DF_02*/ {0xfe, 1431}, + /*II_DF_03*/ {0xfe, 1437}, + /*II_DF_04*/ {0xf5, 1600}, + /*II_DF_05*/ {0xf9, 1417}, + /*II_DF_06*/ {0xf6, 1606}, + /*II_DF_07*/ {0xfc, 1437}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_E8*/ {0xf7, 1613}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, + /*II_DF_F0*/ {0xf7, 1622}, /*II_F6_00*/ {0xff, 206}, - /*II_F6_02*/ {0x100, 1631}, - /*II_F6_03*/ {0x101, 1636}, - /*II_F6_04*/ {0x102, 1641}, + /*II_F6_02*/ {0x100, 1630}, + /*II_F6_03*/ {0x101, 1635}, + /*II_F6_04*/ {0x102, 1640}, /*II_F6_05*/ {0x102, 117}, - /*II_F6_06*/ {0x103, 1646}, - /*II_F6_07*/ {0x103, 1651}, + /*II_F6_06*/ {0x103, 1645}, + /*II_F6_07*/ {0x103, 1650}, /*II_F7_00*/ {0x104, 206}, - /*II_F7_02*/ {0x105, 1631}, - /*II_F7_03*/ {0x106, 1636}, - /*II_F7_04*/ {0x107, 1641}, + /*II_F7_02*/ {0x105, 1630}, + /*II_F7_03*/ {0x106, 1635}, + /*II_F7_04*/ {0x107, 1640}, /*II_F7_05*/ {0x107, 117}, - /*II_F7_06*/ {0x108, 1646}, - /*II_F7_07*/ {0x108, 1651}, + /*II_F7_06*/ {0x108, 1645}, + /*II_F7_07*/ {0x108, 1650}, /*II_FE_00*/ {0x109, 81}, /*II_FE_01*/ {0x109, 86}, /*II_FF_00*/ {0x10a, 81}, /*II_FF_01*/ {0x10a, 86}, - /*II_FF_02*/ {0x10b, 456}, + /*II_FF_02*/ {0x10b, 455}, /*II_FF_03*/ {0x10c, 260}, - /*II_FF_04*/ {0x10d, 462}, - /*II_FF_05*/ {0x10e, 467}, + /*II_FF_04*/ {0x10d, 461}, + /*II_FF_05*/ {0x10e, 466}, /*II_FF_06*/ {0x10f, 16}, - /*II_0F_00_00*/ {0x110, 1657}, - /*II_0F_00_01*/ {0x111, 1663}, - /*II_0F_00_02*/ {0x112, 1668}, - /*II_0F_00_03*/ {0x113, 1674}, - /*II_0F_00_04*/ {0x114, 1679}, - /*II_0F_00_05*/ {0x114, 1685}, - /*II_0F_01_00*/ {0x115, 1691}, - /*II_0F_01_01*/ {0x115, 1697}, - /*II_0F_01_02*/ {0x116, 1703}, - /*II_0F_01_03*/ {0x116, 1709}, - /*II_0F_01_04*/ {0x117, 1715}, - /*II_0F_01_06*/ {0x118, 1721}, - /*II_0F_01_07*/ {0x119, 1727}, - /*II_0F_01_C1*/ {0x11a, 1735}, - /*II_0F_01_C2*/ {0x11a, 1743}, - /*II_0F_01_C3*/ {0x11a, 1753}, - /*II_0F_01_C4*/ {0x11a, 1763}, - /*II_0F_01_C8*/ {0x11b, 1771}, - /*II_0F_01_C9*/ {0x11b, 1780}, - /*II_0F_01_CA*/ {0x11b, 1787}, - /*II_0F_01_CB*/ {0x11b, 1793}, - /*II_0F_01_D0*/ {0x91, 1799}, - /*II_0F_01_D1*/ {0x91, 1807}, - /*II_0F_01_D4*/ {0x11a, 1815}, - /*II_0F_01_D5*/ {0x11c, 1823}, - /*II_0F_01_D8*/ {0x11d, 1829}, - /*II_0F_01_D9*/ {0x11e, 1836}, - /*II_0F_01_DA*/ {0x11f, 1845}, - /*II_0F_01_DB*/ {0x11f, 1853}, - /*II_0F_01_DC*/ {0x11e, 1861}, - /*II_0F_01_DD*/ {0x11e, 1867}, - /*II_0F_01_DE*/ {0x11f, 1873}, - /*II_0F_01_DF*/ {0x120, 1881}, - /*II_0F_01_F8*/ {0x121, 1890}, - /*II_0F_01_F9*/ {0x121, 1898}, - /*II_0F_0D_00*/ {0x122, 1906}, - /*II_0F_0D_01*/ {0x122, 1916}, - /*II_0F_0F_0C*/ {0x123, 1927}, - /*II_0F_0F_0D*/ {0x124, 1934}, - /*II_0F_0F_1C*/ {0x123, 1941}, - /*II_0F_0F_1D*/ {0x124, 1948}, - /*II_0F_0F_8A*/ {0x123, 1955}, - /*II_0F_0F_8E*/ {0x123, 1963}, - /*II_0F_0F_90*/ {0x124, 1972}, - /*II_0F_0F_94*/ {0x124, 1981}, - /*II_0F_0F_96*/ {0x124, 1988}, - /*II_0F_0F_97*/ {0x124, 1995}, - /*II_0F_0F_9A*/ {0x124, 2004}, - /*II_0F_0F_9E*/ {0x124, 2011}, - /*II_0F_0F_A0*/ {0x124, 2018}, - /*II_0F_0F_A4*/ {0x124, 2027}, - /*II_0F_0F_A6*/ {0x124, 2034}, - /*II_0F_0F_A7*/ {0x124, 2044}, - /*II_0F_0F_AA*/ {0x124, 2054}, - /*II_0F_0F_AE*/ {0x124, 2062}, - /*II_0F_0F_B0*/ {0x124, 2069}, - /*II_0F_0F_B4*/ {0x124, 2078}, - /*II_0F_0F_B6*/ {0x124, 2085}, - /*II_0F_0F_B7*/ {0x124, 2095}, - /*II_0F_0F_BB*/ {0x123, 2104}, - /*II_0F_0F_BF*/ {0x124, 2112}, - /*II_0F_10*/ {0x125, 2121}, - /*II_66_0F_10*/ {0x126, 2129}, - /*II_F3_0F_10*/ {0x127, 2137}, - /*II_F2_0F_10*/ {0x128, 2144}, - /*II_0F_11*/ {0x12d, 2121}, - /*II_66_0F_11*/ {0x12e, 2129}, - /*II_F3_0F_11*/ {0x12f, 2137}, - /*II_F2_0F_11*/ {0x130, 2144}, - /*II_66_0F_12*/ {0x135, 2202}, - /*II_F3_0F_12*/ {0x136, 2210}, - /*II_F2_0F_12*/ {0x136, 2220}, - /*II_0F_13*/ {0x13a, 2194}, - /*II_66_0F_13*/ {0x13b, 2202}, - /*II_0F_14*/ {0x13d, 2278}, - /*II_66_0F_14*/ {0x13e, 2288}, - /*II_0F_15*/ {0x13d, 2320}, - /*II_66_0F_15*/ {0x13e, 2330}, - /*II_66_0F_16*/ {0x135, 2379}, - /*II_F3_0F_16*/ {0x140, 2387}, - /*II_0F_17*/ {0x13a, 2371}, - /*II_66_0F_17*/ {0x13b, 2379}, - /*II_0F_18_00*/ {0x141, 2436}, - /*II_0F_18_01*/ {0x141, 2449}, - /*II_0F_18_02*/ {0x141, 2461}, - /*II_0F_18_03*/ {0x141, 2473}, - /*II_0F_28*/ {0x125, 2485}, - /*II_66_0F_28*/ {0x126, 2493}, - /*II_0F_29*/ {0x12d, 2485}, - /*II_66_0F_29*/ {0x12e, 2493}, - /*II_0F_2A*/ {0x142, 2519}, - /*II_66_0F_2A*/ {0x143, 2529}, - /*II_F3_0F_2A*/ {0x144, 2539}, - /*II_F2_0F_2A*/ {0x145, 2549}, - /*II_0F_2B*/ {0x146, 2581}, - /*II_66_0F_2B*/ {0x147, 2590}, - /*II_F3_0F_2B*/ {0x148, 2599}, - /*II_F2_0F_2B*/ {0x149, 2608}, - /*II_0F_2C*/ {0x14b, 2637}, - /*II_66_0F_2C*/ {0x14c, 2648}, - /*II_F3_0F_2C*/ {0x14d, 2659}, - /*II_F2_0F_2C*/ {0x14e, 2670}, - /*II_0F_2D*/ {0x14b, 2705}, - /*II_66_0F_2D*/ {0x13e, 2715}, - /*II_F3_0F_2D*/ {0x14d, 2725}, - /*II_F2_0F_2D*/ {0x14e, 2735}, - /*II_0F_2E*/ {0x150, 2767}, - /*II_66_0F_2E*/ {0x151, 2776}, - /*II_0F_2F*/ {0x150, 2805}, - /*II_66_0F_2F*/ {0x151, 2813}, - /*II_0F_50*/ {0x154, 2839}, - /*II_66_0F_50*/ {0x155, 2849}, - /*II_0F_51*/ {0x13d, 2881}, - /*II_66_0F_51*/ {0x13e, 2889}, - /*II_F3_0F_51*/ {0x157, 2897}, - /*II_F2_0F_51*/ {0x151, 2905}, - /*II_0F_52*/ {0x13d, 2949}, - /*II_F3_0F_52*/ {0x157, 2958}, - /*II_0F_53*/ {0x13d, 2987}, - /*II_F3_0F_53*/ {0x157, 2994}, - /*II_0F_54*/ {0x13d, 3017}, - /*II_66_0F_54*/ {0x13e, 3024}, - /*II_0F_55*/ {0x13d, 3047}, - /*II_66_0F_55*/ {0x13e, 3055}, - /*II_0F_56*/ {0x13d, 3081}, - /*II_66_0F_56*/ {0x13e, 3087}, - /*II_0F_57*/ {0x13d, 3107}, - /*II_66_0F_57*/ {0x13e, 3114}, - /*II_0F_58*/ {0x13d, 3137}, - /*II_66_0F_58*/ {0x13e, 3144}, - /*II_F3_0F_58*/ {0x157, 3151}, - /*II_F2_0F_58*/ {0x151, 3158}, - /*II_0F_59*/ {0x13d, 3197}, - /*II_66_0F_59*/ {0x13e, 3204}, - /*II_F3_0F_59*/ {0x157, 3211}, - /*II_F2_0F_59*/ {0x151, 3218}, - /*II_0F_5A*/ {0x151, 3257}, - /*II_66_0F_5A*/ {0x13e, 3267}, - /*II_F3_0F_5A*/ {0x158, 3277}, - /*II_F2_0F_5A*/ {0x151, 3287}, - /*II_0F_5B*/ {0x13e, 3341}, - /*II_66_0F_5B*/ {0x13e, 3351}, - /*II_F3_0F_5B*/ {0x13e, 3361}, - /*II_0F_5C*/ {0x13d, 3406}, - /*II_66_0F_5C*/ {0x13e, 3413}, - /*II_F3_0F_5C*/ {0x157, 3420}, - /*II_F2_0F_5C*/ {0x151, 3427}, - /*II_0F_5D*/ {0x13d, 3466}, - /*II_66_0F_5D*/ {0x13e, 3473}, - /*II_F3_0F_5D*/ {0x157, 3480}, - /*II_F2_0F_5D*/ {0x151, 3487}, - /*II_0F_5E*/ {0x13d, 3526}, - /*II_66_0F_5E*/ {0x13e, 3533}, - /*II_F3_0F_5E*/ {0x157, 3540}, - /*II_F2_0F_5E*/ {0x151, 3547}, - /*II_0F_5F*/ {0x13d, 3586}, - /*II_66_0F_5F*/ {0x13e, 3593}, - /*II_F3_0F_5F*/ {0x157, 3600}, - /*II_F2_0F_5F*/ {0x151, 3607}, - /*II_0F_60*/ {0x15b, 3646}, - /*II_66_0F_60*/ {0x13e, 3646}, - /*II_0F_61*/ {0x15b, 3669}, - /*II_66_0F_61*/ {0x13e, 3669}, - /*II_0F_62*/ {0x15b, 3692}, - /*II_66_0F_62*/ {0x13e, 3692}, - /*II_0F_63*/ {0x15c, 3715}, - /*II_66_0F_63*/ {0x13e, 3715}, - /*II_0F_64*/ {0x15c, 3736}, - /*II_66_0F_64*/ {0x13e, 3736}, - /*II_0F_65*/ {0x15c, 3755}, - /*II_66_0F_65*/ {0x13e, 3755}, - /*II_0F_66*/ {0x15c, 3774}, - /*II_66_0F_66*/ {0x13e, 3774}, - /*II_0F_67*/ {0x15c, 3793}, - /*II_66_0F_67*/ {0x13e, 3793}, - /*II_0F_68*/ {0x15c, 3814}, - /*II_66_0F_68*/ {0x13e, 3814}, - /*II_0F_69*/ {0x15c, 3837}, - /*II_66_0F_69*/ {0x13e, 3837}, - /*II_0F_6A*/ {0x15c, 3860}, - /*II_66_0F_6A*/ {0x13e, 3860}, - /*II_0F_6B*/ {0x15c, 3883}, - /*II_66_0F_6B*/ {0x13e, 3883}, - /*II_66_0F_6C*/ {0x13e, 3904}, - /*II_66_0F_6D*/ {0x13e, 3929}, - /*II_0F_6F*/ {0x160, 3960}, - /*II_66_0F_6F*/ {0x126, 3980}, - /*II_F3_0F_6F*/ {0x126, 3988}, - /*II_0F_74*/ {0x15c, 4077}, - /*II_66_0F_74*/ {0x13e, 4077}, - /*II_0F_75*/ {0x15c, 4096}, - /*II_66_0F_75*/ {0x13e, 4096}, - /*II_0F_76*/ {0x15c, 4115}, - /*II_66_0F_76*/ {0x13e, 4115}, - /*II_0F_77*/ {0x164, 4134}, - /*II_0F_78*/ {0x166, 4162}, - /*II_0F_79*/ {0x169, 4186}, - /*II_66_0F_79*/ {0x16a, 4170}, - /*II_F2_0F_79*/ {0x16b, 4177}, - /*II_0F_7A_30*/ {0x16c, 4195}, - /*II_0F_7A_31*/ {0x16d, 4205}, - /*II_66_0F_7C*/ {0x16e, 4215}, - /*II_F2_0F_7C*/ {0x16e, 4223}, - /*II_66_0F_7D*/ {0x16e, 4249}, - /*II_F2_0F_7D*/ {0x16e, 4257}, - /*II_F3_0F_7E*/ {0x128, 3960}, - /*II_0F_7F*/ {0x172, 3960}, - /*II_66_0F_7F*/ {0x12e, 3980}, - /*II_F3_0F_7F*/ {0x12e, 3988}, - /*II_F3_0F_B8*/ {0x176, 4372}, - /*II_0F_BA_04*/ {0x177, 872}, - /*II_0F_BA_05*/ {0x178, 887}, - /*II_0F_BA_06*/ {0x178, 912}, - /*II_0F_BA_07*/ {0x178, 934}, - /*II_0F_BC*/ {0x179, 4380}, - /*II_F3_0F_BC*/ {0x17a, 4385}, - /*II_0F_BD*/ {0x179, 4392}, - /*II_F3_0F_BD*/ {0x17b, 4397}, - /*II_0F_C7_07*/ {0x18b, 6419}, - /*II_66_0F_D0*/ {0x16e, 6428}, - /*II_F2_0F_D0*/ {0x16e, 6438}, - /*II_0F_D1*/ {0x15c, 6470}, - /*II_66_0F_D1*/ {0x13e, 6470}, - /*II_0F_D2*/ {0x15c, 6485}, - /*II_66_0F_D2*/ {0x13e, 6485}, - /*II_0F_D3*/ {0x15c, 6500}, - /*II_66_0F_D3*/ {0x13e, 6500}, - /*II_0F_D4*/ {0x151, 6515}, - /*II_66_0F_D4*/ {0x13e, 6515}, - /*II_0F_D5*/ {0x15c, 6530}, - /*II_66_0F_D5*/ {0x13e, 6530}, - /*II_66_0F_D6*/ {0x130, 3960}, - /*II_F3_0F_D6*/ {0x18c, 6547}, - /*II_F2_0F_D6*/ {0x18d, 6556}, - /*II_0F_D7*/ {0x18f, 6565}, - /*II_66_0F_D7*/ {0x190, 6565}, - /*II_0F_D8*/ {0x15c, 6586}, - /*II_66_0F_D8*/ {0x13e, 6586}, - /*II_0F_D9*/ {0x15c, 6605}, - /*II_66_0F_D9*/ {0x13e, 6605}, - /*II_0F_DA*/ {0x192, 6624}, - /*II_66_0F_DA*/ {0x13e, 6624}, - /*II_0F_DB*/ {0x15c, 6641}, - /*II_66_0F_DB*/ {0x13e, 6641}, - /*II_0F_DC*/ {0x15c, 6654}, - /*II_66_0F_DC*/ {0x13e, 6654}, - /*II_0F_DD*/ {0x15c, 6673}, - /*II_66_0F_DD*/ {0x13e, 6673}, - /*II_0F_DE*/ {0x192, 6682}, - /*II_66_0F_DE*/ {0x13e, 6682}, - /*II_0F_DF*/ {0x15c, 6699}, - /*II_66_0F_DF*/ {0x13e, 6699}, - /*II_0F_E0*/ {0x192, 6714}, - /*II_66_0F_E0*/ {0x13e, 6714}, - /*II_0F_E1*/ {0x15c, 6729}, - /*II_66_0F_E1*/ {0x13e, 6729}, - /*II_0F_E2*/ {0x15c, 6744}, - /*II_66_0F_E2*/ {0x13e, 6744}, - /*II_0F_E3*/ {0x192, 6759}, - /*II_66_0F_E3*/ {0x13e, 6759}, - /*II_0F_E4*/ {0x192, 6774}, - /*II_66_0F_E4*/ {0x13e, 6774}, - /*II_0F_E5*/ {0x15c, 6793}, - /*II_66_0F_E5*/ {0x13e, 6793}, - /*II_66_0F_E6*/ {0x13e, 6810}, - /*II_F3_0F_E6*/ {0x151, 6821}, - /*II_F2_0F_E6*/ {0x13e, 6831}, - /*II_0F_E7*/ {0x193, 6875}, - /*II_66_0F_E7*/ {0x147, 6883}, - /*II_0F_E8*/ {0x15c, 6902}, - /*II_66_0F_E8*/ {0x13e, 6902}, - /*II_0F_E9*/ {0x15c, 6919}, - /*II_66_0F_E9*/ {0x13e, 6919}, - /*II_0F_EA*/ {0x192, 6936}, - /*II_66_0F_EA*/ {0x13e, 6936}, - /*II_0F_EB*/ {0x15c, 6953}, - /*II_66_0F_EB*/ {0x13e, 6953}, - /*II_0F_EC*/ {0x15c, 6964}, - /*II_66_0F_EC*/ {0x13e, 6964}, - /*II_0F_ED*/ {0x15c, 6981}, - /*II_66_0F_ED*/ {0x13e, 6981}, - /*II_0F_EE*/ {0x192, 6998}, - /*II_66_0F_EE*/ {0x13e, 6998}, - /*II_0F_EF*/ {0x15c, 7015}, - /*II_66_0F_EF*/ {0x13e, 7015}, - /*II_F2_0F_F0*/ {0x194, 7028}, - /*II_0F_F1*/ {0x15c, 7043}, - /*II_66_0F_F1*/ {0x13e, 7043}, - /*II_0F_F2*/ {0x15c, 7058}, - /*II_66_0F_F2*/ {0x13e, 7058}, - /*II_0F_F3*/ {0x15c, 7073}, - /*II_66_0F_F3*/ {0x13e, 7073}, - /*II_0F_F4*/ {0x196, 7088}, - /*II_66_0F_F4*/ {0x13e, 7088}, - /*II_0F_F5*/ {0x15c, 7107}, - /*II_66_0F_F5*/ {0x13e, 7107}, - /*II_0F_F6*/ {0x192, 7126}, - /*II_66_0F_F6*/ {0x13e, 7126}, - /*II_0F_F7*/ {0x197, 7143}, - /*II_66_0F_F7*/ {0x198, 7153}, - /*II_0F_F8*/ {0x15c, 7178}, - /*II_66_0F_F8*/ {0x13e, 7178}, - /*II_0F_F9*/ {0x15c, 7193}, - /*II_66_0F_F9*/ {0x13e, 7193}, - /*II_0F_FA*/ {0x15c, 7208}, - /*II_66_0F_FA*/ {0x13e, 7208}, - /*II_0F_FB*/ {0x196, 7223}, - /*II_66_0F_FB*/ {0x13e, 7223}, - /*II_0F_FC*/ {0x15c, 7238}, - /*II_66_0F_FC*/ {0x13e, 7238}, - /*II_0F_FD*/ {0x15c, 7253}, - /*II_66_0F_FD*/ {0x13e, 7253}, - /*II_0F_FE*/ {0x15c, 7268}, - /*II_66_0F_FE*/ {0x13e, 7268}, - /*II_D9_06*/ {0x19a, 7283}, - /*II_9B_D9_06*/ {0x19b, 7292}, - /*II_D9_07*/ {0xfe, 7300}, - /*II_9B_D9_07*/ {0x19c, 7308}, - /*II_DB_E2*/ {0xec, 7315}, - /*II_9B_DB_E2*/ {0x19d, 7323}, - /*II_DB_E3*/ {0xec, 7330}, - /*II_9B_DB_E3*/ {0x19d, 7338}, - /*II_DD_06*/ {0x19a, 7345}, - /*II_9B_DD_06*/ {0x19b, 7353}, - /*II_DD_07*/ {0xfe, 7360}, - /*II_9B_DD_07*/ {0x19c, 7368}, - /*II_DF_E0*/ {0x19e, 7360}, - /*II_9B_DF_E0*/ {0x19f, 7368}, - /*II_0F_38_00*/ {0x1a0, 7375}, - /*II_66_0F_38_00*/ {0x1a1, 7375}, - /*II_0F_38_01*/ {0x1a0, 7392}, - /*II_66_0F_38_01*/ {0x1a1, 7392}, - /*II_0F_38_02*/ {0x1a0, 7409}, - /*II_66_0F_38_02*/ {0x1a1, 7409}, - /*II_0F_38_03*/ {0x1a0, 7426}, - /*II_66_0F_38_03*/ {0x1a1, 7426}, - /*II_0F_38_04*/ {0x1a0, 7445}, - /*II_66_0F_38_04*/ {0x1a1, 7445}, - /*II_0F_38_05*/ {0x1a0, 7468}, - /*II_66_0F_38_05*/ {0x1a1, 7468}, - /*II_0F_38_06*/ {0x1a0, 7485}, - /*II_66_0F_38_06*/ {0x1a1, 7485}, - /*II_0F_38_07*/ {0x1a0, 7502}, - /*II_66_0F_38_07*/ {0x1a1, 7502}, - /*II_0F_38_08*/ {0x1a0, 7521}, - /*II_66_0F_38_08*/ {0x1a1, 7521}, - /*II_0F_38_09*/ {0x1a0, 7538}, - /*II_66_0F_38_09*/ {0x1a1, 7538}, - /*II_0F_38_0A*/ {0x1a0, 7555}, - /*II_66_0F_38_0A*/ {0x1a1, 7555}, - /*II_0F_38_0B*/ {0x1a0, 7572}, - /*II_66_0F_38_0B*/ {0x1a1, 7572}, - /*II_66_0F_38_17*/ {0x1a3, 7663}, - /*II_0F_38_1C*/ {0x1a0, 7722}, - /*II_66_0F_38_1C*/ {0x1a1, 7722}, - /*II_0F_38_1D*/ {0x1a0, 7737}, - /*II_66_0F_38_1D*/ {0x1a1, 7737}, - /*II_0F_38_1E*/ {0x1a0, 7752}, - /*II_66_0F_38_1E*/ {0x1a1, 7752}, - /*II_66_0F_38_20*/ {0x1a8, 7767}, - /*II_66_0F_38_21*/ {0x1a9, 7788}, - /*II_66_0F_38_22*/ {0x1aa, 7809}, - /*II_66_0F_38_23*/ {0x1a8, 7830}, - /*II_66_0F_38_24*/ {0x1a9, 7851}, - /*II_66_0F_38_25*/ {0x1a8, 7872}, - /*II_66_0F_38_28*/ {0x1ac, 7893}, - /*II_66_0F_38_29*/ {0x1ac, 7910}, - /*II_66_0F_38_2A*/ {0x1ad, 7929}, - /*II_66_0F_38_2B*/ {0x1ac, 7950}, - /*II_66_0F_38_30*/ {0x1a8, 7995}, - /*II_66_0F_38_31*/ {0x1a9, 8016}, - /*II_66_0F_38_32*/ {0x1aa, 8037}, - /*II_66_0F_38_33*/ {0x1a8, 8058}, - /*II_66_0F_38_34*/ {0x1a9, 8079}, - /*II_66_0F_38_35*/ {0x1a8, 8100}, - /*II_66_0F_38_37*/ {0x1a3, 8121}, - /*II_66_0F_38_38*/ {0x1ac, 8140}, - /*II_66_0F_38_39*/ {0x1ac, 8157}, - /*II_66_0F_38_3A*/ {0x1ac, 8174}, - /*II_66_0F_38_3B*/ {0x1ac, 8191}, - /*II_66_0F_38_3C*/ {0x1ac, 8208}, - /*II_66_0F_38_3D*/ {0x1ac, 8225}, - /*II_66_0F_38_3E*/ {0x1ac, 8242}, - /*II_66_0F_38_3F*/ {0x1ac, 8259}, - /*II_66_0F_38_40*/ {0x1ac, 8276}, - /*II_66_0F_38_41*/ {0x1ac, 8293}, - /*II_66_0F_38_80*/ {0x1b0, 8318}, - /*II_66_0F_38_81*/ {0x1b0, 8326}, - /*II_66_0F_38_82*/ {0x1b0, 8335}, - /*II_66_0F_38_DB*/ {0x1b3, 9184}, - /*II_66_0F_38_DC*/ {0x1b3, 9201}, - /*II_66_0F_38_DD*/ {0x1b3, 9218}, - /*II_66_0F_38_DE*/ {0x1b3, 9243}, - /*II_66_0F_38_DF*/ {0x1b3, 9260}, - /*II_0F_38_F0*/ {0x1b6, 9285}, - /*II_F2_0F_38_F0*/ {0x1b7, 9292}, - /*II_0F_38_F1*/ {0x1b8, 9285}, - /*II_F2_0F_38_F1*/ {0x1b9, 9292}, - /*II_0F_71_02*/ {0x1d0, 6470}, - /*II_66_0F_71_02*/ {0x1d1, 6470}, - /*II_0F_71_04*/ {0x1d0, 6729}, - /*II_66_0F_71_04*/ {0x1d1, 6729}, - /*II_0F_71_06*/ {0x1d0, 7043}, - /*II_66_0F_71_06*/ {0x1d1, 7043}, - /*II_0F_72_02*/ {0x1d0, 6485}, - /*II_66_0F_72_02*/ {0x1d1, 6485}, - /*II_0F_72_04*/ {0x1d0, 6744}, - /*II_66_0F_72_04*/ {0x1d1, 6744}, - /*II_0F_72_06*/ {0x1d0, 7058}, - /*II_66_0F_72_06*/ {0x1d1, 7058}, - /*II_0F_73_02*/ {0x1d0, 6500}, - /*II_66_0F_73_02*/ {0x1d1, 6500}, - /*II_66_0F_73_03*/ {0x1d1, 9864}, - /*II_0F_73_06*/ {0x1d0, 7073}, - /*II_66_0F_73_06*/ {0x1d1, 7073}, - /*II_66_0F_73_07*/ {0x1d1, 9881}, - /*II_F3_0F_AE_00*/ {0x1d3, 9916}, - /*II_F3_0F_AE_01*/ {0x1d3, 9946}, - /*II_0F_AE_02*/ {0x1d4, 9956}, - /*II_F3_0F_AE_02*/ {0x1d3, 9965}, - /*II_0F_AE_03*/ {0x1d4, 9985}, - /*II_F3_0F_AE_03*/ {0x1d3, 9994}, - /*II_0F_C7_06*/ {0x1d6, 10014}, - /*II_66_0F_C7_06*/ {0x18b, 10023}, - /*II_F3_0F_C7_06*/ {0x18b, 10032} + /*II_0F_00_00*/ {0x110, 1656}, + /*II_0F_00_01*/ {0x111, 1662}, + /*II_0F_00_02*/ {0x112, 1667}, + /*II_0F_00_03*/ {0x113, 1673}, + /*II_0F_00_04*/ {0x114, 1678}, + /*II_0F_00_05*/ {0x114, 1684}, + /*II_0F_01_00*/ {0x115, 1690}, + /*II_0F_01_01*/ {0x115, 1696}, + /*II_0F_01_02*/ {0x116, 1702}, + /*II_0F_01_03*/ {0x116, 1708}, + /*II_0F_01_04*/ {0x117, 1714}, + /*II_0F_01_06*/ {0x118, 1720}, + /*II_0F_01_07*/ {0x119, 1726}, + /*II_0F_01_C1*/ {0x11a, 1734}, + /*II_0F_01_C2*/ {0x11a, 1742}, + /*II_0F_01_C3*/ {0x11a, 1752}, + /*II_0F_01_C4*/ {0x11a, 1762}, + /*II_0F_01_C8*/ {0x11b, 1770}, + /*II_0F_01_C9*/ {0x11b, 1779}, + /*II_0F_01_CA*/ {0x11b, 1786}, + /*II_0F_01_CB*/ {0x11b, 1792}, + /*II_0F_01_D0*/ {0x91, 1798}, + /*II_0F_01_D1*/ {0x91, 1806}, + /*II_0F_01_D4*/ {0x11a, 1814}, + /*II_0F_01_D5*/ {0x11c, 1822}, + /*II_0F_01_D8*/ {0x11d, 1828}, + /*II_0F_01_D9*/ {0x11e, 1835}, + /*II_0F_01_DA*/ {0x11f, 1844}, + /*II_0F_01_DB*/ {0x11f, 1852}, + /*II_0F_01_DC*/ {0x11e, 1860}, + /*II_0F_01_DD*/ {0x11e, 1866}, + /*II_0F_01_DE*/ {0x11f, 1872}, + /*II_0F_01_DF*/ {0x120, 1880}, + /*II_0F_01_F8*/ {0x121, 1889}, + /*II_0F_01_F9*/ {0x121, 1897}, + /*II_0F_0D_00*/ {0x122, 1905}, + /*II_0F_0D_01*/ {0x122, 1915}, + /*II_0F_0F_0C*/ {0x123, 1926}, + /*II_0F_0F_0D*/ {0x124, 1933}, + /*II_0F_0F_1C*/ {0x123, 1940}, + /*II_0F_0F_1D*/ {0x124, 1947}, + /*II_0F_0F_8A*/ {0x123, 1954}, + /*II_0F_0F_8E*/ {0x123, 1962}, + /*II_0F_0F_90*/ {0x124, 1971}, + /*II_0F_0F_94*/ {0x124, 1980}, + /*II_0F_0F_96*/ {0x124, 1987}, + /*II_0F_0F_97*/ {0x124, 1994}, + /*II_0F_0F_9A*/ {0x124, 2003}, + /*II_0F_0F_9E*/ {0x124, 2010}, + /*II_0F_0F_A0*/ {0x124, 2017}, + /*II_0F_0F_A4*/ {0x124, 2026}, + /*II_0F_0F_A6*/ {0x124, 2033}, + /*II_0F_0F_A7*/ {0x124, 2043}, + /*II_0F_0F_AA*/ {0x124, 2053}, + /*II_0F_0F_AE*/ {0x124, 2061}, + /*II_0F_0F_B0*/ {0x124, 2068}, + /*II_0F_0F_B4*/ {0x124, 2077}, + /*II_0F_0F_B6*/ {0x124, 2084}, + /*II_0F_0F_B7*/ {0x124, 2094}, + /*II_0F_0F_BB*/ {0x123, 2103}, + /*II_0F_0F_BF*/ {0x124, 2111}, + /*II_0F_10*/ {0x125, 2120}, + /*II_66_0F_10*/ {0x126, 2128}, + /*II_F3_0F_10*/ {0x127, 2136}, + /*II_F2_0F_10*/ {0x128, 2143}, + /*II_0F_11*/ {0x12d, 2120}, + /*II_66_0F_11*/ {0x12e, 2128}, + /*II_F3_0F_11*/ {0x12f, 2136}, + /*II_F2_0F_11*/ {0x130, 2143}, + /*II_66_0F_12*/ {0x135, 2201}, + /*II_F3_0F_12*/ {0x136, 2209}, + /*II_F2_0F_12*/ {0x136, 2219}, + /*II_0F_13*/ {0x13a, 2193}, + /*II_66_0F_13*/ {0x13b, 2201}, + /*II_0F_14*/ {0x13d, 2277}, + /*II_66_0F_14*/ {0x13e, 2287}, + /*II_0F_15*/ {0x13d, 2319}, + /*II_66_0F_15*/ {0x13e, 2329}, + /*II_66_0F_16*/ {0x135, 2378}, + /*II_F3_0F_16*/ {0x140, 2386}, + /*II_0F_17*/ {0x13a, 2370}, + /*II_66_0F_17*/ {0x13b, 2378}, + /*II_0F_18_00*/ {0x141, 2435}, + /*II_0F_18_01*/ {0x141, 2448}, + /*II_0F_18_02*/ {0x141, 2460}, + /*II_0F_18_03*/ {0x141, 2472}, + /*II_0F_28*/ {0x125, 2484}, + /*II_66_0F_28*/ {0x126, 2492}, + /*II_0F_29*/ {0x12d, 2484}, + /*II_66_0F_29*/ {0x12e, 2492}, + /*II_0F_2A*/ {0x142, 2518}, + /*II_66_0F_2A*/ {0x143, 2528}, + /*II_F3_0F_2A*/ {0x144, 2538}, + /*II_F2_0F_2A*/ {0x145, 2548}, + /*II_0F_2B*/ {0x146, 2580}, + /*II_66_0F_2B*/ {0x147, 2589}, + /*II_F3_0F_2B*/ {0x148, 2598}, + /*II_F2_0F_2B*/ {0x149, 2607}, + /*II_0F_2C*/ {0x14b, 2636}, + /*II_66_0F_2C*/ {0x14c, 2647}, + /*II_F3_0F_2C*/ {0x14d, 2658}, + /*II_F2_0F_2C*/ {0x14e, 2669}, + /*II_0F_2D*/ {0x14b, 2704}, + /*II_66_0F_2D*/ {0x13e, 2714}, + /*II_F3_0F_2D*/ {0x14d, 2724}, + /*II_F2_0F_2D*/ {0x14e, 2734}, + /*II_0F_2E*/ {0x150, 2766}, + /*II_66_0F_2E*/ {0x151, 2775}, + /*II_0F_2F*/ {0x150, 2804}, + /*II_66_0F_2F*/ {0x151, 2812}, + /*II_0F_50*/ {0x154, 2838}, + /*II_66_0F_50*/ {0x155, 2848}, + /*II_0F_51*/ {0x13d, 2880}, + /*II_66_0F_51*/ {0x13e, 2888}, + /*II_F3_0F_51*/ {0x157, 2896}, + /*II_F2_0F_51*/ {0x151, 2904}, + /*II_0F_52*/ {0x13d, 2948}, + /*II_F3_0F_52*/ {0x157, 2957}, + /*II_0F_53*/ {0x13d, 2986}, + /*II_F3_0F_53*/ {0x157, 2993}, + /*II_0F_54*/ {0x13d, 3016}, + /*II_66_0F_54*/ {0x13e, 3023}, + /*II_0F_55*/ {0x13d, 3046}, + /*II_66_0F_55*/ {0x13e, 3054}, + /*II_0F_56*/ {0x13d, 3080}, + /*II_66_0F_56*/ {0x13e, 3086}, + /*II_0F_57*/ {0x13d, 3106}, + /*II_66_0F_57*/ {0x13e, 3113}, + /*II_0F_58*/ {0x13d, 3136}, + /*II_66_0F_58*/ {0x13e, 3143}, + /*II_F3_0F_58*/ {0x157, 3150}, + /*II_F2_0F_58*/ {0x151, 3157}, + /*II_0F_59*/ {0x13d, 3196}, + /*II_66_0F_59*/ {0x13e, 3203}, + /*II_F3_0F_59*/ {0x157, 3210}, + /*II_F2_0F_59*/ {0x151, 3217}, + /*II_0F_5A*/ {0x151, 3256}, + /*II_66_0F_5A*/ {0x13e, 3266}, + /*II_F3_0F_5A*/ {0x158, 3276}, + /*II_F2_0F_5A*/ {0x151, 3286}, + /*II_0F_5B*/ {0x13e, 3340}, + /*II_66_0F_5B*/ {0x13e, 3350}, + /*II_F3_0F_5B*/ {0x13e, 3360}, + /*II_0F_5C*/ {0x13d, 3405}, + /*II_66_0F_5C*/ {0x13e, 3412}, + /*II_F3_0F_5C*/ {0x157, 3419}, + /*II_F2_0F_5C*/ {0x151, 3426}, + /*II_0F_5D*/ {0x13d, 3465}, + /*II_66_0F_5D*/ {0x13e, 3472}, + /*II_F3_0F_5D*/ {0x157, 3479}, + /*II_F2_0F_5D*/ {0x151, 3486}, + /*II_0F_5E*/ {0x13d, 3525}, + /*II_66_0F_5E*/ {0x13e, 3532}, + /*II_F3_0F_5E*/ {0x157, 3539}, + /*II_F2_0F_5E*/ {0x151, 3546}, + /*II_0F_5F*/ {0x13d, 3585}, + /*II_66_0F_5F*/ {0x13e, 3592}, + /*II_F3_0F_5F*/ {0x157, 3599}, + /*II_F2_0F_5F*/ {0x151, 3606}, + /*II_0F_60*/ {0x15b, 3645}, + /*II_66_0F_60*/ {0x13e, 3645}, + /*II_0F_61*/ {0x15b, 3668}, + /*II_66_0F_61*/ {0x13e, 3668}, + /*II_0F_62*/ {0x15b, 3691}, + /*II_66_0F_62*/ {0x13e, 3691}, + /*II_0F_63*/ {0x15c, 3714}, + /*II_66_0F_63*/ {0x13e, 3714}, + /*II_0F_64*/ {0x15c, 3735}, + /*II_66_0F_64*/ {0x13e, 3735}, + /*II_0F_65*/ {0x15c, 3754}, + /*II_66_0F_65*/ {0x13e, 3754}, + /*II_0F_66*/ {0x15c, 3773}, + /*II_66_0F_66*/ {0x13e, 3773}, + /*II_0F_67*/ {0x15c, 3792}, + /*II_66_0F_67*/ {0x13e, 3792}, + /*II_0F_68*/ {0x15c, 3813}, + /*II_66_0F_68*/ {0x13e, 3813}, + /*II_0F_69*/ {0x15c, 3836}, + /*II_66_0F_69*/ {0x13e, 3836}, + /*II_0F_6A*/ {0x15c, 3859}, + /*II_66_0F_6A*/ {0x13e, 3859}, + /*II_0F_6B*/ {0x15c, 3882}, + /*II_66_0F_6B*/ {0x13e, 3882}, + /*II_66_0F_6C*/ {0x13e, 3903}, + /*II_66_0F_6D*/ {0x13e, 3928}, + /*II_0F_6F*/ {0x160, 3959}, + /*II_66_0F_6F*/ {0x126, 3979}, + /*II_F3_0F_6F*/ {0x126, 3987}, + /*II_0F_74*/ {0x15c, 4076}, + /*II_66_0F_74*/ {0x13e, 4076}, + /*II_0F_75*/ {0x15c, 4095}, + /*II_66_0F_75*/ {0x13e, 4095}, + /*II_0F_76*/ {0x15c, 4114}, + /*II_66_0F_76*/ {0x13e, 4114}, + /*II_0F_77*/ {0x164, 4133}, + /*II_0F_78*/ {0x166, 4161}, + /*II_0F_79*/ {0x169, 4185}, + /*II_66_0F_79*/ {0x16a, 4169}, + /*II_F2_0F_79*/ {0x16b, 4176}, + /*II_0F_7A_30*/ {0x16c, 4194}, + /*II_0F_7A_31*/ {0x16d, 4204}, + /*II_66_0F_7C*/ {0x16e, 4214}, + /*II_F2_0F_7C*/ {0x16e, 4222}, + /*II_66_0F_7D*/ {0x16e, 4248}, + /*II_F2_0F_7D*/ {0x16e, 4256}, + /*II_F3_0F_7E*/ {0x128, 3959}, + /*II_0F_7F*/ {0x172, 3959}, + /*II_66_0F_7F*/ {0x12e, 3979}, + /*II_F3_0F_7F*/ {0x12e, 3987}, + /*II_F3_0F_B8*/ {0x176, 4371}, + /*II_0F_BA_04*/ {0x177, 871}, + /*II_0F_BA_05*/ {0x178, 886}, + /*II_0F_BA_06*/ {0x178, 911}, + /*II_0F_BA_07*/ {0x178, 933}, + /*II_0F_BC*/ {0x179, 4379}, + /*II_F3_0F_BC*/ {0x17a, 4384}, + /*II_0F_BD*/ {0x179, 4391}, + /*II_F3_0F_BD*/ {0x17b, 4396}, + /*II_0F_C7_07*/ {0x18b, 6418}, + /*II_66_0F_D0*/ {0x16e, 6427}, + /*II_F2_0F_D0*/ {0x16e, 6437}, + /*II_0F_D1*/ {0x15c, 6469}, + /*II_66_0F_D1*/ {0x13e, 6469}, + /*II_0F_D2*/ {0x15c, 6484}, + /*II_66_0F_D2*/ {0x13e, 6484}, + /*II_0F_D3*/ {0x15c, 6499}, + /*II_66_0F_D3*/ {0x13e, 6499}, + /*II_0F_D4*/ {0x151, 6514}, + /*II_66_0F_D4*/ {0x13e, 6514}, + /*II_0F_D5*/ {0x15c, 6529}, + /*II_66_0F_D5*/ {0x13e, 6529}, + /*II_66_0F_D6*/ {0x130, 3959}, + /*II_F3_0F_D6*/ {0x18c, 6546}, + /*II_F2_0F_D6*/ {0x18d, 6555}, + /*II_0F_D7*/ {0x18f, 6564}, + /*II_66_0F_D7*/ {0x190, 6564}, + /*II_0F_D8*/ {0x15c, 6585}, + /*II_66_0F_D8*/ {0x13e, 6585}, + /*II_0F_D9*/ {0x15c, 6604}, + /*II_66_0F_D9*/ {0x13e, 6604}, + /*II_0F_DA*/ {0x192, 6623}, + /*II_66_0F_DA*/ {0x13e, 6623}, + /*II_0F_DB*/ {0x15c, 6640}, + /*II_66_0F_DB*/ {0x13e, 6640}, + /*II_0F_DC*/ {0x15c, 6653}, + /*II_66_0F_DC*/ {0x13e, 6653}, + /*II_0F_DD*/ {0x15c, 6672}, + /*II_66_0F_DD*/ {0x13e, 6672}, + /*II_0F_DE*/ {0x192, 6681}, + /*II_66_0F_DE*/ {0x13e, 6681}, + /*II_0F_DF*/ {0x15c, 6698}, + /*II_66_0F_DF*/ {0x13e, 6698}, + /*II_0F_E0*/ {0x192, 6713}, + /*II_66_0F_E0*/ {0x13e, 6713}, + /*II_0F_E1*/ {0x15c, 6728}, + /*II_66_0F_E1*/ {0x13e, 6728}, + /*II_0F_E2*/ {0x15c, 6743}, + /*II_66_0F_E2*/ {0x13e, 6743}, + /*II_0F_E3*/ {0x192, 6758}, + /*II_66_0F_E3*/ {0x13e, 6758}, + /*II_0F_E4*/ {0x192, 6773}, + /*II_66_0F_E4*/ {0x13e, 6773}, + /*II_0F_E5*/ {0x15c, 6792}, + /*II_66_0F_E5*/ {0x13e, 6792}, + /*II_66_0F_E6*/ {0x13e, 6809}, + /*II_F3_0F_E6*/ {0x151, 6820}, + /*II_F2_0F_E6*/ {0x13e, 6830}, + /*II_0F_E7*/ {0x193, 6874}, + /*II_66_0F_E7*/ {0x147, 6882}, + /*II_0F_E8*/ {0x15c, 6901}, + /*II_66_0F_E8*/ {0x13e, 6901}, + /*II_0F_E9*/ {0x15c, 6918}, + /*II_66_0F_E9*/ {0x13e, 6918}, + /*II_0F_EA*/ {0x192, 6935}, + /*II_66_0F_EA*/ {0x13e, 6935}, + /*II_0F_EB*/ {0x15c, 6952}, + /*II_66_0F_EB*/ {0x13e, 6952}, + /*II_0F_EC*/ {0x15c, 6963}, + /*II_66_0F_EC*/ {0x13e, 6963}, + /*II_0F_ED*/ {0x15c, 6980}, + /*II_66_0F_ED*/ {0x13e, 6980}, + /*II_0F_EE*/ {0x192, 6997}, + /*II_66_0F_EE*/ {0x13e, 6997}, + /*II_0F_EF*/ {0x15c, 7014}, + /*II_66_0F_EF*/ {0x13e, 7014}, + /*II_F2_0F_F0*/ {0x194, 7027}, + /*II_0F_F1*/ {0x15c, 7042}, + /*II_66_0F_F1*/ {0x13e, 7042}, + /*II_0F_F2*/ {0x15c, 7057}, + /*II_66_0F_F2*/ {0x13e, 7057}, + /*II_0F_F3*/ {0x15c, 7072}, + /*II_66_0F_F3*/ {0x13e, 7072}, + /*II_0F_F4*/ {0x196, 7087}, + /*II_66_0F_F4*/ {0x13e, 7087}, + /*II_0F_F5*/ {0x15c, 7106}, + /*II_66_0F_F5*/ {0x13e, 7106}, + /*II_0F_F6*/ {0x192, 7125}, + /*II_66_0F_F6*/ {0x13e, 7125}, + /*II_0F_F7*/ {0x197, 7142}, + /*II_66_0F_F7*/ {0x198, 7152}, + /*II_0F_F8*/ {0x15c, 7177}, + /*II_66_0F_F8*/ {0x13e, 7177}, + /*II_0F_F9*/ {0x15c, 7192}, + /*II_66_0F_F9*/ {0x13e, 7192}, + /*II_0F_FA*/ {0x15c, 7207}, + /*II_66_0F_FA*/ {0x13e, 7207}, + /*II_0F_FB*/ {0x196, 7222}, + /*II_66_0F_FB*/ {0x13e, 7222}, + /*II_0F_FC*/ {0x15c, 7237}, + /*II_66_0F_FC*/ {0x13e, 7237}, + /*II_0F_FD*/ {0x15c, 7252}, + /*II_66_0F_FD*/ {0x13e, 7252}, + /*II_0F_FE*/ {0x15c, 7267}, + /*II_66_0F_FE*/ {0x13e, 7267}, + /*II_D9_06*/ {0x19a, 7282}, + /*II_9B_D9_06*/ {0x19b, 7291}, + /*II_D9_07*/ {0xfe, 7299}, + /*II_9B_D9_07*/ {0x19c, 7307}, + /*II_DB_E2*/ {0xec, 7314}, + /*II_9B_DB_E2*/ {0x19d, 7322}, + /*II_DB_E3*/ {0xec, 7329}, + /*II_9B_DB_E3*/ {0x19d, 7337}, + /*II_DD_06*/ {0x19a, 7344}, + /*II_9B_DD_06*/ {0x19b, 7352}, + /*II_DD_07*/ {0xfe, 7359}, + /*II_9B_DD_07*/ {0x19c, 7367}, + /*II_DF_E0*/ {0x19e, 7359}, + /*II_9B_DF_E0*/ {0x19f, 7367}, + /*II_0F_38_00*/ {0x1a0, 7374}, + /*II_66_0F_38_00*/ {0x1a1, 7374}, + /*II_0F_38_01*/ {0x1a0, 7391}, + /*II_66_0F_38_01*/ {0x1a1, 7391}, + /*II_0F_38_02*/ {0x1a0, 7408}, + /*II_66_0F_38_02*/ {0x1a1, 7408}, + /*II_0F_38_03*/ {0x1a0, 7425}, + /*II_66_0F_38_03*/ {0x1a1, 7425}, + /*II_0F_38_04*/ {0x1a0, 7444}, + /*II_66_0F_38_04*/ {0x1a1, 7444}, + /*II_0F_38_05*/ {0x1a0, 7467}, + /*II_66_0F_38_05*/ {0x1a1, 7467}, + /*II_0F_38_06*/ {0x1a0, 7484}, + /*II_66_0F_38_06*/ {0x1a1, 7484}, + /*II_0F_38_07*/ {0x1a0, 7501}, + /*II_66_0F_38_07*/ {0x1a1, 7501}, + /*II_0F_38_08*/ {0x1a0, 7520}, + /*II_66_0F_38_08*/ {0x1a1, 7520}, + /*II_0F_38_09*/ {0x1a0, 7537}, + /*II_66_0F_38_09*/ {0x1a1, 7537}, + /*II_0F_38_0A*/ {0x1a0, 7554}, + /*II_66_0F_38_0A*/ {0x1a1, 7554}, + /*II_0F_38_0B*/ {0x1a0, 7571}, + /*II_66_0F_38_0B*/ {0x1a1, 7571}, + /*II_66_0F_38_17*/ {0x1a3, 7662}, + /*II_0F_38_1C*/ {0x1a0, 7721}, + /*II_66_0F_38_1C*/ {0x1a1, 7721}, + /*II_0F_38_1D*/ {0x1a0, 7736}, + /*II_66_0F_38_1D*/ {0x1a1, 7736}, + /*II_0F_38_1E*/ {0x1a0, 7751}, + /*II_66_0F_38_1E*/ {0x1a1, 7751}, + /*II_66_0F_38_20*/ {0x1a8, 7766}, + /*II_66_0F_38_21*/ {0x1a9, 7787}, + /*II_66_0F_38_22*/ {0x1aa, 7808}, + /*II_66_0F_38_23*/ {0x1a8, 7829}, + /*II_66_0F_38_24*/ {0x1a9, 7850}, + /*II_66_0F_38_25*/ {0x1a8, 7871}, + /*II_66_0F_38_28*/ {0x1ac, 7892}, + /*II_66_0F_38_29*/ {0x1ac, 7909}, + /*II_66_0F_38_2A*/ {0x1ad, 7928}, + /*II_66_0F_38_2B*/ {0x1ac, 7949}, + /*II_66_0F_38_30*/ {0x1a8, 7994}, + /*II_66_0F_38_31*/ {0x1a9, 8015}, + /*II_66_0F_38_32*/ {0x1aa, 8036}, + /*II_66_0F_38_33*/ {0x1a8, 8057}, + /*II_66_0F_38_34*/ {0x1a9, 8078}, + /*II_66_0F_38_35*/ {0x1a8, 8099}, + /*II_66_0F_38_37*/ {0x1a3, 8120}, + /*II_66_0F_38_38*/ {0x1ac, 8139}, + /*II_66_0F_38_39*/ {0x1ac, 8156}, + /*II_66_0F_38_3A*/ {0x1ac, 8173}, + /*II_66_0F_38_3B*/ {0x1ac, 8190}, + /*II_66_0F_38_3C*/ {0x1ac, 8207}, + /*II_66_0F_38_3D*/ {0x1ac, 8224}, + /*II_66_0F_38_3E*/ {0x1ac, 8241}, + /*II_66_0F_38_3F*/ {0x1ac, 8258}, + /*II_66_0F_38_40*/ {0x1ac, 8275}, + /*II_66_0F_38_41*/ {0x1ac, 8292}, + /*II_66_0F_38_80*/ {0x1b0, 8317}, + /*II_66_0F_38_81*/ {0x1b0, 8325}, + /*II_66_0F_38_82*/ {0x1b0, 8334}, + /*II_66_0F_38_DB*/ {0x1b3, 9183}, + /*II_66_0F_38_DC*/ {0x1b3, 9200}, + /*II_66_0F_38_DD*/ {0x1b3, 9217}, + /*II_66_0F_38_DE*/ {0x1b3, 9242}, + /*II_66_0F_38_DF*/ {0x1b3, 9259}, + /*II_0F_38_F0*/ {0x1b6, 9284}, + /*II_F2_0F_38_F0*/ {0x1b7, 9291}, + /*II_0F_38_F1*/ {0x1b8, 9284}, + /*II_F2_0F_38_F1*/ {0x1b9, 9291}, + /*II_0F_71_02*/ {0x1d0, 6469}, + /*II_66_0F_71_02*/ {0x1d1, 6469}, + /*II_0F_71_04*/ {0x1d0, 6728}, + /*II_66_0F_71_04*/ {0x1d1, 6728}, + /*II_0F_71_06*/ {0x1d0, 7042}, + /*II_66_0F_71_06*/ {0x1d1, 7042}, + /*II_0F_72_02*/ {0x1d0, 6484}, + /*II_66_0F_72_02*/ {0x1d1, 6484}, + /*II_0F_72_04*/ {0x1d0, 6743}, + /*II_66_0F_72_04*/ {0x1d1, 6743}, + /*II_0F_72_06*/ {0x1d0, 7057}, + /*II_66_0F_72_06*/ {0x1d1, 7057}, + /*II_0F_73_02*/ {0x1d0, 6499}, + /*II_66_0F_73_02*/ {0x1d1, 6499}, + /*II_66_0F_73_03*/ {0x1d1, 9863}, + /*II_0F_73_06*/ {0x1d0, 7072}, + /*II_66_0F_73_06*/ {0x1d1, 7072}, + /*II_66_0F_73_07*/ {0x1d1, 9880}, + /*II_F3_0F_AE_00*/ {0x1d3, 9915}, + /*II_F3_0F_AE_01*/ {0x1d3, 9945}, + /*II_0F_AE_02*/ {0x1d4, 9955}, + /*II_F3_0F_AE_02*/ {0x1d3, 9964}, + /*II_0F_AE_03*/ {0x1d4, 9984}, + /*II_F3_0F_AE_03*/ {0x1d3, 9993}, + /*II_0F_C7_06*/ {0x1d6, 10013}, + /*II_66_0F_C7_06*/ {0x18b, 10022}, + /*II_F3_0F_C7_06*/ {0x18b, 10031} }; _InstInfoEx InstInfosEx[381] = { @@ -1390,383 +1390,383 @@ _InstInfoEx InstInfosEx[381] = { /*II_6B*/ {{0x34, 117}, 0x0, 5, 0, 0, 0}, /*II_98*/ {{0x4e, 228}, 0x0, 0, 0, 233, 239}, /*II_99*/ {{0x4e, 245}, 0x0, 0, 0, 250, 255}, - /*II_E3*/ {{0x76, 427}, 0x0, 0, 0, 433, 440}, - /*II_0F_A4*/ {{0xad, 876}, 0x0, 1, 0, 0, 0}, - /*II_0F_A5*/ {{0xad, 876}, 0x0, 42, 0, 0, 0}, - /*II_0F_AC*/ {{0xad, 892}, 0x0, 1, 0, 0, 0}, - /*II_0F_AD*/ {{0xad, 892}, 0x0, 42, 0, 0, 0}, - /*II_V_0F_10*/ {{0x129, 2151}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_10*/ {{0x129, 2160}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_10*/ {{0x12a, 2169}, 0x20, 31, 0, 0, 0}, - /*II_V_F2_0F_10*/ {{0x12a, 2177}, 0x20, 31, 0, 0, 0}, - /*II_VRR_F3_0F_10*/ {{0x12b, 2169}, 0x60, 0, 0, 0, 0}, - /*II_VRR_F2_0F_10*/ {{0x12c, 2177}, 0x60, 0, 0, 0, 0}, - /*II_V_0F_11*/ {{0x131, 2151}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_11*/ {{0x131, 2160}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_11*/ {{0x12a, 2169}, 0x20, 31, 0, 0, 0}, - /*II_V_F2_0F_11*/ {{0x12a, 2177}, 0x20, 31, 0, 0, 0}, - /*II_VRR_F3_0F_11*/ {{0x132, 2169}, 0x60, 0, 0, 0, 0}, - /*II_VRR_F2_0F_11*/ {{0x133, 2177}, 0x60, 0, 0, 0, 0}, - /*II_0F_12*/ {{0x134, 2185}, 0x0, 0, 0, 2194, 0}, - /*II_V_0F_12*/ {{0x137, 2229}, 0x0, 86, 0, 2239, 0}, - /*II_V_66_0F_12*/ {{0x138, 2248}, 0x0, 57, 0, 0, 0}, - /*II_V_F3_0F_12*/ {{0x129, 2257}, 0x41, 0, 0, 0, 0}, - /*II_V_F2_0F_12*/ {{0x139, 2268}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_13*/ {{0x13c, 2239}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_13*/ {{0x13c, 2248}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_14*/ {{0x13f, 2298}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_14*/ {{0x13f, 2309}, 0x1, 91, 0, 0, 0}, - /*II_V_0F_15*/ {{0x13f, 2340}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_15*/ {{0x13f, 2351}, 0x1, 91, 0, 0, 0}, - /*II_0F_16*/ {{0x134, 2362}, 0x0, 0, 0, 2371, 0}, - /*II_V_0F_16*/ {{0x137, 2397}, 0x0, 86, 0, 2407, 0}, - /*II_V_66_0F_16*/ {{0x138, 2416}, 0x0, 57, 0, 0, 0}, - /*II_V_F3_0F_16*/ {{0x129, 2425}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_17*/ {{0x13c, 2407}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_17*/ {{0x13c, 2416}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_28*/ {{0x129, 2501}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_28*/ {{0x129, 2510}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_29*/ {{0x131, 2501}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_29*/ {{0x131, 2510}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_2A*/ {{0x138, 2559}, 0x2, 73, 0, 0, 0}, - /*II_V_F2_0F_2A*/ {{0x138, 2570}, 0x2, 73, 0, 0, 0}, - /*II_V_0F_2B*/ {{0x14a, 2617}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_2B*/ {{0x14a, 2627}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_2C*/ {{0x14f, 2681}, 0x42, 0, 0, 0, 0}, - /*II_V_F2_0F_2C*/ {{0x14f, 2693}, 0x42, 0, 0, 0, 0}, - /*II_V_F3_0F_2D*/ {{0x14f, 2745}, 0x42, 0, 0, 0, 0}, - /*II_V_F2_0F_2D*/ {{0x14f, 2756}, 0x42, 0, 0, 0, 0}, - /*II_V_0F_2E*/ {{0x152, 2785}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_2E*/ {{0x153, 2795}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_2F*/ {{0x152, 2821}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_2F*/ {{0x153, 2830}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_50*/ {{0x156, 2859}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_50*/ {{0x156, 2870}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_51*/ {{0x129, 2913}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_51*/ {{0x129, 2922}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_51*/ {{0x138, 2931}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_51*/ {{0x138, 2940}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_52*/ {{0x129, 2967}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_52*/ {{0x138, 2977}, 0x0, 85, 0, 0, 0}, - /*II_V_0F_53*/ {{0x129, 3001}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_53*/ {{0x138, 3009}, 0x0, 85, 0, 0, 0}, - /*II_V_0F_54*/ {{0x13f, 3031}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_54*/ {{0x13f, 3039}, 0x1, 91, 0, 0, 0}, - /*II_V_0F_55*/ {{0x13f, 3063}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_55*/ {{0x13f, 3072}, 0x1, 91, 0, 0, 0}, - /*II_V_0F_56*/ {{0x13f, 3093}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_56*/ {{0x13f, 3100}, 0x1, 91, 0, 0, 0}, - /*II_V_0F_57*/ {{0x13f, 3121}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_57*/ {{0x13f, 3129}, 0x1, 91, 0, 0, 0}, - /*II_V_0F_58*/ {{0x13f, 3165}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_58*/ {{0x13f, 3173}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_58*/ {{0x138, 3181}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_58*/ {{0x138, 3189}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_59*/ {{0x13f, 3225}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_59*/ {{0x13f, 3233}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_59*/ {{0x138, 3241}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_59*/ {{0x138, 3249}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_5A*/ {{0x159, 3297}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_5A*/ {{0x15a, 3308}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_5A*/ {{0x138, 3319}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_5A*/ {{0x138, 3330}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_5B*/ {{0x129, 3372}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_5B*/ {{0x129, 3383}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_5B*/ {{0x129, 3394}, 0x41, 0, 0, 0, 0}, - /*II_V_0F_5C*/ {{0x13f, 3434}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_5C*/ {{0x13f, 3442}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_5C*/ {{0x138, 3450}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_5C*/ {{0x138, 3458}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_5D*/ {{0x13f, 3494}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_5D*/ {{0x13f, 3502}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_5D*/ {{0x138, 3510}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_5D*/ {{0x138, 3518}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_5E*/ {{0x13f, 3554}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_5E*/ {{0x13f, 3562}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_5E*/ {{0x138, 3570}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_5E*/ {{0x138, 3578}, 0x0, 86, 0, 0, 0}, - /*II_V_0F_5F*/ {{0x13f, 3614}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_5F*/ {{0x13f, 3622}, 0x1, 91, 0, 0, 0}, - /*II_V_F3_0F_5F*/ {{0x138, 3630}, 0x0, 85, 0, 0, 0}, - /*II_V_F2_0F_5F*/ {{0x138, 3638}, 0x0, 86, 0, 0, 0}, - /*II_V_66_0F_60*/ {{0x138, 3657}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_61*/ {{0x138, 3680}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_62*/ {{0x138, 3703}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_63*/ {{0x138, 3725}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_64*/ {{0x138, 3745}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_65*/ {{0x138, 3764}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_66*/ {{0x138, 3783}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_67*/ {{0x138, 3803}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_68*/ {{0x138, 3825}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_69*/ {{0x138, 3848}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_6A*/ {{0x138, 3871}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_6B*/ {{0x138, 3893}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_6C*/ {{0x138, 3916}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_6D*/ {{0x138, 3941}, 0x0, 87, 0, 0, 0}, - /*II_0F_6E*/ {{0x15d, 3954}, 0x0, 0, 0, 0, 3960}, - /*II_66_0F_6E*/ {{0x15e, 3954}, 0x0, 0, 0, 0, 3960}, - /*II_V_66_0F_6E*/ {{0x15f, 3966}, 0x46, 0, 0, 3973, 0}, - /*II_V_66_0F_6F*/ {{0x129, 3996}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_6F*/ {{0x129, 4005}, 0x41, 0, 0, 0, 0}, - /*II_0F_70*/ {{0x161, 4014}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_70*/ {{0x162, 4022}, 0x0, 1, 0, 0, 0}, - /*II_F3_0F_70*/ {{0x162, 4030}, 0x0, 1, 0, 0, 0}, - /*II_F2_0F_70*/ {{0x162, 4039}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_70*/ {{0x163, 4048}, 0x40, 1, 0, 0, 0}, - /*II_V_F3_0F_70*/ {{0x163, 4057}, 0x40, 1, 0, 0, 0}, - /*II_V_F2_0F_70*/ {{0x163, 4067}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_74*/ {{0x138, 4086}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_75*/ {{0x138, 4105}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_76*/ {{0x138, 4124}, 0x0, 87, 0, 0, 0}, - /*II_V_0F_77*/ {{0x165, 4140}, 0x49, 0, 0, 4152, 0}, - /*II_66_0F_78*/ {{0x167, 4170}, 0x0, 49, 0, 0, 0}, - /*II_F2_0F_78*/ {{0x168, 4177}, 0x0, 48, 49, 0, 0}, - /*II_V_66_0F_7C*/ {{0x13f, 4231}, 0x1, 91, 0, 0, 0}, - /*II_V_F2_0F_7C*/ {{0x13f, 4240}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_7D*/ {{0x13f, 4265}, 0x1, 91, 0, 0, 0}, - /*II_V_F2_0F_7D*/ {{0x13f, 4274}, 0x1, 91, 0, 0, 0}, - /*II_0F_7E*/ {{0x16f, 3954}, 0x0, 0, 0, 0, 3960}, - /*II_66_0F_7E*/ {{0x170, 3954}, 0x0, 0, 0, 0, 3960}, - /*II_V_66_0F_7E*/ {{0x171, 3966}, 0x46, 0, 0, 3973, 0}, - /*II_V_F3_0F_7E*/ {{0x153, 3973}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_7F*/ {{0x131, 3996}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_7F*/ {{0x131, 4005}, 0x41, 0, 0, 0, 0}, - /*II_0F_AE_04*/ {{0x173, 4283}, 0x0, 0, 0, 0, 4290}, - /*II_0F_AE_05*/ {{0x174, 4299}, 0x0, 0, 0, 4307, 4315}, - /*II_0F_AE_06*/ {{0x174, 4325}, 0x0, 0, 0, 4333, 4343}, - /*II_0F_AE_07*/ {{0x175, 4355}, 0x0, 0, 0, 4363, 0}, - /*II_0F_C2*/ {{0x17c, 4404}, 0x0, 0, 0, 4413, 4422}, - /*II_66_0F_C2*/ {{0x17d, 4483}, 0x0, 0, 0, 4492, 4501}, - /*II_F3_0F_C2*/ {{0x17e, 4562}, 0x0, 0, 0, 4571, 4580}, - /*II_F2_0F_C2*/ {{0x17f, 4641}, 0x0, 0, 0, 4650, 4659}, - /*II_V_0F_C2*/ {{0x180, 4720}, 0x1, 91, 0, 4730, 4740}, - /*II_V_66_0F_C2*/ {{0x180, 5122}, 0x1, 91, 0, 5132, 5142}, - /*II_V_F3_0F_C2*/ {{0x181, 5524}, 0x0, 85, 0, 5534, 5544}, - /*II_V_F2_0F_C2*/ {{0x181, 5926}, 0x0, 86, 0, 5936, 5946}, - /*II_0F_C4*/ {{0x182, 6328}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C4*/ {{0x183, 6328}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_C4*/ {{0x184, 6336}, 0x0, 79, 1, 0, 0}, - /*II_0F_C5*/ {{0x185, 6345}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C5*/ {{0x186, 6345}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_C5*/ {{0x187, 6353}, 0x40, 1, 0, 0, 0}, - /*II_0F_C6*/ {{0x188, 6362}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_C6*/ {{0x162, 6370}, 0x0, 1, 0, 0, 0}, - /*II_V_0F_C6*/ {{0x189, 6378}, 0x1, 91, 1, 0, 0}, - /*II_V_66_0F_C6*/ {{0x189, 6387}, 0x1, 91, 1, 0, 0}, - /*II_0F_C7_01*/ {{0x18a, 6396}, 0x0, 0, 0, 0, 6407}, - /*II_V_66_0F_D0*/ {{0x13f, 6448}, 0x1, 91, 0, 0, 0}, - /*II_V_F2_0F_D0*/ {{0x13f, 6459}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_D1*/ {{0x138, 6477}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D2*/ {{0x138, 6492}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D3*/ {{0x138, 6507}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D4*/ {{0x138, 6522}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D5*/ {{0x138, 6538}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D6*/ {{0x18e, 3973}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_D7*/ {{0x191, 6575}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_D8*/ {{0x138, 6595}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_D9*/ {{0x138, 6614}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DA*/ {{0x138, 6632}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DB*/ {{0x138, 6647}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DC*/ {{0x138, 6663}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DD*/ {{0x138, 6663}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DE*/ {{0x138, 6690}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_DF*/ {{0x138, 6706}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E0*/ {{0x138, 6721}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E1*/ {{0x138, 6736}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E2*/ {{0x138, 6751}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E3*/ {{0x138, 6766}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E4*/ {{0x138, 6783}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E5*/ {{0x138, 6801}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E6*/ {{0x15a, 6841}, 0x41, 0, 0, 0, 0}, - /*II_V_F3_0F_E6*/ {{0x159, 6853}, 0x41, 0, 0, 0, 0}, - /*II_V_F2_0F_E6*/ {{0x15a, 6864}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_E7*/ {{0x14a, 6892}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_E8*/ {{0x138, 6910}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_E9*/ {{0x138, 6927}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_EA*/ {{0x138, 6944}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_EB*/ {{0x138, 6958}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_EC*/ {{0x138, 6972}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_ED*/ {{0x138, 6989}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_EE*/ {{0x138, 7006}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_EF*/ {{0x138, 7021}, 0x0, 87, 0, 0, 0}, - /*II_V_F2_0F_F0*/ {{0x195, 7035}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_F1*/ {{0x138, 7050}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F2*/ {{0x138, 7065}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F3*/ {{0x138, 7080}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F4*/ {{0x138, 7097}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F5*/ {{0x138, 7116}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F6*/ {{0x138, 7134}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F7*/ {{0x199, 7165}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_F8*/ {{0x138, 7185}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_F9*/ {{0x138, 7200}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_FA*/ {{0x138, 7215}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_FB*/ {{0x138, 7230}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_FC*/ {{0x138, 7245}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_FD*/ {{0x138, 7260}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_FE*/ {{0x138, 7275}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_00*/ {{0x138, 7383}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_01*/ {{0x138, 7400}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_02*/ {{0x138, 7417}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_03*/ {{0x138, 7435}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_04*/ {{0x138, 7456}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_05*/ {{0x138, 7476}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_06*/ {{0x138, 7493}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_07*/ {{0x138, 7511}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_08*/ {{0x138, 7529}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_09*/ {{0x138, 7546}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_0A*/ {{0x138, 7563}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_0B*/ {{0x138, 7582}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_0C*/ {{0x13f, 7593}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_38_0D*/ {{0x13f, 7604}, 0x1, 91, 0, 0, 0}, - /*II_V_66_0F_38_0E*/ {{0x129, 7615}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_0F*/ {{0x129, 7624}, 0x41, 0, 0, 0, 0}, - /*II_66_0F_38_10*/ {{0x1a2, 7633}, 0x0, 32, 0, 0, 0}, - /*II_66_0F_38_14*/ {{0x1a2, 7643}, 0x0, 32, 0, 0, 0}, - /*II_66_0F_38_15*/ {{0x1a2, 7653}, 0x0, 32, 0, 0, 0}, - /*II_V_66_0F_38_17*/ {{0x129, 7670}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_18*/ {{0x1a4, 7678}, 0x41, 0, 0, 0, 0}, - /*II_V_66_0F_38_19*/ {{0x1a5, 7692}, 0x50, 0, 0, 0, 0}, - /*II_V_66_0F_38_1A*/ {{0x1a6, 7706}, 0x50, 0, 0, 0, 0}, - /*II_V_66_0F_38_1C*/ {{0x1a7, 7729}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_1D*/ {{0x1a7, 7744}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_1E*/ {{0x1a7, 7759}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_20*/ {{0x153, 7777}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_21*/ {{0x152, 7798}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_22*/ {{0x1ab, 7819}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_23*/ {{0x153, 7840}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_24*/ {{0x152, 7861}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_25*/ {{0x153, 7882}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_28*/ {{0x138, 7901}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_29*/ {{0x138, 7919}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_2A*/ {{0x1ae, 7939}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_2B*/ {{0x138, 7960}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_2C*/ {{0x13f, 7971}, 0x1, 67, 0, 0, 0}, - /*II_V_66_0F_38_2D*/ {{0x13f, 7983}, 0x1, 67, 0, 0, 0}, - /*II_V_66_0F_38_2E*/ {{0x1af, 7971}, 0x1, 36, 0, 0, 0}, - /*II_V_66_0F_38_2F*/ {{0x1af, 7983}, 0x1, 36, 0, 0, 0}, - /*II_V_66_0F_38_30*/ {{0x153, 8005}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_31*/ {{0x152, 8026}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_32*/ {{0x1ab, 8047}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_33*/ {{0x153, 8068}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_34*/ {{0x152, 8089}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_35*/ {{0x153, 8110}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_37*/ {{0x138, 8130}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_38*/ {{0x138, 8148}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_39*/ {{0x138, 8165}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3A*/ {{0x138, 8182}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3B*/ {{0x138, 8199}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3C*/ {{0x138, 8216}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3D*/ {{0x138, 8233}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3E*/ {{0x138, 8250}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_3F*/ {{0x138, 8267}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_40*/ {{0x138, 8284}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_41*/ {{0x1a7, 8305}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_96*/ {{0x1b1, 8344}, 0x7, 91, 0, 8360, 0}, - /*II_V_66_0F_38_97*/ {{0x1b1, 8376}, 0x7, 91, 0, 8392, 0}, - /*II_V_66_0F_38_98*/ {{0x1b1, 8408}, 0x7, 91, 0, 8421, 0}, - /*II_V_66_0F_38_99*/ {{0x1b2, 8434}, 0x6, 88, 0, 8447, 0}, - /*II_V_66_0F_38_9A*/ {{0x1b1, 8460}, 0x7, 91, 0, 8473, 0}, - /*II_V_66_0F_38_9B*/ {{0x1b2, 8486}, 0x6, 88, 0, 8499, 0}, - /*II_V_66_0F_38_9C*/ {{0x1b1, 8512}, 0x7, 91, 0, 8526, 0}, - /*II_V_66_0F_38_9D*/ {{0x1b2, 8540}, 0x6, 88, 0, 8554, 0}, - /*II_V_66_0F_38_9E*/ {{0x1b1, 8568}, 0x7, 91, 0, 8582, 0}, - /*II_V_66_0F_38_9F*/ {{0x1b2, 8596}, 0x6, 88, 0, 8610, 0}, - /*II_V_66_0F_38_A6*/ {{0x1b1, 8624}, 0x7, 91, 0, 8640, 0}, - /*II_V_66_0F_38_A7*/ {{0x1b1, 8656}, 0x7, 91, 0, 8672, 0}, - /*II_V_66_0F_38_A8*/ {{0x1b1, 8688}, 0x7, 91, 0, 8701, 0}, - /*II_V_66_0F_38_A9*/ {{0x1b2, 8714}, 0x6, 88, 0, 8727, 0}, - /*II_V_66_0F_38_AA*/ {{0x1b1, 8740}, 0x7, 91, 0, 8753, 0}, - /*II_V_66_0F_38_AB*/ {{0x1b2, 8766}, 0x6, 88, 0, 8779, 0}, - /*II_V_66_0F_38_AC*/ {{0x1b1, 8792}, 0x7, 91, 0, 8806, 0}, - /*II_V_66_0F_38_AD*/ {{0x1b2, 8820}, 0x6, 88, 0, 8834, 0}, - /*II_V_66_0F_38_AE*/ {{0x1b1, 8848}, 0x7, 91, 0, 8862, 0}, - /*II_V_66_0F_38_AF*/ {{0x1b2, 8876}, 0x6, 88, 0, 8890, 0}, - /*II_V_66_0F_38_B6*/ {{0x1b1, 8904}, 0x7, 91, 0, 8920, 0}, - /*II_V_66_0F_38_B7*/ {{0x1b1, 8936}, 0x7, 91, 0, 8952, 0}, - /*II_V_66_0F_38_B8*/ {{0x1b1, 8968}, 0x7, 91, 0, 8981, 0}, - /*II_V_66_0F_38_B9*/ {{0x1b2, 8994}, 0x6, 88, 0, 9007, 0}, - /*II_V_66_0F_38_BA*/ {{0x1b1, 9020}, 0x7, 91, 0, 9033, 0}, - /*II_V_66_0F_38_BB*/ {{0x1b2, 9046}, 0x6, 88, 0, 9059, 0}, - /*II_V_66_0F_38_BC*/ {{0x1b1, 9072}, 0x7, 91, 0, 9086, 0}, - /*II_V_66_0F_38_BD*/ {{0x1b2, 9100}, 0x6, 88, 0, 9114, 0}, - /*II_V_66_0F_38_BE*/ {{0x1b1, 9128}, 0x7, 91, 0, 9142, 0}, - /*II_V_66_0F_38_BF*/ {{0x1b2, 9156}, 0x6, 88, 0, 9170, 0}, - /*II_V_66_0F_38_DB*/ {{0x1b4, 9192}, 0x40, 0, 0, 0, 0}, - /*II_V_66_0F_38_DC*/ {{0x1b5, 9209}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_DD*/ {{0x1b5, 9230}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_DE*/ {{0x1b5, 9251}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_38_DF*/ {{0x1b5, 9272}, 0x0, 87, 0, 0, 0}, - /*II_V_66_0F_3A_04*/ {{0x1ba, 7593}, 0x41, 1, 0, 0, 0}, - /*II_V_66_0F_3A_05*/ {{0x1ba, 7604}, 0x41, 1, 0, 0, 0}, - /*II_V_66_0F_3A_06*/ {{0x1bb, 9299}, 0x10, 89, 1, 0, 0}, - /*II_66_0F_3A_08*/ {{0x1a2, 9311}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_08*/ {{0x1ba, 9320}, 0x41, 1, 0, 0, 0}, - /*II_66_0F_3A_09*/ {{0x1a2, 9330}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_09*/ {{0x1ba, 9339}, 0x41, 1, 0, 0, 0}, - /*II_66_0F_3A_0A*/ {{0x1bc, 9349}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0A*/ {{0x184, 9358}, 0x0, 85, 1, 0, 0}, - /*II_66_0F_3A_0B*/ {{0x1bd, 9368}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0B*/ {{0x184, 9377}, 0x0, 86, 1, 0, 0}, - /*II_66_0F_3A_0C*/ {{0x1a2, 9387}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0C*/ {{0x189, 9396}, 0x1, 91, 1, 0, 0}, - /*II_66_0F_3A_0D*/ {{0x1a2, 9406}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0D*/ {{0x189, 9415}, 0x1, 91, 1, 0, 0}, - /*II_66_0F_3A_0E*/ {{0x1a2, 9425}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0E*/ {{0x184, 9434}, 0x0, 87, 1, 0, 0}, - /*II_0F_3A_0F*/ {{0x1be, 9444}, 0x0, 1, 0, 0, 0}, - /*II_66_0F_3A_0F*/ {{0x1bf, 9444}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_0F*/ {{0x184, 9453}, 0x0, 87, 1, 0, 0}, - /*II_66_0F_3A_14*/ {{0x1c0, 9463}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_14*/ {{0x1c1, 9471}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_15*/ {{0x1c2, 6345}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_15*/ {{0x1c3, 6353}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_16*/ {{0x1c4, 9480}, 0x0, 1, 0, 0, 9488}, - /*II_V_66_0F_3A_16*/ {{0x1c5, 9496}, 0x46, 1, 0, 9505, 0}, - /*II_66_0F_3A_17*/ {{0x1c6, 9514}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_17*/ {{0x1c7, 9525}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_3A_18*/ {{0x1bb, 9537}, 0x10, 87, 1, 0, 0}, - /*II_V_66_0F_3A_19*/ {{0x1c8, 9550}, 0x50, 1, 0, 0, 0}, - /*II_66_0F_3A_20*/ {{0x1c9, 9564}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_20*/ {{0x184, 9572}, 0x0, 80, 1, 0, 0}, - /*II_66_0F_3A_21*/ {{0x1bc, 9581}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_21*/ {{0x184, 9591}, 0x0, 85, 1, 0, 0}, - /*II_66_0F_3A_22*/ {{0x1ca, 9602}, 0x0, 1, 0, 0, 9610}, - /*II_V_66_0F_3A_22*/ {{0x184, 9618}, 0x6, 73, 1, 9627, 0}, - /*II_66_0F_3A_40*/ {{0x1a2, 9636}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_40*/ {{0x189, 9642}, 0x1, 91, 1, 0, 0}, - /*II_66_0F_3A_41*/ {{0x1a2, 9649}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_41*/ {{0x184, 9655}, 0x0, 87, 1, 0, 0}, - /*II_66_0F_3A_42*/ {{0x1a2, 9662}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_42*/ {{0x184, 9671}, 0x0, 87, 1, 0, 0}, - /*II_66_0F_3A_44*/ {{0x1cb, 9681}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_44*/ {{0x1cc, 9692}, 0x0, 87, 1, 0, 0}, - /*II_V_66_0F_3A_4A*/ {{0x189, 9704}, 0x1, 91, 37, 0, 0}, - /*II_V_66_0F_3A_4B*/ {{0x189, 9715}, 0x1, 91, 37, 0, 0}, - /*II_V_66_0F_3A_4C*/ {{0x184, 9726}, 0x0, 87, 35, 0, 0}, - /*II_66_0F_3A_60*/ {{0x1cd, 9737}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_60*/ {{0x163, 9748}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_61*/ {{0x1cd, 9760}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_61*/ {{0x163, 9771}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_62*/ {{0x1cd, 9783}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_62*/ {{0x163, 9794}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_63*/ {{0x1cd, 9806}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_63*/ {{0x163, 9817}, 0x40, 1, 0, 0, 0}, - /*II_66_0F_3A_DF*/ {{0x1ce, 9829}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_3A_DF*/ {{0x1cf, 9846}, 0x40, 1, 0, 0, 0}, - /*II_V_66_0F_71_02*/ {{0x1d2, 6477}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_71_04*/ {{0x1d2, 6736}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_71_06*/ {{0x1d2, 7050}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_02*/ {{0x1d2, 6492}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_04*/ {{0x1d2, 6751}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_72_06*/ {{0x1d2, 7065}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_02*/ {{0x1d2, 6507}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_03*/ {{0x1d2, 9872}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_06*/ {{0x1d2, 7080}, 0x0, 1, 0, 0, 0}, - /*II_V_66_0F_73_07*/ {{0x1d2, 9889}, 0x0, 1, 0, 0, 0}, - /*II_0F_AE_00*/ {{0x173, 9898}, 0x0, 0, 0, 0, 9906}, - /*II_0F_AE_01*/ {{0x173, 9926}, 0x0, 0, 0, 0, 9935}, - /*II_V_0F_AE_02*/ {{0x1d5, 9975}, 0x40, 0, 0, 0, 0}, - /*II_V_0F_AE_03*/ {{0x1d5, 10004}, 0x40, 0, 0, 0, 0} + /*II_E3*/ {{0x75, 426}, 0x0, 0, 0, 432, 439}, + /*II_0F_A4*/ {{0xad, 875}, 0x0, 1, 0, 0, 0}, + /*II_0F_A5*/ {{0xad, 875}, 0x0, 42, 0, 0, 0}, + /*II_0F_AC*/ {{0xad, 891}, 0x0, 1, 0, 0, 0}, + /*II_0F_AD*/ {{0xad, 891}, 0x0, 42, 0, 0, 0}, + /*II_V_0F_10*/ {{0x129, 2150}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_10*/ {{0x129, 2159}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_10*/ {{0x12a, 2168}, 0x20, 31, 0, 0, 0}, + /*II_V_F2_0F_10*/ {{0x12a, 2176}, 0x20, 31, 0, 0, 0}, + /*II_VRR_F3_0F_10*/ {{0x12b, 2168}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_10*/ {{0x12c, 2176}, 0x60, 0, 0, 0, 0}, + /*II_V_0F_11*/ {{0x131, 2150}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_11*/ {{0x131, 2159}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_11*/ {{0x12a, 2168}, 0x20, 31, 0, 0, 0}, + /*II_V_F2_0F_11*/ {{0x12a, 2176}, 0x20, 31, 0, 0, 0}, + /*II_VRR_F3_0F_11*/ {{0x132, 2168}, 0x60, 0, 0, 0, 0}, + /*II_VRR_F2_0F_11*/ {{0x133, 2176}, 0x60, 0, 0, 0, 0}, + /*II_0F_12*/ {{0x134, 2184}, 0x0, 0, 0, 2193, 0}, + /*II_V_0F_12*/ {{0x137, 2228}, 0x0, 86, 0, 2238, 0}, + /*II_V_66_0F_12*/ {{0x138, 2247}, 0x0, 57, 0, 0, 0}, + /*II_V_F3_0F_12*/ {{0x129, 2256}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_12*/ {{0x139, 2267}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_13*/ {{0x13c, 2238}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_13*/ {{0x13c, 2247}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_14*/ {{0x13f, 2297}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_14*/ {{0x13f, 2308}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_15*/ {{0x13f, 2339}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_15*/ {{0x13f, 2350}, 0x1, 91, 0, 0, 0}, + /*II_0F_16*/ {{0x134, 2361}, 0x0, 0, 0, 2370, 0}, + /*II_V_0F_16*/ {{0x137, 2396}, 0x0, 86, 0, 2406, 0}, + /*II_V_66_0F_16*/ {{0x138, 2415}, 0x0, 57, 0, 0, 0}, + /*II_V_F3_0F_16*/ {{0x129, 2424}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_17*/ {{0x13c, 2406}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_17*/ {{0x13c, 2415}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_28*/ {{0x129, 2500}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_28*/ {{0x129, 2509}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_29*/ {{0x131, 2500}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_29*/ {{0x131, 2509}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2A*/ {{0x138, 2558}, 0x2, 73, 0, 0, 0}, + /*II_V_F2_0F_2A*/ {{0x138, 2569}, 0x2, 73, 0, 0, 0}, + /*II_V_0F_2B*/ {{0x14a, 2616}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_2B*/ {{0x14a, 2626}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_2C*/ {{0x14f, 2680}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2C*/ {{0x14f, 2692}, 0x42, 0, 0, 0, 0}, + /*II_V_F3_0F_2D*/ {{0x14f, 2744}, 0x42, 0, 0, 0, 0}, + /*II_V_F2_0F_2D*/ {{0x14f, 2755}, 0x42, 0, 0, 0, 0}, + /*II_V_0F_2E*/ {{0x152, 2784}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2E*/ {{0x153, 2794}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_2F*/ {{0x152, 2820}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_2F*/ {{0x153, 2829}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_50*/ {{0x156, 2858}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_50*/ {{0x156, 2869}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_51*/ {{0x129, 2912}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_51*/ {{0x129, 2921}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_51*/ {{0x138, 2930}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_51*/ {{0x138, 2939}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_52*/ {{0x129, 2966}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_52*/ {{0x138, 2976}, 0x0, 85, 0, 0, 0}, + /*II_V_0F_53*/ {{0x129, 3000}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_53*/ {{0x138, 3008}, 0x0, 85, 0, 0, 0}, + /*II_V_0F_54*/ {{0x13f, 3030}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_54*/ {{0x13f, 3038}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_55*/ {{0x13f, 3062}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_55*/ {{0x13f, 3071}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_56*/ {{0x13f, 3092}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_56*/ {{0x13f, 3099}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_57*/ {{0x13f, 3120}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_57*/ {{0x13f, 3128}, 0x1, 91, 0, 0, 0}, + /*II_V_0F_58*/ {{0x13f, 3164}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_58*/ {{0x13f, 3172}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_58*/ {{0x138, 3180}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_58*/ {{0x138, 3188}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_59*/ {{0x13f, 3224}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_59*/ {{0x13f, 3232}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_59*/ {{0x138, 3240}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_59*/ {{0x138, 3248}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5A*/ {{0x159, 3296}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5A*/ {{0x15a, 3307}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5A*/ {{0x138, 3318}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5A*/ {{0x138, 3329}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5B*/ {{0x129, 3371}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_5B*/ {{0x129, 3382}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_5B*/ {{0x129, 3393}, 0x41, 0, 0, 0, 0}, + /*II_V_0F_5C*/ {{0x13f, 3433}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5C*/ {{0x13f, 3441}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5C*/ {{0x138, 3449}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5C*/ {{0x138, 3457}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5D*/ {{0x13f, 3493}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5D*/ {{0x13f, 3501}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5D*/ {{0x138, 3509}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5D*/ {{0x138, 3517}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5E*/ {{0x13f, 3553}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5E*/ {{0x13f, 3561}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5E*/ {{0x138, 3569}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5E*/ {{0x138, 3577}, 0x0, 86, 0, 0, 0}, + /*II_V_0F_5F*/ {{0x13f, 3613}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_5F*/ {{0x13f, 3621}, 0x1, 91, 0, 0, 0}, + /*II_V_F3_0F_5F*/ {{0x138, 3629}, 0x0, 85, 0, 0, 0}, + /*II_V_F2_0F_5F*/ {{0x138, 3637}, 0x0, 86, 0, 0, 0}, + /*II_V_66_0F_60*/ {{0x138, 3656}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_61*/ {{0x138, 3679}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_62*/ {{0x138, 3702}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_63*/ {{0x138, 3724}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_64*/ {{0x138, 3744}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_65*/ {{0x138, 3763}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_66*/ {{0x138, 3782}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_67*/ {{0x138, 3802}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_68*/ {{0x138, 3824}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_69*/ {{0x138, 3847}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6A*/ {{0x138, 3870}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6B*/ {{0x138, 3892}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6C*/ {{0x138, 3915}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_6D*/ {{0x138, 3940}, 0x0, 87, 0, 0, 0}, + /*II_0F_6E*/ {{0x15d, 3953}, 0x0, 0, 0, 0, 3959}, + /*II_66_0F_6E*/ {{0x15e, 3953}, 0x0, 0, 0, 0, 3959}, + /*II_V_66_0F_6E*/ {{0x15f, 3965}, 0x46, 0, 0, 3972, 0}, + /*II_V_66_0F_6F*/ {{0x129, 3995}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_6F*/ {{0x129, 4004}, 0x41, 0, 0, 0, 0}, + /*II_0F_70*/ {{0x161, 4013}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_70*/ {{0x162, 4021}, 0x0, 1, 0, 0, 0}, + /*II_F3_0F_70*/ {{0x162, 4029}, 0x0, 1, 0, 0, 0}, + /*II_F2_0F_70*/ {{0x162, 4038}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_70*/ {{0x163, 4047}, 0x40, 1, 0, 0, 0}, + /*II_V_F3_0F_70*/ {{0x163, 4056}, 0x40, 1, 0, 0, 0}, + /*II_V_F2_0F_70*/ {{0x163, 4066}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_74*/ {{0x138, 4085}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_75*/ {{0x138, 4104}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_76*/ {{0x138, 4123}, 0x0, 87, 0, 0, 0}, + /*II_V_0F_77*/ {{0x165, 4139}, 0x49, 0, 0, 4151, 0}, + /*II_66_0F_78*/ {{0x167, 4169}, 0x0, 49, 0, 0, 0}, + /*II_F2_0F_78*/ {{0x168, 4176}, 0x0, 48, 49, 0, 0}, + /*II_V_66_0F_7C*/ {{0x13f, 4230}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_7C*/ {{0x13f, 4239}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_7D*/ {{0x13f, 4264}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_7D*/ {{0x13f, 4273}, 0x1, 91, 0, 0, 0}, + /*II_0F_7E*/ {{0x16f, 3953}, 0x0, 0, 0, 0, 3959}, + /*II_66_0F_7E*/ {{0x170, 3953}, 0x0, 0, 0, 0, 3959}, + /*II_V_66_0F_7E*/ {{0x171, 3965}, 0x46, 0, 0, 3972, 0}, + /*II_V_F3_0F_7E*/ {{0x153, 3972}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_7F*/ {{0x131, 3995}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_7F*/ {{0x131, 4004}, 0x41, 0, 0, 0, 0}, + /*II_0F_AE_04*/ {{0x173, 4282}, 0x0, 0, 0, 0, 4289}, + /*II_0F_AE_05*/ {{0x174, 4298}, 0x0, 0, 0, 4306, 4314}, + /*II_0F_AE_06*/ {{0x174, 4324}, 0x0, 0, 0, 4332, 4342}, + /*II_0F_AE_07*/ {{0x175, 4354}, 0x0, 0, 0, 4362, 0}, + /*II_0F_C2*/ {{0x17c, 4403}, 0x0, 0, 0, 4412, 4421}, + /*II_66_0F_C2*/ {{0x17d, 4482}, 0x0, 0, 0, 4491, 4500}, + /*II_F3_0F_C2*/ {{0x17e, 4561}, 0x0, 0, 0, 4570, 4579}, + /*II_F2_0F_C2*/ {{0x17f, 4640}, 0x0, 0, 0, 4649, 4658}, + /*II_V_0F_C2*/ {{0x180, 4719}, 0x1, 91, 0, 4729, 4739}, + /*II_V_66_0F_C2*/ {{0x180, 5121}, 0x1, 91, 0, 5131, 5141}, + /*II_V_F3_0F_C2*/ {{0x181, 5523}, 0x0, 85, 0, 5533, 5543}, + /*II_V_F2_0F_C2*/ {{0x181, 5925}, 0x0, 86, 0, 5935, 5945}, + /*II_0F_C4*/ {{0x182, 6327}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C4*/ {{0x183, 6327}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C4*/ {{0x184, 6335}, 0x0, 79, 1, 0, 0}, + /*II_0F_C5*/ {{0x185, 6344}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C5*/ {{0x186, 6344}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_C5*/ {{0x187, 6352}, 0x40, 1, 0, 0, 0}, + /*II_0F_C6*/ {{0x188, 6361}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_C6*/ {{0x162, 6369}, 0x0, 1, 0, 0, 0}, + /*II_V_0F_C6*/ {{0x189, 6377}, 0x1, 91, 1, 0, 0}, + /*II_V_66_0F_C6*/ {{0x189, 6386}, 0x1, 91, 1, 0, 0}, + /*II_0F_C7_01*/ {{0x18a, 6395}, 0x0, 0, 0, 0, 6406}, + /*II_V_66_0F_D0*/ {{0x13f, 6447}, 0x1, 91, 0, 0, 0}, + /*II_V_F2_0F_D0*/ {{0x13f, 6458}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_D1*/ {{0x138, 6476}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D2*/ {{0x138, 6491}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D3*/ {{0x138, 6506}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D4*/ {{0x138, 6521}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D5*/ {{0x138, 6537}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D6*/ {{0x18e, 3972}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D7*/ {{0x191, 6574}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_D8*/ {{0x138, 6594}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_D9*/ {{0x138, 6613}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DA*/ {{0x138, 6631}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DB*/ {{0x138, 6646}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DC*/ {{0x138, 6662}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DD*/ {{0x138, 6662}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DE*/ {{0x138, 6689}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_DF*/ {{0x138, 6705}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E0*/ {{0x138, 6720}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E1*/ {{0x138, 6735}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E2*/ {{0x138, 6750}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E3*/ {{0x138, 6765}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E4*/ {{0x138, 6782}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E5*/ {{0x138, 6800}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E6*/ {{0x15a, 6840}, 0x41, 0, 0, 0, 0}, + /*II_V_F3_0F_E6*/ {{0x159, 6852}, 0x41, 0, 0, 0, 0}, + /*II_V_F2_0F_E6*/ {{0x15a, 6863}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E7*/ {{0x14a, 6891}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_E8*/ {{0x138, 6909}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_E9*/ {{0x138, 6926}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EA*/ {{0x138, 6943}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EB*/ {{0x138, 6957}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EC*/ {{0x138, 6971}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_ED*/ {{0x138, 6988}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EE*/ {{0x138, 7005}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_EF*/ {{0x138, 7020}, 0x0, 87, 0, 0, 0}, + /*II_V_F2_0F_F0*/ {{0x195, 7034}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_F1*/ {{0x138, 7049}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F2*/ {{0x138, 7064}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F3*/ {{0x138, 7079}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F4*/ {{0x138, 7096}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F5*/ {{0x138, 7115}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F6*/ {{0x138, 7133}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F7*/ {{0x199, 7164}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_F8*/ {{0x138, 7184}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_F9*/ {{0x138, 7199}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FA*/ {{0x138, 7214}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FB*/ {{0x138, 7229}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FC*/ {{0x138, 7244}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FD*/ {{0x138, 7259}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_FE*/ {{0x138, 7274}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_00*/ {{0x138, 7382}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_01*/ {{0x138, 7399}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_02*/ {{0x138, 7416}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_03*/ {{0x138, 7434}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_04*/ {{0x138, 7455}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_05*/ {{0x138, 7475}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_06*/ {{0x138, 7492}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_07*/ {{0x138, 7510}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_08*/ {{0x138, 7528}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_09*/ {{0x138, 7545}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0A*/ {{0x138, 7562}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0B*/ {{0x138, 7581}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_0C*/ {{0x13f, 7592}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_38_0D*/ {{0x13f, 7603}, 0x1, 91, 0, 0, 0}, + /*II_V_66_0F_38_0E*/ {{0x129, 7614}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_0F*/ {{0x129, 7623}, 0x41, 0, 0, 0, 0}, + /*II_66_0F_38_10*/ {{0x1a2, 7632}, 0x0, 32, 0, 0, 0}, + /*II_66_0F_38_14*/ {{0x1a2, 7642}, 0x0, 32, 0, 0, 0}, + /*II_66_0F_38_15*/ {{0x1a2, 7652}, 0x0, 32, 0, 0, 0}, + /*II_V_66_0F_38_17*/ {{0x129, 7669}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_18*/ {{0x1a4, 7677}, 0x41, 0, 0, 0, 0}, + /*II_V_66_0F_38_19*/ {{0x1a5, 7691}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1A*/ {{0x1a6, 7705}, 0x50, 0, 0, 0, 0}, + /*II_V_66_0F_38_1C*/ {{0x1a7, 7728}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1D*/ {{0x1a7, 7743}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_1E*/ {{0x1a7, 7758}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_20*/ {{0x153, 7776}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_21*/ {{0x152, 7797}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_22*/ {{0x1ab, 7818}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_23*/ {{0x153, 7839}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_24*/ {{0x152, 7860}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_25*/ {{0x153, 7881}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_28*/ {{0x138, 7900}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_29*/ {{0x138, 7918}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_2A*/ {{0x1ae, 7938}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_2B*/ {{0x138, 7959}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_2C*/ {{0x13f, 7970}, 0x1, 67, 0, 0, 0}, + /*II_V_66_0F_38_2D*/ {{0x13f, 7982}, 0x1, 67, 0, 0, 0}, + /*II_V_66_0F_38_2E*/ {{0x1af, 7970}, 0x1, 36, 0, 0, 0}, + /*II_V_66_0F_38_2F*/ {{0x1af, 7982}, 0x1, 36, 0, 0, 0}, + /*II_V_66_0F_38_30*/ {{0x153, 8004}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_31*/ {{0x152, 8025}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_32*/ {{0x1ab, 8046}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_33*/ {{0x153, 8067}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_34*/ {{0x152, 8088}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_35*/ {{0x153, 8109}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_37*/ {{0x138, 8129}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_38*/ {{0x138, 8147}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_39*/ {{0x138, 8164}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3A*/ {{0x138, 8181}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3B*/ {{0x138, 8198}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3C*/ {{0x138, 8215}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3D*/ {{0x138, 8232}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3E*/ {{0x138, 8249}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_3F*/ {{0x138, 8266}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_40*/ {{0x138, 8283}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_41*/ {{0x1a7, 8304}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_96*/ {{0x1b1, 8343}, 0x7, 91, 0, 8359, 0}, + /*II_V_66_0F_38_97*/ {{0x1b1, 8375}, 0x7, 91, 0, 8391, 0}, + /*II_V_66_0F_38_98*/ {{0x1b1, 8407}, 0x7, 91, 0, 8420, 0}, + /*II_V_66_0F_38_99*/ {{0x1b2, 8433}, 0x6, 88, 0, 8446, 0}, + /*II_V_66_0F_38_9A*/ {{0x1b1, 8459}, 0x7, 91, 0, 8472, 0}, + /*II_V_66_0F_38_9B*/ {{0x1b2, 8485}, 0x6, 88, 0, 8498, 0}, + /*II_V_66_0F_38_9C*/ {{0x1b1, 8511}, 0x7, 91, 0, 8525, 0}, + /*II_V_66_0F_38_9D*/ {{0x1b2, 8539}, 0x6, 88, 0, 8553, 0}, + /*II_V_66_0F_38_9E*/ {{0x1b1, 8567}, 0x7, 91, 0, 8581, 0}, + /*II_V_66_0F_38_9F*/ {{0x1b2, 8595}, 0x6, 88, 0, 8609, 0}, + /*II_V_66_0F_38_A6*/ {{0x1b1, 8623}, 0x7, 91, 0, 8639, 0}, + /*II_V_66_0F_38_A7*/ {{0x1b1, 8655}, 0x7, 91, 0, 8671, 0}, + /*II_V_66_0F_38_A8*/ {{0x1b1, 8687}, 0x7, 91, 0, 8700, 0}, + /*II_V_66_0F_38_A9*/ {{0x1b2, 8713}, 0x6, 88, 0, 8726, 0}, + /*II_V_66_0F_38_AA*/ {{0x1b1, 8739}, 0x7, 91, 0, 8752, 0}, + /*II_V_66_0F_38_AB*/ {{0x1b2, 8765}, 0x6, 88, 0, 8778, 0}, + /*II_V_66_0F_38_AC*/ {{0x1b1, 8791}, 0x7, 91, 0, 8805, 0}, + /*II_V_66_0F_38_AD*/ {{0x1b2, 8819}, 0x6, 88, 0, 8833, 0}, + /*II_V_66_0F_38_AE*/ {{0x1b1, 8847}, 0x7, 91, 0, 8861, 0}, + /*II_V_66_0F_38_AF*/ {{0x1b2, 8875}, 0x6, 88, 0, 8889, 0}, + /*II_V_66_0F_38_B6*/ {{0x1b1, 8903}, 0x7, 91, 0, 8919, 0}, + /*II_V_66_0F_38_B7*/ {{0x1b1, 8935}, 0x7, 91, 0, 8951, 0}, + /*II_V_66_0F_38_B8*/ {{0x1b1, 8967}, 0x7, 91, 0, 8980, 0}, + /*II_V_66_0F_38_B9*/ {{0x1b2, 8993}, 0x6, 88, 0, 9006, 0}, + /*II_V_66_0F_38_BA*/ {{0x1b1, 9019}, 0x7, 91, 0, 9032, 0}, + /*II_V_66_0F_38_BB*/ {{0x1b2, 9045}, 0x6, 88, 0, 9058, 0}, + /*II_V_66_0F_38_BC*/ {{0x1b1, 9071}, 0x7, 91, 0, 9085, 0}, + /*II_V_66_0F_38_BD*/ {{0x1b2, 9099}, 0x6, 88, 0, 9113, 0}, + /*II_V_66_0F_38_BE*/ {{0x1b1, 9127}, 0x7, 91, 0, 9141, 0}, + /*II_V_66_0F_38_BF*/ {{0x1b2, 9155}, 0x6, 88, 0, 9169, 0}, + /*II_V_66_0F_38_DB*/ {{0x1b4, 9191}, 0x40, 0, 0, 0, 0}, + /*II_V_66_0F_38_DC*/ {{0x1b5, 9208}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DD*/ {{0x1b5, 9229}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DE*/ {{0x1b5, 9250}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_38_DF*/ {{0x1b5, 9271}, 0x0, 87, 0, 0, 0}, + /*II_V_66_0F_3A_04*/ {{0x1ba, 7592}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_05*/ {{0x1ba, 7603}, 0x41, 1, 0, 0, 0}, + /*II_V_66_0F_3A_06*/ {{0x1bb, 9298}, 0x10, 89, 1, 0, 0}, + /*II_66_0F_3A_08*/ {{0x1a2, 9310}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_08*/ {{0x1ba, 9319}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_09*/ {{0x1a2, 9329}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_09*/ {{0x1ba, 9338}, 0x41, 1, 0, 0, 0}, + /*II_66_0F_3A_0A*/ {{0x1bc, 9348}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0A*/ {{0x184, 9357}, 0x0, 85, 1, 0, 0}, + /*II_66_0F_3A_0B*/ {{0x1bd, 9367}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0B*/ {{0x184, 9376}, 0x0, 86, 1, 0, 0}, + /*II_66_0F_3A_0C*/ {{0x1a2, 9386}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0C*/ {{0x189, 9395}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_0D*/ {{0x1a2, 9405}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0D*/ {{0x189, 9414}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_0E*/ {{0x1a2, 9424}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0E*/ {{0x184, 9433}, 0x0, 87, 1, 0, 0}, + /*II_0F_3A_0F*/ {{0x1be, 9443}, 0x0, 1, 0, 0, 0}, + /*II_66_0F_3A_0F*/ {{0x1bf, 9443}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_0F*/ {{0x184, 9452}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_14*/ {{0x1c0, 9462}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_14*/ {{0x1c1, 9470}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_15*/ {{0x1c2, 6344}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_15*/ {{0x1c3, 6352}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_16*/ {{0x1c4, 9479}, 0x0, 1, 0, 0, 9487}, + /*II_V_66_0F_3A_16*/ {{0x1c5, 9495}, 0x46, 1, 0, 9504, 0}, + /*II_66_0F_3A_17*/ {{0x1c6, 9513}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_17*/ {{0x1c7, 9524}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_3A_18*/ {{0x1bb, 9536}, 0x10, 87, 1, 0, 0}, + /*II_V_66_0F_3A_19*/ {{0x1c8, 9549}, 0x50, 1, 0, 0, 0}, + /*II_66_0F_3A_20*/ {{0x1c9, 9563}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_20*/ {{0x184, 9571}, 0x0, 80, 1, 0, 0}, + /*II_66_0F_3A_21*/ {{0x1bc, 9580}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_21*/ {{0x184, 9590}, 0x0, 85, 1, 0, 0}, + /*II_66_0F_3A_22*/ {{0x1ca, 9601}, 0x0, 1, 0, 0, 9609}, + /*II_V_66_0F_3A_22*/ {{0x184, 9617}, 0x6, 73, 1, 9626, 0}, + /*II_66_0F_3A_40*/ {{0x1a2, 9635}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_40*/ {{0x189, 9641}, 0x1, 91, 1, 0, 0}, + /*II_66_0F_3A_41*/ {{0x1a2, 9648}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_41*/ {{0x184, 9654}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_42*/ {{0x1a2, 9661}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_42*/ {{0x184, 9670}, 0x0, 87, 1, 0, 0}, + /*II_66_0F_3A_44*/ {{0x1cb, 9680}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_44*/ {{0x1cc, 9691}, 0x0, 87, 1, 0, 0}, + /*II_V_66_0F_3A_4A*/ {{0x189, 9703}, 0x1, 91, 37, 0, 0}, + /*II_V_66_0F_3A_4B*/ {{0x189, 9714}, 0x1, 91, 37, 0, 0}, + /*II_V_66_0F_3A_4C*/ {{0x184, 9725}, 0x0, 87, 35, 0, 0}, + /*II_66_0F_3A_60*/ {{0x1cd, 9736}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_60*/ {{0x163, 9747}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_61*/ {{0x1cd, 9759}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_61*/ {{0x163, 9770}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_62*/ {{0x1cd, 9782}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_62*/ {{0x163, 9793}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_63*/ {{0x1cd, 9805}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_63*/ {{0x163, 9816}, 0x40, 1, 0, 0, 0}, + /*II_66_0F_3A_DF*/ {{0x1ce, 9828}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_3A_DF*/ {{0x1cf, 9845}, 0x40, 1, 0, 0, 0}, + /*II_V_66_0F_71_02*/ {{0x1d2, 6476}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_04*/ {{0x1d2, 6735}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_71_06*/ {{0x1d2, 7049}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_02*/ {{0x1d2, 6491}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_04*/ {{0x1d2, 6750}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_72_06*/ {{0x1d2, 7064}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_02*/ {{0x1d2, 6506}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_03*/ {{0x1d2, 9871}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_06*/ {{0x1d2, 7079}, 0x0, 1, 0, 0, 0}, + /*II_V_66_0F_73_07*/ {{0x1d2, 9888}, 0x0, 1, 0, 0, 0}, + /*II_0F_AE_00*/ {{0x173, 9897}, 0x0, 0, 0, 0, 9905}, + /*II_0F_AE_01*/ {{0x173, 9925}, 0x0, 0, 0, 0, 9934}, + /*II_V_0F_AE_02*/ {{0x1d5, 9974}, 0x40, 0, 0, 0, 0}, + /*II_V_0F_AE_03*/ {{0x1d5, 10003}, 0x40, 0, 0, 0, 0} }; _InstNode InstructionsTree[5688] = { @@ -7570,7 +7570,6 @@ _InstSharedInfo InstSharedInfoTable[474] = { {13, 0, 0, 0, 0, 0, 256}, {28, 0, 2, 0, 0, 0, 258}, {28, 0, 0, 0, 0, 0, 258}, -{11, 0, 0, 0, 0, 0, 262}, {11, 0, 1, 0, 0, 0, 262}, {9, 0, 0, 0, 0, 0, 262}, {28, 0, 0, 255, 0, 0, 33026}, @@ -7592,6 +7591,7 @@ _InstSharedInfo InstSharedInfoTable[474] = { {1, 25, 14, 0, 0, 0, 33024}, {11, 11, 25, 0, 0, 0, 33024}, {11, 14, 25, 0, 0, 0, 33024}, +{11, 0, 0, 0, 0, 0, 262}, {11, 0, 0, 0, 0, 0, 33032}, {11, 0, 0, 1, 0, 0, 256}, {11, 0, 0, 2, 0, 0, 33024}, diff --git a/NativeCore/Dependencies/distorm/src/mnemonics.c b/NativeCore/Dependencies/distorm/src/mnemonics.c index f306a258..91be7a8e 100644 --- a/NativeCore/Dependencies/distorm/src/mnemonics.c +++ b/NativeCore/Dependencies/distorm/src/mnemonics.c @@ -27,32 +27,32 @@ const unsigned char _MNEMONICS[] = "\x03" "cqo\0" "\x08" "call far\0" "\x05" "pushf\0" "\x04" "popf\0" \ "\x04" "sahf\0" "\x04" "lahf\0" "\x04" "movs\0" "\x04" "cmps\0" "\x04" "stos\0" \ "\x04" "lods\0" "\x04" "scas\0" "\x03" "ret\0" "\x03" "les\0" "\x03" "lds\0" \ -"\x05" "enter\0" "\x05" "leave\0" "\x04" "retf\0" "\x05" "int 3\0" \ -"\x03" "int\0" "\x04" "into\0" "\x04" "iret\0" "\x03" "aam\0" "\x03" "aad\0" \ -"\x04" "salc\0" "\x04" "xlat\0" "\x06" "loopnz\0" "\x05" "loopz\0" \ -"\x04" "loop\0" "\x04" "jcxz\0" "\x05" "jecxz\0" "\x05" "jrcxz\0" "\x02" "in\0" \ -"\x03" "out\0" "\x04" "call\0" "\x03" "jmp\0" "\x07" "jmp far\0" "\x04" "int1\0" \ -"\x03" "hlt\0" "\x03" "cmc\0" "\x03" "clc\0" "\x03" "stc\0" "\x03" "cli\0" \ -"\x03" "sti\0" "\x03" "cld\0" "\x03" "std\0" "\x03" "lar\0" "\x03" "lsl\0" \ -"\x07" "syscall\0" "\x04" "clts\0" "\x06" "sysret\0" "\x04" "invd\0" \ -"\x06" "wbinvd\0" "\x03" "ud2\0" "\x05" "femms\0" "\x03" "nop\0" "\x05" "wrmsr\0" \ -"\x05" "rdtsc\0" "\x05" "rdmsr\0" "\x05" "rdpmc\0" "\x08" "sysenter\0" \ -"\x07" "sysexit\0" "\x06" "getsec\0" "\x05" "cmovo\0" "\x06" "cmovno\0" \ -"\x05" "cmovb\0" "\x06" "cmovae\0" "\x05" "cmovz\0" "\x06" "cmovnz\0" \ -"\x06" "cmovbe\0" "\x05" "cmova\0" "\x05" "cmovs\0" "\x06" "cmovns\0" \ -"\x05" "cmovp\0" "\x06" "cmovnp\0" "\x05" "cmovl\0" "\x06" "cmovge\0" \ -"\x06" "cmovle\0" "\x05" "cmovg\0" "\x04" "seto\0" "\x05" "setno\0" \ -"\x04" "setb\0" "\x05" "setae\0" "\x04" "setz\0" "\x05" "setnz\0" "\x05" "setbe\0" \ -"\x04" "seta\0" "\x04" "sets\0" "\x05" "setns\0" "\x04" "setp\0" "\x05" "setnp\0" \ -"\x04" "setl\0" "\x05" "setge\0" "\x05" "setle\0" "\x04" "setg\0" "\x05" "cpuid\0" \ -"\x02" "bt\0" "\x04" "shld\0" "\x03" "rsm\0" "\x03" "bts\0" "\x04" "shrd\0" \ -"\x07" "cmpxchg\0" "\x03" "lss\0" "\x03" "btr\0" "\x03" "lfs\0" "\x03" "lgs\0" \ -"\x05" "movzx\0" "\x03" "btc\0" "\x05" "movsx\0" "\x04" "xadd\0" "\x06" "movnti\0" \ -"\x05" "bswap\0" "\x03" "rol\0" "\x03" "ror\0" "\x03" "rcl\0" "\x03" "rcr\0" \ -"\x03" "shl\0" "\x03" "shr\0" "\x03" "sal\0" "\x03" "sar\0" "\x06" "xabort\0" \ -"\x06" "xbegin\0" "\x04" "fadd\0" "\x04" "fmul\0" "\x04" "fcom\0" "\x05" "fcomp\0" \ -"\x04" "fsub\0" "\x05" "fsubr\0" "\x04" "fdiv\0" "\x05" "fdivr\0" "\x03" "fld\0" \ -"\x03" "fst\0" "\x04" "fstp\0" "\x06" "fldenv\0" "\x05" "fldcw\0" "\x04" "fxch\0" \ +"\x05" "enter\0" "\x05" "leave\0" "\x04" "retf\0" "\x04" "int3\0" "\x03" "int\0" \ +"\x04" "into\0" "\x04" "iret\0" "\x03" "aam\0" "\x03" "aad\0" "\x04" "salc\0" \ +"\x04" "xlat\0" "\x06" "loopnz\0" "\x05" "loopz\0" "\x04" "loop\0" \ +"\x04" "jcxz\0" "\x05" "jecxz\0" "\x05" "jrcxz\0" "\x02" "in\0" "\x03" "out\0" \ +"\x04" "call\0" "\x03" "jmp\0" "\x07" "jmp far\0" "\x04" "int1\0" "\x03" "hlt\0" \ +"\x03" "cmc\0" "\x03" "clc\0" "\x03" "stc\0" "\x03" "cli\0" "\x03" "sti\0" \ +"\x03" "cld\0" "\x03" "std\0" "\x03" "lar\0" "\x03" "lsl\0" "\x07" "syscall\0" \ +"\x04" "clts\0" "\x06" "sysret\0" "\x04" "invd\0" "\x06" "wbinvd\0" \ +"\x03" "ud2\0" "\x05" "femms\0" "\x03" "nop\0" "\x05" "wrmsr\0" "\x05" "rdtsc\0" \ +"\x05" "rdmsr\0" "\x05" "rdpmc\0" "\x08" "sysenter\0" "\x07" "sysexit\0" \ +"\x06" "getsec\0" "\x05" "cmovo\0" "\x06" "cmovno\0" "\x05" "cmovb\0" \ +"\x06" "cmovae\0" "\x05" "cmovz\0" "\x06" "cmovnz\0" "\x06" "cmovbe\0" \ +"\x05" "cmova\0" "\x05" "cmovs\0" "\x06" "cmovns\0" "\x05" "cmovp\0" \ +"\x06" "cmovnp\0" "\x05" "cmovl\0" "\x06" "cmovge\0" "\x06" "cmovle\0" \ +"\x05" "cmovg\0" "\x04" "seto\0" "\x05" "setno\0" "\x04" "setb\0" "\x05" "setae\0" \ +"\x04" "setz\0" "\x05" "setnz\0" "\x05" "setbe\0" "\x04" "seta\0" "\x04" "sets\0" \ +"\x05" "setns\0" "\x04" "setp\0" "\x05" "setnp\0" "\x04" "setl\0" "\x05" "setge\0" \ +"\x05" "setle\0" "\x04" "setg\0" "\x05" "cpuid\0" "\x02" "bt\0" "\x04" "shld\0" \ +"\x03" "rsm\0" "\x03" "bts\0" "\x04" "shrd\0" "\x07" "cmpxchg\0" "\x03" "lss\0" \ +"\x03" "btr\0" "\x03" "lfs\0" "\x03" "lgs\0" "\x05" "movzx\0" "\x03" "btc\0" \ +"\x05" "movsx\0" "\x04" "xadd\0" "\x06" "movnti\0" "\x05" "bswap\0" \ +"\x03" "rol\0" "\x03" "ror\0" "\x03" "rcl\0" "\x03" "rcr\0" "\x03" "shl\0" \ +"\x03" "shr\0" "\x03" "sal\0" "\x03" "sar\0" "\x06" "xabort\0" "\x06" "xbegin\0" \ +"\x04" "fadd\0" "\x04" "fmul\0" "\x04" "fcom\0" "\x05" "fcomp\0" "\x04" "fsub\0" \ +"\x05" "fsubr\0" "\x04" "fdiv\0" "\x05" "fdivr\0" "\x03" "fld\0" "\x03" "fst\0" \ +"\x04" "fstp\0" "\x06" "fldenv\0" "\x05" "fldcw\0" "\x04" "fxch\0" \ "\x04" "fnop\0" "\x04" "fchs\0" "\x04" "fabs\0" "\x04" "ftst\0" "\x04" "fxam\0" \ "\x04" "fld1\0" "\x06" "fldl2t\0" "\x06" "fldl2e\0" "\x05" "fldpi\0" \ "\x06" "fldlg2\0" "\x06" "fldln2\0" "\x04" "fldz\0" "\x05" "f2xm1\0" \ diff --git a/NativeCore/Dependencies/distorm/src/wstring.c b/NativeCore/Dependencies/distorm/src/wstring.c deleted file mode 100644 index 083200b4..00000000 --- a/NativeCore/Dependencies/distorm/src/wstring.c +++ /dev/null @@ -1,47 +0,0 @@ -/* -wstring.c - -diStorm3 - Powerful disassembler for X86/AMD64 -http://ragestorm.net/distorm/ -distorm at gmail dot com -Copyright (C) 2003-2018 Gil Dabah -This library is licensed under the BSD license. See the file COPYING. -*/ - - -#include "wstring.h" - -#ifndef DISTORM_LIGHT - -void strclear_WS(_WString* s) -{ - s->p[0] = '\0'; - s->length = 0; -} - -void chrcat_WS(_WString* s, uint8_t ch) -{ - s->p[s->length] = ch; - s->p[s->length + 1] = '\0'; - s->length += 1; -} - -void strcpylen_WS(_WString* s, const int8_t* buf, unsigned int len) -{ - s->length = len; - memcpy((int8_t*)s->p, buf, len + 1); -} - -void strcatlen_WS(_WString* s, const int8_t* buf, unsigned int len) -{ - memcpy((int8_t*)&s->p[s->length], buf, len + 1); - s->length += len; -} - -void strcat_WS(_WString* s, const _WString* s2) -{ - memcpy((int8_t*)&s->p[s->length], s2->p, s2->length + 1); - s->length += s2->length; -} - -#endif /* DISTORM_LIGHT */ From 2e48bce5e75a7f7ae26eeab50899b94c6dd39251 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Fri, 7 Oct 2022 00:33:42 +0200 Subject: [PATCH 774/777] Add support for x86 and x64 in Makefiles. --- Makefile | 14 +- NativeCore/Shared/DistormHelper.cpp | 6 +- NativeCore/Unix/Makefile | 358 +++++++++++++++++------- NativeCore/Unix/NativeCore.Unix.vcxproj | 2 - NativeCore/Windows/NativeCore.vcxproj | 4 +- README.md | 15 +- ReClass.NET/Memory/UnionDataType.cs | 12 +- 7 files changed, 285 insertions(+), 126 deletions(-) diff --git a/Makefile b/Makefile index 10ab0620..750027d5 100644 --- a/Makefile +++ b/Makefile @@ -37,12 +37,12 @@ docker_all: docker_debug: cd ReClass.NET_Launcher && make docker_debug cd ReClass.NET && make docker_debug - docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc:latest bash -c "cd NativeCore/Unix && make debug" + docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc_multilib:latest bash -c "cd NativeCore/Unix && make debug" docker_release: cd ReClass.NET_Launcher && make docker_release cd ReClass.NET && make docker_release - docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc:latest bash -c "cd NativeCore/Unix && make release" + docker container run --rm -v ${PWD}:/build:z -w /build -u $(shell id -u ${USER}):$(shell id -g ${USER}) gcc_multilib:latest bash -c "cd NativeCore/Unix && make release" podman_all: make podman_debug @@ -52,19 +52,21 @@ podman_all: podman_debug: cd ReClass.NET_Launcher && make podman_debug cd ReClass.NET && make podman_debug - podman container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make debug" + podman container run --rm -v ${PWD}:/build:z -w /build gcc_multilib:latest bash -c "cd NativeCore/Unix && make debug" podman_release: cd ReClass.NET_Launcher && make podman_release cd ReClass.NET && make podman_release - podman container run --rm -v ${PWD}:/build:z -w /build gcc:latest bash -c "cd NativeCore/Unix && make release" + podman container run --rm -v ${PWD}:/build:z -w /build gcc_multilib:latest bash -c "cd NativeCore/Unix && make release" dist: test -d build || mkdir -p build cp -r ReClass.NET/bin/* build/ cp -r ReClass.NET_Launcher/bin/* build/ - cp NativeCore/Unix/build/debug/NativeCore.so build/Debug/x64 - cp NativeCore/Unix/build/release/NativeCore.so build/Release/x64 + cp NativeCore/Unix/build/debug/x86/NativeCore.so build/Debug/x86 + cp NativeCore/Unix/build/debug/x64/NativeCore.so build/Debug/x64 + cp NativeCore/Unix/build/release/x86/NativeCore.so build/Release/x86 + cp NativeCore/Unix/build/release/x64/NativeCore.so build/Release/x64 test -d build/Debug/x86/Plugins || mkdir build/Debug/x86/Plugins test -d build/Debug/x64/Plugins || mkdir build/Debug/x64/Plugins test -d build/Release/x86/Plugins || mkdir build/Release/x86/Plugins diff --git a/NativeCore/Shared/DistormHelper.cpp b/NativeCore/Shared/DistormHelper.cpp index 9d8d9e85..092b1670 100644 --- a/NativeCore/Shared/DistormHelper.cpp +++ b/NativeCore/Shared/DistormHelper.cpp @@ -66,10 +66,10 @@ _CodeInfo CreateCodeInfo(const uint8_t* address, int length, const _OffsetType v info.codeLen = length; info.features = DF_NONE; -#ifdef RECLASSNET32 - info.dt = Decode32Bits; -#else +#ifdef RECLASSNET64 info.dt = Decode64Bits; +#else + info.dt = Decode32Bits; #endif return info; diff --git a/NativeCore/Unix/Makefile b/NativeCore/Unix/Makefile index 12c8b33b..f18ff1fb 100644 --- a/NativeCore/Unix/Makefile +++ b/NativeCore/Unix/Makefile @@ -7,192 +7,338 @@ LD = g++ WINDRES = windres INC = -I../Dependencies/distorm/include -CFLAGS = -Wall -fPIC -DRECLASSNET64=1 +CFLAGS32 = -Wall -fPIC -m32 +CFLAGS64 = -Wall -fPIC -m64 -DRECLASSNET64=1 RESINC = LIBDIR = LIB = -lstdc++fs -lstdc++ -LDFLAGS = -shared -Wl,--no-undefined +LDFLAGS32 = -m32 -shared -Wl,--no-undefined +LDFLAGS64 = -m64 -shared -Wl,--no-undefined INC_DEBUG = $(INC) -CFLAGS_DEBUG = $(CFLAGS) -g +CFLAGS32_DEBUG = $(CFLAGS32) -g +CFLAGS64_DEBUG = $(CFLAGS64) -g RESINC_DEBUG = $(RESINC) RCFLAGS_DEBUG = $(RCFLAGS) LIBDIR_DEBUG = $(LIBDIR) LIB_DEBUG = $(LIB) -LDFLAGS_DEBUG = $(LDFLAGS) -OBJDIR_DEBUG = obj/debug +LDFLAGS32_DEBUG = $(LDFLAGS32) +LDFLAGS64_DEBUG = $(LDFLAGS64) +OBJDIR32_DEBUG = obj/debug/x86 +OBJDIR64_DEBUG = obj/debug/x64 DEP_DEBUG = -OUT_DEBUG = build/debug/NativeCore.so +OUT32_DEBUG = build/debug/x86/NativeCore.so +OUT64_DEBUG = build/debug/x64/NativeCore.so INC_RELEASE = $(INC) -CFLAGS_RELEASE = $(CFLAGS) -O2 +CFLAGS32_RELEASE = $(CFLAGS32) -O2 +CFLAGS64_RELEASE = $(CFLAGS64) -O2 RESINC_RELEASE = $(RESINC) RCFLAGS_RELEASE = $(RCFLAGS) LIBDIR_RELEASE = $(LIBDIR) LIB_RELEASE = $(LIB) -LDFLAGS_RELEASE = $(LDFLAGS) -s -OBJDIR_RELEASE = obj/release +LDFLAGS32_RELEASE = $(LDFLAGS32) -s +LDFLAGS64_RELEASE = $(LDFLAGS64) -s +OBJDIR32_RELEASE = obj/release/x86 +OBJDIR64_RELEASE = obj/release/x64 DEP_RELEASE = -OUT_RELEASE = build/release/NativeCore.so +OUT32_RELEASE = build/release/x86/NativeCore.so +OUT64_RELEASE = build/release/x64/NativeCore.so -OBJ_DEBUG = $(OBJDIR_DEBUG)/WriteRemoteMemory.o $(OBJDIR_DEBUG)/ReadRemoteMemory.o $(OBJDIR_DEBUG)/OpenRemoteProcess.o $(OBJDIR_DEBUG)/IsProcessValid.o $(OBJDIR_DEBUG)/Input.o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_DEBUG)/EnumerateProcesses.o $(OBJDIR_DEBUG)/DisassembleCode.o $(OBJDIR_DEBUG)/DistormHelper.o $(OBJDIR_DEBUG)/Debugger.o $(OBJDIR_DEBUG)/ControlRemoteProcess.o $(OBJDIR_DEBUG)/CloseRemoteProcess.o $(OBJDIR_DEBUG)/decoder.o $(OBJDIR_DEBUG)/distorm.o $(OBJDIR_DEBUG)/instructions.o $(OBJDIR_DEBUG)/insts.o $(OBJDIR_DEBUG)/mnemonics.o $(OBJDIR_DEBUG)/operands.o $(OBJDIR_DEBUG)/prefix.o $(OBJDIR_DEBUG)/textdefs.o +OBJ32_DEBUG = $(OBJDIR32_DEBUG)/WriteRemoteMemory.o $(OBJDIR32_DEBUG)/ReadRemoteMemory.o $(OBJDIR32_DEBUG)/OpenRemoteProcess.o $(OBJDIR32_DEBUG)/IsProcessValid.o $(OBJDIR32_DEBUG)/Input.o $(OBJDIR32_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR32_DEBUG)/EnumerateProcesses.o $(OBJDIR32_DEBUG)/DisassembleCode.o $(OBJDIR32_DEBUG)/DistormHelper.o $(OBJDIR32_DEBUG)/Debugger.o $(OBJDIR32_DEBUG)/ControlRemoteProcess.o $(OBJDIR32_DEBUG)/CloseRemoteProcess.o $(OBJDIR32_DEBUG)/decoder.o $(OBJDIR32_DEBUG)/distorm.o $(OBJDIR32_DEBUG)/instructions.o $(OBJDIR32_DEBUG)/insts.o $(OBJDIR32_DEBUG)/mnemonics.o $(OBJDIR32_DEBUG)/operands.o $(OBJDIR32_DEBUG)/prefix.o $(OBJDIR32_DEBUG)/textdefs.o +OBJ64_DEBUG = $(OBJDIR64_DEBUG)/WriteRemoteMemory.o $(OBJDIR64_DEBUG)/ReadRemoteMemory.o $(OBJDIR64_DEBUG)/OpenRemoteProcess.o $(OBJDIR64_DEBUG)/IsProcessValid.o $(OBJDIR64_DEBUG)/Input.o $(OBJDIR64_DEBUG)/EnumerateRemoteSectionsAndModules.o $(OBJDIR64_DEBUG)/EnumerateProcesses.o $(OBJDIR64_DEBUG)/DisassembleCode.o $(OBJDIR64_DEBUG)/DistormHelper.o $(OBJDIR64_DEBUG)/Debugger.o $(OBJDIR64_DEBUG)/ControlRemoteProcess.o $(OBJDIR64_DEBUG)/CloseRemoteProcess.o $(OBJDIR64_DEBUG)/decoder.o $(OBJDIR64_DEBUG)/distorm.o $(OBJDIR64_DEBUG)/instructions.o $(OBJDIR64_DEBUG)/insts.o $(OBJDIR64_DEBUG)/mnemonics.o $(OBJDIR64_DEBUG)/operands.o $(OBJDIR64_DEBUG)/prefix.o $(OBJDIR64_DEBUG)/textdefs.o -OBJ_RELEASE = $(OBJDIR_RELEASE)/WriteRemoteMemory.o $(OBJDIR_RELEASE)/ReadRemoteMemory.o $(OBJDIR_RELEASE)/OpenRemoteProcess.o $(OBJDIR_RELEASE)/IsProcessValid.o $(OBJDIR_RELEASE)/Input.o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR_RELEASE)/EnumerateProcesses.o $(OBJDIR_RELEASE)/DisassembleCode.o $(OBJDIR_RELEASE)/DistormHelper.o $(OBJDIR_RELEASE)/Debugger.o $(OBJDIR_RELEASE)/ControlRemoteProcess.o $(OBJDIR_RELEASE)/CloseRemoteProcess.o $(OBJDIR_RELEASE)/decoder.o $(OBJDIR_RELEASE)/distorm.o $(OBJDIR_RELEASE)/instructions.o $(OBJDIR_RELEASE)/insts.o $(OBJDIR_RELEASE)/mnemonics.o $(OBJDIR_RELEASE)/operands.o $(OBJDIR_RELEASE)/prefix.o $(OBJDIR_RELEASE)/textdefs.o +OBJ32_RELEASE = $(OBJDIR32_RELEASE)/WriteRemoteMemory.o $(OBJDIR32_RELEASE)/ReadRemoteMemory.o $(OBJDIR32_RELEASE)/OpenRemoteProcess.o $(OBJDIR32_RELEASE)/IsProcessValid.o $(OBJDIR32_RELEASE)/Input.o $(OBJDIR32_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR32_RELEASE)/EnumerateProcesses.o $(OBJDIR32_RELEASE)/DisassembleCode.o $(OBJDIR32_RELEASE)/DistormHelper.o $(OBJDIR32_RELEASE)/Debugger.o $(OBJDIR32_RELEASE)/ControlRemoteProcess.o $(OBJDIR32_RELEASE)/CloseRemoteProcess.o $(OBJDIR32_RELEASE)/decoder.o $(OBJDIR32_RELEASE)/distorm.o $(OBJDIR32_RELEASE)/instructions.o $(OBJDIR32_RELEASE)/insts.o $(OBJDIR32_RELEASE)/mnemonics.o $(OBJDIR32_RELEASE)/operands.o $(OBJDIR32_RELEASE)/prefix.o $(OBJDIR32_RELEASE)/textdefs.o +OBJ64_RELEASE = $(OBJDIR64_RELEASE)/WriteRemoteMemory.o $(OBJDIR64_RELEASE)/ReadRemoteMemory.o $(OBJDIR64_RELEASE)/OpenRemoteProcess.o $(OBJDIR64_RELEASE)/IsProcessValid.o $(OBJDIR64_RELEASE)/Input.o $(OBJDIR64_RELEASE)/EnumerateRemoteSectionsAndModules.o $(OBJDIR64_RELEASE)/EnumerateProcesses.o $(OBJDIR64_RELEASE)/DisassembleCode.o $(OBJDIR64_RELEASE)/DistormHelper.o $(OBJDIR64_RELEASE)/Debugger.o $(OBJDIR64_RELEASE)/ControlRemoteProcess.o $(OBJDIR64_RELEASE)/CloseRemoteProcess.o $(OBJDIR64_RELEASE)/decoder.o $(OBJDIR64_RELEASE)/distorm.o $(OBJDIR64_RELEASE)/instructions.o $(OBJDIR64_RELEASE)/insts.o $(OBJDIR64_RELEASE)/mnemonics.o $(OBJDIR64_RELEASE)/operands.o $(OBJDIR64_RELEASE)/prefix.o $(OBJDIR64_RELEASE)/textdefs.o all: debug release clean: clean_debug clean_release before_debug: - test -d build/debug || mkdir -p build/debug - test -d $(OBJDIR_DEBUG) || mkdir -p $(OBJDIR_DEBUG) + test -d build/debug/x86 || mkdir -p build/debug/x86 + test -d build/debug/x64 || mkdir -p build/debug/x64 + test -d $(OBJDIR32_DEBUG) || mkdir -p $(OBJDIR32_DEBUG) + test -d $(OBJDIR64_DEBUG) || mkdir -p $(OBJDIR64_DEBUG) after_debug: -debug: before_debug out_debug after_debug +debug: before_debug out_debug32 out_debug64 after_debug -out_debug: before_debug $(OBJ_DEBUG) $(DEP_DEBUG) - $(CXX) $(LIBDIR_DEBUG) -o $(OUT_DEBUG) $(OBJ_DEBUG) $(LDFLAGS_DEBUG) $(LIB_DEBUG) +out_debug32: before_debug $(OBJ32_DEBUG) $(DEP_DEBUG) + $(CXX) $(LIBDIR_DEBUG) -o $(OUT32_DEBUG) $(OBJ32_DEBUG) $(LDFLAGS32_DEBUG) $(LIB_DEBUG) -$(OBJDIR_DEBUG)/WriteRemoteMemory.o: WriteRemoteMemory.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c WriteRemoteMemory.cpp -o $(OBJDIR_DEBUG)/WriteRemoteMemory.o +$(OBJDIR32_DEBUG)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c WriteRemoteMemory.cpp -o $(OBJDIR32_DEBUG)/WriteRemoteMemory.o -$(OBJDIR_DEBUG)/ReadRemoteMemory.o: ReadRemoteMemory.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ReadRemoteMemory.cpp -o $(OBJDIR_DEBUG)/ReadRemoteMemory.o +$(OBJDIR32_DEBUG)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ReadRemoteMemory.cpp -o $(OBJDIR32_DEBUG)/ReadRemoteMemory.o -$(OBJDIR_DEBUG)/OpenRemoteProcess.o: OpenRemoteProcess.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c OpenRemoteProcess.cpp -o $(OBJDIR_DEBUG)/OpenRemoteProcess.o +$(OBJDIR32_DEBUG)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c OpenRemoteProcess.cpp -o $(OBJDIR32_DEBUG)/OpenRemoteProcess.o -$(OBJDIR_DEBUG)/IsProcessValid.o: IsProcessValid.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c IsProcessValid.cpp -o $(OBJDIR_DEBUG)/IsProcessValid.o +$(OBJDIR32_DEBUG)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c IsProcessValid.cpp -o $(OBJDIR32_DEBUG)/IsProcessValid.o -$(OBJDIR_DEBUG)/Input.o: Input.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c Input.cpp -o $(OBJDIR_DEBUG)/Input.o +$(OBJDIR32_DEBUG)/Input.o: Input.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c Input.cpp -o $(OBJDIR32_DEBUG)/Input.o -$(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR_DEBUG)/EnumerateRemoteSectionsAndModules.o +$(OBJDIR32_DEBUG)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR32_DEBUG)/EnumerateRemoteSectionsAndModules.o -$(OBJDIR_DEBUG)/EnumerateProcesses.o: EnumerateProcesses.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c EnumerateProcesses.cpp -o $(OBJDIR_DEBUG)/EnumerateProcesses.o +$(OBJDIR32_DEBUG)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c EnumerateProcesses.cpp -o $(OBJDIR32_DEBUG)/EnumerateProcesses.o -$(OBJDIR_DEBUG)/DisassembleCode.o: DisassembleCode.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c DisassembleCode.cpp -o $(OBJDIR_DEBUG)/DisassembleCode.o +$(OBJDIR32_DEBUG)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c DisassembleCode.cpp -o $(OBJDIR32_DEBUG)/DisassembleCode.o -$(OBJDIR_DEBUG)/DistormHelper.o: ../Shared/DistormHelper.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Shared/DistormHelper.cpp -o $(OBJDIR_DEBUG)/DistormHelper.o +$(OBJDIR32_DEBUG)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Shared/DistormHelper.cpp -o $(OBJDIR32_DEBUG)/DistormHelper.o -$(OBJDIR_DEBUG)/Debugger.o: Debugger.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c Debugger.cpp -o $(OBJDIR_DEBUG)/Debugger.o +$(OBJDIR32_DEBUG)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c Debugger.cpp -o $(OBJDIR32_DEBUG)/Debugger.o -$(OBJDIR_DEBUG)/ControlRemoteProcess.o: ControlRemoteProcess.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ControlRemoteProcess.cpp -o $(OBJDIR_DEBUG)/ControlRemoteProcess.o +$(OBJDIR32_DEBUG)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ControlRemoteProcess.cpp -o $(OBJDIR32_DEBUG)/ControlRemoteProcess.o -$(OBJDIR_DEBUG)/CloseRemoteProcess.o: CloseRemoteProcess.cpp - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c CloseRemoteProcess.cpp -o $(OBJDIR_DEBUG)/CloseRemoteProcess.o +$(OBJDIR32_DEBUG)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c CloseRemoteProcess.cpp -o $(OBJDIR32_DEBUG)/CloseRemoteProcess.o -$(OBJDIR_DEBUG)/decoder.o: ../Dependencies/distorm/src/decoder.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR_DEBUG)/decoder.o +$(OBJDIR32_DEBUG)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR32_DEBUG)/decoder.o -$(OBJDIR_DEBUG)/distorm.o: ../Dependencies/distorm/src/distorm.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR_DEBUG)/distorm.o +$(OBJDIR32_DEBUG)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR32_DEBUG)/distorm.o -$(OBJDIR_DEBUG)/instructions.o: ../Dependencies/distorm/src/instructions.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR_DEBUG)/instructions.o +$(OBJDIR32_DEBUG)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR32_DEBUG)/instructions.o -$(OBJDIR_DEBUG)/insts.o: ../Dependencies/distorm/src/insts.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR_DEBUG)/insts.o +$(OBJDIR32_DEBUG)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR32_DEBUG)/insts.o -$(OBJDIR_DEBUG)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR_DEBUG)/mnemonics.o +$(OBJDIR32_DEBUG)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR32_DEBUG)/mnemonics.o -$(OBJDIR_DEBUG)/operands.o: ../Dependencies/distorm/src/operands.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR_DEBUG)/operands.o +$(OBJDIR32_DEBUG)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR32_DEBUG)/operands.o -$(OBJDIR_DEBUG)/prefix.o: ../Dependencies/distorm/src/prefix.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR_DEBUG)/prefix.o +$(OBJDIR32_DEBUG)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR32_DEBUG)/prefix.o -$(OBJDIR_DEBUG)/textdefs.o: ../Dependencies/distorm/src/textdefs.c - $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_DEBUG)/textdefs.o +$(OBJDIR32_DEBUG)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS32_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR32_DEBUG)/textdefs.o + +out_debug64: before_debug $(OBJ64_DEBUG) $(DEP_DEBUG) + $(CXX) $(LIBDIR_DEBUG) -o $(OUT64_DEBUG) $(OBJ64_DEBUG) $(LDFLAGS64_DEBUG) $(LIB_DEBUG) + +$(OBJDIR64_DEBUG)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c WriteRemoteMemory.cpp -o $(OBJDIR64_DEBUG)/WriteRemoteMemory.o + +$(OBJDIR64_DEBUG)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ReadRemoteMemory.cpp -o $(OBJDIR64_DEBUG)/ReadRemoteMemory.o + +$(OBJDIR64_DEBUG)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c OpenRemoteProcess.cpp -o $(OBJDIR64_DEBUG)/OpenRemoteProcess.o + +$(OBJDIR64_DEBUG)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c IsProcessValid.cpp -o $(OBJDIR64_DEBUG)/IsProcessValid.o + +$(OBJDIR64_DEBUG)/Input.o: Input.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c Input.cpp -o $(OBJDIR64_DEBUG)/Input.o + +$(OBJDIR64_DEBUG)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR64_DEBUG)/EnumerateRemoteSectionsAndModules.o + +$(OBJDIR64_DEBUG)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c EnumerateProcesses.cpp -o $(OBJDIR64_DEBUG)/EnumerateProcesses.o + +$(OBJDIR64_DEBUG)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c DisassembleCode.cpp -o $(OBJDIR64_DEBUG)/DisassembleCode.o + +$(OBJDIR64_DEBUG)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Shared/DistormHelper.cpp -o $(OBJDIR64_DEBUG)/DistormHelper.o + +$(OBJDIR64_DEBUG)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c Debugger.cpp -o $(OBJDIR64_DEBUG)/Debugger.o + +$(OBJDIR64_DEBUG)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ControlRemoteProcess.cpp -o $(OBJDIR64_DEBUG)/ControlRemoteProcess.o + +$(OBJDIR64_DEBUG)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c CloseRemoteProcess.cpp -o $(OBJDIR64_DEBUG)/CloseRemoteProcess.o + +$(OBJDIR64_DEBUG)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR64_DEBUG)/decoder.o + +$(OBJDIR64_DEBUG)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR64_DEBUG)/distorm.o + +$(OBJDIR64_DEBUG)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR64_DEBUG)/instructions.o + +$(OBJDIR64_DEBUG)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR64_DEBUG)/insts.o + +$(OBJDIR64_DEBUG)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR64_DEBUG)/mnemonics.o + +$(OBJDIR64_DEBUG)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR64_DEBUG)/operands.o + +$(OBJDIR64_DEBUG)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR64_DEBUG)/prefix.o + +$(OBJDIR64_DEBUG)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS64_DEBUG) $(INC_DEBUG) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR64_DEBUG)/textdefs.o clean_debug: - rm -f $(OBJ_DEBUG) $(OUT_DEBUG) + rm -f $(OBJ32_DEBUG) $(OUT32_DEBUG) + rm -f $(OBJ64_DEBUG) $(OUT64_DEBUG) rm -rf build/debug - rm -rf $(OBJDIR_DEBUG) + rm -rf $(OBJDIR32_DEBUG) + rm -rf $(OBJDIR64_DEBUG) before_release: - test -d build/release || mkdir -p build/release - test -d $(OBJDIR_RELEASE) || mkdir -p $(OBJDIR_RELEASE) + test -d build/release/x86 || mkdir -p build/release/x86 + test -d build/release/x64 || mkdir -p build/release/x64 + test -d $(OBJDIR32_RELEASE) || mkdir -p $(OBJDIR32_RELEASE) + test -d $(OBJDIR64_RELEASE) || mkdir -p $(OBJDIR64_RELEASE) after_release: -release: before_release out_release after_release +release: before_release out_release32 out_release64 after_release + +out_release32: before_release $(OBJ32_RELEASE) $(DEP_RELEASE) + $(CXX) $(LIBDIR_RELEASE) -o $(OUT32_RELEASE) $(OBJ32_RELEASE) $(LDFLAGS32_RELEASE) $(LIB_RELEASE) + +$(OBJDIR32_RELEASE)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c WriteRemoteMemory.cpp -o $(OBJDIR32_RELEASE)/WriteRemoteMemory.o + +$(OBJDIR32_RELEASE)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ReadRemoteMemory.cpp -o $(OBJDIR32_RELEASE)/ReadRemoteMemory.o + +$(OBJDIR32_RELEASE)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c OpenRemoteProcess.cpp -o $(OBJDIR32_RELEASE)/OpenRemoteProcess.o + +$(OBJDIR32_RELEASE)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c IsProcessValid.cpp -o $(OBJDIR32_RELEASE)/IsProcessValid.o + +$(OBJDIR32_RELEASE)/Input.o: Input.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c Input.cpp -o $(OBJDIR32_RELEASE)/Input.o + +$(OBJDIR32_RELEASE)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR32_RELEASE)/EnumerateRemoteSectionsAndModules.o + +$(OBJDIR32_RELEASE)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c EnumerateProcesses.cpp -o $(OBJDIR32_RELEASE)/EnumerateProcesses.o + +$(OBJDIR32_RELEASE)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c DisassembleCode.cpp -o $(OBJDIR32_RELEASE)/DisassembleCode.o + +$(OBJDIR32_RELEASE)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Shared/DistormHelper.cpp -o $(OBJDIR32_RELEASE)/DistormHelper.o + +$(OBJDIR32_RELEASE)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c Debugger.cpp -o $(OBJDIR32_RELEASE)/Debugger.o + +$(OBJDIR32_RELEASE)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ControlRemoteProcess.cpp -o $(OBJDIR32_RELEASE)/ControlRemoteProcess.o + +$(OBJDIR32_RELEASE)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c CloseRemoteProcess.cpp -o $(OBJDIR32_RELEASE)/CloseRemoteProcess.o + +$(OBJDIR32_RELEASE)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR32_RELEASE)/decoder.o + +$(OBJDIR32_RELEASE)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR32_RELEASE)/distorm.o + +$(OBJDIR32_RELEASE)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR32_RELEASE)/instructions.o + +$(OBJDIR32_RELEASE)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR32_RELEASE)/insts.o + +$(OBJDIR32_RELEASE)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR32_RELEASE)/mnemonics.o + +$(OBJDIR32_RELEASE)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR32_RELEASE)/operands.o + +$(OBJDIR32_RELEASE)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR32_RELEASE)/prefix.o + +$(OBJDIR32_RELEASE)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS32_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR32_RELEASE)/textdefs.o -out_release: before_release $(OBJ_RELEASE) $(DEP_RELEASE) - $(LD) $(LIBDIR_RELEASE) -o $(OUT_RELEASE) $(OBJ_RELEASE) $(LDFLAGS_RELEASE) $(LIB_RELEASE) +out_release64: before_release $(OBJ64_RELEASE) $(DEP_RELEASE) + $(CXX) $(LIBDIR_RELEASE) -o $(OUT64_RELEASE) $(OBJ64_RELEASE) $(LDFLAGS64_RELEASE) $(LIB_RELEASE) -$(OBJDIR_RELEASE)/WriteRemoteMemory.o: WriteRemoteMemory.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c WriteRemoteMemory.cpp -o $(OBJDIR_RELEASE)/WriteRemoteMemory.o +$(OBJDIR64_RELEASE)/WriteRemoteMemory.o: WriteRemoteMemory.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c WriteRemoteMemory.cpp -o $(OBJDIR64_RELEASE)/WriteRemoteMemory.o -$(OBJDIR_RELEASE)/ReadRemoteMemory.o: ReadRemoteMemory.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ReadRemoteMemory.cpp -o $(OBJDIR_RELEASE)/ReadRemoteMemory.o +$(OBJDIR64_RELEASE)/ReadRemoteMemory.o: ReadRemoteMemory.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ReadRemoteMemory.cpp -o $(OBJDIR64_RELEASE)/ReadRemoteMemory.o -$(OBJDIR_RELEASE)/OpenRemoteProcess.o: OpenRemoteProcess.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c OpenRemoteProcess.cpp -o $(OBJDIR_RELEASE)/OpenRemoteProcess.o +$(OBJDIR64_RELEASE)/OpenRemoteProcess.o: OpenRemoteProcess.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c OpenRemoteProcess.cpp -o $(OBJDIR64_RELEASE)/OpenRemoteProcess.o -$(OBJDIR_RELEASE)/IsProcessValid.o: IsProcessValid.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c IsProcessValid.cpp -o $(OBJDIR_RELEASE)/IsProcessValid.o +$(OBJDIR64_RELEASE)/IsProcessValid.o: IsProcessValid.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c IsProcessValid.cpp -o $(OBJDIR64_RELEASE)/IsProcessValid.o -$(OBJDIR_RELEASE)/Input.o: Input.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c Input.cpp -o $(OBJDIR_RELEASE)/Input.o +$(OBJDIR64_RELEASE)/Input.o: Input.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c Input.cpp -o $(OBJDIR64_RELEASE)/Input.o -$(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR_RELEASE)/EnumerateRemoteSectionsAndModules.o +$(OBJDIR64_RELEASE)/EnumerateRemoteSectionsAndModules.o: EnumerateRemoteSectionsAndModules.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c EnumerateRemoteSectionsAndModules.cpp -o $(OBJDIR64_RELEASE)/EnumerateRemoteSectionsAndModules.o -$(OBJDIR_RELEASE)/EnumerateProcesses.o: EnumerateProcesses.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c EnumerateProcesses.cpp -o $(OBJDIR_RELEASE)/EnumerateProcesses.o +$(OBJDIR64_RELEASE)/EnumerateProcesses.o: EnumerateProcesses.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c EnumerateProcesses.cpp -o $(OBJDIR64_RELEASE)/EnumerateProcesses.o -$(OBJDIR_RELEASE)/DisassembleCode.o: DisassembleCode.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c DisassembleCode.cpp -o $(OBJDIR_RELEASE)/DisassembleCode.o +$(OBJDIR64_RELEASE)/DisassembleCode.o: DisassembleCode.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c DisassembleCode.cpp -o $(OBJDIR64_RELEASE)/DisassembleCode.o -$(OBJDIR_RELEASE)/DistormHelper.o: ../Shared/DistormHelper.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Shared/DistormHelper.cpp -o $(OBJDIR_RELEASE)/DistormHelper.o +$(OBJDIR64_RELEASE)/DistormHelper.o: ../Shared/DistormHelper.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Shared/DistormHelper.cpp -o $(OBJDIR64_RELEASE)/DistormHelper.o -$(OBJDIR_RELEASE)/Debugger.o: Debugger.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c Debugger.cpp -o $(OBJDIR_RELEASE)/Debugger.o +$(OBJDIR64_RELEASE)/Debugger.o: Debugger.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c Debugger.cpp -o $(OBJDIR64_RELEASE)/Debugger.o -$(OBJDIR_RELEASE)/ControlRemoteProcess.o: ControlRemoteProcess.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ControlRemoteProcess.cpp -o $(OBJDIR_RELEASE)/ControlRemoteProcess.o +$(OBJDIR64_RELEASE)/ControlRemoteProcess.o: ControlRemoteProcess.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ControlRemoteProcess.cpp -o $(OBJDIR64_RELEASE)/ControlRemoteProcess.o -$(OBJDIR_RELEASE)/CloseRemoteProcess.o: CloseRemoteProcess.cpp - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c CloseRemoteProcess.cpp -o $(OBJDIR_RELEASE)/CloseRemoteProcess.o +$(OBJDIR64_RELEASE)/CloseRemoteProcess.o: CloseRemoteProcess.cpp + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c CloseRemoteProcess.cpp -o $(OBJDIR64_RELEASE)/CloseRemoteProcess.o -$(OBJDIR_RELEASE)/decoder.o: ../Dependencies/distorm/src/decoder.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR_RELEASE)/decoder.o +$(OBJDIR64_RELEASE)/decoder.o: ../Dependencies/distorm/src/decoder.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/decoder.c -o $(OBJDIR64_RELEASE)/decoder.o -$(OBJDIR_RELEASE)/distorm.o: ../Dependencies/distorm/src/distorm.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR_RELEASE)/distorm.o +$(OBJDIR64_RELEASE)/distorm.o: ../Dependencies/distorm/src/distorm.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/distorm.c -o $(OBJDIR64_RELEASE)/distorm.o -$(OBJDIR_RELEASE)/instructions.o: ../Dependencies/distorm/src/instructions.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR_RELEASE)/instructions.o +$(OBJDIR64_RELEASE)/instructions.o: ../Dependencies/distorm/src/instructions.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/instructions.c -o $(OBJDIR64_RELEASE)/instructions.o -$(OBJDIR_RELEASE)/insts.o: ../Dependencies/distorm/src/insts.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR_RELEASE)/insts.o +$(OBJDIR64_RELEASE)/insts.o: ../Dependencies/distorm/src/insts.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/insts.c -o $(OBJDIR64_RELEASE)/insts.o -$(OBJDIR_RELEASE)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR_RELEASE)/mnemonics.o +$(OBJDIR64_RELEASE)/mnemonics.o: ../Dependencies/distorm/src/mnemonics.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/mnemonics.c -o $(OBJDIR64_RELEASE)/mnemonics.o -$(OBJDIR_RELEASE)/operands.o: ../Dependencies/distorm/src/operands.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR_RELEASE)/operands.o +$(OBJDIR64_RELEASE)/operands.o: ../Dependencies/distorm/src/operands.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/operands.c -o $(OBJDIR64_RELEASE)/operands.o -$(OBJDIR_RELEASE)/prefix.o: ../Dependencies/distorm/src/prefix.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR_RELEASE)/prefix.o +$(OBJDIR64_RELEASE)/prefix.o: ../Dependencies/distorm/src/prefix.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/prefix.c -o $(OBJDIR64_RELEASE)/prefix.o -$(OBJDIR_RELEASE)/textdefs.o: ../Dependencies/distorm/src/textdefs.c - $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR_RELEASE)/textdefs.o +$(OBJDIR64_RELEASE)/textdefs.o: ../Dependencies/distorm/src/textdefs.c + $(CXX) $(CFLAGS64_RELEASE) $(INC_RELEASE) -c ../Dependencies/distorm/src/textdefs.c -o $(OBJDIR64_RELEASE)/textdefs.o clean_release: - rm -f $(OBJ_RELEASE) $(OUT_RELEASE) + rm -f $(OBJ32_RELEASE) $(OUT32_RELEASE) + rm -f $(OBJ64_RELEASE) $(OUT64_RELEASE) rm -rf build/release - rm -rf $(OBJDIR_RELEASE) + rm -rf $(OBJDIR32_RELEASE) + rm -rf $(OBJDIR64_RELEASE) .PHONY: before_debug after_debug clean_debug before_release after_release clean_release diff --git a/NativeCore/Unix/NativeCore.Unix.vcxproj b/NativeCore/Unix/NativeCore.Unix.vcxproj index 9ce274fd..83bff48a 100644 --- a/NativeCore/Unix/NativeCore.Unix.vcxproj +++ b/NativeCore/Unix/NativeCore.Unix.vcxproj @@ -155,7 +155,6 @@ c++1y ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) -m32 %(AdditionalOptions) - RECLASSNET32 -m32 %(AdditionalOptions) @@ -168,7 +167,6 @@ c++1y ../Dependencies/distorm/include;$(Sysroot)\usr\include;$(StlIncludeDirectories);%(AdditionalIncludeDirectories) -m32 %(AdditionalOptions) - RECLASSNET32;%(PreprocessorDefinitions) None true false diff --git a/NativeCore/Windows/NativeCore.vcxproj b/NativeCore/Windows/NativeCore.vcxproj index 5715bcb4..5600a51a 100644 --- a/NativeCore/Windows/NativeCore.vcxproj +++ b/NativeCore/Windows/NativeCore.vcxproj @@ -103,7 +103,7 @@ Level3 Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 @@ -137,7 +137,7 @@ MaxSpeed true true - WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;RECLASSNET32;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVECORE_EXPORTS;_CRT_SECURE_NO_WARNINGS;NOMINMAX;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions) stdcpp17 diff --git a/README.md b/README.md index 6f424ced..82a8a53d 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,20 @@ Just download the [latest version](https://github.com/ReClassNET/ReClass.NET/rel If you want to compile ReClass.NET just fork the repository and open the ReClass.NET.sln file with Visual Studio 2019. Compile the project and copy the dependencies to the output folder. -To compile the linux native core library, you need WSL [installed and configured](https://learn.microsoft.com/en-us/cpp/build/walkthrough-build-debug-wsl2). If you do not need linux support, simply unload the project in the Solution Explorer. +To compile the linux native core library, you need WSL [installed and configured](https://learn.microsoft.com/en-us/cpp/build/walkthrough-build-debug-wsl2). If you do not need linux support, simply unload the project in the Solution Explorer. If you want to build cross-platform (x86/x64) you have to install `g++-multilib` too. + +If you use the `Makefile` with `docker` or `podman` you have to build the needed image `gcc_multilib` from the following `Dockerfile` (`docker build -t gcc_multi .`): + +``` +FROM ubuntu:latest + +RUN apt-get update \ + && apt-get install --assume-yes --no-install-recommends --quiet \ + make \ + g++ \ + g++-multilib \ + && apt-get clean all +``` ## Videos diff --git a/ReClass.NET/Memory/UnionDataType.cs b/ReClass.NET/Memory/UnionDataType.cs index 36a47a7e..0cea977a 100644 --- a/ReClass.NET/Memory/UnionDataType.cs +++ b/ReClass.NET/Memory/UnionDataType.cs @@ -56,20 +56,20 @@ public struct UInt64FloatDoubleData public long LongValue; public IntPtr IntPtr => -#if RECLASSNET32 - unchecked((IntPtr)(int)LongValue); -#else +#if RECLASSNET64 (IntPtr)LongValue; +#else + unchecked((IntPtr)(int)LongValue); #endif [FieldOffset(0)] public ulong ULongValue; public UIntPtr UIntPtr => -#if RECLASSNET32 - unchecked((UIntPtr)(uint)ULongValue); -#else +#if RECLASSNET64 (UIntPtr)ULongValue; +#else + unchecked((UIntPtr)(uint)ULongValue); #endif [FieldOffset(0)] From a895421d2e8aa20a02d25696ec305b09a7f37a6d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sat, 29 Apr 2023 10:57:16 +0200 Subject: [PATCH 775/777] Prevent inserting bytes in ContainerNodes. --- ReClass.NET/Forms/MainForm.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ReClass.NET/Forms/MainForm.cs b/ReClass.NET/Forms/MainForm.cs index 010eea25..e771a10d 100644 --- a/ReClass.NET/Forms/MainForm.cs +++ b/ReClass.NET/Forms/MainForm.cs @@ -473,6 +473,7 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs var parentNode = node?.GetParentContainer(); var nodeIsClass = node is ClassNode; + var nodeIsContainer = node is BaseContainerNode; var nodeIsSearchableValueNode = node switch { BaseHexNode _ => true, @@ -494,8 +495,8 @@ private void selectedNodeContextMenuStrip_Opening(object sender, CancelEventArgs _ => false }; - addBytesToolStripMenuItem.Enabled = parentNode != null || nodeIsClass; - insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null && !nodeIsClass; + addBytesToolStripMenuItem.Enabled = parentNode != null || nodeIsContainer; + insertBytesToolStripMenuItem.Enabled = count == 1 && parentNode != null && !nodeIsContainer; changeTypeToolStripMenuItem.Enabled = count > 0 && !nodeIsClass; @@ -830,9 +831,10 @@ private void memoryViewControl_SelectionChanged(object sender, EventArgs e) var node = selectedNodes.FirstOrDefault()?.Node; var parentContainer = node?.GetParentContainer(); var nodeIsClass = node is ClassNode; + var isContainerNode = node is BaseContainerNode; - addBytesToolStripDropDownButton.Enabled = parentContainer != null || nodeIsClass; - insertBytesToolStripDropDownButton.Enabled = selectedNodes.Count == 1 && parentContainer != null && !nodeIsClass; + addBytesToolStripDropDownButton.Enabled = parentContainer != null || isContainerNode; + insertBytesToolStripDropDownButton.Enabled = selectedNodes.Count == 1 && parentContainer != null && !isContainerNode; var enabled = selectedNodes.Count > 0 && !nodeIsClass; toolStrip.Items.OfType().ForEach(b => b.Enabled = enabled); From 8dc64c8ce5563fab12d8fc360d1acc1de8d4a57d Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 5 Jun 2023 20:31:34 +0200 Subject: [PATCH 776/777] Fix rtf \tab keyword. --- ReClass.NET/Util/Rtf/RtfBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReClass.NET/Util/Rtf/RtfBuilder.cs b/ReClass.NET/Util/Rtf/RtfBuilder.cs index 76bd7b95..5f83c837 100644 --- a/ReClass.NET/Util/Rtf/RtfBuilder.cs +++ b/ReClass.NET/Util/Rtf/RtfBuilder.cs @@ -258,7 +258,7 @@ private static string EscapeString(string value) { if (c == '\t') { - sb.Append(@"\tab"); + sb.Append(@"\tab "); } else if (c <= 255) { From b6c17dcd75f439666b2aa1e40a2b99932949e2e2 Mon Sep 17 00:00:00 2001 From: descear <47546329+descear@users.noreply.github.com> Date: Sat, 24 Jun 2023 12:12:40 +0100 Subject: [PATCH 777/777] Fix infinite loop in iteration of memory mapping lines; fixes #242 --- NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp index 079cba54..9d821cfe 100644 --- a/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp +++ b/NativeCore/Unix/EnumerateRemoteSectionsAndModules.cpp @@ -52,11 +52,12 @@ extern "C" void RC_CallConv EnumerateRemoteSectionsAndModules(RC_Pointer handle, auto path = std::stringstream(); path << "/proc/" << reinterpret_cast(handle) << "/maps"; + std::ifstream input(path.str()); std::unordered_map modules; std::string line; - while (std::getline(std::ifstream(path.str()), line)) + while (std::getline(input, line)) { std::stringstream ss(line);